From ead2790bb0852e02e077eff4365978280c6900d1 Mon Sep 17 00:00:00 2001 From: Lu Nguyen Date: Wed, 30 Oct 2019 09:29:59 +0700 Subject: [PATCH] Revert "update" This reverts commit ad99dca167583e3f0f4bf51488a0a831a69741a5. --- .drone.yml | 682 + .gitattributes | 17 + .gitignore | 80 + .scrutinizer.yml | 5 + LICENSE.txt | 339 + README.md | 160 + RoboFile.php | 323 + bump.sh | 17 + codeception.yml | 12 + component/admin/access.xml | 163 + component/admin/assets/index.html | 1 + component/admin/assets/labels/index.html | 1 + component/admin/assets/media/index.html | 1 + component/admin/config.xml | 18 + component/admin/config/config.dist.php | 741 + component/admin/controller.php | 19 + component/admin/controllers/access.php | 56 + component/admin/controllers/accountgroup.php | 59 + .../admin/controllers/accountgroup_detail.php | 127 + .../admin/controllers/addorder_detail.php | 357 + .../admin/controllers/addquotation_detail.php | 181 + component/admin/controllers/alert.php | 118 + component/admin/controllers/attribute.php | 34 + component/admin/controllers/attribute_set.php | 67 + .../controllers/attribute_set_detail.php | 420 + .../admin/controllers/attributeprices.php | 19 + .../controllers/attributeprices_detail.php | 93 + component/admin/controllers/attributes.php | 38 + component/admin/controllers/barcode.php | 95 + component/admin/controllers/catalog.php | 21 + .../admin/controllers/catalog_request.php | 88 + component/admin/controllers/catalogs.php | 21 + component/admin/controllers/categories.php | 68 + component/admin/controllers/category.php | 290 + component/admin/controllers/configuration.php | 292 + component/admin/controllers/countries.php | 38 + component/admin/controllers/country.php | 38 + component/admin/controllers/coupon.php | 38 + component/admin/controllers/coupons.php | 38 + component/admin/controllers/currencies.php | 38 + component/admin/controllers/currency.php | 38 + component/admin/controllers/discount.php | 38 + .../admin/controllers/discount_product.php | 38 + .../admin/controllers/discount_products.php | 38 + component/admin/controllers/discounts.php | 38 + component/admin/controllers/export.php | 21 + component/admin/controllers/field.php | 58 + component/admin/controllers/field_group.php | 38 + component/admin/controllers/field_groups.php | 76 + component/admin/controllers/fields.php | 77 + component/admin/controllers/giftcard.php | 38 + component/admin/controllers/giftcards.php | 38 + component/admin/controllers/import.php | 59 + component/admin/controllers/import_vm.php | 158 + component/admin/controllers/index.html | 1 + component/admin/controllers/install.php | 155 + component/admin/controllers/mail.php | 38 + component/admin/controllers/mails.php | 38 + component/admin/controllers/manufacturer.php | 21 + component/admin/controllers/manufacturers.php | 21 + component/admin/controllers/mass_discount.php | 38 + .../admin/controllers/mass_discounts.php | 38 + component/admin/controllers/media.php | 491 + component/admin/controllers/media_detail.php | 1236 + component/admin/controllers/newsletter.php | 174 + .../admin/controllers/newsletter_detail.php | 133 + .../admin/controllers/newslettersubscr.php | 62 + .../controllers/newslettersubscr_detail.php | 119 + component/admin/controllers/opsearch.php | 15 + component/admin/controllers/order.php | 541 + component/admin/controllers/order_detail.php | 604 + component/admin/controllers/order_status.php | 21 + .../admin/controllers/order_statuses.php | 21 + component/admin/controllers/prices.php | 19 + component/admin/controllers/prices_detail.php | 124 + component/admin/controllers/product.php | 374 + .../controllers/product_attribute_price.php | 89 + .../admin/controllers/product_category.php | 55 + .../admin/controllers/product_detail.php | 1098 + component/admin/controllers/product_price.php | 163 + component/admin/controllers/producttags.php | 19 + .../admin/controllers/producttags_detail.php | 119 + component/admin/controllers/question.php | 198 + component/admin/controllers/questions.php | 38 + component/admin/controllers/quotation.php | 20 + .../admin/controllers/quotation_detail.php | 219 + component/admin/controllers/rating.php | 136 + component/admin/controllers/rating_detail.php | 87 + component/admin/controllers/redshop.php | 43 + component/admin/controllers/sample.php | 63 + .../admin/controllers/sample_catalog.php | 22 + component/admin/controllers/sample_detail.php | 125 + .../admin/controllers/sample_request.php | 82 + component/admin/controllers/search.json.php | 31 + component/admin/controllers/search.php | 39 + component/admin/controllers/shipping.php | 152 + component/admin/controllers/shipping_box.php | 38 + .../admin/controllers/shipping_boxes.php | 38 + .../admin/controllers/shipping_detail.php | 65 + component/admin/controllers/shipping_rate.php | 20 + .../controllers/shipping_rate_detail.php | 178 + component/admin/controllers/shopper_group.php | 61 + .../controllers/shopper_group_detail.php | 128 + component/admin/controllers/state.php | 67 + component/admin/controllers/states.php | 38 + component/admin/controllers/statistic.php | 38 + .../admin/controllers/statistic_customer.php | 54 + .../admin/controllers/statistic_order.php | 140 + .../admin/controllers/statistic_product.php | 74 + .../admin/controllers/statistic_quotation.php | 71 + .../admin/controllers/statistic_variant.php | 74 + component/admin/controllers/stockimage.php | 19 + .../admin/controllers/stockimage_detail.php | 77 + component/admin/controllers/stockroom.php | 106 + .../admin/controllers/stockroom_detail.php | 194 + .../admin/controllers/stockroom_listing.php | 54 + component/admin/controllers/supplier.php | 38 + component/admin/controllers/suppliers.php | 38 + component/admin/controllers/tax_group.php | 38 + component/admin/controllers/tax_groups.php | 38 + component/admin/controllers/tax_rate.php | 38 + component/admin/controllers/tax_rates.php | 38 + component/admin/controllers/template.php | 38 + component/admin/controllers/templates.php | 67 + component/admin/controllers/text.php | 38 + component/admin/controllers/texts.php | 38 + component/admin/controllers/tool_image.php | 165 + component/admin/controllers/tool_update.php | 261 + component/admin/controllers/user.php | 19 + component/admin/controllers/user_detail.php | 260 + component/admin/controllers/voucher.php | 38 + component/admin/controllers/vouchers.php | 62 + component/admin/controllers/wizard.php | 163 + component/admin/controllers/wrapper.php | 192 + .../admin/controllers/wrapper_detail.php | 89 + component/admin/controllers/xmlexport.php | 61 + .../admin/controllers/xmlexport_detail.php | 366 + component/admin/controllers/xmlimport.php | 19 + .../admin/controllers/xmlimport_detail.php | 203 + component/admin/controllers/zip_import.php | 19 + component/admin/controllers/zipcode.php | 35 + component/admin/controllers/zipcodes.php | 20 + .../extras/sh404sef/language/com_redshop.php | 93 + component/admin/help/da-DK/index.html | 1 + component/admin/help/da-DK/redshop.html | 7 + component/admin/help/en-GB/index.html | 1 + component/admin/help/en-GB/redshop.html | 7 + component/admin/helpers/economic.php | 525 + component/admin/helpers/extra_field.php | 264 + component/admin/helpers/index.html | 1 + component/admin/helpers/menu.php | 62 + component/admin/helpers/order_functions.php | 761 + component/admin/helpers/product.php | 216 + component/admin/helpers/product_category.php | 186 + component/admin/helpers/quotationhelper.php | 311 + component/admin/helpers/redconfiguration.php | 425 + component/admin/helpers/redmediahelper.php | 92 + .../admin/helpers/redshophelperimages.php | 137 + component/admin/helpers/redshopmail.php | 344 + component/admin/helpers/redtemplate.php | 252 + component/admin/helpers/rsstockroomhelper.php | 457 + component/admin/helpers/shipping.php | 395 + component/admin/helpers/shoppergroup.php | 94 + component/admin/helpers/text_library.php | 60 + component/admin/helpers/wizard/index.html | 1 + .../admin/helpers/wizard/redshop.cfg.def.php | 316 + .../helpers/wizard/redshop.cfg.tmp.dist.php | 89 + .../admin/helpers/wizard/redshop.cfg.tmp.php | 89 + component/admin/helpers/wizard/wizard.php | 460 + component/admin/helpers/xmlhelper.php | 1991 ++ component/admin/index.html | 1 + .../language/en-GB/en-GB.com_redshop.ini | 4847 +++ .../language/en-GB/en-GB.com_redshop.sys.ini | 132 + component/admin/language/en-GB/index.html | 3 + component/admin/language/index.html | 3 + component/admin/layouts/alert/header_link.php | 42 + component/admin/layouts/alert/index.html | 1 + component/admin/layouts/cart/index.html | 1 + component/admin/layouts/component/admin.php | 122 + component/admin/layouts/component/assets.php | 51 + .../admin/layouts/component/component.php | 10 + component/admin/layouts/component/full.php | 39 + .../layouts/component/full/content/body.php | 14 + .../layouts/component/full/content/footer.php | 25 + .../layouts/component/full/content/header.php | 33 + .../layouts/component/full/content/index.html | 1 + .../admin/layouts/component/full/header.php | 36 + .../layouts/component/full/header/index.html | 1 + .../layouts/component/full/header/menu.php | 42 + .../admin/layouts/component/full/index.html | 1 + .../admin/layouts/component/full/sidebar.php | 16 + .../layouts/component/full/sidebar/index.html | 1 + .../layouts/component/full/sidebar/link.php | 17 + .../layouts/component/full/sidebar/menu.php | 145 + .../layouts/component/full/tab/index.html | 1 + .../layouts/component/full/tab/layout.php | 16 + .../admin/layouts/component/full/tab/link.php | 17 + .../admin/layouts/component/full/tab/main.php | 35 + component/admin/layouts/component/image.php | 58 + component/admin/layouts/component/index.html | 1 + component/admin/layouts/config/config.php | 44 + component/admin/layouts/config/group.php | 25 + component/admin/layouts/config/index.html | 1 + component/admin/layouts/fields/display.php | 18 + component/admin/layouts/fields/index.html | 1 + component/admin/layouts/index.html | 1 + component/admin/layouts/inline/index.html | 1 + component/admin/layouts/inline/text.php | 32 + .../admin/layouts/joomla/form/index.html | 1 + .../admin/layouts/joomla/form/renderfield.php | 38 + .../admin/layouts/joomla/form/renderlabel.php | 51 + component/admin/layouts/joomla/index.html | 1 + .../admin/layouts/joomla/system/index.html | 1 + .../admin/layouts/joomla/system/message.php | 38 + .../layouts/joomla/system/message/error.php | 31 + .../layouts/joomla/system/message/index.html | 1 + .../layouts/joomla/system/message/message.php | 31 + .../layouts/joomla/system/message/notice.php | 31 + .../layouts/joomla/system/message/warning.php | 26 + component/admin/layouts/pagination/index.html | 1 + component/admin/layouts/pagination/link.php | 112 + component/admin/layouts/pagination/links.php | 80 + .../admin/layouts/product_detail/index.html | 1 + .../product_detail/product_attribute.php | 579 + .../admin/layouts/searchtools/default.php | 55 + .../admin/layouts/searchtools/default/bar.php | 48 + .../layouts/searchtools/default/filters.php | 57 + .../layouts/searchtools/default/index.html | 1 + .../layouts/searchtools/default/list.php | 25 + .../layouts/searchtools/default/noitems.php | 16 + .../admin/layouts/searchtools/grid/index.html | 1 + .../admin/layouts/searchtools/grid/sort.php | 23 + .../admin/layouts/searchtools/index.html | 1 + component/admin/layouts/templates/index.html | 1 + .../layouts/templates/mail_template_tag.php | 208 + .../admin/layouts/templates/tags_hint.php | 52 + .../admin/layouts/templates/template_tag.php | 488 + component/admin/layouts/view/edit/box.php | 46 + component/admin/layouts/view/edit/index.html | 1 + component/admin/layouts/view/edit/tab.php | 68 + component/admin/layouts/view/index.html | 1 + component/admin/layouts/view/list.php | 213 + component/admin/models/access.php | 98 + component/admin/models/accountgroup.php | 94 + .../admin/models/accountgroup_detail.php | 157 + component/admin/models/addorder_detail.php | 866 + .../admin/models/addquotation_detail.php | 644 + component/admin/models/alert.php | 125 + component/admin/models/alert_detail.php | 97 + component/admin/models/attribute.php | 91 + component/admin/models/attribute_property.php | 21 + component/admin/models/attribute_set.php | 97 + .../admin/models/attribute_set_detail.php | 1292 + component/admin/models/attributeprices.php | 109 + .../admin/models/attributeprices_detail.php | 180 + component/admin/models/attributes.php | 150 + component/admin/models/barcode.php | 103 + component/admin/models/catalog.php | 21 + component/admin/models/catalog_request.php | 135 + component/admin/models/catalogs.php | 111 + component/admin/models/categories.php | 190 + component/admin/models/category.php | 541 + component/admin/models/configuration.php | 603 + component/admin/models/countries.php | 125 + component/admin/models/country.php | 44 + component/admin/models/coupon.php | 109 + component/admin/models/coupons.php | 173 + component/admin/models/currencies.php | 125 + component/admin/models/currency.php | 45 + component/admin/models/discount.php | 75 + component/admin/models/discount_product.php | 85 + component/admin/models/discount_products.php | 155 + component/admin/models/discounts.php | 164 + component/admin/models/export.php | 46 + component/admin/models/field.php | 85 + component/admin/models/field_group.php | 51 + component/admin/models/field_groups.php | 133 + component/admin/models/fields.php | 288 + component/admin/models/forms/access.xml | 38 + component/admin/models/forms/attribute.xml | 79 + component/admin/models/forms/catalog.xml | 41 + component/admin/models/forms/category.xml | 339 + component/admin/models/forms/country.xml | 65 + component/admin/models/forms/coupon.xml | 136 + component/admin/models/forms/currency.xml | 35 + component/admin/models/forms/discount.xml | 115 + .../admin/models/forms/discount_product.xml | 111 + component/admin/models/forms/field.xml | 171 + component/admin/models/forms/field_group.xml | 55 + .../admin/models/forms/filter_attributes.xml | 41 + .../admin/models/forms/filter_catalogs.xml | 23 + .../admin/models/forms/filter_categories.xml | 41 + .../admin/models/forms/filter_countries.xml | 23 + .../admin/models/forms/filter_coupons.xml | 43 + .../admin/models/forms/filter_currencies.xml | 23 + .../models/forms/filter_discount_products.xml | 51 + .../admin/models/forms/filter_discounts.xml | 52 + .../models/forms/filter_field_groups.xml | 32 + .../admin/models/forms/filter_fields.xml | 49 + component/admin/models/forms/filter_mails.xml | 40 + .../models/forms/filter_manufacturers.xml | 23 + .../models/forms/filter_mass_discounts.xml | 34 + .../models/forms/filter_order_statuses.xml | 23 + .../admin/models/forms/filter_questions.xml | 32 + .../models/forms/filter_shipping_boxes.xml | 23 + .../admin/models/forms/filter_states.xml | 33 + .../forms/filter_statistic_customer.xml | 28 + .../models/forms/filter_statistic_order.xml | 47 + .../models/forms/filter_statistic_product.xml | 28 + .../admin/models/forms/filter_suppliers.xml | 23 + .../admin/models/forms/filter_tax_groups.xml | 23 + .../admin/models/forms/filter_tax_rates.xml | 53 + .../admin/models/forms/filter_templates.xml | 40 + component/admin/models/forms/filter_texts.xml | 33 + .../admin/models/forms/filter_vouchers.xml | 43 + .../admin/models/forms/filter_zipcodes.xml | 31 + component/admin/models/forms/giftcard.xml | 130 + component/admin/models/forms/index.html | 1 + component/admin/models/forms/mail.xml | 93 + component/admin/models/forms/manufacturer.xml | 190 + .../admin/models/forms/mass_discount.xml | 102 + component/admin/models/forms/order_status.xml | 48 + .../admin/models/forms/product_detail.xml | 10 + component/admin/models/forms/question.xml | 83 + component/admin/models/forms/shipping_box.xml | 89 + component/admin/models/forms/state.xml | 75 + component/admin/models/forms/supplier.xml | 57 + component/admin/models/forms/tax_group.xml | 34 + component/admin/models/forms/tax_rate.xml | 83 + component/admin/models/forms/template.xml | 92 + component/admin/models/forms/text.xml | 69 + component/admin/models/forms/voucher.xml | 113 + component/admin/models/forms/zipcode.xml | 72 + component/admin/models/giftcard.php | 23 + component/admin/models/giftcards.php | 126 + component/admin/models/import.php | 46 + component/admin/models/import_vm.php | 1275 + component/admin/models/index.html | 1 + component/admin/models/install.php | 170 + component/admin/models/mail.php | 43 + component/admin/models/mails.php | 129 + component/admin/models/manufacturer.php | 62 + component/admin/models/manufacturers.php | 118 + component/admin/models/mass_discount.php | 21 + component/admin/models/mass_discounts.php | 132 + component/admin/models/media.php | 506 + component/admin/models/media_detail.php | 465 + component/admin/models/newsletter.php | 502 + component/admin/models/newsletter_detail.php | 305 + component/admin/models/newslettersubscr.php | 88 + .../admin/models/newslettersubscr_detail.php | 219 + component/admin/models/opsearch.php | 106 + component/admin/models/order.php | 520 + component/admin/models/order_detail.php | 1273 + component/admin/models/order_status.php | 43 + component/admin/models/order_statuses.php | 115 + component/admin/models/prices.php | 101 + component/admin/models/prices_detail.php | 178 + component/admin/models/product.php | 714 + component/admin/models/product_attribute.php | 21 + component/admin/models/product_category.php | 126 + component/admin/models/product_detail.php | 4981 +++ component/admin/models/producttags.php | 100 + component/admin/models/producttags_detail.php | 157 + component/admin/models/question.php | 96 + component/admin/models/questions.php | 162 + component/admin/models/quotation.php | 224 + component/admin/models/quotation_detail.php | 883 + component/admin/models/rating.php | 73 + component/admin/models/rating_detail.php | 240 + component/admin/models/redshop.php | 437 + component/admin/models/sample.php | 94 + component/admin/models/sample_catalog.php | 91 + component/admin/models/sample_detail.php | 170 + component/admin/models/sample_request.php | 140 + component/admin/models/search.php | 643 + component/admin/models/shipping.php | 124 + component/admin/models/shipping_box.php | 20 + component/admin/models/shipping_boxes.php | 122 + component/admin/models/shipping_detail.php | 180 + component/admin/models/shipping_rate.php | 100 + .../admin/models/shipping_rate_detail.php | 332 + component/admin/models/shopper_group.php | 147 + .../admin/models/shopper_group_detail.php | 339 + component/admin/models/state.php | 20 + component/admin/models/states.php | 159 + component/admin/models/statistic.php | 1054 + component/admin/models/statistic_customer.php | 137 + component/admin/models/statistic_order.php | 269 + component/admin/models/statistic_product.php | 157 + .../admin/models/statistic_quotation.php | 97 + component/admin/models/statistic_variant.php | 148 + component/admin/models/stockimage.php | 124 + component/admin/models/stockimage_detail.php | 180 + component/admin/models/stockroom.php | 68 + component/admin/models/stockroom_detail.php | 235 + component/admin/models/stockroom_listing.php | 387 + component/admin/models/supplier.php | 50 + component/admin/models/suppliers.php | 123 + component/admin/models/tax_group.php | 21 + component/admin/models/tax_groups.php | 121 + component/admin/models/tax_rate.php | 21 + component/admin/models/tax_rates.php | 155 + component/admin/models/template.php | 89 + component/admin/models/templates.php | 127 + component/admin/models/text.php | 51 + component/admin/models/texts.php | 136 + component/admin/models/tool_update.php | 32 + component/admin/models/user.php | 141 + component/admin/models/user_detail.php | 400 + component/admin/models/voucher.php | 105 + component/admin/models/vouchers.php | 154 + component/admin/models/wizard.php | 68 + component/admin/models/wrapper.php | 124 + component/admin/models/wrapper_detail.php | 357 + component/admin/models/xmlexport.php | 105 + component/admin/models/xmlexport_detail.php | 328 + component/admin/models/xmlimport.php | 105 + component/admin/models/xmlimport_detail.php | 445 + component/admin/models/zip_import.php | 249 + component/admin/models/zipcode.php | 62 + component/admin/models/zipcodes.php | 155 + component/admin/redshop.php | 126 + component/admin/sql/index.html | 1 + component/admin/sql/install/index.html | 1 + component/admin/sql/install/mysql/data.sql | 970 + component/admin/sql/install/mysql/index.html | 1 + component/admin/sql/install/mysql/install.sql | 2657 ++ .../admin/sql/install/mysql/uninstall.sql | 126 + component/admin/sql/updates/index.html | 1 + component/admin/sql/updates/mysql/1.1.10.sql | 18 + component/admin/sql/updates/mysql/1.1.11.sql | 18 + component/admin/sql/updates/mysql/1.1.20.sql | 18 + component/admin/sql/updates/mysql/1.2.sql | 0 component/admin/sql/updates/mysql/1.3.1.1.sql | 0 component/admin/sql/updates/mysql/1.3.1.2.sql | 0 component/admin/sql/updates/mysql/1.3.1.3.sql | 0 component/admin/sql/updates/mysql/1.3.1.sql | 0 component/admin/sql/updates/mysql/1.3.2.sql | 0 component/admin/sql/updates/mysql/1.3.3.1.sql | 0 component/admin/sql/updates/mysql/1.3.3.sql | 0 component/admin/sql/updates/mysql/1.3.sql | 9 + component/admin/sql/updates/mysql/1.4.sql | 6 + component/admin/sql/updates/mysql/1.5.0.3.sql | 6 + .../admin/sql/updates/mysql/1.5.0.4.1.sql | 16 + .../admin/sql/updates/mysql/1.5.0.4.3.sql | 5 + .../admin/sql/updates/mysql/1.5.0.5.1.sql | 0 .../admin/sql/updates/mysql/1.5.0.5.2.sql | 154 + .../admin/sql/updates/mysql/1.5.0.5.3.sql | 0 component/admin/sql/updates/mysql/1.5.0.sql | 9 + component/admin/sql/updates/mysql/1.6.0.sql | 0 component/admin/sql/updates/mysql/1.6.1.sql | 5 + component/admin/sql/updates/mysql/1.6.2.sql | 10 + component/admin/sql/updates/mysql/1.6.3.sql | 0 component/admin/sql/updates/mysql/2.0.0.2.sql | 0 component/admin/sql/updates/mysql/2.0.0.3.sql | 22 + component/admin/sql/updates/mysql/2.0.0.4.sql | 5 + component/admin/sql/updates/mysql/2.0.0.5.sql | 23 + component/admin/sql/updates/mysql/2.0.0.6.sql | 96 + component/admin/sql/updates/mysql/2.0.10.sql | 0 component/admin/sql/updates/mysql/2.0.11.sql | 20 + component/admin/sql/updates/mysql/2.0.12.sql | 24 + component/admin/sql/updates/mysql/2.0.13.sql | 9 + component/admin/sql/updates/mysql/2.0.14.sql | 0 component/admin/sql/updates/mysql/2.0.15.sql | 33 + component/admin/sql/updates/mysql/2.0.3.sql | 17 + component/admin/sql/updates/mysql/2.0.4.sql | 33 + component/admin/sql/updates/mysql/2.0.5.sql | 0 component/admin/sql/updates/mysql/2.0.6.sql | 73 + component/admin/sql/updates/mysql/2.0.7.sql | 40 + component/admin/sql/updates/mysql/2.0.8.sql | 19 + component/admin/sql/updates/mysql/2.0.9.sql | 25 + component/admin/sql/updates/mysql/2.1.0.sql | 84 + component/admin/sql/updates/mysql/2.1.1.sql | 31 + component/admin/sql/updates/mysql/2.1.2.1.sql | 8 + component/admin/sql/updates/mysql/2.1.2.2.sql | 8 + component/admin/sql/updates/mysql/2.1.2.sql | 8 + component/admin/sql/updates/mysql/index.html | 1 + component/admin/tables/access.php | 21 + component/admin/tables/accessory_detail.php | 48 + .../admin/tables/accountgroup_detail.php | 53 + component/admin/tables/alert_detail.php | 28 + component/admin/tables/associations.php | 41 + component/admin/tables/attribute.php | 125 + component/admin/tables/attribute_property.php | 60 + .../admin/tables/attribute_set_detail.php | 38 + .../admin/tables/attributeprices_detail.php | 93 + component/admin/tables/barcode.php | 49 + component/admin/tables/catalog.php | 34 + component/admin/tables/catalog_request.php | 44 + component/admin/tables/category.php | 215 + component/admin/tables/country.php | 91 + component/admin/tables/coupon.php | 182 + component/admin/tables/currency.php | 143 + component/admin/tables/discount.php | 250 + component/admin/tables/discount_product.php | 245 + component/admin/tables/field.php | 328 + component/admin/tables/field_data.php | 34 + component/admin/tables/field_group.php | 145 + component/admin/tables/fields_value.php | 40 + component/admin/tables/giftcard.php | 162 + component/admin/tables/index.html | 1 + component/admin/tables/mail.php | 62 + component/admin/tables/manufacturer.php | 254 + component/admin/tables/mass_discount.php | 652 + component/admin/tables/media.php | 115 + component/admin/tables/media_detail.php | 50 + component/admin/tables/media_download.php | 38 + component/admin/tables/newsletter_detail.php | 44 + .../admin/tables/newslettersubscr_detail.php | 98 + component/admin/tables/notifystock_user.php | 43 + component/admin/tables/order_acc_item.php | 54 + .../admin/tables/order_attribute_item.php | 56 + component/admin/tables/order_detail.php | 129 + component/admin/tables/order_item_detail.php | 92 + component/admin/tables/order_payment.php | 58 + component/admin/tables/order_status.php | 132 + component/admin/tables/order_status_log.php | 44 + component/admin/tables/order_user_detail.php | 82 + component/admin/tables/page_viewer.php | 34 + component/admin/tables/prices_detail.php | 83 + component/admin/tables/product_attribute.php | 56 + .../tables/product_attribute_price_detail.php | 56 + component/admin/tables/product_compare.php | 38 + component/admin/tables/product_detail.php | 227 + .../admin/tables/product_discount_calc.php | 85 + .../tables/product_discount_calc_extra.php | 42 + component/admin/tables/product_download.php | 48 + .../admin/tables/product_serial_number.php | 40 + .../admin/tables/product_subscribe_detail.php | 48 + .../admin/tables/product_subscription.php | 42 + .../tables/product_subscription_renewal.php | 38 + component/admin/tables/product_tags.php | 40 + component/admin/tables/question.php | 50 + .../admin/tables/quotation_accessory_item.php | 54 + .../admin/tables/quotation_attribute_item.php | 52 + component/admin/tables/quotation_detail.php | 68 + .../admin/tables/quotation_item_detail.php | 61 + component/admin/tables/rating_detail.php | 37 + component/admin/tables/related_product.php | 36 + component/admin/tables/sample_detail.php | 38 + component/admin/tables/sample_request.php | 44 + component/admin/tables/shipping_box.php | 107 + component/admin/tables/shipping_detail.php | 50 + .../admin/tables/shipping_rate_detail.php | 96 + .../admin/tables/shopper_group_detail.php | 76 + component/admin/tables/site_viewer.php | 34 + component/admin/tables/state.php | 111 + component/admin/tables/stockimage_detail.php | 43 + component/admin/tables/stockroom_detail.php | 52 + .../admin/tables/subattribute_property.php | 58 + component/admin/tables/supplier.php | 45 + component/admin/tables/tax_group.php | 65 + component/admin/tables/tax_rate.php | 62 + component/admin/tables/template.php | 254 + component/admin/tables/text.php | 68 + .../tables/transaction_coupon_detail.php | 46 + .../tables/transaction_voucher_detail.php | 50 + component/admin/tables/user_detail.php | 80 + component/admin/tables/usercart.php | 54 + .../admin/tables/usercart_accessory_item.php | 54 + .../admin/tables/usercart_attribute_item.php | 64 + component/admin/tables/usercart_item.php | 79 + component/admin/tables/voucher.php | 201 + component/admin/tables/wishlist.php | 42 + component/admin/tables/wishlist_product.php | 34 + .../admin/tables/wishlist_product_item.php | 27 + component/admin/tables/wrapper_detail.php | 49 + component/admin/tables/xmlexport_detail.php | 80 + component/admin/tables/xmlimport_detail.php | 80 + component/admin/tables/zipcode.php | 70 + component/admin/updates/1.3.3.1.php | 63 + component/admin/updates/1.6.0.php | 105 + component/admin/updates/2.0.0.2.php | 81 + component/admin/updates/2.0.0.5.php | 51 + component/admin/updates/2.0.10.php | 53 + component/admin/updates/2.0.11.php | 51 + component/admin/updates/2.0.12.php | 53 + component/admin/updates/2.0.13.php | 102 + component/admin/updates/2.0.14.php | 142 + component/admin/updates/2.0.15.php | 51 + component/admin/updates/2.0.3.php | 520 + component/admin/updates/2.0.4.php | 164 + component/admin/updates/2.0.6.php | 164 + component/admin/updates/2.0.7.php | 139 + component/admin/updates/2.0.9.php | 320 + component/admin/updates/2.1.0.php | 134 + component/admin/updates/2.1.1.php | 53 + component/admin/updates/index.html | 1 + component/admin/views/access/index.html | 1 + component/admin/views/access/tmpl/default.php | 55 + component/admin/views/access/tmpl/index.html | 1 + component/admin/views/access/view.html.php | 78 + component/admin/views/accountgroup/index.html | 1 + .../admin/views/accountgroup/tmpl/default.php | 93 + .../admin/views/accountgroup/tmpl/index.html | 1 + .../admin/views/accountgroup/view.html.php | 49 + .../views/accountgroup_detail/index.html | 1 + .../accountgroup_detail/tmpl/default.php | 131 + .../views/accountgroup_detail/tmpl/index.html | 1 + .../views/accountgroup_detail/view.html.php | 54 + .../admin/views/addorder_detail/index.html | 1 + .../views/addorder_detail/tmpl/default.php | 844 + .../views/addorder_detail/tmpl/index.html | 1 + .../addorder_detail/tmpl/productorderinfo.php | 48 + .../tmpl/productorderinfo_payment.php | 85 + .../tmpl/productorderinfo_shipping.php | 28 + .../admin/views/addorder_detail/view.html.php | 176 + .../views/addquotation_detail/index.html | 1 + .../addquotation_detail/tmpl/default.php | 534 + .../views/addquotation_detail/tmpl/index.html | 1 + .../views/addquotation_detail/view.html.php | 87 + component/admin/views/alert/tmpl/default.php | 109 + component/admin/views/alert/view.html.php | 65 + component/admin/views/attribute/index.html | 1 + component/admin/views/attribute/tmpl/edit.php | 46 + .../admin/views/attribute/tmpl/index.html | 1 + component/admin/views/attribute/view.html.php | 82 + .../admin/views/attribute_set/index.html | 1 + .../views/attribute_set/tmpl/default.php | 88 + .../admin/views/attribute_set/tmpl/index.html | 1 + .../admin/views/attribute_set/view.html.php | 52 + .../views/attribute_set_detail/index.html | 1 + .../attribute_set_detail/tmpl/default.php | 170 + .../attribute_set_detail/tmpl/index.html | 1 + .../views/attribute_set_detail/view.html.php | 80 + .../admin/views/attributeprices/index.html | 1 + .../views/attributeprices/tmpl/default.php | 100 + .../views/attributeprices/tmpl/index.html | 1 + .../admin/views/attributeprices/view.html.php | 51 + .../views/attributeprices_detail/index.html | 1 + .../attributeprices_detail/tmpl/default.php | 153 + .../attributeprices_detail/tmpl/index.html | 1 + .../attributeprices_detail/view.html.php | 41 + component/admin/views/attributes/index.html | 1 + .../admin/views/attributes/tmpl/default.php | 120 + .../admin/views/attributes/tmpl/index.html | 1 + .../admin/views/attributes/view.html.php | 77 + component/admin/views/catalog/index.html | 1 + component/admin/views/catalog/tmpl/edit.php | 11 + component/admin/views/catalog/tmpl/index.html | 1 + component/admin/views/catalog/view.html.php | 39 + .../admin/views/catalog_request/index.html | 1 + .../views/catalog_request/tmpl/default.php | 115 + .../views/catalog_request/tmpl/index.html | 1 + .../admin/views/catalog_request/view.html.php | 47 + component/admin/views/catalogs/index.html | 1 + .../admin/views/catalogs/tmpl/default.php | 13 + .../admin/views/catalogs/tmpl/index.html | 1 + component/admin/views/catalogs/view.html.php | 48 + component/admin/views/categories/index.html | 1 + .../admin/views/categories/tmpl/default.php | 33 + .../admin/views/categories/tmpl/index.html | 1 + .../admin/views/categories/view.html.php | 147 + component/admin/views/category/index.html | 1 + component/admin/views/category/tmpl/edit.php | 48 + .../views/category/tmpl/edit_accessory.php | 130 + .../views/category/tmpl/edit_extrafield.php | 32 + .../views/category/tmpl/edit_information.php | 111 + .../category/tmpl/edit_product_filter.php | 59 + .../admin/views/category/tmpl/edit_seo.php | 30 + .../admin/views/category/tmpl/index.html | 1 + component/admin/views/category/view.html.php | 173 + .../admin/views/configuration/index.html | 1 + .../views/configuration/tmpl/default.php | 203 + .../tmpl/default_accessory_product.php | 148 + .../tmpl/default_cart_settings.php | 250 + .../default_cart_template_image_setting.php | 158 + .../configuration/tmpl/default_carttab.php | 44 + .../configuration/tmpl/default_catalog.php | 64 + .../configuration/tmpl/default_category.php | 48 + .../tmpl/default_category_suffix.php | 119 + .../tmpl/default_category_template.php | 28 + .../configuration/tmpl/default_cattab.php | 67 + .../tmpl/default_cattab_nplinks.php | 126 + .../configuration/tmpl/default_clicktell.php | 65 + .../tmpl/default_color_sample.php | 71 + .../tmpl/default_comparison_settings.php | 74 + .../configuration/tmpl/default_dashboard.php | 28 + .../configuration/tmpl/default_discount.php | 110 + .../tmpl/default_discount_mail.php | 59 + .../configuration/tmpl/default_download.php | 53 + .../configuration/tmpl/default_economic.php | 120 + .../tmpl/default_feature_import_export.php | 57 + .../tmpl/default_feature_inline_edit.php | 18 + .../configuration/tmpl/default_featuretab.php | 71 + .../configuration/tmpl/default_general.php | 46 + .../tmpl/default_general_layout_settings.php | 78 + .../views/configuration/tmpl/default_gls.php | 19 + .../tmpl/default_image_setting.php | 137 + .../tmpl/default_images_giftcard.php | 64 + .../tmpl/default_integration.php | 58 + .../default_manufacturer_image_setting.php | 95 + .../tmpl/default_manufacturer_setting.php | 69 + .../tmpl/default_manufacturertab.php | 38 + .../configuration/tmpl/default_menuhide.php | 94 + .../configuration/tmpl/default_modules.php | 57 + .../tmpl/default_newslettertab.php | 130 + .../configuration/tmpl/default_ordertab.php | 159 + .../tmpl/default_payment_ship_secure.php | 87 + .../configuration/tmpl/default_postdk.php | 148 + .../configuration/tmpl/default_price.php | 151 + .../configuration/tmpl/default_pricetab.php | 60 + .../tmpl/default_procat_images.php | 137 + .../tmpl/default_product_general.php | 18 + ...efault_product_template_image_settings.php | 341 + .../tmpl/default_product_unit.php | 35 + .../configuration/tmpl/default_producttab.php | 86 + .../tmpl/default_rating_settings.php | 37 + .../tmpl/default_redshop_modules.php | 46 + .../tmpl/default_redshop_plugins.php | 47 + .../tmpl/default_redshop_shipping.php | 48 + .../tmpl/default_redshopabout.php | 62 + .../tmpl/default_registration.php | 152 + .../tmpl/default_related_product.php | 175 + .../tmpl/default_resettemplate.php | 22 + .../views/configuration/tmpl/default_seo.php | 377 + .../tmpl/default_seo_category.php | 47 + .../tmpl/default_seo_general.php | 60 + .../tmpl/default_seo_manufacturer.php | 56 + .../tmpl/default_seo_product.php | 47 + .../configuration/tmpl/default_settings.php | 102 + .../tmpl/default_shopper_group.php | 122 + .../tmpl/default_stockroom_settings.php | 96 + .../tmpl/default_system_information.php | 65 + .../views/configuration/tmpl/default_user.php | 39 + .../views/configuration/tmpl/default_vat.php | 104 + .../tmpl/default_wishlist_settings.php | 41 + .../configuration/tmpl/default_wrapping.php | 36 + .../admin/views/configuration/tmpl/index.html | 1 + .../admin/views/configuration/view.html.php | 986 + component/admin/views/countries/index.html | 1 + .../admin/views/countries/tmpl/default.php | 11 + .../admin/views/countries/tmpl/index.html | 1 + component/admin/views/countries/view.html.php | 37 + component/admin/views/country/index.html | 1 + component/admin/views/country/tmpl/edit.php | 11 + component/admin/views/country/tmpl/index.html | 1 + component/admin/views/country/view.html.php | 22 + component/admin/views/coupon/index.html | 1 + component/admin/views/coupon/tmpl/edit.php | 12 + component/admin/views/coupon/tmpl/index.html | 1 + component/admin/views/coupon/view.html.php | 53 + component/admin/views/coupons/index.html | 3 + .../admin/views/coupons/tmpl/default.php | 11 + component/admin/views/coupons/tmpl/index.html | 3 + component/admin/views/coupons/view.html.php | 76 + component/admin/views/currencies/index.html | 3 + .../admin/views/currencies/tmpl/default.php | 11 + .../admin/views/currencies/tmpl/index.html | 3 + .../admin/views/currencies/view.html.php | 27 + component/admin/views/currency/index.html | 1 + component/admin/views/currency/tmpl/edit.php | 12 + .../admin/views/currency/tmpl/index.html | 1 + component/admin/views/currency/view.html.php | 21 + component/admin/views/discount/index.html | 1 + component/admin/views/discount/tmpl/edit.php | 12 + .../admin/views/discount/tmpl/index.html | 1 + component/admin/views/discount/view.html.php | 21 + .../admin/views/discount_product/index.html | 1 + .../views/discount_product/tmpl/edit.php | 12 + .../views/discount_product/tmpl/index.html | 1 + .../views/discount_product/view.html.php | 21 + .../admin/views/discount_products/index.html | 1 + .../views/discount_products/tmpl/default.php | 11 + .../views/discount_products/tmpl/index.html | 1 + .../views/discount_products/view.html.php | 93 + component/admin/views/discounts/index.html | 1 + .../admin/views/discounts/tmpl/default.php | 11 + .../admin/views/discounts/tmpl/index.html | 1 + component/admin/views/discounts/view.html.php | 93 + component/admin/views/export/index.html | 1 + component/admin/views/export/tmpl/default.php | 220 + component/admin/views/export/tmpl/index.html | 1 + component/admin/views/export/view.html.php | 44 + component/admin/views/field/index.html | 1 + component/admin/views/field/tmpl/edit.php | 355 + component/admin/views/field/tmpl/index.html | 1 + component/admin/views/field/view.html.php | 58 + component/admin/views/field_group/index.html | 1 + .../admin/views/field_group/tmpl/edit.php | 11 + .../admin/views/field_group/tmpl/index.html | 1 + .../admin/views/field_group/view.html.php | 22 + component/admin/views/field_groups/index.html | 1 + .../admin/views/field_groups/tmpl/default.php | 11 + .../admin/views/field_groups/tmpl/index.html | 1 + .../admin/views/field_groups/view.html.php | 50 + component/admin/views/fields/index.html | 1 + component/admin/views/fields/tmpl/default.php | 79 + component/admin/views/fields/tmpl/index.html | 1 + component/admin/views/fields/view.html.php | 119 + component/admin/views/giftcard/index.html | 1 + component/admin/views/giftcard/tmpl/edit.php | 136 + .../admin/views/giftcard/tmpl/index.html | 1 + component/admin/views/giftcard/view.html.php | 84 + component/admin/views/giftcards/index.html | 3 + .../admin/views/giftcards/tmpl/default.php | 205 + .../admin/views/giftcards/tmpl/index.html | 3 + component/admin/views/giftcards/view.html.php | 73 + component/admin/views/import/index.html | 1 + component/admin/views/import/tmpl/default.php | 381 + component/admin/views/import/tmpl/index.html | 1 + component/admin/views/import/view.html.php | 52 + component/admin/views/import_vm/index.html | 1 + .../admin/views/import_vm/tmpl/default.php | 562 + .../admin/views/import_vm/tmpl/index.html | 1 + component/admin/views/import_vm/view.html.php | 54 + component/admin/views/index.html | 1 + component/admin/views/install/index.html | 1 + .../admin/views/install/tmpl/default.php | 156 + component/admin/views/install/tmpl/index.html | 1 + component/admin/views/install/view.html.php | 71 + component/admin/views/mail/index.html | 1 + component/admin/views/mail/tmpl/edit.php | 19 + .../admin/views/mail/tmpl/edit_hints.php | 445 + component/admin/views/mail/tmpl/index.html | 1 + component/admin/views/mail/view.html.php | 28 + component/admin/views/mails/index.html | 3 + component/admin/views/mails/tmpl/default.php | 11 + component/admin/views/mails/tmpl/index.html | 3 + component/admin/views/mails/view.html.php | 41 + component/admin/views/manufacturer/index.html | 3 + .../admin/views/manufacturer/tmpl/edit.php | 11 + .../admin/views/manufacturer/tmpl/index.html | 3 + .../admin/views/manufacturer/view.html.php | 132 + .../admin/views/manufacturers/index.html | 1 + .../views/manufacturers/tmpl/default.php | 11 + .../admin/views/manufacturers/tmpl/index.html | 1 + .../admin/views/manufacturers/view.html.php | 64 + .../admin/views/mass_discount/index.html | 1 + .../admin/views/mass_discount/tmpl/edit.php | 11 + .../admin/views/mass_discount/tmpl/index.html | 1 + .../admin/views/mass_discount/view.html.php | 21 + .../admin/views/mass_discounts/index.html | 1 + .../views/mass_discounts/tmpl/default.php | 11 + .../views/mass_discounts/tmpl/index.html | 1 + .../admin/views/mass_discounts/view.html.php | 129 + component/admin/views/media/index.html | 3 + .../admin/views/media/tmpl/additionalfile.php | 177 + component/admin/views/media/tmpl/default.php | 305 + component/admin/views/media/tmpl/index.html | 3 + component/admin/views/media/tmpl/thumbs.php | 63 + .../admin/views/media/tmpl/thumbs_doc.php | 25 + .../admin/views/media/tmpl/thumbs_folder.php | 40 + .../admin/views/media/tmpl/thumbs_img.php | 62 + .../admin/views/media/tmpl/thumbs_up.php | 38 + component/admin/views/media/view.html.php | 140 + component/admin/views/media_detail/index.html | 1 + .../admin/views/media_detail/tmpl/default.php | 513 + .../admin/views/media_detail/tmpl/index.html | 1 + .../admin/views/media_detail/view.html.php | 128 + component/admin/views/newsletter/index.html | 1 + .../admin/views/newsletter/tmpl/default.php | 100 + .../admin/views/newsletter/tmpl/index.html | 1 + .../admin/views/newsletter/tmpl/preview.php | 225 + .../views/newsletter/tmpl/previewlog.php | 94 + .../admin/views/newsletter/view.html.php | 71 + .../admin/views/newsletter/view.preview.php | 98 + .../admin/views/newsletter_detail/index.html | 1 + .../views/newsletter_detail/tmpl/default.php | 145 + .../views/newsletter_detail/tmpl/index.html | 1 + .../newsletter_detail/tmpl/statistics.php | 87 + .../views/newsletter_detail/view.html.php | 96 + .../admin/views/newslettersubscr/index.html | 1 + .../views/newslettersubscr/tmpl/default.php | 146 + .../views/newslettersubscr/tmpl/index.html | 1 + .../views/newslettersubscr/view.html.php | 61 + .../views/newslettersubscr_detail/index.html | 1 + .../newslettersubscr_detail/tmpl/default.php | 132 + .../newslettersubscr_detail/tmpl/index.html | 1 + .../newslettersubscr_detail/view.html.php | 70 + component/admin/views/opsearch/index.html | 1 + .../admin/views/opsearch/tmpl/default.php | 117 + .../admin/views/opsearch/tmpl/index.html | 1 + component/admin/views/opsearch/view.html.php | 56 + component/admin/views/order/index.html | 1 + component/admin/views/order/tmpl/batch.php | 79 + component/admin/views/order/tmpl/default.php | 798 + component/admin/views/order/tmpl/index.html | 1 + .../admin/views/order/tmpl/labellisting.php | 123 + component/admin/views/order/view.html.php | 167 + component/admin/views/order_detail/index.html | 1 + .../admin/views/order_detail/tmpl/billing.php | 253 + .../views/order_detail/tmpl/ccdetail.php | 49 + .../order_detail/tmpl/creditcardpayment.php | 355 + .../admin/views/order_detail/tmpl/default.php | 1346 + .../order_detail/tmpl/default_plugin.php | 22 + .../order_detail/tmpl/default_shipping.php | 22 + .../admin/views/order_detail/tmpl/index.html | 1 + .../views/order_detail/tmpl/print_order.php | 36 + .../views/order_detail/tmpl/shipping.php | 192 + .../admin/views/order_detail/view.html.php | 231 + .../admin/views/order_detail/view.pdf.php | 98 + .../views/order_detail/view.stocknotepdf.php | 91 + component/admin/views/order_status/index.html | 1 + .../admin/views/order_status/tmpl/edit.php | 11 + .../admin/views/order_status/tmpl/index.html | 1 + .../admin/views/order_status/view.html.php | 32 + .../admin/views/order_statuses/index.html | 1 + .../views/order_statuses/tmpl/default.php | 11 + .../views/order_statuses/tmpl/index.html | 1 + .../admin/views/order_statuses/view.html.php | 32 + component/admin/views/prices/index.html | 1 + component/admin/views/prices/tmpl/default.php | 82 + component/admin/views/prices/tmpl/index.html | 1 + component/admin/views/prices/view.html.php | 48 + .../admin/views/prices_detail/index.html | 1 + .../views/prices_detail/tmpl/default.php | 141 + .../admin/views/prices_detail/tmpl/index.html | 1 + .../admin/views/prices_detail/view.html.php | 54 + component/admin/views/product/index.html | 1 + .../admin/views/product/tmpl/default.php | 374 + .../admin/views/product/tmpl/element.php | 150 + .../views/product/tmpl/importattribute.php | 111 + .../views/product/tmpl/importproduct.php | 111 + component/admin/views/product/tmpl/index.html | 1 + .../admin/views/product/tmpl/ins_product.php | 125 + .../admin/views/product/tmpl/listing.php | 175 + component/admin/views/product/view.html.php | 188 + .../views/product_attribute_price/index.html | 1 + .../product_attribute_price/tmpl/default.php | 67 + .../product_attribute_price/tmpl/index.html | 1 + .../product_attribute_price/view.html.php | 50 + .../admin/views/product_category/index.html | 1 + .../views/product_category/tmpl/default.php | 78 + .../views/product_category/tmpl/index.html | 1 + .../views/product_category/view.html.php | 47 + .../admin/views/product_detail/index.html | 1 + .../product_detail/tmpl/attribute_color.php | 145 + .../views/product_detail/tmpl/default.php | 331 + .../tmpl/default_calculator.php | 323 + .../tmpl/default_economic_settings.php | 92 + .../tmpl/default_extrafield.php | 63 + .../tmpl/default_general_data.php | 782 + .../tmpl/default_product_accessory.php | 161 + .../tmpl/default_product_attribute.php | 166 + .../tmpl/default_product_images.php | 133 + .../tmpl/default_product_meta_data.php | 157 + .../tmpl/default_product_payment_method.php | 49 + .../tmpl/default_productfinder.php | 31 + .../tmpl/default_productstockroom.php | 105 + .../tmpl/default_producttype.php | 325 + .../product_detail/tmpl/default_related.php | 86 + .../views/product_detail/tmpl/index.html | 1 + .../product_detail/tmpl/productstockroom.php | 114 + .../product_detail/tmpl/property_images.php | 179 + .../admin/views/product_detail/view.html.php | 754 + .../admin/views/product_price/index.html | 1 + .../views/product_price/tmpl/default.php | 65 + .../admin/views/product_price/tmpl/index.html | 1 + .../admin/views/product_price/view.html.php | 45 + component/admin/views/producttags/index.html | 1 + .../admin/views/producttags/tmpl/default.php | 130 + .../admin/views/producttags/tmpl/index.html | 1 + .../admin/views/producttags/view.html.php | 48 + .../admin/views/producttags_detail/index.html | 1 + .../views/producttags_detail/tmpl/default.php | 63 + .../views/producttags_detail/tmpl/index.html | 1 + .../views/producttags_detail/view.html.php | 59 + component/admin/views/question/index.html | 1 + component/admin/views/question/tmpl/edit.php | 133 + .../admin/views/question/tmpl/index.html | 1 + component/admin/views/question/view.html.php | 84 + component/admin/views/questions/index.html | 1 + .../admin/views/questions/tmpl/default.php | 146 + .../admin/views/questions/tmpl/index.html | 1 + component/admin/views/questions/view.html.php | 134 + component/admin/views/quotation/index.html | 1 + .../admin/views/quotation/tmpl/default.php | 133 + .../admin/views/quotation/tmpl/index.html | 1 + component/admin/views/quotation/view.csv.php | 39 + component/admin/views/quotation/view.html.php | 70 + .../admin/views/quotation_detail/index.html | 1 + .../views/quotation_detail/tmpl/default.php | 614 + .../views/quotation_detail/tmpl/index.html | 1 + .../views/quotation_detail/view.html.php | 75 + component/admin/views/rating/index.html | 1 + component/admin/views/rating/tmpl/default.php | 169 + component/admin/views/rating/tmpl/index.html | 1 + component/admin/views/rating/view.html.php | 48 + .../admin/views/rating_detail/index.html | 1 + .../views/rating_detail/tmpl/default.php | 214 + .../admin/views/rating_detail/tmpl/index.html | 1 + .../admin/views/rating_detail/view.html.php | 64 + component/admin/views/redshop/index.html | 1 + .../admin/views/redshop/tmpl/default.php | 140 + .../redshop/tmpl/default_newest_customers.php | 55 + .../redshop/tmpl/default_newest_orders.php | 55 + .../redshop/tmpl/default_sales_piechart.php | 161 + component/admin/views/redshop/tmpl/index.html | 1 + .../admin/views/redshop/tmpl/noconfig.php | 21 + component/admin/views/redshop/view.html.php | 94 + component/admin/views/sample/index.html | 1 + component/admin/views/sample/tmpl/default.php | 82 + component/admin/views/sample/tmpl/index.html | 1 + component/admin/views/sample/view.html.php | 49 + .../admin/views/sample_catalog/index.html | 1 + .../views/sample_catalog/tmpl/default.php | 48 + .../views/sample_catalog/tmpl/index.html | 1 + .../admin/views/sample_catalog/view.html.php | 28 + .../admin/views/sample_detail/index.html | 1 + .../views/sample_detail/tmpl/default.php | 152 + .../admin/views/sample_detail/tmpl/index.html | 1 + .../admin/views/sample_detail/view.html.php | 91 + .../admin/views/sample_request/index.html | 1 + .../views/sample_request/tmpl/default.php | 124 + .../views/sample_request/tmpl/index.html | 1 + .../admin/views/sample_request/view.html.php | 47 + component/admin/views/search/index.html | 1 + component/admin/views/search/tmpl/default.php | 17 + component/admin/views/search/tmpl/index.html | 1 + component/admin/views/search/view.html.php | 28 + component/admin/views/shipping/index.html | 1 + .../admin/views/shipping/tmpl/default.php | 116 + .../admin/views/shipping/tmpl/index.html | 1 + component/admin/views/shipping/view.html.php | 88 + component/admin/views/shipping_box/index.html | 1 + .../admin/views/shipping_box/tmpl/edit.php | 11 + .../admin/views/shipping_box/tmpl/index.html | 1 + .../admin/views/shipping_box/view.html.php | 32 + .../admin/views/shipping_boxes/index.html | 1 + .../views/shipping_boxes/tmpl/default.php | 11 + .../views/shipping_boxes/tmpl/index.html | 1 + .../admin/views/shipping_boxes/view.html.php | 21 + .../admin/views/shipping_detail/index.html | 1 + .../views/shipping_detail/tmpl/default.php | 93 + .../shipping_detail/tmpl/default_install.php | 30 + .../views/shipping_detail/tmpl/index.html | 1 + .../admin/views/shipping_detail/view.html.php | 96 + .../admin/views/shipping_rate/index.html | 1 + .../views/shipping_rate/tmpl/default.php | 111 + .../admin/views/shipping_rate/tmpl/index.html | 1 + .../admin/views/shipping_rate/view.html.php | 73 + .../views/shipping_rate_detail/index.html | 1 + .../shipping_rate_detail/tmpl/default.php | 450 + .../shipping_rate_detail/tmpl/index.html | 1 + .../views/shipping_rate_detail/view.html.php | 170 + .../admin/views/shopper_group/index.html | 1 + .../views/shopper_group/tmpl/default.php | 142 + .../admin/views/shopper_group/tmpl/index.html | 1 + .../admin/views/shopper_group/view.html.php | 62 + .../views/shopper_group_detail/index.html | 1 + .../shopper_group_detail/tmpl/default.php | 297 + .../shopper_group_detail/tmpl/index.html | 1 + .../views/shopper_group_detail/view.html.php | 148 + component/admin/views/state/index.html | 1 + component/admin/views/state/tmpl/edit.php | 11 + component/admin/views/state/tmpl/index.html | 1 + component/admin/views/state/view.html.php | 21 + component/admin/views/states/index.html | 1 + component/admin/views/states/tmpl/default.php | 11 + component/admin/views/states/tmpl/index.html | 1 + component/admin/views/states/view.html.php | 61 + component/admin/views/statistic/index.html | 1 + .../views/statistic/tmpl/amountorder.php | 67 + .../views/statistic/tmpl/amountprice.php | 69 + .../views/statistic/tmpl/amountspent.php | 69 + .../admin/views/statistic/tmpl/avrgorder.php | 61 + .../admin/views/statistic/tmpl/bestsell.php | 87 + .../admin/views/statistic/tmpl/default.php | 86 + .../admin/views/statistic/tmpl/index.html | 1 + .../admin/views/statistic/tmpl/neworder.php | 80 + .../admin/views/statistic/tmpl/newprod.php | 77 + .../admin/views/statistic/tmpl/pageview.php | 84 + .../views/statistic/tmpl/popularsell.php | 79 + .../admin/views/statistic/tmpl/turnover.php | 73 + component/admin/views/statistic/view.html.php | 210 + .../admin/views/statistic_customer/index.html | 1 + .../views/statistic_customer/tmpl/default.php | 129 + .../views/statistic_customer/view.html.php | 81 + .../admin/views/statistic_order/index.html | 1 + .../views/statistic_order/tmpl/default.php | 123 + .../admin/views/statistic_order/view.html.php | 69 + .../admin/views/statistic_product/index.html | 1 + .../views/statistic_product/tmpl/default.php | 122 + .../views/statistic_product/view.html.php | 71 + .../views/statistic_quotation/index.html | 1 + .../statistic_quotation/tmpl/default.php | 162 + .../views/statistic_quotation/view.html.php | 76 + .../admin/views/statistic_variant/index.html | 1 + .../views/statistic_variant/tmpl/default.php | 184 + .../views/statistic_variant/view.html.php | 78 + component/admin/views/stockimage/index.html | 3 + .../admin/views/stockimage/tmpl/default.php | 113 + .../admin/views/stockimage/tmpl/index.html | 3 + .../admin/views/stockimage/view.html.php | 48 + .../admin/views/stockimage_detail/index.html | 1 + .../views/stockimage_detail/tmpl/default.php | 93 + .../views/stockimage_detail/tmpl/index.html | 1 + .../views/stockimage_detail/view.html.php | 71 + component/admin/views/stockroom/index.html | 3 + .../admin/views/stockroom/tmpl/default.php | 99 + .../admin/views/stockroom/tmpl/index.html | 3 + component/admin/views/stockroom/view.html.php | 54 + .../admin/views/stockroom_detail/index.html | 1 + .../views/stockroom_detail/tmpl/default.php | 151 + .../stockroom_detail/tmpl/importstock.php | 125 + .../views/stockroom_detail/tmpl/index.html | 1 + .../views/stockroom_detail/view.html.php | 87 + .../admin/views/stockroom_listing/index.html | 3 + .../views/stockroom_listing/tmpl/default.php | 306 + .../views/stockroom_listing/tmpl/index.html | 3 + .../views/stockroom_listing/view.csv.php | 157 + .../views/stockroom_listing/view.html.php | 105 + component/admin/views/supplier/index.html | 1 + component/admin/views/supplier/tmpl/edit.php | 12 + .../admin/views/supplier/tmpl/index.html | 1 + component/admin/views/supplier/view.html.php | 21 + component/admin/views/suppliers/index.html | 3 + .../admin/views/suppliers/tmpl/default.php | 11 + .../admin/views/suppliers/tmpl/index.html | 3 + component/admin/views/suppliers/view.html.php | 28 + component/admin/views/tax_group/index.html | 1 + component/admin/views/tax_group/tmpl/edit.php | 12 + .../admin/views/tax_group/tmpl/index.html | 1 + component/admin/views/tax_group/view.html.php | 21 + component/admin/views/tax_groups/index.html | 3 + .../admin/views/tax_groups/tmpl/default.php | 11 + .../admin/views/tax_groups/tmpl/index.html | 3 + .../admin/views/tax_groups/view.html.php | 73 + component/admin/views/tax_rate/index.html | 1 + component/admin/views/tax_rate/tmpl/edit.php | 39 + .../admin/views/tax_rate/tmpl/index.html | 1 + component/admin/views/tax_rate/view.html.php | 21 + component/admin/views/tax_rates/index.html | 3 + .../admin/views/tax_rates/tmpl/default.php | 11 + .../admin/views/tax_rates/tmpl/index.html | 3 + component/admin/views/tax_rates/view.html.php | 60 + component/admin/views/template/index.html | 1 + component/admin/views/template/tmpl/edit.php | 21 + .../admin/views/template/tmpl/edit_hints.php | 633 + .../admin/views/template/tmpl/index.html | 1 + component/admin/views/template/view.html.php | 28 + component/admin/views/templates/index.html | 3 + .../admin/views/templates/tmpl/default.php | 11 + .../admin/views/templates/tmpl/index.html | 3 + component/admin/views/templates/view.html.php | 51 + component/admin/views/text/index.html | 1 + component/admin/views/text/tmpl/edit.php | 12 + component/admin/views/text/tmpl/index.html | 1 + component/admin/views/text/view.html.php | 21 + component/admin/views/texts/index.html | 3 + component/admin/views/texts/tmpl/default.php | 11 + component/admin/views/texts/tmpl/index.html | 3 + component/admin/views/texts/view.html.php | 61 + component/admin/views/tool_image/index.html | 1 + .../admin/views/tool_image/tmpl/default.php | 117 + .../admin/views/tool_image/tmpl/index.html | 1 + .../admin/views/tool_image/view.html.php | 41 + component/admin/views/tool_update/index.html | 1 + .../admin/views/tool_update/tmpl/default.php | 192 + .../admin/views/tool_update/tmpl/index.html | 1 + .../admin/views/tool_update/view.html.php | 49 + component/admin/views/user/index.html | 3 + component/admin/views/user/tmpl/default.php | 171 + component/admin/views/user/tmpl/index.html | 3 + component/admin/views/user/tmpl/user_sync.php | 50 + component/admin/views/user/view.html.php | 78 + component/admin/views/user_detail/index.html | 1 + .../admin/views/user_detail/tmpl/default.php | 203 + .../user_detail/tmpl/default_billing.php | 168 + .../views/user_detail/tmpl/default_order.php | 52 + .../user_detail/tmpl/default_shipping.php | 49 + .../views/user_detail/tmpl/default_user.php | 76 + .../admin/views/user_detail/tmpl/index.html | 1 + .../admin/views/user_detail/view.html.php | 163 + component/admin/views/voucher/index.html | 1 + component/admin/views/voucher/tmpl/edit.php | 12 + component/admin/views/voucher/tmpl/index.html | 1 + component/admin/views/voucher/view.html.php | 21 + component/admin/views/vouchers/index.html | 3 + .../admin/views/vouchers/tmpl/default.php | 11 + .../admin/views/vouchers/tmpl/index.html | 3 + component/admin/views/vouchers/view.html.php | 76 + component/admin/views/wizard/index.html | 1 + component/admin/views/wizard/tmpl/default.php | 10 + component/admin/views/wizard/tmpl/finish.php | 35 + component/admin/views/wizard/tmpl/general.php | 184 + component/admin/views/wizard/tmpl/index.html | 1 + component/admin/views/wizard/tmpl/price.php | 38 + .../views/wizard/tmpl/price_discount.php | 103 + .../admin/views/wizard/tmpl/price_price.php | 84 + .../admin/views/wizard/tmpl/price_vat.php | 150 + component/admin/views/wizard/tmpl/terms.php | 80 + component/admin/views/wizard/tmpl/user.php | 33 + .../views/wizard/tmpl/user_registration.php | 107 + .../views/wizard/tmpl/user_shopper_group.php | 109 + component/admin/views/wizard/tmpl/welcome.php | 48 + component/admin/views/wizard/view.html.php | 299 + component/admin/views/wrapper/index.html | 1 + .../admin/views/wrapper/tmpl/default.php | 149 + component/admin/views/wrapper/tmpl/index.html | 1 + component/admin/views/wrapper/view.html.php | 65 + .../admin/views/wrapper_detail/index.html | 1 + .../views/wrapper_detail/tmpl/default.php | 120 + .../views/wrapper_detail/tmpl/index.html | 1 + .../admin/views/wrapper_detail/view.html.php | 120 + component/admin/views/xmlexport/index.html | 1 + .../admin/views/xmlexport/tmpl/default.php | 103 + .../admin/views/xmlexport/tmpl/index.html | 1 + component/admin/views/xmlexport/view.html.php | 48 + .../admin/views/xmlexport_detail/index.html | 1 + .../views/xmlexport_detail/tmpl/default.php | 258 + .../xmlexport_detail/tmpl/elementdetail.php | 68 + .../views/xmlexport_detail/tmpl/index.html | 1 + .../views/xmlexport_detail/view.html.php | 171 + component/admin/views/xmlimport/index.html | 1 + .../admin/views/xmlimport/tmpl/default.php | 99 + .../admin/views/xmlimport/tmpl/index.html | 1 + component/admin/views/xmlimport/view.html.php | 48 + .../admin/views/xmlimport_detail/index.html | 1 + .../views/xmlimport_detail/tmpl/default.php | 594 + .../views/xmlimport_detail/tmpl/index.html | 1 + .../views/xmlimport_detail/view.html.php | 262 + component/admin/views/zip_import/index.html | 1 + .../views/zip_import/tmpl/confirmupdate.php | 52 + .../admin/views/zip_import/tmpl/default.php | 9 + .../admin/views/zip_import/tmpl/index.html | 1 + .../admin/views/zip_import/view.html.php | 31 + component/admin/views/zipcode/index.html | 1 + component/admin/views/zipcode/tmpl/edit.php | 49 + component/admin/views/zipcode/tmpl/index.html | 1 + component/admin/views/zipcode/view.html.php | 47 + component/admin/views/zipcodes/index.html | 0 .../admin/views/zipcodes/tmpl/default.php | 13 + .../admin/views/zipcodes/tmpl/index.html | 0 component/admin/views/zipcodes/view.html.php | 56 + .../site/assets/document/catalog/index.html | 1 + .../assets/document/category/thumb/index.html | 1 + .../document/consignor_label/index.html | 0 .../assets/document/extrafields/index.html | 1 + .../site/assets/document/gbase/index.html | 1 + component/site/assets/document/index.html | 1 + .../site/assets/document/invoice/index.html | 1 + .../site/assets/document/product/index.html | 1 + .../assets/document/product/thumb/index.html | 1 + .../site/assets/download/product/index.html | 1 + .../assets/images/account/business-icon.jpg | Bin 0 -> 1068 bytes .../site/assets/images/account/coupon.jpg | Bin 0 -> 1481 bytes component/site/assets/images/account/home.jpg | Bin 0 -> 1163 bytes .../site/assets/images/account/logout.jpg | Bin 0 -> 1282 bytes .../site/assets/images/account/order.jpg | Bin 0 -> 1426 bytes .../assets/images/account/personal-icon.jpg | Bin 0 -> 1077 bytes .../site/assets/images/account/reviews.jpg | Bin 0 -> 1247 bytes .../site/assets/images/add-to-cart_blue.gif | Bin 0 -> 2095 bytes .../site/assets/images/addtowishlist.jpeg | Bin 0 -> 886 bytes .../site/assets/images/barcode/index.html | 1 + .../site/assets/images/checkout/blue.jpg | Bin 0 -> 4254 bytes .../assets/images/checkout/dinnersclub.jpg | Bin 0 -> 4701 bytes .../site/assets/images/checkout/discover.jpg | Bin 0 -> 1978 bytes component/site/assets/images/checkout/jcb.jpg | Bin 0 -> 4591 bytes .../site/assets/images/checkout/master.jpg | Bin 0 -> 4733 bytes .../site/assets/images/checkout/mastero.jpg | Bin 0 -> 4698 bytes component/site/assets/images/checkout/one.jpg | Bin 0 -> 669 bytes .../site/assets/images/checkout/one_on.jpg | Bin 0 -> 1304 bytes .../site/assets/images/checkout/three.jpg | Bin 0 -> 691 bytes .../site/assets/images/checkout/three_on.jpg | Bin 0 -> 1298 bytes component/site/assets/images/checkout/two.jpg | Bin 0 -> 692 bytes .../site/assets/images/checkout/two_on.jpg | Bin 0 -> 1301 bytes .../site/assets/images/checkout/visa.jpg | Bin 0 -> 4332 bytes component/site/assets/images/cross.png | Bin 0 -> 1025 bytes component/site/assets/images/defaultcross.png | Bin 0 -> 1025 bytes .../site/assets/images/defaultupdate.png | Bin 0 -> 1170 bytes component/site/assets/images/down.png | Bin 0 -> 216 bytes component/site/assets/images/e-conomic.jpg | Bin 0 -> 4030 bytes component/site/assets/images/index.html | 1 + component/site/assets/images/laegikurv.gif | Bin 0 -> 839 bytes component/site/assets/images/laegikurven.jpg | Bin 0 -> 2540 bytes component/site/assets/images/left.png | Bin 0 -> 906 bytes component/site/assets/images/leftarrow.jpg | Bin 0 -> 488 bytes component/site/assets/images/loading.gif | Bin 0 -> 433 bytes component/site/assets/images/media/index.html | 1 + .../site/assets/images/mergeImages/index.html | 1 + component/site/assets/images/noimage.jpg | Bin 0 -> 1341 bytes component/site/assets/images/preloader.jpeg | Bin 0 -> 1404 bytes .../site/assets/images/pricebar_selector.png | Bin 0 -> 320 bytes component/site/assets/images/printer-icon.png | Bin 0 -> 1551 bytes .../product/1262876429_redEVENT-box.jpg | Bin 0 -> 14010 bytes .../product/1262876620_redEVENT-box.jpg | Bin 0 -> 14010 bytes .../images/product/1262876640_redFORM-box.jpg | Bin 0 -> 12842 bytes .../product/1262876656_redCOMPETITION-box.jpg | Bin 0 -> 13739 bytes .../1262876675_redVMPRODUCTFINDER-box.jpg | Bin 0 -> 14235 bytes .../1262876700_redARTICLEFINDER-box.jpg | Bin 0 -> 13485 bytes .../product/1262876715_redLINKER-box.jpg | Bin 0 -> 13956 bytes .../product/1262876737_redVMMASSCART-box.jpg | Bin 0 -> 13600 bytes .../product/1262876765_redNEWSTAB-box.jpg | Bin 0 -> 14034 bytes .../product/1262876791_redPLUGINS-box.jpg | Bin 0 -> 16493 bytes .../product/1262876810_redPLUGINS-box.jpg | Bin 0 -> 16493 bytes .../product/1262876827_redPLUGINS-box.jpg | Bin 0 -> 16493 bytes .../product/1262876844_redPLUGINS-box.jpg | Bin 0 -> 16493 bytes .../product/1262876869_redCOMPONENTS.jpg | Bin 0 -> 14260 bytes .../images/product/1265986712_globus.gif | Bin 0 -> 4904 bytes .../1421054444_bakery-demo-400-400.jpg | Bin 0 -> 67446 bytes .../1421054762_carpenter-demo-400-400.jpg | Bin 0 -> 49261 bytes .../1421055027_fashionstore-demo-400-400.jpg | Bin 0 -> 42711 bytes .../1421055222_gadgets-demo-400-400.jpg | Bin 0 -> 65216 bytes .../1421055392_kidswear-demo-400-400.jpg | Bin 0 -> 51110 bytes .../1421055573_shoemaniac-demo-400-400.jpg | Bin 0 -> 44875 bytes .../1421055894_valentine-demo-400-400.jpg | Bin 0 -> 46294 bytes .../product/1421064966_appearance-top.png | Bin 0 -> 22695 bytes .../assets/images/product/redCOMPONENTS.jpg | Bin 0 -> 14260 bytes .../assets/images/product/thumb/index.html | 1 + .../product_attributes/thumb/index.html | 1 + .../assets/images/property/thumb/index.html | 1 + component/site/assets/images/requestquote.png | Bin 0 -> 2765 bytes component/site/assets/images/right.png | Bin 0 -> 946 bytes component/site/assets/images/rightarrow.jpg | Bin 0 -> 491 bytes .../images/shopperlogo/thumb/index.html | 1 + .../site/assets/images/shopping_cart.png | Bin 0 -> 240 bytes component/site/assets/images/skip-left-1.gif | Bin 0 -> 866 bytes component/site/assets/images/skip-left-4.gif | Bin 0 -> 718 bytes component/site/assets/images/skip-right-1.gif | Bin 0 -> 923 bytes component/site/assets/images/skip-right-4.gif | Bin 0 -> 718 bytes .../site/assets/images/slimbox/closelabel.gif | Bin 0 -> 1634 bytes .../site/assets/images/slimbox/loading.gif | Bin 0 -> 1588 bytes .../site/assets/images/slimbox/nextlabel.gif | Bin 0 -> 354 bytes .../site/assets/images/slimbox/prevlabel.gif | Bin 0 -> 371 bytes component/site/assets/images/spacer.gif | Bin 0 -> 43 bytes .../assets/images/stockroom/icon_lock.gif | Bin 0 -> 1135 bytes .../site/assets/images/stockroom/index.html | 1 + .../assets/images/subcolor/thumb/index.html | 1 + component/site/assets/images/up.png | Bin 0 -> 201 bytes component/site/assets/images/update.png | Bin 0 -> 1170 bytes .../site/assets/images/watermarked/index.html | 1 + .../site/assets/images/wrapper/index.html | 1 + .../assets/images/wrapper/thumb/index.html | 1 + component/site/assets/index.html | 1 + component/site/assets/orders/index.html | 1 + .../assets/video/category/thumb/index.html | 1 + component/site/assets/video/index.html | 1 + .../assets/video/product/thumb/index.html | 1 + .../site/assets/xmlfile/export/index.html | 1 + .../site/assets/xmlfile/import/index.html | 1 + component/site/assets/xmlfile/index.html | 1 + component/site/controller.php | 20 + component/site/controllers/account.php | 160 + component/site/controllers/account_billto.php | 154 + component/site/controllers/account_shipto.php | 143 + component/site/controllers/ask_question.php | 129 + component/site/controllers/cart.php | 775 + component/site/controllers/catalog.php | 95 + component/site/controllers/category.php | 345 + component/site/controllers/checkout.php | 853 + component/site/controllers/epayrelay.php | 22 + component/site/controllers/giftcard.php | 22 + component/site/controllers/index.html | 3 + component/site/controllers/login.php | 142 + component/site/controllers/manufacturers.php | 22 + component/site/controllers/newsletter.php | 150 + component/site/controllers/order_detail.php | 461 + component/site/controllers/orders.php | 22 + component/site/controllers/ordertracker.php | 22 + component/site/controllers/plugin.php | 22 + .../site/controllers/price_filter.raw.php | 21 + component/site/controllers/product.php | 1095 + component/site/controllers/product_mini.php | 43 + component/site/controllers/product_rating.php | 183 + component/site/controllers/quotation.php | 146 + .../site/controllers/quotation_detail.php | 89 + component/site/controllers/ratings.php | 22 + component/site/controllers/registration.php | 266 + component/site/controllers/search.php | 309 + component/site/controllers/send_friend.php | 44 + component/site/controllers/wishlist.php | 168 + component/site/helpers/currency.json | 178 + component/site/helpers/currency.xml | 46 + component/site/helpers/currencyhelper.php | 91 + component/site/helpers/extrafield.php | 208 + component/site/helpers/index.html | 3 + component/site/helpers/producthelper.php | 4749 +++ component/site/helpers/redhelper.php | 552 + component/site/helpers/route.php | 171 + component/site/helpers/rscarthelper.php | 3090 ++ component/site/helpers/rsuserhelper.php | 418 + component/site/helpers/statistic.php | 77 + component/site/index.html | 1 + .../site/language/en-GB/en-GB.com_redshop.ini | 1046 + component/site/language/en-GB/index.html | 3 + component/site/language/index.html | 3 + component/site/layouts/assets.php | 35 + component/site/layouts/cart/billing.php | 133 + component/site/layouts/cart/cart.php | 136 + component/site/layouts/cart/index.html | 1 + component/site/layouts/cart/shipping.php | 80 + component/site/layouts/cart/wizard.php | 30 + component/site/layouts/checkout/login.php | 37 + .../site/layouts/checkout/onestep/billing.php | 90 + .../site/layouts/checkout/payment_radio.php | 44 + component/site/layouts/checkout/register.php | 82 + component/site/layouts/fields/display.php | 20 + component/site/layouts/fields/html.php | 34 + component/site/layouts/fields/index.html | 1 + component/site/layouts/fields/mail.php | 21 + component/site/layouts/filter/index.html | 1 + component/site/layouts/filter/restricted.php | 138 + component/site/layouts/filter/result.php | 932 + component/site/layouts/general/print.php | 17 + component/site/layouts/index.html | 1 + component/site/layouts/joomla/index.html | 1 + .../site/layouts/joomla/pagination/index.html | 1 + .../site/layouts/joomla/pagination/link.php | 101 + component/site/layouts/mail/billing.php | 136 + component/site/layouts/mail/index.html | 1 + component/site/layouts/mail/shipping.php | 84 + component/site/layouts/order/index.html | 1 + .../site/layouts/order/payment/creditcard.php | 168 + .../layouts/order/payment/extrafields.php | 34 + .../site/layouts/order/payment/index.html | 1 + component/site/layouts/order/status_log.php | 97 + .../site/layouts/pagination/customize.php | 77 + .../layouts/pagination/customize_link.php | 96 + component/site/layouts/pagination/index.html | 1 + .../site/layouts/product/ask_question.php | 82 + component/site/layouts/product/compare.php | 26 + .../site/layouts/product/compare_ajax.php | 63 + component/site/layouts/product/index.html | 1 + .../site/layouts/product/order_attribute.php | 117 + .../layouts/product/product_accessory.php | 113 + .../layouts/product/product_attribute.php | 95 + .../layouts/product/product_price_table.php | 41 + .../site/layouts/product/product_rating.php | 115 + .../layouts/product/quotation_attribute.php | 71 + component/site/layouts/product/rating.php | 18 + .../layouts/product/stock_amount_image.php | 29 + .../site/layouts/product/stockroom_detail.php | 23 + .../site/layouts/registration/captcha.php | 31 + .../site/layouts/registration/index.html | 1 + component/site/models/account.php | 630 + component/site/models/account_billto.php | 122 + component/site/models/account_shipto.php | 167 + component/site/models/ask_question.php | 145 + component/site/models/cart.php | 933 + component/site/models/catalog.php | 150 + component/site/models/category.php | 928 + component/site/models/checkout.php | 2207 ++ component/site/models/forms/ask_question.xml | 36 + component/site/models/forms/index.html | 3 + .../site/models/forms/product_rating.xml | 59 + component/site/models/giftcard.php | 93 + component/site/models/index.html | 3 + component/site/models/login.php | 76 + component/site/models/manufacturers.php | 391 + component/site/models/newsletter.php | 123 + component/site/models/order_detail.php | 189 + component/site/models/orders.php | 90 + component/site/models/ordertracker.php | 35 + component/site/models/price_filter.php | 46 + component/site/models/product.php | 610 + component/site/models/product_mini.php | 175 + component/site/models/product_rating.php | 191 + component/site/models/quotation.php | 657 + component/site/models/quotation_detail.php | 250 + component/site/models/ratings.php | 95 + component/site/models/registration.php | 57 + component/site/models/search.php | 1538 + component/site/models/send_friend.php | 138 + component/site/models/wishlist.php | 525 + component/site/redshop.php | 165 + component/site/router.php | 981 + component/site/views/account/index.html | 3 + component/site/views/account/tmpl/cards.php | 19 + component/site/views/account/tmpl/cards.xml | 8 + component/site/views/account/tmpl/default.php | 499 + component/site/views/account/tmpl/default.xml | 18 + component/site/views/account/tmpl/index.html | 3 + component/site/views/account/tmpl/mytags.php | 223 + .../site/views/account/tmpl/mywishlist.php | 556 + .../site/views/account/tmpl/mywishlist.xml | 8 + component/site/views/account/view.html.php | 166 + .../site/views/account_billto/index.html | 3 + .../views/account_billto/tmpl/default.php | 78 + .../site/views/account_billto/tmpl/index.html | 3 + .../site/views/account_billto/view.html.php | 125 + .../site/views/account_shipto/index.html | 3 + .../views/account_shipto/tmpl/default.php | 90 + .../site/views/account_shipto/tmpl/form.php | 124 + .../site/views/account_shipto/tmpl/index.html | 3 + .../site/views/account_shipto/view.html.php | 139 + component/site/views/ask_question/index.html | 3 + .../site/views/ask_question/tmpl/default.php | 29 + .../site/views/ask_question/tmpl/index.html | 3 + .../site/views/ask_question/view.html.php | 43 + component/site/views/cart/index.html | 3 + .../site/views/cart/tmpl/change_attribute.php | 140 + component/site/views/cart/tmpl/default.php | 299 + component/site/views/cart/tmpl/default.xml | 8 + component/site/views/cart/tmpl/index.html | 3 + component/site/views/cart/view.html.php | 90 + component/site/views/catalog/index.html | 3 + component/site/views/catalog/tmpl/default.php | 99 + component/site/views/catalog/tmpl/default.xml | 8 + component/site/views/catalog/tmpl/index.html | 3 + component/site/views/catalog/tmpl/sample.php | 151 + component/site/views/catalog/tmpl/sample.xml | 9 + component/site/views/catalog/view.html.php | 51 + component/site/views/category/index.html | 3 + .../views/category/tmpl/categoryproduct.php | 608 + .../views/category/tmpl/categoryproduct.xml | 30 + .../site/views/category/tmpl/default.php | 266 + .../site/views/category/tmpl/default.xml | 15 + component/site/views/category/tmpl/detail.php | 1098 + component/site/views/category/tmpl/detail.xml | 31 + component/site/views/category/tmpl/index.html | 3 + .../site/views/category/tmpl/notfound.php | 14 + component/site/views/category/view.html.php | 471 + component/site/views/checkout/index.html | 3 + .../site/views/checkout/tmpl/default.php | 275 + .../site/views/checkout/tmpl/default.xml | 8 + .../views/checkout/tmpl/default_address.php | 145 + .../views/checkout/tmpl/default_billing.php | 16 + .../checkout/tmpl/default_billing_crm.php | 204 + .../checkout/tmpl/default_checkoutnext.php | 152 + .../views/checkout/tmpl/default_payment.php | 37 + .../views/checkout/tmpl/default_shipping.php | 77 + component/site/views/checkout/tmpl/index.html | 3 + .../views/checkout/tmpl/onestepcheckout.php | 436 + component/site/views/checkout/view.html.php | 204 + component/site/views/checkout/view.next.php | 117 + component/site/views/giftcard/index.html | 3 + .../site/views/giftcard/tmpl/default.php | 341 + .../site/views/giftcard/tmpl/default.xml | 8 + component/site/views/giftcard/tmpl/index.html | 3 + component/site/views/giftcard/view.html.php | 35 + component/site/views/index.html | 3 + component/site/views/login/index.html | 3 + component/site/views/login/tmpl/default.php | 63 + component/site/views/login/tmpl/default.xml | 18 + component/site/views/login/tmpl/index.html | 3 + component/site/views/login/tmpl/logout.php | 42 + component/site/views/login/tmpl/logout.xml | 15 + component/site/views/login/tmpl/portal.php | 105 + component/site/views/login/tmpl/portal.xml | 8 + component/site/views/login/tmpl/portals.php | 59 + component/site/views/login/tmpl/portals.xml | 8 + component/site/views/login/view.html.php | 63 + component/site/views/manufacturers/index.html | 3 + .../site/views/manufacturers/tmpl/default.php | 205 + .../site/views/manufacturers/tmpl/default.xml | 21 + .../manufacturers/tmpl/default_detail.php | 58 + .../site/views/manufacturers/tmpl/detail.php | 172 + .../site/views/manufacturers/tmpl/detail.xml | 15 + .../site/views/manufacturers/tmpl/index.html | 3 + .../views/manufacturers/tmpl/products.php | 343 + .../views/manufacturers/tmpl/products.xml | 20 + .../site/views/manufacturers/view.html.php | 287 + component/site/views/newsletter/index.html | 3 + .../site/views/newsletter/tmpl/default.php | 81 + .../site/views/newsletter/tmpl/default.xml | 8 + .../site/views/newsletter/tmpl/index.html | 3 + .../site/views/newsletter/tmpl/thankyou.php | 12 + .../site/views/newsletter/tmpl/thankyou.xml | 8 + component/site/views/newsletter/view.html.php | 65 + component/site/views/order_detail/index.html | 3 + .../order_detail/tmpl/checkout_final.php | 128 + .../site/views/order_detail/tmpl/default.php | 159 + .../site/views/order_detail/tmpl/index.html | 3 + .../site/views/order_detail/tmpl/receipt.php | 152 + .../site/views/order_detail/view.html.php | 158 + component/site/views/orders/index.html | 3 + component/site/views/orders/tmpl/default.php | 170 + component/site/views/orders/tmpl/default.xml | 16 + component/site/views/orders/tmpl/index.html | 3 + component/site/views/orders/view.html.php | 44 + component/site/views/ordertracker/index.html | 3 + .../site/views/ordertracker/tmpl/default.php | 105 + .../site/views/ordertracker/tmpl/default.xml | 8 + .../site/views/ordertracker/tmpl/index.html | 3 + .../site/views/ordertracker/view.html.php | 25 + component/site/views/plugin/index.html | 3 + component/site/views/plugin/tmpl/default.php | 25 + component/site/views/plugin/view.html.php | 22 + component/site/views/price_filter/index.html | 3 + .../site/views/price_filter/tmpl/default.php | 138 + .../site/views/price_filter/tmpl/index.html | 3 + .../site/views/price_filter/view.raw.php | 22 + component/site/views/product/index.html | 3 + component/site/views/product/tmpl/compare.php | 352 + component/site/views/product/tmpl/compare.xml | 9 + component/site/views/product/tmpl/default.php | 1918 ++ component/site/views/product/tmpl/default.xml | 19 + .../views/product/tmpl/default_calculator.php | 86 + .../views/product/tmpl/default_cartbox.php | 50 + .../views/product/tmpl/default_related.php | 165 + .../views/product/tmpl/downloadproduct.php | 145 + .../views/product/tmpl/downloadproduct.xml | 9 + component/site/views/product/tmpl/index.html | 3 + .../views/product/tmpl/viewajaxdetail.php | 212 + .../site/views/product/tmpl/viewwishlist.php | 138 + component/site/views/product/view.html.php | 504 + component/site/views/product_mini/index.html | 3 + .../site/views/product_mini/tmpl/default.php | 134 + .../site/views/product_mini/tmpl/index.html | 3 + .../site/views/product_mini/view.html.php | 63 + .../site/views/product_rating/index.html | 3 + .../views/product_rating/tmpl/default.php | 32 + .../views/product_rating/tmpl/default.xml | 8 + .../site/views/product_rating/tmpl/index.html | 3 + .../site/views/product_rating/view.html.php | 61 + component/site/views/quotation/index.html | 3 + .../site/views/quotation/tmpl/default.php | 132 + .../site/views/quotation/tmpl/default.xml | 8 + .../views/quotation/tmpl/default_user.php | 161 + .../site/views/quotation/tmpl/index.html | 3 + component/site/views/quotation/view.html.php | 47 + .../site/views/quotation_detail/index.html | 3 + .../views/quotation_detail/tmpl/default.php | 413 + .../views/quotation_detail/tmpl/index.html | 3 + .../site/views/quotation_detail/view.html.php | 94 + component/site/views/ratings/index.html | 3 + component/site/views/ratings/tmpl/default.php | 115 + component/site/views/ratings/tmpl/index.html | 3 + component/site/views/ratings/view.html.php | 29 + component/site/views/registration/index.html | 3 + .../site/views/registration/tmpl/default.php | 88 + .../site/views/registration/tmpl/default.xml | 16 + .../site/views/registration/tmpl/index.html | 3 + .../site/views/registration/view.html.php | 90 + component/site/views/search/index.html | 3 + component/site/views/search/tmpl/default.php | 13 + .../views/search/tmpl/featuredproduct.php | 13 + .../views/search/tmpl/featuredproduct.xml | 17 + component/site/views/search/tmpl/index.html | 3 + .../site/views/search/tmpl/newproduct.php | 13 + .../site/views/search/tmpl/newproduct.xml | 22 + .../site/views/search/tmpl/productonsale.php | 13 + .../site/views/search/tmpl/productonsale.xml | 21 + .../site/views/search/tmpl/redfilter.php | 13 + .../site/views/search/tmpl/redfilter.xml | 17 + component/site/views/search/view.html.php | 792 + component/site/views/send_friend/index.html | 3 + .../site/views/send_friend/tmpl/default.php | 85 + .../site/views/send_friend/tmpl/index.html | 3 + .../site/views/send_friend/view.html.php | 38 + component/site/views/wishlist/index.html | 3 + .../site/views/wishlist/tmpl/default.php | 179 + .../site/views/wishlist/tmpl/default.xml | 8 + component/site/views/wishlist/tmpl/index.html | 3 + .../views/wishlist/tmpl/viewloginwishlist.php | 86 + .../site/views/wishlist/tmpl/viewwishlist.php | 621 + .../site/views/wishlist/tmpl/viewwishlist.xml | 8 + component/site/views/wishlist/view.html.php | 57 + composer.json | 39 + composer.phar | Bin 0 -> 1861877 bytes crowdin.yml | 326 + docs/releases/2.0.7.md | 35 + docs/releases/2.1.0.md | 68 + gulp-config.json.dist | 11 + gulp-config.json.jenkins.dist | 12 + gulp-config.sample.json | 11 + gulp-extensions.json | 78 + gulpfile.js | 132 + install.php | 928 + jgulp/components/redshop.assets.js | 106 + jgulp/components/redshop.js | 320 + jgulp/crowdin-conf.js | 55 + jgulp/libraries/redshop.js | 172 + jgulp/modules/site/redshop_cart.js | 87 + jgulp/modules/site/redshop_search.js | 87 + jgulp/plugins/finder/redshop.js | 89 + jgulp/plugins/quickicon/redshop.js | 89 + jgulp/plugins/redshop_alert/alert.js | 89 + jgulp/plugins/redshop_export/attribute.js | 38 + jgulp/plugins/redshop_export/category.js | 38 + jgulp/plugins/redshop_export/field.js | 38 + jgulp/plugins/redshop_export/manufacturer.js | 38 + .../redshop_export/newsletter_subscriber.js | 38 + jgulp/plugins/redshop_export/product.js | 38 + .../redshop_export/product_stockroom_data.js | 38 + .../plugins/redshop_export/related_product.js | 38 + .../redshop_export/shipping_address.js | 38 + .../shopper_group_attribute_price.js | 38 + .../shopper_group_product_price.js | 38 + jgulp/plugins/redshop_export/user.js | 38 + jgulp/plugins/redshop_import/attribute.js | 38 + jgulp/plugins/redshop_import/category.js | 38 + jgulp/plugins/redshop_import/field.js | 38 + jgulp/plugins/redshop_import/manufacturer.js | 38 + .../redshop_import/newslette_subscriber.js | 38 + jgulp/plugins/redshop_import/product.js | 38 + .../redshop_import/product_stockroom_data.js | 38 + .../plugins/redshop_import/related_product.js | 38 + .../redshop_import/shipping_address.js | 38 + .../shopper_group_attribute_price.js | 38 + .../shopper_group_product_price.js | 38 + jgulp/plugins/redshop_import/user.js | 38 + .../rs_payment_banktransfer.js | 89 + .../redshop_payment/rs_payment_paypal.js | 89 + jgulp/plugins/redshop_pdf/tcpdf.js | 68 + jgulp/plugins/redshop_product/sh404urls.js | 89 + .../redshop_shipping/default_shipping.js | 89 + jgulp/plugins/search/redshop_categories.js | 89 + jgulp/plugins/search/redshop_products.js | 89 + .../sh404sefextplugincom_redshop.js | 38 + jgulp/plugins/system/redgoogleanalytics.js | 89 + jgulp/plugins/system/redshop.js | 89 + jgulp/release.js | 179 + jgulp/tasks/clean.js | 12 + jgulp/tasks/copy.js | 14 + jgulp/tasks/release/modules.js | 108 + jgulp/tasks/release/plugins.js | 113 + jgulp/tasks/release/redshop.js | 121 + jgulp/tasks/watch.js | 14 + libraries/index.html | 1 + libraries/redshop/composer.json | 21 + libraries/redshop/controller/admin.php | 51 + libraries/redshop/controller/admin/base.php | 447 + libraries/redshop/controller/admin/index.html | 1 + libraries/redshop/controller/controller.php | 59 + libraries/redshop/controller/form.php | 732 + libraries/redshop/controller/index.html | 1 + libraries/redshop/entities/collection.php | 256 + libraries/redshop/entities/index.html | 1 + libraries/redshop/entity/accessory.php | 32 + libraries/redshop/entity/account_group.php | 32 + libraries/redshop/entity/attribute.php | 21 + libraries/redshop/entity/attribute_price.php | 32 + libraries/redshop/entity/attribute_set.php | 32 + libraries/redshop/entity/base.php | 987 + libraries/redshop/entity/category.php | 302 + libraries/redshop/entity/country.php | 21 + libraries/redshop/entity/coupon.php | 21 + .../redshop/entity/coupon_transaction.php | 32 + libraries/redshop/entity/currency.php | 58 + libraries/redshop/entity/discount.php | 80 + libraries/redshop/entity/discount_product.php | 128 + libraries/redshop/entity/entity.php | 67 + libraries/redshop/entity/field.php | 88 + libraries/redshop/entity/field_data.php | 21 + libraries/redshop/entity/field_group.php | 82 + libraries/redshop/entity/field_value.php | 32 + libraries/redshop/entity/giftcard.php | 21 + libraries/redshop/entity/index.html | 1 + libraries/redshop/entity/mail.php | 21 + libraries/redshop/entity/manufacturer.php | 93 + libraries/redshop/entity/mass_discount.php | 21 + libraries/redshop/entity/media.php | 62 + libraries/redshop/entity/media/image.php | 152 + libraries/redshop/entity/media/index.html | 1 + libraries/redshop/entity/newsletter.php | 32 + libraries/redshop/entity/order.php | 418 + libraries/redshop/entity/order_item.php | 101 + .../redshop/entity/order_item_accessory.php | 32 + .../redshop/entity/order_item_attribute.php | 32 + libraries/redshop/entity/order_payment.php | 64 + libraries/redshop/entity/order_status.php | 21 + libraries/redshop/entity/order_status_log.php | 32 + libraries/redshop/entity/order_user.php | 94 + libraries/redshop/entity/price.php | 32 + libraries/redshop/entity/product.php | 202 + libraries/redshop/entity/product_compare.php | 32 + libraries/redshop/entity/product_discount.php | 32 + .../entity/product_discount_calculate.php | 32 + .../product_discount_calculate_extra.php | 32 + libraries/redshop/entity/product_serial.php | 32 + .../redshop/entity/product_subscribe.php | 32 + .../redshop/entity/product_subscription.php | 32 + .../entity/product_subscription_renewal.php | 32 + libraries/redshop/entity/product_tag.php | 32 + libraries/redshop/entity/property.php | 32 + libraries/redshop/entity/question.php | 21 + libraries/redshop/entity/quotation.php | 32 + libraries/redshop/entity/quotation_item.php | 32 + .../entity/quotation_item_accessory.php | 32 + .../entity/quotation_item_attribute.php | 32 + libraries/redshop/entity/rating.php | 32 + libraries/redshop/entity/shipping.php | 32 + libraries/redshop/entity/shipping_box.php | 21 + libraries/redshop/entity/shipping_rate.php | 32 + libraries/redshop/entity/shopper_group.php | 97 + libraries/redshop/entity/state.php | 21 + libraries/redshop/entity/stockroom.php | 32 + libraries/redshop/entity/stockroom_image.php | 32 + libraries/redshop/entity/sub_attribute.php | 32 + libraries/redshop/entity/subscription.php | 32 + libraries/redshop/entity/supplier.php | 21 + libraries/redshop/entity/tax_group.php | 81 + libraries/redshop/entity/tax_rate.php | 21 + libraries/redshop/entity/template.php | 21 + libraries/redshop/entity/user.php | 32 + libraries/redshop/entity/user_cart.php | 21 + libraries/redshop/entity/user_cart_item.php | 21 + .../entity/user_cart_item_accessory.php | 33 + .../entity/user_cart_item_attribute.php | 33 + .../redshop/entity/user_notify_stock.php | 32 + libraries/redshop/entity/voucher.php | 79 + .../redshop/entity/voucher_transaction.php | 32 + libraries/redshop/entity/wishlist.php | 32 + libraries/redshop/entity/wishlist_product.php | 21 + .../redshop/entity/wishlist_product_item.php | 21 + libraries/redshop/entity/wrapper.php | 32 + libraries/redshop/entity/xml_export.php | 32 + libraries/redshop/entity/xml_import.php | 32 + libraries/redshop/entity/zipcode.php | 32 + libraries/redshop/form/field/calendar.php | 213 + libraries/redshop/form/field/country.php | 50 + .../redshop/form/field/coupon_remaining.php | 54 + libraries/redshop/form/field/fieldsection.php | 65 + libraries/redshop/form/field/fieldsgroups.php | 63 + libraries/redshop/form/field/fieldtype.php | 49 + libraries/redshop/form/field/fontlist.php | 68 + libraries/redshop/form/field/index.html | 1 + libraries/redshop/form/field/mail_section.php | 52 + libraries/redshop/form/field/manufacturer.php | 53 + libraries/redshop/form/field/media.php | 86 + libraries/redshop/form/field/order_status.php | 45 + .../redshop/form/field/payment_method.php | 60 + libraries/redshop/form/field/radio.php | 133 + libraries/redshop/form/field/rules.php | 181 + .../redshop/form/field/shipping_method.php | 64 + libraries/redshop/form/field/state.php | 73 + libraries/redshop/form/field/taxgroup.php | 48 + libraries/redshop/form/field/template.php | 64 + .../redshop/form/field/template_section.php | 53 + libraries/redshop/form/field/text.php | 116 + libraries/redshop/form/field/users.php | 62 + .../redshop/form/field/voucher_product.php | 101 + libraries/redshop/form/fields/cardtypes.php | 98 + libraries/redshop/form/fields/categories.php | 60 + .../redshop/form/fields/categoriesparent.php | 178 + .../redshop/form/fields/categorylist.php | 400 + libraries/redshop/form/fields/creditcards.php | 72 + libraries/redshop/form/fields/currency.php | 115 + .../form/fields/economicaccountgroup.php | 56 + .../redshop/form/fields/epaycardtypes.php | 132 + .../redshop/form/fields/extrafieldpayment.php | 63 + libraries/redshop/form/fields/extrafields.php | 166 + .../form/fields/extrafieldshipping.php | 59 + libraries/redshop/form/fields/extrainfo.php | 38 + libraries/redshop/form/fields/index.html | 1 + .../redshop/form/fields/manufacturer.php | 44 + .../redshop/form/fields/mediadragdrop.php | 54 + .../form/fields/orderbymanufacturer.php | 51 + .../redshop/form/fields/orderbyproduct.php | 58 + libraries/redshop/form/fields/orderstatus.php | 44 + .../redshop/form/fields/ordertemplatelist.php | 47 + .../redshop/form/fields/productattributes.php | 73 + libraries/redshop/form/fields/products.php | 79 + .../redshop/form/fields/productsearchtype.php | 45 + .../redshop/form/fields/rajaxproducts.php | 46 + libraries/redshop/form/fields/rajaxusers.php | 44 + libraries/redshop/form/fields/rcountries.php | 49 + .../redshop/form/fields/rcountry3code.php | 55 + libraries/redshop/form/fields/rdaterange.php | 75 + .../redshop/form/fields/redshopcategory.php | 90 + .../redshop/form/fields/redshopeditor.php | 46 + .../redshop/form/fields/rpredefinedlist.php | 95 + libraries/redshop/form/fields/rproducts.php | 80 + libraries/redshop/form/fields/rpublished.php | 77 + libraries/redshop/form/fields/rstate2code.php | 60 + libraries/redshop/form/fields/sample.php | 57 + libraries/redshop/form/fields/searchtype.php | 44 + .../redshop/form/fields/shoppergrouplist.php | 47 + .../redshop/form/fields/stockroomlist.php | 85 + libraries/redshop/form/fields/template.php | 55 + .../redshop/form/fields/templatecompare.php | 68 + libraries/redshop/form/fields/timestamp.php | 59 + libraries/redshop/form/index.html | 1 + libraries/redshop/form/rules/index.html | 1 + libraries/redshop/helper/access.php | 198 + libraries/redshop/helper/accessory.php | 190 + libraries/redshop/helper/ajax.php | 48 + libraries/redshop/helper/attribute.php | 878 + libraries/redshop/helper/billing.php | 569 + libraries/redshop/helper/billing/tag.php | 275 + libraries/redshop/helper/breadcrumb.php | 391 + libraries/redshop/helper/cart.php | 947 + libraries/redshop/helper/cart/discount.php | 552 + libraries/redshop/helper/cart/index.html | 1 + libraries/redshop/helper/cart/session.php | 55 + libraries/redshop/helper/cart/shipping.php | 386 + libraries/redshop/helper/cart/tag.php | 833 + libraries/redshop/helper/catalog.php | 303 + libraries/redshop/helper/category.php | 578 + libraries/redshop/helper/clickatell.php | 216 + libraries/redshop/helper/config.php | 536 + libraries/redshop/helper/cron.php | 360 + libraries/redshop/helper/currency.php | 82 + libraries/redshop/helper/datetime.php | 233 + libraries/redshop/helper/discount.php | 260 + libraries/redshop/helper/document.php | 538 + libraries/redshop/helper/extrafields.php | 1917 ++ libraries/redshop/helper/googleanalytics.php | 92 + libraries/redshop/helper/index.html | 1 + libraries/redshop/helper/joomla.php | 314 + libraries/redshop/helper/js.php | 183 + libraries/redshop/helper/mail.php | 319 + libraries/redshop/helper/manufacturer.php | 33 + libraries/redshop/helper/media.php | 1014 + libraries/redshop/helper/media/image.php | 289 + libraries/redshop/helper/media/index.html | 1 + libraries/redshop/helper/module.php | 42 + libraries/redshop/helper/newsletter.php | 156 + libraries/redshop/helper/order.php | 2945 ++ libraries/redshop/helper/payment.php | 516 + libraries/redshop/helper/pdf.php | 113 + libraries/redshop/helper/pdf_merge.php | 200 + libraries/redshop/helper/product.php | 1289 + .../redshop/helper/product/accessory.php | 603 + libraries/redshop/helper/product/download.php | 59 + libraries/redshop/helper/product/index.html | 1 + libraries/redshop/helper/product/price.php | 701 + libraries/redshop/helper/product/tag.php | 1122 + .../redshop/helper/product_attribute.php | 618 + libraries/redshop/helper/quotation.php | 564 + libraries/redshop/helper/router.php | 280 + libraries/redshop/helper/sample.php | 332 + libraries/redshop/helper/shipping.php | 1702 + libraries/redshop/helper/shipping/index.html | 1 + libraries/redshop/helper/shipping/tag.php | 50 + libraries/redshop/helper/shopper_group.php | 357 + libraries/redshop/helper/statistic.php | 107 + libraries/redshop/helper/stockroom.php | 1543 + libraries/redshop/helper/tax.php | 133 + libraries/redshop/helper/template.php | 693 + libraries/redshop/helper/text.php | 105 + libraries/redshop/helper/user.php | 758 + libraries/redshop/helper/utility.php | 1194 + libraries/redshop/helper/virtuemart.php | 93 + libraries/redshop/helper/wishlist.php | 335 + libraries/redshop/helper/world.php | 438 + libraries/redshop/html/index.html | 1 + libraries/redshop/html/redshopcalendar.php | 119 + libraries/redshop/html/redshopgrid.php | 254 + libraries/redshop/html/redshopjquery.php | 446 + libraries/redshop/html/redshopmedia.php | 54 + libraries/redshop/html/redshopselect.php | 431 + libraries/redshop/html/redshopsortable.php | 135 + libraries/redshop/index.html | 1 + libraries/redshop/install/index.html | 1 + libraries/redshop/install/install.php | 359 + libraries/redshop/install/update.php | 57 + .../language/en-GB/en-GB.lib_redshop.ini | 37 + .../language/en-GB/en-GB.lib_redshop.sys.ini | 7 + libraries/redshop/language/en-GB/index.html | 1 + libraries/redshop/language/index.html | 1 + libraries/redshop/layout/base.php | 147 + libraries/redshop/layout/file.php | 430 + libraries/redshop/layout/helper.php | 87 + libraries/redshop/layout/index.html | 1 + libraries/redshop/layout/layout.php | 39 + .../layouts/extrafields/display/country.php | 20 + .../layouts/extrafields/display/document.php | 23 + .../layouts/extrafields/display/image.php | 34 + .../layouts/extrafields/display/select.php | 19 + .../layouts/extrafields/display/text.php | 19 + .../layouts/extrafields/display/textarea.php | 20 + .../layouts/extrafields/field/checkbox.php | 48 + .../layouts/extrafields/field/country.php | 43 + .../layouts/extrafields/field/date_picker.php | 39 + .../layouts/extrafields/field/document.php | 117 + .../layouts/extrafields/field/editor.php | 30 + .../layouts/extrafields/field/image.php | 62 + .../layouts/extrafields/field/image_link.php | 100 + .../layouts/extrafields/field/multiple.php | 52 + .../layouts/extrafields/field/radio.php | 47 + .../layouts/extrafields/field/select.php | 44 + .../extrafields/field/selected_condition.php | 111 + .../layouts/extrafields/field/text.php | 42 + .../layouts/extrafields/field/textarea.php | 38 + .../extrafields/userfield/checkbox.php | 41 + .../extrafields/userfield/date_picker.php | 41 + .../extrafields/userfield/document.php | 112 + .../layouts/extrafields/userfield/image.php | 49 + .../extrafields/userfield/multiple.php | 40 + .../layouts/extrafields/userfield/radio.php | 41 + .../layouts/extrafields/userfield/select.php | 41 + .../layouts/extrafields/userfield/text.php | 36 + .../extrafields/userfield/textarea.php | 36 + .../redshop/layouts/field/date_range.php | 144 + libraries/redshop/layouts/field/index.html | 1 + libraries/redshop/layouts/field/radio.php | 67 + .../redshop/layouts/field/rules/group.php | 352 + .../redshop/layouts/field/rules/index.html | 1 + .../redshop/layouts/field/rules/rules.php | 184 + .../redshop/layouts/field/rules/wrapper.php | 86 + .../layouts/field_display/checkbox.php | 32 + .../redshop/layouts/field_display/country.php | 32 + .../layouts/field_display/datepicker.php | 32 + .../layouts/field_display/multiple.php | 32 + .../redshop/layouts/field_display/radio.php | 32 + .../redshop/layouts/field_display/select.php | 32 + .../redshop/layouts/field_display/text.php | 33 + .../layouts/field_display/textarea.php | 32 + libraries/redshop/layouts/html/index.html | 1 + libraries/redshop/layouts/html/list.php | 78 + .../redshop/layouts/html/media/button.php | 38 + libraries/redshop/layouts/index.html | 1 + .../layouts/media/additional_media.php | 207 + libraries/redshop/layouts/media/dropzone.php | 184 + libraries/redshop/layouts/media/index.html | 1 + .../redshop/layouts/media/media_files.php | 126 + .../redshop/layouts/order/glslocation.php | 34 + libraries/redshop/layouts/order/index.html | 1 + .../redshop/layouts/order/order_print.php | 164 + .../redshop/layouts/product/attributes.php | 164 + libraries/redshop/layouts/product/index.html | 0 .../layouts/product/property_scroller.php | 83 + .../layouts/product/subproperty_scroller.php | 88 + .../redshop/layouts/shop/compare_product.php | 59 + libraries/redshop/layouts/system/index.html | 1 + libraries/redshop/layouts/system/message.php | 69 + .../redshop/layouts/tags/accessory/index.html | 1 + .../layouts/tags/accessory/preview_image.php | 22 + .../redshop/layouts/tags/common/index.html | 1 + libraries/redshop/layouts/tags/index.html | 1 + .../redshop/layouts/tags/product/index.html | 1 + .../tags/product/product_attribute.php | 28 + .../tags/product/stock_notify_flag.php | 65 + .../layouts/tags/product/wishlist_button.php | 58 + .../layouts/tags/product/wishlist_link.php | 58 + libraries/redshop/layouts/toolbar/index.html | 1 + .../redshop/layouts/toolbar/redshopgroup.php | 32 + .../layouts/toolbar/redshoplink.j2.php | 22 + .../layouts/toolbar/redshoplink.j3.php | 21 + libraries/redshop/library.php | 104 + libraries/redshop/menu/index.html | 1 + libraries/redshop/menu/left_menu.php | 967 + libraries/redshop/menu/menu.php | 244 + libraries/redshop/model/form.php | 428 + libraries/redshop/model/index.html | 1 + libraries/redshop/model/list.php | 609 + libraries/redshop/model/model.php | 474 + libraries/redshop/payment/index.html | 1 + libraries/redshop/payment/payment.php | 172 + libraries/redshop/product/compare.php | 356 + libraries/redshop/product/index.html | 1 + libraries/redshop/product/product.php | 169 + libraries/redshop/redshop.php | 103 + libraries/redshop/redshop.xml | 43 + libraries/redshop/shipping/index.html | 1 + libraries/redshop/shipping/rate.php | 62 + libraries/redshop/src/Account/Helper.php | 107 + libraries/redshop/src/Account/Wishlist.php | 206 + libraries/redshop/src/Ajax/Response.php | 302 + libraries/redshop/src/BaseObject.php | 96 + libraries/redshop/src/Cart/Cart.php | 871 + libraries/redshop/src/Cart/Helper.php | 474 + libraries/redshop/src/Cart/Module.php | 103 + libraries/redshop/src/Cart/Render.php | 949 + libraries/redshop/src/Cart/Render/Label.php | 116 + libraries/redshop/src/Config/App.php | 756 + libraries/redshop/src/Config/index.html | 3 + libraries/redshop/src/Cron/Product.php | 34 + .../redshop/src/Crypto/Helper/Encrypt.php | 44 + libraries/redshop/src/Currency/Currency.php | 817 + .../redshop/src/Currency/CurrencyLayer.php | 269 + libraries/redshop/src/Currency/index.html | 3 + .../redshop/src/Economic/RedshopEconomic.php | 1758 + libraries/redshop/src/Economic/index.html | 3 + .../src/Entity/Traits/Product/Categories.php | 167 + .../src/Entity/Traits/Product/Media.php | 97 + .../src/Entity/Traits/Product/Related.php | 86 + .../src/Entity/Traits/Product/Stock.php | 112 + libraries/redshop/src/Environment.php | 60 + .../redshop/src/Environment/Directory.php | 92 + .../redshop/src/Environment/Remote/Curl.php | 46 + libraries/redshop/src/Fields/SiteHelper.php | 589 + libraries/redshop/src/Filesystem/Mime.php | 675 + libraries/redshop/src/Helper/Ajax.php | 51 + libraries/redshop/src/Helper/ExtraFields.php | 378 + libraries/redshop/src/Helper/Media.php | 239 + libraries/redshop/src/Helper/ShopperGroup.php | 74 + libraries/redshop/src/Helper/Stockroom.php | 235 + libraries/redshop/src/Helper/Utility.php | 306 + libraries/redshop/src/Helper/index.html | 3 + libraries/redshop/src/Mail/AskQuestion.php | 173 + libraries/redshop/src/Mail/Catalog.php | 80 + libraries/redshop/src/Mail/Giftcard.php | 189 + libraries/redshop/src/Mail/Helper.php | 188 + libraries/redshop/src/Mail/Invoice.php | 303 + libraries/redshop/src/Mail/Newsletter.php | 143 + libraries/redshop/src/Mail/Order.php | 366 + libraries/redshop/src/Mail/Quotation.php | 378 + libraries/redshop/src/Mail/User.php | 334 + .../src/Model/Traits/HasDateTimeRange.php | 55 + libraries/redshop/src/Order/Helper.php | 172 + libraries/redshop/src/Order/Item.php | 525 + libraries/redshop/src/Order/Template.php | 595 + .../src/Plugin/AbstractExportPlugin.php | 265 + .../src/Plugin/AbstractImportPlugin.php | 478 + libraries/redshop/src/Plugin/index.html | 3 + libraries/redshop/src/Product/Accessory.php | 75 + libraries/redshop/src/Product/Compare.php | 136 + libraries/redshop/src/Product/Image/Image.php | 340 + .../redshop/src/Product/Image/Render.php | 154 + libraries/redshop/src/Product/Price.php | 77 + libraries/redshop/src/Product/Property.php | 269 + libraries/redshop/src/Product/Rating.php | 58 + libraries/redshop/src/Product/Stock.php | 156 + libraries/redshop/src/Repositories/Order.php | 36 + .../redshop/src/Repositories/Product.php | 91 + .../redshop/src/Repositories/Products.php | 43 + libraries/redshop/src/Repositories/Table.php | 32 + libraries/redshop/src/Shipping/Rate.php | 616 + libraries/redshop/src/Shipping/Tag.php | 397 + libraries/redshop/src/Table/AbstractTable.php | 482 + .../redshop/src/Table/TableInterface.php | 35 + .../src/Table/Traits/HasAutoEvents.php | 855 + .../src/Table/Traits/HasInstanceName.php | 43 + .../src/Table/Traits/HasInstancePrefix.php | 42 + libraries/redshop/src/Table/Traits/index.html | 3 + libraries/redshop/src/Table/index.html | 3 + libraries/redshop/src/Template/Cart.php | 52 + libraries/redshop/src/Template/General.php | 41 + libraries/redshop/src/Template/Helper.php | 381 + .../redshop/src/Update/AbstractUpdate.php | 175 + libraries/redshop/src/Update/index.html | 1 + .../redshop/src/User/Billing/Billing.php | 51 + .../redshop/src/Validation/Creditcard.php | 80 + libraries/redshop/src/View/AbstractView.php | 270 + libraries/redshop/src/View/index.html | 3 + libraries/redshop/src/index.html | 3 + libraries/redshop/table/index.html | 1 + libraries/redshop/table/nested.php | 996 + libraries/redshop/table/table.php | 177 + libraries/redshop/tags/abstract.php | 258 + libraries/redshop/tags/index.html | 1 + libraries/redshop/tags/replacer.php | 56 + libraries/redshop/tags/sections/accessory.php | 72 + libraries/redshop/tags/sections/attribute.php | 52 + libraries/redshop/tags/sections/category.php | 434 + libraries/redshop/tags/sections/index.html | 1 + libraries/redshop/tags/sections/wishlist.php | 93 + libraries/redshop/toolbar/button/index.html | 1 + .../redshop/toolbar/button/redshoplink.php | 100 + libraries/redshop/toolbar/helper.php | 56 + libraries/redshop/toolbar/index.html | 1 + libraries/redshop/toolbar/toolbar.php | 73 + libraries/redshop/view/admin.php | 78 + libraries/redshop/view/csv.php | 155 + libraries/redshop/view/form.php | 274 + libraries/redshop/view/index.html | 1 + libraries/redshop/view/list.php | 378 + libraries/redshop/view/view.php | 23 + .../css/bootstrap-datetimepicker.css | 374 + .../css/bootstrap-datetimepicker.min.css | 5 + media/com_redshop/css/bootstrap-grid.css | 1013 + media/com_redshop/css/bootstrap-grid.min.css | 5 + media/com_redshop/css/colorpicker.css | 161 + media/com_redshop/css/colorpicker.min.css | 1 + media/com_redshop/css/cropper.css | 305 + media/com_redshop/css/cropper.min.css | 9 + media/com_redshop/css/daterangepicker.css | 269 + media/com_redshop/css/daterangepicker.min.css | 1 + media/com_redshop/css/dropzone.css | 396 + media/com_redshop/css/dropzone.min.css | 1 + .../com_redshop/css/flexslider/flexslider.css | 275 + .../css/flexslider/flexslider.min.css | 12 + .../css/flexslider/fonts/flexslider-icon.eot | Bin 0 -> 2082 bytes .../css/flexslider/fonts/flexslider-icon.svg | 19 + .../css/flexslider/fonts/flexslider-icon.ttf | Bin 0 -> 1892 bytes .../css/flexslider/fonts/flexslider-icon.woff | Bin 0 -> 1268 bytes .../css/flexslider/fonts/index.html | 1 + media/com_redshop/css/flexslider/index.html | 1 + media/com_redshop/css/font-awesome.css | 2337 ++ media/com_redshop/css/font-awesome.min.css | 4 + media/com_redshop/css/index.html | 1 + .../css/jquery-ui/images/index.html | 1 + .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 0 -> 418 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 0 -> 312 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 0 -> 205 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 0 -> 348 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 0 -> 5815 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 0 -> 278 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 328 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../images/ui-icons_228ef1_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_444444_256x240.png | Bin 0 -> 7006 bytes .../images/ui-icons_555555_256x240.png | Bin 0 -> 7074 bytes .../images/ui-icons_777620_256x240.png | Bin 0 -> 4676 bytes .../images/ui-icons_777777_256x240.png | Bin 0 -> 7013 bytes .../images/ui-icons_cc0000_256x240.png | Bin 0 -> 4632 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 6313 bytes media/com_redshop/css/jquery-ui/index.html | 1 + media/com_redshop/css/jquery-ui/jquery-ui.css | 1312 + .../css/jquery-ui/jquery-ui.min.css | 7 + .../com_redshop/css/lightbox2/css/index.html | 1 + .../css/lightbox2/css/lightbox.css | 207 + .../css/lightbox2/css/lightbox.min.css | 1 + .../css/lightbox2/images/close.png | Bin 0 -> 280 bytes .../css/lightbox2/images/index.html | 1 + .../css/lightbox2/images/loading.gif | Bin 0 -> 8476 bytes .../com_redshop/css/lightbox2/images/next.png | Bin 0 -> 1350 bytes .../com_redshop/css/lightbox2/images/prev.png | Bin 0 -> 1360 bytes media/com_redshop/css/lightbox2/index.html | 1 + media/com_redshop/css/redshop.admin.css | 27191 ++++++++++++++++ media/com_redshop/css/redshop.admin.min.css | 1 + media/com_redshop/css/redshop.css | 5363 +++ media/com_redshop/css/redshop.layout.css | 67 + media/com_redshop/css/redshop.layout.min.css | 1 + media/com_redshop/css/redshop.media.css | 297 + media/com_redshop/css/redshop.media.min.css | 1 + .../css/redshop.medialist-thumbs.css | 81 + .../css/redshop.medialist-thumbs.min.css | 1 + media/com_redshop/css/redshop.min.css | 5 + media/com_redshop/css/redshop.priceslider.css | 67 + .../css/redshop.priceslider.min.css | 1 + media/com_redshop/css/redshop.print.css | 630 + media/com_redshop/css/redshop.print.min.css | 1 + media/com_redshop/css/redshop.search.css | 95 + media/com_redshop/css/redshop.search.min.css | 1 + media/com_redshop/css/redshop.update.css | 743 + media/com_redshop/css/redshop.update.min.css | 1 + media/com_redshop/css/redshop.validation.css | 49 + .../css/redshop.validation.min.css | 1 + media/com_redshop/css/redshop.wizard.css | 70 + media/com_redshop/css/redshop.wizard.min.css | 1 + media/com_redshop/css/scrollable-navig.css | 69 + .../com_redshop/css/scrollable-navig.min.css | 1 + media/com_redshop/css/select2/index.html | 1 + .../css/select2/select2-bootstrap.css | 87 + .../css/select2/select2-spinner.gif | Bin 0 -> 1849 bytes media/com_redshop/css/select2/select2.css | 704 + media/com_redshop/css/select2/select2.png | Bin 0 -> 613 bytes media/com_redshop/css/select2/select2x2.png | Bin 0 -> 845 bytes media/com_redshop/css/sortablelist.css | 78 + media/com_redshop/css/sortablelist.min.css | 1 + media/com_redshop/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes .../fonts/IcoMoon.dev.commented.svg | 283 + media/com_redshop/fonts/IcoMoon.dev.svg | 223 + media/com_redshop/fonts/IcoMoon.eot | Bin 0 -> 25208 bytes media/com_redshop/fonts/IcoMoon.svg | 223 + media/com_redshop/fonts/IcoMoon.ttf | Bin 0 -> 25044 bytes media/com_redshop/fonts/IcoMoon.woff | Bin 0 -> 25424 bytes .../glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../glyphicons-halflings-regular.svg | 288 + .../glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../com_redshop/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../com_redshop/fonts/fontawesome-webfont.svg | 2671 ++ .../com_redshop/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes media/com_redshop/fonts/icomoon-license.txt | 2 + media/com_redshop/images/261-x-88.png | Bin 0 -> 4790 bytes media/com_redshop/images/accounting.png | Bin 0 -> 3862 bytes .../com_redshop/images/accounting_group16.png | Bin 0 -> 453 bytes .../com_redshop/images/accounting_group32.png | Bin 0 -> 763 bytes .../com_redshop/images/accounting_group48.png | Bin 0 -> 1028 bytes media/com_redshop/images/add.jpg | Bin 0 -> 412 bytes media/com_redshop/images/ajax-loader.gif | Bin 0 -> 3951 bytes media/com_redshop/images/apply.png | Bin 0 -> 3764 bytes media/com_redshop/images/arrow.png | Bin 0 -> 2997 bytes media/com_redshop/images/arrow_d.png | Bin 0 -> 1134 bytes media/com_redshop/images/attribute_bank16.png | Bin 0 -> 319 bytes media/com_redshop/images/attribute_bank32.png | Bin 0 -> 618 bytes media/com_redshop/images/attribute_bank48.png | Bin 0 -> 896 bytes media/com_redshop/images/blank.gif | Bin 0 -> 49 bytes media/com_redshop/images/blue.png | Bin 0 -> 2025 bytes media/com_redshop/images/blue@2x.png | Bin 0 -> 2025 bytes media/com_redshop/images/calendar.png | Bin 0 -> 3838 bytes .../images/catalogmanagement16.png | Bin 0 -> 323 bytes .../images/catalogmanagement32.png | Bin 0 -> 371 bytes .../images/catalogmanagement48.png | Bin 0 -> 468 bytes media/com_redshop/images/categories16.png | Bin 0 -> 405 bytes media/com_redshop/images/categories32.png | Bin 0 -> 638 bytes media/com_redshop/images/categories48.png | Bin 0 -> 892 bytes media/com_redshop/images/check.png | Bin 0 -> 1275 bytes media/com_redshop/images/checkout/blue.jpg | Bin 0 -> 4254 bytes .../images/checkout/dinnersclub.jpg | Bin 0 -> 4701 bytes .../com_redshop/images/checkout/discover.jpg | Bin 0 -> 1978 bytes media/com_redshop/images/checkout/jcb.jpg | Bin 0 -> 4591 bytes media/com_redshop/images/checkout/master.jpg | Bin 0 -> 4733 bytes media/com_redshop/images/checkout/mastero.jpg | Bin 0 -> 4698 bytes media/com_redshop/images/checkout/one.jpg | Bin 0 -> 669 bytes media/com_redshop/images/checkout/one_on.jpg | Bin 0 -> 1304 bytes media/com_redshop/images/checkout/three.jpg | Bin 0 -> 691 bytes .../com_redshop/images/checkout/three_on.jpg | Bin 0 -> 1298 bytes media/com_redshop/images/checkout/two.jpg | Bin 0 -> 692 bytes media/com_redshop/images/checkout/two_on.jpg | Bin 0 -> 1301 bytes media/com_redshop/images/checkout/visa.jpg | Bin 0 -> 4332 bytes media/com_redshop/images/chosen-sprite.png | Bin 0 -> 1473 bytes media/com_redshop/images/chosen-sprite@2x.png | Bin 0 -> 1473 bytes .../images/colorpicker_background.png | Bin 0 -> 1897 bytes media/com_redshop/images/colorpicker_hex.png | Bin 0 -> 532 bytes .../com_redshop/images/colorpicker_hsb_b.png | Bin 0 -> 970 bytes .../com_redshop/images/colorpicker_hsb_h.png | Bin 0 -> 1012 bytes .../com_redshop/images/colorpicker_hsb_s.png | Bin 0 -> 1171 bytes .../com_redshop/images/colorpicker_indic.gif | Bin 0 -> 86 bytes .../images/colorpicker_overlay.png | Bin 0 -> 10355 bytes .../com_redshop/images/colorpicker_rgb_b.png | Bin 0 -> 970 bytes .../com_redshop/images/colorpicker_rgb_g.png | Bin 0 -> 1069 bytes .../com_redshop/images/colorpicker_rgb_r.png | Bin 0 -> 1066 bytes .../com_redshop/images/colorpicker_select.gif | Bin 0 -> 78 bytes .../com_redshop/images/colorpicker_submit.png | Bin 0 -> 984 bytes media/com_redshop/images/colorsample16.png | Bin 0 -> 197 bytes media/com_redshop/images/colorsample32.png | Bin 0 -> 249 bytes media/com_redshop/images/colorsample48.png | Bin 0 -> 299 bytes media/com_redshop/images/communication.png | Bin 0 -> 3699 bytes media/com_redshop/images/companystore16.png | Bin 0 -> 475 bytes media/com_redshop/images/companystore32.png | Bin 0 -> 801 bytes media/com_redshop/images/companystore48.png | Bin 0 -> 613 bytes media/com_redshop/images/con_info.png | Bin 0 -> 855 bytes media/com_redshop/images/configuration.png | Bin 0 -> 3878 bytes media/com_redshop/images/configuration_16.png | Bin 0 -> 464 bytes media/com_redshop/images/configuration_32.png | Bin 0 -> 1465 bytes media/com_redshop/images/container16.png | Bin 0 -> 353 bytes media/com_redshop/images/container32.png | Bin 0 -> 961 bytes media/com_redshop/images/container38.png | Bin 0 -> 635 bytes media/com_redshop/images/container48.png | Bin 0 -> 907 bytes media/com_redshop/images/copy.png | Bin 0 -> 3798 bytes media/com_redshop/images/country_16.png | Bin 0 -> 611 bytes media/com_redshop/images/country_32.png | Bin 0 -> 977 bytes media/com_redshop/images/country_48.png | Bin 0 -> 1380 bytes media/com_redshop/images/coupon16.png | Bin 0 -> 273 bytes media/com_redshop/images/coupon32.png | Bin 0 -> 454 bytes media/com_redshop/images/coupon48.png | Bin 0 -> 571 bytes media/com_redshop/images/currencies_16.png | Bin 0 -> 425 bytes media/com_redshop/images/currencies_32.png | Bin 0 -> 641 bytes media/com_redshop/images/currencies_48.png | Bin 0 -> 928 bytes .../com_redshop/images/custom_background.png | Bin 0 -> 1916 bytes media/com_redshop/images/custom_hex.png | Bin 0 -> 562 bytes media/com_redshop/images/custom_hsb_b.png | Bin 0 -> 1097 bytes media/com_redshop/images/custom_hsb_h.png | Bin 0 -> 970 bytes media/com_redshop/images/custom_hsb_s.png | Bin 0 -> 1168 bytes media/com_redshop/images/custom_indic.gif | Bin 0 -> 86 bytes media/com_redshop/images/custom_rgb_b.png | Bin 0 -> 1008 bytes media/com_redshop/images/custom_rgb_g.png | Bin 0 -> 1069 bytes media/com_redshop/images/custom_rgb_r.png | Bin 0 -> 1018 bytes media/com_redshop/images/custom_submit.png | Bin 0 -> 997 bytes media/com_redshop/images/customer.png | Bin 0 -> 3751 bytes media/com_redshop/images/customization.png | Bin 0 -> 3806 bytes media/com_redshop/images/dashboard_16.png | Bin 0 -> 1264 bytes media/com_redshop/images/dashboard_32.png | Bin 0 -> 1643 bytes media/com_redshop/images/dashboard_48.png | Bin 0 -> 2048 bytes media/com_redshop/images/delete.png | Bin 0 -> 3810 bytes media/com_redshop/images/discount.png | Bin 0 -> 3800 bytes .../images/discountmanagmenet16.png | Bin 0 -> 402 bytes .../images/discountmanagmenet32.png | Bin 0 -> 723 bytes .../images/discountmanagmenet48.png | Bin 0 -> 1065 bytes media/com_redshop/images/down.png | Bin 0 -> 216 bytes media/com_redshop/images/dsv.jpeg | Bin 0 -> 1100 bytes media/com_redshop/images/edit.png | Bin 0 -> 3729 bytes media/com_redshop/images/export16.png | Bin 0 -> 252 bytes media/com_redshop/images/export32.png | Bin 0 -> 357 bytes media/com_redshop/images/export48.png | Bin 0 -> 437 bytes media/com_redshop/images/fields16.png | Bin 0 -> 518 bytes media/com_redshop/images/fields32.png | Bin 0 -> 892 bytes media/com_redshop/images/fields48.png | Bin 0 -> 630 bytes media/com_redshop/images/folder.png | Bin 0 -> 2199 bytes media/com_redshop/images/folderup_32.png | Bin 0 -> 1833 bytes media/com_redshop/images/gbase.png | Bin 0 -> 2398 bytes media/com_redshop/images/giftcard_16.png | Bin 0 -> 377 bytes media/com_redshop/images/giftcard_32.png | Bin 0 -> 584 bytes media/com_redshop/images/giftcard_48.png | Bin 0 -> 827 bytes media/com_redshop/images/help16.png | Bin 0 -> 618 bytes media/com_redshop/images/help32.png | Bin 0 -> 1070 bytes media/com_redshop/images/help48.png | Bin 0 -> 1525 bytes media/com_redshop/images/icon-48-settings.png | Bin 0 -> 1812 bytes media/com_redshop/images/icon_check.png | Bin 0 -> 20084 bytes media/com_redshop/images/icon_setup.png | Bin 0 -> 20170 bytes media/com_redshop/images/import.png | Bin 0 -> 3737 bytes media/com_redshop/images/import16.png | Bin 0 -> 254 bytes media/com_redshop/images/import32.png | Bin 0 -> 368 bytes media/com_redshop/images/import48.png | Bin 0 -> 454 bytes media/com_redshop/images/importexport16.png | Bin 0 -> 561 bytes media/com_redshop/images/importexport32.png | Bin 0 -> 927 bytes media/com_redshop/images/importexport48.png | Bin 0 -> 636 bytes .../images/importexport_management.png | Bin 0 -> 3743 bytes media/com_redshop/images/index.html | 1 + media/com_redshop/images/laegikurv.gif | Bin 0 -> 839 bytes media/com_redshop/images/laegikurven.jpg | Bin 0 -> 2540 bytes media/com_redshop/images/left.png | Bin 0 -> 906 bytes media/com_redshop/images/leftarrow.jpg | Bin 0 -> 488 bytes media/com_redshop/images/loading.gif | Bin 0 -> 433 bytes media/com_redshop/images/logout.png | Bin 0 -> 3750 bytes media/com_redshop/images/mailcenter16.png | Bin 0 -> 723 bytes media/com_redshop/images/mailcenter32.png | Bin 0 -> 1544 bytes media/com_redshop/images/mailcenter48.png | Bin 0 -> 1393 bytes media/com_redshop/images/manufact16.png | Bin 0 -> 598 bytes media/com_redshop/images/manufact32.png | Bin 0 -> 1074 bytes media/com_redshop/images/manufact48.png | Bin 0 -> 1074 bytes .../images/manufacturer/index.html | 1 + media/com_redshop/images/media16.png | Bin 0 -> 626 bytes media/com_redshop/images/media32.png | Bin 0 -> 1260 bytes media/com_redshop/images/media48.png | Bin 0 -> 1796 bytes media/com_redshop/images/menu.png | Bin 0 -> 955 bytes media/com_redshop/images/mime-icon-32/avi.png | Bin 0 -> 1705 bytes media/com_redshop/images/mime-icon-32/doc.png | Bin 0 -> 1110 bytes .../images/mime-icon-32/index.html | 1 + media/com_redshop/images/mime-icon-32/mov.png | Bin 0 -> 1667 bytes media/com_redshop/images/mime-icon-32/mp3.png | Bin 0 -> 1879 bytes media/com_redshop/images/mime-icon-32/mp4.png | Bin 0 -> 1705 bytes media/com_redshop/images/mime-icon-32/odc.png | Bin 0 -> 1480 bytes media/com_redshop/images/mime-icon-32/odd.png | Bin 0 -> 1689 bytes media/com_redshop/images/mime-icon-32/odt.png | Bin 0 -> 1278 bytes media/com_redshop/images/mime-icon-32/ogg.png | Bin 0 -> 1884 bytes media/com_redshop/images/mime-icon-32/pdf.png | Bin 0 -> 1267 bytes media/com_redshop/images/mime-icon-32/ppt.png | Bin 0 -> 1275 bytes media/com_redshop/images/mime-icon-32/rar.png | Bin 0 -> 1446 bytes media/com_redshop/images/mime-icon-32/rtf.png | Bin 0 -> 1135 bytes media/com_redshop/images/mime-icon-32/svg.png | Bin 0 -> 1198 bytes media/com_redshop/images/mime-icon-32/sxd.png | Bin 0 -> 1719 bytes media/com_redshop/images/mime-icon-32/tar.png | Bin 0 -> 1428 bytes media/com_redshop/images/mime-icon-32/tgz.png | Bin 0 -> 1423 bytes media/com_redshop/images/mime-icon-32/wma.png | Bin 0 -> 965 bytes media/com_redshop/images/mime-icon-32/wmv.png | Bin 0 -> 1677 bytes media/com_redshop/images/mime-icon-32/xls.png | Bin 0 -> 1399 bytes media/com_redshop/images/mime-icon-32/zip.png | Bin 0 -> 1440 bytes media/com_redshop/images/new.png | Bin 0 -> 3701 bytes media/com_redshop/images/newsletter16.png | Bin 0 -> 418 bytes media/com_redshop/images/newsletter32.png | Bin 0 -> 874 bytes media/com_redshop/images/newsletter48.png | Bin 0 -> 1320 bytes media/com_redshop/images/noimage.jpg | Bin 0 -> 1341 bytes media/com_redshop/images/order.png | Bin 0 -> 3781 bytes media/com_redshop/images/order1.png | Bin 0 -> 3823 bytes media/com_redshop/images/order16.png | Bin 0 -> 499 bytes media/com_redshop/images/order32.png | Bin 0 -> 825 bytes media/com_redshop/images/order48.png | Bin 0 -> 677 bytes media/com_redshop/images/payment16.png | Bin 0 -> 530 bytes media/com_redshop/images/payment32.png | Bin 0 -> 1012 bytes media/com_redshop/images/payment48.png | Bin 0 -> 992 bytes media/com_redshop/images/plugins16.png | Bin 0 -> 640 bytes media/com_redshop/images/plugins32.png | Bin 0 -> 1240 bytes media/com_redshop/images/plugins48.png | Bin 0 -> 942 bytes media/com_redshop/images/preloader.gif | Bin 0 -> 2608 bytes media/com_redshop/images/preview.png | Bin 0 -> 3767 bytes media/com_redshop/images/print.png | Bin 0 -> 3758 bytes media/com_redshop/images/print_f2.png | Bin 0 -> 2354 bytes media/com_redshop/images/product.png | Bin 0 -> 3589 bytes .../com_redshop/images/product_management.png | Bin 0 -> 3589 bytes media/com_redshop/images/products16.png | Bin 0 -> 639 bytes media/com_redshop/images/products32.png | Bin 0 -> 1287 bytes media/com_redshop/images/products48.png | Bin 0 -> 1081 bytes media/com_redshop/images/publish.png | Bin 0 -> 3776 bytes media/com_redshop/images/publish_x.png | Bin 0 -> 588 bytes media/com_redshop/images/question_16.jpg | Bin 0 -> 648 bytes media/com_redshop/images/question_32.jpg | Bin 0 -> 1354 bytes media/com_redshop/images/question_48.jpg | Bin 0 -> 1864 bytes media/com_redshop/images/quotation_16.jpg | Bin 0 -> 595 bytes media/com_redshop/images/quotation_32.jpg | Bin 0 -> 1112 bytes media/com_redshop/images/quotation_48.jpg | Bin 0 -> 1533 bytes media/com_redshop/images/rating16.png | Bin 0 -> 304 bytes media/com_redshop/images/rating32.png | Bin 0 -> 561 bytes media/com_redshop/images/rating48.png | Bin 0 -> 752 bytes .../com_redshop/images/redcomponent-logo.jpg | Bin 0 -> 23931 bytes media/com_redshop/images/redhost-logo.jpg | Bin 0 -> 25057 bytes media/com_redshop/images/redshop.png | Bin 0 -> 7889 bytes .../com_redshop/images/redshop_white_logo.png | Bin 0 -> 3208 bytes media/com_redshop/images/redshopcart16.png | Bin 0 -> 470 bytes media/com_redshop/images/redshopcart32.png | Bin 0 -> 1006 bytes media/com_redshop/images/redshopcart48.png | Bin 0 -> 1480 bytes media/com_redshop/images/redweb-logo.jpg | Bin 0 -> 21446 bytes media/com_redshop/images/region_16.png | Bin 0 -> 450 bytes media/com_redshop/images/region_32.png | Bin 0 -> 949 bytes media/com_redshop/images/region_48.png | Bin 0 -> 1296 bytes media/com_redshop/images/reloading.gif | Bin 0 -> 9793 bytes media/com_redshop/images/repeatbg.jpg | Bin 0 -> 330 bytes media/com_redshop/images/right.png | Bin 0 -> 946 bytes media/com_redshop/images/rightarrow.jpg | Bin 0 -> 491 bytes media/com_redshop/images/save-new.png | Bin 0 -> 3749 bytes media/com_redshop/images/save.png | Bin 0 -> 3704 bytes media/com_redshop/images/save2.png | Bin 0 -> 977 bytes media/com_redshop/images/search.png | Bin 0 -> 3844 bytes media/com_redshop/images/select.png | Bin 0 -> 506 bytes media/com_redshop/images/select2.png | Bin 0 -> 518 bytes media/com_redshop/images/send.png | Bin 0 -> 3812 bytes media/com_redshop/images/send_order_16.png | Bin 0 -> 1236 bytes media/com_redshop/images/send_order_32.png | Bin 0 -> 1646 bytes media/com_redshop/images/send_order_48.png | Bin 0 -> 2032 bytes media/com_redshop/images/shipping.png | Bin 0 -> 3773 bytes media/com_redshop/images/shipping16.png | Bin 0 -> 673 bytes media/com_redshop/images/shipping32.png | Bin 0 -> 1356 bytes media/com_redshop/images/shipping48.png | Bin 0 -> 1122 bytes media/com_redshop/images/shipping_boxes16.png | Bin 0 -> 360 bytes media/com_redshop/images/shipping_boxes32.png | Bin 0 -> 619 bytes media/com_redshop/images/shipping_boxes48.png | Bin 0 -> 785 bytes .../com_redshop/images/shipping_rates_16.png | Bin 0 -> 416 bytes .../com_redshop/images/shipping_rates_32.png | Bin 0 -> 809 bytes .../com_redshop/images/shipping_rates_48.png | Bin 0 -> 1026 bytes media/com_redshop/images/slider.png | Bin 0 -> 315 bytes media/com_redshop/images/star_rating/0.gif | Bin 0 -> 800 bytes media/com_redshop/images/star_rating/1.gif | Bin 0 -> 1624 bytes media/com_redshop/images/star_rating/2.gif | Bin 0 -> 1701 bytes media/com_redshop/images/star_rating/3.gif | Bin 0 -> 1743 bytes media/com_redshop/images/star_rating/4.gif | Bin 0 -> 1729 bytes media/com_redshop/images/star_rating/5.gif | Bin 0 -> 1679 bytes media/com_redshop/images/star_rating/r_0.gif | Bin 0 -> 1301 bytes media/com_redshop/images/star_rating/r_1.gif | Bin 0 -> 1311 bytes media/com_redshop/images/star_rating/r_2.gif | Bin 0 -> 1317 bytes media/com_redshop/images/star_rating/r_3.gif | Bin 0 -> 1320 bytes media/com_redshop/images/star_rating/r_4.gif | Bin 0 -> 1318 bytes media/com_redshop/images/star_rating/r_5.gif | Bin 0 -> 1315 bytes media/com_redshop/images/statistic.png | Bin 0 -> 3836 bytes media/com_redshop/images/statistic16.png | Bin 0 -> 333 bytes media/com_redshop/images/statistic32.png | Bin 0 -> 548 bytes media/com_redshop/images/statistic48.png | Bin 0 -> 670 bytes .../images/stockroom/icon_lock.gif | Bin 0 -> 1135 bytes media/com_redshop/images/stockroom/index.html | 1 + media/com_redshop/images/stockroom16.png | Bin 0 -> 629 bytes media/com_redshop/images/stockroom32.png | Bin 0 -> 1127 bytes media/com_redshop/images/stockroom48.png | Bin 0 -> 630 bytes media/com_redshop/images/tax.png | Bin 0 -> 3864 bytes media/com_redshop/images/templates16.png | Bin 0 -> 451 bytes media/com_redshop/images/templates32.png | Bin 0 -> 858 bytes media/com_redshop/images/templates48.png | Bin 0 -> 574 bytes media/com_redshop/images/textlibrary16.png | Bin 0 -> 588 bytes media/com_redshop/images/textlibrary32.png | Bin 0 -> 1169 bytes media/com_redshop/images/textlibrary48.png | Bin 0 -> 1673 bytes media/com_redshop/images/tick.png | Bin 0 -> 511 bytes media/com_redshop/images/tools.png | Bin 0 -> 3806 bytes media/com_redshop/images/tooltip.png | Bin 0 -> 3923 bytes media/com_redshop/images/unpublish.png | Bin 0 -> 3897 bytes media/com_redshop/images/up.png | Bin 0 -> 201 bytes media/com_redshop/images/user.png | Bin 0 -> 3782 bytes media/com_redshop/images/user16.png | Bin 0 -> 497 bytes media/com_redshop/images/user32.png | Bin 0 -> 895 bytes media/com_redshop/images/user48.png | Bin 0 -> 677 bytes media/com_redshop/images/vatgroup_16.png | Bin 0 -> 381 bytes media/com_redshop/images/vatgroup_32.png | Bin 0 -> 591 bytes media/com_redshop/images/vatgroup_48.png | Bin 0 -> 893 bytes media/com_redshop/images/vatrates16.png | Bin 0 -> 393 bytes media/com_redshop/images/vatrates32.png | Bin 0 -> 651 bytes media/com_redshop/images/vatrates48.png | Bin 0 -> 984 bytes media/com_redshop/images/voucher16.png | Bin 0 -> 557 bytes media/com_redshop/images/voucher32.png | Bin 0 -> 1055 bytes media/com_redshop/images/voucher48.png | Bin 0 -> 849 bytes media/com_redshop/images/wizard_16.png | Bin 0 -> 1244 bytes media/com_redshop/images/wizard_32.png | Bin 0 -> 1565 bytes media/com_redshop/images/wizard_48.png | Bin 0 -> 1888 bytes media/com_redshop/images/wrapper16.png | Bin 0 -> 361 bytes media/com_redshop/images/wrapper32.png | Bin 0 -> 547 bytes media/com_redshop/images/wrapper48.png | Bin 0 -> 707 bytes media/com_redshop/index.html | 1 + media/com_redshop/js/ajaxupload.js | 709 + media/com_redshop/js/ajaxupload.min.js | 1 + media/com_redshop/js/bootbox.js | 6 + media/com_redshop/js/bootbox.min.js | 1 + .../js/bootstrap-datetimepicker.js | 2636 ++ .../js/bootstrap-datetimepicker.min.js | 2 + media/com_redshop/js/bootstrap.js | 2377 ++ media/com_redshop/js/bootstrap.min.js | 2 + media/com_redshop/js/carousel.js | 1596 + media/com_redshop/js/carousel.min.js | 1 + media/com_redshop/js/catprice_filter.php | 72 + media/com_redshop/js/colorpicker.js | 522 + media/com_redshop/js/colorpicker.min.js | 1 + media/com_redshop/js/cropper.js | 3288 ++ media/com_redshop/js/cropper.min.js | 10 + media/com_redshop/js/daterangepicker.js | 1618 + media/com_redshop/js/daterangepicker.min.js | 2 + media/com_redshop/js/dropzone.js | 3521 ++ media/com_redshop/js/dropzone.min.js | 2 + media/com_redshop/js/eye.js | 34 + media/com_redshop/js/eye.min.js | 1 + media/com_redshop/js/flexslider.js | 1218 + media/com_redshop/js/flexslider.min.js | 5 + media/com_redshop/js/index.html | 1 + media/com_redshop/js/jquery-migrate.js | 521 + media/com_redshop/js/jquery-migrate.min.js | 1 + media/com_redshop/js/jquery-noconflict.js | 1 + media/com_redshop/js/jquery-ui.js | 18706 +++++++++++ media/com_redshop/js/jquery-ui.min.js | 13 + media/com_redshop/js/jquery.fileupload.js | 1482 + media/com_redshop/js/jquery.fileupload.min.js | 1 + .../com_redshop/js/jquery.iframe-transport.js | 217 + .../js/jquery.iframe-transport.min.js | 1 + media/com_redshop/js/jquery.inputmask.js | 2639 ++ media/com_redshop/js/jquery.inputmask.min.js | 3 + media/com_redshop/js/jquery.js | 10346 ++++++ media/com_redshop/js/jquery.metadata.js | 122 + media/com_redshop/js/jquery.metadata.min.js | 1 + media/com_redshop/js/jquery.min.js | 4 + media/com_redshop/js/jquery.tools.min.js | 33 + media/com_redshop/js/jquery.validate.js | 1365 + media/com_redshop/js/jquery.validate.min.js | 1 + media/com_redshop/js/json.js | 506 + media/com_redshop/js/json.min.js | 1 + media/com_redshop/js/lightbox2.js | 519 + media/com_redshop/js/lightbox2.min.js | 15 + media/com_redshop/js/media.js | 559 + media/com_redshop/js/media.min.js | 1 + .../js/moment-timezone-with-data.js | 1204 + .../js/moment-timezone-with-data.min.js | 1 + media/com_redshop/js/moment.js | 4535 +++ media/com_redshop/js/moment.min.js | 1 + media/com_redshop/js/redshop.admin.common.js | 1207 + .../js/redshop.admin.common.min.js | 2 + media/com_redshop/js/redshop.admin.js | 16534 ++++++++++ media/com_redshop/js/redshop.admin.media.js | 88 + .../com_redshop/js/redshop.admin.media.min.js | 1 + media/com_redshop/js/redshop.admin.min.js | 8 + media/com_redshop/js/redshop.alert.js | 77 + media/com_redshop/js/redshop.alert.min.js | 1 + .../js/redshop.attribute-manipulation.js | 230 + .../js/redshop.attribute-manipulation.min.js | 1 + media/com_redshop/js/redshop.attribute.js | 3202 ++ media/com_redshop/js/redshop.attribute.min.js | 2 + media/com_redshop/js/redshop.common.js | 1136 + media/com_redshop/js/redshop.common.min.js | 1 + media/com_redshop/js/redshop.creditcard.js | 416 + .../com_redshop/js/redshop.creditcard.min.js | 1 + media/com_redshop/js/redshop.fields.js | 210 + media/com_redshop/js/redshop.fields.min.js | 1 + media/com_redshop/js/redshop.inline.js | 87 + media/com_redshop/js/redshop.inline.min.js | 1 + media/com_redshop/js/redshop.js | 142 + media/com_redshop/js/redshop.layout.js | 66 + media/com_redshop/js/redshop.layout.min.js | 1 + media/com_redshop/js/redshop.media.js | 613 + media/com_redshop/js/redshop.media.min.js | 1 + media/com_redshop/js/redshop.min.js | 1 + media/com_redshop/js/redshop.onestep.js | 8 + media/com_redshop/js/redshop.onestep.min.js | 1 + media/com_redshop/js/redshop.order.js | 125 + media/com_redshop/js/redshop.order.min.js | 1 + media/com_redshop/js/redshop.redbox.js | 447 + media/com_redshop/js/redshop.redbox.min.js | 1 + media/com_redshop/js/redshop.registration.js | 202 + .../js/redshop.registration.min.js | 1 + media/com_redshop/js/redshop.search.js | 798 + media/com_redshop/js/redshop.search.min.js | 1 + media/com_redshop/js/redshop.thumbscroller.js | 547 + .../js/redshop.thumbscroller.min.js | 1 + media/com_redshop/js/redshop.utils.js | 270 + media/com_redshop/js/redshop.utils.min.js | 1 + media/com_redshop/js/redshop.validation.js | 736 + .../com_redshop/js/redshop.validation.min.js | 1 + media/com_redshop/js/redshop.wishlist.js | 110 + media/com_redshop/js/redshop.wishlist.min.js | 1 + media/com_redshop/js/redshop.xmlfunc.js | 186 + media/com_redshop/js/redshop.xmlfunc.min.js | 1 + media/com_redshop/js/select2.js | 3541 ++ media/com_redshop/js/select2.min.js | 2 + media/com_redshop/js/sortablelist.js | 283 + media/com_redshop/js/sortablelist.min.js | 1 + .../templates/accessory_template/default.php | 14 + .../templates/account_template/default.php | 166 + .../templates/add_to_cart/default.php | 4 + .../templates/ajax_cart_box/default.php | 9 + .../ajax_cart_detail_box/default.php | 11 + .../ask_question_template/default.php | 22 + .../templates/attribute_template/default.php | 16 + .../attributewithcart_template/default.php | 27 + .../templates/billing_template/default.php | 44 + media/com_redshop/templates/cart/default.php | 118 + .../com_redshop/templates/catalog/default.php | 22 + .../templates/catalogue_cart/default.php | 58 + .../catalogue_order_detail/default.php | 95 + .../catalogue_order_receipt/default.php | 29 + .../templates/category/default.php | 44 + .../templates/categoryproduct/default.php | 64 + .../change_cart_attribute/default.php | 7 + .../templates/checkout/default.php | 127 + .../clicktell_sms_message/default.php | 1 + .../company_billing_template/default.php | 86 + .../templates/compare_product/default.php | 101 + .../templates/empty_cart/default.php | 1 + .../templates/frontpage_category/default.php | 15 + .../templates/giftcard/default.php | 8 + .../templates/giftcard_list/default.php | 6 + media/com_redshop/templates/login/default.php | 23 + .../templates/manufacturer/default.php | 21 + .../templates/manufacturer_detail/default.php | 8 + .../manufacturer_products/default.php | 19 + .../templates/newsletter/default.php | 5 + .../templates/newsletter_product/default.php | 6 + .../templates/onestep_checkout/default.php | 29 + .../templates/order_detail/default.php | 160 + .../templates/order_list/default.php | 25 + .../templates/order_print/default.php | 103 + .../templates/order_receipt/default.php | 159 + .../private_billing_template/default.php | 63 + .../com_redshop/templates/product/default.php | 70 + .../product_content_template/default.php | 7 + .../templates/product_sample/default.php | 31 + .../templates/quotation_cart/default.php | 45 + .../templates/quotation_detail/default.php | 120 + .../templates/quotation_request/default.php | 54 + .../templates/redproductfinder/default.php | 13 + .../templates/redshop_payment/default.php | 14 + .../templates/redshop_shipping/default.php | 12 + .../templates/related_product/default.php | 25 + .../com_redshop/templates/review/default.php | 19 + .../templates/shipping_pdf/default.php | 41 + .../templates/shipping_template/default.php | 55 + .../templates/shippingbox/default.php | 4 + .../templates/stock_note/default.php | 31 + .../wishlist_mail_template/default.php | 27 + .../templates/wishlist_template/default.php | 15 + .../templates/wrapper_template/default.php | 18 + media/com_redshop/translations/README.md | 18 + media/com_redshop/translations/category.xml | 25 + media/com_redshop/translations/index.html | 0 media/com_redshop/translations/mail.xml | 21 + .../com_redshop/translations/manufacturer.xml | 24 + media/com_redshop/translations/product.xml | 29 + .../translations/product_attribute.xml | 18 + .../product_attribute_property.xml | 20 + .../translations/product_fields.xml | 19 + .../translations/product_fields_data.xml | 20 + .../translations/product_fields_value.xml | 20 + .../product_subattribute_color.xml | 21 + media/com_redshop/translations/robots.txt | 2 + media/com_redshop/translations/tags.xml | 18 + media/com_redshop/translations/template.xml | 20 + .../com_redshop/translations/textlibrary.xml | 21 + media/index.html | 1 + modules/site/mod_redshop_cart/css/cart.css | 59 + modules/site/mod_redshop_cart/css/index.html | 3 + .../site/mod_redshop_cart/images/index.html | 3 + .../mod_redshop_cart/images/laegikurven.jpg | Bin 0 -> 2540 bytes .../images/shopping_cart_icon.png | Bin 0 -> 1016 bytes modules/site/mod_redshop_cart/index.html | 3 + .../language/en-GB/en-GB.mod_redshop_cart.ini | 31 + .../en-GB/en-GB.mod_redshop_cart.sys.ini | 7 + .../language/en-GB/index.html | 3 + .../site/mod_redshop_cart/language/index.html | 3 + .../mod_redshop_cart/mod_redshop_cart.php | 63 + .../mod_redshop_cart/mod_redshop_cart.xml | 126 + .../site/mod_redshop_cart/tmpl/default.php | 108 + modules/site/mod_redshop_cart/tmpl/index.html | 3 + modules/site/mod_redshop_search/helper.php | 104 + modules/site/mod_redshop_search/index.html | 3 + modules/site/mod_redshop_search/js/index.html | 3 + modules/site/mod_redshop_search/js/search.js | 61 + .../site/mod_redshop_search/js/search.min.js | 1 + .../en-GB/en-GB.mod_redshop_search.ini | 65 + .../en-GB/en-GB.mod_redshop_search.sys.ini | 7 + .../language/en-GB/index.html | 3 + .../mod_redshop_search/language/index.html | 3 + .../mod_redshop_search/mod_redshop_search.php | 142 + .../mod_redshop_search/mod_redshop_search.xml | 180 + .../site/mod_redshop_search/tmpl/default.php | 164 + .../site/mod_redshop_search/tmpl/index.html | 3 + nano.save | 1 + package-lock.json | 8706 +++++ package.json | 53 + .../en-GB/en-GB.plg_finder_redshop.ini | 10 + .../en-GB/en-GB.plg_finder_redshop.sys.ini | 12 + plugins/finder/redshop/redshop.php | 296 + plugins/finder/redshop/redshop.xml | 19 + plugins/quickicon/redshop/index.html | 1 + .../en-GB/en-GB.plg_quickicon_redshop.ini | 5 + .../en-GB/en-GB.plg_quickicon_redshop.sys.ini | 2 + plugins/quickicon/redshop/redshop.php | 70 + plugins/quickicon/redshop/redshop.xml | 34 + plugins/redshop_alert/alert/alert.php | 78 + plugins/redshop_alert/alert/alert.xml | 21 + plugins/redshop_alert/alert/index.html | 1 + .../en-GB/en-GB.plg_redshop_alert_alert.ini | 2 + .../en-GB.plg_redshop_alert_alert.sys.ini | 2 + .../redshop_export/attribute/attribute.php | 372 + .../redshop_export/attribute/attribute.xml | 18 + plugins/redshop_export/attribute/index.html | 1 + .../en-GB.plg_redshop_export_attribute.ini | 6 + ...en-GB.plg_redshop_export_attribute.sys.ini | 2 + plugins/redshop_export/category/category.php | 176 + plugins/redshop_export/category/category.xml | 18 + plugins/redshop_export/category/index.html | 1 + .../en-GB.plg_redshop_export_category.ini | 4 + .../en-GB.plg_redshop_export_category.sys.ini | 2 + plugins/redshop_export/field/field.php | 258 + plugins/redshop_export/field/field.xml | 18 + plugins/redshop_export/field/index.html | 1 + .../en-GB/en-GB.plg_redshop_export_field.ini | 4 + .../en-GB.plg_redshop_export_field.sys.ini | 2 + plugins/redshop_export/index.html | 1 + .../redshop_export/manufacturer/index.html | 1 + .../en-GB.plg_redshop_export_manufacturer.ini | 4 + ...GB.plg_redshop_export_manufacturer.sys.ini | 2 + .../manufacturer/manufacturer.php | 177 + .../manufacturer/manufacturer.xml | 18 + .../newsletter_subscriber/index.html | 1 + ...g_redshop_export_newsletter_subscriber.ini | 3 + ...dshop_export_newsletter_subscriber.sys.ini | 2 + .../newsletter_subscriber.php | 125 + .../newsletter_subscriber.xml | 18 + plugins/redshop_export/product/index.html | 1 + .../en-GB.plg_redshop_export_product.ini | 12 + .../en-GB.plg_redshop_export_product.sys.ini | 2 + plugins/redshop_export/product/product.php | 772 + plugins/redshop_export/product/product.xml | 18 + .../product_stockroom_data/index.html | 1 + ..._redshop_export_product_stockroom_data.ini | 4 + ...shop_export_product_stockroom_data.sys.ini | 2 + .../product_stockroom_data.php | 124 + .../product_stockroom_data.xml | 18 + .../redshop_export/related_product/index.html | 1 + ...-GB.plg_redshop_export_related_product.ini | 4 + ...plg_redshop_export_related_product.sys.ini | 2 + .../related_product/related_product.php | 122 + .../related_product/related_product.xml | 18 + .../shipping_address/index.html | 1 + ...GB.plg_redshop_export_shipping_address.ini | 4 + ...lg_redshop_export_shipping_address.sys.ini | 2 + .../shipping_address/shipping_address.php | 128 + .../shipping_address/shipping_address.xml | 18 + .../shopper_group_attribute_price/index.html | 1 + ...p_export_shopper_group_attribute_price.ini | 4 + ...port_shopper_group_attribute_price.sys.ini | 2 + .../shopper_group_attribute_price.php | 220 + .../shopper_group_attribute_price.xml | 18 + .../shopper_group_product_price/index.html | 1 + ...hop_export_shopper_group_product_price.ini | 4 + ...export_shopper_group_product_price.sys.ini | 2 + .../shopper_group_product_price.php | 140 + .../shopper_group_product_price.xml | 18 + plugins/redshop_export/user/index.html | 1 + .../en-GB/en-GB.plg_redshop_export_user.ini | 4 + .../en-GB.plg_redshop_export_user.sys.ini | 2 + plugins/redshop_export/user/user.php | 160 + plugins/redshop_export/user/user.xml | 18 + .../redshop_import/attribute/attribute.php | 560 + .../redshop_import/attribute/attribute.xml | 18 + plugins/redshop_import/attribute/index.html | 1 + .../en-GB.plg_redshop_import_attribute.ini | 6 + ...en-GB.plg_redshop_import_attribute.sys.ini | 2 + plugins/redshop_import/category/category.php | 166 + plugins/redshop_import/category/category.xml | 18 + plugins/redshop_import/category/index.html | 1 + .../en-GB.plg_redshop_import_category.ini | 6 + .../en-GB.plg_redshop_import_category.sys.ini | 2 + plugins/redshop_import/field/field.php | 226 + plugins/redshop_import/field/field.xml | 18 + plugins/redshop_import/field/index.html | 1 + .../en-GB/en-GB.plg_redshop_import_field.ini | 6 + .../en-GB.plg_redshop_import_field.sys.ini | 2 + .../redshop_import/manufacturer/index.html | 1 + .../en-GB.plg_redshop_import_manufacturer.ini | 6 + ...GB.plg_redshop_import_manufacturer.sys.ini | 2 + .../manufacturer/manufacturer.php | 125 + .../manufacturer/manufacturer.xml | 18 + .../newsletter_subscriber/index.html | 1 + ...g_redshop_import_newsletter_subscriber.ini | 7 + ...dshop_import_newsletter_subscriber.sys.ini | 2 + .../newsletter_subscriber.php | 142 + .../newsletter_subscriber.xml | 18 + plugins/redshop_import/product/index.html | 1 + .../en-GB.plg_redshop_import_product.ini | 6 + .../en-GB.plg_redshop_import_product.sys.ini | 2 + plugins/redshop_import/product/product.php | 1642 + plugins/redshop_import/product/product.xml | 18 + .../product_stockroom_data/index.html | 1 + ..._redshop_import_product_stockroom_data.ini | 6 + ...shop_import_product_stockroom_data.sys.ini | 2 + .../product_stockroom_data.php | 154 + .../product_stockroom_data.xml | 18 + .../redshop_import/related_product/index.html | 1 + ...-GB.plg_redshop_import_related_product.ini | 6 + ...plg_redshop_import_related_product.sys.ini | 2 + .../related_product/related_product.php | 133 + .../related_product/related_product.xml | 18 + .../shipping_address/index.html | 1 + ...GB.plg_redshop_import_shipping_address.ini | 6 + ...lg_redshop_import_shipping_address.sys.ini | 2 + .../shipping_address/shipping_address.php | 144 + .../shipping_address/shipping_address.xml | 18 + .../shopper_group_attribute_price/index.html | 1 + ...p_import_shopper_group_attribute_price.ini | 6 + ...port_shopper_group_attribute_price.sys.ini | 2 + .../shopper_group_attribute_price.php | 199 + .../shopper_group_attribute_price.xml | 18 + .../shopper_group_product_price/index.html | 1 + ...hop_import_shopper_group_product_price.ini | 6 + ...import_shopper_group_product_price.sys.ini | 2 + .../shopper_group_product_price.php | 173 + .../shopper_group_product_price.xml | 18 + plugins/redshop_import/user/index.html | 1 + .../en-GB/en-GB.plg_redshop_import_user.ini | 6 + .../en-GB.plg_redshop_import_user.sys.ini | 2 + plugins/redshop_import/user/user.php | 268 + plugins/redshop_import/user/user.xml | 18 + .../rs_payment_banktransfer/index.html | 1 + ...edshop_payment_rs_payment_banktransfer.ini | 27 + ...op_payment_rs_payment_banktransfer.sys.ini | 10 + .../language/en-GB/index.html | 1 + .../language/index.html | 1 + .../rs_payment_banktransfer.php | 44 + .../rs_payment_banktransfer.xml | 119 + .../rs_payment_paypal/index.html | 1 + ....plg_redshop_payment_rs_payment_paypal.ini | 57 + ..._redshop_payment_rs_payment_paypal.sys.ini | 10 + .../language/en-GB/index.html | 1 + .../rs_payment_paypal/language/index.html | 1 + .../rs_payment_paypal/rs_payment_paypal.php | 82 + .../rs_payment_paypal/rs_payment_paypal.xml | 197 + .../rs_payment_paypal/extra_info.php | 153 + .../rs_payment_paypal/index.html | 0 .../redshop_pdf/tcpdf/helper/composer.json | 8 + plugins/redshop_pdf/tcpdf/helper/helper.php | 81 + plugins/redshop_pdf/tcpdf/helper/index.html | 1 + plugins/redshop_pdf/tcpdf/index.html | 1 + plugins/redshop_pdf/tcpdf/install.php | 73 + .../en-GB/en-GB.plg_redshop_pdf_tcpdf.ini | 13 + .../en-GB/en-GB.plg_redshop_pdf_tcpdf.sys.ini | 6 + .../tcpdf/language/en-GB/index.html | 1 + plugins/redshop_pdf/tcpdf/language/index.html | 1 + plugins/redshop_pdf/tcpdf/tcpdf.php | 382 + plugins/redshop_pdf/tcpdf/tcpdf.xml | 38 + .../en-GB.plg_redshop_product_sh404urls.ini | 2 + ...n-GB.plg_redshop_product_sh404urls.sys.ini | 2 + .../redshop_product/sh404urls/sh404urls.php | 71 + .../redshop_product/sh404urls/sh404urls.xml | 21 + .../default_shipping/default_shipping.php | 105 + .../default_shipping/default_shipping.xml | 49 + .../default_shipping/index.html | 1 + ....plg_redshop_shipping_default_shipping.ini | 14 + ..._redshop_shipping_default_shipping.sys.ini | 11 + .../language/en-GB/index.html | 1 + .../default_shipping/language/index.html | 1 + plugins/search/redshop_categories/index.html | 1 + .../en-GB.plg_search_redshop_categories.ini | 19 + ...n-GB.plg_search_redshop_categories.sys.ini | 10 + .../language/en-GB/index.html | 1 + .../redshop_categories/language/index.html | 1 + .../redshop_categories/redshop_categories.php | 186 + .../redshop_categories/redshop_categories.xml | 60 + plugins/search/redshop_products/index.html | 1 + .../en-GB.plg_search_redshop_products.ini | 18 + .../en-GB.plg_search_redshop_products.sys.ini | 10 + .../language/en-GB/index.html | 1 + .../redshop_products/language/index.html | 1 + .../redshop_products/redshop_products.php | 241 + .../redshop_products/redshop_products.xml | 60 + .../sh404sefextplugincom_redshop/index.html | 1 + ...xtplugins_sh404sefextplugincom_redshop.ini | 7 + ...ugins_sh404sefextplugincom_redshop.sys.ini | 7 + .../redshop/index.html | 1 + .../redshop/meta.php | 89 + .../redshop/sef.php | 872 + .../sh404sefextplugincom_redshop.php | 95 + .../sh404sefextplugincom_redshop.xml | 21 + .../helper/google_analytics.php | 165 + .../redgoogleanalytics/helper/index.html | 1 + plugins/system/redgoogleanalytics/index.html | 1 + plugins/system/redgoogleanalytics/install.php | 92 + .../en-GB.plg_system_redgoogleanalytics.ini | 14 + ...n-GB.plg_system_redgoogleanalytics.sys.ini | 10 + .../language/en-GB/index.html | 0 .../redgoogleanalytics/language/index.html | 0 .../redgoogleanalytics/redgoogleanalytics.php | 164 + .../redgoogleanalytics/redgoogleanalytics.xml | 34 + plugins/system/redshop/index.html | 1 + .../en-GB/en-GB.plg_system_redshop.ini | 2 + .../en-GB/en-GB.plg_system_redshop.sys.ini | 2 + plugins/system/redshop/redshop.php | 82 + plugins/system/redshop/redshop.xml | 20 + redshop.xml | 159 + src/assets/com_redshop/js/ajaxupload.js | 709 + src/assets/com_redshop/js/media.js | 559 + .../com_redshop/js/redshop.admin.common.js | 1207 + src/assets/com_redshop/js/redshop.admin.js | 16534 ++++++++++ .../com_redshop/js/redshop.admin.media.js | 88 + src/assets/com_redshop/js/redshop.alert.js | 77 + .../js/redshop.attribute-manipulation.js | 230 + .../com_redshop/js/redshop.attribute.js | 3202 ++ src/assets/com_redshop/js/redshop.common.js | 1136 + .../com_redshop/js/redshop.creditcard.js | 416 + src/assets/com_redshop/js/redshop.fields.js | 210 + src/assets/com_redshop/js/redshop.inline.js | 87 + src/assets/com_redshop/js/redshop.js | 142 + src/assets/com_redshop/js/redshop.layout.js | 66 + src/assets/com_redshop/js/redshop.media.js | 613 + src/assets/com_redshop/js/redshop.onestep.js | 8 + src/assets/com_redshop/js/redshop.order.js | 125 + src/assets/com_redshop/js/redshop.redbox.js | 447 + .../com_redshop/js/redshop.registration.js | 202 + src/assets/com_redshop/js/redshop.search.js | 798 + .../com_redshop/js/redshop.thumbscroller.js | 547 + src/assets/com_redshop/js/redshop.utils.js | 270 + .../com_redshop/js/redshop.validation.js | 736 + src/assets/com_redshop/js/redshop.wishlist.js | 110 + src/assets/com_redshop/js/redshop.xmlfunc.js | 186 + .../com_redshop/scss/_bootstrap-compass.scss | 9 + .../com_redshop/scss/_bootstrap-mincer.scss | 19 + .../scss/_bootstrap-nav-wizard.scss | 122 + .../scss/_bootstrap-sprockets.scss | 9 + .../scss/_bootstrap-variables.sass | 875 + src/assets/com_redshop/scss/_bootstrap.scss | 56 + .../com_redshop/scss/bootstrap-grid.scss | 15 + .../com_redshop/scss/bootstrap/_alerts.scss | 73 + .../com_redshop/scss/bootstrap/_badges.scss | 68 + .../scss/bootstrap/_breadcrumbs.scss | 28 + .../scss/bootstrap/_button-groups.scss | 244 + .../com_redshop/scss/bootstrap/_buttons.scss | 169 + .../com_redshop/scss/bootstrap/_carousel.scss | 270 + .../com_redshop/scss/bootstrap/_close.scss | 36 + .../com_redshop/scss/bootstrap/_code.scss | 69 + .../scss/bootstrap/_component-animations.scss | 37 + .../scss/bootstrap/_dropdowns.scss | 216 + .../com_redshop/scss/bootstrap/_forms.scss | 617 + .../scss/bootstrap/_glyphicons.scss | 307 + .../scss/bootstrap/_grid-nocontainer.scss | 84 + .../com_redshop/scss/bootstrap/_grid.scss | 84 + .../scss/bootstrap/_input-groups.scss | 171 + .../scss/bootstrap/_jumbotron.scss | 54 + .../com_redshop/scss/bootstrap/_labels.scss | 66 + .../scss/bootstrap/_list-group.scss | 130 + .../com_redshop/scss/bootstrap/_media.scss | 66 + .../com_redshop/scss/bootstrap/_mixins.scss | 40 + .../com_redshop/scss/bootstrap/_modals.scss | 150 + .../com_redshop/scss/bootstrap/_navbar.scss | 662 + .../com_redshop/scss/bootstrap/_navs.scss | 242 + .../scss/bootstrap/_normalize.scss | 424 + .../com_redshop/scss/bootstrap/_pager.scss | 54 + .../scss/bootstrap/_pagination.scss | 89 + .../com_redshop/scss/bootstrap/_panels.scss | 271 + .../com_redshop/scss/bootstrap/_popovers.scss | 131 + .../com_redshop/scss/bootstrap/_print.scss | 101 + .../scss/bootstrap/_progress-bars.scss | 87 + .../scss/bootstrap/_responsive-embed.scss | 35 + .../scss/bootstrap/_responsive-utilities.scss | 179 + .../scss/bootstrap/_scaffolding.scss | 161 + .../com_redshop/scss/bootstrap/_tables.scss | 234 + .../com_redshop/scss/bootstrap/_theme.scss | 291 + .../scss/bootstrap/_thumbnails.scss | 38 + .../com_redshop/scss/bootstrap/_tooltip.scss | 101 + .../com_redshop/scss/bootstrap/_type.scss | 298 + .../scss/bootstrap/_utilities.scss | 55 + .../scss/bootstrap/_variables.scss | 874 + .../com_redshop/scss/bootstrap/_wells.scss | 29 + .../scss/bootstrap/mixins/_alerts.scss | 14 + .../bootstrap/mixins/_background-variant.scss | 12 + .../scss/bootstrap/mixins/_border-radius.scss | 18 + .../scss/bootstrap/mixins/_buttons.scss | 65 + .../scss/bootstrap/mixins/_center-block.scss | 7 + .../scss/bootstrap/mixins/_clearfix.scss | 22 + .../scss/bootstrap/mixins/_forms.scss | 88 + .../scss/bootstrap/mixins/_gradients.scss | 58 + .../bootstrap/mixins/_grid-framework.scss | 81 + .../scss/bootstrap/mixins/_grid.scss | 122 + .../scss/bootstrap/mixins/_hide-text.scss | 21 + .../scss/bootstrap/mixins/_image.scss | 33 + .../scss/bootstrap/mixins/_labels.scss | 12 + .../scss/bootstrap/mixins/_list-group.scss | 32 + .../scss/bootstrap/mixins/_nav-divider.scss | 10 + .../bootstrap/mixins/_nav-vertical-align.scss | 9 + .../scss/bootstrap/mixins/_opacity.scss | 8 + .../scss/bootstrap/mixins/_pagination.scss | 24 + .../scss/bootstrap/mixins/_panels.scss | 24 + .../scss/bootstrap/mixins/_progress-bar.scss | 10 + .../scss/bootstrap/mixins/_reset-filter.scss | 8 + .../scss/bootstrap/mixins/_reset-text.scss | 18 + .../scss/bootstrap/mixins/_resize.scss | 6 + .../mixins/_responsive-visibility.scss | 21 + .../scss/bootstrap/mixins/_size.scss | 10 + .../scss/bootstrap/mixins/_tab-focus.scss | 9 + .../scss/bootstrap/mixins/_table-row.scss | 28 + .../scss/bootstrap/mixins/_text-emphasis.scss | 12 + .../scss/bootstrap/mixins/_text-overflow.scss | 8 + .../bootstrap/mixins/_vendor-prefixes.scss | 222 + .../com_redshop/scss/redshop.layout.scss | 84 + .../com_redshop/scss/redshop.media.scss | 422 + .../scss/redshop.medialist-thumbs.scss | 99 + .../com_redshop/scss/redshop.priceslider.scss | 79 + .../com_redshop/scss/redshop.print.scss | 769 + src/assets/com_redshop/scss/redshop.scss | 296 + .../com_redshop/scss/redshop.search.scss | 122 + .../com_redshop/scss/redshop.update.scss | 920 + .../com_redshop/scss/redshop.validation.scss | 65 + .../com_redshop/scss/redshop.wizard.scss | 96 + src/db/redshop.mwb | Bin 0 -> 103535 bytes .../da-DK/admin/da-DK/da-DK.com_redshop.ini | 4828 +++ .../admin/da-DK/da-DK.com_redshop.sys.ini | 132 + .../da-DK/da-DK.plg_acymailing_redshop.ini | 11 + .../da-DK.plg_acymailing_redshop.sys.ini | 3 + .../da-DK.plg_aesir_field_redshop_product.ini | 30 + ...DK.plg_aesir_field_redshop_product.sys.ini | 7 + .../admin/da-DK/da-DK.plg_ajax_xmlcron.ini | 11 + .../da-DK/da-DK.plg_ajax_xmlcron.sys.ini | 11 + .../da-DK.plg_content_redshop_product.ini | 10 + .../da-DK.plg_content_redshop_product.sys.ini | 3 + .../da-DK/da-DK.plg_economic_economic.ini | 42 + .../da-DK/da-DK.plg_economic_economic.sys.ini | 11 + .../da-DK/da-DK.plg_editors-xtd_product.ini | 4 + .../da-DK.plg_editors-xtd_product.sys.ini | 3 + .../admin/da-DK/da-DK.plg_finder_redshop.ini | 10 + .../da-DK/da-DK.plg_finder_redshop.sys.ini | 13 + .../admin/da-DK/da-DK.plg_logman_redshop.ini | 7 + .../da-DK/da-DK.plg_logman_redshop.sys.ini | 7 + .../da-DK/da-DK.plg_quickicon_redshop.ini | 6 + .../da-DK/da-DK.plg_quickicon_redshop.sys.ini | 3 + .../da-DK/da-DK.plg_redshop_alert_alert.ini | 2 + .../da-DK.plg_redshop_alert_alert.sys.ini | 2 + ...-DK.plg_redshop_checkout_kerry_express.ini | 41 + ...plg_redshop_checkout_kerry_express.sys.ini | 3 + .../da-DK.plg_redshop_export_attribute.ini | 6 + ...da-DK.plg_redshop_export_attribute.sys.ini | 2 + .../da-DK.plg_redshop_export_category.ini | 4 + .../da-DK.plg_redshop_export_category.sys.ini | 2 + .../da-DK/da-DK.plg_redshop_export_field.ini | 4 + .../da-DK.plg_redshop_export_field.sys.ini | 2 + .../da-DK.plg_redshop_export_manufacturer.ini | 4 + ...DK.plg_redshop_export_manufacturer.sys.ini | 2 + ...g_redshop_export_newsletter_subscriber.ini | 3 + ...dshop_export_newsletter_subscriber.sys.ini | 2 + .../da-DK.plg_redshop_export_product.ini | 12 + .../da-DK.plg_redshop_export_product.sys.ini | 2 + ..._redshop_export_product_stockroom_data.ini | 4 + ...shop_export_product_stockroom_data.sys.ini | 2 + ...-DK.plg_redshop_export_related_product.ini | 4 + ...plg_redshop_export_related_product.sys.ini | 2 + ...DK.plg_redshop_export_shipping_address.ini | 4 + ...lg_redshop_export_shipping_address.sys.ini | 2 + ...p_export_shopper_group_attribute_price.ini | 4 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_export_shopper_group_product_price.ini | 4 + ...export_shopper_group_product_price.sys.ini | 2 + .../da-DK/da-DK.plg_redshop_export_user.ini | 4 + .../da-DK.plg_redshop_export_user.sys.ini | 2 + .../da-DK.plg_redshop_import_attribute.ini | 6 + ...da-DK.plg_redshop_import_attribute.sys.ini | 2 + .../da-DK.plg_redshop_import_category.ini | 6 + .../da-DK.plg_redshop_import_category.sys.ini | 2 + .../da-DK/da-DK.plg_redshop_import_field.ini | 6 + .../da-DK.plg_redshop_import_field.sys.ini | 2 + .../da-DK.plg_redshop_import_manufacturer.ini | 6 + ...DK.plg_redshop_import_manufacturer.sys.ini | 2 + ...g_redshop_import_newsletter_subscriber.ini | 8 + ...dshop_import_newsletter_subscriber.sys.ini | 2 + .../da-DK.plg_redshop_import_product.ini | 6 + .../da-DK.plg_redshop_import_product.sys.ini | 2 + ..._redshop_import_product_stockroom_data.ini | 6 + ...shop_import_product_stockroom_data.sys.ini | 2 + ...-DK.plg_redshop_import_related_product.ini | 6 + ...plg_redshop_import_related_product.sys.ini | 2 + ...DK.plg_redshop_import_shipping_address.ini | 6 + ...lg_redshop_import_shipping_address.sys.ini | 2 + ...p_import_shopper_group_attribute_price.ini | 6 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_import_shopper_group_product_price.ini | 6 + ...import_shopper_group_product_price.sys.ini | 2 + .../da-DK/da-DK.plg_redshop_import_user.ini | 6 + .../da-DK.plg_redshop_import_user.sys.ini | 2 + .../da-DK/da-DK.plg_redshop_order_esms.ini | 29 + .../da-DK.plg_redshop_order_esms.sys.ini | 2 + .../da-DK.plg_redshop_payment_baokim.ini | 49 + .../da-DK.plg_redshop_payment_baokim.sys.ini | 16 + .../da-DK/da-DK.plg_redshop_payment_cielo.ini | 64 + .../da-DK.plg_redshop_payment_cielo.sys.ini | 12 + .../da-DK.plg_redshop_payment_dibsdx.ini | 78 + .../da-DK.plg_redshop_payment_dibsdx.sys.ini | 3 + .../da-DK.plg_redshop_payment_dotpay.ini | 60 + .../da-DK.plg_redshop_payment_dotpay.sys.ini | 11 + .../da-DK.plg_redshop_payment_ingenico.ini | 66 + ...da-DK.plg_redshop_payment_ingenico.sys.ini | 12 + .../da-DK.plg_redshop_payment_klarna.ini | 56 + .../da-DK.plg_redshop_payment_klarna.sys.ini | 18 + .../da-DK.plg_redshop_payment_mollieideal.ini | 45 + ...DK.plg_redshop_payment_mollieideal.sys.ini | 12 + .../da-DK.plg_redshop_payment_nganluong.ini | 27 + ...a-DK.plg_redshop_payment_nganluong.sys.ini | 12 + .../da-DK.plg_redshop_payment_paygate.ini | 48 + .../da-DK.plg_redshop_payment_paygate.sys.ini | 12 + ...K.plg_redshop_payment_paypalcreditcard.ini | 68 + ...g_redshop_payment_paypalcreditcard.sys.ini | 15 + .../da-DK.plg_redshop_payment_payson.ini | 68 + .../da-DK.plg_redshop_payment_payson.sys.ini | 17 + .../da-DK.plg_redshop_payment_quickbook.ini | 76 + ...a-DK.plg_redshop_payment_quickbook.sys.ini | 15 + .../da-DK.plg_redshop_payment_quickpay.ini | 88 + ...da-DK.plg_redshop_payment_quickpay.sys.ini | 11 + ...g_redshop_payment_rs_payment_2checkout.ini | 42 + ...dshop_payment_rs_payment_2checkout.sys.ini | 11 + ...shop_payment_rs_payment_amazoncheckout.ini | 39 + ..._payment_rs_payment_amazoncheckout.sys.ini | 3 + ...g_redshop_payment_rs_payment_authorize.ini | 43 + ...dshop_payment_rs_payment_authorize.sys.ini | 3 + ...dshop_payment_rs_payment_authorize_dpm.ini | 35 + ...p_payment_rs_payment_authorize_dpm.sys.ini | 3 + ...edshop_payment_rs_payment_banktransfer.ini | 28 + ...op_payment_rs_payment_banktransfer.sys.ini | 11 + ...dshop_payment_rs_payment_banktransfer2.ini | 28 + ...p_payment_rs_payment_banktransfer2.sys.ini | 11 + ...yment_rs_payment_banktransfer_discount.ini | 2 + ...t_rs_payment_banktransfer_discount.sys.ini | 3 + ..._redshop_payment_rs_payment_beanstream.ini | 2 + ...shop_payment_rs_payment_beanstream.sys.ini | 3 + ...g_redshop_payment_rs_payment_braintree.ini | 50 + ...dshop_payment_rs_payment_braintree.sys.ini | 4 + ...-DK.plg_redshop_payment_rs_payment_cod.ini | 28 + ...plg_redshop_payment_rs_payment_cod.sys.ini | 11 + ...p_payment_rs_payment_dibspaymentmethod.ini | 2 + ...yment_rs_payment_dibspaymentmethod.sys.ini | 3 + ...redshop_payment_rs_payment_eantransfer.ini | 2 + ...hop_payment_rs_payment_eantransfer.sys.ini | 2 + ....plg_redshop_payment_rs_payment_epayv2.ini | 98 + ..._redshop_payment_rs_payment_epayv2.sys.ini | 11 + ...DK.plg_redshop_payment_rs_payment_eway.ini | 53 + ...lg_redshop_payment_rs_payment_eway.sys.ini | 4 + ...edshop_payment_rs_payment_eway3dsecure.ini | 26 + ...op_payment_rs_payment_eway3dsecure.sys.ini | 3 + ...plg_redshop_payment_rs_payment_giropay.ini | 53 + ...redshop_payment_rs_payment_giropay.sys.ini | 11 + ...lg_redshop_payment_rs_payment_imglobal.ini | 44 + ...edshop_payment_rs_payment_imglobal.sys.ini | 3 + ...plg_redshop_payment_rs_payment_moneris.ini | 3 + ...redshop_payment_rs_payment_moneris.sys.ini | 3 + ...redshop_payment_rs_payment_moneybooker.ini | 63 + ...hop_payment_rs_payment_moneybooker.sys.ini | 11 + ..._redshop_payment_rs_payment_payflowpro.ini | 54 + ...shop_payment_rs_payment_payflowpro.sys.ini | 11 + ...hop_payment_rs_payment_payment_express.ini | 3 + ...payment_rs_payment_payment_express.sys.ini | 3 + ...plg_redshop_payment_rs_payment_paymill.ini | 43 + ...redshop_payment_rs_payment_paymill.sys.ini | 3 + ....plg_redshop_payment_rs_payment_paypal.ini | 58 + ..._redshop_payment_rs_payment_paypal.sys.ini | 10 + ...redshop_payment_rs_payment_postfinance.ini | 3 + ...hop_payment_rs_payment_postfinance.sys.ini | 3 + ..._redshop_payment_rs_payment_rapid_eway.ini | 28 + ...shop_payment_rs_payment_rapid_eway.sys.ini | 3 + ...plg_redshop_payment_rs_payment_sagepay.ini | 60 + ...redshop_payment_rs_payment_sagepay.sys.ini | 11 + ...redshop_payment_rs_payment_sagepay_vps.ini | 53 + ...hop_payment_rs_payment_sagepay_vps.sys.ini | 3 + ...lg_redshop_payment_rs_payment_worldpay.ini | 3 + ...edshop_payment_rs_payment_worldpay.sys.ini | 2 + .../da-DK.plg_redshop_payment_stripe.ini | 54 + .../da-DK.plg_redshop_payment_stripe.sys.ini | 17 + .../da-DK/da-DK.plg_redshop_pdf_dompdf.ini | 11 + .../da-DK.plg_redshop_pdf_dompdf.sys.ini | 6 + .../da-DK/da-DK.plg_redshop_pdf_mpdf.ini | 11 + .../da-DK/da-DK.plg_redshop_pdf_mpdf.sys.ini | 6 + .../da-DK/da-DK.plg_redshop_pdf_tcpdf.ini | 13 + .../da-DK/da-DK.plg_redshop_pdf_tcpdf.sys.ini | 6 + ...K.plg_redshop_product_CreateColorImage.ini | 8 + ...g_redshop_product_CreateColorImage.sys.ini | 2 + .../da-DK.plg_redshop_product_bundle.ini | 11 + .../da-DK.plg_redshop_product_bundle.sys.ini | 10 + .../da-DK.plg_redshop_product_canonical.ini | 11 + ...a-DK.plg_redshop_product_canonical.sys.ini | 11 + ...g_redshop_product_custom_field_mapping.ini | 13 + ...dshop_product_custom_field_mapping.sys.ini | 10 + ...shop_product_discount_affect_attribute.ini | 11 + ..._product_discount_affect_attribute.sys.ini | 11 + ...a-DK.plg_redshop_product_discount_rule.ini | 15 + ....plg_redshop_product_discount_rule.sys.ini | 8 + .../da-DK/da-DK.plg_redshop_product_gift.ini | 11 + .../da-DK.plg_redshop_product_gift.sys.ini | 11 + .../da-DK/da-DK.plg_redshop_product_gls.ini | 11 + .../da-DK.plg_redshop_product_gls.sys.ini | 11 + ...K.plg_redshop_product_google_microdata.ini | 18 + ...g_redshop_product_google_microdata.sys.ini | 11 + .../da-DK.plg_redshop_product_invoicepdf.ini | 25 + ...-DK.plg_redshop_product_invoicepdf.sys.ini | 10 + .../da-DK.plg_redshop_product_postdanmark.ini | 11 + ...DK.plg_redshop_product_postdanmark.sys.ini | 11 + ...DK.plg_redshop_product_product_alttext.ini | 4 + ...lg_redshop_product_product_alttext.sys.ini | 2 + ....plg_redshop_product_shoppergroup_tags.ini | 3 + ..._redshop_product_shoppergroup_tags.sys.ini | 3 + ....plg_redshop_product_stock_notifyemail.ini | 12 + ..._redshop_product_stock_notifyemail.sys.ini | 11 + ...K.plg_redshop_product_stockroom_status.ini | 21 + ...g_redshop_product_stockroom_status.sys.ini | 11 + .../da-DK.plg_redshop_product_sync_b2b.ini | 16 + ...da-DK.plg_redshop_product_sync_b2b.sys.ini | 8 + .../da-DK.plg_redshop_product_type_bundle.ini | 12 + ...DK.plg_redshop_product_type_bundle.sys.ini | 10 + .../da-DK.plg_redshop_product_type_gift.ini | 12 + ...a-DK.plg_redshop_product_type_gift.sys.ini | 10 + ...da-DK.plg_redshop_product_wss_datafeed.ini | 12 + ...K.plg_redshop_product_wss_datafeed.sys.ini | 3 + .../da-DK.plg_redshop_shipping_bring.ini | 12 + .../da-DK.plg_redshop_shipping_bring.sys.ini | 2 + ....plg_redshop_shipping_default_shipping.ini | 15 + ..._redshop_shipping_default_shipping.sys.ini | 11 + ..._redshop_shipping_default_shipping_gls.ini | 9 + ...shop_shipping_default_shipping_gls.sys.ini | 2 + ..._shipping_default_shipping_glsbusiness.ini | 17 + ...pping_default_shipping_glsbusiness.sys.ini | 11 + .../da-DK.plg_redshop_shipping_fedex.ini | 60 + .../da-DK.plg_redshop_shipping_fedex.sys.ini | 11 + ...-DK.plg_redshop_shipping_giaohangnhanh.ini | 43 + ...plg_redshop_shipping_giaohangnhanh.sys.ini | 3 + ...da-DK.plg_redshop_shipping_postdanmark.ini | 31 + ...K.plg_redshop_shipping_postdanmark.sys.ini | 11 + ...da-DK.plg_redshop_shipping_self_pickup.ini | 5 + ...K.plg_redshop_shipping_self_pickup.sys.ini | 3 + .../da-DK.plg_redshop_shipping_shipper.ini | 5 + ...da-DK.plg_redshop_shipping_shipper.sys.ini | 2 + .../da-DK/da-DK.plg_redshop_shipping_ups.ini | 62 + .../da-DK.plg_redshop_shipping_ups.sys.ini | 2 + .../da-DK.plg_redshop_shipping_uspsv4.ini | 46 + .../da-DK.plg_redshop_shipping_uspsv4.sys.ini | 2 + .../da-DK.plg_redshop_user_cmc_integrate.ini | 11 + ...-DK.plg_redshop_user_cmc_integrate.sys.ini | 2 + ...lg_redshop_user_joomlamailer_integrate.ini | 2 + ...edshop_user_joomlamailer_integrate.sys.ini | 2 + ...g_redshop_user_registration_acymailing.ini | 4 + ...dshop_user_registration_acymailing.sys.ini | 2 + ...vies_registration_rs_vies_registration.ini | 45 + ..._registration_rs_vies_registration.sys.ini | 3 + .../da-DK.plg_search_redshop_categories.ini | 20 + ...a-DK.plg_search_redshop_categories.sys.ini | 10 + .../da-DK.plg_search_redshop_products.ini | 19 + .../da-DK.plg_search_redshop_products.sys.ini | 11 + ...xtplugins_sh404sefextplugincom_redshop.ini | 7 + ...ugins_sh404sefextplugincom_redshop.sys.ini | 7 + .../da-DK/da-DK.plg_system_agile_crm.ini | 21 + .../da-DK/da-DK.plg_system_agile_crm.sys.ini | 6 + .../da-DK/da-DK.plg_system_quickbook.ini | 1 + .../da-DK/da-DK.plg_system_quickbook.sys.ini | 1 + .../da-DK.plg_system_redgoogleanalytics.ini | 15 + ...a-DK.plg_system_redgoogleanalytics.sys.ini | 10 + ...da-DK.plg_system_redlightbox_slideshow.ini | 2 + ...K.plg_system_redlightbox_slideshow.sys.ini | 2 + .../da-DK/da-DK.plg_system_redproductzoom.ini | 39 + .../da-DK.plg_system_redproductzoom.sys.ini | 11 + .../admin/da-DK/da-DK.plg_system_redshop.ini | 3 + .../da-DK/da-DK.plg_system_redshop.sys.ini | 3 + ...a-DK.plg_system_redshop_product_bundle.ini | 11 + ....plg_system_redshop_product_bundle.sys.ini | 10 + ...K.plg_system_redshop_send_discountcode.ini | 7 + ...g_system_redshop_send_discountcode.sys.ini | 3 + .../admin/da-DK/da-DK.plg_user_highrise.ini | 20 + .../da-DK/da-DK.plg_user_highrise.sys.ini | 11 + .../da-DK/da-DK.plg_user_redshop_avatar.ini | 10 + .../da-DK.plg_user_redshop_avatar.sys.ini | 9 + .../da-DK/da-DK.plg_xmap_com_redshop.ini | 25 + .../da-DK/da-DK.plg_xmap_com_redshop.sys.ini | 3 + src/lang/da-DK/install.xml | 21 + .../da-DK/site/da-DK/da-DK.com_redshop.ini | 1043 + .../da-DK/site/da-DK/da-DK.lib_redshop.ini | 38 + .../site/da-DK/da-DK.lib_redshop.sys.ini | 7 + .../da-DK/site/da-DK/da-DK.mod_fb_albums.ini | 19 + .../site/da-DK/da-DK.mod_fb_albums.sys.ini | 8 + .../da-DK/da-DK.mod_redcategoryscroller.ini | 85 + .../da-DK.mod_redcategoryscroller.sys.ini | 7 + .../da-DK/da-DK.mod_redfeaturedproduct.ini | 41 + .../da-DK.mod_redfeaturedproduct.sys.ini | 8 + .../site/da-DK/da-DK.mod_redmanufacturer.ini | 49 + .../da-DK/da-DK.mod_redmanufacturer.sys.ini | 8 + .../site/da-DK/da-DK.mod_redmasscart.ini | 25 + .../site/da-DK/da-DK.mod_redmasscart.sys.ini | 8 + .../site/da-DK/da-DK.mod_redproducts3d.ini | 44 + .../da-DK/da-DK.mod_redproducts3d.sys.ini | 7 + .../da-DK/da-DK.mod_redproductscroller.ini | 84 + .../da-DK.mod_redproductscroller.sys.ini | 7 + .../site/da-DK/da-DK.mod_redproducttab.ini | 49 + .../da-DK/da-DK.mod_redproducttab.sys.ini | 8 + .../da-DK.mod_redshop_aesir_products.ini | 67 + .../da-DK.mod_redshop_aesir_products.sys.ini | 8 + .../site/da-DK/da-DK.mod_redshop_cart.ini | 31 + .../site/da-DK/da-DK.mod_redshop_cart.sys.ini | 8 + .../da-DK/da-DK.mod_redshop_categories.ini | 63 + .../da-DK.mod_redshop_category_scroller.ini | 47 + ...a-DK.mod_redshop_category_scroller.sys.ini | 7 + .../da-DK/da-DK.mod_redshop_currencies.ini | 14 + .../da-DK.mod_redshop_currencies.sys.ini | 3 + .../site/da-DK/da-DK.mod_redshop_discount.ini | 12 + .../da-DK/da-DK.mod_redshop_discount.sys.ini | 8 + .../site/da-DK/da-DK.mod_redshop_filter.ini | 40 + .../da-DK/da-DK.mod_redshop_filter.sys.ini | 7 + .../da-DK/da-DK.mod_redshop_logingreeting.ini | 18 + .../da-DK.mod_redshop_logingreeting.sys.ini | 8 + .../site/da-DK/da-DK.mod_redshop_megamenu.ini | 21 + .../da-DK/da-DK.mod_redshop_megamenu.sys.ini | 2 + .../da-DK/da-DK.mod_redshop_newsletter.ini | 17 + .../da-DK.mod_redshop_newsletter.sys.ini | 7 + .../da-DK/da-DK.mod_redshop_pricefilter.ini | 52 + .../da-DK.mod_redshop_pricefilter.sys.ini | 8 + .../da-DK.mod_redshop_productcompare.ini | 12 + .../da-DK.mod_redshop_productcompare.sys.ini | 7 + .../site/da-DK/da-DK.mod_redshop_products.ini | 60 + .../da-DK/da-DK.mod_redshop_products.sys.ini | 7 + .../da-DK.mod_redshop_products_slideshow.ini | 64 + ...-DK.mod_redshop_products_slideshow.sys.ini | 8 + ...a-DK.mod_redshop_promote_free_shipping.ini | 15 + ....mod_redshop_promote_free_shipping.sys.ini | 8 + .../site/da-DK/da-DK.mod_redshop_search.ini | 66 + .../da-DK/da-DK.mod_redshop_search.sys.ini | 8 + ...a-DK.mod_redshop_shoppergroup_category.ini | 22 + ....mod_redshop_shoppergroup_category.sys.ini | 8 + ...da-DK.mod_redshop_shoppergroup_product.ini | 49 + ...K.mod_redshop_shoppergroup_product.sys.ini | 8 + .../da-DK.mod_redshop_shoppergrouplogo.ini | 10 + ...da-DK.mod_redshop_shoppergrouplogo.sys.ini | 8 + .../da-DK/da-DK.mod_redshop_tags_similar.ini | 22 + .../da-DK.mod_redshop_tags_similar.sys.ini | 10 + .../da-DK/da-DK.mod_redshop_who_bought.ini | 59 + .../da-DK.mod_redshop_who_bought.sys.ini | 7 + .../site/da-DK/da-DK.mod_redshop_wishlist.ini | 39 + .../da-DK/da-DK.mod_redshop_wishlist.sys.ini | 8 + .../de-DE/admin/de-DE/de-DE.com_redshop.ini | 4828 +++ .../admin/de-DE/de-DE.com_redshop.sys.ini | 132 + .../de-DE/de-DE.plg_acymailing_redshop.ini | 11 + .../de-DE.plg_acymailing_redshop.sys.ini | 3 + .../de-DE.plg_aesir_field_redshop_product.ini | 30 + ...DE.plg_aesir_field_redshop_product.sys.ini | 7 + .../admin/de-DE/de-DE.plg_ajax_xmlcron.ini | 11 + .../de-DE/de-DE.plg_ajax_xmlcron.sys.ini | 11 + .../de-DE.plg_content_redshop_product.ini | 10 + .../de-DE.plg_content_redshop_product.sys.ini | 3 + .../de-DE/de-DE.plg_economic_economic.ini | 42 + .../de-DE/de-DE.plg_economic_economic.sys.ini | 11 + .../de-DE/de-DE.plg_editors-xtd_product.ini | 4 + .../de-DE.plg_editors-xtd_product.sys.ini | 3 + .../admin/de-DE/de-DE.plg_finder_redshop.ini | 10 + .../de-DE/de-DE.plg_finder_redshop.sys.ini | 13 + .../admin/de-DE/de-DE.plg_logman_redshop.ini | 7 + .../de-DE/de-DE.plg_logman_redshop.sys.ini | 7 + .../de-DE/de-DE.plg_quickicon_redshop.ini | 6 + .../de-DE/de-DE.plg_quickicon_redshop.sys.ini | 3 + .../de-DE/de-DE.plg_redshop_alert_alert.ini | 2 + .../de-DE.plg_redshop_alert_alert.sys.ini | 2 + ...-DE.plg_redshop_checkout_kerry_express.ini | 41 + ...plg_redshop_checkout_kerry_express.sys.ini | 3 + .../de-DE.plg_redshop_export_attribute.ini | 6 + ...de-DE.plg_redshop_export_attribute.sys.ini | 2 + .../de-DE.plg_redshop_export_category.ini | 4 + .../de-DE.plg_redshop_export_category.sys.ini | 2 + .../de-DE/de-DE.plg_redshop_export_field.ini | 4 + .../de-DE.plg_redshop_export_field.sys.ini | 2 + .../de-DE.plg_redshop_export_manufacturer.ini | 4 + ...DE.plg_redshop_export_manufacturer.sys.ini | 2 + ...g_redshop_export_newsletter_subscriber.ini | 3 + ...dshop_export_newsletter_subscriber.sys.ini | 2 + .../de-DE.plg_redshop_export_product.ini | 12 + .../de-DE.plg_redshop_export_product.sys.ini | 2 + ..._redshop_export_product_stockroom_data.ini | 4 + ...shop_export_product_stockroom_data.sys.ini | 2 + ...-DE.plg_redshop_export_related_product.ini | 4 + ...plg_redshop_export_related_product.sys.ini | 2 + ...DE.plg_redshop_export_shipping_address.ini | 4 + ...lg_redshop_export_shipping_address.sys.ini | 2 + ...p_export_shopper_group_attribute_price.ini | 4 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_export_shopper_group_product_price.ini | 4 + ...export_shopper_group_product_price.sys.ini | 2 + .../de-DE/de-DE.plg_redshop_export_user.ini | 4 + .../de-DE.plg_redshop_export_user.sys.ini | 2 + .../de-DE.plg_redshop_import_attribute.ini | 6 + ...de-DE.plg_redshop_import_attribute.sys.ini | 2 + .../de-DE.plg_redshop_import_category.ini | 6 + .../de-DE.plg_redshop_import_category.sys.ini | 2 + .../de-DE/de-DE.plg_redshop_import_field.ini | 6 + .../de-DE.plg_redshop_import_field.sys.ini | 2 + .../de-DE.plg_redshop_import_manufacturer.ini | 6 + ...DE.plg_redshop_import_manufacturer.sys.ini | 2 + ...g_redshop_import_newsletter_subscriber.ini | 8 + ...dshop_import_newsletter_subscriber.sys.ini | 2 + .../de-DE.plg_redshop_import_product.ini | 6 + .../de-DE.plg_redshop_import_product.sys.ini | 2 + ..._redshop_import_product_stockroom_data.ini | 6 + ...shop_import_product_stockroom_data.sys.ini | 2 + ...-DE.plg_redshop_import_related_product.ini | 6 + ...plg_redshop_import_related_product.sys.ini | 2 + ...DE.plg_redshop_import_shipping_address.ini | 6 + ...lg_redshop_import_shipping_address.sys.ini | 2 + ...p_import_shopper_group_attribute_price.ini | 6 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_import_shopper_group_product_price.ini | 6 + ...import_shopper_group_product_price.sys.ini | 2 + .../de-DE/de-DE.plg_redshop_import_user.ini | 6 + .../de-DE.plg_redshop_import_user.sys.ini | 2 + .../de-DE/de-DE.plg_redshop_order_esms.ini | 29 + .../de-DE.plg_redshop_order_esms.sys.ini | 2 + .../de-DE.plg_redshop_payment_baokim.ini | 49 + .../de-DE.plg_redshop_payment_baokim.sys.ini | 16 + .../de-DE/de-DE.plg_redshop_payment_cielo.ini | 64 + .../de-DE.plg_redshop_payment_cielo.sys.ini | 12 + .../de-DE.plg_redshop_payment_dibsdx.ini | 78 + .../de-DE.plg_redshop_payment_dibsdx.sys.ini | 3 + .../de-DE.plg_redshop_payment_dotpay.ini | 60 + .../de-DE.plg_redshop_payment_dotpay.sys.ini | 11 + .../de-DE.plg_redshop_payment_ingenico.ini | 66 + ...de-DE.plg_redshop_payment_ingenico.sys.ini | 12 + .../de-DE.plg_redshop_payment_klarna.ini | 56 + .../de-DE.plg_redshop_payment_klarna.sys.ini | 18 + .../de-DE.plg_redshop_payment_mollieideal.ini | 45 + ...DE.plg_redshop_payment_mollieideal.sys.ini | 12 + .../de-DE.plg_redshop_payment_nganluong.ini | 27 + ...e-DE.plg_redshop_payment_nganluong.sys.ini | 12 + .../de-DE.plg_redshop_payment_paygate.ini | 48 + .../de-DE.plg_redshop_payment_paygate.sys.ini | 12 + ...E.plg_redshop_payment_paypalcreditcard.ini | 68 + ...g_redshop_payment_paypalcreditcard.sys.ini | 15 + .../de-DE.plg_redshop_payment_payson.ini | 68 + .../de-DE.plg_redshop_payment_payson.sys.ini | 17 + .../de-DE.plg_redshop_payment_quickbook.ini | 76 + ...e-DE.plg_redshop_payment_quickbook.sys.ini | 15 + .../de-DE.plg_redshop_payment_quickpay.ini | 88 + ...de-DE.plg_redshop_payment_quickpay.sys.ini | 11 + ...g_redshop_payment_rs_payment_2checkout.ini | 42 + ...dshop_payment_rs_payment_2checkout.sys.ini | 11 + ...shop_payment_rs_payment_amazoncheckout.ini | 39 + ..._payment_rs_payment_amazoncheckout.sys.ini | 3 + ...g_redshop_payment_rs_payment_authorize.ini | 43 + ...dshop_payment_rs_payment_authorize.sys.ini | 3 + ...dshop_payment_rs_payment_authorize_dpm.ini | 35 + ...p_payment_rs_payment_authorize_dpm.sys.ini | 3 + ...edshop_payment_rs_payment_banktransfer.ini | 28 + ...op_payment_rs_payment_banktransfer.sys.ini | 11 + ...dshop_payment_rs_payment_banktransfer2.ini | 28 + ...p_payment_rs_payment_banktransfer2.sys.ini | 11 + ...yment_rs_payment_banktransfer_discount.ini | 2 + ...t_rs_payment_banktransfer_discount.sys.ini | 3 + ..._redshop_payment_rs_payment_beanstream.ini | 2 + ...shop_payment_rs_payment_beanstream.sys.ini | 3 + ...g_redshop_payment_rs_payment_braintree.ini | 50 + ...dshop_payment_rs_payment_braintree.sys.ini | 4 + ...-DE.plg_redshop_payment_rs_payment_cod.ini | 28 + ...plg_redshop_payment_rs_payment_cod.sys.ini | 11 + ...p_payment_rs_payment_dibspaymentmethod.ini | 2 + ...yment_rs_payment_dibspaymentmethod.sys.ini | 3 + ...redshop_payment_rs_payment_eantransfer.ini | 2 + ...hop_payment_rs_payment_eantransfer.sys.ini | 2 + ....plg_redshop_payment_rs_payment_epayv2.ini | 98 + ..._redshop_payment_rs_payment_epayv2.sys.ini | 11 + ...DE.plg_redshop_payment_rs_payment_eway.ini | 53 + ...lg_redshop_payment_rs_payment_eway.sys.ini | 4 + ...edshop_payment_rs_payment_eway3dsecure.ini | 26 + ...op_payment_rs_payment_eway3dsecure.sys.ini | 3 + ...plg_redshop_payment_rs_payment_giropay.ini | 53 + ...redshop_payment_rs_payment_giropay.sys.ini | 11 + ...lg_redshop_payment_rs_payment_imglobal.ini | 44 + ...edshop_payment_rs_payment_imglobal.sys.ini | 3 + ...plg_redshop_payment_rs_payment_moneris.ini | 3 + ...redshop_payment_rs_payment_moneris.sys.ini | 3 + ...redshop_payment_rs_payment_moneybooker.ini | 63 + ...hop_payment_rs_payment_moneybooker.sys.ini | 11 + ..._redshop_payment_rs_payment_payflowpro.ini | 54 + ...shop_payment_rs_payment_payflowpro.sys.ini | 11 + ...hop_payment_rs_payment_payment_express.ini | 3 + ...payment_rs_payment_payment_express.sys.ini | 3 + ...plg_redshop_payment_rs_payment_paymill.ini | 43 + ...redshop_payment_rs_payment_paymill.sys.ini | 3 + ....plg_redshop_payment_rs_payment_paypal.ini | 58 + ..._redshop_payment_rs_payment_paypal.sys.ini | 10 + ...redshop_payment_rs_payment_postfinance.ini | 3 + ...hop_payment_rs_payment_postfinance.sys.ini | 3 + ..._redshop_payment_rs_payment_rapid_eway.ini | 28 + ...shop_payment_rs_payment_rapid_eway.sys.ini | 3 + ...plg_redshop_payment_rs_payment_sagepay.ini | 60 + ...redshop_payment_rs_payment_sagepay.sys.ini | 11 + ...redshop_payment_rs_payment_sagepay_vps.ini | 53 + ...hop_payment_rs_payment_sagepay_vps.sys.ini | 3 + ...lg_redshop_payment_rs_payment_worldpay.ini | 3 + ...edshop_payment_rs_payment_worldpay.sys.ini | 2 + .../de-DE.plg_redshop_payment_stripe.ini | 54 + .../de-DE.plg_redshop_payment_stripe.sys.ini | 17 + .../de-DE/de-DE.plg_redshop_pdf_dompdf.ini | 11 + .../de-DE.plg_redshop_pdf_dompdf.sys.ini | 6 + .../de-DE/de-DE.plg_redshop_pdf_mpdf.ini | 11 + .../de-DE/de-DE.plg_redshop_pdf_mpdf.sys.ini | 6 + .../de-DE/de-DE.plg_redshop_pdf_tcpdf.ini | 13 + .../de-DE/de-DE.plg_redshop_pdf_tcpdf.sys.ini | 6 + ...E.plg_redshop_product_CreateColorImage.ini | 8 + ...g_redshop_product_CreateColorImage.sys.ini | 2 + .../de-DE.plg_redshop_product_bundle.ini | 11 + .../de-DE.plg_redshop_product_bundle.sys.ini | 10 + .../de-DE.plg_redshop_product_canonical.ini | 11 + ...e-DE.plg_redshop_product_canonical.sys.ini | 11 + ...g_redshop_product_custom_field_mapping.ini | 13 + ...dshop_product_custom_field_mapping.sys.ini | 10 + ...shop_product_discount_affect_attribute.ini | 11 + ..._product_discount_affect_attribute.sys.ini | 11 + ...e-DE.plg_redshop_product_discount_rule.ini | 15 + ....plg_redshop_product_discount_rule.sys.ini | 8 + .../de-DE/de-DE.plg_redshop_product_gift.ini | 11 + .../de-DE.plg_redshop_product_gift.sys.ini | 11 + .../de-DE/de-DE.plg_redshop_product_gls.ini | 11 + .../de-DE.plg_redshop_product_gls.sys.ini | 11 + ...E.plg_redshop_product_google_microdata.ini | 18 + ...g_redshop_product_google_microdata.sys.ini | 11 + .../de-DE.plg_redshop_product_invoicepdf.ini | 25 + ...-DE.plg_redshop_product_invoicepdf.sys.ini | 10 + .../de-DE.plg_redshop_product_postdanmark.ini | 11 + ...DE.plg_redshop_product_postdanmark.sys.ini | 11 + ...DE.plg_redshop_product_product_alttext.ini | 4 + ...lg_redshop_product_product_alttext.sys.ini | 2 + ....plg_redshop_product_shoppergroup_tags.ini | 3 + ..._redshop_product_shoppergroup_tags.sys.ini | 3 + ....plg_redshop_product_stock_notifyemail.ini | 12 + ..._redshop_product_stock_notifyemail.sys.ini | 11 + ...E.plg_redshop_product_stockroom_status.ini | 21 + ...g_redshop_product_stockroom_status.sys.ini | 11 + .../de-DE.plg_redshop_product_sync_b2b.ini | 16 + ...de-DE.plg_redshop_product_sync_b2b.sys.ini | 8 + .../de-DE.plg_redshop_product_type_bundle.ini | 12 + ...DE.plg_redshop_product_type_bundle.sys.ini | 10 + .../de-DE.plg_redshop_product_type_gift.ini | 12 + ...e-DE.plg_redshop_product_type_gift.sys.ini | 10 + ...de-DE.plg_redshop_product_wss_datafeed.ini | 12 + ...E.plg_redshop_product_wss_datafeed.sys.ini | 3 + .../de-DE.plg_redshop_shipping_bring.ini | 12 + .../de-DE.plg_redshop_shipping_bring.sys.ini | 2 + ....plg_redshop_shipping_default_shipping.ini | 15 + ..._redshop_shipping_default_shipping.sys.ini | 11 + ..._redshop_shipping_default_shipping_gls.ini | 9 + ...shop_shipping_default_shipping_gls.sys.ini | 2 + ..._shipping_default_shipping_glsbusiness.ini | 17 + ...pping_default_shipping_glsbusiness.sys.ini | 11 + .../de-DE.plg_redshop_shipping_fedex.ini | 60 + .../de-DE.plg_redshop_shipping_fedex.sys.ini | 11 + ...-DE.plg_redshop_shipping_giaohangnhanh.ini | 43 + ...plg_redshop_shipping_giaohangnhanh.sys.ini | 3 + ...de-DE.plg_redshop_shipping_postdanmark.ini | 31 + ...E.plg_redshop_shipping_postdanmark.sys.ini | 11 + ...de-DE.plg_redshop_shipping_self_pickup.ini | 5 + ...E.plg_redshop_shipping_self_pickup.sys.ini | 3 + .../de-DE.plg_redshop_shipping_shipper.ini | 5 + ...de-DE.plg_redshop_shipping_shipper.sys.ini | 2 + .../de-DE/de-DE.plg_redshop_shipping_ups.ini | 62 + .../de-DE.plg_redshop_shipping_ups.sys.ini | 2 + .../de-DE.plg_redshop_shipping_uspsv4.ini | 46 + .../de-DE.plg_redshop_shipping_uspsv4.sys.ini | 2 + .../de-DE.plg_redshop_user_cmc_integrate.ini | 11 + ...-DE.plg_redshop_user_cmc_integrate.sys.ini | 2 + ...lg_redshop_user_joomlamailer_integrate.ini | 2 + ...edshop_user_joomlamailer_integrate.sys.ini | 2 + ...g_redshop_user_registration_acymailing.ini | 4 + ...dshop_user_registration_acymailing.sys.ini | 2 + ...vies_registration_rs_vies_registration.ini | 45 + ..._registration_rs_vies_registration.sys.ini | 3 + .../de-DE.plg_search_redshop_categories.ini | 20 + ...e-DE.plg_search_redshop_categories.sys.ini | 10 + .../de-DE.plg_search_redshop_products.ini | 19 + .../de-DE.plg_search_redshop_products.sys.ini | 11 + ...xtplugins_sh404sefextplugincom_redshop.ini | 7 + ...ugins_sh404sefextplugincom_redshop.sys.ini | 7 + .../de-DE/de-DE.plg_system_agile_crm.ini | 21 + .../de-DE/de-DE.plg_system_agile_crm.sys.ini | 6 + .../de-DE/de-DE.plg_system_quickbook.ini | 1 + .../de-DE/de-DE.plg_system_quickbook.sys.ini | 1 + .../de-DE.plg_system_redgoogleanalytics.ini | 15 + ...e-DE.plg_system_redgoogleanalytics.sys.ini | 10 + ...de-DE.plg_system_redlightbox_slideshow.ini | 2 + ...E.plg_system_redlightbox_slideshow.sys.ini | 2 + .../de-DE/de-DE.plg_system_redproductzoom.ini | 39 + .../de-DE.plg_system_redproductzoom.sys.ini | 11 + .../admin/de-DE/de-DE.plg_system_redshop.ini | 3 + .../de-DE/de-DE.plg_system_redshop.sys.ini | 3 + ...e-DE.plg_system_redshop_product_bundle.ini | 11 + ....plg_system_redshop_product_bundle.sys.ini | 10 + ...E.plg_system_redshop_send_discountcode.ini | 7 + ...g_system_redshop_send_discountcode.sys.ini | 3 + .../admin/de-DE/de-DE.plg_user_highrise.ini | 20 + .../de-DE/de-DE.plg_user_highrise.sys.ini | 11 + .../de-DE/de-DE.plg_user_redshop_avatar.ini | 10 + .../de-DE.plg_user_redshop_avatar.sys.ini | 9 + .../de-DE/de-DE.plg_xmap_com_redshop.ini | 25 + .../de-DE/de-DE.plg_xmap_com_redshop.sys.ini | 3 + src/lang/de-DE/install.xml | 21 + .../de-DE/site/de-DE/de-DE.com_redshop.ini | 1043 + .../de-DE/site/de-DE/de-DE.lib_redshop.ini | 38 + .../site/de-DE/de-DE.lib_redshop.sys.ini | 7 + .../de-DE/site/de-DE/de-DE.mod_fb_albums.ini | 19 + .../site/de-DE/de-DE.mod_fb_albums.sys.ini | 8 + .../de-DE/de-DE.mod_redcategoryscroller.ini | 85 + .../de-DE.mod_redcategoryscroller.sys.ini | 7 + .../de-DE/de-DE.mod_redfeaturedproduct.ini | 41 + .../de-DE.mod_redfeaturedproduct.sys.ini | 8 + .../site/de-DE/de-DE.mod_redmanufacturer.ini | 49 + .../de-DE/de-DE.mod_redmanufacturer.sys.ini | 8 + .../site/de-DE/de-DE.mod_redmasscart.ini | 25 + .../site/de-DE/de-DE.mod_redmasscart.sys.ini | 8 + .../site/de-DE/de-DE.mod_redproducts3d.ini | 44 + .../de-DE/de-DE.mod_redproducts3d.sys.ini | 7 + .../de-DE/de-DE.mod_redproductscroller.ini | 84 + .../de-DE.mod_redproductscroller.sys.ini | 7 + .../site/de-DE/de-DE.mod_redproducttab.ini | 49 + .../de-DE/de-DE.mod_redproducttab.sys.ini | 8 + .../de-DE.mod_redshop_aesir_products.ini | 67 + .../de-DE.mod_redshop_aesir_products.sys.ini | 8 + .../site/de-DE/de-DE.mod_redshop_cart.ini | 31 + .../site/de-DE/de-DE.mod_redshop_cart.sys.ini | 8 + .../de-DE/de-DE.mod_redshop_categories.ini | 63 + .../de-DE.mod_redshop_category_scroller.ini | 47 + ...e-DE.mod_redshop_category_scroller.sys.ini | 7 + .../de-DE/de-DE.mod_redshop_currencies.ini | 14 + .../de-DE.mod_redshop_currencies.sys.ini | 3 + .../site/de-DE/de-DE.mod_redshop_discount.ini | 12 + .../de-DE/de-DE.mod_redshop_discount.sys.ini | 8 + .../site/de-DE/de-DE.mod_redshop_filter.ini | 40 + .../de-DE/de-DE.mod_redshop_filter.sys.ini | 7 + .../de-DE/de-DE.mod_redshop_logingreeting.ini | 18 + .../de-DE.mod_redshop_logingreeting.sys.ini | 8 + .../site/de-DE/de-DE.mod_redshop_megamenu.ini | 21 + .../de-DE/de-DE.mod_redshop_megamenu.sys.ini | 2 + .../de-DE/de-DE.mod_redshop_newsletter.ini | 17 + .../de-DE.mod_redshop_newsletter.sys.ini | 7 + .../de-DE/de-DE.mod_redshop_pricefilter.ini | 52 + .../de-DE.mod_redshop_pricefilter.sys.ini | 8 + .../de-DE.mod_redshop_productcompare.ini | 12 + .../de-DE.mod_redshop_productcompare.sys.ini | 7 + .../site/de-DE/de-DE.mod_redshop_products.ini | 60 + .../de-DE/de-DE.mod_redshop_products.sys.ini | 7 + .../de-DE.mod_redshop_products_slideshow.ini | 64 + ...-DE.mod_redshop_products_slideshow.sys.ini | 8 + ...e-DE.mod_redshop_promote_free_shipping.ini | 15 + ....mod_redshop_promote_free_shipping.sys.ini | 8 + .../site/de-DE/de-DE.mod_redshop_search.ini | 66 + .../de-DE/de-DE.mod_redshop_search.sys.ini | 8 + ...e-DE.mod_redshop_shoppergroup_category.ini | 22 + ....mod_redshop_shoppergroup_category.sys.ini | 8 + ...de-DE.mod_redshop_shoppergroup_product.ini | 49 + ...E.mod_redshop_shoppergroup_product.sys.ini | 8 + .../de-DE.mod_redshop_shoppergrouplogo.ini | 10 + ...de-DE.mod_redshop_shoppergrouplogo.sys.ini | 8 + .../de-DE/de-DE.mod_redshop_tags_similar.ini | 22 + .../de-DE.mod_redshop_tags_similar.sys.ini | 10 + .../de-DE/de-DE.mod_redshop_who_bought.ini | 54 + .../de-DE.mod_redshop_who_bought.sys.ini | 7 + .../site/de-DE/de-DE.mod_redshop_wishlist.ini | 39 + .../de-DE/de-DE.mod_redshop_wishlist.sys.ini | 8 + .../en-GB/admin/en-GB/en-GB.com_redshop.ini | 4589 +++ .../admin/en-GB/en-GB.com_redshop.sys.ini | 132 + .../en-GB/en-GB.plg_acymailing_redshop.ini | 10 + .../en-GB.plg_acymailing_redshop.sys.ini | 2 + .../en-GB.plg_aesir_field_redshop_product.ini | 30 + ...GB.plg_aesir_field_redshop_product.sys.ini | 7 + .../admin/en-GB/en-GB.plg_ajax_xmlcron.ini | 10 + .../en-GB/en-GB.plg_ajax_xmlcron.sys.ini | 10 + .../en-GB.plg_content_redshop_product.ini | 9 + .../en-GB.plg_content_redshop_product.sys.ini | 2 + .../en-GB/en-GB.plg_economic_economic.ini | 41 + .../en-GB/en-GB.plg_economic_economic.sys.ini | 10 + .../en-GB/en-GB.plg_editors-xtd_product.ini | 3 + .../en-GB.plg_editors-xtd_product.sys.ini | 2 + .../admin/en-GB/en-GB.plg_finder_redshop.ini | 10 + .../en-GB/en-GB.plg_finder_redshop.sys.ini | 12 + .../admin/en-GB/en-GB.plg_logman_redshop.ini | 6 + .../en-GB/en-GB.plg_logman_redshop.sys.ini | 6 + .../en-GB/en-GB.plg_quickicon_redshop.ini | 5 + .../en-GB/en-GB.plg_quickicon_redshop.sys.ini | 2 + .../en-GB/en-GB.plg_redshop_alert_alert.ini | 2 + .../en-GB.plg_redshop_alert_alert.sys.ini | 2 + ...-GB.plg_redshop_checkout_kerry_express.ini | 40 + ...plg_redshop_checkout_kerry_express.sys.ini | 2 + .../en-GB.plg_redshop_export_attribute.ini | 6 + ...en-GB.plg_redshop_export_attribute.sys.ini | 2 + .../en-GB.plg_redshop_export_category.ini | 4 + .../en-GB.plg_redshop_export_category.sys.ini | 2 + .../en-GB/en-GB.plg_redshop_export_field.ini | 4 + .../en-GB.plg_redshop_export_field.sys.ini | 2 + .../en-GB.plg_redshop_export_manufacturer.ini | 4 + ...GB.plg_redshop_export_manufacturer.sys.ini | 2 + .../en-GB.plg_redshop_export_product.ini | 12 + .../en-GB.plg_redshop_export_product.sys.ini | 2 + ..._redshop_export_product_stockroom_data.ini | 4 + ...shop_export_product_stockroom_data.sys.ini | 2 + ...-GB.plg_redshop_export_related_product.ini | 4 + ...plg_redshop_export_related_product.sys.ini | 2 + ...GB.plg_redshop_export_shipping_address.ini | 4 + ...lg_redshop_export_shipping_address.sys.ini | 2 + ...p_export_shopper_group_attribute_price.ini | 4 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_export_shopper_group_product_price.ini | 4 + ...export_shopper_group_product_price.sys.ini | 2 + .../en-GB/en-GB.plg_redshop_export_user.ini | 4 + .../en-GB.plg_redshop_export_user.sys.ini | 2 + .../en-GB.plg_redshop_import_attribute.ini | 6 + ...en-GB.plg_redshop_import_attribute.sys.ini | 2 + .../en-GB.plg_redshop_import_category.ini | 6 + .../en-GB.plg_redshop_import_category.sys.ini | 2 + .../en-GB/en-GB.plg_redshop_import_field.ini | 6 + .../en-GB.plg_redshop_import_field.sys.ini | 2 + .../en-GB.plg_redshop_import_manufacturer.ini | 6 + ...GB.plg_redshop_import_manufacturer.sys.ini | 2 + .../en-GB.plg_redshop_import_product.ini | 6 + .../en-GB.plg_redshop_import_product.sys.ini | 2 + ..._redshop_import_product_stockroom_data.ini | 6 + ...shop_import_product_stockroom_data.sys.ini | 2 + ...-GB.plg_redshop_import_related_product.ini | 6 + ...plg_redshop_import_related_product.sys.ini | 2 + ...GB.plg_redshop_import_shipping_address.ini | 6 + ...lg_redshop_import_shipping_address.sys.ini | 2 + ...p_import_shopper_group_attribute_price.ini | 6 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_import_shopper_group_product_price.ini | 6 + ...import_shopper_group_product_price.sys.ini | 2 + .../en-GB/en-GB.plg_redshop_import_user.ini | 6 + .../en-GB.plg_redshop_import_user.sys.ini | 2 + .../en-GB/en-GB.plg_redshop_order_esms.ini | 29 + .../en-GB.plg_redshop_order_esms.sys.ini | 2 + .../en-GB.plg_redshop_payment_baokim.ini | 48 + .../en-GB.plg_redshop_payment_baokim.sys.ini | 15 + .../en-GB/en-GB.plg_redshop_pdf_dompdf.ini | 11 + .../en-GB.plg_redshop_pdf_dompdf.sys.ini | 6 + .../en-GB/en-GB.plg_redshop_pdf_mpdf.ini | 11 + .../en-GB/en-GB.plg_redshop_pdf_mpdf.sys.ini | 6 + .../en-GB/en-GB.plg_redshop_pdf_tcpdf.ini | 11 + .../en-GB/en-GB.plg_redshop_pdf_tcpdf.sys.ini | 6 + .../en-GB/en-GB.plg_redshop_product_gls.ini | 10 + .../en-GB.plg_redshop_product_gls.sys.ini | 10 + .../en-GB/site/en-GB/en-GB.com_redshop.ini | 1032 + .../en-GB/site/en-GB/en-GB.lib_redshop.ini | 37 + .../site/en-GB/en-GB.lib_redshop.sys.ini | 7 + .../en-GB/site/en-GB/en-GB.mod_fb_albums.ini | 19 + .../site/en-GB/en-GB.mod_fb_albums.sys.ini | 7 + .../en-GB/en-GB.mod_redcategoryscroller.ini | 84 + .../en-GB.mod_redcategoryscroller.sys.ini | 6 + .../en-GB/en-GB.mod_redfeaturedproduct.ini | 40 + .../en-GB.mod_redfeaturedproduct.sys.ini | 7 + .../site/en-GB/en-GB.mod_redmanufacturer.ini | 49 + .../en-GB/en-GB.mod_redmanufacturer.sys.ini | 7 + .../site/en-GB/en-GB.mod_redmasscart.ini | 24 + .../site/en-GB/en-GB.mod_redmasscart.sys.ini | 7 + .../site/en-GB/en-GB.mod_redproducts3d.ini | 43 + .../en-GB/en-GB.mod_redproducts3d.sys.ini | 6 + .../en-GB/en-GB.mod_redproductscroller.ini | 83 + .../en-GB.mod_redproductscroller.sys.ini | 7 + .../site/en-GB/en-GB.mod_redproducttab.ini | 48 + .../en-GB/en-GB.mod_redproducttab.sys.ini | 7 + .../en-GB.mod_redshop_aesir_products.ini | 66 + .../en-GB.mod_redshop_aesir_products.sys.ini | 7 + .../site/en-GB/en-GB.mod_redshop_cart.ini | 31 + .../site/en-GB/en-GB.mod_redshop_cart.sys.ini | 7 + .../en-GB/en-GB.mod_redshop_categories.ini | 67 + .../en-GB.mod_redshop_category_scroller.ini | 46 + ...n-GB.mod_redshop_category_scroller.sys.ini | 6 + .../en-GB/en-GB.mod_redshop_currencies.ini | 13 + .../en-GB.mod_redshop_currencies.sys.ini | 2 + .../site/en-GB/en-GB.mod_redshop_discount.ini | 11 + .../en-GB/en-GB.mod_redshop_discount.sys.ini | 7 + .../site/en-GB/en-GB.mod_redshop_filter.ini | 35 + .../en-GB/en-GB.mod_redshop_filter.sys.ini | 7 + .../en-GB/en-GB.mod_redshop_logingreeting.ini | 17 + .../en-GB.mod_redshop_logingreeting.sys.ini | 7 + .../site/en-GB/en-GB.mod_redshop_megamenu.ini | 20 + .../en-GB/en-GB.mod_redshop_megamenu.sys.ini | 2 + .../en-GB/en-GB.mod_redshop_newsletter.ini | 16 + .../en-GB.mod_redshop_newsletter.sys.ini | 6 + .../en-GB/en-GB.mod_redshop_pricefilter.ini | 51 + .../en-GB.mod_redshop_pricefilter.sys.ini | 7 + .../en-GB.mod_redshop_productcompare.ini | 11 + .../en-GB.mod_redshop_productcompare.sys.ini | 6 + .../site/en-GB/en-GB.mod_redshop_products.ini | 59 + .../en-GB/en-GB.mod_redshop_products.sys.ini | 6 + .../en-GB.mod_redshop_products_slideshow.ini | 63 + ...-GB.mod_redshop_products_slideshow.sys.ini | 7 + ...n-GB.mod_redshop_promote_free_shipping.ini | 14 + ....mod_redshop_promote_free_shipping.sys.ini | 7 + .../site/en-GB/en-GB.mod_redshop_search.ini | 62 + .../en-GB/en-GB.mod_redshop_search.sys.ini | 7 + ...n-GB.mod_redshop_shoppergroup_category.ini | 21 + ....mod_redshop_shoppergroup_category.sys.ini | 7 + ...en-GB.mod_redshop_shoppergroup_product.ini | 48 + ...B.mod_redshop_shoppergroup_product.sys.ini | 7 + .../en-GB.mod_redshop_shoppergrouplogo.ini | 9 + ...en-GB.mod_redshop_shoppergrouplogo.sys.ini | 7 + .../en-GB/en-GB.mod_redshop_who_bought.ini | 53 + .../en-GB.mod_redshop_who_bought.sys.ini | 6 + .../site/en-GB/en-GB.mod_redshop_wishlist.ini | 38 + .../en-GB/en-GB.mod_redshop_wishlist.sys.ini | 7 + .../fr-FR/admin/fr-FR/fr-FR.com_redshop.ini | 4828 +++ .../admin/fr-FR/fr-FR.com_redshop.sys.ini | 132 + .../fr-FR/fr-FR.plg_acymailing_redshop.ini | 11 + .../fr-FR.plg_acymailing_redshop.sys.ini | 3 + .../fr-FR.plg_aesir_field_redshop_product.ini | 30 + ...FR.plg_aesir_field_redshop_product.sys.ini | 7 + .../admin/fr-FR/fr-FR.plg_ajax_xmlcron.ini | 11 + .../fr-FR/fr-FR.plg_ajax_xmlcron.sys.ini | 11 + .../fr-FR.plg_content_redshop_product.ini | 10 + .../fr-FR.plg_content_redshop_product.sys.ini | 3 + .../fr-FR/fr-FR.plg_economic_economic.ini | 42 + .../fr-FR/fr-FR.plg_economic_economic.sys.ini | 11 + .../fr-FR/fr-FR.plg_editors-xtd_product.ini | 4 + .../fr-FR.plg_editors-xtd_product.sys.ini | 3 + .../admin/fr-FR/fr-FR.plg_finder_redshop.ini | 10 + .../fr-FR/fr-FR.plg_finder_redshop.sys.ini | 13 + .../admin/fr-FR/fr-FR.plg_logman_redshop.ini | 7 + .../fr-FR/fr-FR.plg_logman_redshop.sys.ini | 7 + .../fr-FR/fr-FR.plg_quickicon_redshop.ini | 6 + .../fr-FR/fr-FR.plg_quickicon_redshop.sys.ini | 3 + .../fr-FR/fr-FR.plg_redshop_alert_alert.ini | 2 + .../fr-FR.plg_redshop_alert_alert.sys.ini | 2 + ...-FR.plg_redshop_checkout_kerry_express.ini | 41 + ...plg_redshop_checkout_kerry_express.sys.ini | 3 + .../fr-FR.plg_redshop_export_attribute.ini | 6 + ...fr-FR.plg_redshop_export_attribute.sys.ini | 2 + .../fr-FR.plg_redshop_export_category.ini | 4 + .../fr-FR.plg_redshop_export_category.sys.ini | 2 + .../fr-FR/fr-FR.plg_redshop_export_field.ini | 4 + .../fr-FR.plg_redshop_export_field.sys.ini | 2 + .../fr-FR.plg_redshop_export_manufacturer.ini | 4 + ...FR.plg_redshop_export_manufacturer.sys.ini | 2 + ...g_redshop_export_newsletter_subscriber.ini | 3 + ...dshop_export_newsletter_subscriber.sys.ini | 2 + .../fr-FR.plg_redshop_export_product.ini | 12 + .../fr-FR.plg_redshop_export_product.sys.ini | 2 + ..._redshop_export_product_stockroom_data.ini | 4 + ...shop_export_product_stockroom_data.sys.ini | 2 + ...-FR.plg_redshop_export_related_product.ini | 4 + ...plg_redshop_export_related_product.sys.ini | 2 + ...FR.plg_redshop_export_shipping_address.ini | 4 + ...lg_redshop_export_shipping_address.sys.ini | 2 + ...p_export_shopper_group_attribute_price.ini | 4 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_export_shopper_group_product_price.ini | 4 + ...export_shopper_group_product_price.sys.ini | 2 + .../fr-FR/fr-FR.plg_redshop_export_user.ini | 4 + .../fr-FR.plg_redshop_export_user.sys.ini | 2 + .../fr-FR.plg_redshop_import_attribute.ini | 6 + ...fr-FR.plg_redshop_import_attribute.sys.ini | 2 + .../fr-FR.plg_redshop_import_category.ini | 6 + .../fr-FR.plg_redshop_import_category.sys.ini | 2 + .../fr-FR/fr-FR.plg_redshop_import_field.ini | 6 + .../fr-FR.plg_redshop_import_field.sys.ini | 2 + .../fr-FR.plg_redshop_import_manufacturer.ini | 6 + ...FR.plg_redshop_import_manufacturer.sys.ini | 2 + ...g_redshop_import_newsletter_subscriber.ini | 8 + ...dshop_import_newsletter_subscriber.sys.ini | 2 + .../fr-FR.plg_redshop_import_product.ini | 6 + .../fr-FR.plg_redshop_import_product.sys.ini | 2 + ..._redshop_import_product_stockroom_data.ini | 6 + ...shop_import_product_stockroom_data.sys.ini | 2 + ...-FR.plg_redshop_import_related_product.ini | 6 + ...plg_redshop_import_related_product.sys.ini | 2 + ...FR.plg_redshop_import_shipping_address.ini | 6 + ...lg_redshop_import_shipping_address.sys.ini | 2 + ...p_import_shopper_group_attribute_price.ini | 6 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_import_shopper_group_product_price.ini | 6 + ...import_shopper_group_product_price.sys.ini | 2 + .../fr-FR/fr-FR.plg_redshop_import_user.ini | 6 + .../fr-FR.plg_redshop_import_user.sys.ini | 2 + .../fr-FR/fr-FR.plg_redshop_order_esms.ini | 29 + .../fr-FR.plg_redshop_order_esms.sys.ini | 2 + .../fr-FR.plg_redshop_payment_baokim.ini | 49 + .../fr-FR.plg_redshop_payment_baokim.sys.ini | 16 + .../fr-FR/fr-FR.plg_redshop_payment_cielo.ini | 64 + .../fr-FR.plg_redshop_payment_cielo.sys.ini | 12 + .../fr-FR.plg_redshop_payment_dibsdx.ini | 78 + .../fr-FR.plg_redshop_payment_dibsdx.sys.ini | 3 + .../fr-FR.plg_redshop_payment_dotpay.ini | 60 + .../fr-FR.plg_redshop_payment_dotpay.sys.ini | 11 + .../fr-FR.plg_redshop_payment_ingenico.ini | 66 + ...fr-FR.plg_redshop_payment_ingenico.sys.ini | 12 + .../fr-FR.plg_redshop_payment_klarna.ini | 56 + .../fr-FR.plg_redshop_payment_klarna.sys.ini | 18 + .../fr-FR.plg_redshop_payment_mollieideal.ini | 45 + ...FR.plg_redshop_payment_mollieideal.sys.ini | 12 + .../fr-FR.plg_redshop_payment_nganluong.ini | 27 + ...r-FR.plg_redshop_payment_nganluong.sys.ini | 12 + .../fr-FR.plg_redshop_payment_paygate.ini | 48 + .../fr-FR.plg_redshop_payment_paygate.sys.ini | 12 + ...R.plg_redshop_payment_paypalcreditcard.ini | 68 + ...g_redshop_payment_paypalcreditcard.sys.ini | 15 + .../fr-FR.plg_redshop_payment_payson.ini | 68 + .../fr-FR.plg_redshop_payment_payson.sys.ini | 17 + .../fr-FR.plg_redshop_payment_quickbook.ini | 76 + ...r-FR.plg_redshop_payment_quickbook.sys.ini | 15 + .../fr-FR.plg_redshop_payment_quickpay.ini | 88 + ...fr-FR.plg_redshop_payment_quickpay.sys.ini | 11 + ...g_redshop_payment_rs_payment_2checkout.ini | 42 + ...dshop_payment_rs_payment_2checkout.sys.ini | 11 + ...shop_payment_rs_payment_amazoncheckout.ini | 39 + ..._payment_rs_payment_amazoncheckout.sys.ini | 3 + ...g_redshop_payment_rs_payment_authorize.ini | 43 + ...dshop_payment_rs_payment_authorize.sys.ini | 3 + ...dshop_payment_rs_payment_authorize_dpm.ini | 35 + ...p_payment_rs_payment_authorize_dpm.sys.ini | 3 + ...edshop_payment_rs_payment_banktransfer.ini | 28 + ...op_payment_rs_payment_banktransfer.sys.ini | 11 + ...dshop_payment_rs_payment_banktransfer2.ini | 28 + ...p_payment_rs_payment_banktransfer2.sys.ini | 11 + ...yment_rs_payment_banktransfer_discount.ini | 2 + ...t_rs_payment_banktransfer_discount.sys.ini | 3 + ..._redshop_payment_rs_payment_beanstream.ini | 2 + ...shop_payment_rs_payment_beanstream.sys.ini | 3 + ...g_redshop_payment_rs_payment_braintree.ini | 50 + ...dshop_payment_rs_payment_braintree.sys.ini | 4 + ...-FR.plg_redshop_payment_rs_payment_cod.ini | 28 + ...plg_redshop_payment_rs_payment_cod.sys.ini | 11 + ...p_payment_rs_payment_dibspaymentmethod.ini | 2 + ...yment_rs_payment_dibspaymentmethod.sys.ini | 3 + ...redshop_payment_rs_payment_eantransfer.ini | 2 + ...hop_payment_rs_payment_eantransfer.sys.ini | 2 + ....plg_redshop_payment_rs_payment_epayv2.ini | 98 + ..._redshop_payment_rs_payment_epayv2.sys.ini | 11 + ...FR.plg_redshop_payment_rs_payment_eway.ini | 53 + ...lg_redshop_payment_rs_payment_eway.sys.ini | 4 + ...edshop_payment_rs_payment_eway3dsecure.ini | 26 + ...op_payment_rs_payment_eway3dsecure.sys.ini | 3 + ...plg_redshop_payment_rs_payment_giropay.ini | 53 + ...redshop_payment_rs_payment_giropay.sys.ini | 11 + ...lg_redshop_payment_rs_payment_imglobal.ini | 44 + ...edshop_payment_rs_payment_imglobal.sys.ini | 3 + ...plg_redshop_payment_rs_payment_moneris.ini | 3 + ...redshop_payment_rs_payment_moneris.sys.ini | 3 + ...redshop_payment_rs_payment_moneybooker.ini | 63 + ...hop_payment_rs_payment_moneybooker.sys.ini | 11 + ..._redshop_payment_rs_payment_payflowpro.ini | 54 + ...shop_payment_rs_payment_payflowpro.sys.ini | 11 + ...hop_payment_rs_payment_payment_express.ini | 3 + ...payment_rs_payment_payment_express.sys.ini | 3 + ...plg_redshop_payment_rs_payment_paymill.ini | 43 + ...redshop_payment_rs_payment_paymill.sys.ini | 3 + ....plg_redshop_payment_rs_payment_paypal.ini | 58 + ..._redshop_payment_rs_payment_paypal.sys.ini | 10 + ...redshop_payment_rs_payment_postfinance.ini | 3 + ...hop_payment_rs_payment_postfinance.sys.ini | 3 + ..._redshop_payment_rs_payment_rapid_eway.ini | 28 + ...shop_payment_rs_payment_rapid_eway.sys.ini | 3 + ...plg_redshop_payment_rs_payment_sagepay.ini | 60 + ...redshop_payment_rs_payment_sagepay.sys.ini | 11 + ...redshop_payment_rs_payment_sagepay_vps.ini | 53 + ...hop_payment_rs_payment_sagepay_vps.sys.ini | 3 + ...lg_redshop_payment_rs_payment_worldpay.ini | 3 + ...edshop_payment_rs_payment_worldpay.sys.ini | 2 + .../fr-FR.plg_redshop_payment_stripe.ini | 54 + .../fr-FR.plg_redshop_payment_stripe.sys.ini | 17 + .../fr-FR/fr-FR.plg_redshop_pdf_dompdf.ini | 11 + .../fr-FR.plg_redshop_pdf_dompdf.sys.ini | 6 + .../fr-FR/fr-FR.plg_redshop_pdf_mpdf.ini | 11 + .../fr-FR/fr-FR.plg_redshop_pdf_mpdf.sys.ini | 6 + .../fr-FR/fr-FR.plg_redshop_pdf_tcpdf.ini | 13 + .../fr-FR/fr-FR.plg_redshop_pdf_tcpdf.sys.ini | 6 + ...R.plg_redshop_product_CreateColorImage.ini | 8 + ...g_redshop_product_CreateColorImage.sys.ini | 2 + .../fr-FR.plg_redshop_product_bundle.ini | 11 + .../fr-FR.plg_redshop_product_bundle.sys.ini | 10 + .../fr-FR.plg_redshop_product_canonical.ini | 11 + ...r-FR.plg_redshop_product_canonical.sys.ini | 11 + ...g_redshop_product_custom_field_mapping.ini | 13 + ...dshop_product_custom_field_mapping.sys.ini | 10 + ...shop_product_discount_affect_attribute.ini | 11 + ..._product_discount_affect_attribute.sys.ini | 11 + ...r-FR.plg_redshop_product_discount_rule.ini | 15 + ....plg_redshop_product_discount_rule.sys.ini | 8 + .../fr-FR/fr-FR.plg_redshop_product_gift.ini | 11 + .../fr-FR.plg_redshop_product_gift.sys.ini | 11 + .../fr-FR/fr-FR.plg_redshop_product_gls.ini | 11 + .../fr-FR.plg_redshop_product_gls.sys.ini | 11 + ...R.plg_redshop_product_google_microdata.ini | 18 + ...g_redshop_product_google_microdata.sys.ini | 11 + .../fr-FR.plg_redshop_product_invoicepdf.ini | 25 + ...-FR.plg_redshop_product_invoicepdf.sys.ini | 10 + .../fr-FR.plg_redshop_product_postdanmark.ini | 11 + ...FR.plg_redshop_product_postdanmark.sys.ini | 11 + ...FR.plg_redshop_product_product_alttext.ini | 4 + ...lg_redshop_product_product_alttext.sys.ini | 2 + ....plg_redshop_product_shoppergroup_tags.ini | 3 + ..._redshop_product_shoppergroup_tags.sys.ini | 3 + ....plg_redshop_product_stock_notifyemail.ini | 12 + ..._redshop_product_stock_notifyemail.sys.ini | 11 + ...R.plg_redshop_product_stockroom_status.ini | 21 + ...g_redshop_product_stockroom_status.sys.ini | 11 + .../fr-FR.plg_redshop_product_sync_b2b.ini | 16 + ...fr-FR.plg_redshop_product_sync_b2b.sys.ini | 8 + .../fr-FR.plg_redshop_product_type_bundle.ini | 12 + ...FR.plg_redshop_product_type_bundle.sys.ini | 10 + .../fr-FR.plg_redshop_product_type_gift.ini | 12 + ...r-FR.plg_redshop_product_type_gift.sys.ini | 10 + ...fr-FR.plg_redshop_product_wss_datafeed.ini | 12 + ...R.plg_redshop_product_wss_datafeed.sys.ini | 3 + .../fr-FR.plg_redshop_shipping_bring.ini | 12 + .../fr-FR.plg_redshop_shipping_bring.sys.ini | 2 + ....plg_redshop_shipping_default_shipping.ini | 15 + ..._redshop_shipping_default_shipping.sys.ini | 11 + ..._redshop_shipping_default_shipping_gls.ini | 9 + ...shop_shipping_default_shipping_gls.sys.ini | 2 + ..._shipping_default_shipping_glsbusiness.ini | 17 + ...pping_default_shipping_glsbusiness.sys.ini | 11 + .../fr-FR.plg_redshop_shipping_fedex.ini | 60 + .../fr-FR.plg_redshop_shipping_fedex.sys.ini | 11 + ...-FR.plg_redshop_shipping_giaohangnhanh.ini | 43 + ...plg_redshop_shipping_giaohangnhanh.sys.ini | 3 + ...fr-FR.plg_redshop_shipping_postdanmark.ini | 31 + ...R.plg_redshop_shipping_postdanmark.sys.ini | 11 + ...fr-FR.plg_redshop_shipping_self_pickup.ini | 5 + ...R.plg_redshop_shipping_self_pickup.sys.ini | 3 + .../fr-FR.plg_redshop_shipping_shipper.ini | 5 + ...fr-FR.plg_redshop_shipping_shipper.sys.ini | 2 + .../fr-FR/fr-FR.plg_redshop_shipping_ups.ini | 62 + .../fr-FR.plg_redshop_shipping_ups.sys.ini | 2 + .../fr-FR.plg_redshop_shipping_uspsv4.ini | 46 + .../fr-FR.plg_redshop_shipping_uspsv4.sys.ini | 2 + .../fr-FR.plg_redshop_user_cmc_integrate.ini | 11 + ...-FR.plg_redshop_user_cmc_integrate.sys.ini | 2 + ...lg_redshop_user_joomlamailer_integrate.ini | 2 + ...edshop_user_joomlamailer_integrate.sys.ini | 2 + ...g_redshop_user_registration_acymailing.ini | 4 + ...dshop_user_registration_acymailing.sys.ini | 2 + ...vies_registration_rs_vies_registration.ini | 45 + ..._registration_rs_vies_registration.sys.ini | 3 + .../fr-FR.plg_search_redshop_categories.ini | 20 + ...r-FR.plg_search_redshop_categories.sys.ini | 10 + .../fr-FR.plg_search_redshop_products.ini | 19 + .../fr-FR.plg_search_redshop_products.sys.ini | 11 + ...xtplugins_sh404sefextplugincom_redshop.ini | 7 + ...ugins_sh404sefextplugincom_redshop.sys.ini | 7 + .../fr-FR/fr-FR.plg_system_agile_crm.ini | 21 + .../fr-FR/fr-FR.plg_system_agile_crm.sys.ini | 6 + .../fr-FR/fr-FR.plg_system_quickbook.ini | 1 + .../fr-FR/fr-FR.plg_system_quickbook.sys.ini | 1 + .../fr-FR.plg_system_redgoogleanalytics.ini | 15 + ...r-FR.plg_system_redgoogleanalytics.sys.ini | 10 + ...fr-FR.plg_system_redlightbox_slideshow.ini | 2 + ...R.plg_system_redlightbox_slideshow.sys.ini | 2 + .../fr-FR/fr-FR.plg_system_redproductzoom.ini | 39 + .../fr-FR.plg_system_redproductzoom.sys.ini | 11 + .../admin/fr-FR/fr-FR.plg_system_redshop.ini | 3 + .../fr-FR/fr-FR.plg_system_redshop.sys.ini | 3 + ...r-FR.plg_system_redshop_product_bundle.ini | 11 + ....plg_system_redshop_product_bundle.sys.ini | 10 + ...R.plg_system_redshop_send_discountcode.ini | 7 + ...g_system_redshop_send_discountcode.sys.ini | 3 + .../admin/fr-FR/fr-FR.plg_user_highrise.ini | 20 + .../fr-FR/fr-FR.plg_user_highrise.sys.ini | 11 + .../fr-FR/fr-FR.plg_user_redshop_avatar.ini | 10 + .../fr-FR.plg_user_redshop_avatar.sys.ini | 9 + .../fr-FR/fr-FR.plg_xmap_com_redshop.ini | 25 + .../fr-FR/fr-FR.plg_xmap_com_redshop.sys.ini | 3 + src/lang/fr-FR/install.xml | 21 + .../fr-FR/site/fr-FR/fr-FR.com_redshop.ini | 1043 + .../fr-FR/site/fr-FR/fr-FR.lib_redshop.ini | 38 + .../site/fr-FR/fr-FR.lib_redshop.sys.ini | 7 + .../fr-FR/site/fr-FR/fr-FR.mod_fb_albums.ini | 19 + .../site/fr-FR/fr-FR.mod_fb_albums.sys.ini | 8 + .../fr-FR/fr-FR.mod_redcategoryscroller.ini | 85 + .../fr-FR.mod_redcategoryscroller.sys.ini | 7 + .../fr-FR/fr-FR.mod_redfeaturedproduct.ini | 41 + .../fr-FR.mod_redfeaturedproduct.sys.ini | 8 + .../site/fr-FR/fr-FR.mod_redmanufacturer.ini | 49 + .../fr-FR/fr-FR.mod_redmanufacturer.sys.ini | 8 + .../site/fr-FR/fr-FR.mod_redmasscart.ini | 25 + .../site/fr-FR/fr-FR.mod_redmasscart.sys.ini | 8 + .../site/fr-FR/fr-FR.mod_redproducts3d.ini | 44 + .../fr-FR/fr-FR.mod_redproducts3d.sys.ini | 7 + .../fr-FR/fr-FR.mod_redproductscroller.ini | 84 + .../fr-FR.mod_redproductscroller.sys.ini | 7 + .../site/fr-FR/fr-FR.mod_redproducttab.ini | 49 + .../fr-FR/fr-FR.mod_redproducttab.sys.ini | 8 + .../fr-FR.mod_redshop_aesir_products.ini | 67 + .../fr-FR.mod_redshop_aesir_products.sys.ini | 8 + .../site/fr-FR/fr-FR.mod_redshop_cart.ini | 31 + .../site/fr-FR/fr-FR.mod_redshop_cart.sys.ini | 8 + .../fr-FR/fr-FR.mod_redshop_categories.ini | 63 + .../fr-FR.mod_redshop_category_scroller.ini | 47 + ...r-FR.mod_redshop_category_scroller.sys.ini | 7 + .../fr-FR/fr-FR.mod_redshop_currencies.ini | 14 + .../fr-FR.mod_redshop_currencies.sys.ini | 3 + .../site/fr-FR/fr-FR.mod_redshop_discount.ini | 12 + .../fr-FR/fr-FR.mod_redshop_discount.sys.ini | 8 + .../site/fr-FR/fr-FR.mod_redshop_filter.ini | 40 + .../fr-FR/fr-FR.mod_redshop_filter.sys.ini | 7 + .../fr-FR/fr-FR.mod_redshop_logingreeting.ini | 18 + .../fr-FR.mod_redshop_logingreeting.sys.ini | 8 + .../site/fr-FR/fr-FR.mod_redshop_megamenu.ini | 21 + .../fr-FR/fr-FR.mod_redshop_megamenu.sys.ini | 2 + .../fr-FR/fr-FR.mod_redshop_newsletter.ini | 17 + .../fr-FR.mod_redshop_newsletter.sys.ini | 7 + .../fr-FR/fr-FR.mod_redshop_pricefilter.ini | 52 + .../fr-FR.mod_redshop_pricefilter.sys.ini | 8 + .../fr-FR.mod_redshop_productcompare.ini | 12 + .../fr-FR.mod_redshop_productcompare.sys.ini | 7 + .../site/fr-FR/fr-FR.mod_redshop_products.ini | 60 + .../fr-FR/fr-FR.mod_redshop_products.sys.ini | 7 + .../fr-FR.mod_redshop_products_slideshow.ini | 64 + ...-FR.mod_redshop_products_slideshow.sys.ini | 8 + ...r-FR.mod_redshop_promote_free_shipping.ini | 15 + ....mod_redshop_promote_free_shipping.sys.ini | 8 + .../site/fr-FR/fr-FR.mod_redshop_search.ini | 66 + .../fr-FR/fr-FR.mod_redshop_search.sys.ini | 8 + ...r-FR.mod_redshop_shoppergroup_category.ini | 22 + ....mod_redshop_shoppergroup_category.sys.ini | 8 + ...fr-FR.mod_redshop_shoppergroup_product.ini | 49 + ...R.mod_redshop_shoppergroup_product.sys.ini | 8 + .../fr-FR.mod_redshop_shoppergrouplogo.ini | 10 + ...fr-FR.mod_redshop_shoppergrouplogo.sys.ini | 8 + .../fr-FR/fr-FR.mod_redshop_tags_similar.ini | 22 + .../fr-FR.mod_redshop_tags_similar.sys.ini | 10 + .../fr-FR/fr-FR.mod_redshop_who_bought.ini | 54 + .../fr-FR.mod_redshop_who_bought.sys.ini | 7 + .../site/fr-FR/fr-FR.mod_redshop_wishlist.ini | 39 + .../fr-FR/fr-FR.mod_redshop_wishlist.sys.ini | 8 + .../it-IT/admin/it-IT/it-IT.com_redshop.ini | 4828 +++ .../admin/it-IT/it-IT.com_redshop.sys.ini | 132 + .../it-IT/it-IT.plg_acymailing_redshop.ini | 11 + .../it-IT.plg_acymailing_redshop.sys.ini | 3 + .../it-IT.plg_aesir_field_redshop_product.ini | 30 + ...IT.plg_aesir_field_redshop_product.sys.ini | 7 + .../admin/it-IT/it-IT.plg_ajax_xmlcron.ini | 11 + .../it-IT/it-IT.plg_ajax_xmlcron.sys.ini | 11 + .../it-IT.plg_content_redshop_product.ini | 10 + .../it-IT.plg_content_redshop_product.sys.ini | 3 + .../it-IT/it-IT.plg_economic_economic.ini | 42 + .../it-IT/it-IT.plg_economic_economic.sys.ini | 11 + .../it-IT/it-IT.plg_editors-xtd_product.ini | 4 + .../it-IT.plg_editors-xtd_product.sys.ini | 3 + .../admin/it-IT/it-IT.plg_finder_redshop.ini | 10 + .../it-IT/it-IT.plg_finder_redshop.sys.ini | 13 + .../admin/it-IT/it-IT.plg_logman_redshop.ini | 7 + .../it-IT/it-IT.plg_logman_redshop.sys.ini | 7 + .../it-IT/it-IT.plg_quickicon_redshop.ini | 6 + .../it-IT/it-IT.plg_quickicon_redshop.sys.ini | 3 + .../it-IT/it-IT.plg_redshop_alert_alert.ini | 2 + .../it-IT.plg_redshop_alert_alert.sys.ini | 2 + ...-IT.plg_redshop_checkout_kerry_express.ini | 41 + ...plg_redshop_checkout_kerry_express.sys.ini | 3 + .../it-IT.plg_redshop_export_attribute.ini | 6 + ...it-IT.plg_redshop_export_attribute.sys.ini | 2 + .../it-IT.plg_redshop_export_category.ini | 4 + .../it-IT.plg_redshop_export_category.sys.ini | 2 + .../it-IT/it-IT.plg_redshop_export_field.ini | 4 + .../it-IT.plg_redshop_export_field.sys.ini | 2 + .../it-IT.plg_redshop_export_manufacturer.ini | 4 + ...IT.plg_redshop_export_manufacturer.sys.ini | 2 + ...g_redshop_export_newsletter_subscriber.ini | 3 + ...dshop_export_newsletter_subscriber.sys.ini | 2 + .../it-IT.plg_redshop_export_product.ini | 12 + .../it-IT.plg_redshop_export_product.sys.ini | 2 + ..._redshop_export_product_stockroom_data.ini | 4 + ...shop_export_product_stockroom_data.sys.ini | 2 + ...-IT.plg_redshop_export_related_product.ini | 4 + ...plg_redshop_export_related_product.sys.ini | 2 + ...IT.plg_redshop_export_shipping_address.ini | 4 + ...lg_redshop_export_shipping_address.sys.ini | 2 + ...p_export_shopper_group_attribute_price.ini | 4 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_export_shopper_group_product_price.ini | 4 + ...export_shopper_group_product_price.sys.ini | 2 + .../it-IT/it-IT.plg_redshop_export_user.ini | 4 + .../it-IT.plg_redshop_export_user.sys.ini | 2 + .../it-IT.plg_redshop_import_attribute.ini | 6 + ...it-IT.plg_redshop_import_attribute.sys.ini | 2 + .../it-IT.plg_redshop_import_category.ini | 6 + .../it-IT.plg_redshop_import_category.sys.ini | 2 + .../it-IT/it-IT.plg_redshop_import_field.ini | 6 + .../it-IT.plg_redshop_import_field.sys.ini | 2 + .../it-IT.plg_redshop_import_manufacturer.ini | 6 + ...IT.plg_redshop_import_manufacturer.sys.ini | 2 + ...g_redshop_import_newsletter_subscriber.ini | 8 + ...dshop_import_newsletter_subscriber.sys.ini | 2 + .../it-IT.plg_redshop_import_product.ini | 6 + .../it-IT.plg_redshop_import_product.sys.ini | 2 + ..._redshop_import_product_stockroom_data.ini | 6 + ...shop_import_product_stockroom_data.sys.ini | 2 + ...-IT.plg_redshop_import_related_product.ini | 6 + ...plg_redshop_import_related_product.sys.ini | 2 + ...IT.plg_redshop_import_shipping_address.ini | 6 + ...lg_redshop_import_shipping_address.sys.ini | 2 + ...p_import_shopper_group_attribute_price.ini | 6 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_import_shopper_group_product_price.ini | 6 + ...import_shopper_group_product_price.sys.ini | 2 + .../it-IT/it-IT.plg_redshop_import_user.ini | 6 + .../it-IT.plg_redshop_import_user.sys.ini | 2 + .../it-IT/it-IT.plg_redshop_order_esms.ini | 29 + .../it-IT.plg_redshop_order_esms.sys.ini | 2 + .../it-IT.plg_redshop_payment_baokim.ini | 49 + .../it-IT.plg_redshop_payment_baokim.sys.ini | 16 + .../it-IT/it-IT.plg_redshop_payment_cielo.ini | 64 + .../it-IT.plg_redshop_payment_cielo.sys.ini | 12 + .../it-IT.plg_redshop_payment_dibsdx.ini | 78 + .../it-IT.plg_redshop_payment_dibsdx.sys.ini | 3 + .../it-IT.plg_redshop_payment_dotpay.ini | 60 + .../it-IT.plg_redshop_payment_dotpay.sys.ini | 11 + .../it-IT.plg_redshop_payment_ingenico.ini | 66 + ...it-IT.plg_redshop_payment_ingenico.sys.ini | 12 + .../it-IT.plg_redshop_payment_klarna.ini | 56 + .../it-IT.plg_redshop_payment_klarna.sys.ini | 18 + .../it-IT.plg_redshop_payment_mollieideal.ini | 45 + ...IT.plg_redshop_payment_mollieideal.sys.ini | 12 + .../it-IT.plg_redshop_payment_nganluong.ini | 27 + ...t-IT.plg_redshop_payment_nganluong.sys.ini | 12 + .../it-IT.plg_redshop_payment_paygate.ini | 48 + .../it-IT.plg_redshop_payment_paygate.sys.ini | 12 + ...T.plg_redshop_payment_paypalcreditcard.ini | 68 + ...g_redshop_payment_paypalcreditcard.sys.ini | 15 + .../it-IT.plg_redshop_payment_payson.ini | 68 + .../it-IT.plg_redshop_payment_payson.sys.ini | 17 + .../it-IT.plg_redshop_payment_quickbook.ini | 76 + ...t-IT.plg_redshop_payment_quickbook.sys.ini | 15 + .../it-IT.plg_redshop_payment_quickpay.ini | 88 + ...it-IT.plg_redshop_payment_quickpay.sys.ini | 11 + ...g_redshop_payment_rs_payment_2checkout.ini | 42 + ...dshop_payment_rs_payment_2checkout.sys.ini | 11 + ...shop_payment_rs_payment_amazoncheckout.ini | 39 + ..._payment_rs_payment_amazoncheckout.sys.ini | 3 + ...g_redshop_payment_rs_payment_authorize.ini | 43 + ...dshop_payment_rs_payment_authorize.sys.ini | 3 + ...dshop_payment_rs_payment_authorize_dpm.ini | 35 + ...p_payment_rs_payment_authorize_dpm.sys.ini | 3 + ...edshop_payment_rs_payment_banktransfer.ini | 28 + ...op_payment_rs_payment_banktransfer.sys.ini | 11 + ...dshop_payment_rs_payment_banktransfer2.ini | 28 + ...p_payment_rs_payment_banktransfer2.sys.ini | 11 + ...yment_rs_payment_banktransfer_discount.ini | 2 + ...t_rs_payment_banktransfer_discount.sys.ini | 3 + ..._redshop_payment_rs_payment_beanstream.ini | 2 + ...shop_payment_rs_payment_beanstream.sys.ini | 3 + ...g_redshop_payment_rs_payment_braintree.ini | 50 + ...dshop_payment_rs_payment_braintree.sys.ini | 4 + ...-IT.plg_redshop_payment_rs_payment_cod.ini | 28 + ...plg_redshop_payment_rs_payment_cod.sys.ini | 11 + ...p_payment_rs_payment_dibspaymentmethod.ini | 2 + ...yment_rs_payment_dibspaymentmethod.sys.ini | 3 + ...redshop_payment_rs_payment_eantransfer.ini | 2 + ...hop_payment_rs_payment_eantransfer.sys.ini | 2 + ....plg_redshop_payment_rs_payment_epayv2.ini | 98 + ..._redshop_payment_rs_payment_epayv2.sys.ini | 11 + ...IT.plg_redshop_payment_rs_payment_eway.ini | 53 + ...lg_redshop_payment_rs_payment_eway.sys.ini | 4 + ...edshop_payment_rs_payment_eway3dsecure.ini | 26 + ...op_payment_rs_payment_eway3dsecure.sys.ini | 3 + ...plg_redshop_payment_rs_payment_giropay.ini | 53 + ...redshop_payment_rs_payment_giropay.sys.ini | 11 + ...lg_redshop_payment_rs_payment_imglobal.ini | 44 + ...edshop_payment_rs_payment_imglobal.sys.ini | 3 + ...plg_redshop_payment_rs_payment_moneris.ini | 3 + ...redshop_payment_rs_payment_moneris.sys.ini | 3 + ...redshop_payment_rs_payment_moneybooker.ini | 63 + ...hop_payment_rs_payment_moneybooker.sys.ini | 11 + ..._redshop_payment_rs_payment_payflowpro.ini | 54 + ...shop_payment_rs_payment_payflowpro.sys.ini | 11 + ...hop_payment_rs_payment_payment_express.ini | 3 + ...payment_rs_payment_payment_express.sys.ini | 3 + ...plg_redshop_payment_rs_payment_paymill.ini | 43 + ...redshop_payment_rs_payment_paymill.sys.ini | 3 + ....plg_redshop_payment_rs_payment_paypal.ini | 58 + ..._redshop_payment_rs_payment_paypal.sys.ini | 10 + ...redshop_payment_rs_payment_postfinance.ini | 3 + ...hop_payment_rs_payment_postfinance.sys.ini | 3 + ..._redshop_payment_rs_payment_rapid_eway.ini | 28 + ...shop_payment_rs_payment_rapid_eway.sys.ini | 3 + ...plg_redshop_payment_rs_payment_sagepay.ini | 60 + ...redshop_payment_rs_payment_sagepay.sys.ini | 11 + ...redshop_payment_rs_payment_sagepay_vps.ini | 53 + ...hop_payment_rs_payment_sagepay_vps.sys.ini | 3 + ...lg_redshop_payment_rs_payment_worldpay.ini | 3 + ...edshop_payment_rs_payment_worldpay.sys.ini | 2 + .../it-IT.plg_redshop_payment_stripe.ini | 54 + .../it-IT.plg_redshop_payment_stripe.sys.ini | 17 + .../it-IT/it-IT.plg_redshop_pdf_dompdf.ini | 11 + .../it-IT.plg_redshop_pdf_dompdf.sys.ini | 6 + .../it-IT/it-IT.plg_redshop_pdf_mpdf.ini | 11 + .../it-IT/it-IT.plg_redshop_pdf_mpdf.sys.ini | 6 + .../it-IT/it-IT.plg_redshop_pdf_tcpdf.ini | 13 + .../it-IT/it-IT.plg_redshop_pdf_tcpdf.sys.ini | 6 + ...T.plg_redshop_product_CreateColorImage.ini | 8 + ...g_redshop_product_CreateColorImage.sys.ini | 2 + .../it-IT.plg_redshop_product_bundle.ini | 11 + .../it-IT.plg_redshop_product_bundle.sys.ini | 10 + .../it-IT.plg_redshop_product_canonical.ini | 11 + ...t-IT.plg_redshop_product_canonical.sys.ini | 11 + ...g_redshop_product_custom_field_mapping.ini | 13 + ...dshop_product_custom_field_mapping.sys.ini | 10 + ...shop_product_discount_affect_attribute.ini | 11 + ..._product_discount_affect_attribute.sys.ini | 11 + ...t-IT.plg_redshop_product_discount_rule.ini | 15 + ....plg_redshop_product_discount_rule.sys.ini | 8 + .../it-IT/it-IT.plg_redshop_product_gift.ini | 11 + .../it-IT.plg_redshop_product_gift.sys.ini | 11 + .../it-IT/it-IT.plg_redshop_product_gls.ini | 11 + .../it-IT.plg_redshop_product_gls.sys.ini | 11 + ...T.plg_redshop_product_google_microdata.ini | 18 + ...g_redshop_product_google_microdata.sys.ini | 11 + .../it-IT.plg_redshop_product_invoicepdf.ini | 25 + ...-IT.plg_redshop_product_invoicepdf.sys.ini | 10 + .../it-IT.plg_redshop_product_postdanmark.ini | 11 + ...IT.plg_redshop_product_postdanmark.sys.ini | 11 + ...IT.plg_redshop_product_product_alttext.ini | 4 + ...lg_redshop_product_product_alttext.sys.ini | 2 + ....plg_redshop_product_shoppergroup_tags.ini | 3 + ..._redshop_product_shoppergroup_tags.sys.ini | 3 + ....plg_redshop_product_stock_notifyemail.ini | 12 + ..._redshop_product_stock_notifyemail.sys.ini | 11 + ...T.plg_redshop_product_stockroom_status.ini | 21 + ...g_redshop_product_stockroom_status.sys.ini | 11 + .../it-IT.plg_redshop_product_sync_b2b.ini | 16 + ...it-IT.plg_redshop_product_sync_b2b.sys.ini | 8 + .../it-IT.plg_redshop_product_type_bundle.ini | 12 + ...IT.plg_redshop_product_type_bundle.sys.ini | 10 + .../it-IT.plg_redshop_product_type_gift.ini | 12 + ...t-IT.plg_redshop_product_type_gift.sys.ini | 10 + ...it-IT.plg_redshop_product_wss_datafeed.ini | 12 + ...T.plg_redshop_product_wss_datafeed.sys.ini | 3 + .../it-IT.plg_redshop_shipping_bring.ini | 12 + .../it-IT.plg_redshop_shipping_bring.sys.ini | 2 + ....plg_redshop_shipping_default_shipping.ini | 15 + ..._redshop_shipping_default_shipping.sys.ini | 11 + ..._redshop_shipping_default_shipping_gls.ini | 9 + ...shop_shipping_default_shipping_gls.sys.ini | 2 + ..._shipping_default_shipping_glsbusiness.ini | 17 + ...pping_default_shipping_glsbusiness.sys.ini | 11 + .../it-IT.plg_redshop_shipping_fedex.ini | 60 + .../it-IT.plg_redshop_shipping_fedex.sys.ini | 11 + ...-IT.plg_redshop_shipping_giaohangnhanh.ini | 43 + ...plg_redshop_shipping_giaohangnhanh.sys.ini | 3 + ...it-IT.plg_redshop_shipping_postdanmark.ini | 31 + ...T.plg_redshop_shipping_postdanmark.sys.ini | 11 + ...it-IT.plg_redshop_shipping_self_pickup.ini | 5 + ...T.plg_redshop_shipping_self_pickup.sys.ini | 3 + .../it-IT.plg_redshop_shipping_shipper.ini | 5 + ...it-IT.plg_redshop_shipping_shipper.sys.ini | 2 + .../it-IT/it-IT.plg_redshop_shipping_ups.ini | 62 + .../it-IT.plg_redshop_shipping_ups.sys.ini | 2 + .../it-IT.plg_redshop_shipping_uspsv4.ini | 46 + .../it-IT.plg_redshop_shipping_uspsv4.sys.ini | 2 + .../it-IT.plg_redshop_user_cmc_integrate.ini | 11 + ...-IT.plg_redshop_user_cmc_integrate.sys.ini | 2 + ...lg_redshop_user_joomlamailer_integrate.ini | 2 + ...edshop_user_joomlamailer_integrate.sys.ini | 2 + ...g_redshop_user_registration_acymailing.ini | 4 + ...dshop_user_registration_acymailing.sys.ini | 2 + ...vies_registration_rs_vies_registration.ini | 45 + ..._registration_rs_vies_registration.sys.ini | 3 + .../it-IT.plg_search_redshop_categories.ini | 20 + ...t-IT.plg_search_redshop_categories.sys.ini | 10 + .../it-IT.plg_search_redshop_products.ini | 19 + .../it-IT.plg_search_redshop_products.sys.ini | 11 + ...xtplugins_sh404sefextplugincom_redshop.ini | 7 + ...ugins_sh404sefextplugincom_redshop.sys.ini | 7 + .../it-IT/it-IT.plg_system_agile_crm.ini | 21 + .../it-IT/it-IT.plg_system_agile_crm.sys.ini | 6 + .../it-IT/it-IT.plg_system_quickbook.ini | 1 + .../it-IT/it-IT.plg_system_quickbook.sys.ini | 1 + .../it-IT.plg_system_redgoogleanalytics.ini | 15 + ...t-IT.plg_system_redgoogleanalytics.sys.ini | 10 + ...it-IT.plg_system_redlightbox_slideshow.ini | 2 + ...T.plg_system_redlightbox_slideshow.sys.ini | 2 + .../it-IT/it-IT.plg_system_redproductzoom.ini | 39 + .../it-IT.plg_system_redproductzoom.sys.ini | 11 + .../admin/it-IT/it-IT.plg_system_redshop.ini | 3 + .../it-IT/it-IT.plg_system_redshop.sys.ini | 3 + ...t-IT.plg_system_redshop_product_bundle.ini | 11 + ....plg_system_redshop_product_bundle.sys.ini | 10 + ...T.plg_system_redshop_send_discountcode.ini | 7 + ...g_system_redshop_send_discountcode.sys.ini | 3 + .../admin/it-IT/it-IT.plg_user_highrise.ini | 20 + .../it-IT/it-IT.plg_user_highrise.sys.ini | 11 + .../it-IT/it-IT.plg_user_redshop_avatar.ini | 10 + .../it-IT.plg_user_redshop_avatar.sys.ini | 9 + .../it-IT/it-IT.plg_xmap_com_redshop.ini | 25 + .../it-IT/it-IT.plg_xmap_com_redshop.sys.ini | 3 + src/lang/it-IT/install.xml | 21 + .../it-IT/site/it-IT/it-IT.com_redshop.ini | 1043 + .../it-IT/site/it-IT/it-IT.lib_redshop.ini | 38 + .../site/it-IT/it-IT.lib_redshop.sys.ini | 7 + .../it-IT/site/it-IT/it-IT.mod_fb_albums.ini | 19 + .../site/it-IT/it-IT.mod_fb_albums.sys.ini | 8 + .../it-IT/it-IT.mod_redcategoryscroller.ini | 85 + .../it-IT.mod_redcategoryscroller.sys.ini | 7 + .../it-IT/it-IT.mod_redfeaturedproduct.ini | 41 + .../it-IT.mod_redfeaturedproduct.sys.ini | 8 + .../site/it-IT/it-IT.mod_redmanufacturer.ini | 49 + .../it-IT/it-IT.mod_redmanufacturer.sys.ini | 8 + .../site/it-IT/it-IT.mod_redmasscart.ini | 25 + .../site/it-IT/it-IT.mod_redmasscart.sys.ini | 8 + .../site/it-IT/it-IT.mod_redproducts3d.ini | 44 + .../it-IT/it-IT.mod_redproducts3d.sys.ini | 7 + .../it-IT/it-IT.mod_redproductscroller.ini | 84 + .../it-IT.mod_redproductscroller.sys.ini | 7 + .../site/it-IT/it-IT.mod_redproducttab.ini | 49 + .../it-IT/it-IT.mod_redproducttab.sys.ini | 8 + .../it-IT.mod_redshop_aesir_products.ini | 67 + .../it-IT.mod_redshop_aesir_products.sys.ini | 8 + .../site/it-IT/it-IT.mod_redshop_cart.ini | 31 + .../site/it-IT/it-IT.mod_redshop_cart.sys.ini | 8 + .../it-IT/it-IT.mod_redshop_categories.ini | 63 + .../it-IT.mod_redshop_category_scroller.ini | 47 + ...t-IT.mod_redshop_category_scroller.sys.ini | 7 + .../it-IT/it-IT.mod_redshop_currencies.ini | 14 + .../it-IT.mod_redshop_currencies.sys.ini | 3 + .../site/it-IT/it-IT.mod_redshop_discount.ini | 12 + .../it-IT/it-IT.mod_redshop_discount.sys.ini | 8 + .../site/it-IT/it-IT.mod_redshop_filter.ini | 40 + .../it-IT/it-IT.mod_redshop_filter.sys.ini | 7 + .../it-IT/it-IT.mod_redshop_logingreeting.ini | 18 + .../it-IT.mod_redshop_logingreeting.sys.ini | 8 + .../site/it-IT/it-IT.mod_redshop_megamenu.ini | 21 + .../it-IT/it-IT.mod_redshop_megamenu.sys.ini | 2 + .../it-IT/it-IT.mod_redshop_newsletter.ini | 17 + .../it-IT.mod_redshop_newsletter.sys.ini | 7 + .../it-IT/it-IT.mod_redshop_pricefilter.ini | 52 + .../it-IT.mod_redshop_pricefilter.sys.ini | 8 + .../it-IT.mod_redshop_productcompare.ini | 12 + .../it-IT.mod_redshop_productcompare.sys.ini | 7 + .../site/it-IT/it-IT.mod_redshop_products.ini | 63 + .../it-IT/it-IT.mod_redshop_products.sys.ini | 7 + .../it-IT.mod_redshop_products_slideshow.ini | 64 + ...-IT.mod_redshop_products_slideshow.sys.ini | 8 + ...t-IT.mod_redshop_promote_free_shipping.ini | 15 + ....mod_redshop_promote_free_shipping.sys.ini | 8 + .../site/it-IT/it-IT.mod_redshop_search.ini | 66 + .../it-IT/it-IT.mod_redshop_search.sys.ini | 8 + ...t-IT.mod_redshop_shoppergroup_category.ini | 22 + ....mod_redshop_shoppergroup_category.sys.ini | 8 + ...it-IT.mod_redshop_shoppergroup_product.ini | 49 + ...T.mod_redshop_shoppergroup_product.sys.ini | 8 + .../it-IT.mod_redshop_shoppergrouplogo.ini | 10 + ...it-IT.mod_redshop_shoppergrouplogo.sys.ini | 8 + .../it-IT/it-IT.mod_redshop_tags_similar.ini | 22 + .../it-IT.mod_redshop_tags_similar.sys.ini | 10 + .../it-IT/it-IT.mod_redshop_who_bought.ini | 54 + .../it-IT.mod_redshop_who_bought.sys.ini | 7 + .../site/it-IT/it-IT.mod_redshop_wishlist.ini | 39 + .../it-IT/it-IT.mod_redshop_wishlist.sys.ini | 8 + .../vi-VN/admin/vi-VN/vi-VN.com_redshop.ini | 4828 +++ .../admin/vi-VN/vi-VN.com_redshop.sys.ini | 132 + .../vi-VN/vi-VN.plg_acymailing_redshop.ini | 11 + .../vi-VN.plg_acymailing_redshop.sys.ini | 3 + .../vi-VN.plg_aesir_field_redshop_product.ini | 30 + ...VN.plg_aesir_field_redshop_product.sys.ini | 7 + .../admin/vi-VN/vi-VN.plg_ajax_xmlcron.ini | 11 + .../vi-VN/vi-VN.plg_ajax_xmlcron.sys.ini | 11 + .../vi-VN.plg_content_redshop_product.ini | 10 + .../vi-VN.plg_content_redshop_product.sys.ini | 3 + .../vi-VN/vi-VN.plg_economic_economic.ini | 42 + .../vi-VN/vi-VN.plg_economic_economic.sys.ini | 11 + .../vi-VN/vi-VN.plg_editors-xtd_product.ini | 4 + .../vi-VN.plg_editors-xtd_product.sys.ini | 3 + .../admin/vi-VN/vi-VN.plg_finder_redshop.ini | 10 + .../vi-VN/vi-VN.plg_finder_redshop.sys.ini | 13 + .../admin/vi-VN/vi-VN.plg_logman_redshop.ini | 7 + .../vi-VN/vi-VN.plg_logman_redshop.sys.ini | 7 + .../vi-VN/vi-VN.plg_quickicon_redshop.ini | 6 + .../vi-VN/vi-VN.plg_quickicon_redshop.sys.ini | 3 + .../vi-VN/vi-VN.plg_redshop_alert_alert.ini | 2 + .../vi-VN.plg_redshop_alert_alert.sys.ini | 2 + ...-VN.plg_redshop_checkout_kerry_express.ini | 41 + ...plg_redshop_checkout_kerry_express.sys.ini | 3 + .../vi-VN.plg_redshop_export_attribute.ini | 6 + ...vi-VN.plg_redshop_export_attribute.sys.ini | 2 + .../vi-VN.plg_redshop_export_category.ini | 4 + .../vi-VN.plg_redshop_export_category.sys.ini | 2 + .../vi-VN/vi-VN.plg_redshop_export_field.ini | 4 + .../vi-VN.plg_redshop_export_field.sys.ini | 2 + .../vi-VN.plg_redshop_export_manufacturer.ini | 4 + ...VN.plg_redshop_export_manufacturer.sys.ini | 2 + ...g_redshop_export_newsletter_subscriber.ini | 3 + ...dshop_export_newsletter_subscriber.sys.ini | 2 + .../vi-VN.plg_redshop_export_product.ini | 12 + .../vi-VN.plg_redshop_export_product.sys.ini | 2 + ..._redshop_export_product_stockroom_data.ini | 4 + ...shop_export_product_stockroom_data.sys.ini | 2 + ...-VN.plg_redshop_export_related_product.ini | 4 + ...plg_redshop_export_related_product.sys.ini | 2 + ...VN.plg_redshop_export_shipping_address.ini | 4 + ...lg_redshop_export_shipping_address.sys.ini | 2 + ...p_export_shopper_group_attribute_price.ini | 4 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_export_shopper_group_product_price.ini | 4 + ...export_shopper_group_product_price.sys.ini | 2 + .../vi-VN/vi-VN.plg_redshop_export_user.ini | 4 + .../vi-VN.plg_redshop_export_user.sys.ini | 2 + .../vi-VN.plg_redshop_import_attribute.ini | 6 + ...vi-VN.plg_redshop_import_attribute.sys.ini | 2 + .../vi-VN.plg_redshop_import_category.ini | 6 + .../vi-VN.plg_redshop_import_category.sys.ini | 2 + .../vi-VN/vi-VN.plg_redshop_import_field.ini | 6 + .../vi-VN.plg_redshop_import_field.sys.ini | 2 + .../vi-VN.plg_redshop_import_manufacturer.ini | 6 + ...VN.plg_redshop_import_manufacturer.sys.ini | 2 + ...g_redshop_import_newsletter_subscriber.ini | 8 + ...dshop_import_newsletter_subscriber.sys.ini | 2 + .../vi-VN.plg_redshop_import_product.ini | 6 + .../vi-VN.plg_redshop_import_product.sys.ini | 2 + ..._redshop_import_product_stockroom_data.ini | 6 + ...shop_import_product_stockroom_data.sys.ini | 2 + ...-VN.plg_redshop_import_related_product.ini | 6 + ...plg_redshop_import_related_product.sys.ini | 2 + ...VN.plg_redshop_import_shipping_address.ini | 6 + ...lg_redshop_import_shipping_address.sys.ini | 2 + ...p_import_shopper_group_attribute_price.ini | 6 + ...port_shopper_group_attribute_price.sys.ini | 2 + ...hop_import_shopper_group_product_price.ini | 6 + ...import_shopper_group_product_price.sys.ini | 2 + .../vi-VN/vi-VN.plg_redshop_import_user.ini | 6 + .../vi-VN.plg_redshop_import_user.sys.ini | 2 + .../vi-VN/vi-VN.plg_redshop_order_esms.ini | 29 + .../vi-VN.plg_redshop_order_esms.sys.ini | 2 + .../vi-VN.plg_redshop_payment_baokim.ini | 49 + .../vi-VN.plg_redshop_payment_baokim.sys.ini | 16 + .../vi-VN/vi-VN.plg_redshop_payment_cielo.ini | 64 + .../vi-VN.plg_redshop_payment_cielo.sys.ini | 12 + .../vi-VN.plg_redshop_payment_dibsdx.ini | 78 + .../vi-VN.plg_redshop_payment_dibsdx.sys.ini | 3 + .../vi-VN.plg_redshop_payment_dotpay.ini | 60 + .../vi-VN.plg_redshop_payment_dotpay.sys.ini | 11 + .../vi-VN.plg_redshop_payment_ingenico.ini | 66 + ...vi-VN.plg_redshop_payment_ingenico.sys.ini | 12 + .../vi-VN.plg_redshop_payment_klarna.ini | 56 + .../vi-VN.plg_redshop_payment_klarna.sys.ini | 18 + .../vi-VN.plg_redshop_payment_mollieideal.ini | 45 + ...VN.plg_redshop_payment_mollieideal.sys.ini | 12 + .../vi-VN.plg_redshop_payment_nganluong.ini | 27 + ...i-VN.plg_redshop_payment_nganluong.sys.ini | 12 + .../vi-VN.plg_redshop_payment_paygate.ini | 48 + .../vi-VN.plg_redshop_payment_paygate.sys.ini | 12 + ...N.plg_redshop_payment_paypalcreditcard.ini | 68 + ...g_redshop_payment_paypalcreditcard.sys.ini | 15 + .../vi-VN.plg_redshop_payment_payson.ini | 68 + .../vi-VN.plg_redshop_payment_payson.sys.ini | 17 + .../vi-VN.plg_redshop_payment_quickbook.ini | 76 + ...i-VN.plg_redshop_payment_quickbook.sys.ini | 15 + .../vi-VN.plg_redshop_payment_quickpay.ini | 88 + ...vi-VN.plg_redshop_payment_quickpay.sys.ini | 11 + ...g_redshop_payment_rs_payment_2checkout.ini | 42 + ...dshop_payment_rs_payment_2checkout.sys.ini | 11 + ...shop_payment_rs_payment_amazoncheckout.ini | 39 + ..._payment_rs_payment_amazoncheckout.sys.ini | 3 + ...g_redshop_payment_rs_payment_authorize.ini | 43 + ...dshop_payment_rs_payment_authorize.sys.ini | 3 + ...dshop_payment_rs_payment_authorize_dpm.ini | 35 + ...p_payment_rs_payment_authorize_dpm.sys.ini | 3 + ...edshop_payment_rs_payment_banktransfer.ini | 28 + ...op_payment_rs_payment_banktransfer.sys.ini | 11 + ...dshop_payment_rs_payment_banktransfer2.ini | 28 + ...p_payment_rs_payment_banktransfer2.sys.ini | 11 + ...yment_rs_payment_banktransfer_discount.ini | 2 + ...t_rs_payment_banktransfer_discount.sys.ini | 3 + ..._redshop_payment_rs_payment_beanstream.ini | 2 + ...shop_payment_rs_payment_beanstream.sys.ini | 3 + ...g_redshop_payment_rs_payment_braintree.ini | 50 + ...dshop_payment_rs_payment_braintree.sys.ini | 4 + ...-VN.plg_redshop_payment_rs_payment_cod.ini | 28 + ...plg_redshop_payment_rs_payment_cod.sys.ini | 11 + ...p_payment_rs_payment_dibspaymentmethod.ini | 2 + ...yment_rs_payment_dibspaymentmethod.sys.ini | 3 + ...redshop_payment_rs_payment_eantransfer.ini | 2 + ...hop_payment_rs_payment_eantransfer.sys.ini | 2 + ....plg_redshop_payment_rs_payment_epayv2.ini | 98 + ..._redshop_payment_rs_payment_epayv2.sys.ini | 11 + ...VN.plg_redshop_payment_rs_payment_eway.ini | 53 + ...lg_redshop_payment_rs_payment_eway.sys.ini | 4 + ...edshop_payment_rs_payment_eway3dsecure.ini | 26 + ...op_payment_rs_payment_eway3dsecure.sys.ini | 3 + ...plg_redshop_payment_rs_payment_giropay.ini | 53 + ...redshop_payment_rs_payment_giropay.sys.ini | 11 + ...lg_redshop_payment_rs_payment_imglobal.ini | 44 + ...edshop_payment_rs_payment_imglobal.sys.ini | 3 + ...plg_redshop_payment_rs_payment_moneris.ini | 3 + ...redshop_payment_rs_payment_moneris.sys.ini | 3 + ...redshop_payment_rs_payment_moneybooker.ini | 63 + ...hop_payment_rs_payment_moneybooker.sys.ini | 11 + ..._redshop_payment_rs_payment_payflowpro.ini | 54 + ...shop_payment_rs_payment_payflowpro.sys.ini | 11 + ...hop_payment_rs_payment_payment_express.ini | 3 + ...payment_rs_payment_payment_express.sys.ini | 3 + ...plg_redshop_payment_rs_payment_paymill.ini | 43 + ...redshop_payment_rs_payment_paymill.sys.ini | 3 + ....plg_redshop_payment_rs_payment_paypal.ini | 58 + ..._redshop_payment_rs_payment_paypal.sys.ini | 10 + ...redshop_payment_rs_payment_postfinance.ini | 3 + ...hop_payment_rs_payment_postfinance.sys.ini | 3 + ..._redshop_payment_rs_payment_rapid_eway.ini | 28 + ...shop_payment_rs_payment_rapid_eway.sys.ini | 3 + ...plg_redshop_payment_rs_payment_sagepay.ini | 60 + ...redshop_payment_rs_payment_sagepay.sys.ini | 11 + ...redshop_payment_rs_payment_sagepay_vps.ini | 53 + ...hop_payment_rs_payment_sagepay_vps.sys.ini | 3 + ...lg_redshop_payment_rs_payment_worldpay.ini | 3 + ...edshop_payment_rs_payment_worldpay.sys.ini | 2 + .../vi-VN.plg_redshop_payment_stripe.ini | 54 + .../vi-VN.plg_redshop_payment_stripe.sys.ini | 17 + .../vi-VN/vi-VN.plg_redshop_pdf_dompdf.ini | 11 + .../vi-VN.plg_redshop_pdf_dompdf.sys.ini | 6 + .../vi-VN/vi-VN.plg_redshop_pdf_mpdf.ini | 11 + .../vi-VN/vi-VN.plg_redshop_pdf_mpdf.sys.ini | 6 + .../vi-VN/vi-VN.plg_redshop_pdf_tcpdf.ini | 13 + .../vi-VN/vi-VN.plg_redshop_pdf_tcpdf.sys.ini | 6 + ...N.plg_redshop_product_CreateColorImage.ini | 8 + ...g_redshop_product_CreateColorImage.sys.ini | 2 + .../vi-VN.plg_redshop_product_bundle.ini | 11 + .../vi-VN.plg_redshop_product_bundle.sys.ini | 10 + .../vi-VN.plg_redshop_product_canonical.ini | 11 + ...i-VN.plg_redshop_product_canonical.sys.ini | 11 + ...g_redshop_product_custom_field_mapping.ini | 13 + ...dshop_product_custom_field_mapping.sys.ini | 10 + ...shop_product_discount_affect_attribute.ini | 11 + ..._product_discount_affect_attribute.sys.ini | 11 + ...i-VN.plg_redshop_product_discount_rule.ini | 15 + ....plg_redshop_product_discount_rule.sys.ini | 8 + .../vi-VN/vi-VN.plg_redshop_product_gift.ini | 11 + .../vi-VN.plg_redshop_product_gift.sys.ini | 11 + .../vi-VN/vi-VN.plg_redshop_product_gls.ini | 11 + .../vi-VN.plg_redshop_product_gls.sys.ini | 11 + ...N.plg_redshop_product_google_microdata.ini | 18 + ...g_redshop_product_google_microdata.sys.ini | 11 + .../vi-VN.plg_redshop_product_invoicepdf.ini | 25 + ...-VN.plg_redshop_product_invoicepdf.sys.ini | 10 + .../vi-VN.plg_redshop_product_postdanmark.ini | 11 + ...VN.plg_redshop_product_postdanmark.sys.ini | 11 + ...VN.plg_redshop_product_product_alttext.ini | 4 + ...lg_redshop_product_product_alttext.sys.ini | 2 + ....plg_redshop_product_shoppergroup_tags.ini | 3 + ..._redshop_product_shoppergroup_tags.sys.ini | 3 + ....plg_redshop_product_stock_notifyemail.ini | 12 + ..._redshop_product_stock_notifyemail.sys.ini | 11 + ...N.plg_redshop_product_stockroom_status.ini | 21 + ...g_redshop_product_stockroom_status.sys.ini | 11 + .../vi-VN.plg_redshop_product_sync_b2b.ini | 16 + ...vi-VN.plg_redshop_product_sync_b2b.sys.ini | 8 + .../vi-VN.plg_redshop_product_type_bundle.ini | 12 + ...VN.plg_redshop_product_type_bundle.sys.ini | 10 + .../vi-VN.plg_redshop_product_type_gift.ini | 12 + ...i-VN.plg_redshop_product_type_gift.sys.ini | 10 + ...vi-VN.plg_redshop_product_wss_datafeed.ini | 12 + ...N.plg_redshop_product_wss_datafeed.sys.ini | 3 + .../vi-VN.plg_redshop_shipping_bring.ini | 12 + .../vi-VN.plg_redshop_shipping_bring.sys.ini | 2 + ....plg_redshop_shipping_default_shipping.ini | 15 + ..._redshop_shipping_default_shipping.sys.ini | 11 + ..._redshop_shipping_default_shipping_gls.ini | 9 + ...shop_shipping_default_shipping_gls.sys.ini | 2 + ..._shipping_default_shipping_glsbusiness.ini | 17 + ...pping_default_shipping_glsbusiness.sys.ini | 11 + .../vi-VN.plg_redshop_shipping_fedex.ini | 60 + .../vi-VN.plg_redshop_shipping_fedex.sys.ini | 11 + ...-VN.plg_redshop_shipping_giaohangnhanh.ini | 43 + ...plg_redshop_shipping_giaohangnhanh.sys.ini | 3 + ...vi-VN.plg_redshop_shipping_postdanmark.ini | 31 + ...N.plg_redshop_shipping_postdanmark.sys.ini | 11 + ...vi-VN.plg_redshop_shipping_self_pickup.ini | 5 + ...N.plg_redshop_shipping_self_pickup.sys.ini | 3 + .../vi-VN.plg_redshop_shipping_shipper.ini | 5 + ...vi-VN.plg_redshop_shipping_shipper.sys.ini | 2 + .../vi-VN/vi-VN.plg_redshop_shipping_ups.ini | 62 + .../vi-VN.plg_redshop_shipping_ups.sys.ini | 2 + .../vi-VN.plg_redshop_shipping_uspsv4.ini | 46 + .../vi-VN.plg_redshop_shipping_uspsv4.sys.ini | 2 + .../vi-VN.plg_redshop_user_cmc_integrate.ini | 11 + ...-VN.plg_redshop_user_cmc_integrate.sys.ini | 2 + ...lg_redshop_user_joomlamailer_integrate.ini | 2 + ...edshop_user_joomlamailer_integrate.sys.ini | 2 + ...g_redshop_user_registration_acymailing.ini | 4 + ...dshop_user_registration_acymailing.sys.ini | 2 + ...vies_registration_rs_vies_registration.ini | 45 + ..._registration_rs_vies_registration.sys.ini | 3 + .../vi-VN.plg_search_redshop_categories.ini | 20 + ...i-VN.plg_search_redshop_categories.sys.ini | 10 + .../vi-VN.plg_search_redshop_products.ini | 19 + .../vi-VN.plg_search_redshop_products.sys.ini | 11 + ...xtplugins_sh404sefextplugincom_redshop.ini | 7 + ...ugins_sh404sefextplugincom_redshop.sys.ini | 7 + .../vi-VN/vi-VN.plg_system_agile_crm.ini | 21 + .../vi-VN/vi-VN.plg_system_agile_crm.sys.ini | 6 + .../vi-VN/vi-VN.plg_system_quickbook.ini | 1 + .../vi-VN/vi-VN.plg_system_quickbook.sys.ini | 1 + .../vi-VN.plg_system_redgoogleanalytics.ini | 15 + ...i-VN.plg_system_redgoogleanalytics.sys.ini | 10 + ...vi-VN.plg_system_redlightbox_slideshow.ini | 2 + ...N.plg_system_redlightbox_slideshow.sys.ini | 2 + .../vi-VN/vi-VN.plg_system_redproductzoom.ini | 39 + .../vi-VN.plg_system_redproductzoom.sys.ini | 11 + .../admin/vi-VN/vi-VN.plg_system_redshop.ini | 3 + .../vi-VN/vi-VN.plg_system_redshop.sys.ini | 3 + ...i-VN.plg_system_redshop_product_bundle.ini | 11 + ....plg_system_redshop_product_bundle.sys.ini | 10 + ...N.plg_system_redshop_send_discountcode.ini | 7 + ...g_system_redshop_send_discountcode.sys.ini | 3 + .../admin/vi-VN/vi-VN.plg_user_highrise.ini | 20 + .../vi-VN/vi-VN.plg_user_highrise.sys.ini | 11 + .../vi-VN/vi-VN.plg_user_redshop_avatar.ini | 10 + .../vi-VN.plg_user_redshop_avatar.sys.ini | 9 + .../vi-VN/vi-VN.plg_xmap_com_redshop.ini | 25 + .../vi-VN/vi-VN.plg_xmap_com_redshop.sys.ini | 3 + src/lang/vi-VN/install.xml | 21 + .../vi-VN/site/vi-VN/vi-VN.com_redshop.ini | 1043 + .../vi-VN/site/vi-VN/vi-VN.lib_redshop.ini | 38 + .../site/vi-VN/vi-VN.lib_redshop.sys.ini | 7 + .../vi-VN/site/vi-VN/vi-VN.mod_fb_albums.ini | 19 + .../site/vi-VN/vi-VN.mod_fb_albums.sys.ini | 8 + .../vi-VN/vi-VN.mod_redcategoryscroller.ini | 85 + .../vi-VN.mod_redcategoryscroller.sys.ini | 7 + .../vi-VN/vi-VN.mod_redfeaturedproduct.ini | 41 + .../vi-VN.mod_redfeaturedproduct.sys.ini | 8 + .../site/vi-VN/vi-VN.mod_redmanufacturer.ini | 49 + .../vi-VN/vi-VN.mod_redmanufacturer.sys.ini | 8 + .../site/vi-VN/vi-VN.mod_redmasscart.ini | 25 + .../site/vi-VN/vi-VN.mod_redmasscart.sys.ini | 8 + .../site/vi-VN/vi-VN.mod_redproducts3d.ini | 44 + .../vi-VN/vi-VN.mod_redproducts3d.sys.ini | 7 + .../vi-VN/vi-VN.mod_redproductscroller.ini | 84 + .../vi-VN.mod_redproductscroller.sys.ini | 7 + .../site/vi-VN/vi-VN.mod_redproducttab.ini | 49 + .../vi-VN/vi-VN.mod_redproducttab.sys.ini | 8 + .../vi-VN.mod_redshop_aesir_products.ini | 67 + .../vi-VN.mod_redshop_aesir_products.sys.ini | 8 + .../site/vi-VN/vi-VN.mod_redshop_cart.ini | 31 + .../site/vi-VN/vi-VN.mod_redshop_cart.sys.ini | 8 + .../vi-VN/vi-VN.mod_redshop_categories.ini | 63 + .../vi-VN.mod_redshop_category_scroller.ini | 47 + ...i-VN.mod_redshop_category_scroller.sys.ini | 7 + .../vi-VN/vi-VN.mod_redshop_currencies.ini | 14 + .../vi-VN.mod_redshop_currencies.sys.ini | 3 + .../site/vi-VN/vi-VN.mod_redshop_discount.ini | 12 + .../vi-VN/vi-VN.mod_redshop_discount.sys.ini | 8 + .../site/vi-VN/vi-VN.mod_redshop_filter.ini | 40 + .../vi-VN/vi-VN.mod_redshop_filter.sys.ini | 7 + .../vi-VN/vi-VN.mod_redshop_logingreeting.ini | 18 + .../vi-VN.mod_redshop_logingreeting.sys.ini | 8 + .../site/vi-VN/vi-VN.mod_redshop_megamenu.ini | 21 + .../vi-VN/vi-VN.mod_redshop_megamenu.sys.ini | 2 + .../vi-VN/vi-VN.mod_redshop_newsletter.ini | 17 + .../vi-VN.mod_redshop_newsletter.sys.ini | 7 + .../vi-VN/vi-VN.mod_redshop_pricefilter.ini | 52 + .../vi-VN.mod_redshop_pricefilter.sys.ini | 8 + .../vi-VN.mod_redshop_productcompare.ini | 12 + .../vi-VN.mod_redshop_productcompare.sys.ini | 7 + .../site/vi-VN/vi-VN.mod_redshop_products.ini | 60 + .../vi-VN/vi-VN.mod_redshop_products.sys.ini | 7 + .../vi-VN.mod_redshop_products_slideshow.ini | 64 + ...-VN.mod_redshop_products_slideshow.sys.ini | 8 + ...i-VN.mod_redshop_promote_free_shipping.ini | 15 + ....mod_redshop_promote_free_shipping.sys.ini | 8 + .../site/vi-VN/vi-VN.mod_redshop_search.ini | 66 + .../vi-VN/vi-VN.mod_redshop_search.sys.ini | 8 + ...i-VN.mod_redshop_shoppergroup_category.ini | 22 + ....mod_redshop_shoppergroup_category.sys.ini | 8 + ...vi-VN.mod_redshop_shoppergroup_product.ini | 49 + ...N.mod_redshop_shoppergroup_product.sys.ini | 8 + .../vi-VN.mod_redshop_shoppergrouplogo.ini | 10 + ...vi-VN.mod_redshop_shoppergrouplogo.sys.ini | 8 + .../vi-VN/vi-VN.mod_redshop_tags_similar.ini | 22 + .../vi-VN.mod_redshop_tags_similar.sys.ini | 10 + .../vi-VN/vi-VN.mod_redshop_who_bought.ini | 54 + .../vi-VN.mod_redshop_who_bought.sys.ini | 7 + .../site/vi-VN/vi-VN.mod_redshop_wishlist.ini | 39 + .../vi-VN/vi-VN.mod_redshop_wishlist.sys.ini | 8 + tests/README.md | 51 + tests/_bootstrap.php | 10 + tests/_bootstrap_joomla.php | 18 + tests/_data/dump.sql | 1 + tests/_data/image.jpg | Bin 0 -> 174812 bytes .../scenarios/acceptance/1st_Install_Test.txt | 6 + .../scenarios/acceptance/Category0001.txt | 12 + tests/_extensions/testsperformance.php | 123 + tests/_groups/InstallationJ3Group.php | 37 + .../Joomla3/Administrator/AdminJ3Page.php | 680 + .../Administrator/CategoryManagerJ3Page.php | 276 + .../Joomla3/Administrator/CategoryPage.php | 240 + .../CheckoutChangeQuantityProductPage.php | 36 + .../Administrator/CheckoutModulePage.php | 56 + .../Administrator/ConfigurationPage.php | 651 + .../Joomla3/Administrator/CountryPage.php | 27 + .../Joomla3/Administrator/CouponPage.php | 66 + .../Joomla3/Administrator/CurrencyPage.php | 27 + .../CustomFieldManagerJoomla3Page.php | 220 + .../Joomla3/Administrator/DiscountPage.php | 97 + .../Administrator/DiscountProductPage.php | 88 + .../Joomla3/Administrator/Field_GroupPage.php | 42 + .../FrontEndProductManagerJoomla3Page.php | 738 + .../Administrator/GiftCardCheckoutPage.php | 61 + .../Administrator/GiftCardManagerPage.php | 122 + .../_pages/Joomla3/Administrator/MailPage.php | 27 + .../Administrator/ManufacturerPage.php | 47 + .../Administrator/MassDiscountManagerPage.php | 228 + .../Administrator/MediaManagerPage.php | 22 + .../Administrator/ModuleManagerJ3page.php | 111 + .../Administrator/OrderManagerPage.php | 289 + .../Administrator/OrderStatusManagerPage.php | 72 + .../Administrator/PriceProductJoomla3Page.php | 87 + .../Administrator/ProductManagerPage.php | 501 + .../QuestionManagerJoomla3Page.php | 81 + .../Administrator/QuotationManagerPage.php | 143 + .../Joomla3/Administrator/ShippingPage.php | 176 + .../Administrator/ShopperGroupJ3Page.php | 242 + .../Joomla3/Administrator/StatePage.php | 73 + .../Joomla3/Administrator/StockImagePage.php | 84 + .../StockRoomManagerJoomla3Page.php | 131 + .../Joomla3/Administrator/SupplierPage.php | 47 + .../Joomla3/Administrator/TaxGroupPage.php | 58 + .../Joomla3/Administrator/TaxRatePage.php | 140 + .../Joomla3/Administrator/TemplatePage.php | 58 + .../_pages/Joomla3/Administrator/TextPage.php | 37 + .../Administrator/UserManagerJoomla3Page.php | 373 + .../Administrator/VoucherManagerPage.php | 241 + .../Joomla3/Administrator/WishListPage.php | 122 + .../Joomla3/Administrator/WrapperPage.php | 87 + .../payment/AuthorizeDPMPaymentPage.php | 56 + .../FrontEnd/payment/AuthorizePaymentPage.php | 56 + .../FrontEnd/payment/Frontend2PaymentPage.php | 81 + .../FrontEnd/payment/PAYMILLPaymentPage.php | 50 + .../FrontEnd/payment/SkillPaymentPage.php | 62 + .../FrontEnd/payment/StripePaymentPage.php | 56 + .../System/ExtensionManagerJoomla3Page.php | 134 + .../System/ModuleManagerJoomlaPage.php | 176 + .../System/PayPalPluginManagerJoomla3Page.php | 77 + .../System/PluginManagerJoomla3Page.php | 227 + tests/_support/AcceptanceHelper.php | 77 + tests/_support/Cest/AbstractCest.php | 229 + tests/_support/Cest/Traits/CheckIn.php | 52 + tests/_support/Cest/Traits/Delete.php | 52 + tests/_support/Cest/Traits/Publish.php | 138 + tests/_support/DbHelper.php | 332 + tests/_support/FunctionalHelper.php | 10 + tests/_support/Step/AbstractStep.php | 314 + tests/_support/Step/Acceptance/Redshop.php | 27 + tests/_support/Step/Traits/CheckIn.php | 58 + tests/_support/Step/Traits/Delete.php | 48 + tests/_support/Step/Traits/Publish.php | 146 + tests/_support/UnitHelper.php | 10 + tests/acceptance.suite.yml.dist | 52 + tests/acceptance.suite.yml.dist.drone | 50 + .../ProductsCheckoutAuthorizeCest.php | 153 + .../ProductsCheckoutBankTransfer2Cest.php | 110 + .../ProductsCheckoutBeanStreamCept.php | 78 + .../ProductsCheckoutBraintreeCest.php | 189 + .../ProductsCheckoutDibsPaymentCest.php | 186 + .../checkout/ProductsCheckoutDotpayCest.php | 190 + .../checkout/ProductsCheckoutGiropayCest.php | 191 + .../ProductsCheckoutIngenicoPaymentCest.php | 186 + .../checkout/ProductsCheckoutMonerisCest.php | 187 + .../ProductsCheckoutPayFlowProCest.php | 186 + .../checkout/ProductsCheckoutPayPalCest.php | 75 + .../checkout/ProductsCheckoutSagePayCest.php | 218 + .../checkout/ProductsCheckoutStripeCest.php | 209 + .../update/UpdateExtensionTestCest.php | 42 + tests/acceptance/_bootstrap.php | 8 + .../OrderBackendProductAttributeCest.php | 102 + .../OrderDiscountAndSpecialUpdateCest.php | 212 + .../Oder_Backend/Orders/Order/OrderCest.php | 116 + .../UserDetail/PlaceOrderManagerCest.php | 102 + .../Joomla3Steps/AdminManagerJoomla3Steps.php | 333 + .../Module/ModuleManagerJoomla.php | 220 + .../plugins/PluginPaymentManagerJoomla.php | 271 + .../CategoryManagerJoomla3Steps.php | 426 + .../_steps/Joomla3Steps/CategorySteps.php | 122 + .../CheckoutChangeQuantityProductSteps.php | 108 + .../Joomla3Steps/CheckoutMissingData.php | 353 + .../Joomla3Steps/CheckoutOnFrontEnd.php | 245 + .../CheckoutSearchProductFrontendSteps.php | 174 + .../CheckoutWithShippingRateSteps.php | 70 + .../Configuration/ConfigurationSteps.php | 782 + .../ProductsConfigurationSteps.php | 124 + .../_steps/Joomla3Steps/CountrySteps.php | 23 + .../_steps/Joomla3Steps/CouponSteps.php | 45 + .../_steps/Joomla3Steps/CurrencySteps.php | 23 + .../CustomFieldManagerJoomla3Steps.php | 134 + .../DiscountManagerJoomla3Steps.php | 0 .../Joomla3Steps/DiscountProductSteps.php | 306 + .../_steps/Joomla3Steps/DiscountSteps.php | 423 + .../Joomla3Steps/Discount_ProductSteps.php | 15 + .../_steps/Joomla3Steps/Field_GroupSteps.php | 35 + .../Frontend/Module/MultiCurrenciesSteps.php | 59 + .../Frontend/Module/ProductTabsSteps.php | 49 + .../Frontend/Module/REDMASSCARTSteps.php | 95 + .../Frontend/Module/redSHOPProductSteps.php | 119 + .../Frontend/payment/CheckoutWith2Payment.php | 105 + .../CheckoutWithAuthorizeDPMPayment.php | 114 + .../payment/CheckoutWithAuthorizePayment.php | 115 + .../payment/CheckoutWithEWAYPayment.php | 93 + .../payment/CheckoutWithPAYMILLPayment.php | 76 + .../payment/CheckoutWithSkillPayment.php | 91 + .../payment/CheckoutWithStripePayment.php | 75 + .../checkoutWithBankTransferDiscount.php | 131 + .../GiftCardManagerJoomla3Steps.php | 318 + ...GlobalConfigurationManagerJoomla3Steps.php | 37 + .../_steps/Joomla3Steps/MailSteps.php | 23 + .../_steps/Joomla3Steps/ManufacturerSteps.php | 75 + .../MassDiscountManagerJoomla3Steps.php | 317 + .../Joomla3Steps/MediaManagerJoomla3Steps.php | 34 + .../Joomla3Steps/OrderManagerJoomla3Steps.php | 460 + .../Joomla3Steps/OrderStatusManagerSteps.php | 189 + ...rUpdateDiscountAndSpecialDiscountSteps.php | 98 + .../PayPalPluginManagerJoomla3Steps.php | 93 + ...ment2CheckoutPluginManagerJoomla3Steps.php | 49 + ...entBeanStreamPluginManagerJoomla3Steps.php | 54 + ...mentBraintreePluginManagerJoomla3Steps.php | 55 + .../PriceProductManagerJoomla3Steps.php | 67 + .../ProductCheckoutManagerJoomla3Steps.php | 1256 + .../ProductManagerJoomla3Steps.php | 1111 + .../ProductUpdateOnQuantitySteps.php | 131 + .../QuestionManagerJoomla3Steps.php | 166 + .../QuotationManagerJoomla3Steps.php | 147 + .../_steps/Joomla3Steps/RedshopSteps.php | 399 + .../_steps/Joomla3Steps/ShippingSteps.php | 261 + .../ShopperGroupManagerJoomla3Steps.php | 302 + .../_steps/Joomla3Steps/StateSteps.php | 116 + .../_steps/Joomla3Steps/StockImageSteps.php | 100 + .../StockRoomManagerJoomla3Steps.php | 128 + .../_steps/Joomla3Steps/SupplierSteps.php | 90 + .../_steps/Joomla3Steps/TaxGroupSteps.php | 253 + .../_steps/Joomla3Steps/TaxRateSteps.php | 441 + .../_steps/Joomla3Steps/TemplateSteps.php | 153 + .../_steps/Joomla3Steps/TextSteps.php | 23 + .../Joomla3Steps/UserManagerJoomla3Steps.php | 574 + .../VoucherManagerJoomla3Steps.php | 346 + .../_steps/Joomla3Steps/WishListSteps.php | 134 + .../_steps/Joomla3Steps/WrapperSteps.php | 119 + .../ProductNotForSaleOnFrontendCest.php | 76 + .../Price_Product/PriceProductCest.php | 104 + .../g02/Customizations/State/StateCest.php | 150 + .../g03/Notices/FrontEndNoticesCest.php | 71 + .../administrator/g03/Notices/NoticesCest.php | 79 + .../g03/Shippings/Shipping/ShippingCest.php | 237 + .../g04/Shippings/Wrapper/WrapperCest.php | 98 + .../Stockrooms/StockRoom/StockRoomCest.php | 92 + .../Stockrooms/Stock_Image/StockImageCest.php | 95 + .../Customizations/Template/TemplateCest.php | 146 + .../Order_Status/OrderStatusManagerCest.php | 199 + .../g05/Orders/Quotation/QuotationCest.php | 112 + .../QuotationCheckPhoneStringCest.php | 108 + .../Customizations/Country/CountryCest.php | 100 + .../Discount_Product/DiscountProductCest.php | 220 + .../ConfigurationAccessoryProductsCest.php | 141 + .../g07/Configuration/ConfigurationCest.php | 280 + .../ProductsConfigurationCest.php | 152 + ...ProductsConfigurationRelatedTwoWayCest.php | 144 + .../Customizations/Currency/CurrencyCest.php | 97 + .../Users/Shopper_Group/ShopperGroupCest.php | 157 + .../Custom_Field/CustomFieldCest.php | 69 + .../Discounts/Discount/DiscountCest.php | 187 + .../g10/Products/Tax_Group/TaxGroupCest.php | 197 + .../ManageGiftCardAdministratorCest.php | 133 + .../g11/Products/Tax_Rate/TaxRateCest.php | 248 + .../g12/Communications/Mail/MailCest.php | 101 + .../Rewards/Coupon/CouponCest.php | 147 + .../administrator/g12/Users/User/UserCest.php | 145 + .../Field_Group/Field_GroupCest.php | 115 + .../Mass_Discount/MassDiscountCest.php | 278 + .../g14/Customizations/Text/TextCest.php | 101 + .../Rewards/Voucher/VoucherCest.php | 211 + .../g14/Products/Supplier/SupplierCest.php | 154 + .../g15/Product_Price/AddProductPriceCest.php | 348 + .../g15/Products/Category/CategoryCest.php | 150 + .../Manufacturer/ManufacturerCest.php | 156 + .../g15/Wishlist/WishListCest.php | 242 + .../ProductPriceDiscountCest.php | 365 + .../ProductManagement/ProductsCest.php | 249 + .../g17/MenuItem/QuickTextForMenuItemCest.php | 143 + .../VAT/OderBackendWithForeignCountryCest.php | 372 + .../install/core/InstallRedShopCest.php | 64 + .../InstallRedSHOPPaidExtensionsCest.php | 479 + .../Products/ProductsCheckoutFrontEndCest.php | 147 + .../Stockroom/CheckoutWithStockroomCest.php | 84 + .../CheckoutDiscountOnProductCest.php | 209 + .../CheckoutDiscountTotalCest.php | 133 + .../VoucherCheckoutProductCest.php | 205 + .../g05/Quotations/QuotationFrontendCest.php | 134 + .../MassDiscountCheckoutCest.php | 103 + .../Compare_Products/CompareProductsCest.php | 75 + .../CheckoutChangeQuantityProductCest.php | 211 + .../CheckoutSearchProductFrontendCest.php | 151 + .../CheckPaymentMethodBankTransferCest.php | 146 + .../ProductUpdateOnQuantityCest.php | 186 + .../CheckoutSpecificShopperGroupsCest.php | 142 + .../GiftCardCheckoutProductCest.php | 280 + .../Product_Attribute/AttributeUserCest.php | 261 + ...heckoutWithTotalDiscoutBeforeTodayCest.php | 174 + .../CheckoutMassDiscountBeforeTodayCest.php | 166 + .../CheckVATChangedDependingOnTheUserCest.php | 353 + .../VAT/ProductAttributesVatCheckoutCest.php | 227 + .../g13/VAT/ProductVatCheckoutCest.php | 179 + .../One_Step_Checkout/OnePageCheckoutCest.php | 231 + .../OnePageCheckoutMissingDataCest.php | 173 + .../CouponVoucherMixCheckoutCest.php | 480 + .../ImageAndSEOCategoryProductCest.php | 183 + .../g17/Module/ModuleMultiCurrenciesCest.php | 203 + .../g17/Module/ModuleProductsTabCest.php | 282 + .../g17/Module/ModuleRedSHOPProductCest.php | 455 + .../g17/Module/REDMASSCARTCest.php | 219 + .../payment/CheckoutPAYMILLPaymentCest.php | 251 + .../payment/CheckoutWithSKRILLPaymentCest.php | 256 + .../Plugins/payment/Products2CheckoutCest.php | 175 + .../payment/ProductsCheckoutAuthorizeCest.php | 241 + ...oductsCheckoutBankTransferDiscountCest.php | 271 + .../payment/ProductsCheckoutEWAYCest.php | 257 + .../ProductsCheckoutStripePaymentCest.php | 260 + .../ProductsCheckoutAuthorizeDPMCest.php | 247 + .../uninstall/UninstallExtensionCest.php | 49 + tests/checkers/debugcode.php | 57 + tests/checkers/phpcs.php | 95 + tests/checkers/phppec.php | 47 + tests/checkers/traviswebserverckecker.php | 38 + tests/drone/setup-base-install.sh | 22 + tests/drone/setup-stages.sh | 20 + tests/functional.suite.yml | 9 + tests/functional/_bootstrap.php | 2 + tests/travis-ci-apache.conf | 18 + tests/unit.suite.yml | 6 + tests/unit/_bootstrap.php | 2 + 5066 files changed, 564185 insertions(+) create mode 100644 .drone.yml create mode 100644 .gitattributes create mode 100755 .gitignore create mode 100644 .scrutinizer.yml create mode 100644 LICENSE.txt create mode 100755 README.md create mode 100644 RoboFile.php create mode 100755 bump.sh create mode 100644 codeception.yml create mode 100644 component/admin/access.xml create mode 100644 component/admin/assets/index.html create mode 100644 component/admin/assets/labels/index.html create mode 100644 component/admin/assets/media/index.html create mode 100644 component/admin/config.xml create mode 100644 component/admin/config/config.dist.php create mode 100644 component/admin/controller.php create mode 100644 component/admin/controllers/access.php create mode 100644 component/admin/controllers/accountgroup.php create mode 100644 component/admin/controllers/accountgroup_detail.php create mode 100644 component/admin/controllers/addorder_detail.php create mode 100644 component/admin/controllers/addquotation_detail.php create mode 100644 component/admin/controllers/alert.php create mode 100644 component/admin/controllers/attribute.php create mode 100644 component/admin/controllers/attribute_set.php create mode 100644 component/admin/controllers/attribute_set_detail.php create mode 100644 component/admin/controllers/attributeprices.php create mode 100644 component/admin/controllers/attributeprices_detail.php create mode 100644 component/admin/controllers/attributes.php create mode 100644 component/admin/controllers/barcode.php create mode 100644 component/admin/controllers/catalog.php create mode 100644 component/admin/controllers/catalog_request.php create mode 100644 component/admin/controllers/catalogs.php create mode 100644 component/admin/controllers/categories.php create mode 100644 component/admin/controllers/category.php create mode 100644 component/admin/controllers/configuration.php create mode 100644 component/admin/controllers/countries.php create mode 100644 component/admin/controllers/country.php create mode 100644 component/admin/controllers/coupon.php create mode 100644 component/admin/controllers/coupons.php create mode 100644 component/admin/controllers/currencies.php create mode 100644 component/admin/controllers/currency.php create mode 100644 component/admin/controllers/discount.php create mode 100644 component/admin/controllers/discount_product.php create mode 100644 component/admin/controllers/discount_products.php create mode 100644 component/admin/controllers/discounts.php create mode 100644 component/admin/controllers/export.php create mode 100644 component/admin/controllers/field.php create mode 100644 component/admin/controllers/field_group.php create mode 100644 component/admin/controllers/field_groups.php create mode 100644 component/admin/controllers/fields.php create mode 100644 component/admin/controllers/giftcard.php create mode 100644 component/admin/controllers/giftcards.php create mode 100644 component/admin/controllers/import.php create mode 100644 component/admin/controllers/import_vm.php create mode 100644 component/admin/controllers/index.html create mode 100644 component/admin/controllers/install.php create mode 100644 component/admin/controllers/mail.php create mode 100644 component/admin/controllers/mails.php create mode 100644 component/admin/controllers/manufacturer.php create mode 100644 component/admin/controllers/manufacturers.php create mode 100644 component/admin/controllers/mass_discount.php create mode 100644 component/admin/controllers/mass_discounts.php create mode 100644 component/admin/controllers/media.php create mode 100644 component/admin/controllers/media_detail.php create mode 100644 component/admin/controllers/newsletter.php create mode 100644 component/admin/controllers/newsletter_detail.php create mode 100644 component/admin/controllers/newslettersubscr.php create mode 100644 component/admin/controllers/newslettersubscr_detail.php create mode 100644 component/admin/controllers/opsearch.php create mode 100644 component/admin/controllers/order.php create mode 100644 component/admin/controllers/order_detail.php create mode 100644 component/admin/controllers/order_status.php create mode 100644 component/admin/controllers/order_statuses.php create mode 100644 component/admin/controllers/prices.php create mode 100644 component/admin/controllers/prices_detail.php create mode 100644 component/admin/controllers/product.php create mode 100644 component/admin/controllers/product_attribute_price.php create mode 100644 component/admin/controllers/product_category.php create mode 100755 component/admin/controllers/product_detail.php create mode 100644 component/admin/controllers/product_price.php create mode 100644 component/admin/controllers/producttags.php create mode 100644 component/admin/controllers/producttags_detail.php create mode 100644 component/admin/controllers/question.php create mode 100644 component/admin/controllers/questions.php create mode 100644 component/admin/controllers/quotation.php create mode 100644 component/admin/controllers/quotation_detail.php create mode 100644 component/admin/controllers/rating.php create mode 100644 component/admin/controllers/rating_detail.php create mode 100644 component/admin/controllers/redshop.php create mode 100644 component/admin/controllers/sample.php create mode 100644 component/admin/controllers/sample_catalog.php create mode 100644 component/admin/controllers/sample_detail.php create mode 100644 component/admin/controllers/sample_request.php create mode 100644 component/admin/controllers/search.json.php create mode 100644 component/admin/controllers/search.php create mode 100644 component/admin/controllers/shipping.php create mode 100644 component/admin/controllers/shipping_box.php create mode 100644 component/admin/controllers/shipping_boxes.php create mode 100644 component/admin/controllers/shipping_detail.php create mode 100644 component/admin/controllers/shipping_rate.php create mode 100644 component/admin/controllers/shipping_rate_detail.php create mode 100644 component/admin/controllers/shopper_group.php create mode 100644 component/admin/controllers/shopper_group_detail.php create mode 100644 component/admin/controllers/state.php create mode 100644 component/admin/controllers/states.php create mode 100644 component/admin/controllers/statistic.php create mode 100644 component/admin/controllers/statistic_customer.php create mode 100644 component/admin/controllers/statistic_order.php create mode 100644 component/admin/controllers/statistic_product.php create mode 100644 component/admin/controllers/statistic_quotation.php create mode 100644 component/admin/controllers/statistic_variant.php create mode 100644 component/admin/controllers/stockimage.php create mode 100644 component/admin/controllers/stockimage_detail.php create mode 100644 component/admin/controllers/stockroom.php create mode 100644 component/admin/controllers/stockroom_detail.php create mode 100644 component/admin/controllers/stockroom_listing.php create mode 100644 component/admin/controllers/supplier.php create mode 100644 component/admin/controllers/suppliers.php create mode 100644 component/admin/controllers/tax_group.php create mode 100644 component/admin/controllers/tax_groups.php create mode 100644 component/admin/controllers/tax_rate.php create mode 100644 component/admin/controllers/tax_rates.php create mode 100644 component/admin/controllers/template.php create mode 100644 component/admin/controllers/templates.php create mode 100644 component/admin/controllers/text.php create mode 100644 component/admin/controllers/texts.php create mode 100644 component/admin/controllers/tool_image.php create mode 100644 component/admin/controllers/tool_update.php create mode 100644 component/admin/controllers/user.php create mode 100644 component/admin/controllers/user_detail.php create mode 100644 component/admin/controllers/voucher.php create mode 100644 component/admin/controllers/vouchers.php create mode 100644 component/admin/controllers/wizard.php create mode 100644 component/admin/controllers/wrapper.php create mode 100644 component/admin/controllers/wrapper_detail.php create mode 100644 component/admin/controllers/xmlexport.php create mode 100644 component/admin/controllers/xmlexport_detail.php create mode 100644 component/admin/controllers/xmlimport.php create mode 100644 component/admin/controllers/xmlimport_detail.php create mode 100644 component/admin/controllers/zip_import.php create mode 100644 component/admin/controllers/zipcode.php create mode 100644 component/admin/controllers/zipcodes.php create mode 100644 component/admin/extras/sh404sef/language/com_redshop.php create mode 100644 component/admin/help/da-DK/index.html create mode 100644 component/admin/help/da-DK/redshop.html create mode 100644 component/admin/help/en-GB/index.html create mode 100644 component/admin/help/en-GB/redshop.html create mode 100644 component/admin/helpers/economic.php create mode 100644 component/admin/helpers/extra_field.php create mode 100644 component/admin/helpers/index.html create mode 100644 component/admin/helpers/menu.php create mode 100644 component/admin/helpers/order_functions.php create mode 100644 component/admin/helpers/product.php create mode 100644 component/admin/helpers/product_category.php create mode 100644 component/admin/helpers/quotationhelper.php create mode 100644 component/admin/helpers/redconfiguration.php create mode 100644 component/admin/helpers/redmediahelper.php create mode 100644 component/admin/helpers/redshophelperimages.php create mode 100644 component/admin/helpers/redshopmail.php create mode 100644 component/admin/helpers/redtemplate.php create mode 100644 component/admin/helpers/rsstockroomhelper.php create mode 100644 component/admin/helpers/shipping.php create mode 100644 component/admin/helpers/shoppergroup.php create mode 100644 component/admin/helpers/text_library.php create mode 100644 component/admin/helpers/wizard/index.html create mode 100644 component/admin/helpers/wizard/redshop.cfg.def.php create mode 100644 component/admin/helpers/wizard/redshop.cfg.tmp.dist.php create mode 100644 component/admin/helpers/wizard/redshop.cfg.tmp.php create mode 100644 component/admin/helpers/wizard/wizard.php create mode 100644 component/admin/helpers/xmlhelper.php create mode 100644 component/admin/index.html create mode 100644 component/admin/language/en-GB/en-GB.com_redshop.ini create mode 100644 component/admin/language/en-GB/en-GB.com_redshop.sys.ini create mode 100644 component/admin/language/en-GB/index.html create mode 100644 component/admin/language/index.html create mode 100644 component/admin/layouts/alert/header_link.php create mode 100644 component/admin/layouts/alert/index.html create mode 100644 component/admin/layouts/cart/index.html create mode 100644 component/admin/layouts/component/admin.php create mode 100644 component/admin/layouts/component/assets.php create mode 100644 component/admin/layouts/component/component.php create mode 100644 component/admin/layouts/component/full.php create mode 100644 component/admin/layouts/component/full/content/body.php create mode 100644 component/admin/layouts/component/full/content/footer.php create mode 100644 component/admin/layouts/component/full/content/header.php create mode 100644 component/admin/layouts/component/full/content/index.html create mode 100644 component/admin/layouts/component/full/header.php create mode 100644 component/admin/layouts/component/full/header/index.html create mode 100644 component/admin/layouts/component/full/header/menu.php create mode 100644 component/admin/layouts/component/full/index.html create mode 100644 component/admin/layouts/component/full/sidebar.php create mode 100644 component/admin/layouts/component/full/sidebar/index.html create mode 100644 component/admin/layouts/component/full/sidebar/link.php create mode 100644 component/admin/layouts/component/full/sidebar/menu.php create mode 100644 component/admin/layouts/component/full/tab/index.html create mode 100644 component/admin/layouts/component/full/tab/layout.php create mode 100644 component/admin/layouts/component/full/tab/link.php create mode 100644 component/admin/layouts/component/full/tab/main.php create mode 100644 component/admin/layouts/component/image.php create mode 100644 component/admin/layouts/component/index.html create mode 100644 component/admin/layouts/config/config.php create mode 100644 component/admin/layouts/config/group.php create mode 100644 component/admin/layouts/config/index.html create mode 100644 component/admin/layouts/fields/display.php create mode 100644 component/admin/layouts/fields/index.html create mode 100644 component/admin/layouts/index.html create mode 100644 component/admin/layouts/inline/index.html create mode 100644 component/admin/layouts/inline/text.php create mode 100644 component/admin/layouts/joomla/form/index.html create mode 100644 component/admin/layouts/joomla/form/renderfield.php create mode 100644 component/admin/layouts/joomla/form/renderlabel.php create mode 100644 component/admin/layouts/joomla/index.html create mode 100644 component/admin/layouts/joomla/system/index.html create mode 100644 component/admin/layouts/joomla/system/message.php create mode 100644 component/admin/layouts/joomla/system/message/error.php create mode 100644 component/admin/layouts/joomla/system/message/index.html create mode 100644 component/admin/layouts/joomla/system/message/message.php create mode 100644 component/admin/layouts/joomla/system/message/notice.php create mode 100644 component/admin/layouts/joomla/system/message/warning.php create mode 100644 component/admin/layouts/pagination/index.html create mode 100644 component/admin/layouts/pagination/link.php create mode 100644 component/admin/layouts/pagination/links.php create mode 100644 component/admin/layouts/product_detail/index.html create mode 100644 component/admin/layouts/product_detail/product_attribute.php create mode 100755 component/admin/layouts/searchtools/default.php create mode 100755 component/admin/layouts/searchtools/default/bar.php create mode 100755 component/admin/layouts/searchtools/default/filters.php create mode 100644 component/admin/layouts/searchtools/default/index.html create mode 100755 component/admin/layouts/searchtools/default/list.php create mode 100755 component/admin/layouts/searchtools/default/noitems.php create mode 100644 component/admin/layouts/searchtools/grid/index.html create mode 100755 component/admin/layouts/searchtools/grid/sort.php create mode 100644 component/admin/layouts/searchtools/index.html create mode 100644 component/admin/layouts/templates/index.html create mode 100644 component/admin/layouts/templates/mail_template_tag.php create mode 100644 component/admin/layouts/templates/tags_hint.php create mode 100644 component/admin/layouts/templates/template_tag.php create mode 100644 component/admin/layouts/view/edit/box.php create mode 100644 component/admin/layouts/view/edit/index.html create mode 100644 component/admin/layouts/view/edit/tab.php create mode 100644 component/admin/layouts/view/index.html create mode 100644 component/admin/layouts/view/list.php create mode 100644 component/admin/models/access.php create mode 100644 component/admin/models/accountgroup.php create mode 100644 component/admin/models/accountgroup_detail.php create mode 100644 component/admin/models/addorder_detail.php create mode 100644 component/admin/models/addquotation_detail.php create mode 100644 component/admin/models/alert.php create mode 100644 component/admin/models/alert_detail.php create mode 100644 component/admin/models/attribute.php create mode 100644 component/admin/models/attribute_property.php create mode 100644 component/admin/models/attribute_set.php create mode 100644 component/admin/models/attribute_set_detail.php create mode 100644 component/admin/models/attributeprices.php create mode 100644 component/admin/models/attributeprices_detail.php create mode 100644 component/admin/models/attributes.php create mode 100644 component/admin/models/barcode.php create mode 100644 component/admin/models/catalog.php create mode 100644 component/admin/models/catalog_request.php create mode 100644 component/admin/models/catalogs.php create mode 100644 component/admin/models/categories.php create mode 100644 component/admin/models/category.php create mode 100644 component/admin/models/configuration.php create mode 100644 component/admin/models/countries.php create mode 100644 component/admin/models/country.php create mode 100644 component/admin/models/coupon.php create mode 100644 component/admin/models/coupons.php create mode 100644 component/admin/models/currencies.php create mode 100644 component/admin/models/currency.php create mode 100644 component/admin/models/discount.php create mode 100644 component/admin/models/discount_product.php create mode 100644 component/admin/models/discount_products.php create mode 100644 component/admin/models/discounts.php create mode 100755 component/admin/models/export.php create mode 100644 component/admin/models/field.php create mode 100644 component/admin/models/field_group.php create mode 100644 component/admin/models/field_groups.php create mode 100644 component/admin/models/fields.php create mode 100644 component/admin/models/forms/access.xml create mode 100644 component/admin/models/forms/attribute.xml create mode 100644 component/admin/models/forms/catalog.xml create mode 100644 component/admin/models/forms/category.xml create mode 100644 component/admin/models/forms/country.xml create mode 100644 component/admin/models/forms/coupon.xml create mode 100644 component/admin/models/forms/currency.xml create mode 100644 component/admin/models/forms/discount.xml create mode 100644 component/admin/models/forms/discount_product.xml create mode 100755 component/admin/models/forms/field.xml create mode 100644 component/admin/models/forms/field_group.xml create mode 100644 component/admin/models/forms/filter_attributes.xml create mode 100644 component/admin/models/forms/filter_catalogs.xml create mode 100644 component/admin/models/forms/filter_categories.xml create mode 100644 component/admin/models/forms/filter_countries.xml create mode 100644 component/admin/models/forms/filter_coupons.xml create mode 100644 component/admin/models/forms/filter_currencies.xml create mode 100644 component/admin/models/forms/filter_discount_products.xml create mode 100644 component/admin/models/forms/filter_discounts.xml create mode 100644 component/admin/models/forms/filter_field_groups.xml create mode 100755 component/admin/models/forms/filter_fields.xml create mode 100644 component/admin/models/forms/filter_mails.xml create mode 100644 component/admin/models/forms/filter_manufacturers.xml create mode 100644 component/admin/models/forms/filter_mass_discounts.xml create mode 100644 component/admin/models/forms/filter_order_statuses.xml create mode 100644 component/admin/models/forms/filter_questions.xml create mode 100644 component/admin/models/forms/filter_shipping_boxes.xml create mode 100644 component/admin/models/forms/filter_states.xml create mode 100644 component/admin/models/forms/filter_statistic_customer.xml create mode 100644 component/admin/models/forms/filter_statistic_order.xml create mode 100644 component/admin/models/forms/filter_statistic_product.xml create mode 100644 component/admin/models/forms/filter_suppliers.xml create mode 100644 component/admin/models/forms/filter_tax_groups.xml create mode 100644 component/admin/models/forms/filter_tax_rates.xml create mode 100644 component/admin/models/forms/filter_templates.xml create mode 100644 component/admin/models/forms/filter_texts.xml create mode 100644 component/admin/models/forms/filter_vouchers.xml create mode 100644 component/admin/models/forms/filter_zipcodes.xml create mode 100644 component/admin/models/forms/giftcard.xml create mode 100644 component/admin/models/forms/index.html create mode 100644 component/admin/models/forms/mail.xml create mode 100644 component/admin/models/forms/manufacturer.xml create mode 100644 component/admin/models/forms/mass_discount.xml create mode 100644 component/admin/models/forms/order_status.xml create mode 100644 component/admin/models/forms/product_detail.xml create mode 100644 component/admin/models/forms/question.xml create mode 100644 component/admin/models/forms/shipping_box.xml create mode 100644 component/admin/models/forms/state.xml create mode 100644 component/admin/models/forms/supplier.xml create mode 100644 component/admin/models/forms/tax_group.xml create mode 100644 component/admin/models/forms/tax_rate.xml create mode 100644 component/admin/models/forms/template.xml create mode 100644 component/admin/models/forms/text.xml create mode 100644 component/admin/models/forms/voucher.xml create mode 100644 component/admin/models/forms/zipcode.xml create mode 100644 component/admin/models/giftcard.php create mode 100644 component/admin/models/giftcards.php create mode 100755 component/admin/models/import.php create mode 100755 component/admin/models/import_vm.php create mode 100644 component/admin/models/index.html create mode 100644 component/admin/models/install.php create mode 100644 component/admin/models/mail.php create mode 100644 component/admin/models/mails.php create mode 100644 component/admin/models/manufacturer.php create mode 100644 component/admin/models/manufacturers.php create mode 100644 component/admin/models/mass_discount.php create mode 100644 component/admin/models/mass_discounts.php create mode 100644 component/admin/models/media.php create mode 100644 component/admin/models/media_detail.php create mode 100644 component/admin/models/newsletter.php create mode 100644 component/admin/models/newsletter_detail.php create mode 100644 component/admin/models/newslettersubscr.php create mode 100644 component/admin/models/newslettersubscr_detail.php create mode 100644 component/admin/models/opsearch.php create mode 100644 component/admin/models/order.php create mode 100644 component/admin/models/order_detail.php create mode 100644 component/admin/models/order_status.php create mode 100644 component/admin/models/order_statuses.php create mode 100644 component/admin/models/prices.php create mode 100644 component/admin/models/prices_detail.php create mode 100644 component/admin/models/product.php create mode 100644 component/admin/models/product_attribute.php create mode 100644 component/admin/models/product_category.php create mode 100644 component/admin/models/product_detail.php create mode 100644 component/admin/models/producttags.php create mode 100644 component/admin/models/producttags_detail.php create mode 100644 component/admin/models/question.php create mode 100644 component/admin/models/questions.php create mode 100644 component/admin/models/quotation.php create mode 100644 component/admin/models/quotation_detail.php create mode 100644 component/admin/models/rating.php create mode 100644 component/admin/models/rating_detail.php create mode 100644 component/admin/models/redshop.php create mode 100644 component/admin/models/sample.php create mode 100644 component/admin/models/sample_catalog.php create mode 100644 component/admin/models/sample_detail.php create mode 100644 component/admin/models/sample_request.php create mode 100644 component/admin/models/search.php create mode 100644 component/admin/models/shipping.php create mode 100644 component/admin/models/shipping_box.php create mode 100644 component/admin/models/shipping_boxes.php create mode 100644 component/admin/models/shipping_detail.php create mode 100644 component/admin/models/shipping_rate.php create mode 100644 component/admin/models/shipping_rate_detail.php create mode 100644 component/admin/models/shopper_group.php create mode 100644 component/admin/models/shopper_group_detail.php create mode 100644 component/admin/models/state.php create mode 100644 component/admin/models/states.php create mode 100644 component/admin/models/statistic.php create mode 100644 component/admin/models/statistic_customer.php create mode 100644 component/admin/models/statistic_order.php create mode 100644 component/admin/models/statistic_product.php create mode 100644 component/admin/models/statistic_quotation.php create mode 100644 component/admin/models/statistic_variant.php create mode 100644 component/admin/models/stockimage.php create mode 100644 component/admin/models/stockimage_detail.php create mode 100644 component/admin/models/stockroom.php create mode 100644 component/admin/models/stockroom_detail.php create mode 100644 component/admin/models/stockroom_listing.php create mode 100644 component/admin/models/supplier.php create mode 100644 component/admin/models/suppliers.php create mode 100644 component/admin/models/tax_group.php create mode 100644 component/admin/models/tax_groups.php create mode 100644 component/admin/models/tax_rate.php create mode 100644 component/admin/models/tax_rates.php create mode 100644 component/admin/models/template.php create mode 100644 component/admin/models/templates.php create mode 100644 component/admin/models/text.php create mode 100644 component/admin/models/texts.php create mode 100644 component/admin/models/tool_update.php create mode 100644 component/admin/models/user.php create mode 100644 component/admin/models/user_detail.php create mode 100644 component/admin/models/voucher.php create mode 100644 component/admin/models/vouchers.php create mode 100644 component/admin/models/wizard.php create mode 100644 component/admin/models/wrapper.php create mode 100644 component/admin/models/wrapper_detail.php create mode 100644 component/admin/models/xmlexport.php create mode 100644 component/admin/models/xmlexport_detail.php create mode 100644 component/admin/models/xmlimport.php create mode 100644 component/admin/models/xmlimport_detail.php create mode 100644 component/admin/models/zip_import.php create mode 100644 component/admin/models/zipcode.php create mode 100644 component/admin/models/zipcodes.php create mode 100644 component/admin/redshop.php create mode 100644 component/admin/sql/index.html create mode 100644 component/admin/sql/install/index.html create mode 100644 component/admin/sql/install/mysql/data.sql create mode 100644 component/admin/sql/install/mysql/index.html create mode 100644 component/admin/sql/install/mysql/install.sql create mode 100644 component/admin/sql/install/mysql/uninstall.sql create mode 100644 component/admin/sql/updates/index.html create mode 100644 component/admin/sql/updates/mysql/1.1.10.sql create mode 100644 component/admin/sql/updates/mysql/1.1.11.sql create mode 100644 component/admin/sql/updates/mysql/1.1.20.sql create mode 100644 component/admin/sql/updates/mysql/1.2.sql create mode 100644 component/admin/sql/updates/mysql/1.3.1.1.sql create mode 100644 component/admin/sql/updates/mysql/1.3.1.2.sql create mode 100644 component/admin/sql/updates/mysql/1.3.1.3.sql create mode 100644 component/admin/sql/updates/mysql/1.3.1.sql create mode 100644 component/admin/sql/updates/mysql/1.3.2.sql create mode 100644 component/admin/sql/updates/mysql/1.3.3.1.sql create mode 100644 component/admin/sql/updates/mysql/1.3.3.sql create mode 100644 component/admin/sql/updates/mysql/1.3.sql create mode 100644 component/admin/sql/updates/mysql/1.4.sql create mode 100644 component/admin/sql/updates/mysql/1.5.0.3.sql create mode 100644 component/admin/sql/updates/mysql/1.5.0.4.1.sql create mode 100644 component/admin/sql/updates/mysql/1.5.0.4.3.sql create mode 100644 component/admin/sql/updates/mysql/1.5.0.5.1.sql create mode 100644 component/admin/sql/updates/mysql/1.5.0.5.2.sql create mode 100644 component/admin/sql/updates/mysql/1.5.0.5.3.sql create mode 100644 component/admin/sql/updates/mysql/1.5.0.sql create mode 100644 component/admin/sql/updates/mysql/1.6.0.sql create mode 100644 component/admin/sql/updates/mysql/1.6.1.sql create mode 100644 component/admin/sql/updates/mysql/1.6.2.sql create mode 100644 component/admin/sql/updates/mysql/1.6.3.sql create mode 100644 component/admin/sql/updates/mysql/2.0.0.2.sql create mode 100644 component/admin/sql/updates/mysql/2.0.0.3.sql create mode 100644 component/admin/sql/updates/mysql/2.0.0.4.sql create mode 100644 component/admin/sql/updates/mysql/2.0.0.5.sql create mode 100644 component/admin/sql/updates/mysql/2.0.0.6.sql create mode 100644 component/admin/sql/updates/mysql/2.0.10.sql create mode 100644 component/admin/sql/updates/mysql/2.0.11.sql create mode 100644 component/admin/sql/updates/mysql/2.0.12.sql create mode 100644 component/admin/sql/updates/mysql/2.0.13.sql create mode 100644 component/admin/sql/updates/mysql/2.0.14.sql create mode 100644 component/admin/sql/updates/mysql/2.0.15.sql create mode 100644 component/admin/sql/updates/mysql/2.0.3.sql create mode 100644 component/admin/sql/updates/mysql/2.0.4.sql create mode 100644 component/admin/sql/updates/mysql/2.0.5.sql create mode 100644 component/admin/sql/updates/mysql/2.0.6.sql create mode 100644 component/admin/sql/updates/mysql/2.0.7.sql create mode 100644 component/admin/sql/updates/mysql/2.0.8.sql create mode 100644 component/admin/sql/updates/mysql/2.0.9.sql create mode 100644 component/admin/sql/updates/mysql/2.1.0.sql create mode 100644 component/admin/sql/updates/mysql/2.1.1.sql create mode 100644 component/admin/sql/updates/mysql/2.1.2.1.sql create mode 100644 component/admin/sql/updates/mysql/2.1.2.2.sql create mode 100644 component/admin/sql/updates/mysql/2.1.2.sql create mode 100644 component/admin/sql/updates/mysql/index.html create mode 100644 component/admin/tables/access.php create mode 100644 component/admin/tables/accessory_detail.php create mode 100644 component/admin/tables/accountgroup_detail.php create mode 100644 component/admin/tables/alert_detail.php create mode 100644 component/admin/tables/associations.php create mode 100644 component/admin/tables/attribute.php create mode 100644 component/admin/tables/attribute_property.php create mode 100644 component/admin/tables/attribute_set_detail.php create mode 100644 component/admin/tables/attributeprices_detail.php create mode 100644 component/admin/tables/barcode.php create mode 100644 component/admin/tables/catalog.php create mode 100644 component/admin/tables/catalog_request.php create mode 100644 component/admin/tables/category.php create mode 100644 component/admin/tables/country.php create mode 100644 component/admin/tables/coupon.php create mode 100644 component/admin/tables/currency.php create mode 100644 component/admin/tables/discount.php create mode 100644 component/admin/tables/discount_product.php create mode 100755 component/admin/tables/field.php create mode 100644 component/admin/tables/field_data.php create mode 100644 component/admin/tables/field_group.php create mode 100644 component/admin/tables/fields_value.php create mode 100644 component/admin/tables/giftcard.php create mode 100644 component/admin/tables/index.html create mode 100644 component/admin/tables/mail.php create mode 100644 component/admin/tables/manufacturer.php create mode 100644 component/admin/tables/mass_discount.php create mode 100644 component/admin/tables/media.php create mode 100644 component/admin/tables/media_detail.php create mode 100644 component/admin/tables/media_download.php create mode 100644 component/admin/tables/newsletter_detail.php create mode 100644 component/admin/tables/newslettersubscr_detail.php create mode 100644 component/admin/tables/notifystock_user.php create mode 100644 component/admin/tables/order_acc_item.php create mode 100644 component/admin/tables/order_attribute_item.php create mode 100644 component/admin/tables/order_detail.php create mode 100644 component/admin/tables/order_item_detail.php create mode 100644 component/admin/tables/order_payment.php create mode 100644 component/admin/tables/order_status.php create mode 100644 component/admin/tables/order_status_log.php create mode 100644 component/admin/tables/order_user_detail.php create mode 100644 component/admin/tables/page_viewer.php create mode 100644 component/admin/tables/prices_detail.php create mode 100755 component/admin/tables/product_attribute.php create mode 100644 component/admin/tables/product_attribute_price_detail.php create mode 100644 component/admin/tables/product_compare.php create mode 100644 component/admin/tables/product_detail.php create mode 100644 component/admin/tables/product_discount_calc.php create mode 100644 component/admin/tables/product_discount_calc_extra.php create mode 100644 component/admin/tables/product_download.php create mode 100644 component/admin/tables/product_serial_number.php create mode 100644 component/admin/tables/product_subscribe_detail.php create mode 100644 component/admin/tables/product_subscription.php create mode 100644 component/admin/tables/product_subscription_renewal.php create mode 100644 component/admin/tables/product_tags.php create mode 100644 component/admin/tables/question.php create mode 100644 component/admin/tables/quotation_accessory_item.php create mode 100644 component/admin/tables/quotation_attribute_item.php create mode 100644 component/admin/tables/quotation_detail.php create mode 100644 component/admin/tables/quotation_item_detail.php create mode 100644 component/admin/tables/rating_detail.php create mode 100644 component/admin/tables/related_product.php create mode 100644 component/admin/tables/sample_detail.php create mode 100644 component/admin/tables/sample_request.php create mode 100644 component/admin/tables/shipping_box.php create mode 100644 component/admin/tables/shipping_detail.php create mode 100644 component/admin/tables/shipping_rate_detail.php create mode 100644 component/admin/tables/shopper_group_detail.php create mode 100644 component/admin/tables/site_viewer.php create mode 100644 component/admin/tables/state.php create mode 100644 component/admin/tables/stockimage_detail.php create mode 100644 component/admin/tables/stockroom_detail.php create mode 100755 component/admin/tables/subattribute_property.php create mode 100644 component/admin/tables/supplier.php create mode 100644 component/admin/tables/tax_group.php create mode 100644 component/admin/tables/tax_rate.php create mode 100644 component/admin/tables/template.php create mode 100644 component/admin/tables/text.php create mode 100644 component/admin/tables/transaction_coupon_detail.php create mode 100644 component/admin/tables/transaction_voucher_detail.php create mode 100644 component/admin/tables/user_detail.php create mode 100644 component/admin/tables/usercart.php create mode 100644 component/admin/tables/usercart_accessory_item.php create mode 100644 component/admin/tables/usercart_attribute_item.php create mode 100644 component/admin/tables/usercart_item.php create mode 100644 component/admin/tables/voucher.php create mode 100644 component/admin/tables/wishlist.php create mode 100644 component/admin/tables/wishlist_product.php create mode 100644 component/admin/tables/wishlist_product_item.php create mode 100644 component/admin/tables/wrapper_detail.php create mode 100644 component/admin/tables/xmlexport_detail.php create mode 100644 component/admin/tables/xmlimport_detail.php create mode 100644 component/admin/tables/zipcode.php create mode 100644 component/admin/updates/1.3.3.1.php create mode 100644 component/admin/updates/1.6.0.php create mode 100644 component/admin/updates/2.0.0.2.php create mode 100644 component/admin/updates/2.0.0.5.php create mode 100644 component/admin/updates/2.0.10.php create mode 100644 component/admin/updates/2.0.11.php create mode 100644 component/admin/updates/2.0.12.php create mode 100644 component/admin/updates/2.0.13.php create mode 100644 component/admin/updates/2.0.14.php create mode 100644 component/admin/updates/2.0.15.php create mode 100644 component/admin/updates/2.0.3.php create mode 100644 component/admin/updates/2.0.4.php create mode 100644 component/admin/updates/2.0.6.php create mode 100644 component/admin/updates/2.0.7.php create mode 100644 component/admin/updates/2.0.9.php create mode 100644 component/admin/updates/2.1.0.php create mode 100644 component/admin/updates/2.1.1.php create mode 100644 component/admin/updates/index.html create mode 100644 component/admin/views/access/index.html create mode 100644 component/admin/views/access/tmpl/default.php create mode 100644 component/admin/views/access/tmpl/index.html create mode 100644 component/admin/views/access/view.html.php create mode 100644 component/admin/views/accountgroup/index.html create mode 100644 component/admin/views/accountgroup/tmpl/default.php create mode 100644 component/admin/views/accountgroup/tmpl/index.html create mode 100644 component/admin/views/accountgroup/view.html.php create mode 100644 component/admin/views/accountgroup_detail/index.html create mode 100644 component/admin/views/accountgroup_detail/tmpl/default.php create mode 100644 component/admin/views/accountgroup_detail/tmpl/index.html create mode 100644 component/admin/views/accountgroup_detail/view.html.php create mode 100644 component/admin/views/addorder_detail/index.html create mode 100644 component/admin/views/addorder_detail/tmpl/default.php create mode 100644 component/admin/views/addorder_detail/tmpl/index.html create mode 100644 component/admin/views/addorder_detail/tmpl/productorderinfo.php create mode 100644 component/admin/views/addorder_detail/tmpl/productorderinfo_payment.php create mode 100644 component/admin/views/addorder_detail/tmpl/productorderinfo_shipping.php create mode 100644 component/admin/views/addorder_detail/view.html.php create mode 100644 component/admin/views/addquotation_detail/index.html create mode 100644 component/admin/views/addquotation_detail/tmpl/default.php create mode 100644 component/admin/views/addquotation_detail/tmpl/index.html create mode 100644 component/admin/views/addquotation_detail/view.html.php create mode 100644 component/admin/views/alert/tmpl/default.php create mode 100644 component/admin/views/alert/view.html.php create mode 100644 component/admin/views/attribute/index.html create mode 100644 component/admin/views/attribute/tmpl/edit.php create mode 100644 component/admin/views/attribute/tmpl/index.html create mode 100644 component/admin/views/attribute/view.html.php create mode 100644 component/admin/views/attribute_set/index.html create mode 100644 component/admin/views/attribute_set/tmpl/default.php create mode 100644 component/admin/views/attribute_set/tmpl/index.html create mode 100644 component/admin/views/attribute_set/view.html.php create mode 100644 component/admin/views/attribute_set_detail/index.html create mode 100644 component/admin/views/attribute_set_detail/tmpl/default.php create mode 100644 component/admin/views/attribute_set_detail/tmpl/index.html create mode 100644 component/admin/views/attribute_set_detail/view.html.php create mode 100644 component/admin/views/attributeprices/index.html create mode 100644 component/admin/views/attributeprices/tmpl/default.php create mode 100644 component/admin/views/attributeprices/tmpl/index.html create mode 100644 component/admin/views/attributeprices/view.html.php create mode 100644 component/admin/views/attributeprices_detail/index.html create mode 100644 component/admin/views/attributeprices_detail/tmpl/default.php create mode 100644 component/admin/views/attributeprices_detail/tmpl/index.html create mode 100644 component/admin/views/attributeprices_detail/view.html.php create mode 100644 component/admin/views/attributes/index.html create mode 100644 component/admin/views/attributes/tmpl/default.php create mode 100644 component/admin/views/attributes/tmpl/index.html create mode 100644 component/admin/views/attributes/view.html.php create mode 100644 component/admin/views/catalog/index.html create mode 100644 component/admin/views/catalog/tmpl/edit.php create mode 100644 component/admin/views/catalog/tmpl/index.html create mode 100644 component/admin/views/catalog/view.html.php create mode 100644 component/admin/views/catalog_request/index.html create mode 100644 component/admin/views/catalog_request/tmpl/default.php create mode 100644 component/admin/views/catalog_request/tmpl/index.html create mode 100644 component/admin/views/catalog_request/view.html.php create mode 100644 component/admin/views/catalogs/index.html create mode 100644 component/admin/views/catalogs/tmpl/default.php create mode 100644 component/admin/views/catalogs/tmpl/index.html create mode 100644 component/admin/views/catalogs/view.html.php create mode 100644 component/admin/views/categories/index.html create mode 100644 component/admin/views/categories/tmpl/default.php create mode 100644 component/admin/views/categories/tmpl/index.html create mode 100644 component/admin/views/categories/view.html.php create mode 100644 component/admin/views/category/index.html create mode 100644 component/admin/views/category/tmpl/edit.php create mode 100644 component/admin/views/category/tmpl/edit_accessory.php create mode 100644 component/admin/views/category/tmpl/edit_extrafield.php create mode 100644 component/admin/views/category/tmpl/edit_information.php create mode 100644 component/admin/views/category/tmpl/edit_product_filter.php create mode 100644 component/admin/views/category/tmpl/edit_seo.php create mode 100644 component/admin/views/category/tmpl/index.html create mode 100644 component/admin/views/category/view.html.php create mode 100644 component/admin/views/configuration/index.html create mode 100644 component/admin/views/configuration/tmpl/default.php create mode 100644 component/admin/views/configuration/tmpl/default_accessory_product.php create mode 100644 component/admin/views/configuration/tmpl/default_cart_settings.php create mode 100644 component/admin/views/configuration/tmpl/default_cart_template_image_setting.php create mode 100644 component/admin/views/configuration/tmpl/default_carttab.php create mode 100644 component/admin/views/configuration/tmpl/default_catalog.php create mode 100644 component/admin/views/configuration/tmpl/default_category.php create mode 100644 component/admin/views/configuration/tmpl/default_category_suffix.php create mode 100644 component/admin/views/configuration/tmpl/default_category_template.php create mode 100644 component/admin/views/configuration/tmpl/default_cattab.php create mode 100644 component/admin/views/configuration/tmpl/default_cattab_nplinks.php create mode 100644 component/admin/views/configuration/tmpl/default_clicktell.php create mode 100644 component/admin/views/configuration/tmpl/default_color_sample.php create mode 100644 component/admin/views/configuration/tmpl/default_comparison_settings.php create mode 100644 component/admin/views/configuration/tmpl/default_dashboard.php create mode 100644 component/admin/views/configuration/tmpl/default_discount.php create mode 100644 component/admin/views/configuration/tmpl/default_discount_mail.php create mode 100644 component/admin/views/configuration/tmpl/default_download.php create mode 100644 component/admin/views/configuration/tmpl/default_economic.php create mode 100644 component/admin/views/configuration/tmpl/default_feature_import_export.php create mode 100644 component/admin/views/configuration/tmpl/default_feature_inline_edit.php create mode 100644 component/admin/views/configuration/tmpl/default_featuretab.php create mode 100644 component/admin/views/configuration/tmpl/default_general.php create mode 100644 component/admin/views/configuration/tmpl/default_general_layout_settings.php create mode 100644 component/admin/views/configuration/tmpl/default_gls.php create mode 100644 component/admin/views/configuration/tmpl/default_image_setting.php create mode 100644 component/admin/views/configuration/tmpl/default_images_giftcard.php create mode 100644 component/admin/views/configuration/tmpl/default_integration.php create mode 100644 component/admin/views/configuration/tmpl/default_manufacturer_image_setting.php create mode 100644 component/admin/views/configuration/tmpl/default_manufacturer_setting.php create mode 100644 component/admin/views/configuration/tmpl/default_manufacturertab.php create mode 100644 component/admin/views/configuration/tmpl/default_menuhide.php create mode 100644 component/admin/views/configuration/tmpl/default_modules.php create mode 100644 component/admin/views/configuration/tmpl/default_newslettertab.php create mode 100644 component/admin/views/configuration/tmpl/default_ordertab.php create mode 100644 component/admin/views/configuration/tmpl/default_payment_ship_secure.php create mode 100644 component/admin/views/configuration/tmpl/default_postdk.php create mode 100644 component/admin/views/configuration/tmpl/default_price.php create mode 100644 component/admin/views/configuration/tmpl/default_pricetab.php create mode 100644 component/admin/views/configuration/tmpl/default_procat_images.php create mode 100644 component/admin/views/configuration/tmpl/default_product_general.php create mode 100644 component/admin/views/configuration/tmpl/default_product_template_image_settings.php create mode 100644 component/admin/views/configuration/tmpl/default_product_unit.php create mode 100644 component/admin/views/configuration/tmpl/default_producttab.php create mode 100644 component/admin/views/configuration/tmpl/default_rating_settings.php create mode 100644 component/admin/views/configuration/tmpl/default_redshop_modules.php create mode 100644 component/admin/views/configuration/tmpl/default_redshop_plugins.php create mode 100644 component/admin/views/configuration/tmpl/default_redshop_shipping.php create mode 100644 component/admin/views/configuration/tmpl/default_redshopabout.php create mode 100644 component/admin/views/configuration/tmpl/default_registration.php create mode 100644 component/admin/views/configuration/tmpl/default_related_product.php create mode 100644 component/admin/views/configuration/tmpl/default_resettemplate.php create mode 100644 component/admin/views/configuration/tmpl/default_seo.php create mode 100644 component/admin/views/configuration/tmpl/default_seo_category.php create mode 100644 component/admin/views/configuration/tmpl/default_seo_general.php create mode 100644 component/admin/views/configuration/tmpl/default_seo_manufacturer.php create mode 100644 component/admin/views/configuration/tmpl/default_seo_product.php create mode 100644 component/admin/views/configuration/tmpl/default_settings.php create mode 100644 component/admin/views/configuration/tmpl/default_shopper_group.php create mode 100644 component/admin/views/configuration/tmpl/default_stockroom_settings.php create mode 100644 component/admin/views/configuration/tmpl/default_system_information.php create mode 100644 component/admin/views/configuration/tmpl/default_user.php create mode 100644 component/admin/views/configuration/tmpl/default_vat.php create mode 100644 component/admin/views/configuration/tmpl/default_wishlist_settings.php create mode 100644 component/admin/views/configuration/tmpl/default_wrapping.php create mode 100644 component/admin/views/configuration/tmpl/index.html create mode 100644 component/admin/views/configuration/view.html.php create mode 100644 component/admin/views/countries/index.html create mode 100644 component/admin/views/countries/tmpl/default.php create mode 100644 component/admin/views/countries/tmpl/index.html create mode 100644 component/admin/views/countries/view.html.php create mode 100644 component/admin/views/country/index.html create mode 100644 component/admin/views/country/tmpl/edit.php create mode 100644 component/admin/views/country/tmpl/index.html create mode 100644 component/admin/views/country/view.html.php create mode 100644 component/admin/views/coupon/index.html create mode 100644 component/admin/views/coupon/tmpl/edit.php create mode 100644 component/admin/views/coupon/tmpl/index.html create mode 100644 component/admin/views/coupon/view.html.php create mode 100644 component/admin/views/coupons/index.html create mode 100644 component/admin/views/coupons/tmpl/default.php create mode 100644 component/admin/views/coupons/tmpl/index.html create mode 100644 component/admin/views/coupons/view.html.php create mode 100644 component/admin/views/currencies/index.html create mode 100644 component/admin/views/currencies/tmpl/default.php create mode 100644 component/admin/views/currencies/tmpl/index.html create mode 100644 component/admin/views/currencies/view.html.php create mode 100644 component/admin/views/currency/index.html create mode 100644 component/admin/views/currency/tmpl/edit.php create mode 100644 component/admin/views/currency/tmpl/index.html create mode 100644 component/admin/views/currency/view.html.php create mode 100644 component/admin/views/discount/index.html create mode 100644 component/admin/views/discount/tmpl/edit.php create mode 100644 component/admin/views/discount/tmpl/index.html create mode 100644 component/admin/views/discount/view.html.php create mode 100644 component/admin/views/discount_product/index.html create mode 100644 component/admin/views/discount_product/tmpl/edit.php create mode 100644 component/admin/views/discount_product/tmpl/index.html create mode 100644 component/admin/views/discount_product/view.html.php create mode 100644 component/admin/views/discount_products/index.html create mode 100644 component/admin/views/discount_products/tmpl/default.php create mode 100644 component/admin/views/discount_products/tmpl/index.html create mode 100644 component/admin/views/discount_products/view.html.php create mode 100644 component/admin/views/discounts/index.html create mode 100644 component/admin/views/discounts/tmpl/default.php create mode 100644 component/admin/views/discounts/tmpl/index.html create mode 100644 component/admin/views/discounts/view.html.php create mode 100644 component/admin/views/export/index.html create mode 100755 component/admin/views/export/tmpl/default.php create mode 100644 component/admin/views/export/tmpl/index.html create mode 100644 component/admin/views/export/view.html.php create mode 100755 component/admin/views/field/index.html create mode 100755 component/admin/views/field/tmpl/edit.php create mode 100755 component/admin/views/field/tmpl/index.html create mode 100755 component/admin/views/field/view.html.php create mode 100644 component/admin/views/field_group/index.html create mode 100644 component/admin/views/field_group/tmpl/edit.php create mode 100644 component/admin/views/field_group/tmpl/index.html create mode 100644 component/admin/views/field_group/view.html.php create mode 100644 component/admin/views/field_groups/index.html create mode 100644 component/admin/views/field_groups/tmpl/default.php create mode 100644 component/admin/views/field_groups/tmpl/index.html create mode 100644 component/admin/views/field_groups/view.html.php create mode 100644 component/admin/views/fields/index.html create mode 100644 component/admin/views/fields/tmpl/default.php create mode 100644 component/admin/views/fields/tmpl/index.html create mode 100644 component/admin/views/fields/view.html.php create mode 100644 component/admin/views/giftcard/index.html create mode 100644 component/admin/views/giftcard/tmpl/edit.php create mode 100644 component/admin/views/giftcard/tmpl/index.html create mode 100644 component/admin/views/giftcard/view.html.php create mode 100644 component/admin/views/giftcards/index.html create mode 100644 component/admin/views/giftcards/tmpl/default.php create mode 100644 component/admin/views/giftcards/tmpl/index.html create mode 100644 component/admin/views/giftcards/view.html.php create mode 100644 component/admin/views/import/index.html create mode 100755 component/admin/views/import/tmpl/default.php create mode 100644 component/admin/views/import/tmpl/index.html create mode 100644 component/admin/views/import/view.html.php create mode 100644 component/admin/views/import_vm/index.html create mode 100644 component/admin/views/import_vm/tmpl/default.php create mode 100644 component/admin/views/import_vm/tmpl/index.html create mode 100644 component/admin/views/import_vm/view.html.php create mode 100644 component/admin/views/index.html create mode 100644 component/admin/views/install/index.html create mode 100644 component/admin/views/install/tmpl/default.php create mode 100644 component/admin/views/install/tmpl/index.html create mode 100644 component/admin/views/install/view.html.php create mode 100644 component/admin/views/mail/index.html create mode 100644 component/admin/views/mail/tmpl/edit.php create mode 100644 component/admin/views/mail/tmpl/edit_hints.php create mode 100644 component/admin/views/mail/tmpl/index.html create mode 100644 component/admin/views/mail/view.html.php create mode 100644 component/admin/views/mails/index.html create mode 100644 component/admin/views/mails/tmpl/default.php create mode 100644 component/admin/views/mails/tmpl/index.html create mode 100644 component/admin/views/mails/view.html.php create mode 100644 component/admin/views/manufacturer/index.html create mode 100644 component/admin/views/manufacturer/tmpl/edit.php create mode 100644 component/admin/views/manufacturer/tmpl/index.html create mode 100644 component/admin/views/manufacturer/view.html.php create mode 100644 component/admin/views/manufacturers/index.html create mode 100644 component/admin/views/manufacturers/tmpl/default.php create mode 100644 component/admin/views/manufacturers/tmpl/index.html create mode 100644 component/admin/views/manufacturers/view.html.php create mode 100644 component/admin/views/mass_discount/index.html create mode 100644 component/admin/views/mass_discount/tmpl/edit.php create mode 100644 component/admin/views/mass_discount/tmpl/index.html create mode 100644 component/admin/views/mass_discount/view.html.php create mode 100644 component/admin/views/mass_discounts/index.html create mode 100644 component/admin/views/mass_discounts/tmpl/default.php create mode 100644 component/admin/views/mass_discounts/tmpl/index.html create mode 100644 component/admin/views/mass_discounts/view.html.php create mode 100644 component/admin/views/media/index.html create mode 100644 component/admin/views/media/tmpl/additionalfile.php create mode 100644 component/admin/views/media/tmpl/default.php create mode 100644 component/admin/views/media/tmpl/index.html create mode 100644 component/admin/views/media/tmpl/thumbs.php create mode 100644 component/admin/views/media/tmpl/thumbs_doc.php create mode 100644 component/admin/views/media/tmpl/thumbs_folder.php create mode 100644 component/admin/views/media/tmpl/thumbs_img.php create mode 100644 component/admin/views/media/tmpl/thumbs_up.php create mode 100644 component/admin/views/media/view.html.php create mode 100644 component/admin/views/media_detail/index.html create mode 100644 component/admin/views/media_detail/tmpl/default.php create mode 100644 component/admin/views/media_detail/tmpl/index.html create mode 100644 component/admin/views/media_detail/view.html.php create mode 100644 component/admin/views/newsletter/index.html create mode 100644 component/admin/views/newsletter/tmpl/default.php create mode 100644 component/admin/views/newsletter/tmpl/index.html create mode 100644 component/admin/views/newsletter/tmpl/preview.php create mode 100644 component/admin/views/newsletter/tmpl/previewlog.php create mode 100644 component/admin/views/newsletter/view.html.php create mode 100644 component/admin/views/newsletter/view.preview.php create mode 100644 component/admin/views/newsletter_detail/index.html create mode 100644 component/admin/views/newsletter_detail/tmpl/default.php create mode 100644 component/admin/views/newsletter_detail/tmpl/index.html create mode 100644 component/admin/views/newsletter_detail/tmpl/statistics.php create mode 100644 component/admin/views/newsletter_detail/view.html.php create mode 100644 component/admin/views/newslettersubscr/index.html create mode 100644 component/admin/views/newslettersubscr/tmpl/default.php create mode 100644 component/admin/views/newslettersubscr/tmpl/index.html create mode 100644 component/admin/views/newslettersubscr/view.html.php create mode 100644 component/admin/views/newslettersubscr_detail/index.html create mode 100644 component/admin/views/newslettersubscr_detail/tmpl/default.php create mode 100644 component/admin/views/newslettersubscr_detail/tmpl/index.html create mode 100644 component/admin/views/newslettersubscr_detail/view.html.php create mode 100644 component/admin/views/opsearch/index.html create mode 100644 component/admin/views/opsearch/tmpl/default.php create mode 100644 component/admin/views/opsearch/tmpl/index.html create mode 100644 component/admin/views/opsearch/view.html.php create mode 100644 component/admin/views/order/index.html create mode 100644 component/admin/views/order/tmpl/batch.php create mode 100644 component/admin/views/order/tmpl/default.php create mode 100644 component/admin/views/order/tmpl/index.html create mode 100644 component/admin/views/order/tmpl/labellisting.php create mode 100644 component/admin/views/order/view.html.php create mode 100644 component/admin/views/order_detail/index.html create mode 100644 component/admin/views/order_detail/tmpl/billing.php create mode 100644 component/admin/views/order_detail/tmpl/ccdetail.php create mode 100644 component/admin/views/order_detail/tmpl/creditcardpayment.php create mode 100644 component/admin/views/order_detail/tmpl/default.php create mode 100644 component/admin/views/order_detail/tmpl/default_plugin.php create mode 100644 component/admin/views/order_detail/tmpl/default_shipping.php create mode 100644 component/admin/views/order_detail/tmpl/index.html create mode 100644 component/admin/views/order_detail/tmpl/print_order.php create mode 100644 component/admin/views/order_detail/tmpl/shipping.php create mode 100644 component/admin/views/order_detail/view.html.php create mode 100644 component/admin/views/order_detail/view.pdf.php create mode 100644 component/admin/views/order_detail/view.stocknotepdf.php create mode 100644 component/admin/views/order_status/index.html create mode 100644 component/admin/views/order_status/tmpl/edit.php create mode 100644 component/admin/views/order_status/tmpl/index.html create mode 100644 component/admin/views/order_status/view.html.php create mode 100644 component/admin/views/order_statuses/index.html create mode 100644 component/admin/views/order_statuses/tmpl/default.php create mode 100644 component/admin/views/order_statuses/tmpl/index.html create mode 100644 component/admin/views/order_statuses/view.html.php create mode 100644 component/admin/views/prices/index.html create mode 100644 component/admin/views/prices/tmpl/default.php create mode 100644 component/admin/views/prices/tmpl/index.html create mode 100644 component/admin/views/prices/view.html.php create mode 100644 component/admin/views/prices_detail/index.html create mode 100644 component/admin/views/prices_detail/tmpl/default.php create mode 100644 component/admin/views/prices_detail/tmpl/index.html create mode 100644 component/admin/views/prices_detail/view.html.php create mode 100644 component/admin/views/product/index.html create mode 100644 component/admin/views/product/tmpl/default.php create mode 100644 component/admin/views/product/tmpl/element.php create mode 100644 component/admin/views/product/tmpl/importattribute.php create mode 100644 component/admin/views/product/tmpl/importproduct.php create mode 100644 component/admin/views/product/tmpl/index.html create mode 100644 component/admin/views/product/tmpl/ins_product.php create mode 100644 component/admin/views/product/tmpl/listing.php create mode 100644 component/admin/views/product/view.html.php create mode 100644 component/admin/views/product_attribute_price/index.html create mode 100644 component/admin/views/product_attribute_price/tmpl/default.php create mode 100644 component/admin/views/product_attribute_price/tmpl/index.html create mode 100644 component/admin/views/product_attribute_price/view.html.php create mode 100644 component/admin/views/product_category/index.html create mode 100644 component/admin/views/product_category/tmpl/default.php create mode 100644 component/admin/views/product_category/tmpl/index.html create mode 100644 component/admin/views/product_category/view.html.php create mode 100644 component/admin/views/product_detail/index.html create mode 100644 component/admin/views/product_detail/tmpl/attribute_color.php create mode 100644 component/admin/views/product_detail/tmpl/default.php create mode 100644 component/admin/views/product_detail/tmpl/default_calculator.php create mode 100644 component/admin/views/product_detail/tmpl/default_economic_settings.php create mode 100644 component/admin/views/product_detail/tmpl/default_extrafield.php create mode 100644 component/admin/views/product_detail/tmpl/default_general_data.php create mode 100644 component/admin/views/product_detail/tmpl/default_product_accessory.php create mode 100755 component/admin/views/product_detail/tmpl/default_product_attribute.php create mode 100644 component/admin/views/product_detail/tmpl/default_product_images.php create mode 100644 component/admin/views/product_detail/tmpl/default_product_meta_data.php create mode 100644 component/admin/views/product_detail/tmpl/default_product_payment_method.php create mode 100644 component/admin/views/product_detail/tmpl/default_productfinder.php create mode 100644 component/admin/views/product_detail/tmpl/default_productstockroom.php create mode 100644 component/admin/views/product_detail/tmpl/default_producttype.php create mode 100644 component/admin/views/product_detail/tmpl/default_related.php create mode 100644 component/admin/views/product_detail/tmpl/index.html create mode 100644 component/admin/views/product_detail/tmpl/productstockroom.php create mode 100644 component/admin/views/product_detail/tmpl/property_images.php create mode 100644 component/admin/views/product_detail/view.html.php create mode 100644 component/admin/views/product_price/index.html create mode 100644 component/admin/views/product_price/tmpl/default.php create mode 100644 component/admin/views/product_price/tmpl/index.html create mode 100644 component/admin/views/product_price/view.html.php create mode 100644 component/admin/views/producttags/index.html create mode 100644 component/admin/views/producttags/tmpl/default.php create mode 100644 component/admin/views/producttags/tmpl/index.html create mode 100644 component/admin/views/producttags/view.html.php create mode 100644 component/admin/views/producttags_detail/index.html create mode 100644 component/admin/views/producttags_detail/tmpl/default.php create mode 100644 component/admin/views/producttags_detail/tmpl/index.html create mode 100644 component/admin/views/producttags_detail/view.html.php create mode 100644 component/admin/views/question/index.html create mode 100644 component/admin/views/question/tmpl/edit.php create mode 100644 component/admin/views/question/tmpl/index.html create mode 100644 component/admin/views/question/view.html.php create mode 100644 component/admin/views/questions/index.html create mode 100644 component/admin/views/questions/tmpl/default.php create mode 100644 component/admin/views/questions/tmpl/index.html create mode 100644 component/admin/views/questions/view.html.php create mode 100644 component/admin/views/quotation/index.html create mode 100644 component/admin/views/quotation/tmpl/default.php create mode 100644 component/admin/views/quotation/tmpl/index.html create mode 100644 component/admin/views/quotation/view.csv.php create mode 100644 component/admin/views/quotation/view.html.php create mode 100644 component/admin/views/quotation_detail/index.html create mode 100644 component/admin/views/quotation_detail/tmpl/default.php create mode 100644 component/admin/views/quotation_detail/tmpl/index.html create mode 100644 component/admin/views/quotation_detail/view.html.php create mode 100644 component/admin/views/rating/index.html create mode 100644 component/admin/views/rating/tmpl/default.php create mode 100644 component/admin/views/rating/tmpl/index.html create mode 100644 component/admin/views/rating/view.html.php create mode 100644 component/admin/views/rating_detail/index.html create mode 100644 component/admin/views/rating_detail/tmpl/default.php create mode 100644 component/admin/views/rating_detail/tmpl/index.html create mode 100644 component/admin/views/rating_detail/view.html.php create mode 100644 component/admin/views/redshop/index.html create mode 100644 component/admin/views/redshop/tmpl/default.php create mode 100644 component/admin/views/redshop/tmpl/default_newest_customers.php create mode 100644 component/admin/views/redshop/tmpl/default_newest_orders.php create mode 100644 component/admin/views/redshop/tmpl/default_sales_piechart.php create mode 100644 component/admin/views/redshop/tmpl/index.html create mode 100644 component/admin/views/redshop/tmpl/noconfig.php create mode 100644 component/admin/views/redshop/view.html.php create mode 100644 component/admin/views/sample/index.html create mode 100644 component/admin/views/sample/tmpl/default.php create mode 100644 component/admin/views/sample/tmpl/index.html create mode 100644 component/admin/views/sample/view.html.php create mode 100644 component/admin/views/sample_catalog/index.html create mode 100644 component/admin/views/sample_catalog/tmpl/default.php create mode 100644 component/admin/views/sample_catalog/tmpl/index.html create mode 100644 component/admin/views/sample_catalog/view.html.php create mode 100644 component/admin/views/sample_detail/index.html create mode 100644 component/admin/views/sample_detail/tmpl/default.php create mode 100644 component/admin/views/sample_detail/tmpl/index.html create mode 100644 component/admin/views/sample_detail/view.html.php create mode 100644 component/admin/views/sample_request/index.html create mode 100644 component/admin/views/sample_request/tmpl/default.php create mode 100644 component/admin/views/sample_request/tmpl/index.html create mode 100644 component/admin/views/sample_request/view.html.php create mode 100644 component/admin/views/search/index.html create mode 100644 component/admin/views/search/tmpl/default.php create mode 100644 component/admin/views/search/tmpl/index.html create mode 100644 component/admin/views/search/view.html.php create mode 100644 component/admin/views/shipping/index.html create mode 100644 component/admin/views/shipping/tmpl/default.php create mode 100644 component/admin/views/shipping/tmpl/index.html create mode 100644 component/admin/views/shipping/view.html.php create mode 100644 component/admin/views/shipping_box/index.html create mode 100644 component/admin/views/shipping_box/tmpl/edit.php create mode 100644 component/admin/views/shipping_box/tmpl/index.html create mode 100644 component/admin/views/shipping_box/view.html.php create mode 100644 component/admin/views/shipping_boxes/index.html create mode 100644 component/admin/views/shipping_boxes/tmpl/default.php create mode 100644 component/admin/views/shipping_boxes/tmpl/index.html create mode 100644 component/admin/views/shipping_boxes/view.html.php create mode 100644 component/admin/views/shipping_detail/index.html create mode 100644 component/admin/views/shipping_detail/tmpl/default.php create mode 100644 component/admin/views/shipping_detail/tmpl/default_install.php create mode 100644 component/admin/views/shipping_detail/tmpl/index.html create mode 100644 component/admin/views/shipping_detail/view.html.php create mode 100644 component/admin/views/shipping_rate/index.html create mode 100644 component/admin/views/shipping_rate/tmpl/default.php create mode 100644 component/admin/views/shipping_rate/tmpl/index.html create mode 100644 component/admin/views/shipping_rate/view.html.php create mode 100644 component/admin/views/shipping_rate_detail/index.html create mode 100644 component/admin/views/shipping_rate_detail/tmpl/default.php create mode 100644 component/admin/views/shipping_rate_detail/tmpl/index.html create mode 100644 component/admin/views/shipping_rate_detail/view.html.php create mode 100644 component/admin/views/shopper_group/index.html create mode 100644 component/admin/views/shopper_group/tmpl/default.php create mode 100644 component/admin/views/shopper_group/tmpl/index.html create mode 100644 component/admin/views/shopper_group/view.html.php create mode 100644 component/admin/views/shopper_group_detail/index.html create mode 100644 component/admin/views/shopper_group_detail/tmpl/default.php create mode 100644 component/admin/views/shopper_group_detail/tmpl/index.html create mode 100644 component/admin/views/shopper_group_detail/view.html.php create mode 100644 component/admin/views/state/index.html create mode 100644 component/admin/views/state/tmpl/edit.php create mode 100644 component/admin/views/state/tmpl/index.html create mode 100644 component/admin/views/state/view.html.php create mode 100644 component/admin/views/states/index.html create mode 100644 component/admin/views/states/tmpl/default.php create mode 100644 component/admin/views/states/tmpl/index.html create mode 100644 component/admin/views/states/view.html.php create mode 100644 component/admin/views/statistic/index.html create mode 100644 component/admin/views/statistic/tmpl/amountorder.php create mode 100644 component/admin/views/statistic/tmpl/amountprice.php create mode 100644 component/admin/views/statistic/tmpl/amountspent.php create mode 100644 component/admin/views/statistic/tmpl/avrgorder.php create mode 100644 component/admin/views/statistic/tmpl/bestsell.php create mode 100644 component/admin/views/statistic/tmpl/default.php create mode 100644 component/admin/views/statistic/tmpl/index.html create mode 100644 component/admin/views/statistic/tmpl/neworder.php create mode 100644 component/admin/views/statistic/tmpl/newprod.php create mode 100644 component/admin/views/statistic/tmpl/pageview.php create mode 100644 component/admin/views/statistic/tmpl/popularsell.php create mode 100644 component/admin/views/statistic/tmpl/turnover.php create mode 100644 component/admin/views/statistic/view.html.php create mode 100644 component/admin/views/statistic_customer/index.html create mode 100644 component/admin/views/statistic_customer/tmpl/default.php create mode 100644 component/admin/views/statistic_customer/view.html.php create mode 100644 component/admin/views/statistic_order/index.html create mode 100644 component/admin/views/statistic_order/tmpl/default.php create mode 100644 component/admin/views/statistic_order/view.html.php create mode 100644 component/admin/views/statistic_product/index.html create mode 100644 component/admin/views/statistic_product/tmpl/default.php create mode 100644 component/admin/views/statistic_product/view.html.php create mode 100644 component/admin/views/statistic_quotation/index.html create mode 100644 component/admin/views/statistic_quotation/tmpl/default.php create mode 100644 component/admin/views/statistic_quotation/view.html.php create mode 100644 component/admin/views/statistic_variant/index.html create mode 100644 component/admin/views/statistic_variant/tmpl/default.php create mode 100644 component/admin/views/statistic_variant/view.html.php create mode 100644 component/admin/views/stockimage/index.html create mode 100644 component/admin/views/stockimage/tmpl/default.php create mode 100644 component/admin/views/stockimage/tmpl/index.html create mode 100644 component/admin/views/stockimage/view.html.php create mode 100644 component/admin/views/stockimage_detail/index.html create mode 100644 component/admin/views/stockimage_detail/tmpl/default.php create mode 100644 component/admin/views/stockimage_detail/tmpl/index.html create mode 100644 component/admin/views/stockimage_detail/view.html.php create mode 100644 component/admin/views/stockroom/index.html create mode 100644 component/admin/views/stockroom/tmpl/default.php create mode 100644 component/admin/views/stockroom/tmpl/index.html create mode 100644 component/admin/views/stockroom/view.html.php create mode 100644 component/admin/views/stockroom_detail/index.html create mode 100644 component/admin/views/stockroom_detail/tmpl/default.php create mode 100644 component/admin/views/stockroom_detail/tmpl/importstock.php create mode 100644 component/admin/views/stockroom_detail/tmpl/index.html create mode 100644 component/admin/views/stockroom_detail/view.html.php create mode 100644 component/admin/views/stockroom_listing/index.html create mode 100644 component/admin/views/stockroom_listing/tmpl/default.php create mode 100644 component/admin/views/stockroom_listing/tmpl/index.html create mode 100644 component/admin/views/stockroom_listing/view.csv.php create mode 100644 component/admin/views/stockroom_listing/view.html.php create mode 100644 component/admin/views/supplier/index.html create mode 100644 component/admin/views/supplier/tmpl/edit.php create mode 100644 component/admin/views/supplier/tmpl/index.html create mode 100644 component/admin/views/supplier/view.html.php create mode 100644 component/admin/views/suppliers/index.html create mode 100644 component/admin/views/suppliers/tmpl/default.php create mode 100644 component/admin/views/suppliers/tmpl/index.html create mode 100644 component/admin/views/suppliers/view.html.php create mode 100644 component/admin/views/tax_group/index.html create mode 100644 component/admin/views/tax_group/tmpl/edit.php create mode 100644 component/admin/views/tax_group/tmpl/index.html create mode 100644 component/admin/views/tax_group/view.html.php create mode 100644 component/admin/views/tax_groups/index.html create mode 100644 component/admin/views/tax_groups/tmpl/default.php create mode 100644 component/admin/views/tax_groups/tmpl/index.html create mode 100644 component/admin/views/tax_groups/view.html.php create mode 100644 component/admin/views/tax_rate/index.html create mode 100644 component/admin/views/tax_rate/tmpl/edit.php create mode 100644 component/admin/views/tax_rate/tmpl/index.html create mode 100644 component/admin/views/tax_rate/view.html.php create mode 100644 component/admin/views/tax_rates/index.html create mode 100644 component/admin/views/tax_rates/tmpl/default.php create mode 100644 component/admin/views/tax_rates/tmpl/index.html create mode 100644 component/admin/views/tax_rates/view.html.php create mode 100644 component/admin/views/template/index.html create mode 100644 component/admin/views/template/tmpl/edit.php create mode 100644 component/admin/views/template/tmpl/edit_hints.php create mode 100644 component/admin/views/template/tmpl/index.html create mode 100644 component/admin/views/template/view.html.php create mode 100644 component/admin/views/templates/index.html create mode 100644 component/admin/views/templates/tmpl/default.php create mode 100644 component/admin/views/templates/tmpl/index.html create mode 100644 component/admin/views/templates/view.html.php create mode 100644 component/admin/views/text/index.html create mode 100644 component/admin/views/text/tmpl/edit.php create mode 100644 component/admin/views/text/tmpl/index.html create mode 100644 component/admin/views/text/view.html.php create mode 100644 component/admin/views/texts/index.html create mode 100644 component/admin/views/texts/tmpl/default.php create mode 100644 component/admin/views/texts/tmpl/index.html create mode 100644 component/admin/views/texts/view.html.php create mode 100644 component/admin/views/tool_image/index.html create mode 100644 component/admin/views/tool_image/tmpl/default.php create mode 100644 component/admin/views/tool_image/tmpl/index.html create mode 100644 component/admin/views/tool_image/view.html.php create mode 100644 component/admin/views/tool_update/index.html create mode 100644 component/admin/views/tool_update/tmpl/default.php create mode 100644 component/admin/views/tool_update/tmpl/index.html create mode 100644 component/admin/views/tool_update/view.html.php create mode 100644 component/admin/views/user/index.html create mode 100644 component/admin/views/user/tmpl/default.php create mode 100644 component/admin/views/user/tmpl/index.html create mode 100644 component/admin/views/user/tmpl/user_sync.php create mode 100644 component/admin/views/user/view.html.php create mode 100644 component/admin/views/user_detail/index.html create mode 100644 component/admin/views/user_detail/tmpl/default.php create mode 100644 component/admin/views/user_detail/tmpl/default_billing.php create mode 100644 component/admin/views/user_detail/tmpl/default_order.php create mode 100644 component/admin/views/user_detail/tmpl/default_shipping.php create mode 100644 component/admin/views/user_detail/tmpl/default_user.php create mode 100644 component/admin/views/user_detail/tmpl/index.html create mode 100644 component/admin/views/user_detail/view.html.php create mode 100644 component/admin/views/voucher/index.html create mode 100644 component/admin/views/voucher/tmpl/edit.php create mode 100644 component/admin/views/voucher/tmpl/index.html create mode 100644 component/admin/views/voucher/view.html.php create mode 100644 component/admin/views/vouchers/index.html create mode 100644 component/admin/views/vouchers/tmpl/default.php create mode 100644 component/admin/views/vouchers/tmpl/index.html create mode 100644 component/admin/views/vouchers/view.html.php create mode 100644 component/admin/views/wizard/index.html create mode 100644 component/admin/views/wizard/tmpl/default.php create mode 100644 component/admin/views/wizard/tmpl/finish.php create mode 100644 component/admin/views/wizard/tmpl/general.php create mode 100644 component/admin/views/wizard/tmpl/index.html create mode 100644 component/admin/views/wizard/tmpl/price.php create mode 100644 component/admin/views/wizard/tmpl/price_discount.php create mode 100644 component/admin/views/wizard/tmpl/price_price.php create mode 100644 component/admin/views/wizard/tmpl/price_vat.php create mode 100644 component/admin/views/wizard/tmpl/terms.php create mode 100644 component/admin/views/wizard/tmpl/user.php create mode 100644 component/admin/views/wizard/tmpl/user_registration.php create mode 100644 component/admin/views/wizard/tmpl/user_shopper_group.php create mode 100644 component/admin/views/wizard/tmpl/welcome.php create mode 100644 component/admin/views/wizard/view.html.php create mode 100644 component/admin/views/wrapper/index.html create mode 100644 component/admin/views/wrapper/tmpl/default.php create mode 100644 component/admin/views/wrapper/tmpl/index.html create mode 100644 component/admin/views/wrapper/view.html.php create mode 100644 component/admin/views/wrapper_detail/index.html create mode 100644 component/admin/views/wrapper_detail/tmpl/default.php create mode 100644 component/admin/views/wrapper_detail/tmpl/index.html create mode 100644 component/admin/views/wrapper_detail/view.html.php create mode 100644 component/admin/views/xmlexport/index.html create mode 100644 component/admin/views/xmlexport/tmpl/default.php create mode 100644 component/admin/views/xmlexport/tmpl/index.html create mode 100644 component/admin/views/xmlexport/view.html.php create mode 100644 component/admin/views/xmlexport_detail/index.html create mode 100644 component/admin/views/xmlexport_detail/tmpl/default.php create mode 100644 component/admin/views/xmlexport_detail/tmpl/elementdetail.php create mode 100644 component/admin/views/xmlexport_detail/tmpl/index.html create mode 100644 component/admin/views/xmlexport_detail/view.html.php create mode 100644 component/admin/views/xmlimport/index.html create mode 100644 component/admin/views/xmlimport/tmpl/default.php create mode 100644 component/admin/views/xmlimport/tmpl/index.html create mode 100644 component/admin/views/xmlimport/view.html.php create mode 100644 component/admin/views/xmlimport_detail/index.html create mode 100644 component/admin/views/xmlimport_detail/tmpl/default.php create mode 100644 component/admin/views/xmlimport_detail/tmpl/index.html create mode 100644 component/admin/views/xmlimport_detail/view.html.php create mode 100644 component/admin/views/zip_import/index.html create mode 100644 component/admin/views/zip_import/tmpl/confirmupdate.php create mode 100644 component/admin/views/zip_import/tmpl/default.php create mode 100644 component/admin/views/zip_import/tmpl/index.html create mode 100644 component/admin/views/zip_import/view.html.php create mode 100644 component/admin/views/zipcode/index.html create mode 100644 component/admin/views/zipcode/tmpl/edit.php create mode 100644 component/admin/views/zipcode/tmpl/index.html create mode 100644 component/admin/views/zipcode/view.html.php create mode 100644 component/admin/views/zipcodes/index.html create mode 100644 component/admin/views/zipcodes/tmpl/default.php create mode 100644 component/admin/views/zipcodes/tmpl/index.html create mode 100644 component/admin/views/zipcodes/view.html.php create mode 100644 component/site/assets/document/catalog/index.html create mode 100644 component/site/assets/document/category/thumb/index.html create mode 100644 component/site/assets/document/consignor_label/index.html create mode 100644 component/site/assets/document/extrafields/index.html create mode 100644 component/site/assets/document/gbase/index.html create mode 100644 component/site/assets/document/index.html create mode 100644 component/site/assets/document/invoice/index.html create mode 100644 component/site/assets/document/product/index.html create mode 100644 component/site/assets/document/product/thumb/index.html create mode 100644 component/site/assets/download/product/index.html create mode 100644 component/site/assets/images/account/business-icon.jpg create mode 100644 component/site/assets/images/account/coupon.jpg create mode 100644 component/site/assets/images/account/home.jpg create mode 100644 component/site/assets/images/account/logout.jpg create mode 100644 component/site/assets/images/account/order.jpg create mode 100644 component/site/assets/images/account/personal-icon.jpg create mode 100644 component/site/assets/images/account/reviews.jpg create mode 100644 component/site/assets/images/add-to-cart_blue.gif create mode 100644 component/site/assets/images/addtowishlist.jpeg create mode 100644 component/site/assets/images/barcode/index.html create mode 100644 component/site/assets/images/checkout/blue.jpg create mode 100644 component/site/assets/images/checkout/dinnersclub.jpg create mode 100644 component/site/assets/images/checkout/discover.jpg create mode 100644 component/site/assets/images/checkout/jcb.jpg create mode 100644 component/site/assets/images/checkout/master.jpg create mode 100644 component/site/assets/images/checkout/mastero.jpg create mode 100644 component/site/assets/images/checkout/one.jpg create mode 100644 component/site/assets/images/checkout/one_on.jpg create mode 100644 component/site/assets/images/checkout/three.jpg create mode 100644 component/site/assets/images/checkout/three_on.jpg create mode 100644 component/site/assets/images/checkout/two.jpg create mode 100644 component/site/assets/images/checkout/two_on.jpg create mode 100644 component/site/assets/images/checkout/visa.jpg create mode 100644 component/site/assets/images/cross.png create mode 100644 component/site/assets/images/defaultcross.png create mode 100644 component/site/assets/images/defaultupdate.png create mode 100644 component/site/assets/images/down.png create mode 100644 component/site/assets/images/e-conomic.jpg create mode 100644 component/site/assets/images/index.html create mode 100644 component/site/assets/images/laegikurv.gif create mode 100644 component/site/assets/images/laegikurven.jpg create mode 100644 component/site/assets/images/left.png create mode 100644 component/site/assets/images/leftarrow.jpg create mode 100644 component/site/assets/images/loading.gif create mode 100644 component/site/assets/images/media/index.html create mode 100644 component/site/assets/images/mergeImages/index.html create mode 100644 component/site/assets/images/noimage.jpg create mode 100644 component/site/assets/images/preloader.jpeg create mode 100644 component/site/assets/images/pricebar_selector.png create mode 100644 component/site/assets/images/printer-icon.png create mode 100644 component/site/assets/images/product/1262876429_redEVENT-box.jpg create mode 100644 component/site/assets/images/product/1262876620_redEVENT-box.jpg create mode 100644 component/site/assets/images/product/1262876640_redFORM-box.jpg create mode 100644 component/site/assets/images/product/1262876656_redCOMPETITION-box.jpg create mode 100644 component/site/assets/images/product/1262876675_redVMPRODUCTFINDER-box.jpg create mode 100644 component/site/assets/images/product/1262876700_redARTICLEFINDER-box.jpg create mode 100644 component/site/assets/images/product/1262876715_redLINKER-box.jpg create mode 100644 component/site/assets/images/product/1262876737_redVMMASSCART-box.jpg create mode 100644 component/site/assets/images/product/1262876765_redNEWSTAB-box.jpg create mode 100644 component/site/assets/images/product/1262876791_redPLUGINS-box.jpg create mode 100644 component/site/assets/images/product/1262876810_redPLUGINS-box.jpg create mode 100644 component/site/assets/images/product/1262876827_redPLUGINS-box.jpg create mode 100644 component/site/assets/images/product/1262876844_redPLUGINS-box.jpg create mode 100644 component/site/assets/images/product/1262876869_redCOMPONENTS.jpg create mode 100644 component/site/assets/images/product/1265986712_globus.gif create mode 100644 component/site/assets/images/product/1421054444_bakery-demo-400-400.jpg create mode 100644 component/site/assets/images/product/1421054762_carpenter-demo-400-400.jpg create mode 100644 component/site/assets/images/product/1421055027_fashionstore-demo-400-400.jpg create mode 100644 component/site/assets/images/product/1421055222_gadgets-demo-400-400.jpg create mode 100644 component/site/assets/images/product/1421055392_kidswear-demo-400-400.jpg create mode 100644 component/site/assets/images/product/1421055573_shoemaniac-demo-400-400.jpg create mode 100644 component/site/assets/images/product/1421055894_valentine-demo-400-400.jpg create mode 100644 component/site/assets/images/product/1421064966_appearance-top.png create mode 100644 component/site/assets/images/product/redCOMPONENTS.jpg create mode 100644 component/site/assets/images/product/thumb/index.html create mode 100644 component/site/assets/images/product_attributes/thumb/index.html create mode 100644 component/site/assets/images/property/thumb/index.html create mode 100644 component/site/assets/images/requestquote.png create mode 100644 component/site/assets/images/right.png create mode 100644 component/site/assets/images/rightarrow.jpg create mode 100644 component/site/assets/images/shopperlogo/thumb/index.html create mode 100644 component/site/assets/images/shopping_cart.png create mode 100644 component/site/assets/images/skip-left-1.gif create mode 100644 component/site/assets/images/skip-left-4.gif create mode 100644 component/site/assets/images/skip-right-1.gif create mode 100644 component/site/assets/images/skip-right-4.gif create mode 100644 component/site/assets/images/slimbox/closelabel.gif create mode 100644 component/site/assets/images/slimbox/loading.gif create mode 100644 component/site/assets/images/slimbox/nextlabel.gif create mode 100644 component/site/assets/images/slimbox/prevlabel.gif create mode 100644 component/site/assets/images/spacer.gif create mode 100644 component/site/assets/images/stockroom/icon_lock.gif create mode 100644 component/site/assets/images/stockroom/index.html create mode 100644 component/site/assets/images/subcolor/thumb/index.html create mode 100644 component/site/assets/images/up.png create mode 100644 component/site/assets/images/update.png create mode 100644 component/site/assets/images/watermarked/index.html create mode 100644 component/site/assets/images/wrapper/index.html create mode 100644 component/site/assets/images/wrapper/thumb/index.html create mode 100644 component/site/assets/index.html create mode 100644 component/site/assets/orders/index.html create mode 100644 component/site/assets/video/category/thumb/index.html create mode 100644 component/site/assets/video/index.html create mode 100644 component/site/assets/video/product/thumb/index.html create mode 100644 component/site/assets/xmlfile/export/index.html create mode 100644 component/site/assets/xmlfile/import/index.html create mode 100644 component/site/assets/xmlfile/index.html create mode 100644 component/site/controller.php create mode 100755 component/site/controllers/account.php create mode 100644 component/site/controllers/account_billto.php create mode 100644 component/site/controllers/account_shipto.php create mode 100644 component/site/controllers/ask_question.php create mode 100644 component/site/controllers/cart.php create mode 100644 component/site/controllers/catalog.php create mode 100644 component/site/controllers/category.php create mode 100644 component/site/controllers/checkout.php create mode 100644 component/site/controllers/epayrelay.php create mode 100644 component/site/controllers/giftcard.php create mode 100644 component/site/controllers/index.html create mode 100644 component/site/controllers/login.php create mode 100644 component/site/controllers/manufacturers.php create mode 100644 component/site/controllers/newsletter.php create mode 100644 component/site/controllers/order_detail.php create mode 100644 component/site/controllers/orders.php create mode 100644 component/site/controllers/ordertracker.php create mode 100644 component/site/controllers/plugin.php create mode 100644 component/site/controllers/price_filter.raw.php create mode 100644 component/site/controllers/product.php create mode 100644 component/site/controllers/product_mini.php create mode 100644 component/site/controllers/product_rating.php create mode 100644 component/site/controllers/quotation.php create mode 100644 component/site/controllers/quotation_detail.php create mode 100644 component/site/controllers/ratings.php create mode 100644 component/site/controllers/registration.php create mode 100644 component/site/controllers/search.php create mode 100644 component/site/controllers/send_friend.php create mode 100644 component/site/controllers/wishlist.php create mode 100644 component/site/helpers/currency.json create mode 100644 component/site/helpers/currency.xml create mode 100644 component/site/helpers/currencyhelper.php create mode 100644 component/site/helpers/extrafield.php create mode 100644 component/site/helpers/index.html create mode 100644 component/site/helpers/producthelper.php create mode 100644 component/site/helpers/redhelper.php create mode 100644 component/site/helpers/route.php create mode 100644 component/site/helpers/rscarthelper.php create mode 100644 component/site/helpers/rsuserhelper.php create mode 100644 component/site/helpers/statistic.php create mode 100644 component/site/index.html create mode 100755 component/site/language/en-GB/en-GB.com_redshop.ini create mode 100644 component/site/language/en-GB/index.html create mode 100644 component/site/language/index.html create mode 100644 component/site/layouts/assets.php create mode 100644 component/site/layouts/cart/billing.php create mode 100644 component/site/layouts/cart/cart.php create mode 100644 component/site/layouts/cart/index.html create mode 100644 component/site/layouts/cart/shipping.php create mode 100644 component/site/layouts/cart/wizard.php create mode 100644 component/site/layouts/checkout/login.php create mode 100644 component/site/layouts/checkout/onestep/billing.php create mode 100644 component/site/layouts/checkout/payment_radio.php create mode 100644 component/site/layouts/checkout/register.php create mode 100644 component/site/layouts/fields/display.php create mode 100644 component/site/layouts/fields/html.php create mode 100644 component/site/layouts/fields/index.html create mode 100644 component/site/layouts/fields/mail.php create mode 100644 component/site/layouts/filter/index.html create mode 100644 component/site/layouts/filter/restricted.php create mode 100755 component/site/layouts/filter/result.php create mode 100644 component/site/layouts/general/print.php create mode 100644 component/site/layouts/index.html create mode 100644 component/site/layouts/joomla/index.html create mode 100644 component/site/layouts/joomla/pagination/index.html create mode 100644 component/site/layouts/joomla/pagination/link.php create mode 100644 component/site/layouts/mail/billing.php create mode 100644 component/site/layouts/mail/index.html create mode 100644 component/site/layouts/mail/shipping.php create mode 100644 component/site/layouts/order/index.html create mode 100644 component/site/layouts/order/payment/creditcard.php create mode 100644 component/site/layouts/order/payment/extrafields.php create mode 100644 component/site/layouts/order/payment/index.html create mode 100644 component/site/layouts/order/status_log.php create mode 100755 component/site/layouts/pagination/customize.php create mode 100755 component/site/layouts/pagination/customize_link.php create mode 100644 component/site/layouts/pagination/index.html create mode 100644 component/site/layouts/product/ask_question.php create mode 100644 component/site/layouts/product/compare.php create mode 100644 component/site/layouts/product/compare_ajax.php create mode 100644 component/site/layouts/product/index.html create mode 100644 component/site/layouts/product/order_attribute.php create mode 100644 component/site/layouts/product/product_accessory.php create mode 100644 component/site/layouts/product/product_attribute.php create mode 100644 component/site/layouts/product/product_price_table.php create mode 100644 component/site/layouts/product/product_rating.php create mode 100644 component/site/layouts/product/quotation_attribute.php create mode 100644 component/site/layouts/product/rating.php create mode 100644 component/site/layouts/product/stock_amount_image.php create mode 100644 component/site/layouts/product/stockroom_detail.php create mode 100644 component/site/layouts/registration/captcha.php create mode 100644 component/site/layouts/registration/index.html create mode 100755 component/site/models/account.php create mode 100644 component/site/models/account_billto.php create mode 100644 component/site/models/account_shipto.php create mode 100644 component/site/models/ask_question.php create mode 100644 component/site/models/cart.php create mode 100644 component/site/models/catalog.php create mode 100644 component/site/models/category.php create mode 100644 component/site/models/checkout.php create mode 100644 component/site/models/forms/ask_question.xml create mode 100644 component/site/models/forms/index.html create mode 100644 component/site/models/forms/product_rating.xml create mode 100644 component/site/models/giftcard.php create mode 100644 component/site/models/index.html create mode 100644 component/site/models/login.php create mode 100644 component/site/models/manufacturers.php create mode 100644 component/site/models/newsletter.php create mode 100644 component/site/models/order_detail.php create mode 100644 component/site/models/orders.php create mode 100644 component/site/models/ordertracker.php create mode 100644 component/site/models/price_filter.php create mode 100644 component/site/models/product.php create mode 100644 component/site/models/product_mini.php create mode 100644 component/site/models/product_rating.php create mode 100644 component/site/models/quotation.php create mode 100644 component/site/models/quotation_detail.php create mode 100644 component/site/models/ratings.php create mode 100644 component/site/models/registration.php create mode 100644 component/site/models/search.php create mode 100644 component/site/models/send_friend.php create mode 100644 component/site/models/wishlist.php create mode 100644 component/site/redshop.php create mode 100644 component/site/router.php create mode 100644 component/site/views/account/index.html create mode 100644 component/site/views/account/tmpl/cards.php create mode 100644 component/site/views/account/tmpl/cards.xml create mode 100755 component/site/views/account/tmpl/default.php create mode 100644 component/site/views/account/tmpl/default.xml create mode 100644 component/site/views/account/tmpl/index.html create mode 100644 component/site/views/account/tmpl/mytags.php create mode 100644 component/site/views/account/tmpl/mywishlist.php create mode 100644 component/site/views/account/tmpl/mywishlist.xml create mode 100644 component/site/views/account/view.html.php create mode 100644 component/site/views/account_billto/index.html create mode 100644 component/site/views/account_billto/tmpl/default.php create mode 100644 component/site/views/account_billto/tmpl/index.html create mode 100644 component/site/views/account_billto/view.html.php create mode 100644 component/site/views/account_shipto/index.html create mode 100755 component/site/views/account_shipto/tmpl/default.php create mode 100644 component/site/views/account_shipto/tmpl/form.php create mode 100644 component/site/views/account_shipto/tmpl/index.html create mode 100644 component/site/views/account_shipto/view.html.php create mode 100644 component/site/views/ask_question/index.html create mode 100644 component/site/views/ask_question/tmpl/default.php create mode 100644 component/site/views/ask_question/tmpl/index.html create mode 100644 component/site/views/ask_question/view.html.php create mode 100644 component/site/views/cart/index.html create mode 100644 component/site/views/cart/tmpl/change_attribute.php create mode 100644 component/site/views/cart/tmpl/default.php create mode 100644 component/site/views/cart/tmpl/default.xml create mode 100644 component/site/views/cart/tmpl/index.html create mode 100644 component/site/views/cart/view.html.php create mode 100644 component/site/views/catalog/index.html create mode 100644 component/site/views/catalog/tmpl/default.php create mode 100644 component/site/views/catalog/tmpl/default.xml create mode 100644 component/site/views/catalog/tmpl/index.html create mode 100644 component/site/views/catalog/tmpl/sample.php create mode 100644 component/site/views/catalog/tmpl/sample.xml create mode 100644 component/site/views/catalog/view.html.php create mode 100644 component/site/views/category/index.html create mode 100644 component/site/views/category/tmpl/categoryproduct.php create mode 100644 component/site/views/category/tmpl/categoryproduct.xml create mode 100644 component/site/views/category/tmpl/default.php create mode 100644 component/site/views/category/tmpl/default.xml create mode 100644 component/site/views/category/tmpl/detail.php create mode 100644 component/site/views/category/tmpl/detail.xml create mode 100644 component/site/views/category/tmpl/index.html create mode 100644 component/site/views/category/tmpl/notfound.php create mode 100644 component/site/views/category/view.html.php create mode 100644 component/site/views/checkout/index.html create mode 100644 component/site/views/checkout/tmpl/default.php create mode 100644 component/site/views/checkout/tmpl/default.xml create mode 100644 component/site/views/checkout/tmpl/default_address.php create mode 100644 component/site/views/checkout/tmpl/default_billing.php create mode 100644 component/site/views/checkout/tmpl/default_billing_crm.php create mode 100644 component/site/views/checkout/tmpl/default_checkoutnext.php create mode 100644 component/site/views/checkout/tmpl/default_payment.php create mode 100644 component/site/views/checkout/tmpl/default_shipping.php create mode 100644 component/site/views/checkout/tmpl/index.html create mode 100644 component/site/views/checkout/tmpl/onestepcheckout.php create mode 100644 component/site/views/checkout/view.html.php create mode 100644 component/site/views/checkout/view.next.php create mode 100644 component/site/views/giftcard/index.html create mode 100644 component/site/views/giftcard/tmpl/default.php create mode 100644 component/site/views/giftcard/tmpl/default.xml create mode 100644 component/site/views/giftcard/tmpl/index.html create mode 100644 component/site/views/giftcard/view.html.php create mode 100644 component/site/views/index.html create mode 100644 component/site/views/login/index.html create mode 100644 component/site/views/login/tmpl/default.php create mode 100644 component/site/views/login/tmpl/default.xml create mode 100644 component/site/views/login/tmpl/index.html create mode 100644 component/site/views/login/tmpl/logout.php create mode 100644 component/site/views/login/tmpl/logout.xml create mode 100644 component/site/views/login/tmpl/portal.php create mode 100644 component/site/views/login/tmpl/portal.xml create mode 100644 component/site/views/login/tmpl/portals.php create mode 100644 component/site/views/login/tmpl/portals.xml create mode 100644 component/site/views/login/view.html.php create mode 100644 component/site/views/manufacturers/index.html create mode 100644 component/site/views/manufacturers/tmpl/default.php create mode 100644 component/site/views/manufacturers/tmpl/default.xml create mode 100644 component/site/views/manufacturers/tmpl/default_detail.php create mode 100644 component/site/views/manufacturers/tmpl/detail.php create mode 100644 component/site/views/manufacturers/tmpl/detail.xml create mode 100644 component/site/views/manufacturers/tmpl/index.html create mode 100644 component/site/views/manufacturers/tmpl/products.php create mode 100644 component/site/views/manufacturers/tmpl/products.xml create mode 100644 component/site/views/manufacturers/view.html.php create mode 100644 component/site/views/newsletter/index.html create mode 100644 component/site/views/newsletter/tmpl/default.php create mode 100644 component/site/views/newsletter/tmpl/default.xml create mode 100644 component/site/views/newsletter/tmpl/index.html create mode 100644 component/site/views/newsletter/tmpl/thankyou.php create mode 100644 component/site/views/newsletter/tmpl/thankyou.xml create mode 100644 component/site/views/newsletter/view.html.php create mode 100644 component/site/views/order_detail/index.html create mode 100644 component/site/views/order_detail/tmpl/checkout_final.php create mode 100644 component/site/views/order_detail/tmpl/default.php create mode 100644 component/site/views/order_detail/tmpl/index.html create mode 100644 component/site/views/order_detail/tmpl/receipt.php create mode 100644 component/site/views/order_detail/view.html.php create mode 100644 component/site/views/orders/index.html create mode 100644 component/site/views/orders/tmpl/default.php create mode 100644 component/site/views/orders/tmpl/default.xml create mode 100644 component/site/views/orders/tmpl/index.html create mode 100644 component/site/views/orders/view.html.php create mode 100644 component/site/views/ordertracker/index.html create mode 100644 component/site/views/ordertracker/tmpl/default.php create mode 100644 component/site/views/ordertracker/tmpl/default.xml create mode 100644 component/site/views/ordertracker/tmpl/index.html create mode 100644 component/site/views/ordertracker/view.html.php create mode 100644 component/site/views/plugin/index.html create mode 100644 component/site/views/plugin/tmpl/default.php create mode 100644 component/site/views/plugin/view.html.php create mode 100644 component/site/views/price_filter/index.html create mode 100644 component/site/views/price_filter/tmpl/default.php create mode 100644 component/site/views/price_filter/tmpl/index.html create mode 100644 component/site/views/price_filter/view.raw.php create mode 100644 component/site/views/product/index.html create mode 100644 component/site/views/product/tmpl/compare.php create mode 100644 component/site/views/product/tmpl/compare.xml create mode 100644 component/site/views/product/tmpl/default.php create mode 100644 component/site/views/product/tmpl/default.xml create mode 100644 component/site/views/product/tmpl/default_calculator.php create mode 100644 component/site/views/product/tmpl/default_cartbox.php create mode 100644 component/site/views/product/tmpl/default_related.php create mode 100644 component/site/views/product/tmpl/downloadproduct.php create mode 100644 component/site/views/product/tmpl/downloadproduct.xml create mode 100644 component/site/views/product/tmpl/index.html create mode 100644 component/site/views/product/tmpl/viewajaxdetail.php create mode 100644 component/site/views/product/tmpl/viewwishlist.php create mode 100644 component/site/views/product/view.html.php create mode 100644 component/site/views/product_mini/index.html create mode 100644 component/site/views/product_mini/tmpl/default.php create mode 100644 component/site/views/product_mini/tmpl/index.html create mode 100644 component/site/views/product_mini/view.html.php create mode 100644 component/site/views/product_rating/index.html create mode 100644 component/site/views/product_rating/tmpl/default.php create mode 100644 component/site/views/product_rating/tmpl/default.xml create mode 100644 component/site/views/product_rating/tmpl/index.html create mode 100644 component/site/views/product_rating/view.html.php create mode 100644 component/site/views/quotation/index.html create mode 100644 component/site/views/quotation/tmpl/default.php create mode 100644 component/site/views/quotation/tmpl/default.xml create mode 100644 component/site/views/quotation/tmpl/default_user.php create mode 100644 component/site/views/quotation/tmpl/index.html create mode 100644 component/site/views/quotation/view.html.php create mode 100644 component/site/views/quotation_detail/index.html create mode 100644 component/site/views/quotation_detail/tmpl/default.php create mode 100644 component/site/views/quotation_detail/tmpl/index.html create mode 100644 component/site/views/quotation_detail/view.html.php create mode 100644 component/site/views/ratings/index.html create mode 100644 component/site/views/ratings/tmpl/default.php create mode 100644 component/site/views/ratings/tmpl/index.html create mode 100644 component/site/views/ratings/view.html.php create mode 100644 component/site/views/registration/index.html create mode 100644 component/site/views/registration/tmpl/default.php create mode 100644 component/site/views/registration/tmpl/default.xml create mode 100644 component/site/views/registration/tmpl/index.html create mode 100644 component/site/views/registration/view.html.php create mode 100644 component/site/views/search/index.html create mode 100644 component/site/views/search/tmpl/default.php create mode 100644 component/site/views/search/tmpl/featuredproduct.php create mode 100644 component/site/views/search/tmpl/featuredproduct.xml create mode 100644 component/site/views/search/tmpl/index.html create mode 100644 component/site/views/search/tmpl/newproduct.php create mode 100644 component/site/views/search/tmpl/newproduct.xml create mode 100644 component/site/views/search/tmpl/productonsale.php create mode 100644 component/site/views/search/tmpl/productonsale.xml create mode 100644 component/site/views/search/tmpl/redfilter.php create mode 100644 component/site/views/search/tmpl/redfilter.xml create mode 100644 component/site/views/search/view.html.php create mode 100644 component/site/views/send_friend/index.html create mode 100644 component/site/views/send_friend/tmpl/default.php create mode 100644 component/site/views/send_friend/tmpl/index.html create mode 100644 component/site/views/send_friend/view.html.php create mode 100644 component/site/views/wishlist/index.html create mode 100644 component/site/views/wishlist/tmpl/default.php create mode 100644 component/site/views/wishlist/tmpl/default.xml create mode 100644 component/site/views/wishlist/tmpl/index.html create mode 100644 component/site/views/wishlist/tmpl/viewloginwishlist.php create mode 100644 component/site/views/wishlist/tmpl/viewwishlist.php create mode 100644 component/site/views/wishlist/tmpl/viewwishlist.xml create mode 100644 component/site/views/wishlist/view.html.php create mode 100644 composer.json create mode 100755 composer.phar create mode 100644 crowdin.yml create mode 100644 docs/releases/2.0.7.md create mode 100644 docs/releases/2.1.0.md create mode 100644 gulp-config.json.dist create mode 100644 gulp-config.json.jenkins.dist create mode 100644 gulp-config.sample.json create mode 100644 gulp-extensions.json create mode 100644 gulpfile.js create mode 100644 install.php create mode 100644 jgulp/components/redshop.assets.js create mode 100644 jgulp/components/redshop.js create mode 100644 jgulp/crowdin-conf.js create mode 100644 jgulp/libraries/redshop.js create mode 100644 jgulp/modules/site/redshop_cart.js create mode 100644 jgulp/modules/site/redshop_search.js create mode 100644 jgulp/plugins/finder/redshop.js create mode 100644 jgulp/plugins/quickicon/redshop.js create mode 100644 jgulp/plugins/redshop_alert/alert.js create mode 100644 jgulp/plugins/redshop_export/attribute.js create mode 100644 jgulp/plugins/redshop_export/category.js create mode 100644 jgulp/plugins/redshop_export/field.js create mode 100644 jgulp/plugins/redshop_export/manufacturer.js create mode 100644 jgulp/plugins/redshop_export/newsletter_subscriber.js create mode 100644 jgulp/plugins/redshop_export/product.js create mode 100644 jgulp/plugins/redshop_export/product_stockroom_data.js create mode 100644 jgulp/plugins/redshop_export/related_product.js create mode 100644 jgulp/plugins/redshop_export/shipping_address.js create mode 100644 jgulp/plugins/redshop_export/shopper_group_attribute_price.js create mode 100644 jgulp/plugins/redshop_export/shopper_group_product_price.js create mode 100644 jgulp/plugins/redshop_export/user.js create mode 100644 jgulp/plugins/redshop_import/attribute.js create mode 100644 jgulp/plugins/redshop_import/category.js create mode 100644 jgulp/plugins/redshop_import/field.js create mode 100644 jgulp/plugins/redshop_import/manufacturer.js create mode 100644 jgulp/plugins/redshop_import/newslette_subscriber.js create mode 100644 jgulp/plugins/redshop_import/product.js create mode 100644 jgulp/plugins/redshop_import/product_stockroom_data.js create mode 100644 jgulp/plugins/redshop_import/related_product.js create mode 100644 jgulp/plugins/redshop_import/shipping_address.js create mode 100644 jgulp/plugins/redshop_import/shopper_group_attribute_price.js create mode 100644 jgulp/plugins/redshop_import/shopper_group_product_price.js create mode 100644 jgulp/plugins/redshop_import/user.js create mode 100644 jgulp/plugins/redshop_payment/rs_payment_banktransfer.js create mode 100644 jgulp/plugins/redshop_payment/rs_payment_paypal.js create mode 100644 jgulp/plugins/redshop_pdf/tcpdf.js create mode 100644 jgulp/plugins/redshop_product/sh404urls.js create mode 100644 jgulp/plugins/redshop_shipping/default_shipping.js create mode 100644 jgulp/plugins/search/redshop_categories.js create mode 100644 jgulp/plugins/search/redshop_products.js create mode 100644 jgulp/plugins/sh404sefextplugins/sh404sefextplugincom_redshop.js create mode 100644 jgulp/plugins/system/redgoogleanalytics.js create mode 100644 jgulp/plugins/system/redshop.js create mode 100644 jgulp/release.js create mode 100644 jgulp/tasks/clean.js create mode 100644 jgulp/tasks/copy.js create mode 100644 jgulp/tasks/release/modules.js create mode 100644 jgulp/tasks/release/plugins.js create mode 100644 jgulp/tasks/release/redshop.js create mode 100644 jgulp/tasks/watch.js create mode 100644 libraries/index.html create mode 100644 libraries/redshop/composer.json create mode 100644 libraries/redshop/controller/admin.php create mode 100644 libraries/redshop/controller/admin/base.php create mode 100644 libraries/redshop/controller/admin/index.html create mode 100644 libraries/redshop/controller/controller.php create mode 100644 libraries/redshop/controller/form.php create mode 100644 libraries/redshop/controller/index.html create mode 100644 libraries/redshop/entities/collection.php create mode 100644 libraries/redshop/entities/index.html create mode 100644 libraries/redshop/entity/accessory.php create mode 100644 libraries/redshop/entity/account_group.php create mode 100644 libraries/redshop/entity/attribute.php create mode 100644 libraries/redshop/entity/attribute_price.php create mode 100644 libraries/redshop/entity/attribute_set.php create mode 100644 libraries/redshop/entity/base.php create mode 100644 libraries/redshop/entity/category.php create mode 100644 libraries/redshop/entity/country.php create mode 100644 libraries/redshop/entity/coupon.php create mode 100644 libraries/redshop/entity/coupon_transaction.php create mode 100644 libraries/redshop/entity/currency.php create mode 100644 libraries/redshop/entity/discount.php create mode 100644 libraries/redshop/entity/discount_product.php create mode 100644 libraries/redshop/entity/entity.php create mode 100644 libraries/redshop/entity/field.php create mode 100644 libraries/redshop/entity/field_data.php create mode 100644 libraries/redshop/entity/field_group.php create mode 100644 libraries/redshop/entity/field_value.php create mode 100644 libraries/redshop/entity/giftcard.php create mode 100644 libraries/redshop/entity/index.html create mode 100644 libraries/redshop/entity/mail.php create mode 100644 libraries/redshop/entity/manufacturer.php create mode 100644 libraries/redshop/entity/mass_discount.php create mode 100644 libraries/redshop/entity/media.php create mode 100644 libraries/redshop/entity/media/image.php create mode 100644 libraries/redshop/entity/media/index.html create mode 100644 libraries/redshop/entity/newsletter.php create mode 100644 libraries/redshop/entity/order.php create mode 100644 libraries/redshop/entity/order_item.php create mode 100644 libraries/redshop/entity/order_item_accessory.php create mode 100644 libraries/redshop/entity/order_item_attribute.php create mode 100644 libraries/redshop/entity/order_payment.php create mode 100644 libraries/redshop/entity/order_status.php create mode 100644 libraries/redshop/entity/order_status_log.php create mode 100644 libraries/redshop/entity/order_user.php create mode 100644 libraries/redshop/entity/price.php create mode 100644 libraries/redshop/entity/product.php create mode 100644 libraries/redshop/entity/product_compare.php create mode 100644 libraries/redshop/entity/product_discount.php create mode 100644 libraries/redshop/entity/product_discount_calculate.php create mode 100644 libraries/redshop/entity/product_discount_calculate_extra.php create mode 100644 libraries/redshop/entity/product_serial.php create mode 100644 libraries/redshop/entity/product_subscribe.php create mode 100644 libraries/redshop/entity/product_subscription.php create mode 100644 libraries/redshop/entity/product_subscription_renewal.php create mode 100644 libraries/redshop/entity/product_tag.php create mode 100644 libraries/redshop/entity/property.php create mode 100644 libraries/redshop/entity/question.php create mode 100644 libraries/redshop/entity/quotation.php create mode 100644 libraries/redshop/entity/quotation_item.php create mode 100644 libraries/redshop/entity/quotation_item_accessory.php create mode 100644 libraries/redshop/entity/quotation_item_attribute.php create mode 100644 libraries/redshop/entity/rating.php create mode 100644 libraries/redshop/entity/shipping.php create mode 100644 libraries/redshop/entity/shipping_box.php create mode 100644 libraries/redshop/entity/shipping_rate.php create mode 100644 libraries/redshop/entity/shopper_group.php create mode 100644 libraries/redshop/entity/state.php create mode 100644 libraries/redshop/entity/stockroom.php create mode 100644 libraries/redshop/entity/stockroom_image.php create mode 100644 libraries/redshop/entity/sub_attribute.php create mode 100644 libraries/redshop/entity/subscription.php create mode 100644 libraries/redshop/entity/supplier.php create mode 100644 libraries/redshop/entity/tax_group.php create mode 100644 libraries/redshop/entity/tax_rate.php create mode 100644 libraries/redshop/entity/template.php create mode 100644 libraries/redshop/entity/user.php create mode 100644 libraries/redshop/entity/user_cart.php create mode 100644 libraries/redshop/entity/user_cart_item.php create mode 100644 libraries/redshop/entity/user_cart_item_accessory.php create mode 100644 libraries/redshop/entity/user_cart_item_attribute.php create mode 100644 libraries/redshop/entity/user_notify_stock.php create mode 100644 libraries/redshop/entity/voucher.php create mode 100644 libraries/redshop/entity/voucher_transaction.php create mode 100644 libraries/redshop/entity/wishlist.php create mode 100644 libraries/redshop/entity/wishlist_product.php create mode 100644 libraries/redshop/entity/wishlist_product_item.php create mode 100644 libraries/redshop/entity/wrapper.php create mode 100644 libraries/redshop/entity/xml_export.php create mode 100644 libraries/redshop/entity/xml_import.php create mode 100644 libraries/redshop/entity/zipcode.php create mode 100644 libraries/redshop/form/field/calendar.php create mode 100644 libraries/redshop/form/field/country.php create mode 100644 libraries/redshop/form/field/coupon_remaining.php create mode 100755 libraries/redshop/form/field/fieldsection.php create mode 100644 libraries/redshop/form/field/fieldsgroups.php create mode 100755 libraries/redshop/form/field/fieldtype.php create mode 100644 libraries/redshop/form/field/fontlist.php create mode 100644 libraries/redshop/form/field/index.html create mode 100644 libraries/redshop/form/field/mail_section.php create mode 100644 libraries/redshop/form/field/manufacturer.php create mode 100644 libraries/redshop/form/field/media.php create mode 100644 libraries/redshop/form/field/order_status.php create mode 100644 libraries/redshop/form/field/payment_method.php create mode 100644 libraries/redshop/form/field/radio.php create mode 100644 libraries/redshop/form/field/rules.php create mode 100644 libraries/redshop/form/field/shipping_method.php create mode 100644 libraries/redshop/form/field/state.php create mode 100644 libraries/redshop/form/field/taxgroup.php create mode 100644 libraries/redshop/form/field/template.php create mode 100644 libraries/redshop/form/field/template_section.php create mode 100644 libraries/redshop/form/field/text.php create mode 100644 libraries/redshop/form/field/users.php create mode 100644 libraries/redshop/form/field/voucher_product.php create mode 100644 libraries/redshop/form/fields/cardtypes.php create mode 100644 libraries/redshop/form/fields/categories.php create mode 100644 libraries/redshop/form/fields/categoriesparent.php create mode 100644 libraries/redshop/form/fields/categorylist.php create mode 100644 libraries/redshop/form/fields/creditcards.php create mode 100644 libraries/redshop/form/fields/currency.php create mode 100644 libraries/redshop/form/fields/economicaccountgroup.php create mode 100644 libraries/redshop/form/fields/epaycardtypes.php create mode 100644 libraries/redshop/form/fields/extrafieldpayment.php create mode 100644 libraries/redshop/form/fields/extrafields.php create mode 100644 libraries/redshop/form/fields/extrafieldshipping.php create mode 100644 libraries/redshop/form/fields/extrainfo.php create mode 100644 libraries/redshop/form/fields/index.html create mode 100644 libraries/redshop/form/fields/manufacturer.php create mode 100644 libraries/redshop/form/fields/mediadragdrop.php create mode 100644 libraries/redshop/form/fields/orderbymanufacturer.php create mode 100644 libraries/redshop/form/fields/orderbyproduct.php create mode 100644 libraries/redshop/form/fields/orderstatus.php create mode 100644 libraries/redshop/form/fields/ordertemplatelist.php create mode 100644 libraries/redshop/form/fields/productattributes.php create mode 100644 libraries/redshop/form/fields/products.php create mode 100644 libraries/redshop/form/fields/productsearchtype.php create mode 100644 libraries/redshop/form/fields/rajaxproducts.php create mode 100644 libraries/redshop/form/fields/rajaxusers.php create mode 100644 libraries/redshop/form/fields/rcountries.php create mode 100644 libraries/redshop/form/fields/rcountry3code.php create mode 100644 libraries/redshop/form/fields/rdaterange.php create mode 100644 libraries/redshop/form/fields/redshopcategory.php create mode 100644 libraries/redshop/form/fields/redshopeditor.php create mode 100644 libraries/redshop/form/fields/rpredefinedlist.php create mode 100644 libraries/redshop/form/fields/rproducts.php create mode 100644 libraries/redshop/form/fields/rpublished.php create mode 100644 libraries/redshop/form/fields/rstate2code.php create mode 100644 libraries/redshop/form/fields/sample.php create mode 100644 libraries/redshop/form/fields/searchtype.php create mode 100644 libraries/redshop/form/fields/shoppergrouplist.php create mode 100644 libraries/redshop/form/fields/stockroomlist.php create mode 100644 libraries/redshop/form/fields/template.php create mode 100644 libraries/redshop/form/fields/templatecompare.php create mode 100644 libraries/redshop/form/fields/timestamp.php create mode 100644 libraries/redshop/form/index.html create mode 100644 libraries/redshop/form/rules/index.html create mode 100644 libraries/redshop/helper/access.php create mode 100644 libraries/redshop/helper/accessory.php create mode 100644 libraries/redshop/helper/ajax.php create mode 100644 libraries/redshop/helper/attribute.php create mode 100644 libraries/redshop/helper/billing.php create mode 100644 libraries/redshop/helper/billing/tag.php create mode 100644 libraries/redshop/helper/breadcrumb.php create mode 100644 libraries/redshop/helper/cart.php create mode 100644 libraries/redshop/helper/cart/discount.php create mode 100644 libraries/redshop/helper/cart/index.html create mode 100644 libraries/redshop/helper/cart/session.php create mode 100644 libraries/redshop/helper/cart/shipping.php create mode 100644 libraries/redshop/helper/cart/tag.php create mode 100644 libraries/redshop/helper/catalog.php create mode 100644 libraries/redshop/helper/category.php create mode 100644 libraries/redshop/helper/clickatell.php create mode 100644 libraries/redshop/helper/config.php create mode 100644 libraries/redshop/helper/cron.php create mode 100644 libraries/redshop/helper/currency.php create mode 100644 libraries/redshop/helper/datetime.php create mode 100644 libraries/redshop/helper/discount.php create mode 100644 libraries/redshop/helper/document.php create mode 100644 libraries/redshop/helper/extrafields.php create mode 100644 libraries/redshop/helper/googleanalytics.php create mode 100644 libraries/redshop/helper/index.html create mode 100644 libraries/redshop/helper/joomla.php create mode 100644 libraries/redshop/helper/js.php create mode 100644 libraries/redshop/helper/mail.php create mode 100644 libraries/redshop/helper/manufacturer.php create mode 100644 libraries/redshop/helper/media.php create mode 100644 libraries/redshop/helper/media/image.php create mode 100644 libraries/redshop/helper/media/index.html create mode 100644 libraries/redshop/helper/module.php create mode 100644 libraries/redshop/helper/newsletter.php create mode 100644 libraries/redshop/helper/order.php create mode 100644 libraries/redshop/helper/payment.php create mode 100644 libraries/redshop/helper/pdf.php create mode 100644 libraries/redshop/helper/pdf_merge.php create mode 100644 libraries/redshop/helper/product.php create mode 100644 libraries/redshop/helper/product/accessory.php create mode 100644 libraries/redshop/helper/product/download.php create mode 100644 libraries/redshop/helper/product/index.html create mode 100644 libraries/redshop/helper/product/price.php create mode 100644 libraries/redshop/helper/product/tag.php create mode 100644 libraries/redshop/helper/product_attribute.php create mode 100644 libraries/redshop/helper/quotation.php create mode 100644 libraries/redshop/helper/router.php create mode 100644 libraries/redshop/helper/sample.php create mode 100644 libraries/redshop/helper/shipping.php create mode 100644 libraries/redshop/helper/shipping/index.html create mode 100644 libraries/redshop/helper/shipping/tag.php create mode 100644 libraries/redshop/helper/shopper_group.php create mode 100644 libraries/redshop/helper/statistic.php create mode 100644 libraries/redshop/helper/stockroom.php create mode 100644 libraries/redshop/helper/tax.php create mode 100644 libraries/redshop/helper/template.php create mode 100644 libraries/redshop/helper/text.php create mode 100644 libraries/redshop/helper/user.php create mode 100644 libraries/redshop/helper/utility.php create mode 100644 libraries/redshop/helper/virtuemart.php create mode 100644 libraries/redshop/helper/wishlist.php create mode 100644 libraries/redshop/helper/world.php create mode 100644 libraries/redshop/html/index.html create mode 100644 libraries/redshop/html/redshopcalendar.php create mode 100644 libraries/redshop/html/redshopgrid.php create mode 100644 libraries/redshop/html/redshopjquery.php create mode 100644 libraries/redshop/html/redshopmedia.php create mode 100644 libraries/redshop/html/redshopselect.php create mode 100644 libraries/redshop/html/redshopsortable.php create mode 100644 libraries/redshop/index.html create mode 100644 libraries/redshop/install/index.html create mode 100644 libraries/redshop/install/install.php create mode 100644 libraries/redshop/install/update.php create mode 100644 libraries/redshop/language/en-GB/en-GB.lib_redshop.ini create mode 100644 libraries/redshop/language/en-GB/en-GB.lib_redshop.sys.ini create mode 100644 libraries/redshop/language/en-GB/index.html create mode 100644 libraries/redshop/language/index.html create mode 100644 libraries/redshop/layout/base.php create mode 100644 libraries/redshop/layout/file.php create mode 100644 libraries/redshop/layout/helper.php create mode 100644 libraries/redshop/layout/index.html create mode 100644 libraries/redshop/layout/layout.php create mode 100644 libraries/redshop/layouts/extrafields/display/country.php create mode 100644 libraries/redshop/layouts/extrafields/display/document.php create mode 100644 libraries/redshop/layouts/extrafields/display/image.php create mode 100644 libraries/redshop/layouts/extrafields/display/select.php create mode 100644 libraries/redshop/layouts/extrafields/display/text.php create mode 100644 libraries/redshop/layouts/extrafields/display/textarea.php create mode 100644 libraries/redshop/layouts/extrafields/field/checkbox.php create mode 100644 libraries/redshop/layouts/extrafields/field/country.php create mode 100644 libraries/redshop/layouts/extrafields/field/date_picker.php create mode 100644 libraries/redshop/layouts/extrafields/field/document.php create mode 100644 libraries/redshop/layouts/extrafields/field/editor.php create mode 100644 libraries/redshop/layouts/extrafields/field/image.php create mode 100644 libraries/redshop/layouts/extrafields/field/image_link.php create mode 100644 libraries/redshop/layouts/extrafields/field/multiple.php create mode 100644 libraries/redshop/layouts/extrafields/field/radio.php create mode 100644 libraries/redshop/layouts/extrafields/field/select.php create mode 100644 libraries/redshop/layouts/extrafields/field/selected_condition.php create mode 100644 libraries/redshop/layouts/extrafields/field/text.php create mode 100644 libraries/redshop/layouts/extrafields/field/textarea.php create mode 100644 libraries/redshop/layouts/extrafields/userfield/checkbox.php create mode 100644 libraries/redshop/layouts/extrafields/userfield/date_picker.php create mode 100644 libraries/redshop/layouts/extrafields/userfield/document.php create mode 100644 libraries/redshop/layouts/extrafields/userfield/image.php create mode 100644 libraries/redshop/layouts/extrafields/userfield/multiple.php create mode 100644 libraries/redshop/layouts/extrafields/userfield/radio.php create mode 100644 libraries/redshop/layouts/extrafields/userfield/select.php create mode 100644 libraries/redshop/layouts/extrafields/userfield/text.php create mode 100644 libraries/redshop/layouts/extrafields/userfield/textarea.php create mode 100644 libraries/redshop/layouts/field/date_range.php create mode 100644 libraries/redshop/layouts/field/index.html create mode 100644 libraries/redshop/layouts/field/radio.php create mode 100644 libraries/redshop/layouts/field/rules/group.php create mode 100644 libraries/redshop/layouts/field/rules/index.html create mode 100644 libraries/redshop/layouts/field/rules/rules.php create mode 100644 libraries/redshop/layouts/field/rules/wrapper.php create mode 100644 libraries/redshop/layouts/field_display/checkbox.php create mode 100644 libraries/redshop/layouts/field_display/country.php create mode 100644 libraries/redshop/layouts/field_display/datepicker.php create mode 100644 libraries/redshop/layouts/field_display/multiple.php create mode 100644 libraries/redshop/layouts/field_display/radio.php create mode 100644 libraries/redshop/layouts/field_display/select.php create mode 100644 libraries/redshop/layouts/field_display/text.php create mode 100644 libraries/redshop/layouts/field_display/textarea.php create mode 100644 libraries/redshop/layouts/html/index.html create mode 100644 libraries/redshop/layouts/html/list.php create mode 100644 libraries/redshop/layouts/html/media/button.php create mode 100644 libraries/redshop/layouts/index.html create mode 100644 libraries/redshop/layouts/media/additional_media.php create mode 100644 libraries/redshop/layouts/media/dropzone.php create mode 100644 libraries/redshop/layouts/media/index.html create mode 100644 libraries/redshop/layouts/media/media_files.php create mode 100644 libraries/redshop/layouts/order/glslocation.php create mode 100644 libraries/redshop/layouts/order/index.html create mode 100644 libraries/redshop/layouts/order/order_print.php create mode 100644 libraries/redshop/layouts/product/attributes.php create mode 100644 libraries/redshop/layouts/product/index.html create mode 100644 libraries/redshop/layouts/product/property_scroller.php create mode 100644 libraries/redshop/layouts/product/subproperty_scroller.php create mode 100644 libraries/redshop/layouts/shop/compare_product.php create mode 100644 libraries/redshop/layouts/system/index.html create mode 100644 libraries/redshop/layouts/system/message.php create mode 100644 libraries/redshop/layouts/tags/accessory/index.html create mode 100644 libraries/redshop/layouts/tags/accessory/preview_image.php create mode 100644 libraries/redshop/layouts/tags/common/index.html create mode 100644 libraries/redshop/layouts/tags/index.html create mode 100644 libraries/redshop/layouts/tags/product/index.html create mode 100644 libraries/redshop/layouts/tags/product/product_attribute.php create mode 100644 libraries/redshop/layouts/tags/product/stock_notify_flag.php create mode 100644 libraries/redshop/layouts/tags/product/wishlist_button.php create mode 100644 libraries/redshop/layouts/tags/product/wishlist_link.php create mode 100644 libraries/redshop/layouts/toolbar/index.html create mode 100644 libraries/redshop/layouts/toolbar/redshopgroup.php create mode 100644 libraries/redshop/layouts/toolbar/redshoplink.j2.php create mode 100644 libraries/redshop/layouts/toolbar/redshoplink.j3.php create mode 100644 libraries/redshop/library.php create mode 100644 libraries/redshop/menu/index.html create mode 100644 libraries/redshop/menu/left_menu.php create mode 100644 libraries/redshop/menu/menu.php create mode 100644 libraries/redshop/model/form.php create mode 100644 libraries/redshop/model/index.html create mode 100644 libraries/redshop/model/list.php create mode 100644 libraries/redshop/model/model.php create mode 100644 libraries/redshop/payment/index.html create mode 100644 libraries/redshop/payment/payment.php create mode 100644 libraries/redshop/product/compare.php create mode 100644 libraries/redshop/product/index.html create mode 100644 libraries/redshop/product/product.php create mode 100644 libraries/redshop/redshop.php create mode 100644 libraries/redshop/redshop.xml create mode 100644 libraries/redshop/shipping/index.html create mode 100644 libraries/redshop/shipping/rate.php create mode 100644 libraries/redshop/src/Account/Helper.php create mode 100644 libraries/redshop/src/Account/Wishlist.php create mode 100644 libraries/redshop/src/Ajax/Response.php create mode 100644 libraries/redshop/src/BaseObject.php create mode 100644 libraries/redshop/src/Cart/Cart.php create mode 100644 libraries/redshop/src/Cart/Helper.php create mode 100644 libraries/redshop/src/Cart/Module.php create mode 100644 libraries/redshop/src/Cart/Render.php create mode 100644 libraries/redshop/src/Cart/Render/Label.php create mode 100644 libraries/redshop/src/Config/App.php create mode 100644 libraries/redshop/src/Config/index.html create mode 100644 libraries/redshop/src/Cron/Product.php create mode 100644 libraries/redshop/src/Crypto/Helper/Encrypt.php create mode 100644 libraries/redshop/src/Currency/Currency.php create mode 100644 libraries/redshop/src/Currency/CurrencyLayer.php create mode 100644 libraries/redshop/src/Currency/index.html create mode 100644 libraries/redshop/src/Economic/RedshopEconomic.php create mode 100644 libraries/redshop/src/Economic/index.html create mode 100644 libraries/redshop/src/Entity/Traits/Product/Categories.php create mode 100644 libraries/redshop/src/Entity/Traits/Product/Media.php create mode 100644 libraries/redshop/src/Entity/Traits/Product/Related.php create mode 100644 libraries/redshop/src/Entity/Traits/Product/Stock.php create mode 100644 libraries/redshop/src/Environment.php create mode 100644 libraries/redshop/src/Environment/Directory.php create mode 100644 libraries/redshop/src/Environment/Remote/Curl.php create mode 100644 libraries/redshop/src/Fields/SiteHelper.php create mode 100644 libraries/redshop/src/Filesystem/Mime.php create mode 100644 libraries/redshop/src/Helper/Ajax.php create mode 100644 libraries/redshop/src/Helper/ExtraFields.php create mode 100644 libraries/redshop/src/Helper/Media.php create mode 100644 libraries/redshop/src/Helper/ShopperGroup.php create mode 100644 libraries/redshop/src/Helper/Stockroom.php create mode 100644 libraries/redshop/src/Helper/Utility.php create mode 100644 libraries/redshop/src/Helper/index.html create mode 100644 libraries/redshop/src/Mail/AskQuestion.php create mode 100644 libraries/redshop/src/Mail/Catalog.php create mode 100644 libraries/redshop/src/Mail/Giftcard.php create mode 100644 libraries/redshop/src/Mail/Helper.php create mode 100644 libraries/redshop/src/Mail/Invoice.php create mode 100644 libraries/redshop/src/Mail/Newsletter.php create mode 100644 libraries/redshop/src/Mail/Order.php create mode 100644 libraries/redshop/src/Mail/Quotation.php create mode 100644 libraries/redshop/src/Mail/User.php create mode 100644 libraries/redshop/src/Model/Traits/HasDateTimeRange.php create mode 100644 libraries/redshop/src/Order/Helper.php create mode 100644 libraries/redshop/src/Order/Item.php create mode 100644 libraries/redshop/src/Order/Template.php create mode 100644 libraries/redshop/src/Plugin/AbstractExportPlugin.php create mode 100644 libraries/redshop/src/Plugin/AbstractImportPlugin.php create mode 100644 libraries/redshop/src/Plugin/index.html create mode 100644 libraries/redshop/src/Product/Accessory.php create mode 100644 libraries/redshop/src/Product/Compare.php create mode 100644 libraries/redshop/src/Product/Image/Image.php create mode 100644 libraries/redshop/src/Product/Image/Render.php create mode 100644 libraries/redshop/src/Product/Price.php create mode 100644 libraries/redshop/src/Product/Property.php create mode 100644 libraries/redshop/src/Product/Rating.php create mode 100644 libraries/redshop/src/Product/Stock.php create mode 100644 libraries/redshop/src/Repositories/Order.php create mode 100644 libraries/redshop/src/Repositories/Product.php create mode 100644 libraries/redshop/src/Repositories/Products.php create mode 100644 libraries/redshop/src/Repositories/Table.php create mode 100644 libraries/redshop/src/Shipping/Rate.php create mode 100644 libraries/redshop/src/Shipping/Tag.php create mode 100644 libraries/redshop/src/Table/AbstractTable.php create mode 100644 libraries/redshop/src/Table/TableInterface.php create mode 100644 libraries/redshop/src/Table/Traits/HasAutoEvents.php create mode 100644 libraries/redshop/src/Table/Traits/HasInstanceName.php create mode 100644 libraries/redshop/src/Table/Traits/HasInstancePrefix.php create mode 100644 libraries/redshop/src/Table/Traits/index.html create mode 100644 libraries/redshop/src/Table/index.html create mode 100644 libraries/redshop/src/Template/Cart.php create mode 100644 libraries/redshop/src/Template/General.php create mode 100644 libraries/redshop/src/Template/Helper.php create mode 100644 libraries/redshop/src/Update/AbstractUpdate.php create mode 100644 libraries/redshop/src/Update/index.html create mode 100644 libraries/redshop/src/User/Billing/Billing.php create mode 100644 libraries/redshop/src/Validation/Creditcard.php create mode 100644 libraries/redshop/src/View/AbstractView.php create mode 100644 libraries/redshop/src/View/index.html create mode 100644 libraries/redshop/src/index.html create mode 100644 libraries/redshop/table/index.html create mode 100755 libraries/redshop/table/nested.php create mode 100644 libraries/redshop/table/table.php create mode 100644 libraries/redshop/tags/abstract.php create mode 100644 libraries/redshop/tags/index.html create mode 100644 libraries/redshop/tags/replacer.php create mode 100644 libraries/redshop/tags/sections/accessory.php create mode 100644 libraries/redshop/tags/sections/attribute.php create mode 100644 libraries/redshop/tags/sections/category.php create mode 100644 libraries/redshop/tags/sections/index.html create mode 100644 libraries/redshop/tags/sections/wishlist.php create mode 100644 libraries/redshop/toolbar/button/index.html create mode 100644 libraries/redshop/toolbar/button/redshoplink.php create mode 100644 libraries/redshop/toolbar/helper.php create mode 100644 libraries/redshop/toolbar/index.html create mode 100644 libraries/redshop/toolbar/toolbar.php create mode 100644 libraries/redshop/view/admin.php create mode 100644 libraries/redshop/view/csv.php create mode 100644 libraries/redshop/view/form.php create mode 100644 libraries/redshop/view/index.html create mode 100644 libraries/redshop/view/list.php create mode 100644 libraries/redshop/view/view.php create mode 100644 media/com_redshop/css/bootstrap-datetimepicker.css create mode 100644 media/com_redshop/css/bootstrap-datetimepicker.min.css create mode 100644 media/com_redshop/css/bootstrap-grid.css create mode 100644 media/com_redshop/css/bootstrap-grid.min.css create mode 100644 media/com_redshop/css/colorpicker.css create mode 100644 media/com_redshop/css/colorpicker.min.css create mode 100644 media/com_redshop/css/cropper.css create mode 100644 media/com_redshop/css/cropper.min.css create mode 100755 media/com_redshop/css/daterangepicker.css create mode 100644 media/com_redshop/css/daterangepicker.min.css create mode 100644 media/com_redshop/css/dropzone.css create mode 100644 media/com_redshop/css/dropzone.min.css create mode 100644 media/com_redshop/css/flexslider/flexslider.css create mode 100644 media/com_redshop/css/flexslider/flexslider.min.css create mode 100644 media/com_redshop/css/flexslider/fonts/flexslider-icon.eot create mode 100644 media/com_redshop/css/flexslider/fonts/flexslider-icon.svg create mode 100644 media/com_redshop/css/flexslider/fonts/flexslider-icon.ttf create mode 100644 media/com_redshop/css/flexslider/fonts/flexslider-icon.woff create mode 100644 media/com_redshop/css/flexslider/fonts/index.html create mode 100644 media/com_redshop/css/flexslider/index.html create mode 100644 media/com_redshop/css/font-awesome.css create mode 100644 media/com_redshop/css/font-awesome.min.css create mode 100644 media/com_redshop/css/index.html create mode 100644 media/com_redshop/css/jquery-ui/images/index.html create mode 100644 media/com_redshop/css/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-bg_flat_10_000000_40x100.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_222222_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_228ef1_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_444444_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_555555_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_777620_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_777777_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_cc0000_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_ef8c08_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_ffd27a_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/images/ui-icons_ffffff_256x240.png create mode 100644 media/com_redshop/css/jquery-ui/index.html create mode 100644 media/com_redshop/css/jquery-ui/jquery-ui.css create mode 100644 media/com_redshop/css/jquery-ui/jquery-ui.min.css create mode 100644 media/com_redshop/css/lightbox2/css/index.html create mode 100644 media/com_redshop/css/lightbox2/css/lightbox.css create mode 100644 media/com_redshop/css/lightbox2/css/lightbox.min.css create mode 100644 media/com_redshop/css/lightbox2/images/close.png create mode 100644 media/com_redshop/css/lightbox2/images/index.html create mode 100644 media/com_redshop/css/lightbox2/images/loading.gif create mode 100644 media/com_redshop/css/lightbox2/images/next.png create mode 100644 media/com_redshop/css/lightbox2/images/prev.png create mode 100644 media/com_redshop/css/lightbox2/index.html create mode 100644 media/com_redshop/css/redshop.admin.css create mode 100644 media/com_redshop/css/redshop.admin.min.css create mode 100644 media/com_redshop/css/redshop.css create mode 100644 media/com_redshop/css/redshop.layout.css create mode 100644 media/com_redshop/css/redshop.layout.min.css create mode 100644 media/com_redshop/css/redshop.media.css create mode 100644 media/com_redshop/css/redshop.media.min.css create mode 100644 media/com_redshop/css/redshop.medialist-thumbs.css create mode 100644 media/com_redshop/css/redshop.medialist-thumbs.min.css create mode 100644 media/com_redshop/css/redshop.min.css create mode 100644 media/com_redshop/css/redshop.priceslider.css create mode 100644 media/com_redshop/css/redshop.priceslider.min.css create mode 100644 media/com_redshop/css/redshop.print.css create mode 100644 media/com_redshop/css/redshop.print.min.css create mode 100644 media/com_redshop/css/redshop.search.css create mode 100644 media/com_redshop/css/redshop.search.min.css create mode 100644 media/com_redshop/css/redshop.update.css create mode 100644 media/com_redshop/css/redshop.update.min.css create mode 100644 media/com_redshop/css/redshop.validation.css create mode 100644 media/com_redshop/css/redshop.validation.min.css create mode 100644 media/com_redshop/css/redshop.wizard.css create mode 100644 media/com_redshop/css/redshop.wizard.min.css create mode 100644 media/com_redshop/css/scrollable-navig.css create mode 100644 media/com_redshop/css/scrollable-navig.min.css create mode 100644 media/com_redshop/css/select2/index.html create mode 100644 media/com_redshop/css/select2/select2-bootstrap.css create mode 100644 media/com_redshop/css/select2/select2-spinner.gif create mode 100644 media/com_redshop/css/select2/select2.css create mode 100644 media/com_redshop/css/select2/select2.png create mode 100644 media/com_redshop/css/select2/select2x2.png create mode 100644 media/com_redshop/css/sortablelist.css create mode 100644 media/com_redshop/css/sortablelist.min.css create mode 100644 media/com_redshop/fonts/FontAwesome.otf create mode 100755 media/com_redshop/fonts/IcoMoon.dev.commented.svg create mode 100755 media/com_redshop/fonts/IcoMoon.dev.svg create mode 100755 media/com_redshop/fonts/IcoMoon.eot create mode 100755 media/com_redshop/fonts/IcoMoon.svg create mode 100755 media/com_redshop/fonts/IcoMoon.ttf create mode 100755 media/com_redshop/fonts/IcoMoon.woff create mode 100644 media/com_redshop/fonts/bootstrap/glyphicons-halflings-regular.eot create mode 100644 media/com_redshop/fonts/bootstrap/glyphicons-halflings-regular.svg create mode 100644 media/com_redshop/fonts/bootstrap/glyphicons-halflings-regular.ttf create mode 100644 media/com_redshop/fonts/bootstrap/glyphicons-halflings-regular.woff create mode 100644 media/com_redshop/fonts/bootstrap/glyphicons-halflings-regular.woff2 create mode 100644 media/com_redshop/fonts/fontawesome-webfont.eot create mode 100644 media/com_redshop/fonts/fontawesome-webfont.svg create mode 100644 media/com_redshop/fonts/fontawesome-webfont.ttf create mode 100644 media/com_redshop/fonts/fontawesome-webfont.woff create mode 100644 media/com_redshop/fonts/fontawesome-webfont.woff2 create mode 100755 media/com_redshop/fonts/icomoon-license.txt create mode 100644 media/com_redshop/images/261-x-88.png create mode 100644 media/com_redshop/images/accounting.png create mode 100644 media/com_redshop/images/accounting_group16.png create mode 100644 media/com_redshop/images/accounting_group32.png create mode 100644 media/com_redshop/images/accounting_group48.png create mode 100644 media/com_redshop/images/add.jpg create mode 100644 media/com_redshop/images/ajax-loader.gif create mode 100644 media/com_redshop/images/apply.png create mode 100644 media/com_redshop/images/arrow.png create mode 100644 media/com_redshop/images/arrow_d.png create mode 100644 media/com_redshop/images/attribute_bank16.png create mode 100644 media/com_redshop/images/attribute_bank32.png create mode 100644 media/com_redshop/images/attribute_bank48.png create mode 100644 media/com_redshop/images/blank.gif create mode 100644 media/com_redshop/images/blue.png create mode 100644 media/com_redshop/images/blue@2x.png create mode 100644 media/com_redshop/images/calendar.png create mode 100644 media/com_redshop/images/catalogmanagement16.png create mode 100644 media/com_redshop/images/catalogmanagement32.png create mode 100644 media/com_redshop/images/catalogmanagement48.png create mode 100644 media/com_redshop/images/categories16.png create mode 100644 media/com_redshop/images/categories32.png create mode 100644 media/com_redshop/images/categories48.png create mode 100644 media/com_redshop/images/check.png create mode 100644 media/com_redshop/images/checkout/blue.jpg create mode 100644 media/com_redshop/images/checkout/dinnersclub.jpg create mode 100644 media/com_redshop/images/checkout/discover.jpg create mode 100644 media/com_redshop/images/checkout/jcb.jpg create mode 100644 media/com_redshop/images/checkout/master.jpg create mode 100644 media/com_redshop/images/checkout/mastero.jpg create mode 100644 media/com_redshop/images/checkout/one.jpg create mode 100644 media/com_redshop/images/checkout/one_on.jpg create mode 100644 media/com_redshop/images/checkout/three.jpg create mode 100644 media/com_redshop/images/checkout/three_on.jpg create mode 100644 media/com_redshop/images/checkout/two.jpg create mode 100644 media/com_redshop/images/checkout/two_on.jpg create mode 100644 media/com_redshop/images/checkout/visa.jpg create mode 100644 media/com_redshop/images/chosen-sprite.png create mode 100644 media/com_redshop/images/chosen-sprite@2x.png create mode 100644 media/com_redshop/images/colorpicker_background.png create mode 100644 media/com_redshop/images/colorpicker_hex.png create mode 100644 media/com_redshop/images/colorpicker_hsb_b.png create mode 100644 media/com_redshop/images/colorpicker_hsb_h.png create mode 100644 media/com_redshop/images/colorpicker_hsb_s.png create mode 100644 media/com_redshop/images/colorpicker_indic.gif create mode 100644 media/com_redshop/images/colorpicker_overlay.png create mode 100644 media/com_redshop/images/colorpicker_rgb_b.png create mode 100644 media/com_redshop/images/colorpicker_rgb_g.png create mode 100644 media/com_redshop/images/colorpicker_rgb_r.png create mode 100644 media/com_redshop/images/colorpicker_select.gif create mode 100644 media/com_redshop/images/colorpicker_submit.png create mode 100644 media/com_redshop/images/colorsample16.png create mode 100644 media/com_redshop/images/colorsample32.png create mode 100644 media/com_redshop/images/colorsample48.png create mode 100644 media/com_redshop/images/communication.png create mode 100644 media/com_redshop/images/companystore16.png create mode 100644 media/com_redshop/images/companystore32.png create mode 100644 media/com_redshop/images/companystore48.png create mode 100644 media/com_redshop/images/con_info.png create mode 100644 media/com_redshop/images/configuration.png create mode 100644 media/com_redshop/images/configuration_16.png create mode 100644 media/com_redshop/images/configuration_32.png create mode 100644 media/com_redshop/images/container16.png create mode 100644 media/com_redshop/images/container32.png create mode 100644 media/com_redshop/images/container38.png create mode 100644 media/com_redshop/images/container48.png create mode 100644 media/com_redshop/images/copy.png create mode 100644 media/com_redshop/images/country_16.png create mode 100644 media/com_redshop/images/country_32.png create mode 100644 media/com_redshop/images/country_48.png create mode 100644 media/com_redshop/images/coupon16.png create mode 100644 media/com_redshop/images/coupon32.png create mode 100644 media/com_redshop/images/coupon48.png create mode 100644 media/com_redshop/images/currencies_16.png create mode 100644 media/com_redshop/images/currencies_32.png create mode 100644 media/com_redshop/images/currencies_48.png create mode 100644 media/com_redshop/images/custom_background.png create mode 100644 media/com_redshop/images/custom_hex.png create mode 100644 media/com_redshop/images/custom_hsb_b.png create mode 100644 media/com_redshop/images/custom_hsb_h.png create mode 100644 media/com_redshop/images/custom_hsb_s.png create mode 100644 media/com_redshop/images/custom_indic.gif create mode 100644 media/com_redshop/images/custom_rgb_b.png create mode 100644 media/com_redshop/images/custom_rgb_g.png create mode 100644 media/com_redshop/images/custom_rgb_r.png create mode 100644 media/com_redshop/images/custom_submit.png create mode 100644 media/com_redshop/images/customer.png create mode 100644 media/com_redshop/images/customization.png create mode 100644 media/com_redshop/images/dashboard_16.png create mode 100644 media/com_redshop/images/dashboard_32.png create mode 100644 media/com_redshop/images/dashboard_48.png create mode 100644 media/com_redshop/images/delete.png create mode 100644 media/com_redshop/images/discount.png create mode 100644 media/com_redshop/images/discountmanagmenet16.png create mode 100644 media/com_redshop/images/discountmanagmenet32.png create mode 100644 media/com_redshop/images/discountmanagmenet48.png create mode 100644 media/com_redshop/images/down.png create mode 100644 media/com_redshop/images/dsv.jpeg create mode 100644 media/com_redshop/images/edit.png create mode 100644 media/com_redshop/images/export16.png create mode 100644 media/com_redshop/images/export32.png create mode 100644 media/com_redshop/images/export48.png create mode 100644 media/com_redshop/images/fields16.png create mode 100644 media/com_redshop/images/fields32.png create mode 100644 media/com_redshop/images/fields48.png create mode 100644 media/com_redshop/images/folder.png create mode 100644 media/com_redshop/images/folderup_32.png create mode 100644 media/com_redshop/images/gbase.png create mode 100644 media/com_redshop/images/giftcard_16.png create mode 100644 media/com_redshop/images/giftcard_32.png create mode 100644 media/com_redshop/images/giftcard_48.png create mode 100644 media/com_redshop/images/help16.png create mode 100644 media/com_redshop/images/help32.png create mode 100644 media/com_redshop/images/help48.png create mode 100644 media/com_redshop/images/icon-48-settings.png create mode 100644 media/com_redshop/images/icon_check.png create mode 100644 media/com_redshop/images/icon_setup.png create mode 100644 media/com_redshop/images/import.png create mode 100644 media/com_redshop/images/import16.png create mode 100644 media/com_redshop/images/import32.png create mode 100644 media/com_redshop/images/import48.png create mode 100644 media/com_redshop/images/importexport16.png create mode 100644 media/com_redshop/images/importexport32.png create mode 100644 media/com_redshop/images/importexport48.png create mode 100644 media/com_redshop/images/importexport_management.png create mode 100644 media/com_redshop/images/index.html create mode 100644 media/com_redshop/images/laegikurv.gif create mode 100644 media/com_redshop/images/laegikurven.jpg create mode 100644 media/com_redshop/images/left.png create mode 100644 media/com_redshop/images/leftarrow.jpg create mode 100644 media/com_redshop/images/loading.gif create mode 100644 media/com_redshop/images/logout.png create mode 100644 media/com_redshop/images/mailcenter16.png create mode 100644 media/com_redshop/images/mailcenter32.png create mode 100644 media/com_redshop/images/mailcenter48.png create mode 100644 media/com_redshop/images/manufact16.png create mode 100644 media/com_redshop/images/manufact32.png create mode 100644 media/com_redshop/images/manufact48.png create mode 100644 media/com_redshop/images/manufacturer/index.html create mode 100644 media/com_redshop/images/media16.png create mode 100644 media/com_redshop/images/media32.png create mode 100644 media/com_redshop/images/media48.png create mode 100644 media/com_redshop/images/menu.png create mode 100644 media/com_redshop/images/mime-icon-32/avi.png create mode 100644 media/com_redshop/images/mime-icon-32/doc.png create mode 100644 media/com_redshop/images/mime-icon-32/index.html create mode 100644 media/com_redshop/images/mime-icon-32/mov.png create mode 100644 media/com_redshop/images/mime-icon-32/mp3.png create mode 100644 media/com_redshop/images/mime-icon-32/mp4.png create mode 100644 media/com_redshop/images/mime-icon-32/odc.png create mode 100644 media/com_redshop/images/mime-icon-32/odd.png create mode 100644 media/com_redshop/images/mime-icon-32/odt.png create mode 100644 media/com_redshop/images/mime-icon-32/ogg.png create mode 100644 media/com_redshop/images/mime-icon-32/pdf.png create mode 100644 media/com_redshop/images/mime-icon-32/ppt.png create mode 100644 media/com_redshop/images/mime-icon-32/rar.png create mode 100644 media/com_redshop/images/mime-icon-32/rtf.png create mode 100644 media/com_redshop/images/mime-icon-32/svg.png create mode 100644 media/com_redshop/images/mime-icon-32/sxd.png create mode 100644 media/com_redshop/images/mime-icon-32/tar.png create mode 100644 media/com_redshop/images/mime-icon-32/tgz.png create mode 100644 media/com_redshop/images/mime-icon-32/wma.png create mode 100644 media/com_redshop/images/mime-icon-32/wmv.png create mode 100644 media/com_redshop/images/mime-icon-32/xls.png create mode 100644 media/com_redshop/images/mime-icon-32/zip.png create mode 100644 media/com_redshop/images/new.png create mode 100644 media/com_redshop/images/newsletter16.png create mode 100644 media/com_redshop/images/newsletter32.png create mode 100644 media/com_redshop/images/newsletter48.png create mode 100644 media/com_redshop/images/noimage.jpg create mode 100644 media/com_redshop/images/order.png create mode 100644 media/com_redshop/images/order1.png create mode 100644 media/com_redshop/images/order16.png create mode 100644 media/com_redshop/images/order32.png create mode 100644 media/com_redshop/images/order48.png create mode 100644 media/com_redshop/images/payment16.png create mode 100644 media/com_redshop/images/payment32.png create mode 100644 media/com_redshop/images/payment48.png create mode 100644 media/com_redshop/images/plugins16.png create mode 100644 media/com_redshop/images/plugins32.png create mode 100644 media/com_redshop/images/plugins48.png create mode 100644 media/com_redshop/images/preloader.gif create mode 100644 media/com_redshop/images/preview.png create mode 100644 media/com_redshop/images/print.png create mode 100644 media/com_redshop/images/print_f2.png create mode 100644 media/com_redshop/images/product.png create mode 100644 media/com_redshop/images/product_management.png create mode 100644 media/com_redshop/images/products16.png create mode 100644 media/com_redshop/images/products32.png create mode 100644 media/com_redshop/images/products48.png create mode 100644 media/com_redshop/images/publish.png create mode 100644 media/com_redshop/images/publish_x.png create mode 100644 media/com_redshop/images/question_16.jpg create mode 100644 media/com_redshop/images/question_32.jpg create mode 100644 media/com_redshop/images/question_48.jpg create mode 100644 media/com_redshop/images/quotation_16.jpg create mode 100644 media/com_redshop/images/quotation_32.jpg create mode 100644 media/com_redshop/images/quotation_48.jpg create mode 100644 media/com_redshop/images/rating16.png create mode 100644 media/com_redshop/images/rating32.png create mode 100644 media/com_redshop/images/rating48.png create mode 100644 media/com_redshop/images/redcomponent-logo.jpg create mode 100644 media/com_redshop/images/redhost-logo.jpg create mode 100644 media/com_redshop/images/redshop.png create mode 100644 media/com_redshop/images/redshop_white_logo.png create mode 100644 media/com_redshop/images/redshopcart16.png create mode 100644 media/com_redshop/images/redshopcart32.png create mode 100644 media/com_redshop/images/redshopcart48.png create mode 100644 media/com_redshop/images/redweb-logo.jpg create mode 100644 media/com_redshop/images/region_16.png create mode 100644 media/com_redshop/images/region_32.png create mode 100644 media/com_redshop/images/region_48.png create mode 100644 media/com_redshop/images/reloading.gif create mode 100644 media/com_redshop/images/repeatbg.jpg create mode 100644 media/com_redshop/images/right.png create mode 100644 media/com_redshop/images/rightarrow.jpg create mode 100644 media/com_redshop/images/save-new.png create mode 100644 media/com_redshop/images/save.png create mode 100644 media/com_redshop/images/save2.png create mode 100644 media/com_redshop/images/search.png create mode 100644 media/com_redshop/images/select.png create mode 100644 media/com_redshop/images/select2.png create mode 100644 media/com_redshop/images/send.png create mode 100644 media/com_redshop/images/send_order_16.png create mode 100644 media/com_redshop/images/send_order_32.png create mode 100644 media/com_redshop/images/send_order_48.png create mode 100644 media/com_redshop/images/shipping.png create mode 100644 media/com_redshop/images/shipping16.png create mode 100644 media/com_redshop/images/shipping32.png create mode 100644 media/com_redshop/images/shipping48.png create mode 100644 media/com_redshop/images/shipping_boxes16.png create mode 100644 media/com_redshop/images/shipping_boxes32.png create mode 100644 media/com_redshop/images/shipping_boxes48.png create mode 100644 media/com_redshop/images/shipping_rates_16.png create mode 100644 media/com_redshop/images/shipping_rates_32.png create mode 100644 media/com_redshop/images/shipping_rates_48.png create mode 100644 media/com_redshop/images/slider.png create mode 100644 media/com_redshop/images/star_rating/0.gif create mode 100644 media/com_redshop/images/star_rating/1.gif create mode 100644 media/com_redshop/images/star_rating/2.gif create mode 100644 media/com_redshop/images/star_rating/3.gif create mode 100644 media/com_redshop/images/star_rating/4.gif create mode 100644 media/com_redshop/images/star_rating/5.gif create mode 100644 media/com_redshop/images/star_rating/r_0.gif create mode 100644 media/com_redshop/images/star_rating/r_1.gif create mode 100644 media/com_redshop/images/star_rating/r_2.gif create mode 100644 media/com_redshop/images/star_rating/r_3.gif create mode 100644 media/com_redshop/images/star_rating/r_4.gif create mode 100644 media/com_redshop/images/star_rating/r_5.gif create mode 100644 media/com_redshop/images/statistic.png create mode 100644 media/com_redshop/images/statistic16.png create mode 100644 media/com_redshop/images/statistic32.png create mode 100644 media/com_redshop/images/statistic48.png create mode 100644 media/com_redshop/images/stockroom/icon_lock.gif create mode 100644 media/com_redshop/images/stockroom/index.html create mode 100644 media/com_redshop/images/stockroom16.png create mode 100644 media/com_redshop/images/stockroom32.png create mode 100644 media/com_redshop/images/stockroom48.png create mode 100644 media/com_redshop/images/tax.png create mode 100644 media/com_redshop/images/templates16.png create mode 100644 media/com_redshop/images/templates32.png create mode 100644 media/com_redshop/images/templates48.png create mode 100644 media/com_redshop/images/textlibrary16.png create mode 100644 media/com_redshop/images/textlibrary32.png create mode 100644 media/com_redshop/images/textlibrary48.png create mode 100644 media/com_redshop/images/tick.png create mode 100644 media/com_redshop/images/tools.png create mode 100644 media/com_redshop/images/tooltip.png create mode 100644 media/com_redshop/images/unpublish.png create mode 100644 media/com_redshop/images/up.png create mode 100644 media/com_redshop/images/user.png create mode 100644 media/com_redshop/images/user16.png create mode 100644 media/com_redshop/images/user32.png create mode 100644 media/com_redshop/images/user48.png create mode 100644 media/com_redshop/images/vatgroup_16.png create mode 100644 media/com_redshop/images/vatgroup_32.png create mode 100644 media/com_redshop/images/vatgroup_48.png create mode 100644 media/com_redshop/images/vatrates16.png create mode 100644 media/com_redshop/images/vatrates32.png create mode 100644 media/com_redshop/images/vatrates48.png create mode 100644 media/com_redshop/images/voucher16.png create mode 100644 media/com_redshop/images/voucher32.png create mode 100644 media/com_redshop/images/voucher48.png create mode 100644 media/com_redshop/images/wizard_16.png create mode 100644 media/com_redshop/images/wizard_32.png create mode 100644 media/com_redshop/images/wizard_48.png create mode 100644 media/com_redshop/images/wrapper16.png create mode 100644 media/com_redshop/images/wrapper32.png create mode 100644 media/com_redshop/images/wrapper48.png create mode 100644 media/com_redshop/index.html create mode 100644 media/com_redshop/js/ajaxupload.js create mode 100644 media/com_redshop/js/ajaxupload.min.js create mode 100644 media/com_redshop/js/bootbox.js create mode 100644 media/com_redshop/js/bootbox.min.js create mode 100644 media/com_redshop/js/bootstrap-datetimepicker.js create mode 100644 media/com_redshop/js/bootstrap-datetimepicker.min.js create mode 100644 media/com_redshop/js/bootstrap.js create mode 100644 media/com_redshop/js/bootstrap.min.js create mode 100644 media/com_redshop/js/carousel.js create mode 100644 media/com_redshop/js/carousel.min.js create mode 100644 media/com_redshop/js/catprice_filter.php create mode 100644 media/com_redshop/js/colorpicker.js create mode 100644 media/com_redshop/js/colorpicker.min.js create mode 100644 media/com_redshop/js/cropper.js create mode 100644 media/com_redshop/js/cropper.min.js create mode 100755 media/com_redshop/js/daterangepicker.js create mode 100755 media/com_redshop/js/daterangepicker.min.js create mode 100644 media/com_redshop/js/dropzone.js create mode 100644 media/com_redshop/js/dropzone.min.js create mode 100644 media/com_redshop/js/eye.js create mode 100644 media/com_redshop/js/eye.min.js create mode 100644 media/com_redshop/js/flexslider.js create mode 100644 media/com_redshop/js/flexslider.min.js create mode 100644 media/com_redshop/js/index.html create mode 100644 media/com_redshop/js/jquery-migrate.js create mode 100644 media/com_redshop/js/jquery-migrate.min.js create mode 100644 media/com_redshop/js/jquery-noconflict.js create mode 100644 media/com_redshop/js/jquery-ui.js create mode 100644 media/com_redshop/js/jquery-ui.min.js create mode 100644 media/com_redshop/js/jquery.fileupload.js create mode 100644 media/com_redshop/js/jquery.fileupload.min.js create mode 100644 media/com_redshop/js/jquery.iframe-transport.js create mode 100644 media/com_redshop/js/jquery.iframe-transport.min.js create mode 100644 media/com_redshop/js/jquery.inputmask.js create mode 100644 media/com_redshop/js/jquery.inputmask.min.js create mode 100644 media/com_redshop/js/jquery.js create mode 100644 media/com_redshop/js/jquery.metadata.js create mode 100644 media/com_redshop/js/jquery.metadata.min.js create mode 100644 media/com_redshop/js/jquery.min.js create mode 100644 media/com_redshop/js/jquery.tools.min.js create mode 100644 media/com_redshop/js/jquery.validate.js create mode 100644 media/com_redshop/js/jquery.validate.min.js create mode 100644 media/com_redshop/js/json.js create mode 100644 media/com_redshop/js/json.min.js create mode 100644 media/com_redshop/js/lightbox2.js create mode 100644 media/com_redshop/js/lightbox2.min.js create mode 100644 media/com_redshop/js/media.js create mode 100644 media/com_redshop/js/media.min.js create mode 100644 media/com_redshop/js/moment-timezone-with-data.js create mode 100644 media/com_redshop/js/moment-timezone-with-data.min.js create mode 100755 media/com_redshop/js/moment.js create mode 100755 media/com_redshop/js/moment.min.js create mode 100644 media/com_redshop/js/redshop.admin.common.js create mode 100644 media/com_redshop/js/redshop.admin.common.min.js create mode 100644 media/com_redshop/js/redshop.admin.js create mode 100644 media/com_redshop/js/redshop.admin.media.js create mode 100644 media/com_redshop/js/redshop.admin.media.min.js create mode 100644 media/com_redshop/js/redshop.admin.min.js create mode 100644 media/com_redshop/js/redshop.alert.js create mode 100644 media/com_redshop/js/redshop.alert.min.js create mode 100644 media/com_redshop/js/redshop.attribute-manipulation.js create mode 100644 media/com_redshop/js/redshop.attribute-manipulation.min.js create mode 100644 media/com_redshop/js/redshop.attribute.js create mode 100644 media/com_redshop/js/redshop.attribute.min.js create mode 100644 media/com_redshop/js/redshop.common.js create mode 100644 media/com_redshop/js/redshop.common.min.js create mode 100644 media/com_redshop/js/redshop.creditcard.js create mode 100644 media/com_redshop/js/redshop.creditcard.min.js create mode 100644 media/com_redshop/js/redshop.fields.js create mode 100644 media/com_redshop/js/redshop.fields.min.js create mode 100644 media/com_redshop/js/redshop.inline.js create mode 100644 media/com_redshop/js/redshop.inline.min.js create mode 100644 media/com_redshop/js/redshop.js create mode 100644 media/com_redshop/js/redshop.layout.js create mode 100644 media/com_redshop/js/redshop.layout.min.js create mode 100644 media/com_redshop/js/redshop.media.js create mode 100644 media/com_redshop/js/redshop.media.min.js create mode 100644 media/com_redshop/js/redshop.min.js create mode 100644 media/com_redshop/js/redshop.onestep.js create mode 100644 media/com_redshop/js/redshop.onestep.min.js create mode 100644 media/com_redshop/js/redshop.order.js create mode 100644 media/com_redshop/js/redshop.order.min.js create mode 100644 media/com_redshop/js/redshop.redbox.js create mode 100644 media/com_redshop/js/redshop.redbox.min.js create mode 100644 media/com_redshop/js/redshop.registration.js create mode 100644 media/com_redshop/js/redshop.registration.min.js create mode 100644 media/com_redshop/js/redshop.search.js create mode 100644 media/com_redshop/js/redshop.search.min.js create mode 100644 media/com_redshop/js/redshop.thumbscroller.js create mode 100644 media/com_redshop/js/redshop.thumbscroller.min.js create mode 100644 media/com_redshop/js/redshop.utils.js create mode 100644 media/com_redshop/js/redshop.utils.min.js create mode 100644 media/com_redshop/js/redshop.validation.js create mode 100644 media/com_redshop/js/redshop.validation.min.js create mode 100644 media/com_redshop/js/redshop.wishlist.js create mode 100644 media/com_redshop/js/redshop.wishlist.min.js create mode 100644 media/com_redshop/js/redshop.xmlfunc.js create mode 100644 media/com_redshop/js/redshop.xmlfunc.min.js create mode 100644 media/com_redshop/js/select2.js create mode 100644 media/com_redshop/js/select2.min.js create mode 100644 media/com_redshop/js/sortablelist.js create mode 100644 media/com_redshop/js/sortablelist.min.js create mode 100644 media/com_redshop/templates/accessory_template/default.php create mode 100755 media/com_redshop/templates/account_template/default.php create mode 100644 media/com_redshop/templates/add_to_cart/default.php create mode 100644 media/com_redshop/templates/ajax_cart_box/default.php create mode 100644 media/com_redshop/templates/ajax_cart_detail_box/default.php create mode 100644 media/com_redshop/templates/ask_question_template/default.php create mode 100644 media/com_redshop/templates/attribute_template/default.php create mode 100644 media/com_redshop/templates/attributewithcart_template/default.php create mode 100644 media/com_redshop/templates/billing_template/default.php create mode 100644 media/com_redshop/templates/cart/default.php create mode 100644 media/com_redshop/templates/catalog/default.php create mode 100644 media/com_redshop/templates/catalogue_cart/default.php create mode 100644 media/com_redshop/templates/catalogue_order_detail/default.php create mode 100644 media/com_redshop/templates/catalogue_order_receipt/default.php create mode 100644 media/com_redshop/templates/category/default.php create mode 100644 media/com_redshop/templates/categoryproduct/default.php create mode 100644 media/com_redshop/templates/change_cart_attribute/default.php create mode 100644 media/com_redshop/templates/checkout/default.php create mode 100644 media/com_redshop/templates/clicktell_sms_message/default.php create mode 100644 media/com_redshop/templates/company_billing_template/default.php create mode 100644 media/com_redshop/templates/compare_product/default.php create mode 100644 media/com_redshop/templates/empty_cart/default.php create mode 100644 media/com_redshop/templates/frontpage_category/default.php create mode 100644 media/com_redshop/templates/giftcard/default.php create mode 100644 media/com_redshop/templates/giftcard_list/default.php create mode 100644 media/com_redshop/templates/login/default.php create mode 100644 media/com_redshop/templates/manufacturer/default.php create mode 100644 media/com_redshop/templates/manufacturer_detail/default.php create mode 100644 media/com_redshop/templates/manufacturer_products/default.php create mode 100644 media/com_redshop/templates/newsletter/default.php create mode 100644 media/com_redshop/templates/newsletter_product/default.php create mode 100644 media/com_redshop/templates/onestep_checkout/default.php create mode 100644 media/com_redshop/templates/order_detail/default.php create mode 100644 media/com_redshop/templates/order_list/default.php create mode 100644 media/com_redshop/templates/order_print/default.php create mode 100644 media/com_redshop/templates/order_receipt/default.php create mode 100644 media/com_redshop/templates/private_billing_template/default.php create mode 100644 media/com_redshop/templates/product/default.php create mode 100644 media/com_redshop/templates/product_content_template/default.php create mode 100644 media/com_redshop/templates/product_sample/default.php create mode 100644 media/com_redshop/templates/quotation_cart/default.php create mode 100644 media/com_redshop/templates/quotation_detail/default.php create mode 100644 media/com_redshop/templates/quotation_request/default.php create mode 100644 media/com_redshop/templates/redproductfinder/default.php create mode 100644 media/com_redshop/templates/redshop_payment/default.php create mode 100644 media/com_redshop/templates/redshop_shipping/default.php create mode 100644 media/com_redshop/templates/related_product/default.php create mode 100644 media/com_redshop/templates/review/default.php create mode 100644 media/com_redshop/templates/shipping_pdf/default.php create mode 100644 media/com_redshop/templates/shipping_template/default.php create mode 100644 media/com_redshop/templates/shippingbox/default.php create mode 100644 media/com_redshop/templates/stock_note/default.php create mode 100644 media/com_redshop/templates/wishlist_mail_template/default.php create mode 100644 media/com_redshop/templates/wishlist_template/default.php create mode 100644 media/com_redshop/templates/wrapper_template/default.php create mode 100644 media/com_redshop/translations/README.md create mode 100755 media/com_redshop/translations/category.xml create mode 100644 media/com_redshop/translations/index.html create mode 100644 media/com_redshop/translations/mail.xml create mode 100755 media/com_redshop/translations/manufacturer.xml create mode 100755 media/com_redshop/translations/product.xml create mode 100755 media/com_redshop/translations/product_attribute.xml create mode 100755 media/com_redshop/translations/product_attribute_property.xml create mode 100755 media/com_redshop/translations/product_fields.xml create mode 100644 media/com_redshop/translations/product_fields_data.xml create mode 100644 media/com_redshop/translations/product_fields_value.xml create mode 100755 media/com_redshop/translations/product_subattribute_color.xml create mode 100644 media/com_redshop/translations/robots.txt create mode 100755 media/com_redshop/translations/tags.xml create mode 100644 media/com_redshop/translations/template.xml create mode 100755 media/com_redshop/translations/textlibrary.xml create mode 100644 media/index.html create mode 100755 modules/site/mod_redshop_cart/css/cart.css create mode 100755 modules/site/mod_redshop_cart/css/index.html create mode 100755 modules/site/mod_redshop_cart/images/index.html create mode 100755 modules/site/mod_redshop_cart/images/laegikurven.jpg create mode 100755 modules/site/mod_redshop_cart/images/shopping_cart_icon.png create mode 100755 modules/site/mod_redshop_cart/index.html create mode 100755 modules/site/mod_redshop_cart/language/en-GB/en-GB.mod_redshop_cart.ini create mode 100644 modules/site/mod_redshop_cart/language/en-GB/en-GB.mod_redshop_cart.sys.ini create mode 100755 modules/site/mod_redshop_cart/language/en-GB/index.html create mode 100755 modules/site/mod_redshop_cart/language/index.html create mode 100755 modules/site/mod_redshop_cart/mod_redshop_cart.php create mode 100755 modules/site/mod_redshop_cart/mod_redshop_cart.xml create mode 100755 modules/site/mod_redshop_cart/tmpl/default.php create mode 100755 modules/site/mod_redshop_cart/tmpl/index.html create mode 100644 modules/site/mod_redshop_search/helper.php create mode 100644 modules/site/mod_redshop_search/index.html create mode 100644 modules/site/mod_redshop_search/js/index.html create mode 100644 modules/site/mod_redshop_search/js/search.js create mode 100644 modules/site/mod_redshop_search/js/search.min.js create mode 100644 modules/site/mod_redshop_search/language/en-GB/en-GB.mod_redshop_search.ini create mode 100644 modules/site/mod_redshop_search/language/en-GB/en-GB.mod_redshop_search.sys.ini create mode 100644 modules/site/mod_redshop_search/language/en-GB/index.html create mode 100644 modules/site/mod_redshop_search/language/index.html create mode 100644 modules/site/mod_redshop_search/mod_redshop_search.php create mode 100644 modules/site/mod_redshop_search/mod_redshop_search.xml create mode 100644 modules/site/mod_redshop_search/tmpl/default.php create mode 100644 modules/site/mod_redshop_search/tmpl/index.html create mode 100644 nano.save create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 plugins/finder/redshop/language/en-GB/en-GB.plg_finder_redshop.ini create mode 100644 plugins/finder/redshop/language/en-GB/en-GB.plg_finder_redshop.sys.ini create mode 100644 plugins/finder/redshop/redshop.php create mode 100644 plugins/finder/redshop/redshop.xml create mode 100644 plugins/quickicon/redshop/index.html create mode 100644 plugins/quickicon/redshop/language/en-GB/en-GB.plg_quickicon_redshop.ini create mode 100644 plugins/quickicon/redshop/language/en-GB/en-GB.plg_quickicon_redshop.sys.ini create mode 100644 plugins/quickicon/redshop/redshop.php create mode 100644 plugins/quickicon/redshop/redshop.xml create mode 100644 plugins/redshop_alert/alert/alert.php create mode 100644 plugins/redshop_alert/alert/alert.xml create mode 100644 plugins/redshop_alert/alert/index.html create mode 100644 plugins/redshop_alert/alert/language/en-GB/en-GB.plg_redshop_alert_alert.ini create mode 100644 plugins/redshop_alert/alert/language/en-GB/en-GB.plg_redshop_alert_alert.sys.ini create mode 100644 plugins/redshop_export/attribute/attribute.php create mode 100644 plugins/redshop_export/attribute/attribute.xml create mode 100644 plugins/redshop_export/attribute/index.html create mode 100644 plugins/redshop_export/attribute/language/en-GB/en-GB.plg_redshop_export_attribute.ini create mode 100644 plugins/redshop_export/attribute/language/en-GB/en-GB.plg_redshop_export_attribute.sys.ini create mode 100644 plugins/redshop_export/category/category.php create mode 100644 plugins/redshop_export/category/category.xml create mode 100644 plugins/redshop_export/category/index.html create mode 100644 plugins/redshop_export/category/language/en-GB/en-GB.plg_redshop_export_category.ini create mode 100644 plugins/redshop_export/category/language/en-GB/en-GB.plg_redshop_export_category.sys.ini create mode 100644 plugins/redshop_export/field/field.php create mode 100644 plugins/redshop_export/field/field.xml create mode 100644 plugins/redshop_export/field/index.html create mode 100644 plugins/redshop_export/field/language/en-GB/en-GB.plg_redshop_export_field.ini create mode 100644 plugins/redshop_export/field/language/en-GB/en-GB.plg_redshop_export_field.sys.ini create mode 100644 plugins/redshop_export/index.html create mode 100644 plugins/redshop_export/manufacturer/index.html create mode 100644 plugins/redshop_export/manufacturer/language/en-GB/en-GB.plg_redshop_export_manufacturer.ini create mode 100644 plugins/redshop_export/manufacturer/language/en-GB/en-GB.plg_redshop_export_manufacturer.sys.ini create mode 100644 plugins/redshop_export/manufacturer/manufacturer.php create mode 100644 plugins/redshop_export/manufacturer/manufacturer.xml create mode 100644 plugins/redshop_export/newsletter_subscriber/index.html create mode 100644 plugins/redshop_export/newsletter_subscriber/language/en-GB/en-GB.plg_redshop_export_newsletter_subscriber.ini create mode 100644 plugins/redshop_export/newsletter_subscriber/language/en-GB/en-GB.plg_redshop_export_newsletter_subscriber.sys.ini create mode 100644 plugins/redshop_export/newsletter_subscriber/newsletter_subscriber.php create mode 100644 plugins/redshop_export/newsletter_subscriber/newsletter_subscriber.xml create mode 100644 plugins/redshop_export/product/index.html create mode 100644 plugins/redshop_export/product/language/en-GB/en-GB.plg_redshop_export_product.ini create mode 100644 plugins/redshop_export/product/language/en-GB/en-GB.plg_redshop_export_product.sys.ini create mode 100644 plugins/redshop_export/product/product.php create mode 100644 plugins/redshop_export/product/product.xml create mode 100644 plugins/redshop_export/product_stockroom_data/index.html create mode 100644 plugins/redshop_export/product_stockroom_data/language/en-GB/en-GB.plg_redshop_export_product_stockroom_data.ini create mode 100644 plugins/redshop_export/product_stockroom_data/language/en-GB/en-GB.plg_redshop_export_product_stockroom_data.sys.ini create mode 100644 plugins/redshop_export/product_stockroom_data/product_stockroom_data.php create mode 100644 plugins/redshop_export/product_stockroom_data/product_stockroom_data.xml create mode 100644 plugins/redshop_export/related_product/index.html create mode 100644 plugins/redshop_export/related_product/language/en-GB/en-GB.plg_redshop_export_related_product.ini create mode 100644 plugins/redshop_export/related_product/language/en-GB/en-GB.plg_redshop_export_related_product.sys.ini create mode 100644 plugins/redshop_export/related_product/related_product.php create mode 100644 plugins/redshop_export/related_product/related_product.xml create mode 100644 plugins/redshop_export/shipping_address/index.html create mode 100644 plugins/redshop_export/shipping_address/language/en-GB/en-GB.plg_redshop_export_shipping_address.ini create mode 100644 plugins/redshop_export/shipping_address/language/en-GB/en-GB.plg_redshop_export_shipping_address.sys.ini create mode 100644 plugins/redshop_export/shipping_address/shipping_address.php create mode 100644 plugins/redshop_export/shipping_address/shipping_address.xml create mode 100644 plugins/redshop_export/shopper_group_attribute_price/index.html create mode 100644 plugins/redshop_export/shopper_group_attribute_price/language/en-GB/en-GB.plg_redshop_export_shopper_group_attribute_price.ini create mode 100644 plugins/redshop_export/shopper_group_attribute_price/language/en-GB/en-GB.plg_redshop_export_shopper_group_attribute_price.sys.ini create mode 100644 plugins/redshop_export/shopper_group_attribute_price/shopper_group_attribute_price.php create mode 100644 plugins/redshop_export/shopper_group_attribute_price/shopper_group_attribute_price.xml create mode 100644 plugins/redshop_export/shopper_group_product_price/index.html create mode 100644 plugins/redshop_export/shopper_group_product_price/language/en-GB/en-GB.plg_redshop_export_shopper_group_product_price.ini create mode 100644 plugins/redshop_export/shopper_group_product_price/language/en-GB/en-GB.plg_redshop_export_shopper_group_product_price.sys.ini create mode 100644 plugins/redshop_export/shopper_group_product_price/shopper_group_product_price.php create mode 100644 plugins/redshop_export/shopper_group_product_price/shopper_group_product_price.xml create mode 100644 plugins/redshop_export/user/index.html create mode 100644 plugins/redshop_export/user/language/en-GB/en-GB.plg_redshop_export_user.ini create mode 100644 plugins/redshop_export/user/language/en-GB/en-GB.plg_redshop_export_user.sys.ini create mode 100644 plugins/redshop_export/user/user.php create mode 100644 plugins/redshop_export/user/user.xml create mode 100644 plugins/redshop_import/attribute/attribute.php create mode 100644 plugins/redshop_import/attribute/attribute.xml create mode 100644 plugins/redshop_import/attribute/index.html create mode 100644 plugins/redshop_import/attribute/language/en-GB/en-GB.plg_redshop_import_attribute.ini create mode 100644 plugins/redshop_import/attribute/language/en-GB/en-GB.plg_redshop_import_attribute.sys.ini create mode 100644 plugins/redshop_import/category/category.php create mode 100644 plugins/redshop_import/category/category.xml create mode 100644 plugins/redshop_import/category/index.html create mode 100644 plugins/redshop_import/category/language/en-GB/en-GB.plg_redshop_import_category.ini create mode 100644 plugins/redshop_import/category/language/en-GB/en-GB.plg_redshop_import_category.sys.ini create mode 100644 plugins/redshop_import/field/field.php create mode 100644 plugins/redshop_import/field/field.xml create mode 100644 plugins/redshop_import/field/index.html create mode 100644 plugins/redshop_import/field/language/en-GB/en-GB.plg_redshop_import_field.ini create mode 100644 plugins/redshop_import/field/language/en-GB/en-GB.plg_redshop_import_field.sys.ini create mode 100644 plugins/redshop_import/manufacturer/index.html create mode 100644 plugins/redshop_import/manufacturer/language/en-GB/en-GB.plg_redshop_import_manufacturer.ini create mode 100644 plugins/redshop_import/manufacturer/language/en-GB/en-GB.plg_redshop_import_manufacturer.sys.ini create mode 100644 plugins/redshop_import/manufacturer/manufacturer.php create mode 100644 plugins/redshop_import/manufacturer/manufacturer.xml create mode 100644 plugins/redshop_import/newsletter_subscriber/index.html create mode 100644 plugins/redshop_import/newsletter_subscriber/language/en-GB/en-GB.plg_redshop_import_newsletter_subscriber.ini create mode 100644 plugins/redshop_import/newsletter_subscriber/language/en-GB/en-GB.plg_redshop_import_newsletter_subscriber.sys.ini create mode 100644 plugins/redshop_import/newsletter_subscriber/newsletter_subscriber.php create mode 100644 plugins/redshop_import/newsletter_subscriber/newsletter_subscriber.xml create mode 100644 plugins/redshop_import/product/index.html create mode 100644 plugins/redshop_import/product/language/en-GB/en-GB.plg_redshop_import_product.ini create mode 100644 plugins/redshop_import/product/language/en-GB/en-GB.plg_redshop_import_product.sys.ini create mode 100644 plugins/redshop_import/product/product.php create mode 100644 plugins/redshop_import/product/product.xml create mode 100644 plugins/redshop_import/product_stockroom_data/index.html create mode 100644 plugins/redshop_import/product_stockroom_data/language/en-GB/en-GB.plg_redshop_import_product_stockroom_data.ini create mode 100644 plugins/redshop_import/product_stockroom_data/language/en-GB/en-GB.plg_redshop_import_product_stockroom_data.sys.ini create mode 100644 plugins/redshop_import/product_stockroom_data/product_stockroom_data.php create mode 100644 plugins/redshop_import/product_stockroom_data/product_stockroom_data.xml create mode 100644 plugins/redshop_import/related_product/index.html create mode 100644 plugins/redshop_import/related_product/language/en-GB/en-GB.plg_redshop_import_related_product.ini create mode 100644 plugins/redshop_import/related_product/language/en-GB/en-GB.plg_redshop_import_related_product.sys.ini create mode 100644 plugins/redshop_import/related_product/related_product.php create mode 100644 plugins/redshop_import/related_product/related_product.xml create mode 100644 plugins/redshop_import/shipping_address/index.html create mode 100644 plugins/redshop_import/shipping_address/language/en-GB/en-GB.plg_redshop_import_shipping_address.ini create mode 100644 plugins/redshop_import/shipping_address/language/en-GB/en-GB.plg_redshop_import_shipping_address.sys.ini create mode 100644 plugins/redshop_import/shipping_address/shipping_address.php create mode 100644 plugins/redshop_import/shipping_address/shipping_address.xml create mode 100644 plugins/redshop_import/shopper_group_attribute_price/index.html create mode 100644 plugins/redshop_import/shopper_group_attribute_price/language/en-GB/en-GB.plg_redshop_import_shopper_group_attribute_price.ini create mode 100644 plugins/redshop_import/shopper_group_attribute_price/language/en-GB/en-GB.plg_redshop_import_shopper_group_attribute_price.sys.ini create mode 100644 plugins/redshop_import/shopper_group_attribute_price/shopper_group_attribute_price.php create mode 100644 plugins/redshop_import/shopper_group_attribute_price/shopper_group_attribute_price.xml create mode 100644 plugins/redshop_import/shopper_group_product_price/index.html create mode 100644 plugins/redshop_import/shopper_group_product_price/language/en-GB/en-GB.plg_redshop_import_shopper_group_product_price.ini create mode 100644 plugins/redshop_import/shopper_group_product_price/language/en-GB/en-GB.plg_redshop_import_shopper_group_product_price.sys.ini create mode 100644 plugins/redshop_import/shopper_group_product_price/shopper_group_product_price.php create mode 100644 plugins/redshop_import/shopper_group_product_price/shopper_group_product_price.xml create mode 100644 plugins/redshop_import/user/index.html create mode 100644 plugins/redshop_import/user/language/en-GB/en-GB.plg_redshop_import_user.ini create mode 100644 plugins/redshop_import/user/language/en-GB/en-GB.plg_redshop_import_user.sys.ini create mode 100644 plugins/redshop_import/user/user.php create mode 100644 plugins/redshop_import/user/user.xml create mode 100644 plugins/redshop_payment/rs_payment_banktransfer/index.html create mode 100644 plugins/redshop_payment/rs_payment_banktransfer/language/en-GB/en-GB.plg_redshop_payment_rs_payment_banktransfer.ini create mode 100644 plugins/redshop_payment/rs_payment_banktransfer/language/en-GB/en-GB.plg_redshop_payment_rs_payment_banktransfer.sys.ini create mode 100644 plugins/redshop_payment/rs_payment_banktransfer/language/en-GB/index.html create mode 100644 plugins/redshop_payment/rs_payment_banktransfer/language/index.html create mode 100644 plugins/redshop_payment/rs_payment_banktransfer/rs_payment_banktransfer.php create mode 100644 plugins/redshop_payment/rs_payment_banktransfer/rs_payment_banktransfer.xml create mode 100644 plugins/redshop_payment/rs_payment_paypal/index.html create mode 100644 plugins/redshop_payment/rs_payment_paypal/language/en-GB/en-GB.plg_redshop_payment_rs_payment_paypal.ini create mode 100644 plugins/redshop_payment/rs_payment_paypal/language/en-GB/en-GB.plg_redshop_payment_rs_payment_paypal.sys.ini create mode 100644 plugins/redshop_payment/rs_payment_paypal/language/en-GB/index.html create mode 100644 plugins/redshop_payment/rs_payment_paypal/language/index.html create mode 100644 plugins/redshop_payment/rs_payment_paypal/rs_payment_paypal.php create mode 100644 plugins/redshop_payment/rs_payment_paypal/rs_payment_paypal.xml create mode 100644 plugins/redshop_payment/rs_payment_paypal/rs_payment_paypal/extra_info.php create mode 100644 plugins/redshop_payment/rs_payment_paypal/rs_payment_paypal/index.html create mode 100644 plugins/redshop_pdf/tcpdf/helper/composer.json create mode 100644 plugins/redshop_pdf/tcpdf/helper/helper.php create mode 100644 plugins/redshop_pdf/tcpdf/helper/index.html create mode 100644 plugins/redshop_pdf/tcpdf/index.html create mode 100644 plugins/redshop_pdf/tcpdf/install.php create mode 100644 plugins/redshop_pdf/tcpdf/language/en-GB/en-GB.plg_redshop_pdf_tcpdf.ini create mode 100644 plugins/redshop_pdf/tcpdf/language/en-GB/en-GB.plg_redshop_pdf_tcpdf.sys.ini create mode 100644 plugins/redshop_pdf/tcpdf/language/en-GB/index.html create mode 100644 plugins/redshop_pdf/tcpdf/language/index.html create mode 100644 plugins/redshop_pdf/tcpdf/tcpdf.php create mode 100644 plugins/redshop_pdf/tcpdf/tcpdf.xml create mode 100644 plugins/redshop_product/sh404urls/language/en-GB/en-GB.plg_redshop_product_sh404urls.ini create mode 100644 plugins/redshop_product/sh404urls/language/en-GB/en-GB.plg_redshop_product_sh404urls.sys.ini create mode 100644 plugins/redshop_product/sh404urls/sh404urls.php create mode 100644 plugins/redshop_product/sh404urls/sh404urls.xml create mode 100644 plugins/redshop_shipping/default_shipping/default_shipping.php create mode 100644 plugins/redshop_shipping/default_shipping/default_shipping.xml create mode 100644 plugins/redshop_shipping/default_shipping/index.html create mode 100644 plugins/redshop_shipping/default_shipping/language/en-GB/en-GB.plg_redshop_shipping_default_shipping.ini create mode 100644 plugins/redshop_shipping/default_shipping/language/en-GB/en-GB.plg_redshop_shipping_default_shipping.sys.ini create mode 100644 plugins/redshop_shipping/default_shipping/language/en-GB/index.html create mode 100644 plugins/redshop_shipping/default_shipping/language/index.html create mode 100644 plugins/search/redshop_categories/index.html create mode 100644 plugins/search/redshop_categories/language/en-GB/en-GB.plg_search_redshop_categories.ini create mode 100644 plugins/search/redshop_categories/language/en-GB/en-GB.plg_search_redshop_categories.sys.ini create mode 100644 plugins/search/redshop_categories/language/en-GB/index.html create mode 100644 plugins/search/redshop_categories/language/index.html create mode 100644 plugins/search/redshop_categories/redshop_categories.php create mode 100644 plugins/search/redshop_categories/redshop_categories.xml create mode 100644 plugins/search/redshop_products/index.html create mode 100644 plugins/search/redshop_products/language/en-GB/en-GB.plg_search_redshop_products.ini create mode 100644 plugins/search/redshop_products/language/en-GB/en-GB.plg_search_redshop_products.sys.ini create mode 100644 plugins/search/redshop_products/language/en-GB/index.html create mode 100644 plugins/search/redshop_products/language/index.html create mode 100644 plugins/search/redshop_products/redshop_products.php create mode 100644 plugins/search/redshop_products/redshop_products.xml create mode 100644 plugins/sh404sefextplugins/sh404sefextplugincom_redshop/index.html create mode 100644 plugins/sh404sefextplugins/sh404sefextplugincom_redshop/language/en-GB/en-GB.plg_sh404sefextplugins_sh404sefextplugincom_redshop.ini create mode 100644 plugins/sh404sefextplugins/sh404sefextplugincom_redshop/language/en-GB/en-GB.plg_sh404sefextplugins_sh404sefextplugincom_redshop.sys.ini create mode 100644 plugins/sh404sefextplugins/sh404sefextplugincom_redshop/redshop/index.html create mode 100644 plugins/sh404sefextplugins/sh404sefextplugincom_redshop/redshop/meta.php create mode 100644 plugins/sh404sefextplugins/sh404sefextplugincom_redshop/redshop/sef.php create mode 100644 plugins/sh404sefextplugins/sh404sefextplugincom_redshop/sh404sefextplugincom_redshop.php create mode 100644 plugins/sh404sefextplugins/sh404sefextplugincom_redshop/sh404sefextplugincom_redshop.xml create mode 100644 plugins/system/redgoogleanalytics/helper/google_analytics.php create mode 100644 plugins/system/redgoogleanalytics/helper/index.html create mode 100644 plugins/system/redgoogleanalytics/index.html create mode 100644 plugins/system/redgoogleanalytics/install.php create mode 100755 plugins/system/redgoogleanalytics/language/en-GB/en-GB.plg_system_redgoogleanalytics.ini create mode 100755 plugins/system/redgoogleanalytics/language/en-GB/en-GB.plg_system_redgoogleanalytics.sys.ini create mode 100755 plugins/system/redgoogleanalytics/language/en-GB/index.html create mode 100755 plugins/system/redgoogleanalytics/language/index.html create mode 100644 plugins/system/redgoogleanalytics/redgoogleanalytics.php create mode 100644 plugins/system/redgoogleanalytics/redgoogleanalytics.xml create mode 100644 plugins/system/redshop/index.html create mode 100644 plugins/system/redshop/language/en-GB/en-GB.plg_system_redshop.ini create mode 100644 plugins/system/redshop/language/en-GB/en-GB.plg_system_redshop.sys.ini create mode 100644 plugins/system/redshop/redshop.php create mode 100644 plugins/system/redshop/redshop.xml create mode 100644 redshop.xml create mode 100644 src/assets/com_redshop/js/ajaxupload.js create mode 100644 src/assets/com_redshop/js/media.js create mode 100644 src/assets/com_redshop/js/redshop.admin.common.js create mode 100644 src/assets/com_redshop/js/redshop.admin.js create mode 100644 src/assets/com_redshop/js/redshop.admin.media.js create mode 100644 src/assets/com_redshop/js/redshop.alert.js create mode 100644 src/assets/com_redshop/js/redshop.attribute-manipulation.js create mode 100644 src/assets/com_redshop/js/redshop.attribute.js create mode 100644 src/assets/com_redshop/js/redshop.common.js create mode 100644 src/assets/com_redshop/js/redshop.creditcard.js create mode 100644 src/assets/com_redshop/js/redshop.fields.js create mode 100644 src/assets/com_redshop/js/redshop.inline.js create mode 100644 src/assets/com_redshop/js/redshop.js create mode 100644 src/assets/com_redshop/js/redshop.layout.js create mode 100644 src/assets/com_redshop/js/redshop.media.js create mode 100644 src/assets/com_redshop/js/redshop.onestep.js create mode 100644 src/assets/com_redshop/js/redshop.order.js create mode 100644 src/assets/com_redshop/js/redshop.redbox.js create mode 100644 src/assets/com_redshop/js/redshop.registration.js create mode 100644 src/assets/com_redshop/js/redshop.search.js create mode 100644 src/assets/com_redshop/js/redshop.thumbscroller.js create mode 100644 src/assets/com_redshop/js/redshop.utils.js create mode 100644 src/assets/com_redshop/js/redshop.validation.js create mode 100644 src/assets/com_redshop/js/redshop.wishlist.js create mode 100644 src/assets/com_redshop/js/redshop.xmlfunc.js create mode 100644 src/assets/com_redshop/scss/_bootstrap-compass.scss create mode 100644 src/assets/com_redshop/scss/_bootstrap-mincer.scss create mode 100644 src/assets/com_redshop/scss/_bootstrap-nav-wizard.scss create mode 100644 src/assets/com_redshop/scss/_bootstrap-sprockets.scss create mode 100644 src/assets/com_redshop/scss/_bootstrap-variables.sass create mode 100644 src/assets/com_redshop/scss/_bootstrap.scss create mode 100644 src/assets/com_redshop/scss/bootstrap-grid.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_alerts.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_badges.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_breadcrumbs.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_button-groups.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_buttons.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_carousel.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_close.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_code.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_component-animations.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_dropdowns.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_forms.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_glyphicons.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_grid-nocontainer.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_grid.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_input-groups.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_jumbotron.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_labels.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_list-group.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_media.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_mixins.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_modals.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_navbar.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_navs.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_normalize.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_pager.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_pagination.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_panels.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_popovers.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_print.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_progress-bars.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_responsive-embed.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_responsive-utilities.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_scaffolding.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_tables.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_theme.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_thumbnails.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_tooltip.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_type.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_utilities.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_variables.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/_wells.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_alerts.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_background-variant.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_border-radius.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_buttons.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_center-block.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_clearfix.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_forms.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_gradients.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_grid-framework.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_grid.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_hide-text.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_image.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_labels.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_list-group.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_nav-divider.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_nav-vertical-align.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_opacity.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_pagination.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_panels.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_progress-bar.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_reset-filter.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_reset-text.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_resize.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_responsive-visibility.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_size.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_tab-focus.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_table-row.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_text-emphasis.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_text-overflow.scss create mode 100644 src/assets/com_redshop/scss/bootstrap/mixins/_vendor-prefixes.scss create mode 100644 src/assets/com_redshop/scss/redshop.layout.scss create mode 100644 src/assets/com_redshop/scss/redshop.media.scss create mode 100644 src/assets/com_redshop/scss/redshop.medialist-thumbs.scss create mode 100644 src/assets/com_redshop/scss/redshop.priceslider.scss create mode 100644 src/assets/com_redshop/scss/redshop.print.scss create mode 100644 src/assets/com_redshop/scss/redshop.scss create mode 100644 src/assets/com_redshop/scss/redshop.search.scss create mode 100644 src/assets/com_redshop/scss/redshop.update.scss create mode 100644 src/assets/com_redshop/scss/redshop.validation.scss create mode 100644 src/assets/com_redshop/scss/redshop.wizard.scss create mode 100644 src/db/redshop.mwb create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.com_redshop.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.com_redshop.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_acymailing_redshop.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_acymailing_redshop.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_aesir_field_redshop_product.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_aesir_field_redshop_product.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_ajax_xmlcron.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_ajax_xmlcron.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_content_redshop_product.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_content_redshop_product.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_economic_economic.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_economic_economic.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_editors-xtd_product.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_editors-xtd_product.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_finder_redshop.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_finder_redshop.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_logman_redshop.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_logman_redshop.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_quickicon_redshop.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_quickicon_redshop.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_alert_alert.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_alert_alert.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_checkout_kerry_express.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_checkout_kerry_express.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_attribute.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_attribute.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_category.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_category.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_field.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_field.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_manufacturer.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_manufacturer.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_newsletter_subscriber.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_newsletter_subscriber.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_product.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_product.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_product_stockroom_data.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_product_stockroom_data.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_related_product.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_related_product.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_shipping_address.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_shipping_address.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_shopper_group_attribute_price.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_shopper_group_product_price.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_shopper_group_product_price.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_user.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_export_user.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_attribute.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_attribute.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_category.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_category.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_field.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_field.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_manufacturer.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_manufacturer.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_newsletter_subscriber.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_newsletter_subscriber.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_product.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_product.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_product_stockroom_data.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_product_stockroom_data.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_related_product.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_related_product.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_shipping_address.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_shipping_address.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_shopper_group_attribute_price.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_shopper_group_product_price.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_shopper_group_product_price.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_user.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_import_user.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_order_esms.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_order_esms.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_baokim.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_baokim.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_cielo.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_cielo.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_dibsdx.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_dibsdx.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_dotpay.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_dotpay.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_ingenico.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_ingenico.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_klarna.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_klarna.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_mollieideal.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_mollieideal.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_nganluong.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_nganluong.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_paygate.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_paygate.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_paypalcreditcard.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_paypalcreditcard.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_payson.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_payson.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_quickbook.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_quickbook.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_quickpay.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_quickpay.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_2checkout.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_2checkout.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_amazoncheckout.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_amazoncheckout.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_authorize.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_authorize.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_authorize_dpm.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_authorize_dpm.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_banktransfer.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_banktransfer.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_banktransfer2.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_banktransfer2.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_banktransfer_discount.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_banktransfer_discount.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_beanstream.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_beanstream.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_braintree.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_braintree.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_cod.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_cod.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_dibspaymentmethod.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_dibspaymentmethod.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_eantransfer.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_eantransfer.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_epayv2.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_epayv2.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_eway.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_eway.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_eway3dsecure.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_eway3dsecure.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_giropay.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_giropay.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_imglobal.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_imglobal.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_moneris.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_moneris.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_moneybooker.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_moneybooker.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_payflowpro.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_payflowpro.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_payment_express.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_payment_express.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_paymill.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_paymill.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_paypal.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_paypal.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_postfinance.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_postfinance.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_rapid_eway.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_rapid_eway.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_sagepay.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_sagepay.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_sagepay_vps.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_sagepay_vps.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_worldpay.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_rs_payment_worldpay.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_stripe.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_payment_stripe.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_pdf_dompdf.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_pdf_dompdf.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_pdf_mpdf.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_pdf_mpdf.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_pdf_tcpdf.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_pdf_tcpdf.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_CreateColorImage.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_CreateColorImage.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_bundle.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_bundle.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_canonical.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_canonical.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_custom_field_mapping.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_custom_field_mapping.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_discount_affect_attribute.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_discount_affect_attribute.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_discount_rule.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_discount_rule.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_gift.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_gift.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_gls.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_gls.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_google_microdata.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_google_microdata.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_invoicepdf.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_invoicepdf.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_postdanmark.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_postdanmark.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_product_alttext.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_product_alttext.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_shoppergroup_tags.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_shoppergroup_tags.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_stock_notifyemail.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_stock_notifyemail.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_stockroom_status.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_stockroom_status.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_sync_b2b.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_sync_b2b.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_type_bundle.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_type_bundle.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_type_gift.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_type_gift.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_wss_datafeed.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_product_wss_datafeed.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_bring.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_bring.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_default_shipping.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_default_shipping.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_default_shipping_gls.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_default_shipping_gls.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_default_shipping_glsbusiness.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_default_shipping_glsbusiness.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_fedex.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_fedex.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_giaohangnhanh.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_giaohangnhanh.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_postdanmark.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_postdanmark.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_self_pickup.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_self_pickup.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_shipper.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_shipper.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_ups.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_ups.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_uspsv4.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_shipping_uspsv4.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_user_cmc_integrate.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_user_cmc_integrate.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_user_joomlamailer_integrate.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_user_joomlamailer_integrate.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_user_registration_acymailing.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_user_registration_acymailing.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_vies_registration_rs_vies_registration.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_redshop_vies_registration_rs_vies_registration.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_search_redshop_categories.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_search_redshop_categories.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_search_redshop_products.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_search_redshop_products.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_sh404sefextplugins_sh404sefextplugincom_redshop.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_sh404sefextplugins_sh404sefextplugincom_redshop.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_agile_crm.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_agile_crm.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_quickbook.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_quickbook.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redgoogleanalytics.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redgoogleanalytics.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redlightbox_slideshow.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redlightbox_slideshow.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redproductzoom.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redproductzoom.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redshop.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redshop.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redshop_product_bundle.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redshop_product_bundle.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redshop_send_discountcode.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_system_redshop_send_discountcode.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_user_highrise.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_user_highrise.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_user_redshop_avatar.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_user_redshop_avatar.sys.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_xmap_com_redshop.ini create mode 100644 src/lang/da-DK/admin/da-DK/da-DK.plg_xmap_com_redshop.sys.ini create mode 100644 src/lang/da-DK/install.xml create mode 100644 src/lang/da-DK/site/da-DK/da-DK.com_redshop.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.lib_redshop.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.lib_redshop.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_fb_albums.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_fb_albums.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redcategoryscroller.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redcategoryscroller.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redfeaturedproduct.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redfeaturedproduct.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redmanufacturer.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redmanufacturer.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redmasscart.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redmasscart.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redproducts3d.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redproducts3d.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redproductscroller.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redproductscroller.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redproducttab.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redproducttab.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_aesir_products.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_aesir_products.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_cart.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_cart.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_categories.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_category_scroller.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_category_scroller.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_currencies.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_currencies.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_discount.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_discount.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_filter.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_filter.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_logingreeting.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_logingreeting.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_megamenu.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_megamenu.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_newsletter.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_newsletter.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_pricefilter.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_pricefilter.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_productcompare.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_productcompare.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_products.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_products.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_products_slideshow.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_products_slideshow.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_promote_free_shipping.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_promote_free_shipping.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_search.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_search.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_shoppergroup_category.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_shoppergroup_category.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_shoppergroup_product.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_shoppergroup_product.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_shoppergrouplogo.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_shoppergrouplogo.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_tags_similar.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_tags_similar.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_who_bought.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_who_bought.sys.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_wishlist.ini create mode 100644 src/lang/da-DK/site/da-DK/da-DK.mod_redshop_wishlist.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.com_redshop.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.com_redshop.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_acymailing_redshop.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_acymailing_redshop.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_aesir_field_redshop_product.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_aesir_field_redshop_product.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_ajax_xmlcron.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_ajax_xmlcron.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_content_redshop_product.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_content_redshop_product.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_economic_economic.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_economic_economic.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_editors-xtd_product.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_editors-xtd_product.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_finder_redshop.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_finder_redshop.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_logman_redshop.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_logman_redshop.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_quickicon_redshop.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_quickicon_redshop.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_alert_alert.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_alert_alert.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_checkout_kerry_express.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_checkout_kerry_express.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_attribute.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_attribute.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_category.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_category.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_field.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_field.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_manufacturer.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_manufacturer.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_newsletter_subscriber.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_newsletter_subscriber.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_product.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_product.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_product_stockroom_data.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_product_stockroom_data.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_related_product.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_related_product.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_shipping_address.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_shipping_address.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_shopper_group_attribute_price.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_shopper_group_product_price.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_shopper_group_product_price.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_user.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_export_user.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_attribute.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_attribute.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_category.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_category.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_field.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_field.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_manufacturer.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_manufacturer.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_newsletter_subscriber.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_newsletter_subscriber.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_product.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_product.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_product_stockroom_data.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_product_stockroom_data.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_related_product.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_related_product.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_shipping_address.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_shipping_address.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_shopper_group_attribute_price.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_shopper_group_product_price.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_shopper_group_product_price.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_user.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_import_user.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_order_esms.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_order_esms.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_baokim.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_baokim.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_cielo.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_cielo.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_dibsdx.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_dibsdx.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_dotpay.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_dotpay.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_ingenico.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_ingenico.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_klarna.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_klarna.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_mollieideal.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_mollieideal.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_nganluong.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_nganluong.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_paygate.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_paygate.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_paypalcreditcard.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_paypalcreditcard.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_payson.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_payson.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_quickbook.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_quickbook.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_quickpay.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_quickpay.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_2checkout.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_2checkout.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_amazoncheckout.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_amazoncheckout.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_authorize.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_authorize.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_authorize_dpm.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_authorize_dpm.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_banktransfer.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_banktransfer.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_banktransfer2.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_banktransfer2.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_banktransfer_discount.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_banktransfer_discount.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_beanstream.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_beanstream.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_braintree.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_braintree.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_cod.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_cod.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_dibspaymentmethod.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_dibspaymentmethod.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_eantransfer.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_eantransfer.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_epayv2.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_epayv2.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_eway.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_eway.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_eway3dsecure.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_eway3dsecure.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_giropay.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_giropay.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_imglobal.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_imglobal.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_moneris.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_moneris.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_moneybooker.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_moneybooker.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_payflowpro.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_payflowpro.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_payment_express.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_payment_express.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_paymill.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_paymill.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_paypal.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_paypal.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_postfinance.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_postfinance.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_rapid_eway.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_rapid_eway.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_sagepay.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_sagepay.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_sagepay_vps.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_sagepay_vps.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_worldpay.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_rs_payment_worldpay.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_stripe.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_payment_stripe.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_pdf_dompdf.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_pdf_dompdf.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_pdf_mpdf.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_pdf_mpdf.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_pdf_tcpdf.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_pdf_tcpdf.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_CreateColorImage.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_CreateColorImage.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_bundle.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_bundle.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_canonical.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_canonical.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_custom_field_mapping.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_custom_field_mapping.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_discount_affect_attribute.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_discount_affect_attribute.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_discount_rule.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_discount_rule.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_gift.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_gift.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_gls.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_gls.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_google_microdata.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_google_microdata.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_invoicepdf.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_invoicepdf.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_postdanmark.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_postdanmark.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_product_alttext.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_product_alttext.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_shoppergroup_tags.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_shoppergroup_tags.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_stock_notifyemail.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_stock_notifyemail.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_stockroom_status.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_stockroom_status.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_sync_b2b.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_sync_b2b.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_type_bundle.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_type_bundle.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_type_gift.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_type_gift.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_wss_datafeed.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_product_wss_datafeed.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_bring.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_bring.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_default_shipping.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_default_shipping.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_default_shipping_gls.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_default_shipping_gls.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_default_shipping_glsbusiness.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_default_shipping_glsbusiness.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_fedex.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_fedex.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_giaohangnhanh.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_giaohangnhanh.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_postdanmark.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_postdanmark.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_self_pickup.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_self_pickup.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_shipper.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_shipper.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_ups.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_ups.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_uspsv4.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_shipping_uspsv4.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_user_cmc_integrate.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_user_cmc_integrate.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_user_joomlamailer_integrate.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_user_joomlamailer_integrate.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_user_registration_acymailing.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_user_registration_acymailing.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_vies_registration_rs_vies_registration.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_redshop_vies_registration_rs_vies_registration.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_search_redshop_categories.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_search_redshop_categories.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_search_redshop_products.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_search_redshop_products.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_sh404sefextplugins_sh404sefextplugincom_redshop.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_sh404sefextplugins_sh404sefextplugincom_redshop.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_agile_crm.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_agile_crm.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_quickbook.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_quickbook.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redgoogleanalytics.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redgoogleanalytics.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redlightbox_slideshow.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redlightbox_slideshow.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redproductzoom.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redproductzoom.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redshop.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redshop.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redshop_product_bundle.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redshop_product_bundle.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redshop_send_discountcode.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_system_redshop_send_discountcode.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_user_highrise.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_user_highrise.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_user_redshop_avatar.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_user_redshop_avatar.sys.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_xmap_com_redshop.ini create mode 100644 src/lang/de-DE/admin/de-DE/de-DE.plg_xmap_com_redshop.sys.ini create mode 100644 src/lang/de-DE/install.xml create mode 100644 src/lang/de-DE/site/de-DE/de-DE.com_redshop.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.lib_redshop.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.lib_redshop.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_fb_albums.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_fb_albums.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redcategoryscroller.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redcategoryscroller.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redfeaturedproduct.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redfeaturedproduct.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redmanufacturer.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redmanufacturer.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redmasscart.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redmasscart.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redproducts3d.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redproducts3d.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redproductscroller.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redproductscroller.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redproducttab.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redproducttab.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_aesir_products.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_aesir_products.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_cart.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_cart.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_categories.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_category_scroller.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_category_scroller.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_currencies.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_currencies.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_discount.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_discount.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_filter.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_filter.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_logingreeting.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_logingreeting.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_megamenu.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_megamenu.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_newsletter.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_newsletter.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_pricefilter.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_pricefilter.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_productcompare.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_productcompare.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_products.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_products.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_products_slideshow.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_products_slideshow.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_promote_free_shipping.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_promote_free_shipping.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_search.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_search.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_shoppergroup_category.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_shoppergroup_category.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_shoppergroup_product.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_shoppergroup_product.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_shoppergrouplogo.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_shoppergrouplogo.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_tags_similar.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_tags_similar.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_who_bought.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_who_bought.sys.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_wishlist.ini create mode 100644 src/lang/de-DE/site/de-DE/de-DE.mod_redshop_wishlist.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.com_redshop.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.com_redshop.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_acymailing_redshop.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_acymailing_redshop.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_aesir_field_redshop_product.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_aesir_field_redshop_product.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_ajax_xmlcron.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_ajax_xmlcron.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_content_redshop_product.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_content_redshop_product.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_economic_economic.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_economic_economic.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_editors-xtd_product.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_editors-xtd_product.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_finder_redshop.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_finder_redshop.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_logman_redshop.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_logman_redshop.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_quickicon_redshop.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_quickicon_redshop.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_alert_alert.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_alert_alert.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_checkout_kerry_express.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_checkout_kerry_express.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_attribute.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_attribute.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_category.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_category.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_field.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_field.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_manufacturer.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_manufacturer.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_product.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_product.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_product_stockroom_data.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_product_stockroom_data.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_related_product.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_related_product.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_shipping_address.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_shipping_address.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_shopper_group_attribute_price.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_shopper_group_product_price.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_shopper_group_product_price.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_user.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_export_user.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_attribute.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_attribute.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_category.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_category.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_field.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_field.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_manufacturer.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_manufacturer.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_product.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_product.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_product_stockroom_data.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_product_stockroom_data.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_related_product.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_related_product.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_shipping_address.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_shipping_address.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_shopper_group_attribute_price.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_shopper_group_product_price.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_shopper_group_product_price.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_user.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_import_user.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_order_esms.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_order_esms.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_payment_baokim.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_payment_baokim.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_pdf_dompdf.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_pdf_dompdf.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_pdf_mpdf.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_pdf_mpdf.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_pdf_tcpdf.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_pdf_tcpdf.sys.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_product_gls.ini create mode 100644 src/lang/en-GB/admin/en-GB/en-GB.plg_redshop_product_gls.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.com_redshop.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.lib_redshop.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.lib_redshop.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_fb_albums.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_fb_albums.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redcategoryscroller.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redcategoryscroller.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redfeaturedproduct.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redfeaturedproduct.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redmanufacturer.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redmanufacturer.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redmasscart.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redmasscart.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redproducts3d.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redproducts3d.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redproductscroller.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redproductscroller.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redproducttab.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redproducttab.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_aesir_products.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_aesir_products.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_cart.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_cart.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_categories.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_category_scroller.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_category_scroller.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_currencies.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_currencies.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_discount.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_discount.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_filter.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_filter.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_logingreeting.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_logingreeting.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_megamenu.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_megamenu.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_newsletter.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_newsletter.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_pricefilter.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_pricefilter.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_productcompare.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_productcompare.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_products.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_products.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_products_slideshow.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_products_slideshow.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_promote_free_shipping.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_promote_free_shipping.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_search.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_search.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_shoppergroup_category.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_shoppergroup_category.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_shoppergroup_product.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_shoppergroup_product.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_shoppergrouplogo.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_shoppergrouplogo.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_who_bought.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_who_bought.sys.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_wishlist.ini create mode 100644 src/lang/en-GB/site/en-GB/en-GB.mod_redshop_wishlist.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.com_redshop.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.com_redshop.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_acymailing_redshop.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_acymailing_redshop.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_aesir_field_redshop_product.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_aesir_field_redshop_product.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_ajax_xmlcron.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_ajax_xmlcron.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_content_redshop_product.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_content_redshop_product.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_economic_economic.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_economic_economic.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_editors-xtd_product.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_editors-xtd_product.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_finder_redshop.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_finder_redshop.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_logman_redshop.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_logman_redshop.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_quickicon_redshop.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_quickicon_redshop.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_alert_alert.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_alert_alert.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_checkout_kerry_express.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_checkout_kerry_express.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_attribute.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_attribute.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_category.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_category.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_field.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_field.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_manufacturer.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_manufacturer.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_newsletter_subscriber.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_newsletter_subscriber.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_product.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_product.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_product_stockroom_data.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_product_stockroom_data.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_related_product.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_related_product.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_shipping_address.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_shipping_address.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_shopper_group_attribute_price.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_shopper_group_product_price.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_shopper_group_product_price.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_user.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_export_user.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_attribute.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_attribute.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_category.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_category.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_field.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_field.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_manufacturer.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_manufacturer.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_newsletter_subscriber.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_newsletter_subscriber.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_product.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_product.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_product_stockroom_data.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_product_stockroom_data.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_related_product.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_related_product.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_shipping_address.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_shipping_address.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_shopper_group_attribute_price.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_shopper_group_product_price.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_shopper_group_product_price.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_user.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_import_user.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_order_esms.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_order_esms.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_baokim.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_baokim.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_cielo.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_cielo.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_dibsdx.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_dibsdx.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_dotpay.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_dotpay.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_ingenico.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_ingenico.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_klarna.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_klarna.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_mollieideal.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_mollieideal.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_nganluong.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_nganluong.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_paygate.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_paygate.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_paypalcreditcard.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_paypalcreditcard.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_payson.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_payson.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_quickbook.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_quickbook.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_quickpay.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_quickpay.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_2checkout.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_2checkout.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_amazoncheckout.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_amazoncheckout.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_authorize.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_authorize.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_authorize_dpm.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_authorize_dpm.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_banktransfer.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_banktransfer.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_banktransfer2.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_banktransfer2.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_banktransfer_discount.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_banktransfer_discount.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_beanstream.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_beanstream.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_braintree.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_braintree.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_cod.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_cod.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_dibspaymentmethod.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_dibspaymentmethod.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_eantransfer.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_eantransfer.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_epayv2.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_epayv2.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_eway.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_eway.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_eway3dsecure.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_eway3dsecure.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_giropay.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_giropay.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_imglobal.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_imglobal.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_moneris.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_moneris.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_moneybooker.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_moneybooker.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_payflowpro.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_payflowpro.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_payment_express.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_payment_express.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_paymill.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_paymill.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_paypal.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_paypal.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_postfinance.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_postfinance.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_rapid_eway.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_rapid_eway.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_sagepay.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_sagepay.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_sagepay_vps.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_sagepay_vps.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_worldpay.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_rs_payment_worldpay.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_stripe.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_payment_stripe.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_pdf_dompdf.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_pdf_dompdf.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_pdf_mpdf.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_pdf_mpdf.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_pdf_tcpdf.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_pdf_tcpdf.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_CreateColorImage.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_CreateColorImage.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_bundle.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_bundle.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_canonical.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_canonical.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_custom_field_mapping.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_custom_field_mapping.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_discount_affect_attribute.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_discount_affect_attribute.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_discount_rule.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_discount_rule.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_gift.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_gift.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_gls.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_gls.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_google_microdata.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_google_microdata.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_invoicepdf.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_invoicepdf.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_postdanmark.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_postdanmark.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_product_alttext.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_product_alttext.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_shoppergroup_tags.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_shoppergroup_tags.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_stock_notifyemail.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_stock_notifyemail.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_stockroom_status.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_stockroom_status.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_sync_b2b.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_sync_b2b.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_type_bundle.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_type_bundle.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_type_gift.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_type_gift.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_wss_datafeed.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_product_wss_datafeed.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_bring.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_bring.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_default_shipping.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_default_shipping.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_default_shipping_gls.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_default_shipping_gls.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_default_shipping_glsbusiness.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_default_shipping_glsbusiness.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_fedex.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_fedex.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_giaohangnhanh.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_giaohangnhanh.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_postdanmark.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_postdanmark.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_self_pickup.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_self_pickup.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_shipper.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_shipper.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_ups.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_ups.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_uspsv4.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_shipping_uspsv4.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_user_cmc_integrate.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_user_cmc_integrate.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_user_joomlamailer_integrate.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_user_joomlamailer_integrate.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_user_registration_acymailing.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_user_registration_acymailing.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_vies_registration_rs_vies_registration.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_redshop_vies_registration_rs_vies_registration.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_search_redshop_categories.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_search_redshop_categories.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_search_redshop_products.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_search_redshop_products.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_sh404sefextplugins_sh404sefextplugincom_redshop.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_sh404sefextplugins_sh404sefextplugincom_redshop.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_agile_crm.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_agile_crm.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_quickbook.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_quickbook.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redgoogleanalytics.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redgoogleanalytics.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redlightbox_slideshow.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redlightbox_slideshow.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redproductzoom.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redproductzoom.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redshop.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redshop.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redshop_product_bundle.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redshop_product_bundle.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redshop_send_discountcode.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_system_redshop_send_discountcode.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_user_highrise.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_user_highrise.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_user_redshop_avatar.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_user_redshop_avatar.sys.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_xmap_com_redshop.ini create mode 100644 src/lang/fr-FR/admin/fr-FR/fr-FR.plg_xmap_com_redshop.sys.ini create mode 100644 src/lang/fr-FR/install.xml create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.com_redshop.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.lib_redshop.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.lib_redshop.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_fb_albums.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_fb_albums.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redcategoryscroller.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redcategoryscroller.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redfeaturedproduct.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redfeaturedproduct.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redmanufacturer.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redmanufacturer.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redmasscart.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redmasscart.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redproducts3d.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redproducts3d.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redproductscroller.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redproductscroller.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redproducttab.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redproducttab.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_aesir_products.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_aesir_products.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_cart.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_cart.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_categories.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_category_scroller.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_category_scroller.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_currencies.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_currencies.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_discount.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_discount.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_filter.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_filter.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_logingreeting.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_logingreeting.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_megamenu.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_megamenu.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_newsletter.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_newsletter.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_pricefilter.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_pricefilter.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_productcompare.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_productcompare.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_products.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_products.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_products_slideshow.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_products_slideshow.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_promote_free_shipping.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_promote_free_shipping.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_search.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_search.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_shoppergroup_category.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_shoppergroup_category.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_shoppergroup_product.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_shoppergroup_product.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_shoppergrouplogo.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_shoppergrouplogo.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_tags_similar.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_tags_similar.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_who_bought.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_who_bought.sys.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_wishlist.ini create mode 100644 src/lang/fr-FR/site/fr-FR/fr-FR.mod_redshop_wishlist.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.com_redshop.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.com_redshop.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_acymailing_redshop.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_acymailing_redshop.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_aesir_field_redshop_product.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_aesir_field_redshop_product.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_ajax_xmlcron.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_ajax_xmlcron.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_content_redshop_product.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_content_redshop_product.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_economic_economic.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_economic_economic.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_editors-xtd_product.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_editors-xtd_product.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_finder_redshop.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_finder_redshop.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_logman_redshop.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_logman_redshop.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_quickicon_redshop.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_quickicon_redshop.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_alert_alert.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_alert_alert.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_checkout_kerry_express.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_checkout_kerry_express.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_attribute.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_attribute.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_category.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_category.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_field.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_field.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_manufacturer.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_manufacturer.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_newsletter_subscriber.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_newsletter_subscriber.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_product.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_product.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_product_stockroom_data.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_product_stockroom_data.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_related_product.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_related_product.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_shipping_address.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_shipping_address.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_shopper_group_attribute_price.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_shopper_group_product_price.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_shopper_group_product_price.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_user.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_export_user.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_attribute.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_attribute.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_category.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_category.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_field.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_field.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_manufacturer.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_manufacturer.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_newsletter_subscriber.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_newsletter_subscriber.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_product.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_product.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_product_stockroom_data.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_product_stockroom_data.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_related_product.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_related_product.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_shipping_address.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_shipping_address.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_shopper_group_attribute_price.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_shopper_group_product_price.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_shopper_group_product_price.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_user.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_import_user.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_order_esms.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_order_esms.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_baokim.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_baokim.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_cielo.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_cielo.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_dibsdx.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_dibsdx.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_dotpay.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_dotpay.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_ingenico.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_ingenico.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_klarna.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_klarna.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_mollieideal.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_mollieideal.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_nganluong.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_nganluong.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_paygate.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_paygate.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_paypalcreditcard.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_paypalcreditcard.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_payson.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_payson.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_quickbook.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_quickbook.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_quickpay.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_quickpay.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_2checkout.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_2checkout.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_amazoncheckout.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_amazoncheckout.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_authorize.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_authorize.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_authorize_dpm.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_authorize_dpm.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_banktransfer.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_banktransfer.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_banktransfer2.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_banktransfer2.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_banktransfer_discount.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_banktransfer_discount.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_beanstream.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_beanstream.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_braintree.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_braintree.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_cod.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_cod.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_dibspaymentmethod.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_dibspaymentmethod.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_eantransfer.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_eantransfer.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_epayv2.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_epayv2.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_eway.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_eway.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_eway3dsecure.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_eway3dsecure.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_giropay.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_giropay.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_imglobal.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_imglobal.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_moneris.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_moneris.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_moneybooker.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_moneybooker.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_payflowpro.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_payflowpro.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_payment_express.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_payment_express.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_paymill.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_paymill.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_paypal.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_paypal.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_postfinance.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_postfinance.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_rapid_eway.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_rapid_eway.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_sagepay.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_sagepay.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_sagepay_vps.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_sagepay_vps.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_worldpay.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_rs_payment_worldpay.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_stripe.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_payment_stripe.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_pdf_dompdf.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_pdf_dompdf.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_pdf_mpdf.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_pdf_mpdf.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_pdf_tcpdf.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_pdf_tcpdf.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_CreateColorImage.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_CreateColorImage.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_bundle.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_bundle.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_canonical.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_canonical.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_custom_field_mapping.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_custom_field_mapping.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_discount_affect_attribute.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_discount_affect_attribute.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_discount_rule.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_discount_rule.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_gift.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_gift.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_gls.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_gls.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_google_microdata.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_google_microdata.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_invoicepdf.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_invoicepdf.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_postdanmark.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_postdanmark.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_product_alttext.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_product_alttext.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_shoppergroup_tags.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_shoppergroup_tags.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_stock_notifyemail.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_stock_notifyemail.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_stockroom_status.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_stockroom_status.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_sync_b2b.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_sync_b2b.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_type_bundle.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_type_bundle.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_type_gift.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_type_gift.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_wss_datafeed.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_product_wss_datafeed.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_bring.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_bring.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_default_shipping.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_default_shipping.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_default_shipping_gls.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_default_shipping_gls.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_default_shipping_glsbusiness.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_default_shipping_glsbusiness.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_fedex.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_fedex.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_giaohangnhanh.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_giaohangnhanh.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_postdanmark.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_postdanmark.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_self_pickup.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_self_pickup.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_shipper.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_shipper.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_ups.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_ups.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_uspsv4.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_shipping_uspsv4.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_user_cmc_integrate.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_user_cmc_integrate.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_user_joomlamailer_integrate.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_user_joomlamailer_integrate.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_user_registration_acymailing.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_user_registration_acymailing.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_vies_registration_rs_vies_registration.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_redshop_vies_registration_rs_vies_registration.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_search_redshop_categories.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_search_redshop_categories.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_search_redshop_products.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_search_redshop_products.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_sh404sefextplugins_sh404sefextplugincom_redshop.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_sh404sefextplugins_sh404sefextplugincom_redshop.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_agile_crm.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_agile_crm.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_quickbook.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_quickbook.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redgoogleanalytics.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redgoogleanalytics.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redlightbox_slideshow.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redlightbox_slideshow.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redproductzoom.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redproductzoom.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redshop.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redshop.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redshop_product_bundle.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redshop_product_bundle.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redshop_send_discountcode.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_system_redshop_send_discountcode.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_user_highrise.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_user_highrise.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_user_redshop_avatar.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_user_redshop_avatar.sys.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_xmap_com_redshop.ini create mode 100644 src/lang/it-IT/admin/it-IT/it-IT.plg_xmap_com_redshop.sys.ini create mode 100644 src/lang/it-IT/install.xml create mode 100644 src/lang/it-IT/site/it-IT/it-IT.com_redshop.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.lib_redshop.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.lib_redshop.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_fb_albums.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_fb_albums.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redcategoryscroller.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redcategoryscroller.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redfeaturedproduct.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redfeaturedproduct.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redmanufacturer.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redmanufacturer.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redmasscart.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redmasscart.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redproducts3d.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redproducts3d.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redproductscroller.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redproductscroller.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redproducttab.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redproducttab.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_aesir_products.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_aesir_products.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_cart.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_cart.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_categories.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_category_scroller.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_category_scroller.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_currencies.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_currencies.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_discount.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_discount.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_filter.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_filter.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_logingreeting.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_logingreeting.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_megamenu.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_megamenu.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_newsletter.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_newsletter.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_pricefilter.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_pricefilter.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_productcompare.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_productcompare.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_products.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_products.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_products_slideshow.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_products_slideshow.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_promote_free_shipping.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_promote_free_shipping.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_search.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_search.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_shoppergroup_category.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_shoppergroup_category.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_shoppergroup_product.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_shoppergroup_product.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_shoppergrouplogo.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_shoppergrouplogo.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_tags_similar.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_tags_similar.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_who_bought.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_who_bought.sys.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_wishlist.ini create mode 100644 src/lang/it-IT/site/it-IT/it-IT.mod_redshop_wishlist.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.com_redshop.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.com_redshop.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_acymailing_redshop.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_acymailing_redshop.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_aesir_field_redshop_product.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_aesir_field_redshop_product.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_ajax_xmlcron.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_ajax_xmlcron.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_content_redshop_product.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_content_redshop_product.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_economic_economic.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_economic_economic.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_editors-xtd_product.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_editors-xtd_product.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_finder_redshop.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_finder_redshop.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_logman_redshop.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_logman_redshop.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_quickicon_redshop.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_quickicon_redshop.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_alert_alert.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_alert_alert.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_checkout_kerry_express.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_checkout_kerry_express.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_attribute.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_attribute.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_category.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_category.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_field.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_field.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_manufacturer.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_manufacturer.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_newsletter_subscriber.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_newsletter_subscriber.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_product.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_product.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_product_stockroom_data.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_product_stockroom_data.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_related_product.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_related_product.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_shipping_address.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_shipping_address.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_shopper_group_attribute_price.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_shopper_group_product_price.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_shopper_group_product_price.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_user.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_export_user.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_attribute.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_attribute.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_category.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_category.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_field.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_field.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_manufacturer.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_manufacturer.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_newsletter_subscriber.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_newsletter_subscriber.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_product.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_product.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_product_stockroom_data.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_product_stockroom_data.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_related_product.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_related_product.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_shipping_address.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_shipping_address.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_shopper_group_attribute_price.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_shopper_group_attribute_price.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_shopper_group_product_price.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_shopper_group_product_price.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_user.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_import_user.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_order_esms.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_order_esms.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_baokim.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_baokim.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_cielo.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_cielo.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_dibsdx.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_dibsdx.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_dotpay.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_dotpay.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_ingenico.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_ingenico.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_klarna.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_klarna.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_mollieideal.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_mollieideal.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_nganluong.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_nganluong.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_paygate.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_paygate.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_paypalcreditcard.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_paypalcreditcard.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_payson.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_payson.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_quickbook.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_quickbook.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_quickpay.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_quickpay.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_2checkout.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_2checkout.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_amazoncheckout.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_amazoncheckout.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_authorize.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_authorize.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_authorize_dpm.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_authorize_dpm.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_banktransfer.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_banktransfer.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_banktransfer2.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_banktransfer2.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_banktransfer_discount.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_banktransfer_discount.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_beanstream.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_beanstream.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_braintree.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_braintree.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_cod.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_cod.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_dibspaymentmethod.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_dibspaymentmethod.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_eantransfer.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_eantransfer.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_epayv2.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_epayv2.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_eway.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_eway.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_eway3dsecure.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_eway3dsecure.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_giropay.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_giropay.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_imglobal.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_imglobal.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_moneris.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_moneris.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_moneybooker.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_moneybooker.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_payflowpro.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_payflowpro.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_payment_express.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_payment_express.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_paymill.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_paymill.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_paypal.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_paypal.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_postfinance.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_postfinance.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_rapid_eway.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_rapid_eway.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_sagepay.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_sagepay.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_sagepay_vps.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_sagepay_vps.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_worldpay.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_rs_payment_worldpay.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_stripe.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_payment_stripe.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_pdf_dompdf.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_pdf_dompdf.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_pdf_mpdf.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_pdf_mpdf.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_pdf_tcpdf.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_pdf_tcpdf.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_CreateColorImage.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_CreateColorImage.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_bundle.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_bundle.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_canonical.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_canonical.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_custom_field_mapping.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_custom_field_mapping.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_discount_affect_attribute.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_discount_affect_attribute.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_discount_rule.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_discount_rule.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_gift.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_gift.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_gls.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_gls.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_google_microdata.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_google_microdata.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_invoicepdf.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_invoicepdf.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_postdanmark.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_postdanmark.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_product_alttext.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_product_alttext.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_shoppergroup_tags.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_shoppergroup_tags.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_stock_notifyemail.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_stock_notifyemail.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_stockroom_status.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_stockroom_status.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_sync_b2b.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_sync_b2b.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_type_bundle.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_type_bundle.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_type_gift.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_type_gift.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_wss_datafeed.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_product_wss_datafeed.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_bring.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_bring.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_default_shipping.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_default_shipping.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_default_shipping_gls.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_default_shipping_gls.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_default_shipping_glsbusiness.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_default_shipping_glsbusiness.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_fedex.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_fedex.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_giaohangnhanh.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_giaohangnhanh.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_postdanmark.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_postdanmark.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_self_pickup.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_self_pickup.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_shipper.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_shipper.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_ups.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_ups.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_uspsv4.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_shipping_uspsv4.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_user_cmc_integrate.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_user_cmc_integrate.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_user_joomlamailer_integrate.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_user_joomlamailer_integrate.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_user_registration_acymailing.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_user_registration_acymailing.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_vies_registration_rs_vies_registration.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_redshop_vies_registration_rs_vies_registration.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_search_redshop_categories.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_search_redshop_categories.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_search_redshop_products.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_search_redshop_products.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_sh404sefextplugins_sh404sefextplugincom_redshop.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_sh404sefextplugins_sh404sefextplugincom_redshop.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_agile_crm.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_agile_crm.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_quickbook.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_quickbook.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redgoogleanalytics.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redgoogleanalytics.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redlightbox_slideshow.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redlightbox_slideshow.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redproductzoom.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redproductzoom.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redshop.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redshop.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redshop_product_bundle.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redshop_product_bundle.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redshop_send_discountcode.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_system_redshop_send_discountcode.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_user_highrise.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_user_highrise.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_user_redshop_avatar.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_user_redshop_avatar.sys.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_xmap_com_redshop.ini create mode 100644 src/lang/vi-VN/admin/vi-VN/vi-VN.plg_xmap_com_redshop.sys.ini create mode 100644 src/lang/vi-VN/install.xml create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.com_redshop.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.lib_redshop.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.lib_redshop.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_fb_albums.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_fb_albums.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redcategoryscroller.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redcategoryscroller.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redfeaturedproduct.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redfeaturedproduct.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redmanufacturer.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redmanufacturer.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redmasscart.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redmasscart.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redproducts3d.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redproducts3d.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redproductscroller.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redproductscroller.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redproducttab.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redproducttab.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_aesir_products.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_aesir_products.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_cart.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_cart.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_categories.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_category_scroller.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_category_scroller.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_currencies.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_currencies.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_discount.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_discount.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_filter.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_filter.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_logingreeting.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_logingreeting.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_megamenu.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_megamenu.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_newsletter.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_newsletter.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_pricefilter.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_pricefilter.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_productcompare.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_productcompare.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_products.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_products.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_products_slideshow.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_products_slideshow.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_promote_free_shipping.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_promote_free_shipping.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_search.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_search.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_shoppergroup_category.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_shoppergroup_category.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_shoppergroup_product.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_shoppergroup_product.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_shoppergrouplogo.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_shoppergrouplogo.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_tags_similar.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_tags_similar.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_who_bought.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_who_bought.sys.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_wishlist.ini create mode 100644 src/lang/vi-VN/site/vi-VN/vi-VN.mod_redshop_wishlist.sys.ini create mode 100755 tests/README.md create mode 100644 tests/_bootstrap.php create mode 100644 tests/_bootstrap_joomla.php create mode 100644 tests/_data/dump.sql create mode 100644 tests/_data/image.jpg create mode 100644 tests/_data/scenarios/acceptance/1st_Install_Test.txt create mode 100644 tests/_data/scenarios/acceptance/Category0001.txt create mode 100644 tests/_extensions/testsperformance.php create mode 100644 tests/_groups/InstallationJ3Group.php create mode 100644 tests/_pages/Joomla3/Administrator/AdminJ3Page.php create mode 100644 tests/_pages/Joomla3/Administrator/CategoryManagerJ3Page.php create mode 100644 tests/_pages/Joomla3/Administrator/CategoryPage.php create mode 100644 tests/_pages/Joomla3/Administrator/CheckoutChangeQuantityProductPage.php create mode 100644 tests/_pages/Joomla3/Administrator/CheckoutModulePage.php create mode 100644 tests/_pages/Joomla3/Administrator/ConfigurationPage.php create mode 100644 tests/_pages/Joomla3/Administrator/CountryPage.php create mode 100644 tests/_pages/Joomla3/Administrator/CouponPage.php create mode 100644 tests/_pages/Joomla3/Administrator/CurrencyPage.php create mode 100644 tests/_pages/Joomla3/Administrator/CustomFieldManagerJoomla3Page.php create mode 100644 tests/_pages/Joomla3/Administrator/DiscountPage.php create mode 100644 tests/_pages/Joomla3/Administrator/DiscountProductPage.php create mode 100644 tests/_pages/Joomla3/Administrator/Field_GroupPage.php create mode 100644 tests/_pages/Joomla3/Administrator/FrontEndProductManagerJoomla3Page.php create mode 100644 tests/_pages/Joomla3/Administrator/GiftCardCheckoutPage.php create mode 100644 tests/_pages/Joomla3/Administrator/GiftCardManagerPage.php create mode 100644 tests/_pages/Joomla3/Administrator/MailPage.php create mode 100644 tests/_pages/Joomla3/Administrator/ManufacturerPage.php create mode 100644 tests/_pages/Joomla3/Administrator/MassDiscountManagerPage.php create mode 100644 tests/_pages/Joomla3/Administrator/MediaManagerPage.php create mode 100644 tests/_pages/Joomla3/Administrator/ModuleManagerJ3page.php create mode 100644 tests/_pages/Joomla3/Administrator/OrderManagerPage.php create mode 100644 tests/_pages/Joomla3/Administrator/OrderStatusManagerPage.php create mode 100644 tests/_pages/Joomla3/Administrator/PriceProductJoomla3Page.php create mode 100644 tests/_pages/Joomla3/Administrator/ProductManagerPage.php create mode 100644 tests/_pages/Joomla3/Administrator/QuestionManagerJoomla3Page.php create mode 100644 tests/_pages/Joomla3/Administrator/QuotationManagerPage.php create mode 100644 tests/_pages/Joomla3/Administrator/ShippingPage.php create mode 100644 tests/_pages/Joomla3/Administrator/ShopperGroupJ3Page.php create mode 100644 tests/_pages/Joomla3/Administrator/StatePage.php create mode 100644 tests/_pages/Joomla3/Administrator/StockImagePage.php create mode 100644 tests/_pages/Joomla3/Administrator/StockRoomManagerJoomla3Page.php create mode 100644 tests/_pages/Joomla3/Administrator/SupplierPage.php create mode 100644 tests/_pages/Joomla3/Administrator/TaxGroupPage.php create mode 100644 tests/_pages/Joomla3/Administrator/TaxRatePage.php create mode 100644 tests/_pages/Joomla3/Administrator/TemplatePage.php create mode 100644 tests/_pages/Joomla3/Administrator/TextPage.php create mode 100644 tests/_pages/Joomla3/Administrator/UserManagerJoomla3Page.php create mode 100644 tests/_pages/Joomla3/Administrator/VoucherManagerPage.php create mode 100644 tests/_pages/Joomla3/Administrator/WishListPage.php create mode 100755 tests/_pages/Joomla3/Administrator/WrapperPage.php create mode 100644 tests/_pages/Joomla3/FrontEnd/payment/AuthorizeDPMPaymentPage.php create mode 100644 tests/_pages/Joomla3/FrontEnd/payment/AuthorizePaymentPage.php create mode 100644 tests/_pages/Joomla3/FrontEnd/payment/Frontend2PaymentPage.php create mode 100644 tests/_pages/Joomla3/FrontEnd/payment/PAYMILLPaymentPage.php create mode 100644 tests/_pages/Joomla3/FrontEnd/payment/SkillPaymentPage.php create mode 100644 tests/_pages/Joomla3/FrontEnd/payment/StripePaymentPage.php create mode 100644 tests/_pages/Joomla3/System/ExtensionManagerJoomla3Page.php create mode 100644 tests/_pages/Joomla3/System/ModuleManagerJoomlaPage.php create mode 100644 tests/_pages/Joomla3/System/PayPalPluginManagerJoomla3Page.php create mode 100644 tests/_pages/Joomla3/System/PluginManagerJoomla3Page.php create mode 100644 tests/_support/AcceptanceHelper.php create mode 100644 tests/_support/Cest/AbstractCest.php create mode 100644 tests/_support/Cest/Traits/CheckIn.php create mode 100644 tests/_support/Cest/Traits/Delete.php create mode 100644 tests/_support/Cest/Traits/Publish.php create mode 100644 tests/_support/DbHelper.php create mode 100644 tests/_support/FunctionalHelper.php create mode 100644 tests/_support/Step/AbstractStep.php create mode 100644 tests/_support/Step/Acceptance/Redshop.php create mode 100644 tests/_support/Step/Traits/CheckIn.php create mode 100644 tests/_support/Step/Traits/Delete.php create mode 100644 tests/_support/Step/Traits/Publish.php create mode 100644 tests/_support/UnitHelper.php create mode 100644 tests/acceptance.suite.yml.dist create mode 100644 tests/acceptance.suite.yml.dist.drone create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutAuthorizeCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutBankTransfer2Cest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutBeanStreamCept.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutBraintreeCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutDibsPaymentCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutDotpayCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutGiropayCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutIngenicoPaymentCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutMonerisCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutPayFlowProCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutPayPalCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutSagePayCest.php create mode 100644 tests/acceptance/__disabled/checkout/ProductsCheckoutStripeCest.php create mode 100644 tests/acceptance/__disabled/update/UpdateExtensionTestCest.php create mode 100644 tests/acceptance/_bootstrap.php create mode 100644 tests/acceptance/administrator/Oder_Backend/OrderBackendProductAttribute/OrderBackendProductAttributeCest.php create mode 100644 tests/acceptance/administrator/Oder_Backend/OrderDiscount/OrderDiscountAndSpecialUpdateCest.php create mode 100644 tests/acceptance/administrator/Oder_Backend/Orders/Order/OrderCest.php create mode 100644 tests/acceptance/administrator/Oder_Backend/Orders/UserDetail/PlaceOrderManagerCest.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/AdminManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Administrator/Module/ModuleManagerJoomla.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Administrator/plugins/PluginPaymentManagerJoomla.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CategoryManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CategorySteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CheckoutChangeQuantityProductSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CheckoutMissingData.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CheckoutOnFrontEnd.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CheckoutSearchProductFrontendSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CheckoutWithShippingRateSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Configuration/ConfigurationSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Configuration/ProductsConfigurationSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CountrySteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CouponSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CurrencySteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/CustomFieldManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/DiscountManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/DiscountProductSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/DiscountSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Discount_ProductSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Field_GroupSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/Module/MultiCurrenciesSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/Module/ProductTabsSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/Module/REDMASSCARTSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/Module/redSHOPProductSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/payment/CheckoutWith2Payment.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/payment/CheckoutWithAuthorizeDPMPayment.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/payment/CheckoutWithAuthorizePayment.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/payment/CheckoutWithEWAYPayment.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/payment/CheckoutWithPAYMILLPayment.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/payment/CheckoutWithSkillPayment.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/payment/CheckoutWithStripePayment.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Frontend/payment/checkoutWithBankTransferDiscount.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/GiftCardManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/GlobalConfigurationManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/MailSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/ManufacturerSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/MassDiscountManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/MediaManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/OrderManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/OrderStatusManagerSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/OrderUpdateDiscountAndSpecialDiscountSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/PayPalPluginManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/Payment2CheckoutPluginManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/PaymentBeanStreamPluginManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/PaymentBraintreePluginManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/PriceProductManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/ProductCheckoutManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/ProductManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/ProductUpdateOnQuantitySteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/QuestionManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/QuotationManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/RedshopSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/ShippingSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/ShopperGroupManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/StateSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/StockImageSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/StockRoomManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/SupplierSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/TaxGroupSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/TaxRateSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/TemplateSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/TextSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/UserManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/VoucherManagerJoomla3Steps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/WishListSteps.php create mode 100644 tests/acceptance/administrator/_steps/Joomla3Steps/WrapperSteps.php create mode 100644 tests/acceptance/administrator/g01/ProductNotForSaleOnFrontend/ProductNotForSaleOnFrontendCest.php create mode 100644 tests/acceptance/administrator/g01/Products/Price_Product/PriceProductCest.php create mode 100644 tests/acceptance/administrator/g02/Customizations/State/StateCest.php create mode 100644 tests/acceptance/administrator/g03/Notices/FrontEndNoticesCest.php create mode 100644 tests/acceptance/administrator/g03/Notices/NoticesCest.php create mode 100644 tests/acceptance/administrator/g03/Shippings/Shipping/ShippingCest.php create mode 100644 tests/acceptance/administrator/g04/Shippings/Wrapper/WrapperCest.php create mode 100644 tests/acceptance/administrator/g04/Stockrooms/StockRoom/StockRoomCest.php create mode 100644 tests/acceptance/administrator/g04/Stockrooms/Stock_Image/StockImageCest.php create mode 100644 tests/acceptance/administrator/g05/Customizations/Template/TemplateCest.php create mode 100644 tests/acceptance/administrator/g05/Orders/Order_Status/OrderStatusManagerCest.php create mode 100644 tests/acceptance/administrator/g05/Orders/Quotation/QuotationCest.php create mode 100644 tests/acceptance/administrator/g05/Orders/Quotation/QuotationCheckPhoneStringCest.php create mode 100644 tests/acceptance/administrator/g06/Customizations/Country/CountryCest.php create mode 100644 tests/acceptance/administrator/g06/Discount_Groups/Discounts/Discount_Product/DiscountProductCest.php create mode 100644 tests/acceptance/administrator/g07/Configuration/ConfigurationAccessoryProductsCest.php create mode 100644 tests/acceptance/administrator/g07/Configuration/ConfigurationCest.php create mode 100644 tests/acceptance/administrator/g07/Configuration/ProductsConfigurationCest.php create mode 100644 tests/acceptance/administrator/g07/Configuration/ProductsConfigurationRelatedTwoWayCest.php create mode 100644 tests/acceptance/administrator/g07/Customizations/Currency/CurrencyCest.php create mode 100644 tests/acceptance/administrator/g07/Users/Shopper_Group/ShopperGroupCest.php create mode 100644 tests/acceptance/administrator/g08/Customizations/Custom_Field/CustomFieldCest.php create mode 100644 tests/acceptance/administrator/g08/Discount_Groups/Discounts/Discount/DiscountCest.php create mode 100644 tests/acceptance/administrator/g10/Products/Tax_Group/TaxGroupCest.php create mode 100644 tests/acceptance/administrator/g11/Discount_Groups/Rewards/Giftcard/ManageGiftCardAdministratorCest.php create mode 100644 tests/acceptance/administrator/g11/Products/Tax_Rate/TaxRateCest.php create mode 100644 tests/acceptance/administrator/g12/Communications/Mail/MailCest.php create mode 100644 tests/acceptance/administrator/g12/Discount_Groups/Rewards/Coupon/CouponCest.php create mode 100644 tests/acceptance/administrator/g12/Users/User/UserCest.php create mode 100644 tests/acceptance/administrator/g13/Customizations/Field_Group/Field_GroupCest.php create mode 100644 tests/acceptance/administrator/g13/Discount_Groups/Discounts/Mass_Discount/MassDiscountCest.php create mode 100644 tests/acceptance/administrator/g14/Customizations/Text/TextCest.php create mode 100644 tests/acceptance/administrator/g14/Discount_Groups/Rewards/Voucher/VoucherCest.php create mode 100644 tests/acceptance/administrator/g14/Products/Supplier/SupplierCest.php create mode 100644 tests/acceptance/administrator/g15/Product_Price/AddProductPriceCest.php create mode 100644 tests/acceptance/administrator/g15/Products/Category/CategoryCest.php create mode 100644 tests/acceptance/administrator/g15/Products/Manufacturer/ManufacturerCest.php create mode 100644 tests/acceptance/administrator/g15/Wishlist/WishListCest.php create mode 100644 tests/acceptance/administrator/g16/Product_Price_Discount/ProductPriceDiscountCest.php create mode 100644 tests/acceptance/administrator/g16/Products/ProductManagement/ProductsCest.php create mode 100644 tests/acceptance/administrator/g17/MenuItem/QuickTextForMenuItemCest.php create mode 100644 tests/acceptance/administrator/g17/VAT/OderBackendWithForeignCountryCest.php create mode 100644 tests/acceptance/install/core/InstallRedShopCest.php create mode 100644 tests/acceptance/install/extension/InstallRedSHOPPaidExtensionsCest.php create mode 100644 tests/acceptance/integration/__disabled/Products/ProductsCheckoutFrontEndCest.php create mode 100644 tests/acceptance/integration/__disabled/Stockroom/CheckoutWithStockroomCest.php create mode 100644 tests/acceptance/integration/g02/Discounts/CheckoutDiscountOnProduct/CheckoutDiscountOnProductCest.php create mode 100644 tests/acceptance/integration/g02/Discounts/CheckoutDiscountTotal/CheckoutDiscountTotalCest.php create mode 100644 tests/acceptance/integration/g03/Discounts/VoucherCheckoutProduct/VoucherCheckoutProductCest.php create mode 100644 tests/acceptance/integration/g05/Quotations/QuotationFrontendCest.php create mode 100644 tests/acceptance/integration/g06/Discounts/MassDiscountCheckout/MassDiscountCheckoutCest.php create mode 100644 tests/acceptance/integration/g08/Compare_Products/CompareProductsCest.php create mode 100644 tests/acceptance/integration/g09/Checkout_Quantity/CheckoutChangeQuantityProductCest.php create mode 100644 tests/acceptance/integration/g09/Checkout_Search/CheckoutSearchProductFrontendCest.php create mode 100644 tests/acceptance/integration/g09/Order/CheckPaymentMethodBankTransferCest.php create mode 100644 tests/acceptance/integration/g09/Product_Quantity/ProductUpdateOnQuantityCest.php create mode 100644 tests/acceptance/integration/g09/Shopper_Groups/CheckoutSpecificShopperGroupsCest.php create mode 100644 tests/acceptance/integration/g10/Discounts/GiftCardCheckout/GiftCardCheckoutProductCest.php create mode 100644 tests/acceptance/integration/g10/Product_Attribute/AttributeUserCest.php create mode 100644 tests/acceptance/integration/g11/Discounts/CheckoutDiscountBeforeToday/CheckoutWithTotalDiscoutBeforeTodayCest.php create mode 100644 tests/acceptance/integration/g11/Discounts/CheckoutMassDiscountBeforeToday/CheckoutMassDiscountBeforeTodayCest.php create mode 100644 tests/acceptance/integration/g13/VAT/CheckVATChangedDependingOnTheUserCest.php create mode 100644 tests/acceptance/integration/g13/VAT/ProductAttributesVatCheckoutCest.php create mode 100644 tests/acceptance/integration/g13/VAT/ProductVatCheckoutCest.php create mode 100644 tests/acceptance/integration/g15/One_Step_Checkout/OnePageCheckoutCest.php create mode 100644 tests/acceptance/integration/g15/One_Step_Checkout/OnePageCheckoutMissingDataCest.php create mode 100644 tests/acceptance/integration/g16/Discounts/CouponVoucherMixCheckout/CouponVoucherMixCheckoutCest.php create mode 100644 tests/acceptance/integration/g17/Category/ImageAndSEOCategoryProductCest.php create mode 100644 tests/acceptance/integration/g17/Module/ModuleMultiCurrenciesCest.php create mode 100644 tests/acceptance/integration/g17/Module/ModuleProductsTabCest.php create mode 100644 tests/acceptance/integration/g17/Module/ModuleRedSHOPProductCest.php create mode 100644 tests/acceptance/integration/g17/Module/REDMASSCARTCest.php create mode 100644 tests/acceptance/integration/g17/Plugins/payment/CheckoutPAYMILLPaymentCest.php create mode 100644 tests/acceptance/integration/g17/Plugins/payment/CheckoutWithSKRILLPaymentCest.php create mode 100644 tests/acceptance/integration/g17/Plugins/payment/Products2CheckoutCest.php create mode 100644 tests/acceptance/integration/g17/Plugins/payment/ProductsCheckoutAuthorizeCest.php create mode 100644 tests/acceptance/integration/g17/Plugins/payment/ProductsCheckoutBankTransferDiscountCest.php create mode 100644 tests/acceptance/integration/g17/Plugins/payment/ProductsCheckoutEWAYCest.php create mode 100644 tests/acceptance/integration/g17/Plugins/payment/ProductsCheckoutStripePaymentCest.php create mode 100644 tests/acceptance/integration/g17/Plugins/payment73/ProductsCheckoutAuthorizeDPMCest.php create mode 100644 tests/acceptance/uninstall/UninstallExtensionCest.php create mode 100644 tests/checkers/debugcode.php create mode 100644 tests/checkers/phpcs.php create mode 100644 tests/checkers/phppec.php create mode 100644 tests/checkers/traviswebserverckecker.php create mode 100644 tests/drone/setup-base-install.sh create mode 100644 tests/drone/setup-stages.sh create mode 100644 tests/functional.suite.yml create mode 100644 tests/functional/_bootstrap.php create mode 100644 tests/travis-ci-apache.conf create mode 100644 tests/unit.suite.yml create mode 100644 tests/unit/_bootstrap.php diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 00000000000..cb8df09df5d --- /dev/null +++ b/.drone.yml @@ -0,0 +1,682 @@ +clone: + default: + image: plugins/git + recursive: false + +pipeline: + 00-cache: + group: 00-setup + image: redwebaps/redshop-cache:latest + pull: true + commands: + # redSHOP Composer cache + - mv /opt/cache/redSHOP/vendor . + - touch tests/.cache.composer.tmp + # redSHOP Composer cache for libraries + - mv /opt/cache/redSHOP/libraries/redshop/vendor libraries/redshop + - touch tests/.cache.libraries.redshop.composer.tmp + # redSHOP Composer cache for redshopb_pdf plugin + - mv /opt/cache/redSHOP/plugins/redshop_pdf/tcpdf/helper/vendor plugins/redshop_pdf/tcpdf/helper + - touch tests/.cache.plugins.redshop_pdf.composer.tmp + # redSHOP npm cache + - mv /opt/cache/redSHOP/node_modules . + - touch tests/.cache.npm.tmp + # Joomla CMS + - mv /opt/cache/joomla-cms tests + - touch tests/.cache.joomla-cms.tmp + + 00-setup: + group: 00-setup + image: redwebaps/testbox-chromedriver:2.38 + pull: true + commands: + # Composer setup + - while [ ! -f tests/.cache.composer.tmp ]; do sleep 1; done # Comment if not using composer cache + # - composer config --global --auth github-oauth.github.com 4281d0ba7e8f1caded4c8b949a1c115902e30113 + # - composer install --prefer-dist # Uncomment if not using composer cache + - while [ ! -f tests/.cache.libraries.redshop.composer.tmp ]; do sleep 1; done # Comment if not using composer cache for libraries + # - composer install --prefer-dist -d libraries/redshop # Uncomment if not using composer cache for libraries + - while [ ! -f tests/.cache.plugins.redshop_pdf.composer.tmp ]; do sleep 1; done # Comment if not using composer cache for redshopb_pdf plugin + # - composer install --prefer-dist -d plugins/redshop_pdf/tcpdf/helper # Uncomment if not using composer cache for redshopb_pdf plugin + + # npm setup + - while [ ! -f tests/.cache.npm.tmp ]; do sleep 1; done # Comment if not using npm cache + # - npm install gulp # Uncomment if not using npm cache + - npm audit fix + - composer config -g repo.packagist composer https?://packagist.jp + - mv gulp-config.json.dist gulp-config.json + - gulp release --skip-version + + # clone Paid Extensions + - vendor/bin/robo tests:paid-extensions-for-integration-tests + - cd tests/extension/paid-extensions + - mv gulp-config.sample.json gulp-config.json + - npm install + - gulp composer + - gulp release --skip-version + - cd ../../.. + + # Codeception setup + - cp tests/acceptance.suite.yml.dist.drone tests/acceptance.suite.yml + # Test setup + - while [ ! -f tests/.cache.joomla-cms.tmp ]; do sleep 1; done # Comment if not using Joomla CMS cache + #- vendor/bin/robo tests:site-preparation 0 0 + # Ownership for uid 82 + - chown -R www-data:www-data . + # Touching temp file to start the setup of each installation (in each PHP version - via services) + - touch tests/.setup.tmp + + 00-setup-56: + group: 00-setup + image: redwebaps/testbox-chromedriver:2.38 + pull: true + environment: + - tests_user=admin + - tests_suite=00-setup + - tests_db=setup + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-00-setup + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + + # Waiting for setup to be done + - while [ ! -f tests/.setup.tmp ]; do sleep 1; done + + # Creating first clone for tests setup + - mkdir -p tests/$tests_suite$php_version/joomla-cms + - rsync -a tests/joomla-cms/ tests/$tests_suite$php_version/joomla-cms + # Creates the database (required because of the Codeception Db module) + - mysql -u root -proot -h db -e "CREATE DATABASE $tests_db$php_version" + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs the setup and installation routine + - su www-data -c 'vendor/bin/robo tests:setup 0 0' + # Touching temp file to start the environment cloning (see setup-stages service) + - touch tests/.setup$php_version.tmp + + 00-setup-73: + group: 00-setup + image: redwebaps/testbox-chromedriver:2.38 + pull: true + environment: + - tests_user=admin + - tests_suite=00-setup + - tests_db=setup + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-00-setup + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + + # Waiting for setup to be done + - while [ ! -f tests/.setup.tmp ]; do sleep 1; done + + # Creating first clone for tests setup + - mkdir -p tests/$tests_suite$php_version/joomla-cms + - rsync -a tests/joomla-cms/ tests/$tests_suite$php_version/joomla-cms + # Creates the database (required because of the Codeception Db module) + - mysql -u root -proot -h db -e "CREATE DATABASE $tests_db$php_version" + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs the setup and installation routine + - su www-data -c 'vendor/bin/robo tests:setup 0 0' + # Touching temp file to start the environment cloning (see setup-stages service) + - touch tests/.setup$php_version.tmp + + 01-Group1-56: + group: 01-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=01-Group1 + - tests_db=group1 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-01-Group1-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g01 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g02 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g03 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g04 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/Oder_Backend 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/uninstall 0 0' + + 01-Group1-73: + group: 01-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=01-Group1 + - tests_db=group1 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-01-Group1-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test +# - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g15/Products/Manufacturer 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g01 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g02 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g03 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g04 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/Oder_Backend 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/uninstall 0 0' + + 02-Group2-56: + group: 01-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=02-Group2 + - tests_db=group2 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-02-Group2-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g02 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g03 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g05 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g06 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g08 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g10 0 0' + + 02-Group2-73: + group: 01-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=02-Group2 + - tests_db=group2 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-02-Group2-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g02 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g03 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g05 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g06 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g08 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g10 0 0' + + 03-Group3-56: + group: 01-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=03-Group3 + - tests_db=group3 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-03-Group3-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g05 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g06 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g07 0 0' + + 03-Group3-73: + group: 01-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=03-Group3 + - tests_db=group3 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-03-Group3-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g05 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g06 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g07 0 0' + + 04-Group4-56: + group: 01-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=04-Group4 + - tests_db=group4 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-04-Group4-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g08 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g10 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g11 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g13 0 0' + + 04-Group4-73: + group: 01-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=04-Group4 + - tests_db=group4 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-04-Group4-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g08 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g10 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g11 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g13 0 0' + + 05-Group5-56: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=05-Group5 + - tests_db=group5 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-05-Group5-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g15/Product_Price 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g09 0 0' + + 05-Group5-73: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=05-Group5 + - tests_db=group5 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-05-Group5-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g15/Product_Price 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g09 0 0' + + 06-Group6-56: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=06-Group6 + - tests_db=group6 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-06-Group6-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g12 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g14 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g17 0 0' + + 06-Group6-73: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=06-Group6 + - tests_db=group6 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-06-Group6-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g12 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g14 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g17 0 0' + + 07-Group7-56: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=07-Group7 + - tests_db=group7 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-07-Group7-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g15 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g13 0 0' + + 07-Group7-73: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=07-Group7 + - tests_db=group7 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-07-Group7-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g15 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g13 0 0' + + 08-Group8-56: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=08-Group8 + - tests_db=group8 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-08-Group8-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g15/Products/Category 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g16 0 0' + + 08-Group8-73: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=08-Group8 + - tests_db=group8 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-08-Group8-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g15/Products/Category 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g16 0 0' + + 09-Group9-56: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=09-Group9 + - tests_db=group9 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-09-Group9-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g16 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g11 0 0' + + 09-Group9-73: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=09-Group9 + - tests_db=group9 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-09-Group9-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g16 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g11 0 0' + + 10-Group10-56: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=10-Group10 + - tests_db=group10 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-10-Group10-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/install/extension 0 0' + + 10-Group10-73: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=10-Group10 + - tests_db=group10 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-10-Group10-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/install/extension 0 0' + + 11-Group11-56: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=11-Group11 + - tests_db=group11 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-11-Group11-56 + - php_version=56 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g17/Plugins/payment 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g17/Module 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g17/Category 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g15/Wishlist 0 0' + + 11-Group11-73: + group: 02-tests + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_user=admin + - tests_suite=11-Group11 + - tests_db=group11 + - build_path=/drone/src/github.com/${DRONE_REPO} + - output_append=-11-Group11-73 + - php_version=73 + commands: + # Regular entry point + - /entrypoint.sh & + # Performs test after ensuring that the scenario has been fully set up + - while [ ! -f tests/.cache.setup.$tests_suite$php_version.tmp ]; do sleep 1; done + # Waits until Chromedriver is up and running + - while ! nc -z localhost 9515; do sleep 1; done + # Performs test + - su www-data -c 'vendor/bin/robo tests:run acceptance/integration/g17 0 0' + - su www-data -c 'vendor/bin/robo tests:run acceptance/administrator/g15/Wishlist 0 0' + + slack: + image: plugins/slack + webhook: https://hooks.slack.com/services/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 + channel: redshop-builds + when: + status: [ success, failure ] + template: > + {{#success build.status}} + {{repo.name}} PR #{{build.pull}} succeeded in {{since build.started}}. Good job {{build.author}}! Here is the build log: {{build.link}}. Link to the PR: https://github.com/{{repo.owner}}/{{repo.name}}/pull/{{build.pull}} + {{else}} + {{repo.name}} PR #{{build.pull}} failed in {{since build.started}}. Fix me please {{build.author}}! Here is the build log: {{build.link}}. Link to the PR: https://github.com/{{repo.owner}}/{{repo.name}}/pull/{{build.pull}} + {{/success}} + + error-report: + image: redwebaps/testbox-chromedriver:2.38 + commands: + - if [ -z "${CI_PULL_REQUEST}" ]; then export CI_PULL_REQUEST=1; fi + - vendor/bin/robo send:build-report-error-slack redcomponent 365447364384436 Q94UM5kjZkZIrau8MIL93m0dN6U "$CI_REPO" "$CI_PULL_REQUEST" "https://hooks.slack.com/services/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" "#redshop-builds" "$CI_BUILD_URL" + when: + status: [ failure ] + +services: + db: + image: mysql/mysql-server:5.7 + pull: true + environment: + - MYSQL_ROOT_PASSWORD=root + - MYSQL_ROOT_HOST=% + + php56: + image: redwebaps/php-apache:5.6 + pull: true + environment: + - WEB_DOCUMENT_ROOT=/drone/src/github.com/${DRONE_REPO} + - JOOMLA_INSTALLATION_DISABLE_LOCALHOST_CHECK=1 + + php73: + image: redwebaps/php-apache:7.3 + pull: true + environment: + - WEB_DOCUMENT_ROOT=/drone/src/github.com/${DRONE_REPO} + - JOOMLA_INSTALLATION_DISABLE_LOCALHOST_CHECK=1 + + setup-stages: + image: redwebaps/testbox-chromedriver:2.38 + environment: + - tests_suite=00-setup + - tests_db=setup + - php_versions=56,73 + commands: + # Base installation + - sh tests/drone/setup-base-install.sh $tests_db $tests_suite $php_versions + # Stages setup + - sh tests/drone/setup-stages.sh "group1" "01-Group1" $php_versions + - sh tests/drone/setup-stages.sh "group2" "02-Group2" $php_versions + - sh tests/drone/setup-stages.sh "group3" "03-Group3" $php_versions + - sh tests/drone/setup-stages.sh "group4" "04-Group4" $php_versions + - sh tests/drone/setup-stages.sh "group5" "05-Group5" $php_versions + - sh tests/drone/setup-stages.sh "group6" "06-Group6" $php_versions + - sh tests/drone/setup-stages.sh "group7" "07-Group7" $php_versions + - sh tests/drone/setup-stages.sh "group8" "08-Group8" $php_versions + - sh tests/drone/setup-stages.sh "group9" "09-Group9" $php_versions + - sh tests/drone/setup-stages.sh "group10" "10-Group10" $php_versions + - sh tests/drone/setup-stages.sh "group11" "11-Group11" $php_versions + +branches: + exclude: [ crowdin ] diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000..ace97f429fc --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files you want to always be normalized and converted +# to native line endings on checkout. +*.php text eol=lf +*.html text eol=lf +*.js text eol=lf +*.xml text eol=lf +*.ini text eol=lf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary +*.gif binary +*.bak binary +*.mwb binary \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100755 index 00000000000..56b082dc45b --- /dev/null +++ b/.gitignore @@ -0,0 +1,80 @@ +# OSX +.DS_Store +._* +.Spotlight-V100 +.Trashes + +# Windows +Thumbs.db +Desktop.ini + +# PHPStorm +.idea/ + +# Sublime Text +*.sublime* + +# Eclipse +.buildpath +.project +.settings + +# Temp files +*.tmp +*.bak +*.swp +*~.nib +*~ + +# Ignore mergetool files +*.orig + +# Phing build script +build.properties +phing-latest.phar + +# Gulp Build script +gulp-config.json +npm-debug.log +node_modules/ + +# Composer +composer.lock +vendor/* +tests/vendor/* +**/vendor/* + +# Bower +bower_components/ + +# Test related files +tests/system/servers/configdef.php +tests/system/webdriver/tests/logs/ +codecept.phar +tests/*/*Tester.php +selenium.log +tests/_output +tests/joomla-cms +tests/cache +tests/RoboFile.ini +selenium-server-standalone.jar +tests/_support/_generated/* +tests/releases/* +tests/acceptance.suite.yml + +# Ignore redSHOP config +component/admin/config/config.php + +# Never ignore +!.gitignore +!index.html +!index.php + +# Releases folder +releases/* + +# Checksum MD5 Files +checksum.md5 +checksum.md5.json +component/admin/assets/checksum.md5 +component/admin/assets/checksum.md5.json \ No newline at end of file diff --git a/.scrutinizer.yml b/.scrutinizer.yml new file mode 100644 index 00000000000..3f976aed7d6 --- /dev/null +++ b/.scrutinizer.yml @@ -0,0 +1,5 @@ +# .scrutinizer.yml +build: + environment: + php: + version: 7.1 # Common versions: 5.4, 5.5, 5.6, 7.0, 7.1, or hhvm \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000000..7dfe0dbf72d --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md new file mode 100755 index 00000000000..4528f7225ef --- /dev/null +++ b/README.md @@ -0,0 +1,160 @@ +redSHOP 2.x +========== + +[![Build Status](https://travis-ci.com/redCOMPONENT-COM/redSHOP.svg?token=exSzjzLhFrzHef99DDg1&branch=develop)](https://travis-ci.com/redCOMPONENT-COM/redSHOP) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/redCOMPONENT-COM/redSHOP/badges/quality-score.png?b=develop&s=f945d89ef335953761803d0e0f0e37d5fecf0b62)](https://scrutinizer-ci.com/g/redCOMPONENT-COM/redSHOP/?branch=develop) + +## Requirement +PHP Version: **>= 5.6** + +## Documentation + +https://github.com/redCOMPONENT-COM/documentation + +## DB Change + +There are an MySQL Workbench DB Model file in src/db/redshop.mwb. When need some changes in DB structure: + +- Use MySQL Workbench open this `src/db/redshop.mwb` file. +- Add some necessary changes in MySQL Workbench +- Go to File > Export > Forward Engineer SQL Create Script... +- Choose path for output script file (admin/sql/mysql/install.sql) +- Check on 2 option *Generate DROP Statements Before Each CREATE Statement* and *Omit Schema Qulifier in Object Names*. +- Open generated install.sql file and remove the comments from MySQL Workbench +- In install.sql, remove this line at top: + +> SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + +- In install.sql, remove this line at bottom: + +> SET SQL_MODE=@OLD_SQL_MODE; + +## Release process for redSHOP +Please follow the next steps in order to release a new version of redSHOP. + +- Execute component_packager.xml PHING file to generate the main component package (includes 1 module and 2 plugins). + +## Using Gulp build system + +Before you can run any Gulp command you need to: + +- download and install NodeJS https://nodejs.org/download/ +- install npm: `sudo npm install` +- install Gulp: `npm install --save gulp-install` +- install joomla-gulp-release: `sudo npm install --save-dev joomla-gulp-release` + +### Following tasks and switches are available: +#### Setup gulp config file. Copy and rename `gulp-config.sample.json` file into `gulp-config.json` + +> Version and other information can be set in `gulp-config.json` file. + +#### To Release `component` and create `.zip` file + +> Use this command to release component. Version and other information can be set in `gulp-config.json` file. + + gulp release:component + +#### To Release `modules` and create `.zip` file + + gulp release:modules + +#### To Release `plugins` and create `.zip` file + + gulp release:plugins + +#### To Release `packages` and create `.zip` file + + gulp release:packages + +_or_ + + gulp release:packages --folder ./individual_package_dir + + +This command is to release the extensions. + + gulp release:extensions + + +This command will read the base directory and create zip files for each of the folder. + +#### === Switches === +Pass an argument to choose different folder + + --folder {source direcory} Default: "./plugins" + +Pass an argument to change suffix for extension + + --suffix {text of suffix} Default: "plg_" + +#### Example Usage: + + gulp release:extensions --folder ./modules --suffix ext_ + + +### Languages & translation +- Move the language files to the translations repository: https://github.com/redCOMPONENT-COM/translations/tree/master/redSHOP/source +- Check in 24hours that Transifex was able to get the new translation strings adding them to the .ini resource files + +### Extensions +#### Plugins +- Check if any plugin has been changed in this last release: + +> $ git log --oneline --after={2013-04-18} --no-merges --name-only | grep 'plugins\/.*' | cut -d/ -f2,3 | sort | uniq + +_Or Compare across versions_ + +> git log --oneline 1.4/dev19...develop --no-merges --name-only | grep 'plugins\/.*' | cut -d/ -f2,3 | sort | uniq > /var/www/packages/plugins.log + +- if plungins have been modified: + - Update the release number in their manifest .xml file with the same release number as the component. For example if we are releasing redSHOP 1.3 and plugin plg_default_shipping has been updated during 1.2 - 1.3 period, then you should set the plugin version to 1.3 here: https://github.com/redCOMPONENT-COM/redSHOP-1.2/blob/master/plugins/redshop_shipping/default_shipping/default_shipping.xml#L4 or leave it as it is if it has not been touch. + - execute the plugins_packager.xml PHING file and upload the new release to redCOMPONENT.com + +Note: to match the plugins with it's compatible core version see https://github.com/redCOMPONENT-COM/redSHOP/pull/1548 + +#### Modules +- Check if any module has been changed in this last release: + +> $ git log --oneline --after={2013-04-18} --no-merges --name-only | grep 'modules\/.*' | cut -d/ -f2,3 | sort | uniq + +_Or Compare across versions_ + +> git log --oneline 1.4/dev19...develop --no-merges --name-only | grep 'modules\/.*' | cut -d/ -f2,3 | sort | uniq > /var/www/packages/modules.log + +- if modules have been modified: + - Update the release number in their manifest .xml file in the same way you have done it with plugins https://github.com/redCOMPONENT-COM/redSHOP-1.2#plugins + - execute the modules_packager.xml PHING file and upload the new release to redCOMPONENT.com + +### Test +- test the packages to ensure that everything works properly. +- share the package in the redSHOP testing chat, so others can do some testing. +- add fast fixes if issues has been identified during testing +- Generate the final packages and contact the Product Owner (Ole) and ask him to upload the packages to redCOMPOPNENT.com + +### Update Changelog +- Create the Changelog list of commits: + +> git log --oneline 1.4/dev25...develop --no-merges --format="* %s ( %h )" > /var/www/packages/changelog2.log + +- Upload the list to http://wiki.redcomponent.com/index.php?title=redSHOP:Changelog + + +### Prepare software for next release +- Update component version number with next release number at https://github.com/redCOMPONENT-COM/redSHOP/blob/master/redshop.xml#L10 +- Create an empty update .sql file at: https://github.com/redCOMPONENT-COM/redSHOP/tree/master/component/admin/sql/updates/mysql +- Merge development branch into Master (see successful git-branching model: http://nvie.com/posts/a-successful-git-branching-model/ ) +- Create a release git TAG + - create the tag in local: + +> $ git tag -a 1.3 -m "Version 1.3 Stable" + + - Upload the tag to Github: + +> $ git push --tags + + - Check that tag has been created: https://github.com/redCOMPONENT-COM/redSHOP/tags + - Create the release: https://github.com/redCOMPONENT-COM/redSHOP/releases + - Add a description to the release with the changelog information that you generated in the previous step + + +# Testing +See: [testing redSHOP1](./tests/README.md) diff --git a/RoboFile.php b/RoboFile.php new file mode 100644 index 00000000000..62cfd142943 --- /dev/null +++ b/RoboFile.php @@ -0,0 +1,323 @@ +say('Using cached version of Joomla CMS and skipping clone process'); + } + else + { + $this->taskDeleteDir('tests/joomla-cms')->run(); + } + } + if (!$skipCleanup) + { + $version = 'staging'; + + /* + * When joomla Staging branch has a bug you can uncomment the following line as a tmp fix for the tests layer. + * Use as $version value the latest tagged stable version at: https://github.com/joomla/joomla-cms/releases + */ + $version = '3.9.12'; + + $this->_exec("git clone -b $version --single-branch --depth 1 https://github.com/joomla/joomla-cms.git tests/joomla-cms"); + $this->say("Joomla CMS ($version) site created at tests/joomla-cms"); + } + // Optionally uses Joomla default htaccess file + if ($use_htaccess == 1) + { + $this->_copy('tests/joomla-cms/htaccess.txt', 'tests/joomla-cms/.htaccess'); + $this->_exec('sed -e "s,# RewriteBase /,RewriteBase /tests/joomla-cms/,g" --in-place tests/joomla-cms/.htaccess'); + } + } + + /** + * Downloads Paid Extensions for Integration Testing testing + * + * @param integer $cleanUp Clean up the directory when present (or skip the cloning process) + * + * @return void + * @since 2.1.2 + */ + public function testsPaidExtensionsForIntegrationTests($cleanUp = 1) + { + // Delete any previous core + if (is_dir('tests/extension/paid-extensions')) + { + if (!$cleanUp) + { + $this->say('Using cached version of Aesir Core and skipping clone process'); + + return; + } + + $this->taskDeleteDir('tests/extension/paid-extensions')->run(); + } + + $version = 'master'; + $this->_exec("git clone --recursive -b $version --single-branch https://REDWEB_QA_TOKEN:aXpne9NyZmDVt2R5cxjY@gitlab.redweb.dk/redshop-extensions/redshop-paid-extensions tests/extension/paid-extensions"); + + $this->say("paid-extensions ($version) cloned at tests/extension/"); + } + + /** + * Tests setup + * + * @param boolean $debug Add debug to the parameters + * @param boolean $steps Add steps to the parameters + * @param boolean $extraVerbose Add extra verbosity + * + * @return void + * @since __DEPLOY_VERSION__ + */ + public function testsSetup($debug = true, $steps = true, $extraVerbose = false) + { + $args = []; + + if ($debug) + { + $args[] = '--debug'; + } + + if ($steps) + { + $args[] = '--steps'; + } + + if ($extraVerbose) + { + $args[] = '-vvv'; + } + + $args = array_merge( + $args, + $this->defaultArgs + ); + + // Sets the output_append variable in case it's not yet + if (getenv('output_append') === false) + { + putenv('output_append='); + } + + // Builds codeception + $this->_exec("vendor/bin/codecept build"); + + // Executes the initial set up + $this->taskCodecept() + ->args($args) + ->arg('tests/acceptance/install/core') + ->run() + ->stopOnFail(); + } + + /** + * Individual test folder execution + * + * @param string $folder Folder to execute codecept run to + * @param boolean $debug Add debug to the parameters + * @param boolean $steps Add steps to the parameters + * @param boolean $extraVerbose Add extra verbosity + * + * @return void + * @since __DEPLOY_VERSION__ + */ + public function testsRun($folder, $debug = true, $steps = true, $extraVerbose = false) + { + $args = []; + + if ($debug) + { + $args[] = '--debug'; + } + + if ($steps) + { + $args[] = '--steps'; + } + + if ($extraVerbose) + { + $args[] = '-vvv'; + } + + $args = array_merge( + $args, + $this->defaultArgs + ); + + // Sets the output_append variable in case it's not yet + if (getenv('output_append') === false) + { + putenv('output_append='); + } + + // Codeception build + $this->_exec("vendor/bin/codecept build"); + + // Actual execution of Codeception test + $this->taskCodecept() + ->args($args) + ->arg('tests/' . $folder . '/') + ->run() + ->stopOnFail(); + } + + /** + * Sends the build report error back to Slack + * + * @param string $cloudinaryName Cloudinary cloud name + * @param string $cloudinaryApiKey Cloudinary API key + * @param string $cloudinaryApiSecret Cloudinary API secret + * @param string $githubRepository GitHub repository (owner/repo) + * @param string $githubPRNo GitHub PR # + * @param string $slackWebhook Slack Webhook URL + * @param string $slackChannel Slack channel + * @param string $buildURL Build URL + * + * @return void + * @since __DEPLOY_VERSION__ + */ + public function sendBuildReportErrorSlack($cloudinaryName, $cloudinaryApiKey, $cloudinaryApiSecret, $githubRepository, $githubPRNo, $slackWebhook, $slackChannel, $buildURL = '') + { + $directories = glob('tests/_output/*' , GLOB_ONLYDIR); + + foreach ($directories as $directory) + { + $this->sendBuildReportErrorSlackDirectory($directory, $cloudinaryName, $cloudinaryApiKey, $cloudinaryApiSecret, $githubRepository, $githubPRNo, $slackWebhook, $slackChannel, $buildURL); + } + } + + /** + * Sends the build report error back to Slack + * + * @param string $directory Directory to explore + * @param string $cloudinaryName Cloudinary cloud name + * @param string $cloudinaryApiKey Cloudinary API key + * @param string $cloudinaryApiSecret Cloudinary API secret + * @param string $githubRepository GitHub repository (owner/repo) + * @param string $githubPRNo GitHub PR # + * @param string $slackWebhook Slack Webhook URL + * @param string $slackChannel Slack channel + * @param string $buildURL Build URL + * + * @return void + * @since __DEPLOY_VERSION__ + */ + public function sendBuildReportErrorSlackDirectory($directory, $cloudinaryName, $cloudinaryApiKey, $cloudinaryApiSecret, $githubRepository, $githubPRNo, $slackWebhook, $slackChannel, $buildURL = '') + { + $errorSelenium = true; + $reportError = false; + $reportFile = $directory . '/selenium.log'; + $errorLog = 'Selenium log in ' . $directory . ':' . chr(10). chr(10); + $this->say('Starting to Prepare Build Report'); + + $this->say('Exploring folder ' . $directory . ' for error reports'); + // Loop through Codeception snapshots + if (file_exists($directory) && $handler = opendir($directory)) + { + $reportFile = $directory . '/report.tap.log'; + $errorLog = 'Codeception tap log in ' . $directory . ':' . chr(10). chr(10); + $errorSelenium = false; + } + + if (file_exists($reportFile)) + { + $this->say('Report File Prepared'); + if ($reportFile) + { + $errorLog .= file_get_contents($reportFile, null, null, 15); + } + + if (!$errorSelenium) + { + $handler = opendir($directory); + $errorImage = ''; + + while (!$reportError && false !== ($errorSnapshot = readdir($handler))) + { + // Avoid sending system files or html files + if (!('png' === pathinfo($errorSnapshot, PATHINFO_EXTENSION))) + { + continue; + } + + $reportError = true; + $errorImage = $directory . '/' . $errorSnapshot; + } + } + + if ($reportError || $errorSelenium) + { + // Sends the error report to Slack + $this->say('Sending Error Report'); + $reportingTask = $this->taskReporting() + ->setCloudinaryCloudName($cloudinaryName) + ->setCloudinaryApiKey($cloudinaryApiKey) + ->setCloudinaryApiSecret($cloudinaryApiSecret) + ->setGithubRepo($githubRepository) + ->setGithubPR($githubPRNo) + ->setBuildURL($buildURL . 'display/redirect') + ->setSlackWebhook($slackWebhook) + ->setSlackChannel($slackChannel) + ->setTapLog($errorLog); + + if (!empty($errorImage)) + { + $reportingTask->setImagesToUpload($errorImage) + ->publishCloudinaryImages(); + } + + $reportingTask->publishBuildReportToSlack() + ->run() + ->stopOnFail(); + } + } + } +} \ No newline at end of file diff --git a/bump.sh b/bump.sh new file mode 100755 index 00000000000..87f58c5331d --- /dev/null +++ b/bump.sh @@ -0,0 +1,17 @@ +#!/bin/bash +echo "----------------------" +REDSHOPVERSION=$1 +if [ "$REDSHOPVERSION" = "" ]; then + echo 'Missing version. Usage: bump.sh {version}' +else + echo "redSHOP Release Version: $REDSHOPVERSION" + + FILES=$(find ./component/ ./libraries/ ./modules/ ./plugins/ -not -path '*/vendor/*' -name '*.php') + + for f in $FILES + do + sed -i "s/__DEPLOY_VERSION__/$REDSHOPVERSION/g" $f + done +fi + + diff --git a/codeception.yml b/codeception.yml new file mode 100644 index 00000000000..e84905890d9 --- /dev/null +++ b/codeception.yml @@ -0,0 +1,12 @@ +actor: Tester +paths: + tests: tests + log: tests/_output/output%output_append% + data: tests/_data + helpers: tests/_support +settings: + bootstrap: _bootstrap.php + colors: true + memory_limit: 1024M +params: +- env \ No newline at end of file diff --git a/component/admin/access.xml b/component/admin/access.xml new file mode 100644 index 00000000000..641339d232c --- /dev/null +++ b/component/admin/access.xml @@ -0,0 +1,163 @@ + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/component/admin/assets/index.html b/component/admin/assets/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/assets/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/assets/labels/index.html b/component/admin/assets/labels/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/assets/labels/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/assets/media/index.html b/component/admin/assets/media/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/assets/media/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/config.xml b/component/admin/config.xml new file mode 100644 index 00000000000..515c349cd66 --- /dev/null +++ b/component/admin/config.xml @@ -0,0 +1,18 @@ + + +
+ +
+
\ No newline at end of file diff --git a/component/admin/config/config.dist.php b/component/admin/config/config.dist.php new file mode 100644 index 00000000000..a10069d0cb3 --- /dev/null +++ b/component/admin/config/config.dist.php @@ -0,0 +1,741 @@ +'; + + public $DAFULT_PREVIOUS_LINK_PREFIX = '<--  '; + + public $DAFULT_RETURN_TO_CATEGORY_PREFIX = ''; + + public $ALLOW_MULTIPLE_DISCOUNT = ''; + + public $DISCOUNT_ENABLE = '1'; + + public $DISCOUNT_TYPE = '4'; + + public $INVOICE_MAIL_ENABLE = '0'; + + public $ENABLE_BACKENDACCESS = '0'; + + public $WISHLIST_LOGIN_REQUIRED = '0'; + + public $INVOICE_MAIL_SEND_OPTION = '0'; + + public $ACCESSORY_PRODUCT_IN_LIGHTBOX = '0'; + + public $MINIMUM_ORDER_TOTAL = '0'; + + public $MANUFACTURER_TITLE_MAX_CHARS = ''; + + public $MANUFACTURER_TITLE_END_SUFFIX = ''; + + public $DEFAULT_VOLUME_UNIT = 'cm'; + + public $DEFAULT_WEIGHT_UNIT = 'gram'; + + public $WEBPACK_ENABLE_SMS = '1'; + + public $WEBPACK_ENABLE_EMAIL_TRACK = '1'; + + public $NEWSLETTER_ENABLE = '0'; + + public $NEWSLETTER_CONFIRMATION = '0'; + + public $WATERMARK_IMAGE = ''; + + public $WATERMARK_CATEGORY_THUMB_IMAGE = '0'; + + public $WATERMARK_CATEGORY_IMAGE = '0'; + + public $WATERMARK_PRODUCT_IMAGE = '0'; + + public $WATERMARK_PRODUCT_THUMB_IMAGE = '0'; + + public $WATERMARK_PRODUCT_ADDITIONAL_IMAGE = '0'; + + public $WATERMARK_CART_THUMB_IMAGE = '0'; + + public $WATERMARK_GIFTCART_IMAGE = '0'; + + public $WATERMARK_GIFTCART_THUMB_IMAGE = '0'; + + public $WATERMARK_MANUFACTURER_THUMB_IMAGE = '0'; + + public $WATERMARK_MANUFACTURER_IMAGE = '0'; + + public $CLICKATELL_USERNAME = ''; + + public $CLICKATELL_PASSWORD = ''; + + public $CLICKATELL_API_ID = ''; + + public $CLICKATELL_ENABLE = '0'; + + public $CLICKATELL_ORDER_STATUS = '0'; + + public $PRE_USE_AS_CATALOG = '0'; + + public $SHOW_SHIPPING_IN_CART = '1'; + + public $MANUFACTURER_MAIL_ENABLE = '0'; + + public $SUPPLIER_MAIL_ENABLE = '0'; + + public $PRODUCT_COMPARISON_TYPE = 'category'; + + public $COMPARE_TEMPLATE_ID = '320'; + + public $SSL_ENABLE_IN_CHECKOUT = '0'; + + public $VAT_RATE_AFTER_DISCOUNT = '0.000'; + + public $PRODUCT_DOWNLOAD_ROOT = '/var/www/jstaging/components/com_redshop/assets/download/product'; + + public $TWOWAY_RELATED_PRODUCT = '0'; + + public $PRODUCT_HOVER_IMAGE_ENABLE = '0'; + + public $PRODUCT_HOVER_IMAGE_WIDTH = '200'; + + public $PRODUCT_HOVER_IMAGE_HEIGHT = '300'; + + public $ADDITIONAL_HOVER_IMAGE_ENABLE = '0'; + + public $ADDITIONAL_HOVER_IMAGE_WIDTH = '0'; + + public $ADDITIONAL_HOVER_IMAGE_HEIGHT = '0'; + + public $SSL_ENABLE_IN_BACKEND = '0'; + + public $SHOW_PRICE_SHOPPER_GROUP_LIST = ''; + + public $SHOW_PRICE_USER_GROUP_LIST = ''; + + public $SHIPPING_AFTER = 'subtotal'; + + public $ENABLE_ADDRESS_DETAIL_IN_SHIPPING = '0'; + + public $CATEGORY_PRODUCT_SHORT_DESC_MAX_CHARS = ''; + + public $CATEGORY_PRODUCT_SHORT_DESC_END_SUFFIX = ''; + + public $RELATED_PRODUCT_SHORT_DESC_MAX_CHARS = ''; + + public $RELATED_PRODUCT_SHORT_DESC_END_SUFFIX = ''; + + public $CALCULATE_VAT_ON = 'BT'; + + public $REMOTE_UPDATE_DOMAIN_URL = 'http://dev.redcomponent.com/'; + + public $ONESTEP_CHECKOUT_ENABLE = '0'; + + public $SHOW_TAX_EXEMPT_INFRONT = '1'; + + public $NOOF_THUMB_FOR_SCROLLER = '3'; + + public $NOOF_SUBATTRIB_THUMB_FOR_SCROLLER = '3'; + + public $INDIVIDUAL_ADD_TO_CART_ENABLE = '0'; + + public $ACCESSORY_AS_PRODUCT_IN_CART_ENABLE = '0'; + + public $POSTDK_CUSTOMER_NO = ''; + + public $POSTDK_CUSTOMER_PASSWORD = ''; + + public $POSTDK_INTEGRATION = '0'; + + public $POSTDANMARK_ADDRESS = 'address'; + + public $POSTDANMARK_POSTALCODE = '123456'; + + public $MENUHIDE = ''; + + public $AJAX_CART_DISPLAY_TIME = '3000'; + + public $IMAGE_QUALITY_OUTPUT = '70'; + + public $IMAGE_MAX_WIDTH = '2048'; + + public $IMAGE_MAX_HEIGHT = '2048'; + + public $SEND_CATALOG_REMINDER_MAIL = '0'; + + public $CATEGORY_IN_SEF_URL = '0'; + + public $USE_BLANK_AS_INFINITE = '0'; + + public $USE_ENCODING = '0'; + + public $CREATE_ACCOUNT_CHECKBOX = '0'; + + public $SHOW_QUOTATION_PRICE = '0'; + + public $CHILDPRODUCT_DROPDOWN = 'product_name'; + + public $PURCHASE_PARENT_WITH_CHILD = '0'; + + public $ADDTOCART_DELETE = 'cross.png'; + + public $ADDTOCART_UPDATE = 'update.png'; + + public $DISPLAY_OUT_OF_STOCK_ATTRIBUTE_DATA = '1'; + + public $CART_TIMEOUT = '20'; + + public $DEFAULT_QUOTATION_MODE_PRE = '0'; + + public $SHOW_PRICE_PRE = '1'; + + public $NEWSLETTER_MAIL_CHUNK = '1'; + + public $NEWSLETTER_MAIL_PAUSE_TIME = '1'; + + public $SEND_MAIL_TO_CUSTOMER = '1'; + + public $AJAX_DETAIL_BOX_WIDTH = '500'; + + public $AJAX_DETAIL_BOX_HEIGHT = '600'; + + public $AJAX_BOX_WIDTH = '500'; + + public $AJAX_BOX_HEIGHT = '150'; + + public $ORDER_MAIL_AFTER = '0'; + + public $STATISTICS_ENABLE = '1'; + + public $MEDIA_ALLOWED_MIME_TYPE = 'bmp,csv,doc,gif,ico,jpg,jpeg,odg,odp,ods,odt,pdf,png,ppt,swf,txt,xcf,xls'; + + public $AUTO_GENERATE_LABEL = '1'; + + public $GENERATE_LABEL_ON_STATUS = 'S'; + + public $INVOICE_NUMBER_FOR_FREE_ORDER = '0'; + + public $LOAD_REDSHOP_STYLE = '0'; + + public $BACKWARD_COMPATIBLE_JS = '0'; + + public $BACKWARD_COMPATIBLE_PHP = '0'; + + public $IMPORT_MAX_FILE_SIZE = '2000000'; + + public $IMPORT_MAX_MIN_SIZE = '1'; + + public $IMPORT_FILE_MIME = 'text/csv,application/vnd.ms-excel'; + + public $IMPORT_FILE_EXTENSION = '.csv'; + + public $INLINE_EDITING = '1'; + + public $WISHLIST_LIST = '1'; +} diff --git a/component/admin/controller.php b/component/admin/controller.php new file mode 100644 index 00000000000..d731e6fd205 --- /dev/null +++ b/component/admin/controller.php @@ -0,0 +1,19 @@ +setUserState('com_redshop.access.selectedTabPosition', $this->input->get('selectedTabPosition')); + // Check for request forgeries. + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $app = JFactory::getApplication(); + $data = $app->input->get('jform', array(), 'Array'); + + /** @var RedshopModelAccess $model */ + $model = $this->getModel(); + + if ($model->save($data)) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_ACCESS_SAVE_SUCCESS', 'success')); + } + else + { + $app->enqueueMessage(JText::_('COM_REDSHOP_ACCESS_SAVE_FAIL', 'error')); + } + + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=access', false)); + + return true; + } +} diff --git a/component/admin/controllers/accountgroup.php b/component/admin/controllers/accountgroup.php new file mode 100644 index 00000000000..0b13b71c508 --- /dev/null +++ b/component/admin/controllers/accountgroup.php @@ -0,0 +1,59 @@ +input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelAccountgroup_detail $model */ + $model = $this->getModel('accountgroup_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ACCOUNTGROUP_DETAIL_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=accountgroup', $msg); + } + + /** + * @throws Exception + */ + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelAccountgroup_detail $model */ + $model = $this->getModel('accountgroup_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ACCOUNTGROUP_DETAIL_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=accountgroup', $msg); + } +} diff --git a/component/admin/controllers/accountgroup_detail.php b/component/admin/controllers/accountgroup_detail.php new file mode 100644 index 00000000000..93aa91caf10 --- /dev/null +++ b/component/admin/controllers/accountgroup_detail.php @@ -0,0 +1,127 @@ +registerTask('add', 'edit'); + } + + /** + * Edit + * + * @return void + */ + public function edit() + { + $this->input->set('view', 'accountgroup_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + /** + * Apply + * + * @return void + */ + public function apply() + { + $this->save(1); + } + + /** + * Save + * + * @param integer $apply Apply or not. + * + * @return void + */ + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + $cid = $this->input->post->get('cid', array(0), 'array'); + + $post['accountgroup_id'] = $cid[0]; + + /** @var RedshopModelAccountgroup_detail $model */ + $model = $this->getModel('accountgroup_detail'); + $row = $model->store($post); + + if ($row) + { + $msg = JText::_('COM_REDSHOP_ACCOUNTGROUP_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_ACCOUNTGROUP_DETAIL'); + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=accountgroup_detail&task=edit&cid[]=' . $row->accountgroup_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=accountgroup', $msg); + } + } + + /** + * Cancel + * + * @return void + */ + public function cancel() + { + $this->setRedirect('index.php?option=com_redshop&view=accountgroup', JText::_('COM_REDSHOP_ACCOUNTGROUP_DETAIL_EDITING_CANCELLED')); + } + + /** + * Remove + * + * @return void + * + * @throws Exception + */ + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelAccountgroup_detail $model */ + $model = $this->getModel('accountgroup_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ACCOUNTGROUP_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=accountgroup', $msg); + } +} diff --git a/component/admin/controllers/addorder_detail.php b/component/admin/controllers/addorder_detail.php new file mode 100644 index 00000000000..b30f8717194 --- /dev/null +++ b/component/admin/controllers/addorder_detail.php @@ -0,0 +1,357 @@ +input->set('hidemainmenu', 1); + } + + /** + * Save and pay + * + * @return void + * + * @since 2.0.6 + */ + public function savepay() + { + $this->save(1); + } + + /** + * + * @return void + * + * @since 2.0.6 + */ + public function save_without_sendmail() + { + $this->save(1); + } + + /** + * @param int $apply Apply + * + * @return void + * + * @since 2.0.6 + */ + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + $post ['order_id'] = $cid [0]; + + /** @var RedshopModelAddorder_detail $model */ + $model = $this->getModel('addorder_detail'); + $post['order_number'] = RedshopHelperOrder::generateOrderNumber(); + + $orderItem = Redshop\Order\Helper::redesignProductItem($post); + $post['order_item'] = $orderItem; + + if (empty($orderItem[0]->product_id)) + { + $msg = JText::_('COM_REDSHOP_PLEASE_SELECT_PRODUCT'); + $this->setRedirect( + 'index.php?option=com_redshop&view=addorder_detail&user_id=' . + $post['user_id'] . + '&shipping_users_info_id=' . + $post['shipp_users_info_id'], + $msg, + 'warning' + ); + + return; + } + + // Check product Quantity + $stockNote = ''; + + if (Redshop::getConfig()->get('USE_STOCKROOM') == 1) + { + for ($i = 0, $n = count($orderItem); $i < $n; $i++) + { + $quantity = $orderItem[$i]->quantity; + $productData = Redshop::product((int) $orderItem[$i]->product_id); + + if ($productData->min_order_product_quantity > 0 && $productData->min_order_product_quantity > $quantity) + { + $msg = $productData->product_name . ' ' . JText::_('WARNING_MSG_MINIMUM_QUANTITY'); + $stockNote .= sprintf($msg, $productData->min_order_product_quantity) . "
"; + $quantity = $productData->min_order_product_quantity; + } + + $currentStock = RedshopHelperStockroom::getStockroomTotalAmount($orderItem[$i]->product_id); + $finalquantity = ($currentStock >= $quantity) ? (int) $quantity : (int) $currentStock; + + if ($finalquantity > 0) + { + if ($productData->max_order_product_quantity > 0 && $productData->max_order_product_quantity < $finalquantity) + { + $msg = $productData->product_name . " " . JText::_('WARNING_MSG_MAXIMUM_QUANTITY') . "
"; + $stockNote .= sprintf($msg, $productData->max_order_product_quantity); + $finalquantity = $productData->max_order_product_quantity; + } + + $orderItem[$i]->quantity = $finalquantity; + } + else + { + $stockNote .= $productData->product_name . ' ' . JText::_('COM_REDSHOP_PRODUCT_OUT_OF_STOCK') . "
"; + unset($orderItem[$i]); + } + } + + $orderItem = array_merge(array(), $orderItem); + + if (count($orderItem) <= 0) + { + $msg = JText::_('COM_REDSHOP_PRODUCT_OUT_OF_STOCK'); + $this->setRedirect('index.php?option=com_redshop&view=addorder_detail&user_id=' . $post['user_id'] + . '&shipping_users_info_id=' . $post['shipp_users_info_id'], + $msg, + 'warning' + ); + + return; + } + } + + $orderTotal = $post['order_total']; + + $orderShipping = Redshop\Shipping\Rate::decrypt($post['shipping_rate_id']); + + if (count($orderShipping) > 4) + { + $post['order_shipping'] = $orderShipping[3]; + $orderTotal = $orderTotal + $orderShipping[3]; + $post['order_shipping_tax'] = $orderShipping[6]; + } + + $tmpOrderTotal = $orderTotal; + + if (array_key_exists("issplit", $post) && $post['issplit']) + { + $tmpOrderTotal = $orderTotal / 2; + } + + $paymentmethod = RedshopHelperOrder::getPaymentMethodInfo($post['payment_method_class']); + $paymentmethod = $paymentmethod[0]; + $paymentparams = new Registry($paymentmethod->params); + $paymentinfo = new stdclass; + $post['economic_payment_terms_id'] = $paymentparams->get('economic_payment_terms_id'); + $post['economic_design_layout'] = $paymentparams->get('economic_design_layout'); + $paymentinfo->payment_price = $paymentparams->get('payment_price', ''); + $paymentinfo->is_creditcard = $post['economic_is_creditcard'] = $paymentparams->get('is_creditcard', ''); + $paymentinfo->payment_oprand = $paymentparams->get('payment_oprand', ''); + $paymentinfo->accepted_credict_card = $paymentparams->get("accepted_credict_card"); + $paymentinfo->payment_discount_is_percent = $paymentparams->get('payment_discount_is_percent', ''); + + $subtotal = $post['order_subtotal']; + $updateDiscount = 0; + + if ($post['update_discount'] > 0) + { + $updateDiscount = $post['update_discount']; + + if ($updateDiscount > $subtotal) + { + $updateDiscount = $subtotal; + } + + if ($updateDiscount != 0) + { + $orderTotal = $orderTotal - $updateDiscount; + } + } + + $specialDiscount = $post['special_discount']; + + $subTotalExcludeVat = 0; + + for ($i = 0, $in = count($orderItem); $i < $in; $i++) + { + $subTotalExcludeVat = $subTotalExcludeVat + ($orderItem[$i]->prdexclprice * $orderItem[$i]->quantity); + } + + if (Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT')) + { + $amt = $subtotal; + } + else + { + $amt = $subTotalExcludeVat; + } + + $discountPrice = ($amt * $specialDiscount) / 100; + $post['special_discount'] = $specialDiscount; + $post['special_discount_amount'] = $discountPrice; + + $orderTotal = $orderTotal - $discountPrice; + + if (Redshop::getConfig()->get('PAYMENT_CALCULATION_ON') == 'subtotal') + { + $paymentAmount = $subtotal; + } + else + { + $paymentAmount = $orderTotal; + } + + $paymentMethod = RedshopHelperPayment::calculate($paymentAmount, $paymentinfo, $orderTotal); + $post['ship_method_id'] = urldecode(urldecode($post['shipping_rate_id'])); + $orderTotal = $paymentMethod[0]; + $post['user_info_id'] = $post['users_info_id']; + $post['payment_discount'] = $paymentMethod[1]; + $post['payment_oprand'] = $paymentinfo->payment_oprand; + $post['order_discount'] = $updateDiscount; + $post['order_total'] = $orderTotal; + $post['order_payment_amount'] = $tmpOrderTotal; + $post['order_payment_name'] = $paymentmethod->name; + + // Save + Pay button pressed + if ($apply == 1) + { + $post['order_payment_status'] = empty($post['order_payment_status']) ? 'Unpaid' : $post['order_payment_status']; + $post['order_status'] = empty($post['order_status']) ? 'P' : $post['order_status']; + } + + $row = $model->store($post); + + if (!$row) + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_ORDER_DETAIL'); + $this->setRedirect('index.php?option=com_redshop&view=addorder_detail&user_id=' . $post['user_id'] + . '&shipping_users_info_id=' . $post['shipp_users_info_id'], + $msg, + 'error' + ); + + return; + } + + if ($apply == 1 && false !== $row) + { + // @TODO Consider about this method name. get should return value instead of "set" + RedshopHelperOrder::getPaymentInformation($row, $post); + } + else + { + $msg = JText::_('COM_REDSHOP_ORDER_DETAIL_SAVED'); + $this->setRedirect('index.php?option=com_redshop&view=order', $msg . $stockNote); + } + } + + /** + * + * @return void + * + * @since 2.0.6 + */ + public function cancel() + { + $msg = JText::_('COM_REDSHOP_ORDER_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=order', $msg); + } + + public function guestuser() + { + $post = $this->input->post->getArray(); + + if (!isset($post['billisship'])) + { + $this->input->set('billisship', 0); + } + + /** @var RedshopModelAddorder_detail $model */ + $model = $this->getModel('addorder_detail'); + + if ($row = $model->storeShipping($post)) + { + $this->setRedirect( + 'index.php?option=com_redshop&view=addorder_detail&user_id=' . $row->user_id . '&shipping_users_info_id=' . $row->users_info_id + ); + } + + JFactory::getApplication()->setUserState('com_redshop.addorder_detail.guestuser.username', $this->input->getUsername('username')); + + parent::display(); + } + + /** + * + * @return void + * + * @since 2.0.6 + */ + public function changeshippingaddress() + { + $shippingadd_id = $this->input->getInt('shippingadd_id', 0); + $user_id = $this->input->getInt('user_id', 0); + $is_company = $this->input->getInt('is_company', 0); + + /** @var RedshopModelAddorder_detail $model */ + $model = $this->getModel('addorder_detail'); + + $htmlshipping = $model->changeshippingaddress($shippingadd_id, $user_id, $is_company); + + echo $htmlshipping; + + JFactory::getApplication()->close(); + } + + /** + * + * @return void + * + * @since 2.0.6 + */ + public function getShippingRate() + { + $get = $this->input->get->getArray(); + $shipping = Redshop\Shipping\Rate::decrypt($get['shipping_rate_id']); + $order_shipping_class = ''; + $order_shipping = 0; + $order_shipping_tax = ''; + + if (count($shipping) > 4) + { + $order_shipping = $shipping[3] - $shipping[6]; + $order_shipping_tax = $shipping[6]; + $order_shipping_class = $shipping[0]; + } + + echo "
" . $order_shipping_class . "
"; + echo "
" . $order_shipping . "
"; + echo "
" . $order_shipping_tax . "
"; + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/addquotation_detail.php b/component/admin/controllers/addquotation_detail.php new file mode 100644 index 00000000000..861ea83a2a8 --- /dev/null +++ b/component/admin/controllers/addquotation_detail.php @@ -0,0 +1,181 @@ +input->set('hidemainmenu', 1); + $this->_db = JFactory::getDbo(); + } + + /** + * Method for apply + * + * @return void + */ + public function apply() + { + $this->save(0, 1); + } + + /** + * Method for save + * + * @param integer $send + * @param integer $apply + * + * @return boolean + */ + public function save($send = 0, $apply = 0) + { + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + $post ['quotation_id'] = $cid [0]; + + /** @var RedshopModelAddquotation_detail $model */ + $model = $this->getModel('addquotation_detail'); + + if (!$post['users_info_id']) + { + $name = $post['firstname'] . ' ' . $post['lastname']; + $post['usertype'] = "Registered"; + $post['email'] = $post['user_email']; + $post['username'] = $this->input->post->getUsername('username', ''); + $post['name'] = $name; + $this->input->set('password1', $post['password']); + + $post['groups'] = array(0 => 2); + + $date = JFactory::getDate(); + $post['registerDate'] = $date->toSql(); + $post['block'] = 0; + + // Get Admin order detail Model Object + /** @var RedshopModelUser_detail $userModel */ + $userModel = RedshopModel::getInstance('User_detail', 'RedshopModel'); + + // Call Admin order detail Model store function for Billing + $user = $userModel->storeUser($post); + + if (!$user) + { + $errorMsg = $this->_db->getErrorMsg(); + $link = JRoute::_('index.php?option=com_redshop&view=addquotation_detail', false); + $this->setRedirect($link, $errorMsg); + + return false; + } + + $post['user_id'] = $user->user_id; + $user_id = $user->user_id; + + $user_data = new stdClass; + $post['users_info_id'] = $user_data->users_info_id; + + if (count($user) <= 0) + { + $this->setRedirect('index.php?option=com_redshop&view=quotaion_detail&user_id=' . $user_id); + } + } + + $orderItem = Redshop\Order\Helper::redesignProductItem($post); + $post['order_item'] = $orderItem; + + $post['user_info_id'] = $post['users_info_id']; + + $row = $model->store($post); + + if ($row) + { + $msg = JText::_('COM_REDSHOP_QUOTATION_DETAIL_SAVED'); + + if ($send == 1) + { + if ($model->sendQuotationMail($row->quotation_id)) + { + $msg = JText::_('COM_REDSHOP_QUOTATION_DETAIL_SENT'); + } + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=quotation_detail&task=edit&cid[]=' . $row->quotation_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=quotation', $msg); + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_QUOTATION_DETAIL'); + $this->setRedirect('index.php?option=com_redshop&view=quotation', $msg); + } + } + + public function send() + { + $this->save(1); + } + + public function cancel() + { + + $msg = JText::_('COM_REDSHOP_QUOTATION_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=quotation', $msg); + } + + public function displayOfflineSubProperty() + { + $get = $this->input->get->getArray(); + + /** @var RedshopModelAddquotation_detail $model */ + $model = $this->getModel('Addquotation_Detail'); + + $productId = $get['product_id']; + $accessoryId = $get['accessory_id']; + $attributeId = $get['attribute_id']; + $uniqueId = $get['unique_id']; + + $propertiesId = explode(",", $get['property_id']); + + $response = ''; + + foreach ($propertiesId as $propertyId) + { + $response .= $model->replaceSubPropertyData($productId, $accessoryId, $attributeId, $propertyId, $uniqueId); + } + + echo $response; + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/alert.php b/component/admin/controllers/alert.php new file mode 100644 index 00000000000..daa4e01d450 --- /dev/null +++ b/component/admin/controllers/alert.php @@ -0,0 +1,118 @@ + true)) + { + return parent::getModel($name, $prefix, $config); + } + + /** + * Method for remove alert + * + * @return void + * + * @throws Exception + */ + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE'), 500); + } + + /** @var RedshopModelAlert_detail $model */ + $model = $this->getModel('alert_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ALERT_DELETED_SUCCESSFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=alert', $msg); + } + + /** + * Method for publish + * + * @return void + * + * @throws Exception + */ + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH'), 500); + } + + /** @var RedshopModelAlert_detail $model */ + $model = $this->getModel('alert_detail'); + + if (!$model->read($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ALERT_READ_SUCCESSFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=alert', $msg); + } + + /** + * Method for unpublish + * + * @return void + * + * @throws Exception + */ + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH'), 500); + } + + $model = $this->getModel('alert_detail'); + + if (!$model->read($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ALERT_UNREAD_SUCCESSFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=alert', $msg); + } +} diff --git a/component/admin/controllers/attribute.php b/component/admin/controllers/attribute.php new file mode 100644 index 00000000000..b52130e41af --- /dev/null +++ b/component/admin/controllers/attribute.php @@ -0,0 +1,34 @@ + true)) + { + return parent::getModel($name, $prefix, $config); + } +} diff --git a/component/admin/controllers/attribute_set.php b/component/admin/controllers/attribute_set.php new file mode 100644 index 00000000000..5066c75ff8e --- /dev/null +++ b/component/admin/controllers/attribute_set.php @@ -0,0 +1,67 @@ +setRedirect('index.php'); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelAttribute_set_detail $model */ + $model = $this->getModel('attribute_set_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ATTRIBUTE_SET_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=attribute_set', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelAttribute_set_detail $model */ + $model = $this->getModel('attribute_set_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ATTRIBUTE_SET_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=attribute_set', $msg); + } +} diff --git a/component/admin/controllers/attribute_set_detail.php b/component/admin/controllers/attribute_set_detail.php new file mode 100644 index 00000000000..ce145d14317 --- /dev/null +++ b/component/admin/controllers/attribute_set_detail.php @@ -0,0 +1,420 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'attribute_set_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + + /** @var RedshopModelAttribute_set_detail $model */ + $model = $this->getModel('attribute_set_detail'); + $msg = ''; + + if ($row = $model->store($post)) + { + $this->attribute_save($post, $row); + + $msg = JText::_('COM_REDSHOP_ATTRIBUTE_SET_DETAIL_SAVED'); + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=attribute_set_detail&task=edit&cid[]=' . $row->attribute_set_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=attribute_set', $msg); + } + } + + /** + * Method for save attribute + * + * @param $post + * @param $row + * + * @return void + */ + public function attribute_save($post, $row) + { + /** @var RedshopModelAttribute_set_detail $model */ + $model = $this->getModel('attribute_set_detail'); + + $attributesSave = array(); + $propertiesSave = array(); + $subPropertiesSave = array(); + + if (!is_array($post['attribute'])) + { + return; + } + + $attribute = array_merge(array(), $post['attribute']); + + $files = $this->input->files->getArray(); + + for ($a = 0, $countAttribute = count($attribute); $a < $countAttribute; $a++) + { + $attributesSave['attribute_id'] = $attribute[$a]['id']; + $attributesSave['attribute_set_id'] = $row->attribute_set_id; + $attributesSave['attribute_name'] = htmlspecialchars($attribute[$a]['name']); + $attributesSave['attribute_description'] = $attribute[$a]['attribute_description']; + $attributesSave['ordering'] = $attribute[$a]['ordering']; + $attributesSave['attribute_required'] = ($attribute[$a]['required'] == 'on' || $attribute[$a]['required'] == '1') ? '1' : '0'; + $attributesSave['allow_multiple_selection'] = ($attribute[$a]['allow_multiple_selection'] == 'on' + || $attribute[$a]['allow_multiple_selection'] == '1') ? '1' : '0'; + $attributesSave['hide_attribute_price'] = ($attribute[$a]['hide_attribute_price'] == 'on' + || $attribute[$a]['hide_attribute_price'] == '1') ? '1' : '0'; + $attributesSave['attribute_published'] = ($attribute[$a]['published'] == 'on' || $attribute[$a]['published'] == '1') ? '1' : '0'; + $attributesSave['display_type'] = $attribute[$a]['display_type']; + $attribute_array = $model->store_attr($attributesSave); + $property = array_merge(array(), $attribute[$a]['property']); + + $propertyImages = array_keys($attribute[$a]['property']); + $tmpPropertyImage = array_merge(array(), $propertyImages); + + for ($p = 0, $countProperty = count($property); $p < $countProperty; $p++) + { + $propertiesSave['property_id'] = $property[$p]['property_id']; + $propertiesSave['attribute_id'] = $attribute_array->attribute_id; + $propertiesSave['property_name'] = htmlspecialchars($property[$p]['name']); + $propertiesSave['property_price'] = $property[$p]['price']; + $propertiesSave['oprand'] = $property[$p]['oprand']; + $propertiesSave['property_number'] = $property[$p]['number']; + $propertiesSave['property_image'] = $property[$p]['image']; + $propertiesSave['ordering'] = $property[$p]['order']; + $propertiesSave['setrequire_selected'] = ($property[$p]['req_sub_att'] == 'on' || $property[$p]['req_sub_att'] == '1') ? '1' : '0'; + $propertiesSave['setmulti_selected'] = ($property[$p]['multi_sub_att'] == 'on' || $property[$p]['multi_sub_att'] == '1') ? '1' : '0'; + $propertiesSave['setdefault_selected'] = ($property[$p]['default_sel'] == 'on' || $property[$p]['default_sel'] == '1') ? '1' : '0'; + $propertiesSave['setdisplay_type'] = $property[$p]['setdisplay_type']; + $propertiesSave['property_published'] = ($property[$p]['published'] == 'on' || $property[$p]['published'] == '1') ? '1' : '0'; + $propertiesSave['extra_field'] = $property[$p]['extra_field']; + $properties = $model->store_pro($propertiesSave); + $propertyImage = $files['attribute_' . $a . '_property_' . $tmpPropertyImage[$p] . '_image']; + + if (empty($property[$p]['mainImage'])) + { + if (!empty($propertyImage['name'])) + { + $propertiesSave['property_image'] = $model->copy_image($propertyImage, 'product_attributes', $properties->property_id); + $propertiesSave['property_id'] = $properties->property_id; + $properties = $model->store_pro($propertiesSave); + } + } + + if (!empty($property[$p]['mainImage'])) + { + $propertiesSave['property_image'] = $model->copy_image_from_path($property[$p]['mainImage'], 'product_attributes', $properties->property_id); + $propertiesSave['property_id'] = $properties->property_id; + $properties = $model->store_pro($propertiesSave); + } + + $subProperties = array_merge(array(), $property[$p]['subproperty']); + $subPropertyTitle = $property[$p]['subproperty']['title']; + $subpropertyImage = array_keys($property[$p]['subproperty']); + unset($subpropertyImage[0]); + $tmpimagename = array_merge(array(), $subpropertyImage); + + for ($sp = 0; $sp < count($subProperties) - 1; $sp++) + { + $subPropertiesSave['subattribute_color_id'] = $subProperties[$sp]['subproperty_id']; + $subPropertiesSave['subattribute_color_name'] = $subProperties[$sp]['name']; + $subPropertiesSave['subattribute_color_title'] = $subPropertyTitle; + $subPropertiesSave['subattribute_color_price'] = $subProperties[$sp]['price']; + $subPropertiesSave['oprand'] = $subProperties[$sp]['oprand']; + $subPropertiesSave['subattribute_color_image'] = $subProperties[$sp]['image']; + $subPropertiesSave['subattribute_id'] = $properties->property_id; + $subPropertiesSave['ordering'] = $subProperties[$sp]['order']; + $subPropertiesSave['subattribute_color_number'] = $subProperties[$sp]['number']; + $subPropertiesSave['setdefault_selected'] = ($subProperties[$sp]['chk_propdselected'] == 'on' + || $subProperties[$sp]['chk_propdselected'] == '1') ? '1' : '0'; + $subPropertiesSave['subattribute_published'] = ($subProperties[$sp]['published'] == 'on' + || $subProperties[$sp]['published'] == '1') ? '1' : '0'; + $subPropertiesSave['extra_field'] = $subProperties[$sp]['extra_field']; + $subproperty_array = $model->store_sub($subPropertiesSave); + $subproperty_image = $files['attribute_' . $a . '_property_' . $p . '_subproperty_' . $tmpimagename[$sp] . '_image']; + + if (empty($subProperties[$sp]['mainImage'])) + { + if (!empty($subproperty_image['name'])) + { + $subPropertiesSave['subattribute_color_image'] = $model->copy_image($subproperty_image, 'subcolor', $subproperty_array->subattribute_color_id); + $subPropertiesSave['subattribute_color_id'] = $subproperty_array->subattribute_color_id; + $subproperty_array = $model->store_sub($subPropertiesSave); + } + } + + if (!empty($subProperties[$sp]['mainImage'])) + { + $subPropertiesSave['subattribute_color_image'] = $model->copy_image_from_path( + $subProperties[$sp]['mainImage'], + 'subcolor', $subproperty_array->subattribute_color_id + ); + + $subPropertiesSave['subattribute_color_id'] = $subproperty_array->subattribute_color_id; + + $model->store_sub($subPropertiesSave); + } + } + } + } + + return; + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelAttribute_set_detail $model */ + $model = $this->getModel('attribute_set_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ATTRIBUTE_SET_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=attribute_set', $msg); + } + + public function cancel() + { + + $msg = JText::_('COM_REDSHOP_ATTRIBUTE_SET_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=attribute_set', $msg); + } + + public function _imageResize($width, $height, $target) + { + if ($width > $height) + { + $percentage = ($target / $width); + } + else + { + $percentage = ($target / $height); + } + + $width = round($width * $percentage); + $height = round($height * $percentage); + + if ($width < 5) + { + $width = 50; + } + + if ($height < 5) + { + $height = 50; + } + + return array($width, $height); + } + + public function property_more_img() + { + $uri = JURI::getInstance(); + + $url = $uri->root(); + + $post = $this->input->post->getArray(); + + $main_img = (array) $this->input->files->get('property_main_img', array(), 'array'); + $sub_img = (array) $this->input->files->get('property_sub_img', array(), 'array'); + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + $filetype = strtolower(JFile::getExt($main_img['name'])); + + $filetype_sub = strtolower(JFile::getExt($sub_img['name'][0])); + + if ($filetype != 'png' && $filetype != 'gif' && $filetype != 'jpeg' && $filetype != 'jpg' && $main_img['name'] != '' + && $filetype_sub != 'png' && $filetype_sub != 'gif' && $filetype_sub != 'jpeg' + && $filetype_sub != 'jpg' && $sub_img['name'][0] != '' + ) + { + $msg = JText::_("COM_REDSHOP_FILE_EXTENTION_WRONG_PROPERTY"); + $link = $url . "administrator/index.php?tmpl=component&option=com_redshop&view=product_detail§ion_id=" . $post['section_id'] + . "&cid=" . $post['cid'] . "&layout=property_images&showbuttons=1"; + $this->setRedirect($link, $msg); + } + else + { + $model->property_more_img($post, $main_img, $sub_img); + ?> + + root(); + + $mediaid = $this->input->get('mediaid'); + $section_id = $this->input->get('section_id'); + $cid = $this->input->get('cid'); + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + if ($model->deletesubimage($mediaid)) + { + $msg = JText::_("COM_REDSHOP_PROPERTY_SUB_IMAGE_IS_DELETE"); + $link = $url . "administrator/index.php?tmpl=component&option=com_redshop&view=product_detail§ion_id=" + . $section_id . "&cid=" . $cid . "&layout=property_images&showbuttons=1"; + $this->setRedirect($link, $msg); + } + } + + public function subattribute_color() + { + $post = $this->input->post->getArray(); + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + $subattr_id = implode("','", $post['subattribute_color_id']); + + $subattr_diff = $model->subattr_diff($subattr_id, $post['section_id']); + + $model->delsubattr_diff($subattr_diff); + + $sub_img = $this->input->files->get('property_sub_img', 'array', 'array'); + + $model->subattribute_color($post, $sub_img); + + ?> + + input->get->getArray(); + + $pid = $get['pid']; + + /** @var RedshopModelAttribute_set_detail $model */ + $model = $this->getModel('attribute_set_detail'); + + if ($model->removepropertyImage($pid)) + { + echo "sucess"; + } + + JFactory::getApplication()->close(); + } + + public function removesubpropertyImage() + { + $get = $this->input->get->getArray(); + + $pid = $get['pid']; + + /** @var RedshopModelAttribute_set_detail $model */ + $model = $this->getModel('attribute_set_detail'); + + if ($model->removesubpropertyImage($pid)) + { + echo "sucess"; + } + + JFactory::getApplication()->close(); + } + + public function saveAttributeStock() + { + $post = $this->input->post->getArray(); + + /** @var RedshopModelAttribute_set_detail $model */ + $model = $this->getModel('attribute_set_detail'); + + if ($model->SaveAttributeStockroom($post)) + { + $msg = JText::_('COM_REDSHOP_STOCKROOM_ATTRIBUTE_XREF_SAVE'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_STOCKROOM_ATTRIBUTE_XREF'); + } + + $link = "index.php?tmpl=component&option=com_redshop&view=product_detail§ion_id=" + . $post['section_id'] . "&cid=" . $post['cid'] . "&layout=productstockroom&property=" . $post['section']; + + $this->setRedirect($link, $msg); + } + + public function copy() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + /** @var RedshopModelAttribute_set_detail $model */ + $model = $this->getModel('attribute_set_detail'); + + if ($model->copy($cid)) + { + $msg = JText::_('COM_REDSHOP_ATTRIBUTE_SET_COPIED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_COPY_ATTRIBUTE_SET'); + } + + $this->setRedirect('index.php?option=com_redshop&view=attribute_set', $msg); + } +} diff --git a/component/admin/controllers/attributeprices.php b/component/admin/controllers/attributeprices.php new file mode 100644 index 00000000000..b3252deed97 --- /dev/null +++ b/component/admin/controllers/attributeprices.php @@ -0,0 +1,19 @@ +setRedirect('index.php'); + } +} diff --git a/component/admin/controllers/attributeprices_detail.php b/component/admin/controllers/attributeprices_detail.php new file mode 100644 index 00000000000..b7f8f10cb16 --- /dev/null +++ b/component/admin/controllers/attributeprices_detail.php @@ -0,0 +1,93 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'attributeprices_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function save() + { + $post = $this->input->post->getArray(); + + $section_id = $this->input->get('section_id'); + $section = $this->input->getString('section'); + + $post['product_currency'] = Redshop::getConfig()->get('CURRENCY_CODE'); + $post['cdate'] = time(); + $post['discount_start_date'] = strtotime($post ['discount_start_date']); + + if ($post['discount_end_date']) + { + $post ['discount_end_date'] = strtotime($post['discount_end_date']) + (23 * 59 * 59); + } + + $cid = $this->input->post->get('cid', array(0), 'array'); + $post ['price_id'] = $cid [0]; + + /** @var RedshopModelAttributeprices_detail $model */ + $model = $this->getModel('attributeprices_detail'); + + if ($model->store($post)) + { + $msg = JText::_('COM_REDSHOP_PRICE_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_PRICE_DETAIL'); + } + + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=attributeprices§ion=' . $section . '§ion_id=' . $section_id, $msg); + } + + public function remove() + { + $section_id = $this->input->get('section_id'); + $section = $this->input->getString('section'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelAttributeprices_detail $model */ + $model = $this->getModel('attributeprices_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ATTRIBUTE_PRICE_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=attributeprices§ion=' . $section . '§ion_id=' . $section_id, $msg); + } + + public function cancel() + { + $section_id = $this->input->get('section_id'); + + $msg = JText::_('COM_REDSHOP_PRICE_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=attributeprices§ion_id=' . $section_id, $msg); + } +} diff --git a/component/admin/controllers/attributes.php b/component/admin/controllers/attributes.php new file mode 100644 index 00000000000..eb2393995c9 --- /dev/null +++ b/component/admin/controllers/attributes.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/barcode.php b/component/admin/controllers/barcode.php new file mode 100644 index 00000000000..277ef52c14e --- /dev/null +++ b/component/admin/controllers/barcode.php @@ -0,0 +1,95 @@ +input->post->getArray(); + + if (strlen($post['barcode']) != 13) + { + $msg = 'Invalid Barcode'; + JFactory::getApplication()->enqueueMessage($msg, 'error'); + parent::display(); + } + else + { + /** @var RedshopModelBarcode $model */ + $model = $this->getModel('barcode'); + $barcode = $post['barcode']; + $barcode = substr($barcode, 0, 12); + + $user = JFactory::getUser(); + $uid = $user->get('id'); + $row = $model->checkorder($barcode); + + if ($row) + { + $post['search_date'] = date("y-m-d H:i:s"); + $post['user_id'] = $uid; + $post['order_id'] = $row->order_id; + + if ($model->save($post)) + { + $msg = JText::_('COM_REDSHOP_THANKS_FOR_YOUR_REVIEWS'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_PLEASE_TRY_AGAIN'); + } + + $this->setRedirect('index.php?option=com_redshop&view=barcode&order_id=' . $row->order_id, $msg); + } + else + { + $msg = 'Invalid Barcode'; + JFactory::getApplication()->enqueueMessage($msg, 'error'); + parent::display(); + } + } + } + + public function changestatus() + { + $post = $this->input->post->getArray(); + + if (strlen($post['barcode']) != 13) + { + $msg = 'Invalid Barcode'; + JFactory::getApplication()->enqueueMessage($msg, 'error'); + $this->setRedirect('index.php?option=com_redshop&view=barcode&layout=barcode_order'); + } + + else + { + /** @var RedshopModelBarcode $model */ + $model = $this->getModel('barcode'); + $barcode = $post['barcode']; + $barcode = substr($barcode, 0, 12); + + $row = $model->checkorder($barcode); + + if ($row) + { + $model->updateorderstatus($barcode, $row->order_id); + $this->setRedirect('index.php?option=com_redshop&view=barcode&layout=barcode_order', JText::_('ORDER_STATUS_CHANGED_TO_SHIPPED')); + } + else + { + $msg = 'Invalid Barcode'; + JFactory::getApplication()->enqueueMessage($msg, 'error'); + $this->setRedirect('index.php?option=com_redshop&view=barcode&layout=barcode_order'); + } + } + } +} diff --git a/component/admin/controllers/catalog.php b/component/admin/controllers/catalog.php new file mode 100644 index 00000000000..cd64b9916f9 --- /dev/null +++ b/component/admin/controllers/catalog.php @@ -0,0 +1,21 @@ +setRedirect('index.php'); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelCatalog_request $model */ + $model = $this->getModel('catalog_request'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_CATALOG_REQUEST_BLOCK_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=catalog_request', $msg); + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelCatalog_request $model */ + $model = $this->getModel('catalog_request'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_CATALOG_REQUEST_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=catalog_request', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelCatalog_request $model */ + $model = $this->getModel('catalog_request'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_CATALOG_REQUEST_BLOCK_UNBLOCK_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=catalog_request', $msg); + } +} diff --git a/component/admin/controllers/catalogs.php b/component/admin/controllers/catalogs.php new file mode 100644 index 00000000000..16a6b87d79f --- /dev/null +++ b/component/admin/controllers/catalogs.php @@ -0,0 +1,21 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * assign template to multiple categories + * + * @return mixed + * + * @since 2.0.6 + */ + public function assignTemplate() + { + $input = JFactory::getApplication()->input; + $cid = $input->post->get('cid', array(), 'array'); + $filter = $input->post->get('filter', array(), 'array'); + $post = array(); + $post['cid'] = $cid; + $post['category_template'] = $filter['category_template']; + $model = $this->getModel('categories'); + + if ($model->assignTemplate($post)) + { + $msg = JText::_('COM_REDSHOP_TEMPLATE_ASSIGN_SUCESS'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_ASSIGNING_TEMPLATE'); + } + + $this->setRedirect('index.php?option=com_redshop&view=categories', $msg); + } +} + diff --git a/component/admin/controllers/category.php b/component/admin/controllers/category.php new file mode 100644 index 00000000000..095ff7b2e87 --- /dev/null +++ b/component/admin/controllers/category.php @@ -0,0 +1,290 @@ +getModel(); + + /** @var RedshopTableCategory $table */ + $table = $model->getTable(); + + $data = $this->input->post->get('jform', array(), 'array'); + $checkin = property_exists($table, 'checked_out'); + $context = $this->option . '.edit.' . $this->context; + $task = $this->getTask(); + + if (!empty($data["more_template"]) && is_array($data["more_template"])) + { + $data["more_template"] = implode(",", $data["more_template"]); + } + + // Determine the name of the primary key for the data. + if (empty($key)) + { + $key = $table->getKeyName(); + } + + // To avoid data collisions the urlVar may be different from the primary key. + if (empty($urlVar)) + { + $urlVar = $key; + } + + $recordId = $this->input->getInt($urlVar); + + if (!$this->checkEditId($context, $recordId)) + { + // Somehow the person just went to the form and tried to save it. We don't allow that. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $recordId)); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect to the list screen + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + + return false; + } + + // Populate the row id from the session. + $data[$key] = $recordId; + + // The save2copy task needs to be handled slightly differently. + if ($task == 'save2copy') + { + // Check-in the original row. + if ($checkin && $model->checkin($data[$key]) === false) + { + // Check-in failed. Go back to the item and display a notice. + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError())); + $this->setMessage($this->getError(), 'error'); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return false; + } + + // Reset the ID, the multilingual associations and then treat the request as for Apply. + $data[$key] = 0; + $data['associations'] = array(); + $task = 'apply'; + } + + // Access check. + if (!$this->allowSave($data, $key)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED')); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect to the list screen + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + + return false; + } + + // Validate the posted data. + // Sometimes the form needs some posted data, such as for plugins and modules. + $form = $model->getForm($data, false); + + if (!$form) + { + $app->enqueueMessage(/** @scrutinizer ignore-deprecated */ $model->getError(), 'error'); + + return false; + } + + // Test whether the data is valid. + $validData = $model->validate($form, $data); + + // Check for validation errors. + if ($validData === false) + { + // Get the validation messages. + $errors = /** @scrutinizer ignore-deprecated */ $model->getErrors(); + + // Push up to three validation messages out to the user. + for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) + { + if ($errors[$i] instanceof Exception) + { + $app->enqueueMessage($errors[$i]->getMessage(), 'error'); + } + else + { + $app->enqueueMessage($errors[$i], 'error'); + } + } + + // Save the data in the session. + $app->setUserState($context . '.data', $data); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return false; + } + + if (!isset($validData['tags'])) + { + $validData['tags'] = null; + } + + // Attempt to save the data. + if (!$model->/** @scrutinizer ignore-call */ saveCategory($validData)) + { + // Save the data in the session. + $app->setUserState($context . '.data', $validData); + + // Redirect back to the edit screen. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError())); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return false; + } + + // Save succeeded, so check-in the record. + if ($checkin && $model->checkin($validData[$key]) === false) + { + // Save the data in the session. + $app->setUserState($context . '.data', $validData); + + // Check-in failed, so go back to the record and display a notice. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError())); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return false; + } + + $this->setMessage( + JText::_( + ($lang->hasKey($this->text_prefix . ($recordId == 0 && $app->isSite() ? '_SUBMIT' : '') . '_SAVE_SUCCESS') + ? $this->text_prefix + : 'JLIB_APPLICATION') . ($recordId == 0 && $app->isSite() ? '_SUBMIT' : '') . '_SAVE_SUCCESS' + ) + ); + + // Redirect the user and adjust session state based on the chosen task. + switch ($task) + { + case 'apply': + // Set the record data in the session. + $recordId = $model->getState($this->context . '.id'); + $this->holdEditId($context, $recordId); + $app->setUserState($context . '.data', null); + $model->checkout($recordId); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + break; + + case 'save2new': + // Clear the record id and data from the session. + $this->releaseEditId($context, $recordId); + $app->setUserState($context . '.data', null); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend(null, $urlVar)) + ); + break; + + default: + // Clear the record id and data from the session. + $this->releaseEditId($context, $recordId); + $app->setUserState($context . '.data', null); + + // Set redirect + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + break; + } + + // Invoke the postSave method to allow for the child class to access the model. + $this->postSaveHook($model, $validData); + + return true; + } + + /** + * Method to copy record. + * + * @return void + * + * @throws Exception + */ + public function copy() + { + $input = JFactory::getApplication()->input; + $cid = $input->post->get('cid', array(), 'array'); + + /** @var RedshopModelCategory $model */ + $model = $this->getModel(); + + if ($model->copy($cid)) + { + $msg = JText::_('COM_REDSHOP_CATEGORY_COPIED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_COPING_CATEGORY'); + } + + $this->setRedirect('index.php?option=com_redshop&view=categories', $msg); + } +} diff --git a/component/admin/controllers/configuration.php b/component/admin/controllers/configuration.php new file mode 100644 index 00000000000..6e9f27e3173 --- /dev/null +++ b/component/admin/controllers/configuration.php @@ -0,0 +1,292 @@ +save(1); + } + + /** + * Collect Items from array using specific prefix + * + * @param array $array Array from which needs to collects items based ok keys. + * @param string $prefix Key prefix which needs to be filtered. + * + * @return array Array of values which is collected using prefix. + */ + protected function collectItemsUsingPrefix($array, $prefix) + { + $keys = array_keys($array); + + $values = array_filter( + $keys, + function ($value) use ($prefix) + { + return preg_match("/$prefix\d/", $value); + } + ); + + array_walk( + $values, + function (&$value) use ($array) + { + $value = $array[$value]; + }, + $array + ); + + return $values; + } + + /** + * Method for save configuration + * + * @param integer $apply Apply or not + * + * @return void + * + * @since 1.5 + */ + public function save($apply = 0) + { + JFactory::getApplication()->setUserState('com_redshop.configuration.selectedTabPosition', $this->input->get('selectedTabPosition')); + + $post = $this->input->post->getArray(); + + $post['custom_previous_link'] = $this->input->post->get('custom_previous_link', '', 'raw'); + $post['custom_next_link'] = $this->input->post->get('custom_next_link', '', 'raw'); + $post['default_next_suffix'] = $this->input->post->get('default_next_suffix', '', 'raw'); + $post['default_previous_prefix'] = $this->input->post->get('default_previous_prefix', '', 'raw'); + $post['return_to_category_prefix'] = $this->input->post->get('return_to_category_prefix', '', 'raw'); + + // Administrator email notifications ids + if (is_array($post['administrator_email'])) + { + $post['administrator_email'] = trim(implode(",", $post['administrator_email'])); + } + + // Only check if this email is filled + if (!empty($post['administrator_email'])) + { + $post['administrator_email'] = trim($post['administrator_email']); + $emails = explode(',', $post['administrator_email']); + + if (!empty($emails)) + { + foreach ($emails as $email) + { + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) + { + $msg = JText::_('COM_REDSHOP_INVALID_EMAIL'); + $this->setRedirect('index.php?option=com_redshop&view=configuration', $msg, 'error'); + + return; + } + } + } + } + + $msg = null; + /** @var RedshopModelConfiguration $model */ + $model = $this->getModel('Configuration'); + $newsletterTestEmail = $this->input->get('newsletter_test_email', '', 'RAW'); + + // Only check if this email is filled + if (!empty($newsletterTestEmail)) + { + if (!filter_var($newsletterTestEmail, FILTER_VALIDATE_EMAIL)) + { + $msg = JText::_('COM_REDSHOP_INVALID_EMAIL'); + $this->setRedirect('index.php?option=com_redshop&view=configuration', $msg, 'error'); + + return; + } + } + + $post['country_list'] = implode(',', $this->input->post->get('country_list', array(), 'ARRAY')); + + if (!isset($post['seo_page_short_description'])) + { + $post['seo_page_short_description'] = 0; + } + + if (!isset($post['seo_page_short_description_category'])) + { + $post['seo_page_short_description_category'] = 0; + } + + if (!isset($post['allow_multiple_discount'])) + { + $post['allow_multiple_discount'] = 0; + } + + $post['menuhide'] = implode(',', $this->input->post->get('menuhide', array(), 'ARRAY')); + + if (isset($post['product_download_root']) && !is_dir($post['product_download_root'])) + { + $msg = ""; + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_PRODUCT_DOWNLOAD_DIRECTORY_DOES_NO_EXIST'), 'error'); + } + elseif ($model->store($post)) + { + $msg = JText::_('COM_REDSHOP_CONFIG_SAVED'); + + if ($newsletterTestEmail) + { + $model->newsletterEntry($post); + $msg = JText::sprintf('COM_REDSHOP_NEWSLETTER_SEND_TO_TEST_EMAIL', $newsletterTestEmail); + } + + // Thumb folder deleted and created + if ($post['image_quality_output'] != Redshop::getConfig()->get('IMAGE_QUALITY_OUTPUT') + || $post['use_image_size_swapping'] != Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ) + { + $this->removeThumbImages(); + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_IN_CONFIG_SAVE'); + } + + $redirect = $apply ? 'index.php?option=com_redshop&view=configuration' : 'index.php?option=com_redshop'; + + $this->setRedirect($redirect, $msg); + } + + /** + * Remove all thumbnail images generated by redSHOP + * + * @return boolean + */ + public function removeThumbImages() + { + $thumbFolders = array('product', 'category', 'manufacturer', 'product_attributes', 'property', 'subcolor', 'wrapper', 'shopperlogo'); + + foreach ($thumbFolders as $thumbFolder) + { + $unlinkPath = REDSHOP_FRONT_IMAGES_RELPATH . $thumbFolder . '/thumb'; + + if (!JFolder::exists($unlinkPath) || !JFolder::delete($unlinkPath) || !JFolder::create($unlinkPath)) + { + continue; + } + + JFile::copy(REDSHOP_FRONT_IMAGES_RELPATH . 'index.html', $unlinkPath . '/index.html'); + } + + return true; + } + + /** + * Remove images + * + * @return void + */ + public function removeimg() + { + ob_clean(); + + $imgName = $this->input->getString('imname', ''); + $path = $this->input->getString('spath', ''); + $dataId = $this->input->getInt('data_id', 0); + + if ($dataId) + { + RedshopHelperExtrafields::deleteExtraFieldData($dataId); + } + + if (JFile::exists(JPATH_ROOT . '/' . $path . '/' . $imgName)) + { + JFile::delete(JPATH_ROOT . '/' . $path . '/' . $imgName); + } + + JFactory::getApplication()->close(); + } + + /** + * Cancel + * + * @return void + */ + public function cancel() + { + $this->setRedirect('index.php?option=com_redshop'); + } + + /** + * Reset template + * + * @return void + * + * @throws Exception + */ + public function resetTemplate() + { + /** @var RedshopModelConfiguration $model */ + $model = $this->getModel('Configuration'); + + $app = JFactory::getApplication(); + + try + { + $model->resetTemplate(); + $app->enqueueMessage(JText::_('COM_REDSHOP_TEMPLATE_HAS_BEEN_RESET'), 'success'); + } + catch (Exception $exception) + { + $app->enqueueMessage($exception->getMessage(), 'error'); + } + + $this->setRedirect('index.php?option=com_redshop'); + } + + /** + * Reset Term & Condition + * + * @return void + */ + public function resetTermsCondition() + { + RedshopHelperUser::updateUserTermsCondition(); + + JFactory::getApplication()->close(); + } + + /** + * Reset Order ID + * + * @return void + */ + public function resetOrderId() + { + RedshopHelperOrder::resetOrderId(); + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/countries.php b/component/admin/controllers/countries.php new file mode 100644 index 00000000000..f5d853c28ab --- /dev/null +++ b/component/admin/controllers/countries.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/country.php b/component/admin/controllers/country.php new file mode 100644 index 00000000000..d18070dc950 --- /dev/null +++ b/component/admin/controllers/country.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/coupon.php b/component/admin/controllers/coupon.php new file mode 100644 index 00000000000..f14837bd52b --- /dev/null +++ b/component/admin/controllers/coupon.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/coupons.php b/component/admin/controllers/coupons.php new file mode 100644 index 00000000000..4f99e692539 --- /dev/null +++ b/component/admin/controllers/coupons.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/currencies.php b/component/admin/controllers/currencies.php new file mode 100644 index 00000000000..a88efee3749 --- /dev/null +++ b/component/admin/controllers/currencies.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/currency.php b/component/admin/controllers/currency.php new file mode 100644 index 00000000000..8f0fcace793 --- /dev/null +++ b/component/admin/controllers/currency.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/discount.php b/component/admin/controllers/discount.php new file mode 100644 index 00000000000..6cab44e12a5 --- /dev/null +++ b/component/admin/controllers/discount.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/discount_product.php b/component/admin/controllers/discount_product.php new file mode 100644 index 00000000000..c3d0ca2f2c0 --- /dev/null +++ b/component/admin/controllers/discount_product.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/discount_products.php b/component/admin/controllers/discount_products.php new file mode 100644 index 00000000000..438a8f98b1b --- /dev/null +++ b/component/admin/controllers/discount_products.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/discounts.php b/component/admin/controllers/discounts.php new file mode 100644 index 00000000000..819e493682f --- /dev/null +++ b/component/admin/controllers/discounts.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/export.php b/component/admin/controllers/export.php new file mode 100644 index 00000000000..1ce50bcdbe2 --- /dev/null +++ b/component/admin/controllers/export.php @@ -0,0 +1,21 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Method for get all exist field name + * + * @return void + * @throws Exception + * + * @since 2.0.6 + */ + public function ajaxGetAllFieldName() + { + \Redshop\Helper\Ajax::validateAjaxRequest(); + + $app = JFactory::getApplication(); + $model = $this->getModel('Field'); + + echo implode(',', $model->getExistFieldNames($app->input->getInt('field_id', 0))); + + $app->close(); + } +} diff --git a/component/admin/controllers/field_group.php b/component/admin/controllers/field_group.php new file mode 100644 index 00000000000..ccb1d29a785 --- /dev/null +++ b/component/admin/controllers/field_group.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/field_groups.php b/component/admin/controllers/field_groups.php new file mode 100644 index 00000000000..711319abf1a --- /dev/null +++ b/component/admin/controllers/field_groups.php @@ -0,0 +1,76 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Method for get prepared HTML of fields group + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function ajaxGetFieldsGroup() + { + Redshop\Helper\Ajax::validateAjaxRequest(); + + $section = $this->input->getInt('section', 0); + $selected = $this->input->getInt('selected', 0); + + /** @var RedshopModelField_Groups $model */ + $model = $this->getModel('Field_Groups'); + $model->setState('list.limit', 99); + $model->setState('filter.section', $section); + + $fieldGroups = $model->getItems(); + + $options = array(''); + + if (!empty($fieldGroups)) + { + foreach ($fieldGroups as $fieldGroup) + { + $checked = $fieldGroup->id == $selected ? 'selected="selected"' : ''; + $options[] = ''; + } + } + + echo implode("\n", $options); + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/fields.php b/component/admin/controllers/fields.php new file mode 100644 index 00000000000..14a8f1d4e2b --- /dev/null +++ b/component/admin/controllers/fields.php @@ -0,0 +1,77 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Method for mass assign group to multiple fields + * + * @return void + * @throws Exception + */ + public function massAssignGroup() + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $app = JFactory::getApplication(); + + // Get items to remove from the request. + $cid = $app->input->get('cid', array(), 'array'); + $groupId = $app->input->getInt('field_assign_group', 0); + + if (!is_array($cid) || count($cid) < 1) + { + JLog::add(JText::_($this->text_prefix . '_NO_ITEM_SELECTED'), JLog::WARNING, 'jerror'); + } + else + { + /** @var RedshopModelField $model */ + $model = $this->getModel(); + + if (!$model->massAssignGroup($cid, $groupId)) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_FIELDS_ERROR_MASS_ASSIGN_GROUP'), 'error'); + } + else + { + $app->enqueueMessage(JText::_('COM_REDSHOP_FIELDS_SUCCESS_MASS_ASSIGN_GROUP')); + } + } + + // Set redirect + $this->setRedirect($this->getRedirectToListRoute()); + } +} diff --git a/component/admin/controllers/giftcard.php b/component/admin/controllers/giftcard.php new file mode 100644 index 00000000000..d51051b5295 --- /dev/null +++ b/component/admin/controllers/giftcard.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/giftcards.php b/component/admin/controllers/giftcards.php new file mode 100644 index 00000000000..bd32d1fe113 --- /dev/null +++ b/component/admin/controllers/giftcards.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/import.php b/component/admin/controllers/import.php new file mode 100644 index 00000000000..eea08844185 --- /dev/null +++ b/component/admin/controllers/import.php @@ -0,0 +1,59 @@ + 1, 'msg' => JText::_('COM_REDSHOP_IMPORT_MESSAGE_UPLOAD_FILE_SUCCESS')); + $plugin = $this->input->getCmd('plugin_name', ''); + $file = $this->input->files->get('csv_file', null); + $data = $this->input->post->getArray(); + + + JPluginHelper::importPlugin('redshop_import'); + $result = RedshopHelperUtility::getDispatcher()->trigger('onUploadFile', array($plugin, $file, $data)); + + if (in_array(false, $result, false)) + { + $response['status'] = 0; + $response['msg'] = JText::_('COM_REDSHOP_IMPORT_ERROR_UPLOAD_FILE'); + } + else + { + $response['folder'] = $result[0]['folder']; + $response['lines'] = $result[0]['lines']; + } + + echo json_encode($response); + + JFactory::getApplication()->close(); + } +} + + diff --git a/component/admin/controllers/import_vm.php b/component/admin/controllers/import_vm.php new file mode 100644 index 00000000000..86aed8c1eae --- /dev/null +++ b/component/admin/controllers/import_vm.php @@ -0,0 +1,158 @@ +sync('syncCategory'); + } + + /** + * Sync manufacturer + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function syncManufacturer() + { + $this->sync('syncManufacturer'); + } + + /** + * Sync shopper group + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function syncShopperGroup() + { + $this->sync('syncShopperGroup'); + } + + /** + * Sync user + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function syncUser() + { + $this->sync('syncUser'); + } + + /** + * Sync order status + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function syncOrderStatus() + { + $this->sync('syncOrderStatus'); + } + + /** + * Sync product + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function syncProduct() + { + $this->sync('syncProduct'); + } + + /** + * Sync order + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function syncOrder() + { + $this->sync('syncOrder'); + } + + /** + * Base method for sync data + * + * @param string $method Method of model for execute the sync + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + private function sync($method = '') + { + Redshop\Helper\Ajax::validateAjaxRequest(); + + $app = JFactory::getApplication(); + + /** @var \RedshopModelImport_Vm $model */ + $model = $this->getModel('Import_Vm'); + + $index = $this->input->getInt('index'); + + // Check method exist. + if (!method_exists($model, $method)) + { + $app->setHeader('status', 500); + echo JText::sprintf('COM_REDSHOP_IMPORT_VM_ERROR_METHOD_NOT_EXIST', $method); + $app->sendHeaders(); + } + + // Start sync process + if (!$model->$method($index)) + { + $app->setHeader('status', 500); + echo json_encode(array('name' => $model->getState($this->logName), 'msg' => /** @scrutinizer ignore-deprecated */ $model->getError())); + $app->sendHeaders(); + } + + echo json_encode(array('name' => (string) $model->getState($this->logName), 'msg' => '')); + + $app->close(); + } +} diff --git a/component/admin/controllers/index.html b/component/admin/controllers/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/controllers/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/controllers/install.php b/component/admin/controllers/install.php new file mode 100644 index 00000000000..63619d07491 --- /dev/null +++ b/component/admin/controllers/install.php @@ -0,0 +1,155 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Method for run ajax process. + * + * @return void + * + * @since 2.0.6 + */ + public function ajaxProcess() + { + \Redshop\Helper\Ajax::validateAjaxRequest(); + $app = JFactory::getApplication(); + + $remainingTasks = RedshopInstall::getRemainingTasks(); + + if (empty($remainingTasks)) + { + $app->sendHeaders(); + echo json_encode((object) array('msg' => JText::_('COM_REDSHOP_INSTALL_STEP_SUCCESS'), 'continue' => 0)); + $app->close(); + } + + $return = array('msg' => '', 'continue' => 0); + $currentTask = array_shift($remainingTasks); + + // Check process param + if (empty($currentTask) || !isset($currentTask['func'])) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + $return['msg'] = JText::_('COM_REDSHOP_INSTALL_ERROR_MISSING_PROCESS'); + echo json_encode((object) $return); + $app->close(); + } + + $process = $currentTask['func']; + $isStatic = false; + $className = ''; + $method = ''; + + // Static call + if (false !== strpos($process, '::')) + { + $process = explode('::', $process); + $className = $process[0]; + $method = $process[1]; + $isStatic = true; + } + elseif (false !== strpos($process, '.')) + { + $process = explode('.', $process); + $className = $process[0]; + $method = $process[1]; + } + + // Load class if path has been provided + if (isset($currentTask['path'])) + { + require_once $currentTask['path']; + } + + // Check class exist. + if (!class_exists($className)) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + $return['msg'] = JText::sprintf('COM_REDSHOP_INSTALL_ERROR_MISSING_CLASS', $className); + echo json_encode((object) $return); + $app->close(); + } + + // Check method exist in class + if (!method_exists($className, $method)) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + $return['msg'] = JText::sprintf('COM_REDSHOP_INSTALL_ERROR_MISSING_METHOD_IN_CLASS', $className, $method); + echo json_encode((object) $return); + $app->close(); + } + + try + { + if ($isStatic) + { + call_user_func(array($className, $method)); + } + else + { + $class = new $className; + call_user_func(array($class, $method)); + } + } + catch (Exception $error) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + $return['msg'] = $error->getMessage(); + echo json_encode((object) $return); + $app->close(); + } + + if (empty($remainingTasks)) + { + $app->setUserState(RedshopInstall::REDSHOP_INSTALL_STATE_NAME, null); + } + else + { + $app->setUserState(RedshopInstall::REDSHOP_INSTALL_STATE_NAME, $remainingTasks); + $return['continue'] = 1; + } + + $app->sendHeaders(); + $return['msg'] = JText::_('COM_REDSHOP_INSTALL_STEP_SUCCESS'); + echo json_encode((object) $return); + $app->close(); + } +} diff --git a/component/admin/controllers/mail.php b/component/admin/controllers/mail.php new file mode 100644 index 00000000000..6ba3bf52b4c --- /dev/null +++ b/component/admin/controllers/mail.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/mails.php b/component/admin/controllers/mails.php new file mode 100644 index 00000000000..3d69bc3522e --- /dev/null +++ b/component/admin/controllers/mails.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/manufacturer.php b/component/admin/controllers/manufacturer.php new file mode 100644 index 00000000000..e2d98a90de4 --- /dev/null +++ b/component/admin/controllers/manufacturer.php @@ -0,0 +1,21 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/mass_discounts.php b/component/admin/controllers/mass_discounts.php new file mode 100644 index 00000000000..c098878dfbf --- /dev/null +++ b/component/admin/controllers/mass_discounts.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/media.php b/component/admin/controllers/media.php new file mode 100644 index 00000000000..a98f755ac6d --- /dev/null +++ b/component/admin/controllers/media.php @@ -0,0 +1,491 @@ +setRedirect('index.php'); + } + + /** + * @return void + * + * @since 2.0.6 + */ + public function saveAdditionalFiles() + { + $post = $this->input->post->getArray(); + $file = $this->input->files->get('downloadfile', array(), 'array'); + $totalFile = count($file['name']); + + /** @var RedshopModelMedia $model */ + $model = $this->getModel('media'); + + // Default message + $msg = JText::_('COM_REDSHOP_UPLOAD_FAIL'); + + $productDownloadRoot = Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT'); + + if (substr(Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT'), -1) != DIRECTORY_SEPARATOR) + { + $productDownloadRoot = Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT') . '/'; + } + + if ($post['hdn_download_file'] != "") + { + $downloadPath = $productDownloadRoot . $post['hdn_download_file_path']; + $post['name'] = $post['hdn_download_file']; + + if ($post['hdn_download_file_path'] != $downloadPath) + { + $post['name'] = RedshopHelperMedia::cleanFileName($post['hdn_download_file']); + copy($downloadPath, $post['name']); + } + + if ($model->store($post)) + { + $msg = JText::_('COM_REDSHOP_UPLOAD_COMPLETE'); + } + else + { + $msg = JText::_('COM_REDSHOP_UPLOAD_FAIL'); + } + } + + for ($i = 0; $i < $totalFile; $i++) + { + $errors = $file['error'][$i]; + + if (!$errors) + { + $filename = RedshopHelperMedia::cleanFileName($file['name'][$i]); + $fileExt = JFile::getExt($filename); + + if ($fileExt) + { + $src = $file['tmp_name'][$i]; + $dest = $productDownloadRoot . $filename; + $fileUpload = JFile::upload($src, $dest); + + if ($fileUpload != 1) + { + $msg = JText::_('COM_REDSHOP_PLEASE_CHECK_DIRECTORY_PERMISSION'); + JFactory::getApplication()->enqueueMessage($msg, 'error'); + } + else + { + $post['name'] = $dest; + + if ($model->store($post)) + { + $msg = JText::_('COM_REDSHOP_UPLOAD_COMPLETE'); + } + else + { + $msg = JText::_('COM_REDSHOP_UPLOAD_FAIL'); + } + } + } + } + } + + $this->setRedirect( + 'index.php?tmpl=component&option=com_redshop&view=media&layout=additionalfile&media_id=' + . $post['media_id'] . '&showbuttons=1', $msg + ); + } + + public function deleteAddtionalFiles() + { + $media_id = $this->input->getInt('media_id'); + $fileId = $this->input->getInt('fileId'); + + /** @var RedshopModelMedia $model */ + $model = $this->getModel('media'); + + if ($model->deleteAddtionalFiles($fileId)) + { + $msg = JText::_('COM_REDSHOP_FILE_DELETED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_FILE_DELETING'); + } + + $this->setRedirect( + 'index.php?tmpl=component&option=com_redshop&view=media&layout=additionalfile&media_id=' . $media_id + . '&showbuttons=1', $msg + ); + } + + public function saveorder() + { + $sectionId = $this->input->getInt('section_id'); + $sectionName = $this->input->get('section_name'); + $mediaSection = $this->input->get('media_section'); + $cid = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + + $cid = ArrayHelper::toInteger($cid); + $order = ArrayHelper::toInteger($order); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_ORDERING')); + } + + /** @var RedshopModelMedia $model */ + $model = $this->getModel('media'); + + if (!$model->saveorder($cid, $order)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + + if (isset($sectionId)) + { + $this->setRedirect( + 'index.php?tmpl=component&option=com_redshop&view=media§ion_id=' . $sectionId + . '&showbuttons=1§ion_name=' . $sectionName + . '&media_section=' . $mediaSection, $msg + ); + } + elseif (null !== $this->input->post->get('set', null) && $mediaSection == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + + /** + * Select Media as Default + * + * @return void + */ + public function setDefault() + { + $app = JFactory::getApplication(); + $post = $this->input->post->getArray(); + $section_id = $this->input->get('section_id'); + $media_section = $this->input->get('media_section'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_MAKE_PRIMARY_MEDIA')); + } + + /** @var RedshopModelMedia_detail $model */ + $model = $this->getModel('media_detail'); + + if (isset($cid[0]) && $cid[0] != 0) + { + if (!$model->defaultmedia($cid[0], $section_id, $media_section)) + { + $msg = /** @scrutinizer ignore-deprecated */ $model->getError(); + } + } + + if ($section_id) + { + $this->setRedirect( + 'index.php?tmpl=component&option=com_redshop&view=media§ion_id=' . $section_id + . '&showbuttons=1&media_section=' . $media_section, $msg + ); + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $app->enqueueMessage($msg); + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + + /** + * AJAX upload a file + * + * @return void + */ + public function ajaxUpload() + { + $app = JFactory::getApplication(); + $file = $this->input->files->get('file', array(), 'array'); + $new = $this->input->post->get('new'); + + if (empty($file)) + { + $app->close(); + } + + $filename = RedshopHelperMedia::cleanFileName($file['name']); + + // Image Upload + $src = $file['tmp_name']; + $tempDir = REDSHOP_MEDIA_IMAGE_RELPATH . 'tmp/'; + JFolder::create($tempDir, 0755); + $dest = $tempDir . $filename; + JFile::upload($src, $dest); + + $fileId = ''; + $mediaType = 'images'; + + if ($new) + { + // Create new media + /** @var RedshopModelMedia $model */ + $model = $this->getModel('media'); + + $fileInfor = pathinfo($dest); + + switch ($fileInfor['extension']) + { + case 'zip': + case '7z': + $mediaType = 'archives'; + break; + + case 'pdf': + $mediaType = 'pdfs'; + break; + + case 'docx': + case 'doc': + $mediaType = 'words'; + break; + + case 'xlsx': + case 'xls': + $mediaType = 'excels'; + break; + + case 'pptx': + case 'ppt': + $mediaType = 'powerpoints'; + break; + + case 'mp3': + case 'flac': + $mediaType = 'sounds'; + break; + + case 'mp4': + case 'mkv': + case 'flv': + $mediaType = 'videos'; + break; + + case 'txt': + $mediaType = 'texts'; + break; + + case 'jpeg': + case 'jpg': + case 'png': + case 'gif': + $mediaType = 'images'; + break; + + default: + $mediaType = ''; + break; + } + + $fileId = $model->newFile( + array + ( + 'media_name' => $filename, + 'media_section' => 'tmp', + 'media_type' => $mediaType, + 'media_mimetype' => $file['type'] + ) + ); + } + + $dimension = getimagesize($dest); + + if ($dimension) + { + $dimension = $dimension[0] . ' x ' . $dimension[1]; + } + + echo new JResponseJson( + array( + 'success' => true, + 'file' => array( + 'id' => $fileId, + 'url' => 'media/com_redshop/images/tmp/' . $filename, + 'name' => $filename, + 'size' => RedshopHelperMediaImage::sizeFilter(filesize($dest)), + 'dimension' => $dimension, + 'media' => 'tmp', + 'mime' => substr($mediaType, 0, -1), + 'status' => '' + ) + ) + ); + + $app->close(); + } + + /** + * AJAX delete a file + * + * @return void + * @throws Exception + */ + public function ajaxDelete() + { + $id = $this->input->post->get('id'); + + if (!empty($id)) + { + /** @var RedshopModelMedia $model */ + $model = $this->getModel('media'); + + if ($model->deleteFile($id)) + { + echo new JResponseJson( + array( + 'success' => true + ) + ); + + JFactory::getApplication()->close(); + } + } + + echo new JResponseJson( + array( + 'success' => false + ) + ); + + JFactory::getApplication()->close(); + } + + /** + * Publish Media + * + * @return void + */ + public function publish() + { + $post = $this->input->post->getArray(); + + $section_id = $this->input->get('section_id'); + $media_section = $this->input->get('media_section'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelMedia_detail $model */ + $model = $this->getModel('media_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_PUBLISHED_SUCCESSFULLY'); + + if ($section_id) + { + $this->setRedirect( + 'index.php?tmpl=component&option=com_redshop&view=media§ion_id=' . $section_id + . '&showbuttons=1&media_section=' . $media_section, $msg + ); + } + + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + + /** + * Unpublish Media + * + * @return void + */ + public function unpublish() + { + $post = $this->input->post->getArray(); + + $section_id = $this->input->get('section_id'); + $media_section = $this->input->get('media_section'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelMedia_detail $model */ + $model = $this->getModel('media_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_UNPUBLISHED_SUCCESSFULLY'); + + if ($section_id) + { + $this->setRedirect( + 'index.php?tmpl=component&option=com_redshop&view=media§ion_id=' . $section_id + . '&showbuttons=1&media_section=' . $media_section, $msg + ); + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } +} diff --git a/component/admin/controllers/media_detail.php b/component/admin/controllers/media_detail.php new file mode 100644 index 00000000000..173caa7c34a --- /dev/null +++ b/component/admin/controllers/media_detail.php @@ -0,0 +1,1236 @@ +registerTask('add', 'edit'); + } + + /** + * Edit Media + * + * @return void + */ + public function edit() + { + $this->input->set('view', 'media_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + /** + * Save Media Detail + * + * @return void + */ + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + + // Store current post to user state + $context = "com_redshop.edit.media"; + JFactory::getApplication()->setUserState($context . '.data', json_encode($post)); + + $cid = $this->input->get->get('cid', array(0), 'array'); + + /** @var RedshopModelMedia_detail $model */ + $model = $this->getModel('media_detail'); + + $product_download_root = Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT'); + + if (substr(Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT '), -1) != DIRECTORY_SEPARATOR) + { + $product_download_root = Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT') . '/'; + } + + $bulkfile = $this->input->files->get('bulkfile', null, 'raw'); + $bulkfiletype = strtolower(JFile::getExt($bulkfile['name'])); + $file = $this->input->files->get('file', array(), 'array'); + + if (!empty($bulkfile) && $bulkfile['name'] == null && $file[0]['name'] == null && $post['oldmedia'] != "") + { + if ($post['media_bank_image'] == "") + { + $post ['media_id'] = $cid[0]; + $post['media_name'] = $post['oldmedia']; + + if ($post['media_type'] != $post['oldtype']) + { + $old_path = JPATH_COMPONENT_SITE . '/assets/' . $post['oldtype'] . '/' . $post['media_section'] . '/' . $post['media_name']; + $old_thumb_path = JPATH_COMPONENT_SITE . '/assets/' . $post['oldtype'] + . '/' . $post['media_section'] . '/thumb/' . $post['media_name']; + + $new_path = JPATH_COMPONENT_SITE . '/assets/' . $post['media_type'] + . '/' . $post['media_section'] . '/' . RedshopHelperMedia::cleanFileName($post['media_name']); + + copy($old_path, $new_path); + + JFile::delete($old_path); + JFile::delete($old_thumb_path); + } + + if ($save = $model->store($post)) + { + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + // Set First Image as product Main Imaged + if ($save->media_section == 'product' && $save->media_type == 'images') + { + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg + ); + } + } + + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + else + { + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg + ); + } + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL'); + + if (isset($post['set'])) + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg, 'warning' + ); + } + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + } + else + { + if ($cid [0] != 0) + { + $post['bulk'] = 'no'; + } + + // Media Bank Start + + $image_split = explode('/', $post['media_bank_image']); + + // Make the filename unique + $filename = RedshopHelperMedia::cleanFileName($image_split[count($image_split) - 1]); + + // Download product changes + if ($post['media_type'] == 'download') + { + $post['media_name'] = $product_download_root . str_replace(" ", "_", $filename); + $dest = $post['media_name']; + } + else + { + $post['media_name'] = $filename; + $dest = JPATH_COMPONENT_SITE . '/assets/' . $post['media_type'] . '/' . $post['media_section'] . '/' . $filename; + } + + $row = $model->store($post); + $msg = null; + + // Image Upload + $src = JPATH_ROOT . '/' . $post['media_bank_image']; + copy($src, $dest); + + // Media Bank End + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $row->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg + ); + } + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media_detail&task=edit&cid[]=' . $row->media_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + } + } + elseif ($file[0]['name'] == null && $post['media_bank_image'] == "" && empty($post['hdn_download_file']) && $bulkfile['name'] == null) + { + if ($post['media_id']) + { + $model->store($post); + + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail&task=edit&cid[]=' . $post['media_id'], $msg); + } + else + { + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media'); + } + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL'); + + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg, 'error' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media', $msg, 'error'); + } + } + } + else + { + if ($cid[0] != 0 || $post['media_id'] != 0) + { + $post['bulk'] = 'no'; + } + + // If file selected from download folder... + if (isset($post['hdn_download_file']) && $post['hdn_download_file'] != "") + { + if ($post['media_type'] == 'download') + { + $download_path = $product_download_root . $post['hdn_download_file_path']; + $post['media_name'] = $post['hdn_download_file_path']; + } + else + { + $download_path = "product" . '/' . $post['hdn_download_file']; + $post['media_name'] = $post['hdn_download_file']; + } + + $filenewtype = strtolower(JFile::getExt($post['hdn_download_file'])); + $post['media_mimetype'] = $filenewtype; + + if ($post['hdn_download_file_path'] != $download_path) + { + if ($post['media_type'] == 'download') + { + $post['media_name'] = $post['hdn_download_file_path']; + } + else + { + // Make the filename unique + $filename = RedshopHelperMedia::cleanFileName($post['hdn_download_file']); + + $post['media_name'] = $filename; + + $down_src = JPATH_COMPONENT_SITE . '/assets/' . $post['media_type'] . '/' . $post['hdn_download_file_path']; + + $down_dest = JPATH_COMPONENT_SITE . '/assets/' . $post['media_type'] . '/' . $post['media_section'] . '/' . $post['media_name']; + + copy($down_src, $down_dest); + } + } + + if ($save = $model->store($post)) + { + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg + ); + } + } + // Set First Image as product Main Imaged + elseif ($save->media_section == 'product') + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail', $msg); + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + } + + // Media Bank Start + if ($post['media_bank_image'] != "") + { + $image_split = explode('/', $post['media_bank_image']); + + // Make the filename unique + $filename = RedshopHelperMedia::cleanFileName($image_split[count($image_split) - 1]); + + // Download product changes + if ($post['media_type'] == 'download') + { + $post['media_name'] = $product_download_root . str_replace(" ", "_", $filename); + $dest = $post['media_name']; + } + else + { + $post['media_name'] = $filename; + $dest = JPATH_COMPONENT_SITE . '/assets/' . $post['media_type'] . '/' . $post['media_section'] . '/' . $filename; + } + + $row = $model->store($post); + + // Image Upload + $src = JPATH_ROOT . '/' . $post['media_bank_image']; + copy($src, $dest); + + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg + ); + } + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media_detail&task=edit&cid[]=' . $row->media_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + } + + // Media Bank End + + $directory = self::writableCell('components/com_redshop/assets'); + + if ($directory == 0) + { + $msg = JText::_('COM_REDSHOP_PLEASE_CHECK_DIRECTORY_PERMISSION'); + JFactory::getApplication()->enqueueMessage($msg, 'error'); + } + + // Starting of Bull upload creation + if ($bulkfile['name'] != '') + { + if ($bulkfiletype == "zip" || $bulkfiletype == "gz" || $bulkfiletype == "tar" || $bulkfiletype == "tgz" || $bulkfiletype == "gzip") + { + // Fix the width of the thumb nail images + $src = $bulkfile['tmp_name']; + $dest = JPATH_ROOT . '/components/com_redshop/assets/' . $post['media_type'] . '/' . $post['media_section'] . '/' + . $bulkfile['name']; + $file_upload = JFile::upload($src, $dest, false, true); + + if ($file_upload != 1) + { + $msg = JText::_('COM_REDSHOP_PLEASE_CHECK_DIRECTORY_PERMISSION'); + JFactory::getApplication()->enqueueMessage($msg, 'error'); + } + + $target = 'components/com_redshop/assets/media/extracted/' . $bulkfile['name']; + JArchive::extract($dest, $target); + $name = explode('.', $bulkfile['name']); + $scan = scandir($target); + + for ($i = 2, $in = count($scan); $i < $in; $i++) + { + if (is_dir($target . '/' . $scan[$i])) + { + $newscan = scandir($target . '/' . $scan[$i]); + + for ($j = 2, $jn = count($newscan); $j < $jn; $j++) + { + $filenewtype = strtolower(JFile::getExt($newscan[$j])); + $btsrc = $target . '/' . $scan[$i] . '/' . $newscan[$j]; + $post['media_name'] = RedshopHelperMedia::cleanFileName($newscan[$j]); + $post['media_mimetype'] = $filenewtype; + + if ($post['media_type'] == 'download') + { + $post['media_name'] = $product_download_root . RedshopHelperMedia::cleanFileName($newscan[$j]); + + if ($row = $model->store($post)) + { + $originaldir = $post['media_name']; + copy($btsrc, $originaldir); + JFile::delete($btsrc); + + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] + . '&media_section=' . $post['media_section'], $msg + ); + } + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media_detail&task=edit&cid[]=' . $row->media_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] + . '&media_section=' . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + } + else + { + if ($filenewtype == 'png' || $filenewtype == 'gif' || $filenewtype == 'jpg' || $filenewtype == 'jpeg') + { + if ($row = $model->store($post)) + { + $originaldir = JPATH_ROOT . '/components/com_redshop/assets/' . $row->media_type . '/' + . $row->media_section . '/' . RedshopHelperMedia::cleanFileName($newscan[$j]); + + copy($btsrc, $originaldir); + JFile::delete($btsrc); + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'], $msg + ); + } + } + + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + } + } + } + else + { + $filenewtype = strtolower(JFile::getExt($scan[$i])); + $btsrc = $target . '/' . $scan[$i]; + $post['media_name'] = RedshopHelperMedia::cleanFileName($scan[$i]); + $post['media_mimetype'] = $filenewtype; + + if ($post['media_type'] == 'download') + { + $post['media_name'] = $product_download_root . RedshopHelperMedia::cleanFileName($scan[$i]); + + if ($row = $model->store($post)) + { + $originaldir = $post['media_name']; + copy($btsrc, $originaldir); + JFile::delete($btsrc); + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg + ); + } + } + + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + } + else + { + if ($filenewtype == 'png' || $filenewtype == 'gif' || $filenewtype == 'jpg' || $filenewtype == 'jpeg') + { + if ($row = $model->store($post)) + { + // Set First Image as product Main Imaged + $originaldir = JPATH_ROOT . '/components/com_redshop/assets/' . $row->media_type . '/' + . $row->media_section . '/' . RedshopHelperMedia::cleanFileName($scan[$i]); + + copy($btsrc, $originaldir); + + if (JFile::exists($btsrc)) + { + JFile::delete($btsrc); + } + + if (JFile::exists($target)) + { + JFolder::delete($target . '/' . $name[0]); + JFolder::delete($target); + JFile::delete($dest); + } + + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] + . '&media_section=' . $post['media_section'], $msg + ); + } + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + } + } + } + } + elseif ($bulkfiletype == 'png' || $bulkfiletype == 'gif' || $bulkfiletype == 'jpg' || $bulkfiletype == 'pdf' + || $bulkfiletype != 'mpeg' || $bulkfiletype != 'mp4' || $bulkfiletype != 'avi' || $bulkfiletype != '3gp' + || $bulkfiletype != 'swf' || $bulkfiletype != 'jpeg' + ) + { + $msg = JText::_('COM_REDSHOP_PLEASE_SELECT_NO'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + else + { + $msg = JText::_('COM_REDSHOP_MEDIA_FILE_EXTENSION_WRONG'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + } + + if ($file[0]['name'] != '') + { + $num = count($file); + + for ($i = 0; $i < $num; $i++) + { + $fileType = strtolower(JFile::getExt($file[$i]['name'])); + + if (empty($fileType)) + { + continue; + } + + if (!in_array($fileType, array('png', 'gif', 'jpeg', 'jpg', 'zip', 'mpeg', 'mp4', 'avi', '3gp', 'swf', 'pdf')) + && !in_array($post['media_type'], array('download', 'document', 'video'))) + { + $msg = JText::_('COM_REDSHOP_MEDIA_FILE_EXTENSION_WRONG'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + elseif ($post['media_section'] == '0') + { + $msg = JText::_('COM_REDSHOP_SELECT_MEDIA_SECTION_FIRST'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + elseif ($post['bulk'] != 'yes' && $post['bulk'] != 'no') + { + $msg = JText::_('COM_REDSHOP_PLEASE_SELECT_BULK_OPTION'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + elseif ($post['bulk'] == 'no' && $fileType == 'zip' && $post['media_type'] != 'download') + { + $msg = JText::_('COM_REDSHOP_YOU_HAVE_SELECTED_NO_OPTION'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + else + { + $src = $file[$i]['tmp_name']; + + $file[$i]['name'] = str_replace(" ", "_", $file[$i]['name']); + + // Download product changes + if ($post['media_type'] == 'download') + { + $post['media_name'] = $product_download_root . RedshopHelperMedia::cleanFileName($file[$i]['name']); + $dest = $post['media_name']; + } + else + { + $post['media_name'] = RedshopHelperMedia::cleanFileName($file[$i]['name']); + $dest = JPATH_ROOT . '/components/com_redshop/assets/' . $post['media_type'] . '/' + . $post['media_section'] . '/' . RedshopHelperMedia::cleanFileName($file[$i]['name']); + } + + $post['media_mimetype'] = $file[$i]['type']; + $file_upload = JFile::upload($src, $dest); + + if ($file_upload == 1 && $row = $model->store($post)) + { + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + if (isset($post['set']) && $post['media_section'] != 'manufacturer') + { + if ($apply == 1) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' + . $post['section_name'] . '&media_section=' . $post['media_section'] + . '&cid[]=' . $save->media_id, $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg + ); + } + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media_detail&task=edit&cid[]=' . $row->media_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL'); + + if (isset($post['set'])) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media_detail§ion_id=' + . $post['section_id'] . '&showbuttons=1§ion_name=' . $post['section_name'] . '&media_section=' + . $post['media_section'], $msg, 'warning' + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail', $msg, 'warning'); + } + } + } + } + } + } + + if ($post['media_type'] == 'youtube') + { + $post['media_name'] = $post['youtube_id']; + + $link = 'index.php?option=com_redshop&view=media'; + + if (isset($post['set'])) + { + $link = 'index.php?option=com_redshop&view=media&tmpl=component'; + } + + if ($row = $model->store($post)) + { + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_SAVED'); + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=media_detail&task=edit&cid[]=' . $row->media_id, $msg, 'message'); + } + else + { + $this->setRedirect($link, $msg, 'message'); + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL'); + $this->setRedirect($link, $msg, 'warning'); + } + } + } + + /** + * Remove Media Detail + * + * @return void + */ + public function remove() + { + $post = $this->input->post->getArray(); + + $section_id = $this->input->get('section_id'); + $media_section = $this->input->get('media_section'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelMedia_detail $model */ + $model = $this->getModel('media_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_DELETED_SUCCESSFULLY'); + + if ($section_id) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' + . $section_id . '&showbuttons=1&media_section=' . $media_section, $msg + ); + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + + /** + * Cancel Media Detail + * + * @return void + */ + public function cancel() + { + $msg = JText::_('COM_REDSHOP_MEDIA_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=media', $msg); + } + + /** + * Check Media Folder is Writable? + * + * @param string $folder Folder Name + * @param integer $relative Folder is in relative directory then 1 else 0 + * + * @return integer 1 for writable. 0 for not. + */ + public static function writableCell($folder, $relative = 1) + { + if ($relative) + { + return is_writable("../$folder") ? 1 : 0; + } + else + { + return is_writable("$folder") ? 1 : 0; + } + } + + /** + * Save Media Ordering + * + * @return void + */ + public function saveorder() + { + $post = $this->input->post->getArray(); + + $section_id = $this->input->get('section_id'); + $media_section = $this->input->get('media_section'); + $cid = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + $cid = ArrayHelper::toInteger($cid); + $order = ArrayHelper::toInteger($order); + + if (empty($cid)) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_ORDERING')); + } + + /** @var RedshopModelMedia_detail $model */ + $model = $this->getModel('media_detail'); + + if (!$model->saveorder($cid, $order)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + + if ($section_id) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' . $section_id + . '&showbuttons=1&media_section=' . $media_section, $msg + ); + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + + /** + * Set Ordering to plus one up + * + * @return void + */ + public function orderup() + { + $post = $this->input->post->getArray(); + + $section_id = $this->input->get('section_id'); + $media_section = $this->input->get('media_section'); + $cid = $this->input->get('cid', array(), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_ORDERING')); + } + + /** @var RedshopModelMedia_detail $model */ + $model = $this->getModel('media_detail'); + + if (!$model->orderup()) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + + if ($section_id) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' . $section_id + . '&showbuttons=1&media_section=' . $media_section, $msg + ); + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } + + /** + * Set Ordering Minus one down + * + * @return void + */ + public function orderdown() + { + $post = $this->input->post->getArray(); + + $section_id = $this->input->get('section_id'); + $media_section = $this->input->get('media_section'); + $cid = $this->input->post->get('cid', array(), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_ORDERING')); + } + + /** @var RedshopModelMedia_detail $model */ + $model = $this->getModel('media_detail'); + + if (!$model->orderdown()) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + + if ($section_id) + { + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=media§ion_id=' . $section_id . '&showbuttons=1&media_section=' . $media_section, $msg); + } + elseif (isset($post['set']) && $post['media_section'] == 'manufacturer') + { + $link = 'index.php?option=com_redshop&view=manufacturer'; ?> + setRedirect('index.php?option=com_redshop&view=media', $msg); + } + } +} diff --git a/component/admin/controllers/newsletter.php b/component/admin/controllers/newsletter.php new file mode 100644 index 00000000000..9fa111b591e --- /dev/null +++ b/component/admin/controllers/newsletter.php @@ -0,0 +1,174 @@ +setRedirect('index.php'); + } + + public function send_newsletter_preview() + { + $this->getView('newsletter', 'preview'); + parent::display(); + } + + public function send_newsletter() + { + $session = JFactory::getSession(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + $userid = $this->input->post->get('userid', array(0), 'array'); + $username = $this->input->post->get('username', array(0), 'array'); + + $newsletter_id = $this->input->get('newsletter_id'); + + $tmpcid = array_chunk($cid, Redshop::getConfig()->get('NEWSLETTER_MAIL_CHUNK')); + $tmpuserid = array_chunk($userid, Redshop::getConfig()->get('NEWSLETTER_MAIL_CHUNK')); + $tmpusername = array_chunk($username, Redshop::getConfig()->get('NEWSLETTER_MAIL_CHUNK')); + + $session->set('subscribers', $tmpcid); + $session->set('subscribersuid', $tmpuserid); + $session->set('subscribersuname', $tmpusername); + $session->set('incNo', 1); + + $this->setRedirect('index.php?option=com_redshop&view=newsletter&layout=previewlog&newsletter_id=' . $newsletter_id); + + return; + } + + /** + * @return void + * @throws Exception + */ + public function sendRecursiveNewsletter() + { + $session = JFactory::getSession(); + $newsletterId = $this->input->get('newsletter_id'); + + /** @var RedshopModelNewsletter $model */ + $model = $this->getModel('newsletter'); + + $subscribers = $session->get('subscribers'); + $subscribersuid = $session->get('subscribersuid'); + $subscribersuname = $session->get('subscribersuname'); + $incNo = $session->get('incNo'); + + $cid = array(); + $user_id = array(); + $username = array(); + + if (count($subscribers) > 0) + { + $cid = $subscribers[0]; + unset($subscribers[0]); + $subscribers = array_merge(array(), $subscribers); + } + + if (count($subscribersuid) > 0) + { + $user_id = $subscribersuid[0]; + unset($subscribersuid[0]); + $subscribersuid = array_merge(array(), $subscribersuid); + } + + if (count($subscribersuname) > 0) + { + $username = $subscribersuname[0]; + unset($subscribersuname[0]); + $subscribersuname = array_merge(array(), $subscribersuname); + } + + $retuser = $model->newsletterEntry($cid, $user_id, $username); + + $responcemsg = ""; + + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + $subscriber = $model->getNewsletterSubscriber($newsletterId, $cid[$i]); + $responcemsg .= "
" . $incNo . ": " . $subscriber->name . "( " . $subscriber->email . " ) -> "; + + if ($retuser[$i]) + { + $responcemsg .= "" . JText::_('COM_REDSHOP_NEWSLETTER_SENT_SUCCESSFULLY') . ""; + } + else + { + $responcemsg .= "" . JText::_('COM_REDSHOP_NEWSLETTER_MAIL_NOT_SENT') . ""; + } + + $responcemsg .= "
"; + $incNo++; + } + + $session->set('subscribers', $subscribers); + $session->set('subscribersuid', $subscribersuid); + $session->set('subscribersuname', $subscribersuname); + $session->set('incNo', $incNo); + + if (count($cid) == 0) + { + $session->clear('subscribers'); + $session->clear('subscribersuid'); + $session->clear('subscribersuname'); + $session->clear('incNo'); + } + + $responcemsg = "
" . $responcemsg . "
"; + echo $responcemsg; + + JFactory::getApplication()->close(); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelNewsletter_detail $model */ + $model = $this->getModel('newsletter_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_NEWSLETTER_DETAIL_PUBLISHED_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=newsletter', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelNewsletter_detail $model */ + $model = $this->getModel('newsletter_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_NEWSLETTER_DETAIL_UNPUBLISHED_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=newsletter', $msg); + } +} diff --git a/component/admin/controllers/newsletter_detail.php b/component/admin/controllers/newsletter_detail.php new file mode 100644 index 00000000000..bb80e38fdf7 --- /dev/null +++ b/component/admin/controllers/newsletter_detail.php @@ -0,0 +1,133 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'newsletter_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + $body = $this->input->post->get('body', '', 'raw'); + $post["body"] = $body; + + $cid = $this->input->post->get('cid', array(0), 'array'); + + $post ['newsletter_id'] = $cid [0]; + + /** @var RedshopModelNewsletter_detail $model */ + $model = $this->getModel('newsletter_detail'); + + if ($row = $model->store($post)) + { + $msg = JText::_('COM_REDSHOP_NEWSLETTER_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_NEWSLETTER_DETAIL'); + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=newsletter_detail&task=edit&cid[]=' . $row->newsletter_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=newsletter', $msg); + } + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + $val = 0; + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelNewsletter_detail $model */ + $model = $this->getModel('newsletter_detail'); + + foreach ($cid as $key => $value) + { + if ($value == 1) + { + unset($cid[$key]); + $val = 1; + } + } + + if (!$model->delete($cid)) + { + echo "\n"; + } + + if ($val == 1) + { + $msg = JText::_('COM_REDSHOP_DEFAULT_NEWSLETTER_CAN_NOT_BE_DELETED'); + } + + else + { + $msg = JText::_('COM_REDSHOP_NEWSLETTER_DETAIL_DELETED_SUCCESSFULLY'); + } + + $this->setRedirect('index.php?option=com_redshop&view=newsletter', $msg); + } + + public function cancel() + { + + $msg = JText::_('COM_REDSHOP_NEWSLETTER_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=newsletter', $msg); + } + + public function copy() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + /** @var RedshopModelNewsletter_detail $model */ + $model = $this->getModel('newsletter_detail'); + + if ($model->copy($cid)) + { + $msg = JText::_('COM_REDSHOP_NEWSLETTER_COPIED_WITH_SUBSCRIBER'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_COPYING_NEWSLETTER'); + } + + $this->setRedirect('index.php?option=com_redshop&view=newsletter', $msg); + } +} diff --git a/component/admin/controllers/newslettersubscr.php b/component/admin/controllers/newslettersubscr.php new file mode 100644 index 00000000000..909567d23ad --- /dev/null +++ b/component/admin/controllers/newslettersubscr.php @@ -0,0 +1,62 @@ +setRedirect('index.php'); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelNewslettersubscr_detail $model */ + $model = $this->getModel('newslettersubscr_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_PUBLISHED_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=newslettersubscr', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelNewslettersubscr_detail $model */ + $model = $this->getModel('newslettersubscr_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_UNPUBLISHED_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=newslettersubscr', $msg); + } +} diff --git a/component/admin/controllers/newslettersubscr_detail.php b/component/admin/controllers/newslettersubscr_detail.php new file mode 100644 index 00000000000..a0c9fa46a2b --- /dev/null +++ b/component/admin/controllers/newslettersubscr_detail.php @@ -0,0 +1,119 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'newslettersubscr_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + /** @var RedshopModelNewslettersubscr_detail $model */ + $model = $this->getModel('newslettersubscr_detail'); + + $userlist = $model->getuserlist(); + + // Merging select option in the select box + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->value = 0; + $temps[0]->text = JText::_('COM_REDSHOP_SELECT'); + $userlist = array_merge($temps, $userlist); + + $this->input->set('userlist', $userlist); + + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + $body = $this->input->post->get('body', '', 'raw'); + $post["body"] = $body; + + $cid = $this->input->post->get('cid', array(0), 'array'); + $post ['subscription_id'] = $cid [0]; + + /** @var RedshopModelNewslettersubscr_detail $model */ + $model = $this->getModel('newslettersubscr_detail'); + $userinfo = $model->getUserFromEmail($post['email']); + + if (!empty($userinfo)) + { + $post['email'] = $userinfo->user_email; + $post['user_id'] = $userinfo->user_id; + $post['name'] = $userinfo->firstname . ' ' . $userinfo->lastname; + } + + if (empty($post['name'])) + { + $post['name'] = !empty($post['username']) ? $post['username'] : $post['email']; + } + + if ($row = $model->store($post)) + { + $msg = JText::_('COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_NEWSLETTER_SUBSCR_DETAIL'); + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=newslettersubscr_detail&task=edit&cid[]=' . $row->subscription_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=newslettersubscr', $msg); + } + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelNewslettersubscr_detail $model */ + $model = $this->getModel('newslettersubscr_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=newslettersubscr', $msg); + } + + public function cancel() + { + $msg = JText::_('COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=newslettersubscr', $msg); + } +} diff --git a/component/admin/controllers/opsearch.php b/component/admin/controllers/opsearch.php new file mode 100644 index 00000000000..a575eda9857 --- /dev/null +++ b/component/admin/controllers/opsearch.php @@ -0,0 +1,15 @@ +input->getInt('id', 0); + + if (!$orderId) + { + $this->setMessage(JText::_('COM_REDSHOP_ORDER_DOWNLOAD_ERROR_MISSING_ORDER_ID'), 'error'); + $this->setRedirect('index.php?option=com_redshop&view=order'); + } + + // Check pdf plugins + if (!RedshopHelperPdf::isAvailablePdfPlugins()) + { + $this->setMessage(JText::_('COM_REDSHOP_ERROR_MISSING_PDF_PLUGIN'), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=order')); + } + + RedshopHelperOrder::generateInvoicePdf($orderId, 'I'); + + $app->close(); + } + + public function multiprint_order() + { + $orderIds = $this->input->get('cid'); + + if (empty($orderIds)) + { + $this->setMessage(JText::_('COM_REDSHOP_ORDER_DOWNLOAD_ERROR_MISSING_ORDER_ID'), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=order')); + } + + // Check pdf plugins + if (!RedshopHelperPdf::isAvailablePdfPlugins()) + { + $this->setMessage(JText::_('COM_REDSHOP_ERROR_MISSING_PDF_PLUGIN'), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=order', false)); + } + + $invoicePdf = RedshopHelperPdf::createMultiInvoice($orderIds); + + if (empty($invoicePdf)) + { + $this->setMessage(JText::_('COM_REDSHOP_ERROR_GENERATE_PDF'), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=order', false)); + } + + $invoiceLink = REDSHOP_FRONT_DOCUMENT_ABSPATH . 'invoice/' . $invoicePdf . '.pdf'; + $this->setMessage(JText::sprintf('COM_REDSHOP_ORDER_DOWNLOAD_INVOICE_LINK', $invoiceLink, $invoicePdf . '.pdf')); + + foreach ($orderIds as $orderId) + { + if (file_exists(JPATH_COMPONENT_SITE . "/assets/labels/label_" . $orderId . ".pdf")) + { + $labelLink = JURI::root() . '/components/com_redshop/assets/labels/label_' . $orderId . '.pdf'; + $this->setMessage(JText::sprintf('COM_REDSHOP_ORDER_DOWNLOAD_LABEL', $labelLink, 'label_' . $orderId . '.pdf')); + } + } + + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=order', false)); + } + + public function cancel() + { + $this->setRedirect('index.php?option=com_redshop&view=order'); + } + + public function update_status() + { + RedshopHelperOrder::updateStatus(); + } + + /** + * Update all Order Status using AJAX + * + * @param boolean $isPacsoft If true then Pacsoft lable will be created else not + * + * @return void + */ + public function allstatus($isPacsoft = true) + { + ob_end_clean(); + + $app = JFactory::getApplication(); + + // @todo This needs to be fixed in better way + $postData = $this->input->post->getArray(); + $postData['isPacsoft'] = $isPacsoft; + + $app->setUserState("com_redshop.order.batch.postdata", serialize($postData)); + + $this->setRedirect('index.php?option=com_redshop&view=order&layout=batch'); + + return; + } + + /** + * Update All Order status using AJAX without generating pacsoft label + * + * @return void + */ + public function allStatusExceptPacsoft() + { + $this->allstatus(false); + } + + /** + * Update All Order status AJAX Task + * + * @return html Simply display HTML as AJAX Response + */ + public function updateOrderStatus() + { + // Force disable error reporting to get clean ajax response + error_reporting(0); + + $app = JFactory::getApplication(); + $serialized = $app->getUserState("com_redshop.order.batch.postdata"); + $post = unserialize($serialized); + $orderId = $this->input->getInt('oid', 0); + + // Change Order Status + RedshopHelperOrder::orderStatusUpdate($orderId, $post); + + $response = array( + 'message' => '
  • ' . JText::sprintf('COM_REDSHOP_AJAX_ORDER_UPDATE_SUCCESS', $orderId) . '
  • ' + ); + + // Trigger when order status changed. + JPluginHelper::importPlugin('redshop_product'); + RedshopHelperUtility::getDispatcher()->trigger('onAjaxOrderStatusUpdate', array($orderId, $post, &$response)); + + ob_clean(); + echo json_encode($response); + + $app->close(); + } + + public function bookInvoice() + { + $post = $this->input->post->getArray(); + $bookInvoiceDate = $post ['bookInvoiceDate']; + $order_id = $this->input->getInt('order_id'); + $ecomsg = JText::_('COM_REDSHOP_INVOICE_NOT_BOOKED_IN_ECONOMIC'); + $msgType = 'warning'; + + // Economic Integration start for invoice generate and book current invoice + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + $bookinvoicepdf = RedshopEconomic::bookInvoiceInEconomic($order_id, 0, $bookInvoiceDate); + + if (JFile::exists($bookinvoicepdf)) + { + $ecomsg = JText::_('COM_REDSHOP_SUCCESSFULLY_BOOKED_INVOICE_IN_ECONOMIC'); + $msgType = 'message'; + Redshop\Mail\Invoice::sendEconomicBookInvoiceMail($order_id, $bookinvoicepdf); + } + } + + // End Economic + $this->setRedirect('index.php?option=com_redshop&view=order', $ecomsg, $msgType); + } + + public function createInvoice() + { + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1 && Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT') != 2) + { + $order_id = $this->input->getInt('order_id'); + $paymentInfo = RedshopEntityOrder::getInstance($order_id)->getPayment()->getItem(); + + if ($paymentInfo) + { + $payment_name = $paymentInfo->payment_method_class; + $paymentArr = explode("rs_payment_", $paymentInfo->payment_method_class); + + if (count($paymentArr) > 0) + { + $payment_name = $paymentArr[1]; + } + + $economicdata['economic_payment_method'] = $payment_name; + $economicdata['economic_payment_terms_id'] = $paymentInfo->plugin->params->get('economic_payment_terms_id'); + $economicdata['economic_design_layout'] = $paymentInfo->plugin->params->get('economic_design_layout'); + $economicdata['economic_is_creditcard'] = $paymentInfo->plugin->params->get('is_creditcard'); + } + + RedshopEconomic::createInvoiceInEconomic($order_id, $economicdata); + + if (Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT') == 0) + { + $bookinvoicepdf = RedshopEconomic::bookInvoiceInEconomic($order_id, 1); + + if (JFile::exists($bookinvoicepdf)) + { + $ret = Redshop\Mail\Invoice::sendEconomicBookInvoiceMail($order_id, $bookinvoicepdf); + } + } + } + + $this->setRedirect('index.php?option=com_redshop&view=order'); + } + + public function export_fullorder_data() + { + $extrafile = JPATH_SITE . '/administrator/components/com_redshop/extras/order_export.php'; + + if (file_exists($extrafile)) + { + require_once JPATH_COMPONENT_ADMINISTRATOR . '/extras/order_export.php'; + $orderExport = new orderExport; + $orderExport->createOrderExport(); + JFactory::getApplication()->close(); + } + + $producthelper = productHelper::getInstance(); + + /** @var RedshopModelOrder $model */ + $model = $this->getModel('order'); + + $data = $model->export_data(); + $product_count = array(); + $db = JFactory::getDbo(); + + $where = ""; + + $sql = "SELECT order_id,count(order_item_id) as noproduct FROM `#__redshop_order_item` " . $where . " GROUP BY order_id"; + + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Content-type: text/x-csv"); + header("Content-type: text/csv"); + header("Content-type: application/csv"); + header('Content-Disposition: attachment; filename=Order.csv'); + + $db->setQuery($sql); + $no_products = $db->loadObjectList(); + + for ($i = 0, $in = count($data); $i < $in; $i++) + { + $product_count [] = $no_products [$i]->noproduct; + } + + $no_products = max($product_count); + + ob_clean(); + + echo "Order number, Order status, Order date , Shipping method , Shipping user, Shipping address,"; + echo "Shipping postalcode,Shipping city, Shipping country, Company name, Email ,Billing address,"; + echo "Billing postalcode, Billing city, Billing country,Billing User ,"; + + for ($i = 1; $i <= $no_products; $i++) + { + echo JText::_('COM_REDSHOP_PRODUCT_NAME') . $i . ' ,'; + echo JText::_('COM_REDSHOP_PRODUCT') . ' ' . JText::_('COM_REDSHOP_PRODUCT_PRICE') . $i . ' ,'; + echo JText::_('COM_REDSHOP_PRODUCT_ATTRIBUTE') . $i . ' ,'; + } + + echo "Order Total\n"; + + for ($i = 0, $in = count($data); $i < $in; $i++) + { + $billing_info = RedshopHelperOrder::getOrderBillingUserInfo($data [$i]->order_id); + + $details = Redshop\Shipping\Rate::decrypt($data[$i]->ship_method_id); + + echo $data [$i]->order_id . ","; + echo utf8_decode(RedshopHelperOrder::getOrderStatusTitle($data [$i]->order_status)) . " ,"; + echo date('d-m-Y H:i', $data [$i]->cdate) . " ,"; + + if (empty($details)) + { + echo str_replace(",", " ", $details[1]) . "(" . str_replace(",", " ", $details[2]) . ") ,"; + } + else + { + echo ''; + } + + $shipping_info = RedshopHelperOrder::getOrderShippingUserInfo($data[$i]->order_id); + + echo str_replace(",", " ", $shipping_info->firstname) . " " . str_replace(",", " ", $shipping_info->lastname) . " ,"; + echo str_replace(",", " ", utf8_decode($shipping_info->address)) . " ,"; + echo $shipping_info->zipcode . " ,"; + echo str_replace(",", " ", utf8_decode($shipping_info->city)) . " ,"; + echo $shipping_info->country_code . " ,"; + echo str_replace(",", " ", $shipping_info->company_name) . " ,"; + echo $shipping_info->user_email . " ,"; + + echo str_replace(",", " ", utf8_decode($billing_info->address)) . " ,"; + echo $billing_info->zipcode . " ,"; + echo str_replace(",", " ", utf8_decode($billing_info->city)) . " ,"; + echo $billing_info->country_code . " ,"; + echo str_replace(",", " ", $billing_info->firstname) . " " . str_replace(",", " ", $billing_info->lastname) . " ,"; + + $no_items = RedshopHelperOrder::getOrderItemDetail($data [$i]->order_id); + + for ($it = 0, $countItem = count($no_items); $it < $countItem; $it++) + { + echo str_replace(",", " ", utf8_decode($no_items [$it]->order_item_name)) . " ,"; + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . " " . $no_items [$it]->product_final_price . ","; + + $product_attribute = $producthelper->makeAttributeOrder($no_items [$it]->order_item_id, 0, $no_items [$it]->product_id, 0, 1); + $product_attribute = strip_tags(str_replace(",", " ", $product_attribute->product_attribute)); + + echo trim(utf8_decode($product_attribute)) . " ,"; + } + + $temp = $no_products - count($no_items); + + if ($temp >= 0) + { + echo str_repeat(' ,', $temp * 3); + } + + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . " " . $data [$i]->order_total . "\n"; + } + + exit(); + } + + public function export_data() + { + /** + * new order export for paid customer support + */ + $extrafile = JPATH_SITE . '/administrator/components/com_redshop/extras/order_export.php'; + + if (file_exists($extrafile)) + { + require_once JPATH_COMPONENT_ADMINISTRATOR . '/extras/order_export.php'; + + $orderExport = new orderExport; + $orderExport->createOrderExport(); + JFactory::getApplication()->close(); + } + + $producthelper = productHelper::getInstance(); + $model = $this->getModel('order'); + + $product_count = array(); + $db = JFactory::getDbo(); + + $cid = $this->input->get('cid', array(0), 'array'); + $data = $model->export_data($cid); + $order_id = implode(',', $cid); + $where = ""; + + if ($order_id != 0) + { + $where .= " where order_id IN (" . $order_id . ") "; + } + + $sql = "SELECT order_id,count(order_item_id) as noproduct FROM `#__redshop_order_item` " . $where . " GROUP BY order_id"; + + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Content-type: text/x-csv"); + header("Content-type: text/csv"); + header("Content-type: application/csv"); + header('Content-Disposition: attachment; filename=Order.csv'); + + $db->setQuery($sql); + $no_products = $db->loadObjectList(); + + for ($i = 0, $in = count($data); $i < $in; $i++) + { + $product_count [] = $no_products [$i]->noproduct; + } + + $no_products = max($product_count); + + echo "Order id,Buyer name,Email Id, PhoneNumber,Billing Address ,Billing City,Billing State,Billing Country,BillingPostcode,"; + echo "Shipping Address,Shipping City,Shipping State,Shipping Country,ShippingPostCode,Order Status,Order Date,"; + + for ($i = 1; $i <= $no_products; $i++) + { + echo JText::_('PRODUCT_NAME') . $i . ','; + echo JText::_('PRODUCT') . ' ' . JText::_('PRODUCT_PRICE') . $i . ','; + echo JText::_('PRODUCT_ATTRIBUTE') . $i . ','; + } + + echo "Shipping Cost,Order Total\n"; + + for ($i = 0, $in = count($data); $i < $in; $i++) + { + $shipping_address = RedshopHelperOrder::getOrderShippingUserInfo($data[$i]->order_id); + + echo $data [$i]->order_id . ","; + echo $data [$i]->firstname . " " . $data [$i]->lastname . ","; + echo $data [$i]->user_email . ","; + echo $data [$i]->phone . ","; + $user_address = str_replace(",", "
    ", $data [$i]->address); + $user_address = strip_tags($user_address); + $user_shipping_address = str_replace(",", "
    ", $shipping_address->address); + $user_shipping_address = strip_tags($user_shipping_address); + + echo trim($user_address) . ","; + echo $data [$i]->city . ","; + echo $data [$i]->state_code . ","; + echo $data [$i]->country_code . ","; + echo $data [$i]->zipcode . ","; + + echo trim($user_shipping_address) . ","; + echo $shipping_address->city . ","; + echo $shipping_address->state_code . ","; + echo $shipping_address->country_code . ","; + echo $shipping_address->zipcode . ","; + + echo RedshopHelperOrder::getOrderStatusTitle($data [$i]->order_status) . ","; + echo date('d-m-Y H:i', $data [$i]->cdate) . ","; + + $no_items = RedshopHelperOrder::getOrderItemDetail($data [$i]->order_id); + + for ($it = 0, $countItem = count($no_items); $it < $countItem; $it++) + { + echo $no_items [$it]->order_item_name . ","; + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . $no_items [$it]->product_final_price . ","; + + $product_attribute = $producthelper->makeAttributeOrder($no_items [$it]->order_item_id, 0, $no_items [$it]->product_id, 0, 1); + $product_attribute = strip_tags($product_attribute->product_attribute); + + echo trim($product_attribute) . ","; + } + + $temp = $no_products - count($no_items); + echo str_repeat(',', $temp * 3); + + if ($data [$i]->order_shipping != "") + { + $shippingcost = $data [$i]->order_shipping; + } + else + { + $shippingcost = 0; + } + + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . $shippingcost . ","; + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . $data [$i]->order_total . "\n"; + } + + exit(); + } + + public function generateParcel() + { + $order_id = $this->input->getInt('order_id'); + $generate_label = RedshopHelperOrder::generateParcel($order_id); + + if ($generate_label == "success") + { + $sussces_message = JText::_('COM_REDSHOP_XML_GENERATED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=order', $sussces_message, 'success'); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=order', $generate_label, 'error'); + } + } + + public function download_token() + { + $post = $this->input->post->getArray(); + $cid = $this->input->post->get('cid', array(0), 'array'); + + $model = $this->getModel('order'); + + $download_id_arr = $post ['download_id']; + + for ($i = 0, $in = count($download_id_arr); $i < $in; $i++) + { + $download_id = $download_id_arr [$i]; + + $product_download_infinite_var = 'product_download_infinite_' . $download_id; + $product_download_infinite = $post [$product_download_infinite_var]; + + $limit_var = 'limit_' . $download_id; + $limit = $post [$limit_var]; + + $days_var = 'days_' . $download_id; + $days = $post [$days_var]; + + $clock_var = 'clock_' . $download_id; + $clock = $post [$clock_var]; + + $clock_min_var = 'clock_min_' . $download_id; + $clock_min = $post [$clock_min_var]; + + $days = (date("H") > $clock && $days == 0) ? 1 : $days; + + $product_download_days_time = (time() + ($days * 24 * 60 * 60)); + + $endtime = mktime( + $clock, $clock_min, 0, date("m", $product_download_days_time), date("d", $product_download_days_time), + date("Y", $product_download_days_time) + ); + + // If download product is set to infinit + $endtime = ($product_download_infinite == 1) ? 0 : $endtime; + + $model->updateDownloadSetting($download_id, $limit, $endtime); + } + + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid [0]); + } + + public function gls_export() + { + $cid = $this->input->get('cid', array(0), 'array'); + /** @var RedshopModelOrder $model */ + $model = $this->getModel('order'); + $model->gls_export($cid); + } + + public function business_gls_export() + { + $cid = $this->input->get('cid', array(0), 'array'); + /** @var RedshopModelOrder $model */ + $model = $this->getModel('order'); + $model->business_gls_export($cid); + } +} diff --git a/component/admin/controllers/order_detail.php b/component/admin/controllers/order_detail.php new file mode 100644 index 00000000000..b8230d46ac4 --- /dev/null +++ b/component/admin/controllers/order_detail.php @@ -0,0 +1,604 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'order_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function save() + { + $post = $this->input->post->getArray(); + + $text_field = $this->input->post->get('text_field', '', 'raw'); + $post["text_field"] = $text_field; + + $cid = $this->input->post->get('cid', array(0), 'array'); + + $post ['order_id'] = $cid [0]; + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + if ($model->store($post)) + { + $msg = JText::_('COM_REDSHOP_ORDER_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_ORDER_DETAIL'); + } + + $this->setRedirect('index.php?option=com_redshop&view=order', $msg); + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ORDER_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=order', $msg); + } + + public function cancel() + { + + $msg = JText::_('COM_REDSHOP_ORDER_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=order', $msg); + } + + public function neworderitem() + { + $post = $this->input->post->getArray(); + $tmpl = ""; + + if (isset($post['tmpl'])) + { + $tmpl = $post['tmpl']; + } + + $cid = $this->input->post->get('cid', array(0), 'array'); + + $order_item_id = $this->input->post->get('order_item_id', 0); + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + $orderItem = Redshop\Order\Helper::redesignProductItem($post); + $post['order_item'] = $orderItem; + + $product_id = $orderItem[0]->product_id; + $finalquantity = $quantity = $orderItem[0]->quantity; + + // Check product Quantity + if (Redshop::getConfig()->get('USE_STOCKROOM') == 1) + { + $currentStock = RedshopHelperStockroom::getStockroomTotalAmount($product_id); + + if ($currentStock >= $quantity) + { + $finalquantity = (int) $quantity; + } + else + { + $finalquantity = (int) $currentStock; + } + } + + if ($finalquantity > 0) + { + if ($model->neworderitem($post, $finalquantity, $order_item_id)) + { + if ($order_item_id == 0) + { + $msg = JText::_('COM_REDSHOP_ORDER_ITEM_ADDED'); + } + else + { + $msg = JText::_('COM_REDSHOP_QUANTITY_UPDATED'); + } + } + else + { + if ($order_item_id == 0) + { + $msg = JText::_('COM_REDSHOP_ERROR_ADDING_ORDER_ITEM'); + } + + else + { + $msg = JText::_('COM_REDSHOP_ERROR_UPDATING_QUANTITY'); + } + } + } + else + { + $msg = JText::_('COM_REDSHOP_PRODUCT_OUT_OF_STOCK'); + } + + if ($tmpl) + { + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0] . '&tmpl=' . $tmpl, $msg); + } + + else + { + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0], $msg); + } + } + + public function delete_item() + { + $post = $this->input->post->getArray(); + $cid = $this->input->post->get('cid', array(0), 'array'); + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + $orderItem = RedshopHelperOrder::getOrderItemDetail($cid[0]); + + // Delete order if there are only 1 order item + if (count($orderItem) == 1 && $orderItem[0]->order_item_id == $post['order_item_id']) + { + $model->delete($cid); + $msg = JText::_('COM_REDSHOP_ORDER_DELETED_SUCCESSFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=order', $msg); + + return; + } + + // Delete order item. + if ($model->delete_item($post)) + { + $msg = JText::_('COM_REDSHOP_ORDER_ITEM_DELETED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_DELETING_ORDER_ITEM'); + } + + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0], $msg); + } + + public function updateItem() + { + $post = $this->input->post->getArray(); + $cid = $this->input->post->get('cid', array(0), 'array'); + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + if ($model->updateItem($post)) + { + $msg = JText::_('COM_REDSHOP_ORDER_ITEM_PRICE_UPDATED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_UPDATING_PRICE'); + } + + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0], $msg); + } + + public function update_discount() + { + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + if ($model->update_discount($post)) + { + $msg = JText::_('COM_REDSHOP_DISCOUNT_UPDATED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_UPDATING_DISCOUNT'); + } + + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0], $msg); + } + + public function special_discount() + { + $post = $this->input->post->getArray(); + $cid = $this->input->post->get('cid', array(0), 'array'); + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + if ($model->special_discount($post)) + { + $msg = JText::_('COM_REDSHOP_SPECIAL_DISCOUNT_APPLIED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_IN_SPECIAL_DISCOUNT'); + } + + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0], $msg); + } + + public function update_shippingrates() + { + $post = $this->input->post->getArray(); + $cid = $this->input->post->get('cid', array(0), 'array'); + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + if ($model->update_shippingrates($post)) + { + $msg = JText::_('COM_REDSHOP_SHIPPING_RATE_UPDATED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_UPDATING_SHIPPING_RATE'); + } + + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0], $msg); + } + + public function updateShippingAdd() + { + $post = $this->input->post->getArray(); + $suboption = $this->input->getString('suboption', 'com_redshop'); + $view = ($suboption == 'com_redshop') ? 'order_detail' : 'order'; + $cid = $this->input->post->get('cid', array(0), 'array'); + $post['order_id'] = $cid[0]; + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + if ($model->updateShippingAdd($post)) + { + $msg = JText::_('COM_REDSHOP_SHIPPING_INFORMATION_UPDATED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_UPDATING_SHIPPING_INFORMATION'); + } + + ?> + + close(); + } + + public function updateBillingAdd() + { + $post = $this->input->post->getArray(); + $cid = $this->input->post->get('cid', array(0), 'array'); + $post['order_id'] = $cid[0]; + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + if ($model->updateBillingAdd($post)) + { + $msg = JText::_('COM_REDSHOP_BILLING_INFORMATION_UPDATED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_UPDATING_BILLING_INFORMATION'); + } + + ?> + + close(); + } + + /** + * Method for create stock note pdf + * + * @return void + */ + public function createpdf() + { + if (!RedshopHelperPdf::isAvailablePdfPlugins()) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_ERROR_MISSING_PDF_PLUGIN'), 'error'); + } + else + { + $this->getView('order_detail', 'pdf'); + } + + parent::display(); + } + + /** + * Method for create stock note pdf + * + * @return void + */ + public function createpdfstocknote() + { + if (!RedshopHelperPdf::isAvailablePdfPlugins()) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_ERROR_MISSING_PDF_PLUGIN'), 'error'); + } + else + { + $this->getView('order_detail', 'stocknotepdf'); + } + + parent::display(); + } + + public function send_downloadmail() + { + $cid = $this->input->get->get('cid', array(0), 'array'); + $tmpl = $this->input->getCmd('tmpl', ''); + $msg = JText::_('COM_REDSHOP_ERROR_DOWNLOAD_MAIL_FAIL'); + + if (RedshopHelperOrder::sendDownload($cid[0])) + { + $msg = JText::_('COM_REDSHOP_DOWNLOAD_MAIL_HAS_BEEN_SENT'); + } + + if ($tmpl) + { + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0] . '&tmpl=' . $tmpl, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0], $msg, 'error'); + } + } + + public function displayProductItemInfo() + { + $get = $this->input->get->getArray(); + + $product_id = $get['product']; + $quantity = $get['quantity']; + $unique_id = $get['unique_id']; + $user_id = $get['user_id']; + $newprice = $get['newprice']; + + $response = RedshopHelperProduct::getProductItemInfo($product_id, $quantity, $unique_id, $user_id, $newprice); + echo $response; + JFactory::getApplication()->close(); + } + + public function checkoutnext() + { + $app = JFactory::getApplication(); + $session = JFactory::getSession(); + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + $request = $this->input->getArray(); + $order = RedshopEntityOrder::getInstance($request['order_id'])->getItem(); + + // Send the order_id and order payment_id to the payment plugin so it knows which DB record to update upon successful payment + $userBilling = RedshopHelperOrder::getOrderBillingUserInfo($request['order_id']); + $shippingAddresses = RedshopHelperOrder::getOrderShippingUserInfo($request['order_id']); + + if (isset($shippingAddresses)) + { + $shippingAddress = $shippingAddresses; + + $shippingAddress->country_2_code = RedshopHelperWorld::getCountryCode2($shippingAddress->country_code); + $shippingAddress->state_2_code = RedshopHelperWorld::getStateCode2($shippingAddress->state_code); + } + + if (isset($shippingAddresses)) + { + $d["shippingaddress"] = $shippingAddresses; + + $d["shippingaddress"]->country_2_code = RedshopHelperWorld::getCountryCode2($d["shippingaddress"]->country_code); + $d["shippingaddress"]->state_2_code = RedshopHelperWorld::getStateCode2($d ["shippingaddress"]->state_code); + + $shippingAddresses->country_2_code = RedshopHelperWorld::getCountryCode2($d ["shippingaddress"]->country_code); + $shippingAddresses->state_2_code = RedshopHelperWorld::getStateCode2($d ["shippingaddress"]->state_code); + } + + if (isset($userBilling)) + { + $d ["billingaddress"] = $userBilling; + + if (isset($userBilling->country_code)) + { + $d["billingaddress"]->country_2_code = RedshopHelperWorld::getCountryCode2($userBilling->country_code); + + $userBilling->country_2_code = RedshopHelperWorld::getCountryCode2($userBilling->country_code); + } + + if (isset($userBilling->state_code)) + { + $d["billingaddress"]->state_2_code = RedshopHelperWorld::getStateCode2($userBilling->state_code); + + $userBilling->state_2_code = RedshopHelperWorld::getStateCode2($userBilling->state_code); + } + } + + $creditCardData = array(); + + $creditCardData['order_payment_name'] = $request['order_payment_name']; + $creditCardData['creditcard_code'] = $request['creditcard_code']; + $creditCardData['order_payment_number'] = $request['order_payment_number']; + $creditCardData['order_payment_expire_month'] = $request['order_payment_expire_month']; + $creditCardData['order_payment_expire_year'] = $request['order_payment_expire_year']; + $creditCardData['credit_card_code'] = $request['credit_card_code']; + $creditCardData['selectedCardId'] = $this->input->getString('selectedCard', ''); + + $session->set('ccdata', $creditCardData); + + $values['order_shipping'] = $order->order_shipping; + $values['order_number'] = $request['order_id']; + $values['order_tax'] = $order->order_tax; + $values['shippinginfo'] = $d ["shippingaddress"]; + $values['billinginfo'] = $d ["billingaddress"]; + $values['order_total'] = $order->order_total; + $values['order_subtotal'] = $order->order_subtotal; + $values["order_id"] = $request['order_id']; + $values['payment_plugin'] = $request['payment_plugin']; + $values['order'] = $order; + + JPluginHelper::importPlugin('redshop_payment'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + + $results = $dispatcher->trigger('onPrePayment_' . $values['payment_plugin'], array($values['payment_plugin'], $values)); + $paymentResponse = $results[0]; + + if ($paymentResponse->responsestatus == "Success" || $values['payment_plugin'] == "") + { + $paymentResponse->log = $paymentResponse->message; + $paymentResponse->msg = $paymentResponse->message; + $paymentResponse->order_status_code = 'C'; + $paymentResponse->order_payment_status_code = 'Paid'; + $paymentResponse->order_id = $request['order_id']; + + RedshopHelperOrder::changeOrderStatus($paymentResponse); + } + + // Update order payment table with credit card details + $model->update_ccdata($request['order_id'], $paymentResponse->transaction_id); + + $app->redirect( + JRoute::_(JURI::base() . "index.php?option=com_redshop&view=order_detail&task=edit&cid[]=" . $request['order_id']), + $paymentResponse->message + ); + } + + public function send_invoicemail() + { + $cid = $this->input->get->get('cid', array(0), 'array'); + $tmpl = $this->input->getCmd('tmpl', ''); + + if (Redshop\Mail\Invoice::sendMail($cid[0])) + { + $msg = JText::_('COM_REDSHOP_INVOICE_MAIL_HAS_BEEN_SENT'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_INVOICE_MAIL_FAIL'); + } + + if ($tmpl) + { + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0] . '&tmpl=' . $tmpl, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $cid[0], $msg); + } + } + + /** + * Resend Order Mail on Demand + * + * @return void + * @throws Exception + */ + public function resendOrderMail() + { + $orderId = $this->input->getInt('orderid'); + $tmpl = $this->input->getCmd('tmpl', ''); + + if (Redshop\Mail\Order::sendMail($orderId)) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_SEND_ORDER_MAIL')); + } + else + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_ERROR_SENDING_ORDER_MAIL'), 'error'); + } + + if ($tmpl) + { + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $orderId . '&tmpl=' . $tmpl); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=order_detail&cid[]=' . $orderId); + } + } + + /** + * Pay order from backend. Responsibility of Changing Order Status will be on payment method it self. + * Using order_functions::getInstance()->changeorderstatus($return); + * To give more flexibility to payment method. + * + * @return void + */ + public function pay() + { + $orderId = $this->input->getInt('orderId'); + + JPluginHelper::importPlugin('redshop_payment'); + RedshopHelperUtility::getDispatcher()->trigger('onBackendPayment', array($orderId)); + + $this->setRedirect('index.php?option=com_redshop&view=order_detail&task=edit&cid[]=' . $orderId); + } + + /** + * Store Extra field + * + * @return void + * @throws Exception + */ + public function storeExtraField() + { + $data = $this->input->post->getArray(); + + RedshopHelperExtrafields::extraFieldSave($data, RedshopHelperExtrafields::SECTION_ORDER, $data['order_id']); + + $this->setRedirect('index.php?option=com_redshop&view=order_detail&task=edit&cid[]=' . $data['order_id']); + } +} diff --git a/component/admin/controllers/order_status.php b/component/admin/controllers/order_status.php new file mode 100644 index 00000000000..352611c6034 --- /dev/null +++ b/component/admin/controllers/order_status.php @@ -0,0 +1,21 @@ +setRedirect('index.php'); + } +} diff --git a/component/admin/controllers/prices_detail.php b/component/admin/controllers/prices_detail.php new file mode 100644 index 00000000000..37fecf057cf --- /dev/null +++ b/component/admin/controllers/prices_detail.php @@ -0,0 +1,124 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'prices_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + parent::display(); + } + + /** + * Apply function + * + * @return void + */ + public function apply() + { + $this->save(1); + } + + /** + * Save function + * + * @param int $apply stay in current page or not + * @return void + */ + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + $type = 'error'; + $productId = $this->input->getInt('product_id'); + $post['product_currency'] = Redshop::getConfig()->get('CURRENCY_CODE'); + $post['cdate'] = time(); + $cid = $this->input->post->get('cid', array(0), 'array'); + $post ['price_id'] = $cid [0]; + + $this->handleDateTimeRange($post['discount_start_date'], $post['discount_end_date']); + + // Store current post to user state + $context = "com_redshop.edit.product_price"; + JFactory::getApplication()->setUserState($context . '.data', json_encode($post)); + + /** @var RedshopModelPrices_detail $model */ + $model = $this->getModel('prices_detail'); + + $row = $model->store($post); + + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_PRICE_QUNTITY_DETAIL'); + + if ($row) + { + $type = ''; + $msg = JText::_('COM_REDSHOP_PRICE_DETAIL_SAVED'); + JFactory::getApplication()->setUserState($context . '.data', array()); + $post ['price_id'] = $row->price_id; + } + elseif ($post['discount_start_date'] > $post['discount_end_date']) + { + $msg = JText::_('COM_REDSHOP_PRODUCT_PRICE_END_DATE_MUST_MORE_THAN_START_DATE'); + } + + if ($apply == 0) + { + $this->setRedirect('index.php?option=com_redshop&view=prices&product_id=' . $productId, $msg, $type); + + return; + } + + $this->setRedirect('index.php?option=com_redshop&view=prices_detail&task=edit&product_id=' . $productId . '&cid[]=' . $post ['price_id'], $msg, $type); + } + + public function remove() + { + $productId = $this->input->get('product_id'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelPrices_detail $model */ + $model = $this->getModel('prices_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_PRICE_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=prices&product_id=' . $productId, $msg); + } + + public function cancel() + { + $productId = $this->input->get('product_id'); + + $msg = JText::_('COM_REDSHOP_PRICE_DETAIL_EDITING_CANCELLED'); + $context = "com_redshop.edit.product_price"; + JFactory::getApplication()->setUserState($context . '.data', null); + $this->setRedirect('index.php?option=com_redshop&view=prices&product_id=' . $productId, $msg); + } +} diff --git a/component/admin/controllers/product.php b/component/admin/controllers/product.php new file mode 100644 index 00000000000..8d87fc99a68 --- /dev/null +++ b/component/admin/controllers/product.php @@ -0,0 +1,374 @@ +setRedirect('index.php'); + } + + public function ins_product() + { + $this->input->set('layout', 'ins_product'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function importeconomic() + { + // Add product to economic + $cnt = $this->input->getInt('cnt', 0); + $totalprd = 0; + $msg = ''; + + if (Redshop::getConfig()->getInt('ECONOMIC_INTEGRATION') == 1) + { + $db = JFactory::getDbo(); + $incNo = $cnt; + $query = 'SELECT p.* FROM #__redshop_product AS p ' + . 'LIMIT ' . $cnt . ', 10 '; + $db->setQuery($query); + $prd = $db->loadObjectlist(); + $totalprd = count($prd); + $responcemsg = ''; + + for ($i = 0, $in = count($prd); $i < $in; $i++) + { + $incNo++; + $ecoProductNumber = RedshopEconomic::createProductInEconomic($prd[$i]); + $responcemsg .= "
    " . $incNo . ": " . JText::_('COM_REDSHOP_PRODUCT_NUMBER') . " " . $prd[$i]->product_number . " -> "; + + if (count($ecoProductNumber) > 0 && is_object($ecoProductNumber[0]) && isset($ecoProductNumber[0]->Number)) + { + $responcemsg .= "" . JText::_('COM_REDSHOP_IMPORT_PRODUCTS_TO_ECONOMIC_SUCCESS') . ""; + } + else + { + $errmsg = JText::_('COM_REDSHOP_ERROR_IN_IMPORT_PRODUCT_TO_ECONOMIC'); + + if (JError::isError(JError::getError())) + { + $error = JError::getError(); + $errmsg = $error->getMessage(); + } + + $responcemsg .= "" . $errmsg . ""; + } + + $responcemsg .= "
    "; + } + + if ($totalprd > 0) + { + $msg = $responcemsg; + } + else + { + $msg = JText::_("COM_REDSHOP_IMPORT_PRODUCT_TO_ECONOMIC_IS_COMPLETED"); + } + } + + echo "
    " . $totalprd . "`_`" . $msg . "
    "; + + JFactory::getApplication()->close(); + } + + public function importatteco() + { + // Add product attribute to economic + $cnt = $this->input->getInt('cnt', 0); + $totalprd = 0; + $msg = ''; + + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1 && Redshop::getConfig()->get('ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC') == 1) + { + $db = JFactory::getDbo(); + $incNo = $cnt; + $query = "SELECT ap.*, a.attribute_name, p.product_id, p.accountgroup_id " + . "FROM #__redshop_product_attribute_property AS ap " + . "LEFT JOIN #__redshop_product_attribute AS a ON a.attribute_id=ap.attribute_id " + . "LEFT JOIN #__redshop_product AS p ON p.product_id=a.product_id " + . "WHERE p.published=1 " + . "AND p.product_id!='' " + . "AND ap.property_number!='' " + . "LIMIT " . $cnt . ", 10 "; + $db->setQuery($query); + $list = $db->loadObjectlist(); + $totalprd = count($list); + $responcemsg = ''; + + for ($i = 0, $in = count($list); $i < $in; $i++) + { + $incNo++; + $prdrow = new stdClass; + $prdrow->product_id = $list[$i]->product_id; + $prdrow->accountgroup_id = $list[$i]->accountgroup_id; + $ecoProductNumber = RedshopEconomic::createPropertyInEconomic($prdrow, $list[$i]); + $responcemsg .= "
    " . $incNo . ": " . JText::_('COM_REDSHOP_PROPERTY_NUMBER') . " " . $list[$i]->property_number . " -> "; + + if (count($ecoProductNumber) > 0 && is_object($ecoProductNumber[0]) && isset($ecoProductNumber[0]->Number)) + { + $responcemsg .= "" . JText::_('COM_REDSHOP_IMPORT_ATTRIBUTES_TO_ECONOMIC_SUCCESS') . ""; + } + else + { + $errmsg = JText::_('COM_REDSHOP_ERROR_IN_IMPORT_ATTRIBUTES_TO_ECONOMIC'); + + if (JError::isError(JError::getError())) + { + $error = JError::getError(); + $errmsg = $error->getMessage(); + } + + $responcemsg .= "" . $errmsg . ""; + } + + $responcemsg .= "
    "; + } + + $query = "SELECT sp.*, ap.property_id, ap.property_name, p.product_id, p.accountgroup_id FROM #__redshop_product_subattribute_color AS sp " + . "LEFT JOIN #__redshop_product_attribute_property AS ap ON ap.property_id=sp.subattribute_id " + . "LEFT JOIN #__redshop_product_attribute AS a ON a.attribute_id=ap.attribute_id " + . "LEFT JOIN #__redshop_product AS p ON p.product_id=a.product_id " + . "WHERE p.published=1 " + . "AND p.product_id!='' " + . "AND sp.subattribute_color_number!='' " + . "LIMIT " . $cnt . ", 10 "; + $db->setQuery($query); + $list = $db->loadObjectlist(); + $totalprd = $totalprd + count($list); + + for ($i = 0, $in = count($list); $i < $in; $i++) + { + $incNo++; + $prdrow = new stdClass; + $prdrow->product_id = $list[$i]->product_id; + $prdrow->accountgroup_id = $list[$i]->accountgroup_id; + $ecoProductNumber = RedshopEconomic::createSubpropertyInEconomic($prdrow, $list[$i]); + $responcemsg .= "
    " . $incNo . ": " . JText::_('COM_REDSHOP_SUBPROPERTY_NUMBER') . " " + . $list[$i]->subattribute_color_number . " -> "; + + if (count($ecoProductNumber) > 0 && is_object($ecoProductNumber[0]) && isset($ecoProductNumber[0]->Number)) + { + $responcemsg .= "" . JText::_('COM_REDSHOP_IMPORT_ATTRIBUTES_TO_ECONOMIC_SUCCESS') . ""; + } + else + { + $errmsg = JText::_('COM_REDSHOP_ERROR_IN_IMPORT_ATTRIBUTES_TO_ECONOMIC'); + + if (JError::isError(JError::getError())) + { + $error = JError::getError(); + $errmsg = $error->getMessage(); + } + + $responcemsg .= "" . $errmsg . ""; + } + + $responcemsg .= "
    "; + } + + if ($totalprd > 0) + { + $msg = $responcemsg; + } + else + { + $msg = JText::_("COM_REDSHOP_IMPORT_ATTRIBUTES_TO_ECONOMIC_IS_COMPLETED"); + } + } + + echo "
    " . $totalprd . "`_`" . $msg . "
    "; + + JFactory::getApplication()->close(); + } + + public function saveprice() + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $productIds = $this->input->post->get('pid', array(), 'array'); + $discountPrices = $this->input->post->get('price', array(), 'array'); + + /** @var RedshopModelProduct $model */ + $model = $this->getModel('Product'); + $model->savePrices($productIds, $discountPrices); + $msg = JText::_('COM_REDSHOP_PRODUCT_PRICE_SAVE_SUCCESS'); + + if (!$model->savePrices($productIds, $discountPrices)) + { + $msg = JText::_('COM_REDSHOP_PRODUCT_PRICE_SAVE_FAILED'); + } + + $this->setRedirect('index.php?option=com_redshop&view=product&layout=listing', $msg); + } + + /** + * Save all discount price + * + * @return void + */ + public function savediscountprice() + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $productIds = $this->input->post->get('pid', array(), 'array'); + $discountPrices = $this->input->post->get('discount_price', array(), 'array'); + + /** @var RedshopModelProduct $model */ + $model = $this->getModel('Product'); + $model->saveDiscountPrices($productIds, $discountPrices); + $msg = JText::_('COM_REDSHOP_PRODUCT_PRICE_SAVE_SUCCESS'); + + if (!$model->saveDiscountPrices($productIds, $discountPrices)) + { + $msg = JText::_('COM_REDSHOP_PRODUCT_PRICE_SAVE_FAILED'); + } + + $this->setRedirect('index.php?option=com_redshop&view=product&layout=listing', $msg); + } + + public function template() + { + $template_id = $this->input->get('template_id', ''); + $product_id = $this->input->get('product_id', ''); + $section = $this->input->get('section', ''); + + /** @var RedshopModelProduct $model */ + $model = $this->getModel('product'); + + $data_product = $model->product_template($template_id, $product_id, $section); + + if (is_array($data_product)) + { + for ($i = 0, $in = count($data_product); $i < $in; $i++) + { + echo $data_product[$i]; + } + } + + else + { + echo $data_product; + } + + JFactory::getApplication()->close(); + } + + public function assignTemplate() + { + $post = $this->input->post->getArray(); + + /** @var RedshopModelProduct $model */ + $model = $this->getModel('product'); + + if ($model->assignTemplate($post)) + { + $msg = JText::_('COM_REDSHOP_TEMPLATE_ASSIGN_SUCESS'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_ASSIGNING_TEMPLATE'); + } + + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + public function saveorder() + { + + $cid = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + $cid = ArrayHelper::toInteger($cid); + $order = ArrayHelper::toInteger($order); + + /** @var RedshopModelProduct $model */ + $model = $this->getModel('product'); + $model->saveorder($cid, $order); + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + /** + * Check in of one or more records. + * + * @return boolean True on success + * + * @since 12.2 + */ + public function checkin() + { + // Check for request forgeries. + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + + $ids = $this->input->post->get('cid', array(), 'array'); + + /** @var RedshopModelProduct $model */ + $model = $this->getModel('product_detail'); + $return = $model->checkin($ids); + + if ($return === false) + { + // Checkin failed. + $message = JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError()); + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=product', false), $message, 'error'); + + return false; + } + else + { + // Checkin succeeded. + $message = JText::plural('COM_REDSHOP_PRODUCT_N_ITEMS_CHECKED_IN', count($ids)); + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=product', false), $message); + + return true; + } + } + + /** + * Save order ajax. + * + * @return void + * + * @since __DEPLOY_VERSION__ + */ + public function saveOrderAjax() + { + // Get the input + $pks = $this->input->post->get('cid', array(), 'array'); + + $order = $this->input->post->get('order', array(), 'array'); + + // Sanitize the input + $pks = ArrayHelper::toInteger($pks); + $order = ArrayHelper::toInteger($order); + + /** @var RedshopModelProduct $model */ + $model = $this->getModel('product_detail'); + + // Save the ordering + $return = $model->saveorder($pks, $order); + + if ($return) + { + echo '1'; + } + + // Close the application + \JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/product_attribute_price.php b/component/admin/controllers/product_attribute_price.php new file mode 100644 index 00000000000..a0b46a2246d --- /dev/null +++ b/component/admin/controllers/product_attribute_price.php @@ -0,0 +1,89 @@ +setRedirect('index.php'); + } + + public function listing() + { + $this->input->set('layout', 'listing'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function saveprice() + { + $db = JFactory::getDbo(); + $section_id = $this->input->get('section_id'); + $section = $this->input->get('section'); + $cid = $this->input->get('cid'); + $shopper_group_id = $this->input->post->get('shopper_group_id', array(), 'array'); + $price = $this->input->post->get('price', array(), 'array'); + $price_quantity_start = $this->input->post->get('price_quantity_start', array(), 'array'); + $price_quantity_end = $this->input->post->get('price_quantity_end', array(), 'array'); + $price_id = $this->input->post->get('price_id', array(), 'array'); + + for ($i = 0, $in = count($price); $i < $in; $i++) + { + $sql = "SELECT count(*) FROM #__redshop_product_attribute_price WHERE section_id='" . $section_id . "' AND section= '" + . $section . "' AND price_id = '" . $price_id[$i] . "' AND shopper_group_id = '" . $shopper_group_id[$i] . "' "; + $db->setQuery($sql); + + if ($db->loadResult()) + { + $query = 'SELECT price_id FROM #__redshop_product_attribute_price WHERE shopper_group_id = "' . $shopper_group_id[$i] + . '" AND section_id="' . $section_id . '" AND section= "' . $section . '" AND price_quantity_end >= ' + . $price_quantity_start[$i] . ' AND price_quantity_start <=' . $price_quantity_start[$i]; + $db->setQuery($query); + $xid = intval($db->loadResult()); + + if ($xid && $xid != intval($price_id[$i])) + { + echo $xid; + + $this->_error = JText::sprintf('WARNNAMETRYAGAIN', JText::_('COM_REDSHOP_PRICE_ALREADY_EXISTS')); + } + + if ($price[$i] != '') + { + $sql = "UPDATE #__redshop_product_attribute_price SET product_price='" . $price[$i] . "' ," + . " price_quantity_start = '" . $price_quantity_start[$i] . "', price_quantity_end = '" . $price_quantity_end[$i] . "' " + . " WHERE section_id='" . $section_id . "' AND section= '" . $section . "' AND price_id = '" . $price_id[$i] + . "' AND shopper_group_id = '" . $shopper_group_id[$i] . "' "; + } + else + { + $sql = "DELETE FROM #__redshop_product_attribute_price WHERE section_id='" . $section_id . "' AND section= '" + . $section . "' AND price_id = '" . $price_id[$i] . "' AND shopper_group_id = '" + . $shopper_group_id[$i] . "' "; + } + } + elseif ($price[$i] != '') + { + $sql = "INSERT INTO #__redshop_product_attribute_price SET product_price='" . $price[$i] . "', price_quantity_start = '" + . $price_quantity_start[$i] . "' , price_quantity_end = '" . $price_quantity_end[$i] . "' , section_id='" + . $section_id . "' , section = '" . $section . "' , shopper_group_id = '" . $shopper_group_id[$i] . "' "; + } + + $db->setQuery($sql); + $db->execute(); + } + + $link = "index.php?tmpl=component&option=com_redshop&view=product_attribute_price§ion_id=" . $section_id + . "&cid=" . $cid . "§ion=" . $section; + $this->setRedirect($link); + } +} diff --git a/component/admin/controllers/product_category.php b/component/admin/controllers/product_category.php new file mode 100644 index 00000000000..3a1a7dfb3ea --- /dev/null +++ b/component/admin/controllers/product_category.php @@ -0,0 +1,55 @@ +input->set('hidemainmenu', 1); + parent::display(); + } + + public function saveProduct_Category() + { + $app = JFactory::getApplication(); + $model = $this->getModel("product_category"); + + if ($model->saveProduct_Category()) + { + $msg = JText::_('COM_REDSHOP_CATEGORY_ASSIGNED_TO_PRODUCT_SUCCESSFULLY'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_WHILE_ASSIGNING_CATEGORY_TO_PRODUCT'); + } + + $app->redirect("index.php?option=com_redshop&view=product", $msg); + } + + public function removeProduct_Category() + { + $app = JFactory::getApplication(); + $model = $this->getModel("product_category"); + + if ($model->removeProduct_Category()) + { + $msg = JText::_('COM_REDSHOP_CATEGORY_REMOVED_FROM_PRODUCT_SUCCESSFULLY'); + } + + else + { + $msg = JText::_('COM_REDSHOP_ERROR_WHILE_REMOVING_CATEGORY_FROM_PRODUCT'); + } + + $app->redirect("index.php?option=com_redshop&view=product", $msg); + } +} diff --git a/component/admin/controllers/product_detail.php b/component/admin/controllers/product_detail.php new file mode 100755 index 00000000000..c357426f672 --- /dev/null +++ b/component/admin/controllers/product_detail.php @@ -0,0 +1,1098 @@ +registerTask('add', 'edit'); + + $this->app = JFactory::getApplication(); + $this->option = $this->input->getCmd('option', 'com_redshop'); + } + + /** + * Method for redirect to edit an existing record. + * + * @return void + * + * @since 1.5 + */ + public function editRedirect() + { + $cid = $this->input->post->get('cid', array(), 'array'); + $this->setRedirect( + JRoute::_( + 'index.php?option=com_redshop&view=product_detail' + . $this->getRedirectToItemAppend($cid[0], 'cid[]'), false + ) + ); + } + + /** + * Method for redirect to add task. + * + * @return void + * + * @since 1.5 + */ + public function addRedirect() + { + $this->setRedirect( + JRoute::_( + 'index.php?option=com_redshop&view=product_detail' + . $this->getRedirectToItemAppend(), false + ) + ); + } + + /** + * Edit task. + * + * @return void + */ + public function edit() + { + $this->input->set('view', 'product_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + parent::display(); + } + + /** + * Save + New task. + * + * @return void + */ + public function save2new() + { + $this->save(2); + } + + /** + * Apply task. + * + * @return void + */ + public function apply() + { + $this->save(1); + } + + /** + * Save task. + * + * @param int $apply Task is apply or common save. + * + * @return void + * @throws Exception + */ + public function save($apply = 0) + { + //@TODO This is potentially unsafe because $_POST elements are not sanitized. + $post = $this->input->post->getArray(); + $cid = $this->input->post->get('cid', array(), 'array'); + $post ['product_id'] = $cid[0]; + $post['product_name'] = $this->input->post->get('product_name', null, 'string'); + + $selectedTabPosition = $this->input->get('selectedTabPosition'); + $this->app->setUserState('com_redshop.product_detail.selectedTabPosition', $selectedTabPosition); + + if (is_array($post['product_category']) + && (isset($post['cat_in_sefurl']) && !in_array($post['cat_in_sefurl'], $post['product_category']))) + { + $post['cat_in_sefurl'] = $post['product_category'][0]; + } + + if (!$post ['product_id']) + { + $post ['publish_date'] = date("Y-m-d H:i:s"); + } + + // Setting default value + $post['product_on_sale'] = 0; + + // Setting product on sale when discount dates are set + if ((bool) $post['discount_stratdate'] || (bool) $post['discount_enddate']) + { + $post['product_on_sale'] = 1; + } + + $post["product_number"] = trim($this->input->getString('product_number', '')); + + $product_s_desc = $this->input->post->get('product_s_desc', array(), 'array'); + $post["product_s_desc"] = stripslashes($product_s_desc[0]); + + $product_desc = $this->input->post->get('product_desc', array(), 'array'); + $post["product_desc"] = stripslashes($product_desc[0]); + + if (!empty($post['product_availability_date'])) + { + $post['product_availability_date'] = strtotime($post['product_availability_date']); + } + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + if ($row = $model->store($post)) + { + // Save Association + $model->SaveAssociations($row->product_id, $post); + + // Add product to economic + if (Redshop::getConfig()->getInt('ECONOMIC_INTEGRATION') === 1) + { + RedshopEconomic::createProductInEconomic($row); + } + + // Field_section 1 :Product + RedshopHelperExtrafields::extraFieldSave($post, RedshopHelperExtrafields::SECTION_PRODUCT, $row->product_id); + + // Field_section 12 :Product Userfield + RedshopHelperExtrafields::extraFieldSave($post, RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, $row->product_id); + + // Field_section 12 :Productfinder datepicker + RedshopHelperExtrafields::extraFieldSave($post, RedshopHelperExtrafields::SECTION_PRODUCT_FINDER_DATE_PICKER, $row->product_id); + + $this->attribute_save($post, $row); + + JPluginHelper::importPlugin('redshop_product'); + JPluginHelper::importPlugin('redshop_product_type'); + + RedshopHelperUtility::getDispatcher()->trigger('onAfterProductFullSave', array($row, $post['product_id'])); + + // Extra Field Data Saved + $msg = JText::_('COM_REDSHOP_PRODUCT_DETAIL_SAVED'); + + if ($apply == 2) + { + $this->setRedirect('index.php?option=com_redshop&view=product_detail&task=add', $msg); + } + + elseif ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $row->product_id, $msg); + } + else + { + $model->checkin($cid); + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + } + else + { + $this->app->enqueueMessage($model->getError(), 'error'); + $this->input->set('view', 'product_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + parent::display(); + } + } + + /** + * Remove task. + * + * @return void + * @throws Exception + */ + public function remove() + { + $cid = $this->input->post->get('cid', array(), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + $this->app->enqueueMessage(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE'), 'notice'); + } + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + $msg = JText::_('COM_REDSHOP_PRODUCT_DETAIL_DELETED_SUCCESSFULLY'); + + if (!$model->delete($cid)) + { + $msg = ""; + + if ($model->getError() != "") + { + $this->app->enqueueMessage($model->getError(), 'notice'); + } + } + + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + /** + * Publish task. + * + * @return void + */ + public function publish() + { + $cid = $this->input->post->get('cid', array(), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + $this->app->enqueueMessage(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH'), 'error'); + } + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_PRODUCT_DETAIL_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + /** + * Unpublish task. + * + * @return void + */ + public function unpublish() + { + $cid = $this->input->post->get('cid', array(), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + $this->app->enqueueMessage(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH'), 'error'); + } + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_PRODUCT_DETAIL_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + /** + * Unpublish cancel. + * + * @return void + */ + public function cancel() + { + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + $recordId = $this->input->get('cid'); + $model->checkin($recordId); + $msg = JText::_('COM_REDSHOP_PRODUCT_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + /** + * Save to Copy + * + * @return void + */ + public function save2copy() + { + $cid = $this->input->post->get('cid', array(), 'array'); + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + if ($row = $model->copy($cid, true)) + { + $this->setRedirect( + 'index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $row->product_id, + JText::_('COM_REDSHOP_PRODUCT_COPIED') + ); + } + else + { + $this->setRedirect( + 'index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $cid[0], + JText::_('COM_REDSHOP_ERROR_PRODUCT_COPIED') + ); + } + } + + /** + * Copy task. + * + * @return void + */ + public function copy() + { + $cid = $this->input->post->get('cid', array(), 'array'); + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + if ($model->copy($cid)) + { + $msg = JText::_('COM_REDSHOP_PRODUCT_COPIED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_PRODUCT_COPIED'); + } + + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + /** + * Function attribute_save. + * + * @param array $post Array of input data. + * @param object $row Array of row data. + * + * @return void + */ + public function attribute_save($post, $row) + { + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + + $attributesSave = array(); + $propertiesSave = array(); + $subPropertiesSave = array(); + + if (!is_array($post['attribute'])) + { + return; + } + + $attributes = array_merge(array(), $post['attribute']); + + foreach ($attributes as $a => $attribute) + { + $attributesSave['attribute_id'] = $attribute['id']; + $tmpordering = !empty($attribute['tmpordering']) ? $attribute['tmpordering'] : $a; + $attributesSave['product_id'] = $row->product_id; + $attributesSave['attribute_name'] = htmlspecialchars($attribute['name']); + $attributesSave['ordering'] = $attribute['ordering']; + $attributesSave['attribute_published'] = ($attribute['published'] == 'on' || $attribute['published'] == '1') ? '1' : '0'; + $attributesSave['attribute_description'] = $attribute['attribute_description']; + $attributesSave['attribute_required'] = isset($attribute['required']) && ($attribute['required'] == 'on' || $attribute['required'] == '1') ? '1' : '0'; + $attributesSave['allow_multiple_selection'] = isset($attribute['allow_multiple_selection']) && ($attribute['allow_multiple_selection'] == 'on' || $attribute['allow_multiple_selection'] == '1') ? '1' : '0'; + $attributesSave['hide_attribute_price'] = isset($attribute['hide_attribute_price']) && ($attribute['hide_attribute_price'] == 'on' || $attribute['hide_attribute_price'] == '1') ? '1' : '0'; + $attributesSave['display_type'] = $attribute['display_type']; + + $attribute_array = $model->store_attr($attributesSave); + $properties = array_merge(array(), $attribute['property']); + + $propertyImage = array_keys($attribute['property']); + $tmpproptyimagename = array_merge(array(), $propertyImage); + + foreach ($properties as $pIndex => $property) + { + $propertiesSave['property_id'] = $property['property_id']; + $propertiesSave['attribute_id'] = $attribute_array->attribute_id; + $propertiesSave['property_name'] = htmlspecialchars($property['name']); + $propertiesSave['property_price'] = $property['price']; + $propertiesSave['oprand'] = $property['oprand']; + $propertiesSave['property_number'] = isset($property['number']) ? $property['number'] : ''; + $propertiesSave['property_image'] = isset($property['property_image']) ? $property['property_image'] : ''; + $propertiesSave['ordering'] = $property['order']; + $propertiesSave['setrequire_selected'] = isset($property['req_sub_att']) + && ($property['req_sub_att'] == 'on' || $property['req_sub_att'] == '1') ? '1' : '0'; + $propertiesSave['setmulti_selected'] = isset($property['multi_sub_att']) + && ($property['multi_sub_att'] == 'on' || $property['multi_sub_att'] == '1') ? '1' : '0'; + $propertiesSave['setdefault_selected'] = !empty($property['default_sel']) && ($property['default_sel'] == 'on' || $property['default_sel'] == '1') ? '1' : '0'; + $propertiesSave['setdisplay_type'] = $property['setdisplay_type']; + $propertiesSave['property_published'] = ($property['published'] == 'on' || $property['published'] == '1') ? '1' : '0'; + $propertiesSave['extra_field'] = $property['extra_field']; + $property_array = $model->store_pro($propertiesSave); + $property_id = $property_array->property_id; + $property_image = $this->input->files->get('attribute_' . $tmpordering . '_property_' . $tmpproptyimagename[$pIndex] . '_image', array(), 'array'); + + if (empty($property['mainImage'])) + { + if (!empty($property_image['name'])) + { + $propertiesSave['property_image'] = $model->copy_image($property_image, 'product_attributes', $property_id); + $propertiesSave['property_id'] = $property_id; + $property_array = $model->store_pro($propertiesSave); + $this->DeleteMergeImages(); + } + } + + if (!empty($property['mainImage'])) + { + $propertiesSave['property_image'] = $model->copy_image_from_path($property['mainImage'], 'product_attributes', $property_id); + $propertiesSave['property_id'] = $property_id; + $property_array = $model->store_pro($propertiesSave); + $this->DeleteMergeImages(); + } + + if (empty($property['property_id'])) + { + $listImages = $model->getImageInfor($property_id, 'property'); + + for ($li = 0, $countImage = count($listImages); $li < $countImage; $li++) + { + $mImages = array(); + $mImages['media_name'] = $listImages[$li]->media_name; + $mImages['media_alternate_text'] = $listImages[$li]->media_alternate_text; + $mImages['media_section'] = 'property'; + $mImages['section_id'] = $property_id; + $mImages['media_type'] = 'images'; + $mImages['media_mimetype'] = $listImages[$li]->media_mimetype; + $mImages['published'] = $listImages[$li]->published; + $model->copyadditionalImage($mImages); + } + } + + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1 && Redshop::getConfig()->get('ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC') != 0) + { + RedshopEconomic::createPropertyInEconomic($row, $property_array); + } + + // Set trigger to save Attribute Property Plugin Data + if ((int) $property_id) + { + $dispatcher = RedshopHelperUtility::getDispatcher(); + JPluginHelper::importPlugin('redshop_product_type'); + + // Trigger the data preparation event. + $dispatcher->trigger('onAttributePropertySaveLoop', array($row, &$property, &$property_array)); + } + + $subproperty = array_merge(array(), $property['subproperty']); + $subproperty_title = $property['subproperty']['title']; + $subpropertyImage = array_keys($property['subproperty']); + unset($subpropertyImage[0]); + $tmpimagename = array_merge(array(), $subpropertyImage); + + for ($sp = 0; $sp < count($subproperty) - 1; $sp++) + { + $subPropertiesSave['subattribute_color_id'] = $subproperty[$sp]['subproperty_id']; + $subPropertiesSave['subattribute_color_name'] = $subproperty[$sp]['name']; + $subPropertiesSave['subattribute_color_title'] = $subproperty_title; + $subPropertiesSave['subattribute_color_price'] = $subproperty[$sp]['price']; + $subPropertiesSave['oprand'] = $subproperty[$sp]['oprand']; + $subPropertiesSave['subattribute_color_image'] = $subproperty[$sp]['image']; + $subPropertiesSave['subattribute_id'] = $property_id; + $subPropertiesSave['ordering'] = $subproperty[$sp]['order']; + $subPropertiesSave['subattribute_color_number'] = $subproperty[$sp]['number']; + $subPropertiesSave['setdefault_selected'] = ($subproperty[$sp]['chk_propdselected'] == 'on' + || $subproperty[$sp]['chk_propdselected'] == '1') ? '1' : '0'; + $subPropertiesSave['subattribute_published'] = ($subproperty[$sp]['published'] == 'on' + || $subproperty[$sp]['published'] == '1') ? '1' : '0'; + $subPropertiesSave['extra_field'] = $subproperty[$sp]['extra_field']; + $subproperty_array = $model->store_sub($subPropertiesSave); + $subproperty_image = $this->input->files->get('attribute_' . $tmpordering . '_property_' . $pIndex . '_subproperty_' . $tmpimagename[$sp] . '_image', + array(), + 'array' + ); + $subproperty_id = $subproperty_array->subattribute_color_id; + + if (empty($subproperty[$sp]['mainImage'])) + { + if (!empty($subproperty_image['name'])) + { + $subPropertiesSave['subattribute_color_image'] = $model->copy_image($subproperty_image, 'subcolor', $subproperty_id); + $subPropertiesSave['subattribute_color_id'] = $subproperty_id; + $subproperty_array = $model->store_sub($subPropertiesSave); + $this->DeleteMergeImages(); + } + } + + if (!empty($subproperty[$sp]['mainImage'])) + { + $subPropertiesSave['subattribute_color_image'] = $model->copy_image_from_path($subproperty[$sp]['mainImage'], 'subcolor', $subproperty_id); + $subPropertiesSave['subattribute_color_id'] = $subproperty_id; + $subproperty_array = $model->store_sub($subPropertiesSave); + $this->DeleteMergeImages(); + } + + if (empty($subproperty[$sp]['subproperty_id'])) + { + $listsubpropImages = $model->getImageInfor($subproperty_id, 'subproperty'); + $countSubpropertyImage = count($listsubpropImages); + + for ($lsi = 0; $lsi < $countSubpropertyImage; $lsi++) + { + $smImages = array(); + $smImages['media_name'] = $listsubpropImages[$lsi]->media_name; + $smImages['media_alternate_text'] = $listsubpropImages[$lsi]->media_alternate_text; + $smImages['media_section'] = 'subproperty'; + $smImages['section_id'] = $subproperty_id; + $smImages['media_type'] = 'images'; + $smImages['media_mimetype'] = $listsubpropImages[$lsi]->media_mimetype; + $smImages['published'] = $listsubpropImages[$lsi]->published; + $model->copyadditionalImage($smImages); + } + } + + if (Redshop::getConfig()->getInt('ECONOMIC_INTEGRATION') === 1 + && Redshop::getConfig()->getInt('ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC') !== 0) + { + RedshopEconomic::createSubpropertyInEconomic($row, $subproperty_array); + } + } + } + } + } + + /** + * Does something with image? + * + * @param int $width Width. + * @param int $height Height. + * @param string $target Target. + * + * @return array + */ + public function _imageResize($width, $height, $target) + { + if ($width > $height) + { + $percentage = ($target / $width); + } + else + { + $percentage = ($target / $height); + } + + $width = round($width * $percentage); + $height = round($height * $percentage); + + if ($width < 5) + { + $width = 50; + } + + if ($height < 5) + { + $height = 50; + } + + return array($width, $height); + } + + /** + * Function property_more_img. + * + * @return void + */ + public function property_more_img() + { + $uri = JURI::getInstance(); + + $url = $uri->root(); + + // ToDo: This is potentially unsafe because $_POST elements are not sanitized. + $post = $this->input->post->getArray(); + $main_img = $this->input->files->get('property_main_img', null); + $sub_img = $this->input->files->get('property_sub_img', null); + + $model = $this->getModel('product_detail'); + + $filetype = strtolower(JFile::getExt($main_img['name'])); + + $filetype_sub = strtolower(JFile::getExt($sub_img['name'][0])); + + if ($filetype != 'png' && $filetype != 'gif' && $filetype != 'jpeg' && $filetype != 'jpg' + && $main_img['name'] != '' && $filetype_sub != 'png' && $filetype_sub != 'gif' + && $filetype_sub != 'jpeg' && $filetype_sub != 'jpg' && $sub_img['name'][0] != '' + ) + { + $msg = JText::_("COM_REDSHOP_FILE_EXTENTION_WRONG_PROPERTY"); + $link = $url . "administrator/index.php?tmpl=component&option=com_redshop&view=product_detail§ion_id=" + . $post['section_id'] . "&cid=" . $post['cid'] . "&layout=property_images&showbuttons=1"; + $this->setRedirect($link, $msg); + } + else + { + $model->property_more_img($post, $main_img, $sub_img); + ?> + + root(); + + $mediaid = $this->input->getInt('mediaid', null); + $section_id = $this->input->getInt('section_id', null); + $cid = $this->input->getInt('cid', null); + + $model = $this->getModel('product_detail'); + + if ($model->deletesubimage($mediaid)) + { + $msg = JText::_("COM_REDSHOP_PROPERTY_SUB_IMAGE_IS_DELETE"); + $link = $url . "administrator/index.php?tmpl=component&option=com_redshop&view=product_detail§ion_id=" + . $section_id . "&cid=" . $cid . "&layout=property_images&showbuttons=1"; + $this->setRedirect($link, $msg); + } + } + + /** + * Function subattribute_color. + * + * @return void + */ + public function subattribute_color() + { + $post = $this->input->post->getArray(); + + $model = $this->getModel('product_detail'); + + $subattr_id = implode("','", $post['subattribute_color_id']); + + $subattr_diff = $model->subattr_diff($subattr_id, $post['section_id']); + + // Delete subAttribute Diffrence + $model->delsubattr_diff($subattr_diff); + + $sub_img = $this->input->files->get('property_sub_img', null); + + $model->subattribute_color($post, $sub_img); + + ?> + + input->get->getInt('pid', null); + + $model = $this->getModel('product_detail'); + + if ($model->removepropertyImage($pid)) + { + echo "sucess"; + } + } + + /** + * Function removesubpropertyImage. + * + * @return void + */ + public function removesubpropertyImage() + { + $pid = $this->input->get->getInt('pid', null); + + $model = $this->getModel('product_detail'); + + if ($model->removesubpropertyImage($pid)) + { + echo "sucess"; + } + } + + /** + * Function saveAttributeStock. + * + * @return void + */ + public function saveAttributeStock() + { + // ToDo: This is potentially unsafe because $_POST elements are not sanitized. + $post = $this->input->post->getArray(); + + $model = $this->getModel('product_detail'); + + if ($model->SaveAttributeStockroom($post)) + { + $msg = JText::_('COM_REDSHOP_STOCKROOM_ATTRIBUTE_XREF_SAVE'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_STOCKROOM_ATTRIBUTE_XREF'); + } + + $link = "index.php?tmpl=component&option=com_redshop&view=product_detail§ion_id=" . $post['section_id'] . "&cid=" + . $post['cid'] . "&layout=productstockroom&property=" . $post['section']; + $this->setRedirect($link, $msg); + } + + /** + * Function orderup. + * + * @return void + */ + public function orderup() + { + $model = $this->getModel('product_detail'); + + /** + * @var RedshopModelProduct_Detail $model + */ + $model->orderup(); + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + /** + * Function orderdown. + * + * @return void + */ + public function orderdown() + { + $model = $this->getModel('product_detail'); + + /** + * @var RedshopModelProduct_Detail $model + */ + $model->orderdown(); + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + /** + * Function saveorder. + * + * @return void + */ + public function saveorder() + { + $cid = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + $cid = ArrayHelper::toInteger($cid); + $order = ArrayHelper::toInteger($order); + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + $model->saveorder($cid, $order); + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + $this->setRedirect('index.php?option=com_redshop&view=product', $msg); + } + + /** + * Function deleteProdcutSerialNumbers. + * + * @return void + */ + public function deleteProdcutSerialNumbers() + { + $serial_id = $this->input->getInt('serial_id', null); + $product_id = $this->input->getInt('product_id', null); + + $model = $this->getModel('product_detail'); + $model->deleteProdcutSerialNumbers($serial_id); + + $msg = JText::_('COM_REDSHOP_PRODUCT_SERIALNUMBER_DELETED'); + $this->setRedirect('index.php?option=com_redshop&view=product_detail&cid=' . $product_id, $msg); + } + + /** + * Function delete_subprop. + * + * @return void + */ + public function delete_subprop() + { + $sp_id = $this->input->get->getInt('sp_id', null); + $subattribute_id = $this->input->get->getInt('subattribute_id', null); + + $model = $this->getModel('product_detail'); + $model->delete_subprop($sp_id, $subattribute_id); + } + + /** + * Function delete_prop. + * + * @return void + */ + public function delete_prop() + { + $attribute_id = $this->input->get->getInt('attribute_id', null); + $property_id = $this->input->get->getInt('property_id', null); + + $model = $this->getModel('product_detail'); + $model->delete_prop($attribute_id, $property_id); + } + + /** + * Function delete_attibute. + * + * @return void + */ + public function delete_attibute() + { + $product_id = $this->input->get->getInt('product_id', null); + $attribute_id = $this->input->get->getInt('attribute_id', null); + $attribute_set_id = $this->input->get->getInt('attribute_set_id', null); + + $model = $this->getModel('product_detail'); + $model->delete_attibute($product_id, $attribute_id, $attribute_set_id); + } + + /** + * Function checkVirtualNumber. + * + * @return void + */ + public function checkVirtualNumber() + { + $isExists = true; + $product_id = $this->input->getInt('product_id', null); + $str = $this->input->getString('str', ''); + $strArr = explode(",", $str); + $result = array_unique($strArr); + + if (count($result) > 0 && count($result) == count($strArr)) + { + $model = $this->getModel('product_detail'); + + /** + * @var RedshopModelProduct_Detail $model + */ + $isExists = $model->checkVirtualNumber($product_id, $result); + } + + echo (int) $isExists; + + \JFactory::getApplication()->close(); + } + + /** + * Function to get all child product array for ajax call. + * + * @return void + */ + public function getChildProducts() + { + \Redshop\Helper\Ajax::validateAjaxRequest('GET'); + + /** @var RedshopModelProduct_Detail $model */ + $model = $this->getModel('product_detail'); + $prod = $model->getChildProducts(); + + echo implode(",", $prod->id) . ":" . implode(",", $prod->name); + + JFactory::getApplication()->close(); + } + + /** + * Function removeaccesory. + * + * @return void + */ + public function removeaccesory() + { + $accessory_id = $this->input->getInt('accessory_id', null); + $category_id = $this->input->getInt('category_id', null); + $child_product_id = $this->input->getInt('child_product_id', null); + $model = $this->getModel('product_detail'); + $model->removeaccesory($accessory_id, $category_id, $child_product_id); + JFactory::getApplication()->close(); + } + + /** + * Function ResetPreorderStock. + * + * @return void + */ + public function ResetPreorderStock() + { + $model = $this->getModel('product_detail'); + $stockroom_type = $this->input->getString('stockroom_type', 'product'); + $pid = $this->input->getInt('product_id', null); + $sid = $this->input->getInt('stockroom_id', null); + + $model->ResetPreOrderStockroomQuantity($stockroom_type, $sid, $pid); + + $this->setRedirect('index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $pid); + } + + /** + * Function ResetPreorderStockBank. + * + * @return void + */ + public function ResetPreorderStockBank() + { + $model = $this->getModel('product_detail'); + $stockroom_type = $this->input->getString('stockroom_type', 'product'); + $section_id = $this->input->getInt('section_id', null); + $cid = $this->input->getInt('cid', null); + $sid = $this->input->getInt('stockroom_id', null); + + $model->ResetPreOrderStockroomQuantity($stockroom_type, $sid, $section_id); + + $link = "index.php?tmpl=component&option=com_redshop&view=product_detail§ion_id=" . $section_id . "&cid=" + . $cid . "&layout=productstockroom&property=" . $stockroom_type; + $this->setRedirect($link); + } + + /** + * Function getDynamicFields. + * + * @return void + */ + public function getDynamicFields() + { + $this->input->set('view', 'product_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + parent::display(); + } + + /** + * Function DeleteMergeImages. + * + * @return boolean + */ + public function DeleteMergeImages() + { + $dirname = REDSHOP_FRONT_IMAGES_RELPATH . "mergeImages"; + + if (!is_dir($dirname)) + { + return true; + } + + $dirHandle = opendir($dirname); + + if ($dirHandle === false) + { + return true; + } + + while ($file = readdir($dirHandle)) + { + if ($file == '..' || $file == '.' || $file == '' || $file == 'index.html') + { + continue; + } + + if (!JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "mergeImages/" . $file)) + { + continue; + } + + if (!is_writeable(REDSHOP_FRONT_IMAGES_RELPATH . "mergeImages/" . $file)) + { + chmod(REDSHOP_FRONT_IMAGES_RELPATH . "mergeImages/" . $file, 0777); + } + + JFile::delete(REDSHOP_FRONT_IMAGES_RELPATH . "mergeImages/" . $file); + } + + closedir($dirHandle); + + return true; + } + + /** + * Method for get all available product number + * + * @return void + * + * @since 2.0.4 + */ + public function ajaxGetAllProductNumber() + { + JSession::checkToken() or die('JINVALID_TOKEN'); + + $app = JFactory::getApplication(); + + echo json_encode(RedshopHelperProduct::getAllAvailableProductNumber($app->input->getInt('product_id', 0))); + + $app->close(); + } + + /** + * Method display product attribute + * + * @return void + * + * @since __DEPLOY_VERSION__ + */ + public function ajaxDisplayAttributeSet() + { + $post = $this->input->post->getArray(); + + if ($post['attribute_set']) + { + $attributes = \RedshopHelperProduct_Attribute::getProductAttribute(0, $post['attribute_set'], 0, 1, 0); + foreach ($attributes as $attribute) + { + $attribute->propeties = \RedshopHelperProduct_Attribute::getAttributeProperties(0, $attribute->attribute_id, 0); + + foreach ($attribute->propeties as $propety) + { + $propety->subProperties = \RedshopHelperProduct_Attribute::getAttributeSubProperties(0,$propety->property_id); + } + } + + $result = json_encode($attributes); + + echo $result; + } + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/product_price.php b/component/admin/controllers/product_price.php new file mode 100644 index 00000000000..d0a5ba56605 --- /dev/null +++ b/component/admin/controllers/product_price.php @@ -0,0 +1,163 @@ +setRedirect('index.php'); + } + + /** + * Listing method. + * + * @return void + * + * @since 2.0.6 + */ + public function listing() + { + $this->input->set('layout', 'listing'); + $this->input->set('hidemainmenu', 1); + + parent::display(); + } + + /** + * Method for save prices of products. + * + * @return void + * + * @since 1.6 + */ + public function saveprice() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $productId = $this->input->get('pid'); + $shopperGroupId = $this->input->post->get('shopper_group_id', array(), 'array'); + $prices = $this->input->post->get('price', array(), 'array'); + $priceQuantitiesStart = $this->input->post->get('price_quantity_start', array(), 'array'); + $priceQuantitiesEnd = $this->input->post->get('price_quantity_end', array(), 'array'); + $priceId = $this->input->post->get('price_id', array(), 'array'); + + $shopperGroupId = ArrayHelper::toInteger($shopperGroupId); + $priceQuantitiesStart = ArrayHelper::toInteger($priceQuantitiesStart); + $priceQuantitiesEnd = ArrayHelper::toInteger($priceQuantitiesEnd); + $priceId = ArrayHelper::toInteger($priceId); + + foreach ($prices as $i => $price) + { + // Check quantity start and end. + if ($priceQuantitiesStart[$i] > $priceQuantitiesEnd[$i]) + { + continue; + } + + $query->clear() + ->select('COUNT(*)') + ->from($db->qn('#__redshop_product_price')) + ->where($db->qn('product_id') . ' = ' . $productId) + ->where($db->qn('price_id') . ' = ' . $priceId[$i]) + ->where($db->qn('shopper_group_id') . ' = ' . $shopperGroupId[$i]); + $count = (int) $db->setQuery($query)->loadResult(); + + if ($count) + { + $query->clear() + ->select($db->qn('price_id')) + ->from($db->qn('#__redshop_product_price')) + ->where($db->qn('shopper_group_id') . ' = ' . $shopperGroupId[$i]) + ->where($db->qn('product_id') . ' = ' . $productId) + ->where($db->qn('price_quantity_end') . ' >= ' . $priceQuantitiesStart[$i]) + ->where($db->qn('price_quantity_start') . ' <= ' . $priceQuantitiesStart[$i]); + $xid = $db->setQuery($query)->loadResult(); + + if ($xid && $xid != $priceId[$i]) + { + echo $xid; + + $this->setError(JText::sprintf('WARNNAMETRYAGAIN', JText::_('COM_REDSHOP_PRICE_ALREADY_EXISTS'))); + } + + if (!empty($priceId[$i])) + { + $query->clear() + ->update($db->qn('#__redshop_product_price')) + ->set($db->qn('product_price') . ' = ' . $db->quote($price)) + ->set($db->qn('price_quantity_start') . ' = ' . $db->quote($priceQuantitiesStart[$i])) + ->set($db->qn('price_quantity_end') . ' = ' . $db->quote($priceQuantitiesEnd[$i])) + ->where($db->qn('product_id') . ' = ' . $productId) + ->where($db->qn('price_id') . ' = ' . $priceId[$i]) + ->where($db->qn('shopper_group_id') . ' = ' . $shopperGroupId[$i]); + } + else + { + $query->clear() + ->delete($db->qn('#__redshop_product_price')) + ->where($db->qn('product_id') . ' = ' . $productId) + ->where($db->qn('price_id') . ' = ' . $priceId[$i]) + ->where($db->qn('shopper_group_id') . ' = ' . $shopperGroupId[$i]); + } + } + elseif (!empty($price)) + { + $query->clear() + ->insert($db->qn('#__redshop_product_price')) + ->columns( + $db->qn(array('product_price', 'price_quantity_start', 'price_quantity_end', 'product_id', 'shopper_group_id')) + ) + ->values( + $price . ',' . $priceQuantitiesStart[$i] . ',' . $priceQuantitiesEnd[$i] . ',' . $productId . ',' . $shopperGroupId[$i] + ); + } + + $db->setQuery($query)->execute(); + } + + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=product_price&pid=' . $productId); + } + + /** + * Method for get template content + * + * @return void + * + * @since 1.6 + */ + public function template() + { + $templateId = $this->input->get('template_id', ''); + $productId = $this->input->get('product_id', ''); + $section = $this->input->get('section', ''); + $model = $this->getModel('product'); + + echo $model->product_template($templateId, $productId, $section); + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/producttags.php b/component/admin/controllers/producttags.php new file mode 100644 index 00000000000..e28b1bd21ce --- /dev/null +++ b/component/admin/controllers/producttags.php @@ -0,0 +1,19 @@ +setRedirect('index.php'); + } +} diff --git a/component/admin/controllers/producttags_detail.php b/component/admin/controllers/producttags_detail.php new file mode 100644 index 00000000000..6395d0e89e0 --- /dev/null +++ b/component/admin/controllers/producttags_detail.php @@ -0,0 +1,119 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'producttags_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + parent::display(); + } + + public function save() + { + $post = $this->input->post->getArray(); + $cid = $this->input->post->get('cid', array(0), 'array'); + $post ['tags_id'] = $cid[0]; + + /** @var RedshopModelProducttags_detail $model */ + $model = $this->getModel('producttags_detail'); + + if ($model->store($post)) + { + $msg = JText::_('COM_REDSHOP_TAGS_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_TAGS_DETAIL'); + } + + $this->setRedirect('index.php?option=com_redshop&view=producttags', $msg); + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelProducttags_detail $model */ + $model = $this->getModel('producttags_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_TAGS_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=producttags', $msg); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelProducttags_detail $model */ + $model = $this->getModel('producttags_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_TAGS_DETAIL_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=producttags', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelProducttags_detail $model */ + $model = $this->getModel('producttags_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_TAGS_DETAIL_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=producttags', $msg); + } + + public function cancel() + { + $msg = JText::_('COM_REDSHOP_TAGS_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=producttags', $msg); + } +} diff --git a/component/admin/controllers/question.php b/component/admin/controllers/question.php new file mode 100644 index 00000000000..88a120bd633 --- /dev/null +++ b/component/admin/controllers/question.php @@ -0,0 +1,198 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Save question + * + * @param integer $send Send Question? + * @param string $urlVar The name of the URL variable if different from the primary key (sometimes required to avoid router collisions). + * + * @todo I know, I know this is not a proper way. But we needs to move to form way. + * + * @return boolean True if successful, false otherwise. + */ + public function save($send = 0, $urlVar = null) + { + $post = $this->input->post->getArray(); + $data = $post['jform']; + $task = $post['task']; + + $model = $this->getModel('Question'); + + if ($data['id'] == 0) + { + $user = JFactory::getUser(); + + $data['user_name'] = $user->username; + $data['user_email'] = $user->email; + $data['question_date'] = time(); + $data['parent_id'] = 0; + } + + $row = $model->save($data); + + if ($row) + { + $msg = JText::_('COM_REDSHOP_QUESTION_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_QUESTION_DETAIL'); + } + + if ($send == 1) + { + Redshop\Mail\AskQuestion::sendMail($data['id']); + } + + if ($task == 'question.apply') + { + $questionId = $model->getState('question.id'); + $this->setRedirect('index.php?option=com_redshop&view=question&layout=edit&id=' . $questionId, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=questions', $msg); + } + } + + /** + * Send function + * + * @return void + */ + public function send() + { + $this->save(1); + } + + /** + * Remove function + * + * @return void + */ + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + $model = $this->getModel('Question'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_QUESTION_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=questions', $msg); + } + + /** + * Remove Answer function + * + * @return void + */ + public function removeAnswer() + { + $cid = $this->input->post->get('aid', array(0), 'array'); + $qid = $this->input->post->getInt('id', 0); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + $model = $this->getModel('Question'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_QUESTION_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&task=question.edit&id=' . $qid, $msg); + } + + /** + * Send Answer + * + * @return void + */ + public function sendAnswer() + { + $cid = $this->input->post->get('aid', array(0), 'array'); + $qid = $this->input->post->getInt('id', 0); + + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + Redshop\Mail\AskQuestion::sendMail($cid[$i]); + } + + $msg = JText::_('COM_REDSHOP_ANSWER_MAIL_SENT'); + $this->setRedirect('index.php?option=com_redshop&task=question.edit&id=' . $qid, $msg); + } + + /** + * logic for save an order + * + * @access public + * @return void + */ + public function saveorder() + { + $cid = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + + $cid = ArrayHelper::toInteger($cid); + $order = ArrayHelper::toInteger($order); + + /** @var RedshopModelQuestion $model */ + $model = $this->getModel('Question'); + + $model->saveorder($cid, $order); + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + $this->setRedirect('index.php?option=com_redshop&view=questions', $msg); + } +} diff --git a/component/admin/controllers/questions.php b/component/admin/controllers/questions.php new file mode 100644 index 00000000000..8372acc74dc --- /dev/null +++ b/component/admin/controllers/questions.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/quotation.php b/component/admin/controllers/quotation.php new file mode 100644 index 00000000000..0d2d8d6bacc --- /dev/null +++ b/component/admin/controllers/quotation.php @@ -0,0 +1,20 @@ +setRedirect('index.php'); + } +} diff --git a/component/admin/controllers/quotation_detail.php b/component/admin/controllers/quotation_detail.php new file mode 100644 index 00000000000..67480c14144 --- /dev/null +++ b/component/admin/controllers/quotation_detail.php @@ -0,0 +1,219 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'quotation_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function apply() + { + $this->save(0, 1); + } + + public function save($send = 0, $apply = 0) + { + $post = $this->input->post->getArray(); + $status = $post['quotation_status']; + $cid = $this->input->post->get('cid', array(0), 'array'); + + $post['quotation_id'] = $cid [0]; + + /** @var RedshopModelQuotation_detail $model */ + $model = $this->getModel('quotation_detail'); + + if ($post['quotation_id'] == 0) + { + $post['quotation_cdate'] = time(); + $post['quotation_encrkey'] = RedshopHelperQuotation::randomQuotationEncryptKey(); + } + + if ($post['user_id'] == 0 && $post['quotation_email'] == "") + { + $msg = JText::_('COM_REDSHOP_CREATE_ACCOUNT_FOR_QUOTATION'); + $this->setRedirect('index.php?option=com_redshop&view=quotation_detail&task=edit&cid[]=' . $post['quotation_id'], $msg); + } + + $quotation_item = array(); + $i = 0; + + foreach ($post as $key => $value) + { + if (!isset($quotation_item[$i])) + { + $quotation_item[$i] = new stdClass; + } + + if (!strcmp("quotation_item_id", substr($key, 0, 17))) + { + $quotation_item[$i]->quotation_item_id = $value; + } + + if (!strcmp("product_excl_price", substr($key, 0, 18))) + { + $quotation_item[$i]->product_excl_price = $value; + } + + if (!strcmp("product_price", substr($key, 0, 13))) + { + $quotation_item[$i]->product_price = $value; + } + + if (!strcmp("quantity", substr($key, 0, 8)) && strlen($key) < 12) + { + $quotation_item[$i]->product_quantity = $value; + $quotation_item[$i]->product_final_price = $quotation_item[$i]->product_price * $quotation_item[$i]->product_quantity; + $i++; + } + } + + $post['quotation_item'] = $quotation_item; + $row = $model->store($post); + + if ($status == 5 && empty($post['order_id'])) + { + $model->storeOrder($post); + } + + if ($row) + { + $msg = JText::_('COM_REDSHOP_QUOTATION_DETAIL_SAVED'); + + $quotation_status = $post['quotation_status'] > 0 ? $post['quotation_status'] : 2; + RedshopHelperQuotation::updateQuotationStatus($row->quotation_id, $quotation_status); + + if ($send == 1) + { + if ($model->sendQuotationMail($row->quotation_id) && JFactory::getConfig()->get('mailonline') == 1) + { + $msg = JText::_('COM_REDSHOP_QUOTATION_DETAIL_SENT'); + } + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=quotation_detail&task=edit&cid[]=' . $row->quotation_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=quotation', $msg); + } + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_QUOTATION_DETAIL'); + $this->setRedirect('index.php?option=com_redshop&view=quotation', $msg); + } + } + + public function send() + { + $this->save(1); + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelQuotation_detail $model */ + $model = $this->getModel('quotation_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_QUOTATION_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=quotation', $msg); + } + + public function deleteitem() + { + $qitemid = $this->input->getInt('qitemid', 0); + $cid = $this->input->get('cid', array(0), 'array'); + + /** @var RedshopModelQuotation_detail $model */ + $model = $this->getModel('quotation_detail'); + + if (!$model->deleteitem($qitemid, $cid[0])) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_QUOTATION_ITEM_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=quotation_detail&task=edit&cid[]=' . $cid[0], $msg); + } + + public function cancel() + { + $msg = JText::_('COM_REDSHOP_QUOTATION_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=quotation', $msg); + } + + public function newQuotationItem() + { + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + + /** @var RedshopModelQuotation_detail $model */ + $model = $this->getModel('quotation_detail'); + + $quotationItem = Redshop\Order\Helper::redesignProductItem($post); + + $post['quotation_item'] = $quotationItem; + + if ($model->newQuotationItem($post)) + { + $msg = JText::_('COM_REDSHOP_QUOTATION_ITEM_ADDED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_ADDING_QUOTATION_ITEM'); + } + + $this->setRedirect('index.php?option=com_redshop&view=quotation_detail&cid[]=' . $cid[0], $msg); + } + + public function getQuotationPriceTax() + { + $get = $this->input->get->getArray(); + $product_id = $get['product_id']; + $user_id = $get['user_id']; + $newprice = $get['newprice']; + $vatprice = 0; + + if ($newprice > 0) + { + $vatprice = RedshopHelperProduct::getProductTax($product_id, $newprice, $user_id); + } + + echo '
    ' . $vatprice . '
    '; + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/rating.php b/component/admin/controllers/rating.php new file mode 100644 index 00000000000..2c0e382d67a --- /dev/null +++ b/component/admin/controllers/rating.php @@ -0,0 +1,136 @@ +setRedirect('index.php'); + } + + /** + * Method to publish a list of items + * + * @return void + * + * @since 11.1 + */ + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelRating_detail $model */ + $model = $this->getModel('rating_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_RATING_DETAIL_PUBLISHED_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=rating', $msg); + } + + /** + * Method to unpublish a list of items + * + * @return void + * + * @since 11.1 + */ + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelRating_detail $model */ + $model = $this->getModel('rating_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_RATING_DETAIL_UNPUBLISHED_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=rating', $msg); + } + + /** + * Method to favour a list of rating items + * + * @return void + * + * @since 11.1 + */ + public function fv_publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + $model = $this->getModel('rating_detail'); + + if (!$model->favoured($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_RATING_DETAIL_PUBLISHED_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=rating', $msg); + } + + /** + * Method to disfavour a list of rating items + * + * @return void + * + * @since 11.1 + */ + public function fv_unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + $model = $this->getModel('rating_detail'); + + if (!$model->favoured($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_RATING_DETAIL_UNPUBLISHED_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=rating', $msg); + } +} diff --git a/component/admin/controllers/rating_detail.php b/component/admin/controllers/rating_detail.php new file mode 100644 index 00000000000..dbe1b906b94 --- /dev/null +++ b/component/admin/controllers/rating_detail.php @@ -0,0 +1,87 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'rating_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + $model = $this->getModel('rating_detail'); + $userslist = $model->getuserslist(); + $this->input->set('userslist', $userslist); + + $product = $model->getproducts(); + $this->input->set('product', $product); + + parent::display(); + } + + public function save() + { + $post = $this->input->post->getArray(); + $comment = $this->input->post->get('comment', '', 'raw'); + $post["comment"] = $comment; + + $cid = $this->input->post->get('cid', array(0), 'array'); + + $post ['rating_id'] = $cid [0]; + + /** @var RedshopModelRating_detail $model */ + $model = $this->getModel('rating_detail'); + + if ($model->store($post)) + { + $msg = JText::_('COM_REDSHOP_RATING_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_RATING_DETAIL'); + } + + $this->setRedirect('index.php?option=com_redshop&view=rating', $msg); + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelRating_detail $model */ + $model = $this->getModel('rating_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_RATING_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=rating', $msg); + } + + public function cancel() + { + $msg = JText::_('COM_REDSHOP_RATING_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=rating', $msg); + } +} diff --git a/component/admin/controllers/redshop.php b/component/admin/controllers/redshop.php new file mode 100644 index 00000000000..8d4f549a72c --- /dev/null +++ b/component/admin/controllers/redshop.php @@ -0,0 +1,43 @@ +getModel('redshop'); + + $model->demoContentInsert(); + $msg = JText::_('COM_REDSHOP_SAMPLE_DATA_INSTALLED'); + + $this->setRedirect('index.php?option=com_redshop', $msg); + } + + /** + * Get default configuration file back + * + * @since 1.7 + * + * @return void + */ + public function getDefaultConfig() + { + $app = JFactory::getApplication(); + + if (!Redshop::getConfig()->loadDist()) + { + $app->enqueueMessage(JText::_('LIB_REDSHOP_ERROR_WRITE_FAILED'), 'error'); + } + + $app->redirect('index.php?option=com_redshop'); + } +} diff --git a/component/admin/controllers/sample.php b/component/admin/controllers/sample.php new file mode 100644 index 00000000000..0d7448394da --- /dev/null +++ b/component/admin/controllers/sample.php @@ -0,0 +1,63 @@ +setRedirect('index.php'); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelSample_detail $model */ + $model = $this->getModel('sample_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SAMPLE_DETAIL_PUBLISHED_SUCCESFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=sample', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelSample_detail $model */ + $model = $this->getModel('sample_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SAMPLE_DETAIL_UNPUBLISHED_SUCCESFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=sample', $msg); + } +} diff --git a/component/admin/controllers/sample_catalog.php b/component/admin/controllers/sample_catalog.php new file mode 100644 index 00000000000..01ecea418eb --- /dev/null +++ b/component/admin/controllers/sample_catalog.php @@ -0,0 +1,22 @@ +input->set('view', 'sample_catalog'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + } +} diff --git a/component/admin/controllers/sample_detail.php b/component/admin/controllers/sample_detail.php new file mode 100644 index 00000000000..4e13a03d8ff --- /dev/null +++ b/component/admin/controllers/sample_detail.php @@ -0,0 +1,125 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'sample_detail'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function save() + { + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + + $post ['sample_id'] = $cid [0]; + $link = 'index.php?option=com_redshop&view=sample'; + + /** @var RedshopModelSample_detail $model */ + $model = $this->getModel('sample_detail'); + + if ($model->store($post)) + { + $msg = JText::_('COM_REDSHOP_SAMPLE_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_SAMPLE_DETAIL'); + } + + $this->setRedirect($link, $msg); + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelSample_detail $model */ + $model = $this->getModel('sample_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SAMPLE_DETAIL_DELETED_SUCCESSFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=sample', $msg); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelSample_detail $model */ + $model = $this->getModel('sample_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SAMPLE_DETAIL_PUBLISHED_SUCCESFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=sample', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelSample_detail $model */ + $model = $this->getModel('sample_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SAMPLE_DETAIL_UNPUBLISHED_SUCCESFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=sample', $msg); + } + + public function cancel() + { + + $msg = JText::_('COM_REDSHOP_SAMPLE_DETAIL_EDITING_CANCELLED'); + + $this->setRedirect('index.php?option=com_redshop&view=sample', $msg); + } +} diff --git a/component/admin/controllers/sample_request.php b/component/admin/controllers/sample_request.php new file mode 100644 index 00000000000..c30efb951eb --- /dev/null +++ b/component/admin/controllers/sample_request.php @@ -0,0 +1,82 @@ +setRedirect('index.php'); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelSample_request $model */ + $model = $this->getModel('sample_request'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SAMPLE_REQUEST_BLOCK_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=sample_request', $msg); + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelSample_request $model */ + $model = $this->getModel('sample_request'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SAMPLE_REQUEST_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=sample_request', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelSample_request $model */ + $model = $this->getModel('sample_request'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SAMPLE_REQUEST_BLOCK_UNBLOCK_SUCCESFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=sample_request', $msg); + } +} diff --git a/component/admin/controllers/search.json.php b/component/admin/controllers/search.json.php new file mode 100644 index 00000000000..0fc983449ed --- /dev/null +++ b/component/admin/controllers/search.json.php @@ -0,0 +1,31 @@ +getModel('search')->search(); + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/search.php b/component/admin/controllers/search.php new file mode 100644 index 00000000000..2cd522e8783 --- /dev/null +++ b/component/admin/controllers/search.php @@ -0,0 +1,39 @@ +setRedirect('index.php'); + } + + /** + * AJAX Task to get states list + * + * @return string JSON encoded string of states list. + */ + public function getStatesAjax() + { + // Only verify token + \Redshop\Helper\Ajax::validateAjaxRequest('get'); + + $app = JFactory::getApplication(); + + ob_clean(); + + echo RedshopHelperWorld::getStatesAjax($app->input->getCmd('country')); + + $app->close(); + } +} + diff --git a/component/admin/controllers/shipping.php b/component/admin/controllers/shipping.php new file mode 100644 index 00000000000..ddd296cf409 --- /dev/null +++ b/component/admin/controllers/shipping.php @@ -0,0 +1,152 @@ +get('ECONOMIC_INTEGRATION') == 1) + { + $query = "SELECT s.*, r.* FROM #__redshop_shipping_rate r " + . "LEFT JOIN #__extensions s ON r.shipping_class = s.element " + . "WHERE s.enabled=1 and s.folder='redshop_shipping'"; + + $db->setQuery($query); + $shipping = $db->loadObjectList(); + + for ($i = 0, $in = count($shipping); $i < $in; $i++) + { + $shipping_nshortname = (strlen($shipping[$i]->name) > 15) ? substr($shipping[$i]->name, 0, 15) : $shipping[$i]->name; + $shipping_number = $shipping_nshortname . ' ' . $shipping[$i]->shipping_rate_id; + $shipping_name = $shipping[$i]->shipping_rate_name; + $shipping_rate = $shipping[$i]->shipping_rate_value; + + if ($shipping[$i]->economic_displayname) + { + $shipping_number = $shipping[$i]->economic_displayname; + } + + Redshop\Economic\RedshopEconomic::createShippingRateInEconomic( + $shipping_number, $shipping_name, $shipping_rate, + $shipping[$i]->apply_vat + ); + } + } + + $msg = JText::_("COM_REDSHOP_IMPORT_RATES_TO_ECONOMIC_SUCCESS"); + $this->setRedirect('index.php?option=com_redshop&view=shipping', $msg); + } + + /** + * logic for save an order + * + * @access public + * @return void + */ + public function saveorder() + { + $cid = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + + $cid = ArrayHelper::toInteger($cid); + $order = ArrayHelper::toInteger($order); + + /** @var RedshopModelShipping $model */ + $model = $this->getModel('shipping'); + + $model->saveOrder($cid, $order); + + $msg = JText::_('COM_REDSHOP_SHIPPING_SAVED'); + $this->setRedirect('index.php?option=com_redshop&view=shipping', $msg); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelShipping_detail $model */ + $model = $this->getModel('shipping_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $this->setRedirect('index.php?option=com_redshop&view=shipping', JText::_('COM_REDSHOP_SHIPPING_PUBLISHED_SUCCESSFULLY')); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelShipping_detail $model */ + $model = $this->getModel('shipping_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $this->setRedirect('index.php?option=com_redshop&view=shipping', JText::_('COM_REDSHOP_SHIPPING_UNPUBLISHED_SUCCESSFULLY')); + } + + /** + * logic for orderup + * + * @access public + * @return void + */ + public function orderup() + { + /** @var RedshopModelShipping_detail $model */ + $model = $this->getModel('shipping_detail'); + $model->move(-1); + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + $this->setRedirect('index.php?option=com_redshop&view=shipping', $msg); + } + + /** + * logic for orderdown + * + * @access public + * @return void + */ + public function orderdown() + { + /** @var RedshopModelShipping_detail $model */ + $model = $this->getModel('shipping_detail'); + $model->move(1); + + $msg = JText::_('COM_REDSHOP_NEW_ORDERING_SAVED'); + $this->setRedirect('index.php?option=com_redshop&view=shipping', $msg); + } +} diff --git a/component/admin/controllers/shipping_box.php b/component/admin/controllers/shipping_box.php new file mode 100644 index 00000000000..d33430f0347 --- /dev/null +++ b/component/admin/controllers/shipping_box.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/shipping_boxes.php b/component/admin/controllers/shipping_boxes.php new file mode 100644 index 00000000000..e2f6256a4a5 --- /dev/null +++ b/component/admin/controllers/shipping_boxes.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/shipping_detail.php b/component/admin/controllers/shipping_detail.php new file mode 100644 index 00000000000..926d0d770fc --- /dev/null +++ b/component/admin/controllers/shipping_detail.php @@ -0,0 +1,65 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'shipping_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + + /** @var RedshopModelShipping_detail $model */ + $model = $this->getModel('shipping_detail'); + $row = $model->store($post); + + if ($row) + { + $msg = JText::_('COM_REDSHOP_SHIPPING_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_shipping'); + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=shipping_detail&task=edit&cid[]=' . $post['extension_id'], $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=shipping', $msg); + } + } + + public function cancel() + { + $this->setRedirect('index.php?option=com_redshop&view=shipping'); + } +} diff --git a/component/admin/controllers/shipping_rate.php b/component/admin/controllers/shipping_rate.php new file mode 100644 index 00000000000..8da207596b3 --- /dev/null +++ b/component/admin/controllers/shipping_rate.php @@ -0,0 +1,20 @@ +input; + $this->setRedirect('index.php?option=com_redshop&view=shipping_detail&task=edit&cid[]=' . $input->getInt('id', 0)); + } +} diff --git a/component/admin/controllers/shipping_rate_detail.php b/component/admin/controllers/shipping_rate_detail.php new file mode 100644 index 00000000000..e4451a9ebea --- /dev/null +++ b/component/admin/controllers/shipping_rate_detail.php @@ -0,0 +1,178 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'shipping_rate_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + + // Include extra field class + + $post['shipping_rate_on_product'] = explode(',', $post['container_product']); + $post["shipping_location_info"] = $this->input->post->get('shipping_location_info', '', 'raw'); + + /** @var RedshopModelShipping_rate_detail $model */ + $model = $this->getModel('shipping_rate_detail'); + + if ($row = $model->store($post)) + { + // Field_section 11 :Shipping + RedshopHelperExtrafields::extraFieldSave($post, "11", $row->shipping_rate_id); + $msg = JText::_('COM_REDSHOP_SHIPPING_LOCATION_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_SHIPPING'); + } + + if ($apply) + { + $this->setRedirect('index.php?option=com_redshop&view=shipping_rate_detail&cid=' . $row->shipping_rate_id + . '&id=' . $post['id'], $msg + ); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=shipping_rate&id=' . $post['id'], $msg); + } + } + + public function remove() + { + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + $count = count($cid); + + /** @var RedshopModelShipping_rate_detail $model */ + $model = $this->getModel('shipping_rate_detail'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + if (!$model->delete($cid)) + { + echo "\n"; + } + elseif ($count > 0) + { + $this->setMessage(JText::plural('COM_REDSHOP_N_ITEMS_DELETED', $count)); + } + else + { + $this->setMessage(JText::_('COM_REDSHOP_N_ITEMS_DELETED_1')); + } + + $this->setRedirect('index.php?option=com_redshop&view=shipping_rate&id=' . $post['id']); + } + + public function publish() + { + + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelShipping_rate_detail $model */ + $model = $this->getModel('shipping_rate_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $this->setRedirect('index.php?option=com_redshop&view=shipping_rate'); + } + + public function unpublish() + { + + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelShipping_rate_detail $model */ + $model = $this->getModel('shipping_rate_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $this->setRedirect('index.php?option=com_redshop&view=shipping_rate'); + } + + public function cancel() + { + $post = $this->input->post->getArray(); + + $this->setRedirect('index.php?option=com_redshop&view=shipping_rate&id=' . $post['id']); + } + + public function copy() + { + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + + /** @var RedshopModelShipping_rate_detail $model */ + $model = $this->getModel('shipping_rate_detail'); + + if ($model->copy($cid)) + { + $msg = JText::_('COM_REDSHOP_SHIPPING_RATE_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_SHIPPING'); + } + + $this->setRedirect('index.php?option=com_redshop&view=shipping_rate&id=' . $post['id'], $msg); + } + + public function GetStateDropdown() + { + $get = $this->input->get->getArray(); + /** @var RedshopModelShipping_rate_detail $model */ + $model = $this->getModel('shipping_rate_detail'); + $model->GetStateDropdown($get); + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/shopper_group.php b/component/admin/controllers/shopper_group.php new file mode 100644 index 00000000000..69cf7cdcf2e --- /dev/null +++ b/component/admin/controllers/shopper_group.php @@ -0,0 +1,61 @@ +setRedirect('index.php'); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelShopper_group_detail $model */ + $model = $this->getModel('shopper_group_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SHOPPER_GROUP_DETAIL_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=shopper_group', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelShopper_group_detail $model */ + $model = $this->getModel('shopper_group_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SHOPPER_GROUP_DETAIL_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=shopper_group', $msg); + } +} diff --git a/component/admin/controllers/shopper_group_detail.php b/component/admin/controllers/shopper_group_detail.php new file mode 100644 index 00000000000..ea6d6d1c332 --- /dev/null +++ b/component/admin/controllers/shopper_group_detail.php @@ -0,0 +1,128 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'shopper_group_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + public function save($apply = 0) + { + $cid = $this->input->post->get('cid', array(0), 'array'); + $post = $this->input->post->getArray(); + $post["shopper_group_introtext"] = $this->input->post->get('shopper_group_introtext', '', 'raw'); + $post["shopper_group_desc"] = $this->input->post->get('shopper_group_desc', '', 'raw'); + $post["shopper_group_url"] = ""; + $post["shopper_group_id"] = $cid [0]; + + if (isset($post['shopper_group_categories']) && count($post['shopper_group_categories']) > 0) + { + $post["shopper_group_categories"] = implode(",", $post['shopper_group_categories']); + } + else + { + $post["shopper_group_categories"] = ""; + } + + if (isset($post['shopper_group_manufactures']) && count($post['shopper_group_manufactures']) > 0) + { + $post["shopper_group_manufactures"] = implode(",", $post['shopper_group_manufactures']); + } + else + { + $post["shopper_group_manufactures"] = ""; + } + + /** @var RedshopModelShopper_group_detail $model */ + $model = $this->getModel('shopper_group_detail'); + $row = $model->store($post); + + if ($row) + { + $msg = JText::_('COM_REDSHOP_SHOPPER_GROUP_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_SHOPPER_GROUP_DETAIL'); + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=shopper_group_detail&cid[]=' . $row->shopper_group_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=shopper_group', $msg); + } + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + if (!is_array($cid) && ($cid == 1 || $cid == 2)) + { + $msg = JText::_('COM_REDSHOP_DEFAULT_SHOPPER_GROUP_CAN_NOT_BE_DELETED'); + } + elseif (in_array(1, $cid)) + { + $msg = JText::_('COM_REDSHOP_DEFAULT_SHOPPER_GROUP_CAN_NOT_BE_DELETED'); + } + elseif (in_array(2, $cid)) + { + $msg = JText::_('COM_REDSHOP_DEFAULT_SHOPPER_GROUP_CAN_NOT_BE_DELETED'); + } + else + { + /** @var RedshopModelShopper_group_detail $model */ + $model = $this->getModel('shopper_group_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_SHOPPER_GROUP_DETAIL_DELETED_SUCCESSFULLY'); + } + + $this->setRedirect('index.php?option=com_redshop&view=shopper_group', $msg); + } + + public function cancel() + { + $msg = JText::_('COM_REDSHOP_SHOPPER_GROUP_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=shopper_group', $msg); + } +} diff --git a/component/admin/controllers/state.php b/component/admin/controllers/state.php new file mode 100644 index 00000000000..81022b9e509 --- /dev/null +++ b/component/admin/controllers/state.php @@ -0,0 +1,67 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Method for get list of state base on specific country value. + * + * @return void + * @throws Exception + * + * @since 2.0.3 + */ + public function ajaxGetState() + { + \Redshop\Helper\Ajax::validateAjaxRequest(); + + $app = JFactory::getApplication(); + + $country = $app->input->getString('country', ''); + $html = RedshopHelperWorld::getStateList(array('country_code' => $country), 'jform[tax_state]', 'BT', 'form-control', 'state_3_code'); + + if (!empty($html)) + { + echo $html['state_dropdown']; + } + else + { + echo ''; + } + + $app->close(); + } +} diff --git a/component/admin/controllers/states.php b/component/admin/controllers/states.php new file mode 100644 index 00000000000..cc01ef04e48 --- /dev/null +++ b/component/admin/controllers/states.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/statistic.php b/component/admin/controllers/statistic.php new file mode 100644 index 00000000000..7293b12b086 --- /dev/null +++ b/component/admin/controllers/statistic.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/statistic_customer.php b/component/admin/controllers/statistic_customer.php new file mode 100644 index 00000000000..2b9cce67f89 --- /dev/null +++ b/component/admin/controllers/statistic_customer.php @@ -0,0 +1,54 @@ +getModel(); + $data = $model->getItems(); + $productHelper = productHelper::getInstance(); + + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Content-type: text/x-csv"); + header("Content-type: text/csv"); + header("Content-type: application/csv"); + header('Content-Disposition: attachment; filename=Customer.csv'); + + ob_clean(); + + echo "Name, Email, Order count, Total sale\n"; + + foreach ($data as $value) + { + echo trim($value->customer_name) . ","; + echo trim($value->user_email) . ","; + echo $value->count . ","; + echo $productHelper->getProductFormattedPrice($value->total_sale) . "\n"; + } + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/statistic_order.php b/component/admin/controllers/statistic_order.php new file mode 100644 index 00000000000..868c819b405 --- /dev/null +++ b/component/admin/controllers/statistic_order.php @@ -0,0 +1,140 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Export orders CSV. + * + * @return mixed. + * + * @since 2.0.0.3 + */ + public function exportOrder() + { + $productHelper = productHelper::getInstance(); + $model = $this->getModel(); + $data = $model->exportOrder(); + $noProducts = $model->countProductByOrder(); + $productCount = array(); + + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Content-type: text/x-csv"); + header("Content-type: text/csv"); + header("Content-type: application/csv"); + header('Content-Disposition: attachment; filename=Order.csv'); + + for ($i = 0, $in = count($data); $i < $in; $i++) + { + $productCount[] = $noProducts [$i]->noproduct; + } + + $noProducts = max($productCount); + + ob_clean(); + + echo "Order number, Order status, Order date , Shipping method , Shipping user, Shipping address,"; + echo "Shipping postalcode,Shipping city, Shipping country, Company name, Email ,Billing address,"; + echo "Billing postalcode, Billing city, Billing country,Billing User ,"; + + for ($i = 1; $i <= $noProducts; $i++) + { + echo JText::_('COM_REDSHOP_PRODUCT_NAME') . $i . ' ,'; + echo JText::_('COM_REDSHOP_PRODUCT') . ' ' . JText::_('COM_REDSHOP_PRODUCT_PRICE') . $i . ' ,'; + echo JText::_('COM_REDSHOP_PRODUCT_ATTRIBUTE') . $i . ' ,'; + } + + echo "Order Total\n"; + + for ($i = 0, $in = count($data); $i < $in; $i++) + { + $billingInfo = RedshopHelperOrder::getOrderBillingUserInfo($data[$i]->order_id); + $details = Redshop\Shipping\Rate::decrypt($data[$i]->ship_method_id); + + echo $data [$i]->order_id . ","; + echo utf8_decode(RedshopHelperOrder::getOrderStatusTitle($data [$i]->order_status)) . " ,"; + echo date('d-m-Y H:i', $data[$i]->cdate) . " ,"; + + if (empty($details)) + { + echo str_replace(",", " ", $details[1]) . "(" . str_replace(",", " ", $details[2]) . ") ,"; + } + else + { + echo ''; + } + + $shippingInfo = RedshopHelperOrder::getOrderShippingUserInfo($data[$i]->order_id); + + echo str_replace(",", " ", $shippingInfo->firstname) . " " . str_replace(",", " ", $shippingInfo->lastname) . " ,"; + echo str_replace(",", " ", utf8_decode($shippingInfo->address)) . " ,"; + echo $shippingInfo->zipcode . " ,"; + echo str_replace(",", " ", utf8_decode($shippingInfo->city)) . " ,"; + echo $shippingInfo->country_code . " ,"; + echo str_replace(",", " ", $shippingInfo->company_name) . " ,"; + echo $shippingInfo->user_email . " ,"; + + echo str_replace(",", " ", utf8_decode($billingInfo->address)) . " ,"; + echo $billingInfo->zipcode . " ,"; + echo str_replace(",", " ", utf8_decode($billingInfo->city)) . " ,"; + echo $billingInfo->country_code . " ,"; + echo str_replace(",", " ", $billingInfo->firstname) . " " . str_replace(",", " ", $billingInfo->lastname) . " ,"; + + $noItems = RedshopHelperOrder::getOrderItemDetail($data[$i]->order_id); + + for ($it = 0, $countItem = count($noItems); $it < $countItem; $it++) + { + echo str_replace(",", " ", utf8_decode($noItems[$it]->order_item_name)) . " ,"; + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . " " . $noItems[$it]->product_final_price . ","; + + $productAttribute = $productHelper->makeAttributeOrder($noItems[$it]->order_item_id, 0, $noItems[$it]->product_id, 0, 1); + $productAttribute = strip_tags(str_replace(",", " ", $productAttribute->product_attribute)); + echo trim(utf8_decode($productAttribute)) . " ,"; + } + + $temp = $noProducts - count($noItems); + + if ($temp >= 0) + { + echo str_repeat(' ,', $temp * 3); + } + + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . " " . $data [$i]->order_total . "\n"; + } + + exit(); + } +} diff --git a/component/admin/controllers/statistic_product.php b/component/admin/controllers/statistic_product.php new file mode 100644 index 00000000000..aa8e6e1c2c2 --- /dev/null +++ b/component/admin/controllers/statistic_product.php @@ -0,0 +1,74 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Export products CSV. + * + * @return mixed. + * + * @since 2.0.0.3 + */ + public function exportProduct() + { + $productHelper = productHelper::getInstance(); + $model = $this->getModel(); + $data = $model->getItems(); + + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Content-type: text/x-csv"); + header("Content-type: text/csv"); + header("Content-type: application/csv"); + header('Content-Disposition: attachment; filename=Product.csv'); + + ob_clean(); + + echo "Date, Product name, Product SKU, Product manufacturer, Unit sold, Total sale\n"; + + foreach ($data as $key => $value) + { + echo date("Y-m-d", $value->order_create_date) . " ,"; + echo $value->product_name . " ,"; + echo $value->product_number . " ,"; + echo $value->manufacturer_name . " ,"; + echo $value->unit_sold . " ,"; + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . ' ' . $value->total_sale . "\n"; + } + + exit(); + } +} diff --git a/component/admin/controllers/statistic_quotation.php b/component/admin/controllers/statistic_quotation.php new file mode 100644 index 00000000000..fc8ba056920 --- /dev/null +++ b/component/admin/controllers/statistic_quotation.php @@ -0,0 +1,71 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Export customers CSV. + * + * @return mixed. + * + * @since 2.0.0.3 + */ + public function exportQuotation() + { + $productHelper = productHelper::getInstance(); + $model = $this->getModel(); + $data = $model->getQuotations(); + + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Content-type: text/x-csv"); + header("Content-type: text/csv"); + header("Content-type: application/csv"); + header('Content-Disposition: attachment; filename=Quotation.csv'); + + ob_clean(); + + echo "Date, Quotation count, Total sale\n"; + + foreach ($data as $key => $value) + { + echo $value->viewdate . " ,"; + echo $value->count . " ,"; + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . ' ' . $value->quotation_total . "\n"; + } + + exit(); + } +} diff --git a/component/admin/controllers/statistic_variant.php b/component/admin/controllers/statistic_variant.php new file mode 100644 index 00000000000..24c6f2b9ee6 --- /dev/null +++ b/component/admin/controllers/statistic_variant.php @@ -0,0 +1,74 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Export product variants CSV. + * + * @return mixed. + * + * @since 2.0.0.3 + */ + public function exportProductVariant() + { + $productHelper = productHelper::getInstance(); + $model = $this->getModel(); + $data = $model->getProductVariants(); + + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Content-type: text/x-csv"); + header("Content-type: text/csv"); + header("Content-type: application/csv"); + header('Content-Disposition: attachment; filename=ProductVariant.csv'); + + ob_clean(); + + echo "Date, Product name, Product attributes, Product attribute SKU, Unit sold, Total sale\n"; + + foreach ($data as $key => $value) + { + echo $value->viewdate . " ,"; + echo $value->product_name . " ,"; + echo $value->section_name . " ,"; + echo $value->property_number . " ,"; + echo $value->unit_sold . " ,"; + echo Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . ' ' . $value->total_sale . "\n"; + } + + exit(); + } +} diff --git a/component/admin/controllers/stockimage.php b/component/admin/controllers/stockimage.php new file mode 100644 index 00000000000..de500d47b0e --- /dev/null +++ b/component/admin/controllers/stockimage.php @@ -0,0 +1,19 @@ +setRedirect('index.php'); + } +} diff --git a/component/admin/controllers/stockimage_detail.php b/component/admin/controllers/stockimage_detail.php new file mode 100644 index 00000000000..1662e07aa3d --- /dev/null +++ b/component/admin/controllers/stockimage_detail.php @@ -0,0 +1,77 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'stockimage_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function save() + { + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + $post ['stock_amount_id'] = $cid [0]; + + /** @var RedshopModelStockimage_detail $model */ + $model = $this->getModel('stockimage_detail'); + + if ($model->store($post)) + { + $msg = JText::_('COM_REDSHOP_STOCKIMAGE_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_STOCKIMAGE_DETAIL'); + } + + $this->setRedirect('index.php?option=com_redshop&view=stockimage', $msg); + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelStockimage_detail $model */ + $model = $this->getModel('stockimage_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_STOCKIMAGE_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=stockimage', $msg); + } + + public function cancel() + { + $msg = JText::_('COM_REDSHOP_STOCKIMAGE_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=stockimage', $msg); + } +} diff --git a/component/admin/controllers/stockroom.php b/component/admin/controllers/stockroom.php new file mode 100644 index 00000000000..0c75e14c230 --- /dev/null +++ b/component/admin/controllers/stockroom.php @@ -0,0 +1,106 @@ +setRedirect('index.php'); + } + + public function listing() + { + $this->setRedirect('index.php?option=com_redshop&view=stockroom_listing&id=0'); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelStockroom_detail $model */ + $model = $this->getModel('stockroom_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_STOCK_ROOM_DETAIL_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=stockroom', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelStockroom_detail $model */ + $model = $this->getModel('stockroom_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_STOCK_ROOM_DETAIL_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=stockroom', $msg); + } + + public function frontpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + $model = $this->getModel('stockroom_detail'); + + if (!$model->frontpublish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_STOCK_ROOM_DETAIL_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=stockroom', $msg); + } + + public function frontunpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + $model = $this->getModel('stockroom_detail'); + + if (!$model->frontpublish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_STOCK_ROOM_DETAIL_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=stockroom', $msg); + } +} diff --git a/component/admin/controllers/stockroom_detail.php b/component/admin/controllers/stockroom_detail.php new file mode 100644 index 00000000000..b06c41e768a --- /dev/null +++ b/component/admin/controllers/stockroom_detail.php @@ -0,0 +1,194 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'stockroom_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function preview() + { + $this->input->set('view', 'stockroom_detail'); + $this->input->set('layout', 'default_product'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + public function save($apply = 0) + { + $post = $this->input->post->getArray(); + $stockroom_desc = $this->input->post->get('stockroom_desc', '', 'raw'); + $post["stockroom_desc"] = $stockroom_desc; + + if ($post["delivery_time"] == 'Weeks') + { + $post["min_del_time"] = $post["min_del_time"] * 7; + $post["max_del_time"] = $post["max_del_time"] * 7; + } + + $cid = $this->input->post->get('cid', array(0), 'array'); + $post ['stockroom_id'] = $cid [0]; + $post ['creation_date'] = strtotime($post ['creation_date']); + + /** @var RedshopModelStockroom_detail $model */ + $model = $this->getModel('stockroom_detail'); + $post['stockroom_name'] = htmlspecialchars($post['stockroom_name']); + + if ($row = $model->store($post)) + { + $msg = JText::_('COM_REDSHOP_STOCKROOM_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_STOCKROOM_DETAIL'); + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=stockroom_detail&task=edit&cid[]=' . $row->stockroom_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=stockroom', $msg); + } + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelStockroom_detail $model */ + $model = $this->getModel('stockroom_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_STOCK_ROOM_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=stockroom', $msg); + } + + public function cancel() + { + $msg = JText::_('COM_REDSHOP_STOCK_ROOM_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=stockroom', $msg); + } + + public function copy() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + /** @var RedshopModelStockroom_detail $model */ + $model = $this->getModel('stockroom_detail'); + + if ($model->copy($cid)) + { + $msg = JText::_('COM_REDSHOP_STOCK_ROOM_DETAIL_COPIED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_COPING_STOCKROOM_DETAIL'); + } + + $this->setRedirect('index.php?option=com_redshop&view=stockroom', $msg); + } + + public function importStockFromEconomic() + { + // Add product stock from economic + $cnt = $this->input->getInt('cnt', 0); + $stockroom_id = $this->input->getInt('stockroom_id', 0); + $totalprd = 0; + $msg = ''; + + if (Redshop::getConfig()->getInt('ECONOMIC_INTEGRATION') == 1) + { + $db = JFactory::getDbo(); + $incNo = $cnt; + $query = 'SELECT p.* FROM #__redshop_product AS p LIMIT ' . $cnt . ', 10 '; + + $db->setQuery($query); + $prd = $db->loadObjectlist(); + $totalprd = count($prd); + $responcemsg = ''; + + for ($i = 0, $in = count($prd); $i < $in; $i++) + { + $incNo++; + $ecoProductNumber = RedshopEconomic::importStockFromEconomic($prd[$i]); + $responcemsg .= "
    " . $incNo . ": " . JText::_('COM_REDSHOP_PRODUCT_NUMBER') . " " . $prd[$i]->product_number . " -> "; + + if (count($ecoProductNumber) > 0 && isset($ecoProductNumber[0])) + { + $query = "UPDATE #__redshop_product_stockroom_xref " + . "SET quantity='" . $ecoProductNumber[0] . "' " + . "WHERE product_id='" . $prd[$i]->product_id . "' " + . "AND stockroom_id='" . $stockroom_id . "' "; + $db->setQuery($query); + $db->execute(); + $responcemsg .= "" . JText::_('COM_REDSHOP_IMPORT_STOCK_FROM_ECONOMIC_SUCCESS') . ""; + } + else + { + $errmsg = JText::_('COM_REDSHOP_ERROR_IN_IMPORT_STOCK_FROM_ECONOMIC'); + + if (JError::isError(JError::getError())) + { + $error = JError::getError(); + $errmsg = $error->getMessage(); + } + + $responcemsg .= "" . $errmsg . ""; + } + + $responcemsg .= "
    "; + } + + if ($totalprd > 0) + { + $msg = $responcemsg; + } + else + { + $msg = JText::_("COM_REDSHOP_IMPORT_STOCK_FROM_ECONOMIC_IS_COMPLETED"); + } + } + + echo "
    " . $totalprd . "`_`" . $msg . "
    "; + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/controllers/stockroom_listing.php b/component/admin/controllers/stockroom_listing.php new file mode 100644 index 00000000000..0139b9e9a47 --- /dev/null +++ b/component/admin/controllers/stockroom_listing.php @@ -0,0 +1,54 @@ +getModel('stockroom_listing'); + $stockroom_type = $this->input->post->getString('stockroom_type', 'product'); + + $pid = $this->input->post->get('pid', array(0), 'array'); + $sid = $this->input->post->get('sid', array(0), 'array'); + $quantity = $this->input->post->get('quantity', array(0), 'array'); + $preorder_stock = $this->input->post->get('preorder_stock', array(0), 'array'); + $ordered_preorder = $this->input->post->get('ordered_preorder', array(0), 'post', 'array'); + + for ($i = 0, $in = count($sid); $i < $in; $i++) + { + $model->storeStockroomQuantity($stockroom_type, $sid[$i], $pid[$i], $quantity[$i], $preorder_stock[$i], $ordered_preorder[$i]); + } + + $this->setRedirect('index.php?option=com_redshop&view=stockroom_listing&id=0&stockroom_type=' . $stockroom_type); + } + + public function ResetPreorderStock() + { + $model = $this->getModel('stockroom_listing'); + $stockroom_type = $this->input->get('stockroom_type', 'product'); + $pid = $this->input->get('product_id'); + $sid = $this->input->get('stockroom_id'); + + $model->ResetPreOrderStockroomQuantity($stockroom_type, $sid, $pid); + + $this->setRedirect('index.php?option=com_redshop&view=stockroom_listing&id=0&stockroom_type=' . $stockroom_type); + } + + public function print_data() + { + echo ''; + } +} diff --git a/component/admin/controllers/supplier.php b/component/admin/controllers/supplier.php new file mode 100644 index 00000000000..0e572e6b43c --- /dev/null +++ b/component/admin/controllers/supplier.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/suppliers.php b/component/admin/controllers/suppliers.php new file mode 100644 index 00000000000..9dfd9a32369 --- /dev/null +++ b/component/admin/controllers/suppliers.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/tax_group.php b/component/admin/controllers/tax_group.php new file mode 100644 index 00000000000..fbcd273ea5b --- /dev/null +++ b/component/admin/controllers/tax_group.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/tax_groups.php b/component/admin/controllers/tax_groups.php new file mode 100644 index 00000000000..1c665b2c75c --- /dev/null +++ b/component/admin/controllers/tax_groups.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/tax_rate.php b/component/admin/controllers/tax_rate.php new file mode 100644 index 00000000000..ec35153f865 --- /dev/null +++ b/component/admin/controllers/tax_rate.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/tax_rates.php b/component/admin/controllers/tax_rates.php new file mode 100644 index 00000000000..8320ef4ed85 --- /dev/null +++ b/component/admin/controllers/tax_rates.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/template.php b/component/admin/controllers/template.php new file mode 100644 index 00000000000..e564f9be123 --- /dev/null +++ b/component/admin/controllers/template.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/templates.php b/component/admin/controllers/templates.php new file mode 100644 index 00000000000..bcf2942edf1 --- /dev/null +++ b/component/admin/controllers/templates.php @@ -0,0 +1,67 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Method to clone an existing supplier. + * + * @return void + * + * @since 2.0.0.6 + */ + public function duplicate() + { + // Check for request forgeries + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + + $pks = $this->input->post->get('cid', array(), 'array'); + $pks = \Joomla\Utilities\ArrayHelper::toInteger($pks); + + try + { + $model = $this->getModel(); + $model->duplicate($pks); + $this->setMessage(JText::plural('COM_REDSHOP_N_SUPPLIERS_DUPLICATED', count($pks))); + } + catch (Exception $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + + $this->setRedirect('index.php?option=com_redshop&view=templates'); + } +} diff --git a/component/admin/controllers/text.php b/component/admin/controllers/text.php new file mode 100644 index 00000000000..831b6189d04 --- /dev/null +++ b/component/admin/controllers/text.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/texts.php b/component/admin/controllers/texts.php new file mode 100644 index 00000000000..0b79132a17f --- /dev/null +++ b/component/admin/controllers/texts.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/tool_image.php b/component/admin/controllers/tool_image.php new file mode 100644 index 00000000000..1a4085f0e94 --- /dev/null +++ b/component/admin/controllers/tool_image.php @@ -0,0 +1,165 @@ + $folder) + { + if ($folder == 'tmp') + { + unset($folders[$index]); + + continue; + } + + $files = JFolder::files(REDSHOP_FRONT_IMAGES_RELPATH . $folder); + + foreach ($files as $key => $file) + { + if ($file == 'index.html') + { + unset($files[$key]); + + continue; + } + + $images[] = REDSHOP_FRONT_IMAGES_RELPATH . $folder . '/' . $file; + } + } + + JFactory::getApplication()->setUserState('com_redshop.tools.images', $images); + + echo JText::sprintf('COM_REDSHOP_TOOLS_IMAGES_COUNT', count($images)); + + JFactory::getApplication()->close(); + } + + /** + * Method for get overall image files. + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function cleanThumbFolders() + { + JSession::checkToken() or jexit(JText::_('INVALID_TOKEN')); + + $results = array(); + + // Folder + $folders = JFolder::folders(REDSHOP_FRONT_IMAGES_RELPATH); + + foreach ($folders as $index => $folder) + { + if ($folder == 'tmp') + { + unset($folders[$index]); + + continue; + } + + $subFolders = JFolder::folders(REDSHOP_FRONT_IMAGES_RELPATH . '/' . $folder); + + foreach ($subFolders as $subFolder) + { + if ($subFolder != 'thumb') + { + continue; + } + + JFolder::delete(JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . '/' . $folder . '/thumb')); + JFolder::create(JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . '/' . $folder . '/thumb')); + JFile::copy( + REDSHOP_FRONT_IMAGES_RELPATH . '/index.html', + REDSHOP_FRONT_IMAGES_RELPATH . '/' . $folder . '/thumb/index.html' + ); + $results[] = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . '/' . $folder . '/thumb'); + } + } + + echo json_encode($results); + + JFactory::getApplication()->close(); + } + + /** + * Method for process image checks. + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function processImageCheck() + { + JSession::checkToken() or jexit(JText::_('INVALID_TOKEN')); + + $app = JFactory::getApplication(); + $files = $app->getUserState('com_redshop.tools.images', array()); + $file = array_shift($files); + + if (empty($file)) + { + $results = array('status' => 1, 'msg' => JText::_('COM_REDSHOP_TOOLS_IMAGES_DONE')); + $app->setUserState('com_redshop.tools.images', null); + } + else + { + if (JFile::exists($file) && RedshopHelperMedia::isImage($file)) + { + $maxWidth = Redshop::getConfig()->getInt('IMAGE_MAX_WIDTH', 2048); + $maxHeight = Redshop::getConfig()->getInt('IMAGE_MAX_HEIGHT', 2048); + + list($width, $height, $type, $attr) = getimagesize($file); + + if ($width >= $maxWidth || $height >= $maxHeight) + { + RedshopHelperMedia::resizeImage( + $file, $maxWidth, $maxHeight, Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'), 'file', false + ); + } + } + + $results = array('status' => 2, 'msg' => $file); + $app->setUserState('com_redshop.tools.images', $files); + } + + echo json_encode($results); + + $app->close(); + } +} diff --git a/component/admin/controllers/tool_update.php b/component/admin/controllers/tool_update.php new file mode 100644 index 00000000000..30abf0e3a94 --- /dev/null +++ b/component/admin/controllers/tool_update.php @@ -0,0 +1,261 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Method for run ajax process. + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + public function ajaxProcess() + { + \Redshop\Helper\Ajax::validateAjaxRequest(); + $app = JFactory::getApplication(); + + $remainingTasks = RedshopInstall::getRemainingTasks(); + + if (empty($remainingTasks)) + { + $app->sendHeaders(); + echo json_encode((object) array('msg' => JText::_('COM_REDSHOP_INSTALL_STEP_SUCCESS'), 'continue' => 0)); + $app->close(); + } + + $return = array('msg' => '', 'continue' => 0); + $currentTask = array_shift($remainingTasks); + + // Check process param + if (empty($currentTask) || !isset($currentTask['func'])) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + echo JText::_('COM_REDSHOP_INSTALL_ERROR_MISSING_PROCESS'); + $app->close(); + } + + $process = $currentTask['func']; + $isStatic = false; + $className = ''; + $method = ''; + + // Static call + if (false !== strpos($process, '::')) + { + $process = explode('::', $process); + $className = $process[0]; + $method = $process[1]; + $isStatic = true; + } + elseif (false !== strpos($process, '.')) + { + $process = explode('.', $process); + $className = $process[0]; + $method = $process[1]; + } + + // Load class if path has been provided + if (isset($currentTask['path'])) + { + require_once $currentTask['path']; + } + + // Check class exist. + if (!class_exists($className)) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + echo JText::sprintf('COM_REDSHOP_INSTALL_ERROR_MISSING_CLASS', $className); + $app->close(); + } + + // Check method exist in class + if (!method_exists($className, $method)) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + echo JText::sprintf('COM_REDSHOP_INSTALL_ERROR_MISSING_METHOD_IN_CLASS', $className, $method); + $app->close(); + } + + try + { + if ($isStatic) + { + call_user_func(array($className, $method)); + } + else + { + $class = new $className; + call_user_func(array($class, $method)); + } + } + catch (Exception $error) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + echo $error->getMessage(); + $app->close(); + } + + if (empty($remainingTasks)) + { + $app->setUserState(RedshopInstall::REDSHOP_INSTALL_STATE_NAME, null); + } + else + { + $app->setUserState(RedshopInstall::REDSHOP_INSTALL_STATE_NAME, $remainingTasks); + $return['continue'] = 1; + } + + $app->sendHeaders(); + $return['msg'] = JText::_('COM_REDSHOP_INSTALL_STEP_SUCCESS'); + echo json_encode((object) $return); + $app->close(); + } + + /** + * Method for run migrate file function. + * + * @return void + * @throws Exception + */ + public function ajaxMigrateFiles() + { + \Redshop\Helper\Ajax::validateAjaxRequest(); + $app = JFactory::getApplication(); + $version = $this->input->getString('version', ''); + + if (empty($version)) + { + $app->sendHeaders(); + echo json_encode((object) array('msg' => JText::_('COM_REDSHOP_TOOL_AJAX_ERROR_VERSION_NOT_FOUND'), 'continue' => 0)); + $app->close(); + } + + $tasks = RedshopInstall::getUpdateTasks($version); + + if (!empty($tasks)) + { + $versionTasks = array(); + + foreach ($tasks->tasks as $task) + { + $versionTasks[] = array('func' => $task['func'], 'path' => $tasks->path); + } + + $app->setUserState(RedshopInstall::REDSHOP_INSTALL_STATE_NAME, $versionTasks); + } + else + { + $app->setUserState(RedshopInstall::REDSHOP_INSTALL_STATE_NAME, null); + } + + $app->sendHeaders(); + echo json_encode($tasks); + $app->close(); + } + + /** + * Method for run migrate file function. + * + * @return void + * @throws Exception + */ + public function ajaxRunUpdateSql() + { + \Redshop\Helper\Ajax::validateAjaxRequest(); + $app = JFactory::getApplication(); + $version = $this->input->getString('version', ''); + $file = JPath::clean(JPATH_COMPONENT_ADMINISTRATOR . '/sql/updates/mysql/' . $version . '.sql'); + + if (empty($version) || !JFile::exists($file)) + { + $app->sendHeaders(); + echo json_encode((object) array('msg' => JText::_('COM_REDSHOP_TOOL_AJAX_ERROR_VERSION_NOT_FOUND'), 'continue' => 0)); + $app->close(); + } + + $buffer = file_get_contents(JPATH_COMPONENT_ADMINISTRATOR . '/sql/updates/mysql/' . $version . '.sql'); + + // Graceful exit and rollback if read not successful + if (false === $buffer) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + echo JText::_('JLIB_INSTALLER_ERROR_SQL_READBUFFER'); + $app->close(); + } + + // Create an array of queries from the sql file + $queries = JDatabaseDriver::splitSql($buffer); + + if (count($queries) === 0) + { + // No queries to process + $app->sendHeaders(); + echo json_encode((object) array('msg' => JText::_('COM_REDSHOP_TOOL_UPDATE_DB_MIGRATE_SUCCESS'), 'continue' => 0)); + $app->close(); + } + + $db = JFactory::getDbo(); + + // Process each query in the $queries array (split out of sql file). + foreach ($queries as $query) + { + $db->setQuery($db->convertUtf8mb4QueryToUtf8($query)); + + try + { + $db->execute(); + } + catch (JDatabaseExceptionExecuting $e) + { + $app->setHeader('status', 500); + $app->sendHeaders(); + echo JText::sprintf('JLIB_INSTALLER_ERROR_SQL_ERROR', $e->getMessage()); + $app->close(); + } + } + + $app->sendHeaders(); + echo json_encode((object) array('msg' => JText::_('COM_REDSHOP_TOOL_UPDATE_DB_MIGRATE_SUCCESS'), 'continue' => 0)); + $app->close(); + } +} diff --git a/component/admin/controllers/user.php b/component/admin/controllers/user.php new file mode 100644 index 00000000000..307c2d83eb9 --- /dev/null +++ b/component/admin/controllers/user.php @@ -0,0 +1,19 @@ +setRedirect('index.php'); + } +} diff --git a/component/admin/controllers/user_detail.php b/component/admin/controllers/user_detail.php new file mode 100644 index 00000000000..c2a5a924d12 --- /dev/null +++ b/component/admin/controllers/user_detail.php @@ -0,0 +1,260 @@ +registerTask('add', 'edit'); + $this->_table_prefix = '#__redshop_'; + $this->redhelper = redhelper::getInstance(); + } + + public function edit() + { + $this->input->set('view', 'user_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + public function save($apply = 0) + { + $app = JFactory::getApplication(); + $post = $this->input->post->getArray(); + + /** @var RedshopModelUser_detail $model */ + $model = $this->getModel('user_detail'); + $shipping = isset($post["shipping"]) ? true : false; + $app->setUserState('com_redshop.user_detail.data', $post); + + if ($row = $model->store($post)) + { + $this->setMessage(JText::_('COM_REDSHOP_USER_DETAIL_SAVED')); + $app->setUserState('com_redshop.fields_detail.data', ""); + $app->setUserState('com_redshop.user_detail.data', ""); + } + else + { + $this->setMessage(JText::_('COM_REDSHOP_ERROR_SAVING_USER_DETAIL'), 'error'); + } + + if ($shipping) + { + $info_id = $this->input->getString('info_id', ''); + if ($apply == 1) + { + $link = 'index.php?option=com_redshop&view=user_detail&task=edit&shipping=1&info_id=' . $info_id . '&cid[]=' . $row->users_info_id; + } + else + { + $link = 'index.php?option=com_redshop&view=user_detail&task=edit&cancel=1&cid[]=' . $info_id; + } + } + else + { + if ($apply == 1) + { + $link = RedshopHelperUtility::getSSLLink( + 'index.php?option=com_redshop&view=user_detail&task=edit&cid[]=' . $row->users_info_id + ); + + if ($this->input->post->get('add_shipping') != null) + { + $link = RedshopHelperUtility::getSSLLink( + 'index.php?option=com_redshop&view=user_detail&task=edit&shipping=1&info_id=' . $row->users_info_id . '&cid[]=0' + ); + } + } + else + { + $link = RedshopHelperUtility::getSSLLink('index.php?option=com_redshop&view=user', 0); + } + } + + $this->setRedirect($link); + } + + public function remove() + { + $shipping = $this->input->getString('shipping', ''); + $cid = $this->input->get('cid', array(0), 'array'); + $delete_joomla_users = $this->input->getBool('delete_joomla_users', false); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelUser_detail $model */ + $model = $this->getModel('user_detail'); + + if (!$model->delete($cid, $delete_joomla_users)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_USER_DETAIL_DELETED_SUCCESSFULLY'); + + if ($shipping) + { + $info_id = $this->input->getInt('info_id'); + $this->setRedirect('index.php?option=com_redshop&view=user_detail&task=edit&cancel=1&cid[]=' . $info_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=user', $msg); + } + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelUser_detail $model */ + $model = $this->getModel('user_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_USER_DETAIL_PUBLISHED_SUCCESSFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=user', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelUser_detail $model */ + $model = $this->getModel('user_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_USER_DETAIL_UNPUBLISHED_SUCCESSFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=user', $msg); + } + + /** + * Cancel edit user_detail + * + * @return void + * + * @since version + */ + public function cancel() + { + $shipping = $this->input->getString('shipping', ''); + $info_id = $this->input->getString('info_id', ''); + JFactory::getApplication()->setUserState('com_redshop.user_detail.data', ""); + + if ($shipping) + { + $link = 'index.php?option=com_redshop&view=user_detail&task=edit&cancel=1&cid[]=' . $info_id; + } + else + { + $link = 'index.php?option=com_redshop&view=user'; + } + + // Not to apply ssl (passed Zero) + $link = RedshopHelperUtility::getSSLLink($link, 0); + $this->setRedirect($link); + } + + public function order() + { + $user_id = $this->input->getInt('user_id', 0); + $this->setRedirect('index.php?option=com_redshop&view=addorder_detail&user_id=' . $user_id); + } + + public function validation() + { + $json = $this->input->get('json', ''); + $decoded = json_decode($json); + + /** @var RedshopModelUser_detail $model */ + $model = $this->getModel('user_detail'); + + $username = $model->validate_user($decoded->username, $decoded->userid); + $email = $model->validate_email($decoded->email, $decoded->userid); + $json = array(); + $json['ind'] = $decoded->ind; + $json['username'] = $username; + $json['email'] = $email; + $encoded = json_encode($json); + die($encoded); + } + + /** + * Validate username method + * + * @return void + * + * @since 2.0.0.4 + */ + public function ajaxValidationUsername() + { + \Redshop\Helper\Ajax::validateAjaxRequest('get'); + + $username = $this->input->getString('username', ''); + $user_id = $this->input->getInt('user_id', 0); + + /** @var RedshopModelUser_detail $model */ + $model = $this->getModel('user_detail'); + $usernameAvailability = $model->validate_user($username, $user_id); + + $message = JText::_('COM_REDSHOP_USERNAME_IS_AVAILABLE'); + $type = "success"; + + if ($usernameAvailability > 0) + { + $message = JText::_('COM_REDSHOP_USERNAME_NOT_AVAILABLE'); + $type = "error"; + } + + if ($username == "") + { + $message = JText::_('COM_REDSHOP_YOU_MUST_PROVIDE_LOGIN_NAME'); + $type = "error"; + } + + $result = array(); + $result['type'] = $type; + $result['message'] = $message; + + $result = json_encode($result); + die($result); + } +} diff --git a/component/admin/controllers/voucher.php b/component/admin/controllers/voucher.php new file mode 100644 index 00000000000..cf689296be1 --- /dev/null +++ b/component/admin/controllers/voucher.php @@ -0,0 +1,38 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } +} diff --git a/component/admin/controllers/vouchers.php b/component/admin/controllers/vouchers.php new file mode 100644 index 00000000000..498da78bd16 --- /dev/null +++ b/component/admin/controllers/vouchers.php @@ -0,0 +1,62 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + /** + * Method to publish a list of items + * + * @return void + * + * @throws Exception + */ + public function ajaxInlineEdit() + { + $editData = $this->input->get('jform_inline', array(), 'ARRAY'); + $app = JFactory::getApplication(); + + foreach ($editData as $data) + { + if ($data['amount'] <= 0 || empty($data['amount'])) + { + echo 0; + $app->close(); + } + } + + parent::ajaxInlineEdit(); + } +} diff --git a/component/admin/controllers/wizard.php b/component/admin/controllers/wizard.php new file mode 100644 index 00000000000..6c5fee0aa22 --- /dev/null +++ b/component/admin/controllers/wizard.php @@ -0,0 +1,163 @@ +_temp_file_dist = JPATH_COMPONENT_ADMINISTRATOR . '/config/config.dist.php'; + $this->_temp_file = JPATH_COMPONENT_ADMINISTRATOR . '/config/config.php'; + + JFile::copy($this->_temp_file_dist, $this->_temp_file); + } + + /** + * Save configuration + */ + public function save() + { + // Get temporary saved config via wizard + $session = JFactory::getSession(); + $wizardConfig = $session->get('redshop.wizard'); + + // Get submit data + $post = $this->input->post->getArray(); + $go = $post['go']; + + $substep = $post['substep']; + + if ($substep == 2) + { + $country_list = $this->input->get('country_list'); + + $i = 0; + $country_listCode = ''; + + if ($country_list) + { + foreach ($country_list as $value) + { + $country_listCode .= $value; + $i++; + + if ($i < count($country_list)) + { + $country_listCode .= ','; + } + } + } + + $post['country_list'] = $country_listCode; + } + + // Convert post data key to uppercase. Because we'll use uppercase in config file + foreach ($post as $key => $value) + { + $post[strtoupper($key)] = $value; + unset($post[$key]); + } + + // Merge with saved config + $post = array_merge($wizardConfig, $post); + + // Save back to session + $session->set('redshop.wizard', $post); + + if ($go == 'pre') + { + $substep = $substep - 2; + } + + if ($post['VATREMOVE'] == 1) + { + $tax_rate_id = $post['VATTAX_RATE_ID']; + $vatlink = 'index.php?option=com_redshop&view=tax_detail&task=removefromwizrd&cid[]=' . $tax_rate_id . '&tax_group_id=1'; + + $this->setRedirect($vatlink); + } + else + { + $link = 'index.php?option=com_redshop&step=' . $substep; + $this->setRedirect($link); + } + } + + /** + * Final step and finish wizard + */ + public function finish() + { + $session = JFactory::getSession(); + + $msg = ""; + + $post = JFactory::getApplication()->input->post->getArray(); + + /** + * install sample data + */ + if (isset($post['installcontent'])) + { + if ($this->demoContentInsert()) + { + $msg .= JText::_('COM_REDSHOP_SAMPLE_DATA_INSTALLED') . "
              "; + } + } + + // Convert array to JRegistry before saving + $configHelper = Redshop::getConfig(); + $config = new Registry; + $config->loadArray($session->get('redshop.wizard')); + + if ($configHelper->save($config)) + { + // Clear temporary redshop wizard configuration + $session->clear('redshop.wizard'); + + $msg .= JText::_('COM_REDSHOP_FINISH_WIZARD'); + + $link = 'index.php?option=com_redshop'; + } + else + { + $substep = 4; + $msg .= JText::_('COM_REDSHOP_ERROR_SAVING_DETAIL'); + + $link = 'index.php?option=com_redshop&step=' . $substep; + } + + $this->setRedirect($link, $msg); + } + + public function demoContentInsert() + { + /** @var RedshopModelRedshop $model */ + $model = $this->getModel('redshop', 'redshopModel'); + + if (!$model->demoContentInsert()) + { + return false; + } + + return true; + } +} diff --git a/component/admin/controllers/wrapper.php b/component/admin/controllers/wrapper.php new file mode 100644 index 00000000000..2fb0913bd17 --- /dev/null +++ b/component/admin/controllers/wrapper.php @@ -0,0 +1,192 @@ + true)) + { + $model = parent::getModel($name, $prefix, $config); + + return $model; + } + + public function cancel() + { + $this->setRedirect('index.php'); + } + + public function remove() + { + $showall = $this->input->get('showall', '0'); + $tmpl = ''; + + if ($showall) + { + $tmpl = '&tmpl=component'; + } + + $product_id = $this->input->get('product_id'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + $model = $this->getModel('wrapper_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_WRAPPER_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=wrapper&showall=' . $showall . $tmpl . '&product_id=' . $product_id, $msg); + } + + /** + * logic for publish + * + * @access public + * @return void + */ + public function publish() + { + $showall = $this->input->get('showall', '0'); + $tmpl = ''; + + if ($showall) + { + $tmpl = '&tmpl=component'; + } + + $product_id = $this->input->get('product_id'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + $model = $this->getModel('wrapper_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_WRAPPER_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=wrapper&showall=' . $showall . $tmpl . '&product_id=' . $product_id, $msg); + } + + /** + * logic for unpublish + * + * @access public + * @return void + */ + public function unpublish() + { + $showall = $this->input->get('showall', '0'); + $tmpl = ''; + + if ($showall) + { + $tmpl = '&tmpl=component'; + } + + $product_id = $this->input->get('product_id'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + $model = $this->getModel('wrapper_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_WRAPPER_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=wrapper&showall=' . $showall . $tmpl . '&product_id=' . $product_id, $msg); + } + + public function enable_defaultpublish() + { + $showall = $this->input->get('showall', '0'); + $tmpl = ''; + + if ($showall) + { + $tmpl = '&tmpl=component'; + } + + $product_id = $this->input->get('product_id'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + $model = $this->getModel('wrapper_detail'); + + if (!$model->enable_defaultpublish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_USE_TO_ALL_ENABLE_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=wrapper&showall=' . $showall . $tmpl . '&product_id=' . $product_id, $msg); + } + + public function enable_defaultunpublish() + { + $showall = $this->input->get('showall', '0'); + $tmpl = ''; + + if ($showall) + { + $tmpl = '&tmpl=component'; + } + + $product_id = $this->input->get('product_id'); + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + $model = $this->getModel('wrapper_detail'); + + if (!$model->enable_defaultpublish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_USE_TO_ALL_DISABLE_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=wrapper&showall=' . $showall . $tmpl . '&product_id=' . $product_id, $msg); + } +} diff --git a/component/admin/controllers/wrapper_detail.php b/component/admin/controllers/wrapper_detail.php new file mode 100644 index 00000000000..dc4df6f55cf --- /dev/null +++ b/component/admin/controllers/wrapper_detail.php @@ -0,0 +1,89 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'wrapper_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + + parent::display(); + } + + public function apply() + { + $this->save(1); + } + + public function save($apply = 0) + { + $showall = $this->input->get('showall', '0'); + $tmpl = ''; + + if ($showall) + { + $tmpl = '&tmpl=component'; + } + + $post = $this->input->post->getArray(); + $post['product_id'] = (isset($post['container_product'])) ? explode(',', $post['container_product']) : 0; + $product_id = $this->input->getInt('product_id', 0); + + $cid = $this->input->post->get('cid', array(0), 'array'); + $post ['wrapper_id'] = $cid [0]; + + /** @var RedshopModelWrapper_detail $model */ + $model = $this->getModel('wrapper_detail'); + + if ($row = $model->store($post)) + { + $msg = JText::_('COM_REDSHOP_WRAPPER_DETAIL_SAVED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_WRAPPER_DETAIL'); + } + + if ($apply == 1) + { + $this->setRedirect('index.php?option=com_redshop&view=wrapper_detail&task=edit&cid[]=' . $row->wrapper_id, $msg); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=wrapper&showall=' . $showall . $tmpl . '&product_id=' . $product_id, $msg); + } + } + + public function cancel() + { + $showall = $this->input->get('showall', '0'); + $tmpl = ''; + + if ($showall) + { + $tmpl = '&tmpl=component'; + } + + $product_id = $this->input->get('product_id'); + + $msg = JText::_('COM_REDSHOP_WRAPPER_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=wrapper&showall=' . $showall . $tmpl . '&product_id=' . $product_id, $msg); + } +} diff --git a/component/admin/controllers/xmlexport.php b/component/admin/controllers/xmlexport.php new file mode 100644 index 00000000000..763b1f03c15 --- /dev/null +++ b/component/admin/controllers/xmlexport.php @@ -0,0 +1,61 @@ +setRedirect('index.php'); + } + + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_XMLEXPORT_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } + + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if (!$model->publish($cid, 0)) + { + echo '\n'; + } + + $msg = JText::_('COM_REDSHOP_XMLEXPORT_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } +} diff --git a/component/admin/controllers/xmlexport_detail.php b/component/admin/controllers/xmlexport_detail.php new file mode 100644 index 00000000000..b30fe0d7bb6 --- /dev/null +++ b/component/admin/controllers/xmlexport_detail.php @@ -0,0 +1,366 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'xmlexport_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function xmlexport() + { + $this->save(1); + } + + public function save($export = 0) + { + $session = JFactory::getSession(); + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + + $post['xmlexport_id'] = $cid [0]; + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if ($post['xmlexport_id'] == 0) + { + $post['xmlexport_date'] = time(); + } + + $childelement = $session->get('childelement'); + + if (isset($childelement['orderdetail'])) + { + $post['element_name'] = ($childelement['orderdetail'][0]) ? $childelement['orderdetail'][0] : "orderdetail"; + $post['xmlexport_filetag'] = $childelement['orderdetail'][1]; + } + elseif (isset($childelement['productdetail'])) + { + $post['element_name'] = ($childelement['productdetail'][0]) ? $childelement['productdetail'][0] : "productdetail"; + $post['xmlexport_filetag'] = $childelement['productdetail'][1]; + } + + if (isset($childelement['billingdetail'])) + { + $post['billing_element_name'] = ($childelement['billingdetail'][0]) ? $childelement['billingdetail'][0] : "billingdetail"; + $post['xmlexport_billingtag'] = $childelement['billingdetail'][1]; + } + + if (isset($childelement['shippingdetail'])) + { + $post['shipping_element_name'] = ($childelement['shippingdetail'][0]) ? $childelement['shippingdetail'][0] : "shippingdetail"; + $post['xmlexport_shippingtag'] = $childelement['shippingdetail'][1]; + } + + if (isset($childelement['orderitem'])) + { + $post['orderitem_element_name'] = ($childelement['orderitem'][0]) ? $childelement['orderitem'][0] : "orderitem"; + $post['xmlexport_orderitemtag'] = $childelement['orderitem'][1]; + } + + if (isset($childelement['stockdetail'])) + { + $post['stock_element_name'] = ($childelement['stockdetail'][0]) ? $childelement['stockdetail'][0] : "stockdetail"; + $post['xmlexport_stocktag'] = $childelement['stockdetail'][1]; + } + + if (isset($childelement['prdextrafield'])) + { + $post['prdextrafield_element_name'] = ($childelement['prdextrafield'][0]) ? $childelement['prdextrafield'][0] : "prdextrafield"; + $post['xmlexport_prdextrafieldtag'] = $childelement['prdextrafield'][1]; + } + + $row = $model->store($post, $export); + + if ($row) + { + if ($export == 1) + { + $msg = JText::_('COM_REDSHOP_XMLEXPORT_FILE_SUCCESSFULLY_SYNCHRONIZED'); + } + else + { + $msg = JText::_('COM_REDSHOP_XMLEXPORT_DETAIL_SAVED'); + } + } + else + { + if ($export == 1) + { + $msg = JText::_('COM_REDSHOP_ERROR_XMLEXPORT_FILE_SYNCHRONIZED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_XMLEXPORT_DETAIL'); + } + } + + $session->set('childelement', null); + + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } + + function setChildElement() + { + JHTMLBehavior::modal(); + + $xmlhelper = new xmlHelper; + $post = $this->input->post->getArray(); + $session = JFactory::getSession(); + $childelement = $session->get('childelement'); + $resarray = array(); + $uarray = array(); + $columns = $xmlhelper->getSectionColumnList($post['section_type'], $post['parentsection']); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + if (trim($post[$columns[$i]->Field]) != "") + { + $xmltag = str_replace(" ", "_", strtolower(trim($post[$columns[$i]->Field]))); + $uarray[] = $xmltag; + $resarray[] = $columns[$i]->Field . "=" . $xmltag; + } + } + + $firstlen = count($uarray); + $uarray1 = array_unique($uarray); + sort($uarray1); + $seclen = count($uarray1); + + if ($seclen != $firstlen) + { + echo JText::_('COM_REDSHOP_DUPLICATE_FIELDNAME'); + + return; + } + + $childelement[$post['parentsection']] = array($post['element_name'], implode(";", $resarray)); + + $session->set('childelement', $childelement); ?> + + input->get('xmlexport_ip_id', 0); + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + $model->deleteIpAddress($xmlexport_ip_id); + die(); + } + + public function remove() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_XMLEXPORT_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } + + public function cancel() + { + $session = JFactory::getSession(); + $session->set('childelement', null); + $msg = JText::_('COM_REDSHOP_XMLEXPORT_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } + + /** + * logic for auto synchronize + * + * @access public + * @return void + */ + public function auto_syncpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_AUTO_SYNCHRONIZE')); + } + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if (!$model->auto_syncpublish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_AUTO_SYNCHRONIZE_ENABLE_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } + + /** + * logic for disable auto sync + * + * @access public + * @return void + */ + public function auto_syncunpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_AUTO_SYNCHRONIZE')); + } + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if (!$model->auto_syncpublish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_AUTO_SYNCHRONIZE_DISABLE_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } + + /** + * logic for use to all user + * + * @access public + * @return void + */ + public function usetoallpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_USE_EXPORTFILE_TO_ALL')); + } + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if (!$model->usetoallpublish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_EXPORTFILE_USE_TO_ALL_ENABLE_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } + + /** + * logic for disable use to all user + * + * @access public + * @return void + */ + public function usetoallunpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_USE_EXPORTFILE_TO_ALL')); + } + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if (!$model->usetoallpublish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_EXPORTFILE_USE_TO_ALL_DISABLE_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } + + /** + * logic for publish + * + * @access public + * @return void + */ + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_XMLEXPORT_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } + + /** + * logic for unpublish + * + * @access public + * @return void + */ + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelXmlexport_detail $model */ + $model = $this->getModel('xmlexport_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_XMLEXPORT_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlexport', $msg); + } +} diff --git a/component/admin/controllers/xmlimport.php b/component/admin/controllers/xmlimport.php new file mode 100644 index 00000000000..a28ca07d8ce --- /dev/null +++ b/component/admin/controllers/xmlimport.php @@ -0,0 +1,19 @@ +setRedirect('index.php'); + } +} diff --git a/component/admin/controllers/xmlimport_detail.php b/component/admin/controllers/xmlimport_detail.php new file mode 100644 index 00000000000..99c7055cf59 --- /dev/null +++ b/component/admin/controllers/xmlimport_detail.php @@ -0,0 +1,203 @@ +registerTask('add', 'edit'); + } + + public function edit() + { + $this->input->set('view', 'xmlimport_detail'); + $this->input->set('layout', 'default'); + $this->input->set('hidemainmenu', 1); + parent::display(); + } + + public function xmlimport() + { + $this->save(1); + } + + public function save($import = 0) + { + $post = $this->input->post->getArray(); + + $cid = $this->input->post->get('cid', array(0), 'array'); + + $post['xmlimport_id'] = $cid [0]; + + /** @var RedshopModelXmlimport_detail $model */ + $model = $this->getModel('xmlimport_detail'); + + if ($post['xmlimport_id'] == 0) + { + $post['xmlimport_date'] = time(); + } + + $row = $model->store($post, $import); + + if ($row) + { + if ($import == 1) + { + $msg = JText::_('COM_REDSHOP_XMLIMPORT_FILE_SUCCESSFULLY_SYNCHRONIZED'); + } + else + { + $msg = JText::_('COM_REDSHOP_XMLIMPORT_DETAIL_SAVED'); + } + } + else + { + if ($import == 1) + { + $msg = JText::_('COM_REDSHOP_ERROR_XMLIMPORT_FILE_SYNCHRONIZED'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_XMLIMPORT_DETAIL'); + } + } + + $this->setRedirect('index.php?option=com_redshop&view=xmlimport', $msg); + } + + public function remove() + { + + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + /** @var RedshopModelXmlimport_detail $model */ + $model = $this->getModel('xmlimport_detail'); + + if (!$model->delete($cid)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_XMLIMPORT_DETAIL_DELETED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlimport', $msg); + } + + public function cancel() + { + + $msg = JText::_('COM_REDSHOP_XMLIMPORT_DETAIL_EDITING_CANCELLED'); + $this->setRedirect('index.php?option=com_redshop&view=xmlimport', $msg); + } + + public function auto_syncpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_AUTO_SYNCHRONIZE')); + } + + /** @var RedshopModelXmlimport_detail $model */ + $model = $this->getModel('xmlimport_detail'); + + if (!$model->auto_syncpublish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_AUTO_SYNCHRONIZE_ENABLE_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlimport', $msg); + } + + public function auto_syncunpublish() + { + + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_AUTO_SYNCHRONIZE')); + } + + /** @var RedshopModelXmlimport_detail $model */ + $model = $this->getModel('xmlimport_detail'); + + if (!$model->auto_syncpublish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_AUTO_SYNCHRONIZE_DISABLE_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlimport', $msg); + } + + /** + * logic for publish + * + * @access public + * @return void + */ + public function publish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH')); + } + + /** @var RedshopModelXmlimport_detail $model */ + $model = $this->getModel('xmlimport_detail'); + + if (!$model->publish($cid, 1)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_XMLIMPORT_PUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlimport', $msg); + } + + /** + * logic for unpublish + * + * @access public + * @return void + */ + public function unpublish() + { + $cid = $this->input->post->get('cid', array(0), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + throw new Exception(JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH')); + } + + /** @var RedshopModelXmlimport_detail $model */ + $model = $this->getModel('xmlimport_detail'); + + if (!$model->publish($cid, 0)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_XMLIMPORT_UNPUBLISHED_SUCCESSFULLY'); + $this->setRedirect('index.php?option=com_redshop&view=xmlimport', $msg); + } +} diff --git a/component/admin/controllers/zip_import.php b/component/admin/controllers/zip_import.php new file mode 100644 index 00000000000..1022fd22af0 --- /dev/null +++ b/component/admin/controllers/zip_import.php @@ -0,0 +1,19 @@ +setRedirect('index.php'); + } +} diff --git a/component/admin/controllers/zipcode.php b/component/admin/controllers/zipcode.php new file mode 100644 index 00000000000..1c865d45cea --- /dev/null +++ b/component/admin/controllers/zipcode.php @@ -0,0 +1,35 @@ +getModel(); + $form = $model->getForm(); + echo $form->renderField('state_code'); + jexit(); + } +} diff --git a/component/admin/controllers/zipcodes.php b/component/admin/controllers/zipcodes.php new file mode 100644 index 00000000000..7547083b31e --- /dev/null +++ b/component/admin/controllers/zipcodes.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/component/admin/help/da-DK/redshop.html b/component/admin/help/da-DK/redshop.html new file mode 100644 index 00000000000..71c314a3ccd --- /dev/null +++ b/component/admin/help/da-DK/redshop.html @@ -0,0 +1,7 @@ + + + + + + diff --git a/component/admin/help/en-GB/index.html b/component/admin/help/en-GB/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/help/en-GB/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/help/en-GB/redshop.html b/component/admin/help/en-GB/redshop.html new file mode 100644 index 00000000000..71c314a3ccd --- /dev/null +++ b/component/admin/help/en-GB/redshop.html @@ -0,0 +1,7 @@ + + + + + + diff --git a/component/admin/helpers/economic.php b/component/admin/helpers/economic.php new file mode 100644 index 00000000000..a74213ee0ad --- /dev/null +++ b/component/admin/helpers/economic.php @@ -0,0 +1,525 @@ +_table_prefix = '#__redshop_'; + $this->_db = $db; + $this->_producthelper = productHelper::getInstance(); + $this->_shippinghelper = shipping::getInstance(); + $this->_redhelper = redhelper::getInstance(); + $this->_order_functions = order_functions::getInstance(); + $this->_stockroomhelper = rsstockroomhelper::getInstance(); + + JPluginHelper::importPlugin('economic'); + $this->_dispatcher = RedshopHelperUtility::getDispatcher(); + } + + /** + * Create an user in E-conomic + * + * @param object $row Data to create user + * @param array $data Data of Economic + * + * @return array + * + * @deprecated 2.0.3 Use RedshopEconomic::createUserInEconomic() instead + */ + public function createUserInEconomic($row, $data = array()) + { + return RedshopEconomic::createUserInEconomic($row, $data); + } + + /** + * Create Product Group in E-conomic + * + * @param array $row Data to create + * @param integer $isShipping Shipping flag + * @param integer $isDiscount Discount flag + * @param integer $isvat VAT flag + * + * @return null/array + * + * @deprecated 2.0.3 Use RedshopEconomic::createProductGroupInEconomic() instead + */ + public function createProductGroupInEconomic($row = array(), $isShipping = 0, $isDiscount = 0, $isvat = 0) + { + return RedshopEconomic::createProductGroupInEconomic($row, $isShipping, $isDiscount, $isvat); + } + + /** + * Create product in E-conomic + * + * @param object $row Data to create + * + * @return array + * + * @deprecated 2.0.3 Use RedshopEconomic::createProductInEconomic() instead + */ + public function createProductInEconomic($row) + { + return RedshopEconomic::createProductInEconomic($row); + } + + /** + * Get Total Property + * + * @param integer $productId Product ID + * + * @return integer + * + * @deprecated 2.0.3 Use RedshopEconomic::getTotalProperty() instead + */ + public function getTotalProperty($productId) + { + return RedshopEconomic::getTotalProperty($productId); + } + + /** + * Create property product in economic + * + * @param array $prdrow Product data + * @param array $row Data property + * + * @return array + * + * @deprecated 2.0.3 Use RedshopEconomic::createPropertyInEconomic() instead + */ + public function createPropertyInEconomic($prdrow = array(), $row = array()) + { + return RedshopEconomic::createPropertyInEconomic($prdrow, $row); + } + + /** + * Create Sub Property in Economic + * + * @param array $prdrow Product info + * @param array $row Data of property + * + * @return array + * + * @deprecated 2.0.3 Use RedshopEconomic::createSubpropertyInEconomic() instead + */ + public function createSubpropertyInEconomic($prdrow = array(), $row = array()) + { + return RedshopEconomic::createSubpropertyInEconomic($prdrow, $row); + } + + /** + * Import Stock from Economic + * + * @param object $prdrow Product Info + * + * @return array + * + * @deprecated 2.0.3 Use RedshopEconomic::importStockFromEconomic() instead + */ + public function importStockFromEconomic($prdrow = null) + { + return RedshopEconomic::importStockFromEconomic($prdrow); + } + + /** + * Create Shipping rate in economic + * + * @param integer $shipping_number Shipping Number + * @param string $shipping_name Shipping Name + * @param integer $shipping_rate Shipping Rate + * @param integer $isvat VAT flag + * + * @return array + * + * @deprecated 2.0.3 Use RedshopEconomic::createShippingRateInEconomic() instead + */ + public function createShippingRateInEconomic($shipping_number, $shipping_name, $shipping_rate = 0, $isvat = 1) + { + return RedshopEconomic::createShippingRateInEconomic($shipping_number, $shipping_name, $shipping_rate, $isvat); + } + + /** + * Get Max User Number in E-conomic + * + * @return integer + * + * @deprecated 2.0.3 Use RedshopEconomic::getMaxDebtorInEconomic() instead + */ + public function getMaxDebtorInEconomic() + { + return RedshopEconomic::getMaxDebtorInEconomic(); + } + + /** + * Get Max Order Number in Economic + * + * @return integer + * + * @deprecated 2.0.3 Use RedshopEconomic::getMaxOrderNumberInEconomic() instead + */ + public function getMaxOrderNumberInEconomic() + { + return RedshopEconomic::getMaxOrderNumberInEconomic(); + } + + /** + * Create Invoice in economic + * + * @param integer $order_id Order ID + * @param array $data Data to create + * + * @return boolean/string + * + * @deprecated 2.0.3 Use RedshopEconomic::createInvoiceInEconomic() instead + */ + public function createInvoiceInEconomic($order_id, $data = array()) + { + return RedshopEconomic::createInvoiceInEconomic($order_id, $data); + } + + /** + * Create Invoice Line In Economic + * + * @param array $orderitem Order Items + * @param string $invoice_no Invoice Number + * @param integer $user_id User ID + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::createInvoiceLineInEconomic() instead + */ + public function createInvoiceLineInEconomic($orderitem = array(), $invoice_no = "", $user_id = 0) + { + RedshopEconomic::createInvoiceLineInEconomic($orderitem, $invoice_no, $user_id); + } + + /** + * Create Invoice line in E-conomic for GiftCard + * + * @param array $orderitem Order Item + * @param string $invoice_no Invoice Number + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::createGiftCardInvoiceLineInEconomic() instead + */ + public function createGFInvoiceLineInEconomic($orderitem = array(), $invoice_no = "") + { + RedshopEconomic::createGiftCardInvoiceLineInEconomic($orderitem, $invoice_no); + } + + /** + * Method to create Invoice line in E-conomic as Product + * + * @param array $orderitem Order Item + * @param string $invoice_no Invoice Number + * @param integer $user_id User ID + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::createInvoiceLineInEconomicAsProduct() instead + */ + public function createInvoiceLineInEconomicAsProduct($orderitem = array(), $invoice_no = "", $user_id = 0) + { + RedshopEconomic::createInvoiceLineInEconomicAsProduct($orderitem, $invoice_no, $user_id); + } + + /** + * Method to create Invoice line for shipping in E-conomic + * + * @param string $ship_method_id Shipping method ID + * @param string $invoice_no Invoice Number + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::createInvoiceShippingLineInEconomic() instead + */ + public function createInvoiceShippingLineInEconomic($ship_method_id = "", $invoice_no = "") + { + RedshopEconomic::createInvoiceShippingLineInEconomic($ship_method_id, $invoice_no); + } + + /** + * Method to create Invoice line for discount in E-conomic + * + * @param array $orderdetail Order detail + * @param string $invoice_no Invoice Number + * @param array $data Data + * @param integer $isPaymentDiscount Is payment discount or not + * @param integer $isVatDiscount Is VAT discount or not + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::createInvoiceDiscountLineInEconomic() instead + */ + public function createInvoiceDiscountLineInEconomic($orderdetail = array(), $invoice_no = "", $data = array(), $isPaymentDiscount = 0, + $isVatDiscount = 0 + ) + { + RedshopEconomic::createInvoiceDiscountLineInEconomic($orderdetail, $invoice_no, $data, $isPaymentDiscount, $isVatDiscount); + } + + /** + * Method to create Invoice and send mail in E-conomic + * + * @param object $orderdata Order data + * + * @return array + * + * @deprecated 2.0.3 Use RedshopEconomic::renewInvoiceInEconomic() instead + */ + public function renewInvoiceInEconomic($orderdata) + { + return RedshopEconomic::renewInvoiceInEconomic($orderdata); + } + + /** + * Method to delete invoice in E-conomic + * + * @param array $orderdata Order data to delete + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::deleteInvoiceInEconomic() instead + */ + public function deleteInvoiceInEconomic($orderdata = array()) + { + RedshopEconomic::deleteInvoiceInEconomic($orderdata); + } + + /** + * Method to check invoice is draft or booked in E-conomic + * + * @param object $orderdetail Order detail + * + * @return array + * + * @deprecated 2.0.3 Use RedshopEconomic::checkInvoiceDraftorBookInEconomic() instead + */ + public function checkInvoiceDraftorBookInEconomic($orderdetail) + { + return RedshopEconomic::checkInvoiceDraftorBookInEconomic($orderdetail); + } + + /** + * Method to update invoice draft for changing the date in E-conomic + * + * @param array $orderdetail Order detail + * @param integer $bookinvoicedate Booking invoice date + * + * @return mixed + * + * @deprecated 2.0.3 Use RedshopEconomic::updateInvoiceDateInEconomic() instead + */ + public function updateInvoiceDateInEconomic($orderdetail, $bookinvoicedate = 0) + { + return RedshopEconomic::updateInvoiceDateInEconomic($orderdetail, $bookinvoicedate); + } + + /** + * Method to book invoice and send mail in E-conomic + * + * @param integer $orderId Order ID + * @param integer $checkOrderStatus Check Order status + * @param integer $bookInvoiceDate Booking invoice date + * + * @return string + * + * @deprecated 2.0.3 Use RedshopEconomic::bookInvoiceInEconomic() instead + */ + public function bookInvoiceInEconomic($orderId, $checkOrderStatus = 1, $bookInvoiceDate = 0) + { + return RedshopEconomic::bookInvoiceInEconomic($orderId, $checkOrderStatus, $bookInvoiceDate); + } + + /** + * Update invoice number + * + * @param integer $orderId Order ID + * @param integer $invoiceNo Invoice number + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::updateInvoiceNumber() instead + */ + public function updateInvoiceNumber($orderId = 0, $invoiceNo = 0) + { + RedshopEconomic::updateInvoiceNumber($orderId, $invoiceNo); + } + + /** + * Update booking invoice + * + * @param integer $orderId Order ID + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::updateBookInvoice() instead + */ + public function updateBookInvoice($orderId = 0) + { + RedshopEconomic::updateBookInvoice($orderId); + } + + /** + * Update booking invoice number + * + * @param integer $orderId Order ID + * @param integer $bookInvoiceNumber Booking invoice number + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::updateBookInvoiceNumber() instead + */ + public function updateBookInvoiceNumber($orderId = 0, $bookInvoiceNumber = 0) + { + RedshopEconomic::updateBookInvoiceNumber($orderId, $bookInvoiceNumber); + } + + /** + * Get product number + * + * @param string $productNumber Product Number + * + * @return object + * + * @deprecated 2.0.3 Use RedshopEconomic::getProductByNumber() instead + */ + public function getProductByNumber($productNumber = '') + { + return RedshopEconomic::getProductByNumber($productNumber); + } + + /** + * Make Accessory Order + * + * @param string $invoiceNo Invoice number + * @param object $orderItem Order item + * @param integer $userId User ID + * + * @return integer + * + * @deprecated 2.0.3 Use RedshopEconomic::makeAccessoryOrder() instead + */ + public function makeAccessoryOrder($invoiceNo, $orderItem, $userId = 0) + { + return RedshopEconomic::makeAccessoryOrder($invoiceNo, $orderItem, $userId); + } + + /** + * Make Attribute Order + * + * @param string $invoiceNo Invoice number + * @param object $orderItem Order Item + * @param integer $isAccessory Is accessory + * @param integer $parentSectionId Parent Section ID + * @param integer $userId User ID + * + * @return integer + * + * @deprecated 2.0.3 Use RedshopEconomic::makeAttributeOrder() instead + */ + public function makeAttributeOrder($invoiceNo, $orderItem, $isAccessory = 0, $parentSectionId = 0, $userId = 0) + { + return RedshopEconomic::makeAttributeOrder($invoiceNo, $orderItem, $isAccessory, $parentSectionId, $userId); + } + + /** + * Create Attribute Invoice Line In Economic + * + * @param string $invoiceNo Invoice number + * @param object $orderItem Order Item + * @param array $orderAttributeItems Ordere Attribute Item + * + * @return void + * + * @deprecated 2.0.3 Use RedshopEconomic::createAttributeInvoiceLineInEconomic() instead + */ + public function createAttributeInvoiceLineInEconomic($invoiceNo, $orderItem, $orderAttributeItems) + { + RedshopEconomic::createAttributeInvoiceLineInEconomic($invoiceNo, $orderItem, $orderAttributeItems); + } + + /** + * Get economic Tax zone + * + * @param string $countryCode Country code + * + * @return string + * + * @deprecated 2.0.3 Use RedshopEconomic::getEconomicTaxZone() instead + */ + public function getEconomicTaxZone($countryCode = "") + { + return RedshopEconomic::getEconomicTaxZone($countryCode); + } + + /** + * Check country is belong to EU + * + * @param string $country Country code + * + * @return boolean + * + * @deprecated 2.0.3 Use RedshopEconomic::isEuCountry() instead + */ + public function isEUCountry($country) + { + return RedshopEconomic::isEuCountry($country); + } +} diff --git a/component/admin/helpers/extra_field.php b/component/admin/helpers/extra_field.php new file mode 100644 index 00000000000..3f83d580010 --- /dev/null +++ b/component/admin/helpers/extra_field.php @@ -0,0 +1,264 @@ + + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::listAllField() instead + */ + public function list_all_field($field_section = "", $section_id = 0, $field_name = "", $template_desc = "") + { + return RedshopHelperExtrafields::listAllField($field_section, $section_id, $field_name, $template_desc); + } + + /** + * Save extra fields + * + * @param array $data Data to insert + * @param integer $field_section Field section to match + * @param string $section_id Section ID + * @param string $user_email User to match by email + * + * @return void + * @throws Exception + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::extraFieldSave() instead + */ + public function extra_field_save($data, $field_section, $section_id = "", $user_email = "") + { + RedshopHelperExtrafields::extraFieldSave($data, $field_section, $section_id, $user_email); + } + + /** + * validate Extra Field + * + * @param integer $field_section Field Section List + * @param integer $section_id Section ID + * + * @return boolean + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::CheckExtraFieldValidation() instead + */ + public function chk_extrafieldValidation($field_section = 0, $section_id = 0) + { + return RedshopHelperExtrafields::CheckExtraFieldValidation($field_section, $section_id); + } + + /** + * List all fields and display + * + * @param integer $field_section Field section + * @param integer $section_id Section ID + * @param integer $flag Flag + * @param string $user_email User email + * @param string $template_desc Template description + * @param boolean $sendmail True/ False + * + * @return string + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::listAllFieldDisplay() instead + */ + public function list_all_field_display($field_section = 0, $section_id = 0, $flag = 0, $user_email = "", $template_desc = "", $sendmail = false) + { + return RedshopHelperExtrafields::listAllFieldDisplay($field_section, $section_id, $flag, $user_email, $template_desc, $sendmail); + } + + /** + * List all user fields + * + * @param string $fieldSection Field Section + * @param int $sectionId Section ID + * @param string $fieldType Field type + * @param string $uniqueId Unique ID + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::listAllUserFields() instead + */ + public function list_all_user_fields($fieldSection = "", $sectionId = RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, + $fieldType = '', $uniqueId = '') + { + return RedshopHelperExtrafields::listAllUserFields($fieldSection, $sectionId, $fieldType, $uniqueId); + } + + /** + * Render HTML radio list + * + * @param string $name Name of radio checkbox + * @param array $attribs Attribute values + * @param array $selected The name of the object variable for the option text + * @param string $yes Option Days + * @param string $no Option Weeks + * @param boolean $id ID of radio checkbox + * + * @return string + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::booleanList() instead + */ + public function booleanlist($name, $attribs = null, $selected = null, $yes = 'yes', $no = 'no', $id = false) + { + return RedshopHelperExtrafields::booleanList($name, $attribs, $selected, $yes, $no, $id); + } + + /** + * Render HTML radio list with options + * + * @param string $name Name of radio checkbox + * @param array $attribs Attribute values + * @param array $selected The name of the object variable for the option text + * @param string $yes Option Days + * @param string $no Option Weeks + * @param boolean $id ID of radio checkbox + * @param string $yes_value ID of radio checkbox + * @param string $no_value ID of radio checkbox + * + * @return string + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::rsBooleanList() instead + */ + public function rs_booleanlist($name, $attribs = null, $selected = null, $yes = 'yes', $no = 'no', $id = false, + $yes_value = 'Days', $no_value = 'Weeks' + ) + { + return RedshopHelperExtrafields::rsBooleanList($name, $attribs, $selected, $yes, $no, $id, $yes_value, $no_value); + } + + /** + * Get fields value by ID + * + * @param integer $id ID of field + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::getFieldValue() instead + */ + public function getFieldValue($id) + { + return RedshopHelperExtrafields::getFieldValue($id); + } + + /** + * Get Section Field List + * + * @param integer $section [description] + * @param integer $front [description] + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::getSectionFieldList() instead + */ + public function getSectionFieldList($section = RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, $front = 1) + { + return RedshopHelperExtrafields::getSectionFieldList($section, $front); + } + + /** + * Get section field data list + * + * @param integer $fieldid Field ID + * @param integer $section Section ID + * @param integer $orderitemid Order Item ID + * @param string $user_email User Email + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::getSectionFieldDataList() instead + */ + public function getSectionFieldDataList($fieldid, $section = 0, $orderitemid = 0, $user_email = "") + { + return RedshopHelperExtrafields::getSectionFieldDataList($fieldid, $section, $orderitemid, $user_email); + } + + /** + * Copy product extra field + * + * @param integer $oldproduct_id Old Product ID + * @param integer $newPid New Product ID + * + * @return void + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::copyProductExtraField() instead + */ + public function copy_product_extra_field($oldproduct_id, $newPid) + { + RedshopHelperExtrafields::copyProductExtraField($oldproduct_id, $newPid); + } + + /** + * Delete extra field data + * + * @param integer $data_id Data ID + * + * @return void + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::deleteExtraFieldData() instead + */ + public function deleteExtraFieldData($data_id) + { + RedshopHelperExtrafields::deleteExtraFieldData($data_id); + } +} diff --git a/component/admin/helpers/index.html b/component/admin/helpers/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/helpers/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/helpers/menu.php b/component/admin/helpers/menu.php new file mode 100644 index 00000000000..77d7dbca9dd --- /dev/null +++ b/component/admin/helpers/menu.php @@ -0,0 +1,62 @@ +menuHide = explode(",", Redshop::getConfig()->get('MENUHIDE', '')); + + return $this; + } +} diff --git a/component/admin/helpers/order_functions.php b/component/admin/helpers/order_functions.php new file mode 100644 index 00000000000..20d21936f91 --- /dev/null +++ b/component/admin/helpers/order_functions.php @@ -0,0 +1,761 @@ +getItem() instead + */ + public function getmultiOrderDetails($orderId) + { + return RedshopEntityOrder::getInstance($orderId)->getItem(); + } + + /** + * Get User Order Details + * + * @param integer $user_id User ID + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getUserOrderDetails() instead + */ + public function getUserOrderDetails($user_id = 0) + { + return RedshopHelperOrder::getUserOrderDetails($user_id); + } + + /** + * Get order item detail + * + * @param integer $order_id Order ID + * @param integer $product_id Product ID + * @param integer $order_item_id Order Item ID + * + * @return boolean/object + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getOrderItemDetail() instead + */ + public function getOrderItemDetail($order_id = 0, $product_id = 0, $order_item_id = 0) + { + return RedshopHelperOrder::getOrderItemDetail($order_id, $product_id, $order_item_id); + } + + /** + * Get Order Payment Detail + * + * @param integer $orderId Order Id + * @param integer $paymentOrderId Payment order id + * + * @deprecated 1.5 Use RedshopHelperOrder::getPaymentInfo or RedshopHelperOrder::getOrderPaymentDetail instead + * + * @return array order payment info + */ + public function getOrderPaymentDetail($orderId, $paymentOrderId = 0) + { + if (!$paymentOrderId) + { + return array(RedshopHelperOrder::getPaymentInfo($orderId)); + } + + return array(RedshopHelperOrder::getOrderPaymentDetail($paymentOrderId)); + } + + /** + * Get Order Partial Payment + * + * @param integer $orderId Order ID + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getOrderPartialPayment() instead + */ + public function getOrderPartialPayment($orderId) + { + return RedshopHelperOrder::getOrderPartialPayment($orderId); + } + + /** + * Get Shipping Method Info + * + * @param string $shippingClass Shipping class + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getShippingMethodInfo() instead + */ + public function getShippingMethodInfo($shippingClass = '') + { + return RedshopHelperOrder::getShippingMethodInfo($shippingClass); + } + + /** + * Get payment method info + * + * @param string $paymentMethodClass Payment method class + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getPaymentMethodInfo() instead + */ + public function getPaymentMethodInfo($paymentMethodClass = '') + { + return RedshopHelperOrder::getPaymentMethodInfo($paymentMethodClass); + } + + /** + * Get billing address + * + * @param integer $userId User ID + * + * @return mixed + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getBillingAddress() instead + */ + public function getBillingAddress($userId = 0) + { + return RedshopHelperOrder::getBillingAddress($userId); + } + + /** + * Order Billing User info + * + * @param integer $orderId Order Id + * + * @deprecated 1.6 Use RedshopHelperOrder::getOrderBillingUserInfo($orderId) instead + * + * @return object Order Billing Information object + */ + public function getOrderBillingUserInfo($orderId) + { + return RedshopHelperOrder::getOrderBillingUserInfo($orderId); + } + + /** + * Get Shipping address + * + * @param integer $userId User Id + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getShippingAddress() instead + */ + public function getShippingAddress($userId = 0) + { + return RedshopHelperOrder::getShippingAddress($userId); + } + + /** + * Order Shipping User info + * + * @param integer $orderId Order Id + * + * @deprecated 1.6 Use RedshopHelperOrder::getOrderShippingUserInfo($orderId) instead + * + * @return object Order Shipping Information object + */ + public function getOrderShippingUserInfo($orderId) + { + return RedshopHelperOrder::getOrderShippingUserInfo($orderId); + } + + /** + * Get User full name + * + * @param integer $userId User ID + * + * @return string + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getUserFullName() instead + */ + public function getUserFullname($userId) + { + return RedshopHelperOrder::getUserFullName($userId); + } + + /** + * Get order item accessory detail + * + * @param integer $orderItemId Order Item ID + * + * @return null/object + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getOrderItemAccessoryDetail() instead + */ + public function getOrderItemAccessoryDetail($orderItemId = 0) + { + return RedshopHelperOrder::getOrderItemAccessoryDetail($orderItemId); + } + + /** + * Get order item attribute detail + * + * @param integer $orderItemId Order Item ID + * @param integer $isAccessory Is accessory + * @param string $section Section text + * @param integer $parentSectionId Parent section ID + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getOrderItemAttributeDetail() instead + */ + public function getOrderItemAttributeDetail($orderItemId = 0, $isAccessory = 0, $section = "attribute", $parentSectionId = 0) + { + return RedshopHelperOrder::getOrderItemAttributeDetail($orderItemId, $isAccessory, $section, $parentSectionId); + } + + /** + * Get Order User Field Data + * + * @param integer $orderItemId Order Item ID + * @param integer $section Section ID + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getOrderUserFieldData() instead + */ + public function getOrderUserfieldData($orderItemId = 0, $section = 0) + { + return RedshopHelperOrder::getOrderUserFieldData($orderItemId, $section); + } + + /** + * Generate Order Number + * + * @return integer + * + * @deprecated 2.0.3 Use RedshopHelperOrder::generateOrderNumber() instead + */ + public function generateOrderNumber() + { + return RedshopHelperOrder::generateOrderNumber(); + } + + /** + * Random Generate Encrypt Key + * + * @param string $length Length of string + * + * @return string + * + * @deprecated 2.0.3 Use \Redshop\Crypto\Helper\Encrypt::generateCustomRandomEncryptKey() instead + */ + public function random_gen_enc_key($length = '30') + { + return \Redshop\Crypto\Helper\Encrypt::generateCustomRandomEncryptKey((int) $length); + } + + /** + * Get Country name by 3 characters of country code + * + * @param string $cnt3 Country code + * + * @return string + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getCountryName() instead + */ + public function getCountryName($cnt3 = "") + { + return RedshopHelperOrder::getCountryName($cnt3); + } + + /** + * Get state name + * + * @param string $st3 State code + * @param string $cnt3 Country code + * + * @return string + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getStateName() instead + */ + public function getStateName($st3 = "", $cnt3 = "") + { + return RedshopHelperOrder::getStateName($st3, $cnt3); + } + + /** + * Send download by email + * + * @param integer $orderId Order ID + * + * @return boolean + * + * @deprecated 2.0.3 Use RedshopHelperOrder::sendDownload() instead + */ + public function SendDownload($orderId = 0) + { + return RedshopHelperOrder::sendDownload($orderId); + } + + /** + * Get download product + * + * @param integer $orderId Order ID + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getDownloadProduct() instead + */ + public function getDownloadProduct($orderId) + { + return RedshopHelperOrder::getDownloadProduct($orderId); + } + + /** + * Get download product log + * + * @param integer $orderId Order Id + * @param string $did Download id + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getDownloadProductLog() instead + */ + public function getDownloadProductLog($orderId, $did = '') + { + return RedshopHelperOrder::getDownloadProductLog($orderId, $did); + } + + /** + * Get payment parameters + * + * @param string $payment Payment type + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getParameters() instead + */ + public function getparameters($payment) + { + return RedshopHelperOrder::getParameters($payment); + } + + /** + * Get payment information + * + * @param object $row Payment info row + * @param array $post payment method class + * + * @return void + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getPaymentInformation() instead + */ + public function getpaymentinformation($row, $post) + { + RedshopHelperOrder::getPaymentInformation($row, $post); + } + + /** + * Get shipping location information + * + * @param string $shippingname Shipping name + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperOrder::getShippingLocationInfo() instead + */ + public function getshippinglocationinfo($shippingname) + { + return RedshopHelperOrder::getShippingLocationInfo($shippingname); + } + + /** + * Generate barcode + * + * @param integer $length Length + * @param integer $barcodekey Key + * + * @return object + * + * @deprecated 2.0.3 + */ + public function barcode_randon_number($length = 12, $barcodekey = 0) + { + return null; + } + + /** + * Generate barcode + * + * @param integer $oid Length + * @param integer $barcode Key + * + * @return null + * + * @deprecated 2.0.3 + */ + public function updatebarcode($oid, $barcode) + { + return null; + } + + /** + * Check update Orders + * + * @param object $data Data to check + * + * @return integer + * + * @deprecated 2.0.3 Use RedshopHelperOrder::checkUpdateOrders() instead + */ + public function checkupdateordersts($data) + { + return RedshopHelperOrder::checkUpdateOrders($data); + } + + /** + * Change order status mail + * + * @param integer $order_id Order ID + * @param string $newstatus New status + * @param string $order_comment Order Comment + * + * @return void + * + * @deprecated 2.0.3 Use RedshopHelperOrder::changeOrderStatusMail() instead + */ + public function changeOrderStatusMail($order_id, $newstatus, $order_comment = '') + { + RedshopHelperOrder::changeOrderStatusMail($order_id, $newstatus, $order_comment); + } + + /** + * Create book invoice + * + * @param integer $order_id Order ID + * @param string $order_status Order status + * + * @return void + * + * @deprecated 2.0.3 Use RedshopHelperOrder::createBookInvoice() instead + */ + public function createBookInvoice($order_id, $order_status) + { + RedshopHelperOrder::createBookInvoice($order_id, $order_status); + } + + /** + * Create Multi Print Invoice PDF + * + * @param integer $order_id Order ID + * + * @return string + * + * @deprecated 2.0.3 Use RedshopHelperOrder::createMultiPrintInvoicePdf() instead + */ + public function createMultiprintInvoicePdf($order_id) + { + return RedshopHelperOrder::createMultiPrintInvoicePdf($order_id); + } + + /** + * Method for generate Invoice PDF of specific Order + * + * @param int $orderId ID of order. + * + * @return void + * + * @deprecated 2.0.3 Use RedshopHelperOrder::generateInvoicePdf() instead + */ + public static function generateInvoicePDF($orderId) + { + RedshopHelperOrder::generateInvoicePdf($orderId); + } + + /** + * Create PacSoft Label from Order Status Change functions + * + * @param integer $order_id Order Information ID + * @param string $order_status Order Status Code + * @param string $paymentStatus Order Payment Status Code + * + * @return void + * + * @deprecated 2.0.3 Use RedshopHelperOrder::createWebPackLabel() instead + */ + public function createWebPacklabel($order_id, $order_status, $paymentStatus) + { + RedshopHelperOrder::createWebPackLabel($order_id, $order_status, $paymentStatus); + } + + /** + * Order status update + * + * @param integer $orderId Order ID + * @param array $post Post array + * + * @return boolean/mixed + * + * @deprecated 2.0.3 Use RedshopHelperOrder::orderStatusUpdate() instead + */ + public function orderStatusUpdate($orderId, $post = array()) + { + return RedshopHelperOrder::orderStatusUpdate($orderId, $post); + } +} diff --git a/component/admin/helpers/product.php b/component/admin/helpers/product.php new file mode 100644 index 00000000000..3062742c9fd --- /dev/null +++ b/component/admin/helpers/product.php @@ -0,0 +1,216 @@ +_table_prefix = '#__redshop_'; + } + + /** + * Replace Accessory Data + * + * @param int $productId Product id + * @param array $accessory Accessory list + * @param int $userId User id + * @param string $uniqueId Unique id + * + * @return mixed + * + * @deprecated 2.0.3 Use RedshopHelperProduct::replaceAccessoryData($productId, $accessory, $userId, $uniqueId) + * instead + */ + public function replaceAccessoryData($productId = 0, $accessory = array(), $userId = 0, $uniqueId = "") + { + return RedshopHelperProduct::replaceAccessoryData($productId, $accessory, $userId, $uniqueId); + } + + /** + * Replace Attribute Data + * + * @param int $productId Product id + * @param int $accessoryId Accessory id + * @param array $attributes Attribute list + * @param int $userId User id + * @param string $uniqueId Unique id + * + * @return mixed + * + * @deprecated 2.0.3 Use RedshopHelperProduct::replaceAttributeData($productId, $accessoryId, $attributes, $userId, + * $uniqueId) instead + */ + public function replaceAttributeData($productId = 0, $accessoryId = 0, $attributes = array(), $userId = 0, $uniqueId = "") + { + return RedshopHelperProductTag::replaceAttributeData($productId, $accessoryId, $attributes, $userId, $uniqueId); + } + + /** + * Replace Accessory Data + * + * @param int $productId Product id + * @param int $userId User id + * @param string $uniqueId Unique id + * + * @return mixed + * + * @deprecated 2.0.3 Use RedshopHelperProduct::replaceWrapperData($productId, $userId, $uniqueId) instead + */ + public function replaceWrapperData($productId = 0, $userId = 0, $uniqueId = "") + { + return RedshopHelperProduct::replaceWrapperData($productId, $userId, $uniqueId); + } + + /** + * Get product item info + * + * @param int $productId Product id + * @param int $quantity Product quantity + * @param string $uniqueId Unique id + * @param int $userId User id + * @param int $newProductPrice New product price + * + * @return mixed + * @throws Exception + * + * @deprecated 2.0.3 Use RedshopHelperProduct::getProductItemInfo($productId, $quantity, $uniqueId, $userId, + * $newProductPrice) instead + */ + public function getProductItemInfo($productId = 0, $quantity = 1, $uniqueId = '', $userId = 0, $newProductPrice = 0) + { + return RedshopHelperProduct::getProductItemInfo($productId, $quantity, $uniqueId, $userId, $newProductPrice); + } + + /** + * Replace Shipping method + * + * @param array $d Data + * @param int $shippUsersInfoId Shipping User info id + * @param int $shippingRateId Shipping rate id + * + * @return mixed + * + * @deprecated 2.0.3 Use RedshopHelperProduct::replaceShippingMethod($d, $shippUsersInfoId, $shippingRateId) instead + */ + public function replaceShippingMethod($d = array(), $shippUsersInfoId = 0, $shippingRateId = 0) + { + return RedshopHelperProduct::replaceShippingMethod($d, $shippUsersInfoId, $shippingRateId); + } + + /** + * Redesign product item + * + * @param array $post Data + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperProduct::redesignProductItem($post) instead + */ + public function redesignProductItem($post = array()) + { + return Redshop\Order\Helper::redesignProductItem($post); + } + + /** + * Replace User Field + * + * @param int $productId Product id + * @param int $templateId Template id + * @param string $uniqueId Unique id + * + * @return mixed + * @throws Exception + * + * @deprecated 2.0.3 Use RedshopHelperProduct::replaceUserfield($productId, $templateId, $uniqueId) instead + */ + public function replaceUserfield($productId = 0, $templateId = 0, $uniqueId = "") + { + return RedshopHelperProduct::replaceUserField($productId, $templateId, $uniqueId); + } + + /** + * Insert Product user field + * + * @param int $fieldId Field id + * @param int $orderItemId Order item id + * @param int $sectionId Section id + * @param string $value Unique id + * + * @return boolean + * + * @deprecated 2.0.3 Use RedshopHelperProduct::insertProductUserField($fieldId, $orderItemId, $sectionId, + * $value) instead + */ + public function admin_insertProdcutUserfield($fieldId = 0, $orderItemId = 0, $sectionId = 12, $value = '') + { + return RedshopHelperProduct::insertProductUserField($fieldId, $orderItemId, $sectionId, $value); + } + + /** + * Get product by sort list + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperProduct::getProductsSortByList() instead + */ + public function getProductrBySortedList() + { + return RedshopHelperProduct::getProductsSortByList(); + } +} diff --git a/component/admin/helpers/product_category.php b/component/admin/helpers/product_category.php new file mode 100644 index 00000000000..5a61d9675f0 --- /dev/null +++ b/component/admin/helpers/product_category.php @@ -0,0 +1,186 @@ +_table_prefix = '#__redshop_'; + } + + /** + * List all categories and return HTML format + * + * @param string $name Name of list + * @param integer $categoryId Only category to show + * @param array $selectedCategories Only select categories from this + * @param integer $size Size of dropdown + * @param boolean $toplevel Add option '-Top-' + * @param boolean $multiple Dropdown is multiple or not + * @param array $disabledFields Fields need to be disabled + * @param integer $width Width in pixel + * + * @return string HTML of dropdown + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperCategory::listAll() instead + */ + public function list_all($name, $categoryId, $selectedCategories = Array(), $size = 1, $toplevel = false, + $multiple = false, $disabledFields = array(), $width = 250 + ) + { + return RedshopHelperCategory::listAll($name, $categoryId, $selectedCategories, $size, $toplevel, $multiple, $disabledFields, $width); + } + + /** + * List children of category into dropdown with level, + * this is a function will be called resursively. + * + * @param string $categoryId Exclude this category ID + * @param string $cid Parent category ID + * @param string $level Default is 0 + * @param array $selectedCategories Only show selected categories + * @param array $disabledFields Didable fields + * @param string $html Before HTML + * + * @return string HTML of + * + * @deprecated 2.0.0.3 Use RedshopHelperCategory::listTree() instead + * + * @throws Exception + */ + public function list_tree($categoryId = "", $cid = '0', $level = '0', $selectedCategories = Array(), $disabledFields = Array(), $html = '') + { + return RedshopHelperCategory::listTree($selectedCategories, $disabledFields); + } + + /** + * Get Category List Array + * + * @param int $category_id First category level in filter + * @param int $cid Current category id + * + * @return array|mixed + * @throws Exception + * + * @deprecated 1.5 Use RedshopHelperCategory::getCategoryListArray instead + */ + public function getCategoryListArray($category_id = 1, $cid = 1) + { + return RedshopHelperCategory::getCategoryListArray($category_id, $cid); + } + + /** + * Get Category List Reverse Array + * + * @param string $cid Category id + * + * @return array + * + * @deprecated 1.5 Use RedshopHelperCategory::getCategoryListReverseArray instead + */ + public function getCategoryListReverceArray($cid = '0') + { + return RedshopHelperCategory::getCategoryListReverseArray($cid); + } + + /** + * Build content order by user state from request + * + * @return string + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperCategory::buildContentOrderBy() instead + */ + public function _buildContentOrderBy() + { + return RedshopHelperCategory::buildContentOrderBy(); + } + + /** + * Get root parent categories + * + * @return object + * + * @deprecated 2.0.0.3 Use RedshopHelperCategory::getParentCategories() instead + */ + public function getParentCategories() + { + return RedshopHelperCategory::getParentCategories(); + } + + /** + * Get category tree + * + * @param string $cid Category ID + * + * @return array + * + * @deprecated 2.0.0.3 Use RedshopHelperCategory::getCategoryTree() instead + */ + public function getCategoryTree($cid = '0') + { + return RedshopHelperCategory::getCategoryTree($cid); + } + + /** + * Get category product list + * + * @param string $cid Category ID + * + * @return array + * + * @deprecated 2.0.0.3 Use RedshopHelperCategory::getCategoryProductList() instead + */ + public function getCategoryProductList($cid) + { + return RedshopHelperCategory::getCategoryProductList($cid); + } + + /** + * Check if Accessory is existed + * + * @param integer $product_id Product ID + * @param integer $accessory_id Accessory ID + * + * @return integer + * + * @deprecated 2.0.0.3 Use RedshopHelperCategory::checkAccessoryExists() instead + */ + public function checkAccessoryExists($product_id, $accessory_id) + { + return RedshopHelperAccessory::checkAccessoryExists($product_id, $accessory_id); + } +} diff --git a/component/admin/helpers/quotationhelper.php b/component/admin/helpers/quotationhelper.php new file mode 100644 index 00000000000..2b78f3630a0 --- /dev/null +++ b/component/admin/helpers/quotationhelper.php @@ -0,0 +1,311 @@ +_db = JFactory::getDbo(); + $this->_table_prefix = '#__redshop_'; + } + + /** + * Get list of quotation status + * + * @return array An array of status options + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::getQuotationStatusList() instead + */ + public function getQuotationStatusList() + { + return RedshopHelperQuotation::getQuotationStatusList(); + } + + /** + * Get name of quotation status + * + * @param integer $value Have 5 options: REQUESTED/REPLIED/ACCEPTED/REJECTED/ORDERED + * + * @return string Name of Quotation status + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::getQuotationStatusName() instead + */ + public function getQuotationStatusName($value = 0) + { + return RedshopHelperQuotation::getQuotationStatusName($value); + } + + /** + * Get quotation product + * + * @param integer $quotationId Quotation ID + * @param integer $quotationItemId Quotation Item ID + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::getQuotationProduct() instead + */ + public function getQuotationProduct($quotationId = 0, $quotationItemId = 0) + { + return RedshopHelperQuotation::getQuotationProduct($quotationId, $quotationItemId); + } + + /** + * Get quotation detail + * + * @param integer $quotationId Quotation ID + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::getQuotationDetail() instead + */ + public function getQuotationDetail($quotationId) + { + return RedshopHelperQuotation::getQuotationDetail($quotationId); + } + + /** + * Generate a unique quotation number + * + * @return integer + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::generateQuotationNumber() instead + */ + public function generateQuotationNumber() + { + return RedshopHelperQuotation::generateQuotationNumber(); + } + + /** + * Update Quotation Status + * + * @param integer $quotationId Quotation ID + * @param integer $status Quotation Change status + * + * @return void + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::updateQuotationStatus() instead + */ + public function updateQuotationStatus($quotationId, $status = 1) + { + RedshopHelperQuotation::updateQuotationStatus($quotationId, $status); + } + + /** + * Get list of quotation users + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::getQuotationUserList() instead + */ + public function getQuotationUserList() + { + return RedshopHelperQuotation::getQuotationUserList(); + } + + /** + * Generate a random encrytion key for quotation + * + * @param string $length Length of string to generate + * + * @return string + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::randomQuotationEncryptKey() instead + */ + public function randomQuotationEncrkey($length = '30') + { + return RedshopHelperQuotation::randomQuotationEncryptKey($length); + } + + /** + * Inserting quotation user's fields + * + * @param array $cart Array of fields to insert + * @param integer $quotation_item_id Item ID of Quotation to match + * @param integer $section_id Section to get field list + * + * @return boolean true/false when inserting success or fail + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::manageQuotationUserField() instead + */ + public function manageQuotationUserfield($cart = array(), $quotation_item_id = 0, $section_id = 12) + { + return RedshopHelperQuotation::manageQuotationUserField($cart, $quotation_item_id, $section_id); + } + + /** + * Insert quotation field with value + * + * @param integer $field_id Field ID + * @param integer $quotation_item_id Quotation Item ID + * @param integer $section_id Section ID + * @param string $value Value to insert + * + * @return void + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::insertQuotationUserField() instead + */ + public function insertQuotationUserfield($field_id = 0, $quotation_item_id = 0, $section_id = 12, $value = '') + { + RedshopHelperQuotation::insertQuotationUserField($field_id, $quotation_item_id, $section_id, $value); + } + + /** + * Get quotation item fields by field ID + * + * @param integer $quotationItemId Quotation Item ID + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::getQuotationUserField() instead + */ + public function getQuotationUserfield($quotationItemId) + { + return RedshopHelperQuotation::getQuotationUserField($quotationItemId); + } + + /** + * Display quotation user fields + * + * @param integer $quotationItemId Quotation Item ID + * @param integer $sectionId Section ID + * + * @return string HTML to display + * @throws Exception + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::displayQuotationUserField() instead + */ + public function displayQuotationUserfield($quotationItemId = 0, $sectionId = 12) + { + return RedshopHelperQuotation::displayQuotationUserField($quotationItemId, $sectionId); + } + + /** + * Update quotation with order ID + * + * @param integer $quotation_id Quotation ID + * @param integer $order_id Order ID + * + * @return boolean/void Return true if success, alert error if fail + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::updateQuotationWithOrder() instead + */ + public function updateQuotationwithOrder($quotation_id, $order_id) + { + return RedshopHelperQuotation::updateQuotationWithOrder($quotation_id, $order_id); + } + + /** + * Get quotation by order id + * + * @param integer/array $order_id OrderID + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::getQuotationWithOrder() instead + */ + public function getQuotationwithOrder($order_id = 0) + { + return RedshopHelperQuotation::getQuotationWithOrder($order_id); + } + + /** + * Get quotation accesory item by ID + * + * @param integer $quotation_item_id Quotation Item ID + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::getQuotationItemAccessoryDetail() instead + */ + public function getQuotationItemAccessoryDetail($quotation_item_id = 0) + { + return RedshopHelperQuotation::getQuotationItemAccessoryDetail($quotation_item_id); + } + + /** + * Get Quotation Item Attribute Detail + * + * @param integer $quotation_item_id Quotation Item ID + * @param integer $is_accessory Check Accessory Attribute + * @param string $section Section: default is "attribute" + * @param integer $parent_section_id Parent section ID + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperQuotation::getQuotationItemAttributeDetail() instead + */ + public function getQuotationItemAttributeDetail($quotation_item_id = 0, $is_accessory = 0, $section = "attribute", $parent_section_id = 0) + { + return RedshopHelperQuotation::getQuotationItemAttributeDetail($quotation_item_id, $is_accessory, $section, $parent_section_id); + } +} diff --git a/component/admin/helpers/redconfiguration.php b/component/admin/helpers/redconfiguration.php new file mode 100644 index 00000000000..242acbac0ed --- /dev/null +++ b/component/admin/helpers/redconfiguration.php @@ -0,0 +1,425 @@ +isConfigurationFile(); + } + + /** + * check table exist + * + * @return boolean + * + * @deprecated 2.0.6 + */ + public function isCFGTable() + { + return App::getInstance()->isConfigurationTable(); + } + + /** + * write configuration table data to file + * + * @param array $org Config additional variables to merge + * + * @return void + * + * @deprecated 2.0.6 + */ + public function setCFGTableData($org = array()) + { + App::getInstance()->storeConfigurationTable($org); + } + + /** + * load Default configuration file + * + * @return boolean + * + * @deprecated 2.0.6 + */ + public function loadDefaultCFGFile() + { + return App::getInstance()->loadDefaultConfigurationFile(); + } + + /** + * manage configuration file during installation + * + * @param array $org Config additional variables to merge + * + * @return boolean + * + * @deprecated 2.0.6 + */ + public function manageCFGFile($org = array()) + { + return App::getInstance()->manageConfigurationFile($org); + } + + /** + * Define Configuration file. We are preparing define text on this function. + * + * @param array $data Configuration Data associative array + * @param boolean $bypass Don't write anything and simply bypass if it is set to true. + * + * @return void + * + * @deprecated 2.0.6 + */ + public function defineCFGVars($data, $bypass = false) + { + App::getInstance()->defineConfigurationVariables($data, $bypass); + } + + /** + * Write prepared data into a file. + * + * @return boolean True when file successfully saved. + * + * @deprecated 2.0.6 + */ + public function writeCFGFile() + { + return App::getInstance()->writeConfigurationFile(); + } + + /** + * Update Configuration file with new parameter. + * This function is specially use during upgrading redSHOP and need to put new configuration params. + * + * @return boolean True when file successfully updated. + * + * @deprecated 2.0.6 + */ + public function updateCFGFile() + { + return App::getInstance()->updateConfigurationFile(); + } + + /** + * Backup Configuration file before running wizard. + * + * @return boolean True on successfully backed up. + * + * @deprecated 2.0.6 + */ + public function backupCFGFile() + { + return App::getInstance()->backupConfigurationFile(); + } + + /** + * Try to find if temp configuration file is available. This function is for wizard. + * + * @return boolean True when file is exist. + * + * @deprecated 2.0.6 + */ + public function isTmpFile() + { + return App::getInstance()->checkTemporaryConfigFile(); + } + + /** + * Check if temp file is writeable or not. + * + * @return boolean True if file is writeable. + */ + public function isTMPFileWritable() + { + return App::getInstance()->isTemporaryConfigFileCanWrite(); + } + + /** + * Check if definition file is available or not. + * + * @return boolean True if file is exist. + * @throws Exception + */ + public function isDEFFile() + { + if (file_exists($this->configDefPath)) + { + if ($this->isDEFFileWritable()) + { + require_once $this->configDefPath; + + return true; + } + } + else + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_REDSHOP_DEF_FILE_NOT_FOUND'), 'error'); + } + + return false; + } + + /** + * Check for def file is writeable or not. + * + * @return boolean True if file is writeable. + * @throws Exception + */ + public function isDEFFileWritable() + { + if (!is_writable($this->configDefPath)) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_REDSHOP_DEF_FILE_NOT_WRITABLE'), 'error'); + + return false; + } + + return true; + } + + /** + * Restore configuration file from temp file. + * + * @return boolean True if file is restored. + * @throws Exception + * + * @deprecated 2.0.6 + */ + public function storeFromTMPFile() + { + global $temparray; + global $defaultarray; + + if ($this->isTmpFile() && $this->isDEFFile()) + { + $ncfgdata = array_merge($defaultarray, $temparray); + $config_array = $this->redshopCFGData($ncfgdata); + $this->defineCFGVars($config_array, true); + $this->backupCFGFile(); + + if (!$this->writeCFGFile()) + { + return false; + } + } + + return true; + } + + /** + * This function will define relation between keys and define variables. + * This needs to be updated when you want new variable in configuration. + * + * @param array $data Associative array of values. Typically a from $_POST. + * + * @return array Associative array of configuration variables which are ready to write. + * + * @deprecated 2.0.6 + */ + public function redshopCFGData($data) + { + return App::getInstance()->prepareConfigData($data); + } + + /** + * We are using file for saving configuration variables + * We need some variables that can be uses as dynamically + * Here is the logic to define that variables + * + * IMPORTANT: we need to call this function in plugin or module manually to see the effect of this variables + * + * @return void + */ + public function defineDynamicVars() + { + RedshopHelperUtility::defineDynamicVariables(); + } + + /** + * Method for limit chars + * + * @param string $desc Description + * @param int $maxChars Maximum chars + * @param string $suffix Suffix + * + * @return string + * + * @deprecated 2.0.6 Use RedshopHelperUtility::maxChars() instead + */ + public function maxchar($desc = '', $maxChars = 0, $suffix = '') + { + return RedshopHelperUtility::maxChars($desc, $maxChars, $suffix); + } + + /** + * Method for sub-string with length. + * + * @param string $text Text for sub-string + * @param int $length Maximum chars + * @param string $ending Ending text + * @param boolean $exact Exact + * @param boolean $considerHtml Consider HTML + * + * @return string + * + * @deprecated 2.0.6 Use RedshopHelperUtility::limitText() instead + */ + public function substrws($text, $length = 50, $ending = '...', $exact = false, $considerHtml = true) + { + return RedshopHelperUtility::limitText($text, $length, $ending, $exact, $considerHtml); + } + + /** + * Method to get date format + * + * @access public + * + * @return array + * + * @since 1.5 + * + * @deprecated 2.0.6 Use RedshopHelperDatetime::getDateFormat() instead. + */ + public function getDateFormat() + { + return RedshopHelperDatetime::getDateFormat(); + } + + /** + * Method to convert date according to format + * + * @param int $date Date time (Unix format). + * + * @return string + * + * @since 1.5 + * + * @deprecated 2.0.6 Use RedshopHelperDatetime::convertDateFormat() instead, + */ + public function convertDateFormat($date) + { + return RedshopHelperDatetime::convertDateFormat($date); + } + + /** + * Method to get Country by country 3 code. + * + * @param int $conId Country 3 code + * + * @return integer + * + * @deprecated 2.0.6 Use RedshopHelperWorld::getCountryId() instead. + */ + public function getCountryId($conId) + { + return RedshopHelperWorld::getCountryId($conId); + } + + /** + * Method to get Country 2 code by Country 3 code. + * + * @param int $country3code Country 3 code + * + * @return string + * + * @deprecated 2.0.6 Use RedshopHelperWorld::getCountryCode2() instead. + */ + public function getCountryCode2($country3code) + { + return RedshopHelperWorld::getCountryCode2($country3code); + } + + /** + * Method to get State code 2 by State code 3. + * + * @param int $stateCode State 3 code + * + * @return string + * + * @deprecated 2.0.6 Use RedshopHelperWorld::getStateCode2() instead. + */ + public function getStateCode2($stateCode) + { + return RedshopHelperWorld::getStateCode2($stateCode); + } + + /** + * Method for get State Code + * + * @param int $id ID of state. + * @param string $stateCode State code 2 + * + * @return string + * + * @deprecated 2.0.6 Use RedshopHelperWorld::getStateCode() instead. + */ + public function getStateCode($id, $stateCode) + { + return RedshopHelperWorld::getStateCode($id, $stateCode); + } +} diff --git a/component/admin/helpers/redmediahelper.php b/component/admin/helpers/redmediahelper.php new file mode 100644 index 00000000000..8ee6e100f55 --- /dev/null +++ b/component/admin/helpers/redmediahelper.php @@ -0,0 +1,92 @@ +_db = JFactory::getDbo(); + $this->_table_prefix = '#__redshop_'; + $this->_carthelper = rsCarthelper::getInstance(); + $this->_redhelper = redhelper::getInstance(); + $this->_order_functions = order_functions::getInstance(); + } + + /** + * Method to get mail section + * + * @param int $tId Template id + * @param string $section Template section + * @param string $extraCond Extra condition for query + * + * @return array + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::getMailTemplate($tId, $section, $extraCond) instead + */ + public function getMailtemplate($tId = 0, $section = '', $extraCond = '') + { + return Redshop\Mail\Helper::getTemplate($tId, $section, $extraCond); + } + + /** + * sendOrderMail function. + * + * @param int $orderId Order ID. + * @param boolean $onlyAdmin send mail only to admin + * + * @return boolean + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendOrderMail($orderId, $onlyAdmin) instead + */ + public function sendOrderMail($orderId, $onlyAdmin = false) + { + return Redshop\Mail\Order::sendMail($orderId, $onlyAdmin); + } + + /** + * send Order Special Discount Mail function. + * + * @param int $orderId Order ID. + * + * @return boolean + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendOrderSpecialDiscountMail($orderId) instead + */ + public function sendOrderSpecialDiscountMail($orderId) + { + return Redshop\Mail\Order::sendSpecialDiscountMail($orderId); + } + + /** + * Create multiple print invoice PDF + * + * @param int $oid Order ID List. + * + * @return boolean + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::createMultiprintInvoicePdf($oid) instead + */ + public function createMultiprintInvoicePdf($oid) + { + return RedshopHelperPdf::createMultiInvoice($oid); + } + + /** + * Replace invoice mail template tags and prepare mail body and pdf html + * + * @param integer $orderId Order Information ID + * @param string $html HTML template of mail body or pdf + * @param string $subject Email Subject template, can be null for PDF + * @param string $type Either 'html' or 'pdf' + * + * @return object Object having mail body and subject. subject can be null for PDF type. + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::replaceInvoiceMailTemplate($orderId, $html, $subject, $type) instead + */ + protected function replaceInvoiceMailTemplate($orderId, $html, $subject = null, $type = 'pdf') + { + return Redshop\Mail\Invoice::replaceTemplate($orderId, $html, $subject); + } + + /** + * Send Order Invoice Mail + * Email Body and Subject is from "Invoice Mail" template section. + * Contains PDF attachement. PDF html is from "Invoice Mail PDF" section. + * + * @param integer $orderId Order Information Id + * + * @return boolean True on sending email successfully. + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendInvoiceMail($orderId) instead + */ + public function sendInvoiceMail($orderId) + { + return Redshop\Mail\Invoice::sendMail($orderId); + } + + /** + * Send registration mail + * + * @param array $data registration data + * + * @return boolean + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendRegistrationMail(&$data) instead + */ + public function sendRegistrationMail(&$data) + { + return Redshop\Mail\User::sendRegistrationMail($data); + } + + /** + * Send tax exempt mail + * + * @param string $section Mail section + * @param array $userInfo User info data + * @param string $email User email + * + * @return boolean + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendTaxExemptMail($section, $userInfo, $email) instead + */ + public function sendTaxExemptMail($section, $userInfo = array(), $email = "") + { + return Redshop\Mail\User::sendTaxExempt($section, $userInfo, $email); + } + + /** + * Send subcription renewwal mail + * + * @param array $data Mail data + * + * @return boolean + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendSubscriptionRenewalMail($data) instead + */ + public function sendSubscriptionRenewalMail($data = array()) + { + return Redshop\Mail\User::sendSubscriptionRenewal($data); + } + + /** + * Use absolute paths instead of relative ones when linking images + * + * @param string $message Text message + * + * @return string + * + * @deprecated 2.0.0.3 Use Redshop\Mail\Helper::imgInMail + * @see Redshop\Mail\Helper::imgInMail + */ + public function imginmail($message) + { + Redshop\Mail\Helper::imgInMail($message); + + return $message; + } + + /** + * Use absolute paths instead of relative ones when linking images + * + * @param int $quotationId Quotation id + * @param int $status Status + * + * @return boolean + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendQuotationMail($quotationId, $status) instead + */ + public function sendQuotationMail($quotationId, $status = 0) + { + return Redshop\Mail\Quotation::sendMail($quotationId, $status); + } + + /** + * Send newsletter confirmation mail + * + * @param int $subscriptionId Subscription id + * + * @return boolean + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendNewsletterConfirmationMail($subscriptionId) instead + */ + public function sendNewsletterConfirmationMail($subscriptionId) + { + return Redshop\Mail\Newsletter::sendConfirmationMail($subscriptionId); + } + + /** + * Send newsletter cancellation mail + * + * @param string $email Email + * + * @return boolean + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendNewsletterCancellationMail($email) instead + */ + public function sendNewsletterCancellationMail($email = "") + { + return Redshop\Mail\Newsletter::sendCancellationMail($email); + } + + /** + * Send ask question mail + * + * @param int $ansid Answer id + * + * @return boolean + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendAskQuestionMail($ansid) instead + */ + public function sendAskQuestionMail($ansid) + { + return Redshop\Mail\AskQuestion::sendMail($ansid); + } + + /** + * Send economic book invoice mail + * + * @param int $orderId Order id + * @param string $bookInvoicePdf Book invoice PDF + * + * @return boolean + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendEconomicBookInvoiceMail($orderId, $bookInvoicePdf) instead + */ + public function sendEconomicBookInvoiceMail($orderId = 0, $bookInvoicePdf = "") + { + return Redshop\Mail\Invoice::sendEconomicBookInvoiceMail($orderId, $bookInvoicePdf); + } + + /** + * Send request tax exempt mail + * + * @param object $data Mail data + * @param string $username Username + * + * @return boolean + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendRequestTaxExemptMail($data, $username) instead + */ + public function sendRequestTaxExemptMail($data, $username = "") + { + return Redshop\Mail\User::sendRequestTaxExempt($data, $username); + } + + /** + * Send catalog request + * + * @param array $catalog Catalog data + * + * @return boolean + * + * @deprecated 2.0.0.3 Use RedshopHelperMail::sendCatalogRequest($catalog) instead + */ + public function sendCatalogRequest($catalog = array()) + { + return Redshop\Mail\Catalog::sendRequest($catalog); + } +} diff --git a/component/admin/helpers/redtemplate.php b/component/admin/helpers/redtemplate.php new file mode 100644 index 00000000000..305bd891965 --- /dev/null +++ b/component/admin/helpers/redtemplate.php @@ -0,0 +1,252 @@ +redshop_template_path = JPATH_SITE . '/components/com_redshop/templates'; + + if (!is_dir($this->redshop_template_path)) + { + jimport('joomla.filesystem.folder'); + chmod(JPATH_SITE . '/components/com_redshop', 0755); + JFolder::create($this->redshop_template_path, 0755); + } + } + + /** + * Get Template Values + * + * @param string $name Name template hint + * @param string $templateSection Template section + * @param string $descriptionSeparator Description separator + * @param string $lineSeparator Line separator + * + * @return array|string + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::getTemplateValues($name, $templateSection, $descriptionSeparator, + * $lineSeparator) instead + */ + public static function getTemplateValues($name, $templateSection = '', $descriptionSeparator = '-', $lineSeparator = '
    ') + { + return RedshopHelperTemplate::getTemplateValues($name, $templateSection, $descriptionSeparator, $lineSeparator); + } + + /** + * Method to get Template + * + * @param string $section Set section Template + * @param integer $tId Template Id + * @param string $name Template Name + * + * @return array Template Array + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::getTemplate($section, $tId, $name) instead + */ + public function getTemplate($section = '', $tId = 0, $name = "") + { + return RedshopHelperTemplate::getTemplate($section, $tId, $name); + } + + /** + * Method to read Template from file + * + * @param string $section Template Section + * @param string $fileName Template File Name + * @param boolean $isAdmin Check for administrator call + * + * @return string Template Content + * + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::readtemplateFile($section, $fileName, $isAdmin) instead + */ + public function readtemplateFile($section, $fileName, $isAdmin = false) + { + return (string) RedshopHelperTemplate::readTemplateFile($section, $fileName); + } + + /** + * Method to get Template file path + * + * @param string $section Template Section + * @param string $fileName Template File Name + * @param boolean $isAdmin Check for administrator call + * + * @return string Template File Path + * + * @throws Exception + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::getTemplatefilepath($section, $fileName, $isAdmin) instead + */ + public function getTemplatefilepath($section, $fileName, $isAdmin = false) + { + return RedshopHelperTemplate::getTemplateFilePath($section, $fileName); + } + + /** + * Template View selector + * + * @param string $section Template Section + * + * @return string Template Joomla view name + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::getTemplateView($section) instead + */ + public function getTemplateView($section) + { + return ''; + } + + /** + * Method to parse joomla content plugin onContentPrepare event + * + * @param string $string Joomla content + * + * @return string Modified content + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::parseredSHOPplugin($string) instead + */ + public function parseredSHOPplugin($string = "") + { + return RedshopHelperTemplate::parseRedshopPlugin($string); + } + + /** + * Collect Template Sections for installation + * + * @param string $templateName Template Name + * @param boolean $setFlag Set true if you want html special character in template content + * + * @return string redSHOP Template Contents + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::getInstallSectionTemplate($templateName, $setFlag) instead + */ + public function getInstallSectionTemplate($templateName, $setFlag = false) + { + return RedshopHelperTemplate::getInstallSectionTemplate($templateName, $setFlag); + } + + /** + * Collect list of redSHOP Template + * + * @param string $sectionValue Template Section selected value + * + * @return array Template Section List options + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::getTemplateSections($sectionValue) instead + */ + public function getTemplateSections($sectionValue = "") + { + return RedshopHelperTemplate::getTemplateSections($sectionValue); + } + + /** + * Collect Mail Template Section Select Option Value + * + * @param string $sectionValue Selected Section Name + * + * @return array Mail Template Select list options + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::getMailSections($sectionValue) instead + */ + public function getMailSections($sectionValue = "") + { + return RedshopHelperTemplate::getMailSections($sectionValue); + } + + /** + * Collect redSHOP costume field section select list option + * + * @param string $sectionValue Selected option Value + * + * @return array Costume field Select list options + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::getFieldSections($sectionValue) instead + */ + public function getFieldSections($sectionValue = "") + { + return RedshopHelperTemplate::getFieldSections($sectionValue); + } + + /** + * Collect Costume field type select list options + * + * @param string $sectionValue Selected field type section + * + * @return array Costume field type option list + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::getFieldTypeSections($sectionValue) instead + */ + public function getFieldTypeSections($sectionValue = "") + { + return RedshopHelperTemplate::getFieldTypeSections($sectionValue); + } + + /** + * Prepare Options for Select list + * + * @param array $options Associative Options array + * @param string $sectionValue Get single Section name + * + * @return mixed String or array based on $sectionValue + * + * @deprecated 2.0.0.3 Use RedshopHelperTemplate::prepareSectionOptions($options, $sectionValue) instead + */ + public function prepareSectionOptions($options, $sectionValue) + { + return RedshopHelperTemplate::prepareSectionOptions($options, $sectionValue); + } +} diff --git a/component/admin/helpers/rsstockroomhelper.php b/component/admin/helpers/rsstockroomhelper.php new file mode 100644 index 00000000000..da61febfc3c --- /dev/null +++ b/component/admin/helpers/rsstockroomhelper.php @@ -0,0 +1,457 @@ + + * + * @deprecated 2.0.3 Use RedshopHelperShopper_Group::listTree() instead + */ + public function list_tree($shopper_group_id = 0, $cid = 0, $level = 0, $selected_groups = array(), $disabledFields = array(), $html = '') + { + return RedshopHelperShopper_Group::listTree($shopper_group_id, $cid, $level, $selected_groups, $disabledFields, $html); + } + + /** + * Get Shopper Group List as Array + * + * @param integer $shopper_group_id Shopper Group ID to display + * @param integer $cid Parent ID + * @param integer $level Position + * + * @return array + * @throws Exception + * + * @deprecated 2.0.3 Use RedshopHelperShopper_Group::getShopperGroupListArray() instead + */ + public function getshopperGroupListArray($shopper_group_id = "", $cid = 0, $level = 0) + { + return RedshopHelperShopper_Group::getShopperGroupListArray($shopper_group_id, $cid, $level); + } + + /** + * Get Category List Reverce Array + * + * @param integer $cid Parent ID + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperShopper_Group::getCategoryListReverceArray() instead + */ + public function getCategoryListReverceArray($cid = 0) + { + return RedshopHelperShopper_Group::getCategoryListReverceArray($cid); + } +} diff --git a/component/admin/helpers/text_library.php b/component/admin/helpers/text_library.php new file mode 100644 index 00000000000..f454f8bc37c --- /dev/null +++ b/component/admin/helpers/text_library.php @@ -0,0 +1,60 @@ + \ No newline at end of file diff --git a/component/admin/helpers/wizard/redshop.cfg.def.php b/component/admin/helpers/wizard/redshop.cfg.def.php new file mode 100644 index 00000000000..73bdee57d16 --- /dev/null +++ b/component/admin/helpers/wizard/redshop.cfg.def.php @@ -0,0 +1,316 @@ +get('REDCURRENCY_SYMBOL'); +$temparray["price_seperator"] = Redshop::getConfig()->get('PRICE_SEPERATOR'); +$temparray["thousand_seperator"] = Redshop::getConfig()->get('THOUSAND_SEPERATOR'); +$temparray["currency_symbol_position"] = Redshop::getConfig()->get('CURRENCY_SYMBOL_POSITION'); +$temparray["price_decimal"] = Redshop::getConfig()->get('PRICE_DECIMAL'); +$temparray["show_price"] = Redshop::getConfig()->get('SHOW_PRICE'); +$temparray["use_tax_exempt"] = Redshop::getConfig()->get('USE_TAX_EXEMPT'); +$temparray["tax_exempt_apply_vat"] = Redshop::getConfig()->get('TAX_EXEMPT_APPLY_VAT'); +$temparray["use_as_catalog"] = Redshop::getConfig()->get('PRE_USE_AS_CATALOG'); +$temparray["price_replacement"] = Redshop::getConfig()->get('PRICE_REPLACE'); +$temparray["price_replacement_url"] = Redshop::getConfig()->get('PRICE_REPLACE_URL'); +$temparray["zero_price_replacement"] = Redshop::getConfig()->get('ZERO_PRICE_REPLACE'); +$temparray["zero_price_replacement_url"] = Redshop::getConfig()->get('ZERO_PRICE_REPLACE_URL'); +$temparray["discount_mail_send"] = Redshop::getConfig()->get('DISCOUNT_MAIL_SEND'); +$temparray["discount_type"] = Redshop::getConfig()->get('DISCOUNT_TYPE'); +$temparray["discount_enable"] = Redshop::getConfig()->get('DISCOUNT_ENABLE'); +$temparray["coupons_enable"] = Redshop::getConfig()->get('COUPONS_ENABLE'); +$temparray["vouchers_enable"] = Redshop::getConfig()->get('VOUCHERS_ENABLE'); +$temparray["apply_voucher_coupon_already_discount"] = Redshop::getConfig()->get('APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT'); +$temparray["attribute_as_product_in_economic"] = Redshop::getConfig()->get('ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC'); +$temparray["economic_book_invoice_number"] = Redshop::getConfig()->get('ECONOMIC_BOOK_INVOICE_NUMBER'); +$temparray["days_mail1"] = Redshop::getConfig()->get('DAYS_MAIL1'); +$temparray["days_mail2"] = Redshop::getConfig()->get('DAYS_MAIL2'); +$temparray["days_mail3"] = Redshop::getConfig()->get('DAYS_MAIL3'); +$temparray["vat_rate_after_discount"] = Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT'); +$temparray["discoupon_duration"] = Redshop::getConfig()->get('DISCOUPON_DURATION'); +$temparray["shipping_after"] = Redshop::getConfig()->get('SHIPPING_AFTER'); +$temparray["discoupon_percent_or_total"] = Redshop::getConfig()->get('DISCOUPON_PERCENT_OR_TOTAL'); +$temparray["discoupon_value"] = Redshop::getConfig()->get('DISCOUPON_VALUE'); +$temparray["default_vat_country"] = Redshop::getConfig()->get('DEFAULT_VAT_COUNTRY'); +$temparray["default_vat_group"] = Redshop::getConfig()->get('DEFAULT_VAT_GROUP'); +$temparray["vat_based_on"] = Redshop::getConfig()->get('VAT_BASED_ON'); +$temparray["apply_vat_on_discount"] = Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT'); +$temparray["calculate_vat_on"] = Redshop::getConfig()->get('CALCULATE_VAT_ON'); +$temparray["vat_introtext"] = Redshop::getConfig()->get('VAT_INTROTEXT'); +$temparray["with_vat_text_info"] = Redshop::getConfig()->get('WITH_VAT_TEXT_INFO'); +$temparray["without_vat_text_info"] = Redshop::getConfig()->get('WITHOUT_VAT_TEXT_INFO'); +$temparray["rating_msg"] = Redshop::getConfig()->get('RATING_MSG'); +$temparray['rating_review_login_required'] = Redshop::getConfig()->get('RATING_REVIEW_LOGIN_REQUIRED'); +$temparray["register_method"] = Redshop::getConfig()->get('REGISTER_METHOD'); +$temparray["show_email_verification"] = Redshop::getConfig()->get('SHOW_EMAIL_VERIFICATION'); +$temparray["new_customer_selection"] = Redshop::getConfig()->get('NEW_CUSTOMER_SELECTION'); +$temparray["terms_article"] = Redshop::getConfig()->get('TERMS_ARTICLE_ID'); +$temparray["terms_article_id"] = Redshop::getConfig()->get('TERMS_ARTICLE_ID'); +$temparray["allow_customer_register_type"] = Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE'); +$temparray["default_customer_register_type"] = Redshop::getConfig()->get('DEFAULT_CUSTOMER_REGISTER_TYPE'); +$temparray["checkout_login_register_switcher"] = Redshop::getConfig()->get('CHECKOUT_LOGIN_REGISTER_SWITCHER'); +$temparray["welcomepage_introtext"] = Redshop::getConfig()->get('WELCOMEPAGE_INTROTEXT'); +$temparray["registration_introtext"] = Redshop::getConfig()->get('REGISTRATION_INTROTEXT'); +$temparray["registration_comp_introtext"] = Redshop::getConfig()->get('REGISTRATION_COMPANY_INTROTEXT'); +$temparray["portal_shop"] = Redshop::getConfig()->get('PORTAL_SHOP'); +$temparray["portal_login_itemid"] = Redshop::getConfig()->get('PORTAL_LOGIN_ITEMID'); +$temparray["portal_logout_itemid"] = Redshop::getConfig()->get('PORTAL_LOGOUT_ITEMID'); +$temparray["default_portal_name"] = Redshop::getConfig()->get('DEFAULT_PORTAL_NAME'); +$temparray["shopper_group_default_private"] = Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_PRIVATE'); +$temparray["shopper_group_default_company"] = Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_COMPANY'); +$temparray["new_shopper_group_get_value_from"] = Redshop::getConfig()->get('NEW_SHOPPER_GROUP_GET_VALUE_FROM'); +$temparray["default_portal_logo"] = Redshop::getConfig()->get('DEFAULT_PORTAL_LOGO'); +$temparray["default_portal_logo_tmp"] = Redshop::getConfig()->get('DEFAULT_PORTAL_LOGO'); +$temparray["administrator_email"] = Redshop::getConfig()->get('ADMINISTRATOR_EMAIL'); +$temparray["table_prefix"] = Redshop::getConfig()->get('TABLE_PREFIX'); +$temparray["shop_country"] = Redshop::getConfig()->get('SHOP_COUNTRY'); +$temparray["default_shipping_country"] = Redshop::getConfig()->get('DEFAULT_SHIPPING_COUNTRY'); +$temparray["welcome_msg"] = Redshop::getConfig()->get('WELCOME_MSG'); +$temparray["shop_name"] = Redshop::getConfig()->get('SHOP_NAME'); +$temparray["default_dateformat"] = Redshop::getConfig()->get('DEFAULT_DATEFORMAT'); +$temparray["invoice_mail_enable"] = Redshop::getConfig()->get('INVOICE_MAIL_ENABLE'); +$temparray["invoice_mail_send_option"] = Redshop::getConfig()->get('INVOICE_MAIL_SEND_OPTION'); +$temparray["country_list"] = Redshop::getConfig()->get('COUNTRY_LIST'); +$temparray["currency_code"] = Redshop::getConfig()->get('CURRENCY_CODE'); +$temparray["default_vat_state"] = Redshop::getConfig()->get('DEFAULT_VAT_STATE'); +$temparray["noof_thumb_for_scroller"] = Redshop::getConfig()->get('NOOF_THUMB_FOR_SCROLLER'); +$temparray["watermark_product_additional_image"] = Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE'); +$temparray["accessory_as_product_in_cart_enable"] = Redshop::getConfig()->get('ACCESSORY_AS_PRODUCT_IN_CART_ENABLE'); +$temparray["attribute_scroller_thumb_width"] = Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_WIDTH'); +$temparray["attribute_scroller_thumb_height"] = Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_HEIGHT'); +$temparray["use_encoding"] = Redshop::getConfig()->get('USE_ENCODING'); +$temparray["requestquote_image"] = Redshop::getConfig()->get('REQUESTQUOTE_IMAGE'); +$temparray["requestquote_background"] = Redshop::getConfig()->get('REQUESTQUOTE_BACKGROUND'); +$temparray["addtocart_delete"] = Redshop::getConfig()->get('ADDTOCART_DELETE'); +$temparray["addtocart_update"] = Redshop::getConfig()->get('ADDTOCART_UPDATE'); +$temparray["shopper_group_default_unregistered"] = Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_UNREGISTERED'); +$temparray["required_vat_number"] = Redshop::getConfig()->get('REQUIRED_VAT_NUMBER'); +$temparray["default_stockamount_thumb_width"] = Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_WIDTH'); +$temparray["default_stockamount_thumb_height"] = Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_HEIGHT'); +$temparray["show_terms_and_conditions"] = Redshop::getConfig()->get('SHOW_TERMS_AND_CONDITIONS'); diff --git a/component/admin/helpers/wizard/redshop.cfg.tmp.php b/component/admin/helpers/wizard/redshop.cfg.tmp.php new file mode 100644 index 00000000000..b7cd070244a --- /dev/null +++ b/component/admin/helpers/wizard/redshop.cfg.tmp.php @@ -0,0 +1,89 @@ +get('REDCURRENCY_SYMBOL'); +$temparray["price_seperator"] = Redshop::getConfig()->get('PRICE_SEPERATOR'); +$temparray["thousand_seperator"] = Redshop::getConfig()->get('THOUSAND_SEPERATOR'); +$temparray["currency_symbol_position"] = Redshop::getConfig()->get('CURRENCY_SYMBOL_POSITION'); +$temparray["price_decimal"] = Redshop::getConfig()->get('PRICE_DECIMAL'); +$temparray["show_price"] = Redshop::getConfig()->get('SHOW_PRICE'); +$temparray["use_tax_exempt"] = Redshop::getConfig()->get('USE_TAX_EXEMPT'); +$temparray["tax_exempt_apply_vat"] = Redshop::getConfig()->get('TAX_EXEMPT_APPLY_VAT'); +$temparray["use_as_catalog"] = Redshop::getConfig()->get('PRE_USE_AS_CATALOG'); +$temparray["price_replacement"] = Redshop::getConfig()->get('PRICE_REPLACE'); +$temparray["price_replacement_url"] = Redshop::getConfig()->get('PRICE_REPLACE_URL'); +$temparray["zero_price_replacement"] = Redshop::getConfig()->get('ZERO_PRICE_REPLACE'); +$temparray["zero_price_replacement_url"] = Redshop::getConfig()->get('ZERO_PRICE_REPLACE_URL'); +$temparray["discount_mail_send"] = Redshop::getConfig()->get('DISCOUNT_MAIL_SEND'); +$temparray["discount_type"] = Redshop::getConfig()->get('DISCOUNT_TYPE'); +$temparray["discount_enable"] = Redshop::getConfig()->get('DISCOUNT_ENABLE'); +$temparray["coupons_enable"] = Redshop::getConfig()->get('COUPONS_ENABLE'); +$temparray["vouchers_enable"] = Redshop::getConfig()->get('VOUCHERS_ENABLE'); +$temparray["apply_voucher_coupon_already_discount"] = Redshop::getConfig()->get('APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT'); +$temparray["attribute_as_product_in_economic"] = Redshop::getConfig()->get('ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC'); +$temparray["economic_book_invoice_number"] = Redshop::getConfig()->get('ECONOMIC_BOOK_INVOICE_NUMBER'); +$temparray["days_mail1"] = Redshop::getConfig()->get('DAYS_MAIL1'); +$temparray["days_mail2"] = Redshop::getConfig()->get('DAYS_MAIL2'); +$temparray["days_mail3"] = Redshop::getConfig()->get('DAYS_MAIL3'); +$temparray["vat_rate_after_discount"] = Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT'); +$temparray["discoupon_duration"] = Redshop::getConfig()->get('DISCOUPON_DURATION'); +$temparray["shipping_after"] = Redshop::getConfig()->get('SHIPPING_AFTER'); +$temparray["discoupon_percent_or_total"] = Redshop::getConfig()->get('DISCOUPON_PERCENT_OR_TOTAL'); +$temparray["discoupon_value"] = Redshop::getConfig()->get('DISCOUPON_VALUE'); +$temparray["default_vat_country"] = Redshop::getConfig()->get('DEFAULT_VAT_COUNTRY'); +$temparray["default_vat_group"] = Redshop::getConfig()->get('DEFAULT_VAT_GROUP'); +$temparray["vat_based_on"] = Redshop::getConfig()->get('VAT_BASED_ON'); +$temparray["apply_vat_on_discount"] = Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT'); +$temparray["calculate_vat_on"] = Redshop::getConfig()->get('CALCULATE_VAT_ON'); +$temparray["vat_introtext"] = Redshop::getConfig()->get('VAT_INTROTEXT'); +$temparray["with_vat_text_info"] = Redshop::getConfig()->get('WITH_VAT_TEXT_INFO'); +$temparray["without_vat_text_info"] = Redshop::getConfig()->get('WITHOUT_VAT_TEXT_INFO'); +$temparray["rating_msg"] = Redshop::getConfig()->get('RATING_MSG'); +$temparray['rating_review_login_required'] = Redshop::getConfig()->get('RATING_REVIEW_LOGIN_REQUIRED'); +$temparray["register_method"] = Redshop::getConfig()->get('REGISTER_METHOD'); +$temparray["show_email_verification"] = Redshop::getConfig()->get('SHOW_EMAIL_VERIFICATION'); +$temparray["new_customer_selection"] = Redshop::getConfig()->get('NEW_CUSTOMER_SELECTION'); +$temparray["terms_article"] = Redshop::getConfig()->get('TERMS_ARTICLE_ID'); +$temparray["terms_article_id"] = Redshop::getConfig()->get('TERMS_ARTICLE_ID'); +$temparray["allow_customer_register_type"] = Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE'); +$temparray["default_customer_register_type"] = Redshop::getConfig()->get('DEFAULT_CUSTOMER_REGISTER_TYPE'); +$temparray["checkout_login_register_switcher"] = Redshop::getConfig()->get('CHECKOUT_LOGIN_REGISTER_SWITCHER'); +$temparray["welcomepage_introtext"] = Redshop::getConfig()->get('WELCOMEPAGE_INTROTEXT'); +$temparray["registration_introtext"] = Redshop::getConfig()->get('REGISTRATION_INTROTEXT'); +$temparray["registration_comp_introtext"] = Redshop::getConfig()->get('REGISTRATION_COMPANY_INTROTEXT'); +$temparray["portal_shop"] = Redshop::getConfig()->get('PORTAL_SHOP'); +$temparray["portal_login_itemid"] = Redshop::getConfig()->get('PORTAL_LOGIN_ITEMID'); +$temparray["portal_logout_itemid"] = Redshop::getConfig()->get('PORTAL_LOGOUT_ITEMID'); +$temparray["default_portal_name"] = Redshop::getConfig()->get('DEFAULT_PORTAL_NAME'); +$temparray["shopper_group_default_private"] = Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_PRIVATE'); +$temparray["shopper_group_default_company"] = Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_COMPANY'); +$temparray["new_shopper_group_get_value_from"] = Redshop::getConfig()->get('NEW_SHOPPER_GROUP_GET_VALUE_FROM'); +$temparray["default_portal_logo"] = Redshop::getConfig()->get('DEFAULT_PORTAL_LOGO'); +$temparray["default_portal_logo_tmp"] = Redshop::getConfig()->get('DEFAULT_PORTAL_LOGO'); +$temparray["administrator_email"] = Redshop::getConfig()->get('ADMINISTRATOR_EMAIL'); +$temparray["table_prefix"] = Redshop::getConfig()->get('TABLE_PREFIX'); +$temparray["shop_country"] = Redshop::getConfig()->get('SHOP_COUNTRY'); +$temparray["default_shipping_country"] = Redshop::getConfig()->get('DEFAULT_SHIPPING_COUNTRY'); +$temparray["welcome_msg"] = Redshop::getConfig()->get('WELCOME_MSG'); +$temparray["shop_name"] = Redshop::getConfig()->get('SHOP_NAME'); +$temparray["default_dateformat"] = Redshop::getConfig()->get('DEFAULT_DATEFORMAT'); +$temparray["invoice_mail_enable"] = Redshop::getConfig()->get('INVOICE_MAIL_ENABLE'); +$temparray["invoice_mail_send_option"] = Redshop::getConfig()->get('INVOICE_MAIL_SEND_OPTION'); +$temparray["country_list"] = Redshop::getConfig()->get('COUNTRY_LIST'); +$temparray["currency_code"] = Redshop::getConfig()->get('CURRENCY_CODE'); +$temparray["default_vat_state"] = Redshop::getConfig()->get('DEFAULT_VAT_STATE'); +$temparray["noof_thumb_for_scroller"] = Redshop::getConfig()->get('NOOF_THUMB_FOR_SCROLLER'); +$temparray["watermark_product_additional_image"] = Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE'); +$temparray["accessory_as_product_in_cart_enable"] = Redshop::getConfig()->get('ACCESSORY_AS_PRODUCT_IN_CART_ENABLE'); +$temparray["attribute_scroller_thumb_width"] = Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_WIDTH'); +$temparray["attribute_scroller_thumb_height"] = Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_HEIGHT'); +$temparray["use_encoding"] = Redshop::getConfig()->get('USE_ENCODING'); +$temparray["requestquote_image"] = Redshop::getConfig()->get('REQUESTQUOTE_IMAGE'); +$temparray["requestquote_background"] = Redshop::getConfig()->get('REQUESTQUOTE_BACKGROUND'); +$temparray["addtocart_delete"] = Redshop::getConfig()->get('ADDTOCART_DELETE'); +$temparray["addtocart_update"] = Redshop::getConfig()->get('ADDTOCART_UPDATE'); +$temparray["shopper_group_default_unregistered"] = Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_UNREGISTERED'); +$temparray["required_vat_number"] = Redshop::getConfig()->get('REQUIRED_VAT_NUMBER'); +$temparray["default_stockamount_thumb_width"] = Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_WIDTH'); +$temparray["default_stockamount_thumb_height"] = Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_HEIGHT'); +$temparray["show_terms_and_conditions"] = Redshop::getConfig()->get('SHOW_TERMS_AND_CONDITIONS'); diff --git a/component/admin/helpers/wizard/wizard.php b/component/admin/helpers/wizard/wizard.php new file mode 100644 index 00000000000..f589756c09d --- /dev/null +++ b/component/admin/helpers/wizard/wizard.php @@ -0,0 +1,460 @@ +input->get('step', ''); + + $helper = new redSHOPWizardHelper; + $template = new redSHOPWizardTemplate; + + if (!empty($step)) + { + $progress = $helper->install($step); + $html = $progress->message; + $status = $progress->status; + $nextstep = $progress->step; + $title = $progress->title; + $install = $progress->install; + $substep = isset($progress->substep) ? $progress->substep : 0; + } + else + { + $nextstep = 1; + + $html = $template->getHTML('welcome'); + + $status = true; + $title = JText::_('COM_REDSHOP_REDSHOP_CONFIGURATION_WIZARD'); + $install = 1; + $substep = 0; + } + + $template->setHTML($html, $nextstep, $title, $status, $install, $substep); + } +} + + +class redSHOPWizardHelper +{ + + function install($step=1) + { + switch ($step) + { + case 1: + // Check requirement + $status = $this->general(2); + break; + case 2: + // Install backend system + $status = $this->terms(3); + break; + case 3: + // Install backend system + $status = $this->user(4); + break; + case 4: + // Install ajax system + $status = $this->price(5); + break; + case 5: + // Show success message + $status = $this->finish(0); + break; + default: + $status = new stdClass; + $status->message = $this->getErrorMessage(0, '0a'); + $status->step = '-99'; + $status->title = JText::_('COM_REDSHOP_REDSHOP_CONFIGURATION_WIZARD'); + $status->install = 1; + break; + } + + return $status; + } + + function general( $step ) + { + $template = new redSHOPWizardTemplate; + + $status = true; + + $params = new stdClass; + $params->step = $step; + + $drawdata = new stdClass; + $drawdata->message = $template->getHTML('general', $params); + $drawdata->status = $status; + $drawdata->step = $step; + $drawdata->title = JText::_('COM_REDSHOP_REDSHOP_GENERAL_CONFIGURATION_WIZARD'); + $drawdata->install = 1; + + return $drawdata; + } + + function terms($step) + { + + $template = new redSHOPWizardTemplate; + + $status = true; + $this->pageTitle = JText::_('COM_REDSHOP_REDSHOP_CONFIGURATION_WIZARD'); + + $params = new stdClass; + $params->step = $step; + + $drawdata = new stdClass; + $drawdata->message = $template->getHTML('terms', $params); + $drawdata->status = $status; + $drawdata->step = $step; + $drawdata->title = JText::_('COM_REDSHOP_REDSHOP_TERMS_CONFIGURATION_WIZARD'); + $drawdata->install = 1; + + return $drawdata; + } + + function user($step) + { + + $template = new redSHOPWizardTemplate; + + $status = true; + $this->pageTitle = JText::_('COM_REDSHOP_REDSHOP_CONFIGURATION_WIZARD'); + + $params = new stdClass; + $params->step = $step; + + $drawdata = new stdClass; + $drawdata->message = $template->getHTML('user', $params); + $drawdata->status = $status; + $drawdata->step = $step; + $drawdata->title = JText::_('COM_REDSHOP_REDSHOP_USER_CONFIGURATION_WIZARD'); + $drawdata->install = 1; + + return $drawdata; + } + + function price($step) + { + + $template = new redSHOPWizardTemplate; + + $status = true; + + $params = new stdClass; + $params->step = $step; + + $drawdata = new stdClass; + $drawdata->message = $template->getHTML('price', $params); + $drawdata->status = $status; + $drawdata->step = $step; + $drawdata->title = JText::_('COM_REDSHOP_REDSHOP_PRICE_CONFIGURATION_WIZARD'); + $drawdata->install = 1; + + return $drawdata; + } + + function finish($step) + { + + $template = new redSHOPWizardTemplate; + + $status = true; + + $params = new stdClass; + $params->step = ''; + + $drawdata = new stdClass; + $drawdata->message = $template->getHTML('finish', $params); + $drawdata->status = $status; + $drawdata->step = $step; + $drawdata->title = JText::_('COM_REDSHOP_REDSHOP_FINISH_WIZARD'); + $drawdata->install = 1; + + return $drawdata; + } +} + + +class redSHOPWizardTemplate +{ + var $title = null; + + var $controller = null; + + protected $jinput = null; + + function __construct() + { + require_once JPATH_COMPONENT . '/controllers/wizard.php'; + + $this->title = ''; + $classname = 'RedshopControllerWizard'; + $this->controller = new $classname( array('default_task' => 'display') ); + $this->jinput = JFactory::getApplication()->input; + + } + + function getHTML($page='', $params='') + { + $page = '_' . $page; + + return $this->$page($params); + } + + function _welcome($params) + { + ob_start(); + + $this->jinput->set('layout', 'welcome'); + $this->jinput->set('params', $params); + $this->controller->execute($this->jinput->get('task')); + + // Update temp file with config data + $this->controller->execute('copyTempFile'); + + $html = ob_get_contents(); + ob_end_clean(); + + return $html; + } + + + function _general($params) + { + ob_start(); + + $this->jinput->set('layout', 'general'); + $this->jinput->set('params', $params); + $this->controller->execute($this->jinput->get('task')); + + // $this->controller->redirect(); + + $html = ob_get_contents(); + ob_end_clean(); + + return $html; + } + + function _terms($params) + { + ob_start(); + + $this->jinput->set('layout', 'terms'); + $this->jinput->set('params', $params); + $this->controller->execute($this->jinput->get('task')); + + $html = ob_get_contents(); + ob_end_clean(); + + return $html; + } + + function _user($params) + { + ob_start(); + + $this->jinput->set('layout', 'user'); + $this->jinput->set('params', $params); + $this->controller->execute($this->jinput->get('task')); + + $html = ob_get_contents(); + ob_end_clean(); + + return $html; + } + + function _price($params) + { + ob_start(); + + $this->jinput->set('layout', 'price'); + $this->jinput->set('params', $params); + $this->controller->execute($this->jinput->get('task')); + + $html = ob_get_contents(); + ob_end_clean(); + + return $html; + } + + function _finish($params) + { + ob_start(); + + $this->jinput->set('layout', 'finish'); + $this->jinput->set('params', $params); + $this->controller->execute($this->jinput->get('task')); + + $html = ob_get_contents(); + ob_end_clean(); + + return $html; + } + + function setHTML($output, $step, $title, $status, $install= 1, $substep=0) + { + + $html = ''; + + $html .= ' + + +
    +
    +
    + ' . $this->setHTMLTitle($title, $step) . ' +
    + +
    +
    ' . $output . '
    +
    +
    +
    '; + + echo $html; + } + + function setHTMLSidebar($activeSteps) + { + ob_start(); + ?> + + + + + Toggle navigation + +
    + + + Field != 'quantity') + { + continue; + } + + $catcol[] = $field; + } + break; + case "prdextrafield": + $fields = \Redshop\Repositories\Table::getFields('#__redshop_fields_data'); + + foreach ($fields as $field) + { + if ($field->Field == "user_email" || $field->Field == "section") + { + continue; + } + + $catcol[] = $field; + } + break; + default: + $table = "product"; + $fields = \Redshop\Repositories\Table::getFields('#__redshop_category'); + + foreach ($fields as $field) + { + if ($field->Field == 'category_name' || $field->Field == 'category_description') + { + $catcol[] = $field; + } + elseif ($field->Field == "category_template") // Start Code for display product_url + { + $field->Field = "link"; + $catcol[] = $field; + } + elseif ($field->Field == "category_thumb_image") // Start Code for display delivertime + { + $field->Field = "delivertime"; + $catcol[] = $field; + } + elseif ($field->Field == "category_full_image") // Start Code for display pickup + { + $field->Field = "pickup"; + $catcol[] = $field; + } + elseif ($field->Field == "category_back_full_image") // Start Code for display charges + { + $field->Field = "charge"; + $catcol[] = $field; + } + elseif ($field->Field == "category_pdate") // Start Code for display freight + { + $field->Field = "freight"; + $catcol[] = $field; + } + } + + // Start Code for display manufacturer name field + $fields = \Redshop\Repositories\Table::getFields('#__redshop_manufacturer'); + + foreach ($fields as $field) + { + if ($field->Field !== "name") + { + continue; + } + + $catcol[] = $field; + } + + break; + } + break; + case 'order': + $table = "orders"; + + switch ($childSection) + { + case "orderdetail": + $table = "orders"; + break; + case "billingdetail": + $table = "order_users_info"; + break; + case "shippingdetail": + $table = "order_users_info"; + break; + case "orderitem": + $table = "order_item"; + break; + } + + break; + } + + // Reset fields + $fields = array(); + + if ($section != "" && $table != "") + { + $fields = \Redshop\Repositories\Table::getFields('#__redshop_' . $table); + } + + $fields = array_merge($fields, $catcol); + + foreach ($fields as $index => $field) + { + if (strtoupper($fields[$index]->Key) == "PRI") + { + unset($fields[$index]); + } + } + + sort($fields); + + return $fields; + } + + /** + * @param string $fieldName Field name + * @param string $xmlFileTag Xml file tag + * + * @return array + * + * @since 2.1.0 + */ + public function getXMLFileTag($fieldName = "", $xmlFileTag) + { + $result = ""; + $update = 1; + + if (empty($xmlFileTag)) + { + return array($result, $update); + } + + $fields = explode(";", $xmlFileTag); + + foreach ($fields as $index => $field) + { + $value = explode("=", $field); + + if ($value[0] == $fieldName) + { + $result = trim($value[1]); + $update = (isset($value[2])) ? $value[2] : 0; + break; + } + } + + return array($result, $update); + } + + /** + * @param string $xmlFileTag Xml file tag + * + * @return array + */ + public function explodeXMLFileString($xmlFileTag = '') + { + if (empty($xmlFileTag)) + { + return array(); + } + + $value = array(); + $fields = explode(";", $xmlFileTag); + + foreach ($fields as $index => $field) + { + $value[$index] = explode("=", $field); + } + + return $value; + } + + /** + * @param integer $xmlExportId Xml export id + * + * @return mixed + */ + public function getXMLExportInfo($xmlExportId = 0) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->quoteName('#__redshop_xml_export', 'x')) + ->where($db->quoteName('x.xmlexport_id') . ' = ' . (int) $xmlExportId); + + return $db->setQuery($query)->loadObjectList(); + } + + public function getXMLExportIpAddress($xmlexport_id = 0) + { + $db = JFactory::getDbo(); + $query = "SELECT * FROM " . "#__redshop_xml_export_ipaddress AS x " + . "WHERE x.xmlexport_id=" . (int) $xmlexport_id; + + return $db->setQuery($query)->loadObjectlist(); + } + + public function insertXMLExportlog($xmlexport_id = 0, $filename = "") + { + $db = JFactory::getDbo(); + $query = "INSERT INTO " . "#__redshop_xml_export_log " + . "(xmlexport_id, xmlexport_filename, xmlexport_date) " + . "VALUES " + . "(" . (int) $xmlexport_id . ", " . $db->quote($filename) . "," . $db->quote(time()) . ") "; + + return $db->setQuery($query)->execute(); + } + + public function updateXMLExportFilename($xmlexport_id = 0, $filename = "") + { + $db = JFactory::getDbo(); + $query = "UPDATE " . "#__redshop_xml_export " + . "SET filename=" . $db->quote($filename) . " " + . "WHERE xmlexport_id=" . (int) $xmlexport_id; + + return $db->setQuery($query)->execute(); + } + + public function getXMLImportInfo($xmlimport_id = 0) + { + $db = JFactory::getDbo(); + $query = "SELECT * FROM " . "#__redshop_xml_import " + . "WHERE xmlimport_id=" . (int) $xmlimport_id; + + return $db->setQuery($query)->loadObjectList(); + } + + public function insertXMLImportlog($xmlimport_id = 0, $filename = "") + { + $db = JFactory::getDbo(); + $query = "INSERT INTO " . "#__redshop_xml_import_log " + . "(xmlimport_id, xmlimport_filename, xmlimport_date) " + . "VALUES " + . "(" . (int) $xmlimport_id . ", " . $db->quote($filename) . "," . (int) time() . ") "; + + return $db->setQuery($query)->execute(); + } + + public function updateXMLImportFilename($xmlimport_id = 0, $filename = "") + { + $db = JFactory::getDbo(); + $query = "UPDATE " . "#__redshop_xml_import " + . "SET filename=" . $db->quote($filename) . " " + . "WHERE xmlimport_id=" . (int) $xmlimport_id; + + return $db->setQuery($query)->execute(); + } + + /** + * @param integer $xmlExportId Xml export id + * + * @return string|boolean + */ + public function writeXMLExportFile($xmlExportId = 0) + { + $xmlarray = array(); + $xmlExportData = $this->getXMLExportInfo($xmlExportId); + + if (count($xmlExportData) <= 0) + { + return false; + } + + $destpath = JPATH_SITE . "/components/com_redshop/assets/xmlfile/export/"; + $section = $xmlExportData->section_type; + $columns = $this->getSectionColumnList($section, "orderdetail"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $tag = $this->getXMLFileTag($columns[$i]->Field, $xmlExportData->xmlexport_filetag); + + if ($tag[0] != "") + { + $xmlarray[$columns[$i]->Field] = $tag[0]; + } + } + + $datalist = array(); + $billinglist = array(); + $shippinglist = array(); + $orderItemlist = array(); + $stocklist = array(); + $prdextrafieldlist = array(); + $xmlbilling = array(); + $xmlshipping = array(); + $xmlOrderitem = array(); + $xmlstock = array(); + $xmlprdextrafield = array(); + $prdfullimage = ""; + $prdthmbimage = ""; + + switch ($section) + { + case "product": + if (array_key_exists("product_full_image", $xmlarray)) + { + $prdfullimage = $xmlarray['product_full_image']; + } + + if (array_key_exists("product_thumb_image", $xmlarray)) + { + $prdthmbimage = $xmlarray['product_thumb_image']; + } + + $datalist = $this->getProductList($xmlarray, $xmlExportData); + + $columns = $this->getSectionColumnList($section, "stockdetail"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $tag = $this->getXMLFileTag($columns[$i]->Field, $xmlExportData->xmlexport_stocktag); + + if ($tag[0] != "") + { + $xmlstock[$columns[$i]->Field] = $tag[0]; + } + } + + $columns = $this->getSectionColumnList($section, "prdextrafield"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $tag = $this->getXMLFileTag($columns[$i]->Field, $xmlExportData->xmlexport_prdextrafieldtag); + + if ($tag[0] != "") + { + $xmlprdextrafield[$columns[$i]->Field] = $tag[0]; + } + } + break; + case "order": + $datalist = $this->getOrderList($xmlarray); + + $columns = $this->getSectionColumnList($section, "billingdetail"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $tag = $this->getXMLFileTag($columns[$i]->Field, $xmlExportData->xmlexport_billingtag); + + if ($tag[0] != "") + { + $xmlbilling[$columns[$i]->Field] = $tag[0]; + } + } + + $columns = $this->getSectionColumnList($section, "shippingdetail"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $tag = $this->getXMLFileTag($columns[$i]->Field, $xmlExportData->xmlexport_shippingtag); + + if ($tag[0] != "") + { + $xmlshipping[$columns[$i]->Field] = $tag[0]; + } + } + + $columns = $this->getSectionColumnList($section, "orderitem"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $tag = $this->getXMLFileTag($columns[$i]->Field, $xmlExportData->xmlexport_orderitemtag); + + if ($tag[0] != "") + { + $xmlOrderitem[$columns[$i]->Field] = $tag[0]; + } + } + break; + default: + return false; + } + + // Make the filename unique + $filename = RedshopHelperMedia::cleanFileName($xmlExportData->display_filename . '.xml'); + + $xml_document = ""; + + if (trim($xmlExportData->element_name) == "") + { + $xmlExportData->element_name = $xmlExportData->parent_name . "_element"; + } + + $xml_document .= "<" . $xmlExportData->parent_name . ">"; + + for ($i = 0, $in = count($datalist); $i < $in; $i++) + { + $product_id = 0; + + if ($section == "product") + { + $product_id = $datalist[$i]['product_id']; + } + + $xml_billingdocument = ""; + $xml_shippingdocument = ""; + $xml_itemdocument = ""; + $xml_stockdocument = ""; + $xml_prdextradocument = ""; + + if (!empty($xmlbilling)) + { + $billinglist = $this->getOrderUserInfoList($xmlbilling, $datalist[$i]->order_id); + + if (!empty($billinglist)) + { + $xml_billingdocument .= "<$xmlExportData->billing_element_name>"; + + while (list($prop, $val) = each($billinglist)) + { + $val = html_entity_decode($val); + $xml_billingdocument .= "<$prop>"; + } + + $xml_billingdocument .= "billing_element_name>"; + } + } + + if (!empty($xmlshipping)) + { + $shippinglist = $this->getOrderUserInfoList($xmlshipping, $datalist[$i]->order_id, "ST"); + + if (!empty($shippinglist)) + { + $xml_shippingdocument .= "<$xmlExportData->shipping_element_name>"; + + while (list($prop, $val) = each($shippinglist)) + { + $val = html_entity_decode($val); + $xml_shippingdocument .= "<$prop>"; + } + + $xml_shippingdocument .= "shipping_element_name>"; + } + } + + if (!empty($xmlOrderitem)) + { + $orderItemlist = $this->getOrderItemList($xmlOrderitem, $datalist[$i]->order_id); + + if (!empty($orderItemlist)) + { + $xml_itemdocument .= "<" . $xmlExportData->orderitem_element_name . "s>"; + + for ($j = 0, $jn = count($orderItemlist); $j < $jn; $j++) + { + $xml_itemdocument .= "<$xmlExportData->orderitem_element_name>"; + + while (list($prop, $val) = each($orderItemlist[$j])) + { + $val = html_entity_decode($val); + $xml_itemdocument .= "<$prop>"; + } + + $xml_itemdocument .= "orderitem_element_name>"; + } + + $xml_itemdocument .= "orderitem_element_name . "s>"; + } + } + + if (!empty($xmlstock)) + { + $stocklist = $this->getStockroomList($xmlstock, $product_id); + + if (!empty($stocklist)) + { + $xml_stockdocument .= "<" . $xmlExportData->stock_element_name . "s>"; + + for ($j = 0, $jn = count($stocklist); $j < $jn; $j++) + { + $xml_stockdocument .= "<$xmlExportData->stock_element_name>"; + + while (list($prop, $val) = each($stocklist[$j])) + { + $val = html_entity_decode($val); + $xml_stockdocument .= "<$prop>"; + } + + $xml_stockdocument .= "stock_element_name>"; + } + + $xml_stockdocument .= "stock_element_name . "s>"; + } + } + + if (!empty($xmlprdextrafield)) + { + $prdextrafieldlist = $this->getExtraFieldList($xmlprdextrafield, $product_id, 1); + + if (!empty($prdextrafieldlist)) + { + $xml_prdextradocument .= "<" . $xmlExportData->prdextrafield_element_name . "s>"; + + for ($j = 0, $jn = count($prdextrafieldlist); $j < $jn; $j++) + { + $xml_prdextradocument .= "<" . $prdextrafieldlist[$j]->name . ">"; + + while (list($prop, $val) = each($prdextrafieldlist[$j])) + { + if ($prop == 'name') + { + continue; + } + + $val = html_entity_decode($val); + $xml_prdextradocument .= "<$prop>"; + } + + $xml_prdextradocument .= "name . ">"; + } + + $xml_prdextradocument .= "prdextrafield_element_name . "s>"; + } + } + + if ($section != "order" || !empty($xml_itemdocument)) + { + $xml_document .= "<$xmlExportData->element_name>"; + + while (list($prop, $val) = each($datalist[$i])) + { + $val = html_entity_decode($val); + + if ($prop == $prdfullimage && $val != "") + { + $val = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $val; + } + + if ($prop == $prdthmbimage && $val != "") + { + $val = REDSHOP_FRONT_IMAGES_ABSPATH . "product/thumb/" . $val; + } + + if ((isset($xmlarray['cdate']) && $prop == $xmlarray['cdate']) || (isset($xmlarray['mdate']) && $prop == $xmlarray['mdate'])) + { + $val = RedshopHelperDatetime::convertDateFormat((int) $val); + } + + if ($prop != "order_id" && $prop != "product_id") + { + // Start Code for display product url,delivertime,pickup,charges,freight + if ($prop == "manufacturer") + { + $val = "noname"; + } + + if ($prop == "link") + { + $val = JURI::root() . 'index.php?option=com_redshop&view=product&pid=' . $product_id; + } + + elseif ($prop == "pickup") + { + $val = ""; + } + + elseif ($prop == "charge") + { + $d['product_id'] = $product_id; + $srate = RedshopHelperShipping::getDefaultShippingXmlExport($d); + $val1 = $srate['shipping_rate']; + $val = round($val1); + } + + elseif ($prop == "freight") + { + $d['product_id'] = $product_id; + $srate = RedshopHelperShipping::getDefaultShippingXmlExport($d); + $val1 = $srate['shipping_rate']; + $val = round($val1); + } + + elseif ($prop == "delivertime") + { + $query = "SELECT * FROM " . "#__redshop_stockroom AS s " + . "LEFT JOIN " . "#__redshop_product_stockroom_xref AS sx ON s.stockroom_id=sx.stockroom_id " + . "WHERE product_id=" . (int) $product_id . " " + . "ORDER BY s.stockroom_id ASC "; + + $db = JFactory::getDbo(); + $list = $db->setQuery($query)->loadObject(); + + for ($k = 0, $kn = count($list); $k < $kn; $k++) + { + if ($list->max_del_time == 1 && $list->max_del_time < 2) + { + $val = "1"; + } + elseif ($list->max_del_time == 2 && $list->max_del_time <= 3) + { + $val = "2"; + } + elseif ($list->max_del_time == 4) + { + $val = "4"; + } + elseif ($list->max_del_time == 5) + { + $val = "5"; + } + elseif ($list->max_del_time >= 6 && $list->max_del_time <= 10) + { + $val = "6,7,8,9,10"; + } + elseif ($list->max_del_time == "") + { + $val = ""; + } + } + } + + $xml_document .= "<$prop>"; + } + } + + $xml_document .= $xml_billingdocument; + $xml_document .= $xml_shippingdocument; + $xml_document .= $xml_itemdocument; + $xml_document .= $xml_stockdocument; + $xml_document .= $xml_prdextradocument; + $xml_document .= "element_name . ">"; + } + } + + $xml_document .= "parent_name . ">"; + + // Data in Variables ready to be written to an XML file + JFile::write($destpath . $filename, $xml_document); + + $this->insertXMLExportlog($xmlExportId, $filename); + + // Update new generated exported file in database record + $this->updateXMLExportFilename($xmlExportId, $filename); + + return $filename; + } + + public function writeXMLImportFile($xmlimport_id = 0, $tmlxmlimport_url = "") + { + $destpath = JPATH_SITE . "/components/com_redshop/assets/xmlfile/import/"; + $xmlimportdata = $this->getXMLImportInfo($xmlimport_id); + + if (count($xmlimportdata) <= 0) + { + return false; // Import record not exists + } + + if ($tmlxmlimport_url == "" && $xmlimportdata->filename == "") + { + return false; // No URL to import file + } + + if ($tmlxmlimport_url != "") + { + $xmlimportdata->xmlimport_url = $tmlxmlimport_url; + } + else + { + $xmlimportdata->xmlimport_url = $destpath . $xmlimportdata->filename; + } + + $filedetail = $this->readXMLImportFile($xmlimportdata->xmlimport_url, $xmlimportdata); + $datalist = $filedetail['xmlarray']; + + if (count($datalist) <= 0) + { + return false; // No data In imported xmlfile.So no need to write import file. + } + + // Make the filename unique + $filename = RedshopHelperMedia::cleanFileName($xmlimportdata->display_filename . ".xml"); + + $xml_document = ""; + $xml_document .= "<" . $xmlimportdata->element_name . "s>"; + + for ($i = 0, $in = count($datalist); $i < $in; $i++) + { + $xml_document .= "<" . $xmlimportdata->element_name . ">"; + + while (list($prop, $val) = each($datalist[$i])) + { + if (is_array($val)) + { + $subdatalist = $val; + + if (isset($subdatalist[0])) + { + $xml_document .= "<" . $prop . ">"; + + for ($j = 0, $jn = count($subdatalist); $j < $jn; $j++) + { + $childelement = substr($prop, 0, -1); + $xml_document .= "<" . $childelement . ">"; + + while (list($subprop, $subval) = each($subdatalist[$j])) + { + $subval = html_entity_decode($subval); + $xml_document .= "<$subprop>"; + } + + $xml_document .= ""; + } + + $xml_document .= ""; + } + + elseif (!empty($subdatalist)) + { + $xml_document .= "<" . $prop . ">"; + + while (list($subprop, $subval) = each($subdatalist)) + { + $subval = html_entity_decode($subval); + $xml_document .= "<$subprop>"; + } + + $xml_document .= ""; + } + } + else + { + $val = html_entity_decode($val); + $xml_document .= "<$prop>"; + } + } + + $xml_document .= "element_name . ">"; + } + + $xml_document .= "element_name . "s>"; + + // Data in Variables ready to be written to an XML file + JFile::write($destpath . $filename, $xml_document); + + // Update new generated imported file in database record + $this->updateXMLImportFilename($xmlimport_id, $filename); + + return $filename; + } + + public function readXMLImportFile($file = "", $data = array(), $isImport = 0) + { + $resultsectionarray = array(); + $resultbillingarray = array(); + $resulshippingtarray = array(); + $resultorderitemarray = array(); + $resultstockarray = array(); + $resultprdextarray = array(); + + $xmlFileArray = array(); + $xmlBillingArray = array(); + $xmlShippingArray = array(); + $xmlOrderitemArray = array(); + $xmlStockArray = array(); + $xmlPrdextArray = array(); + + if ($isImport) + { + $xmlFileArray = $this->explodeXMLFileString($data->xmlimport_filetag); + $xmlBillingArray = $this->explodeXMLFileString($data->xmlimport_billingtag); + $xmlShippingArray = $this->explodeXMLFileString($data->xmlimport_shippingtag); + $xmlOrderitemArray = $this->explodeXMLFileString($data->xmlimport_orderitemtag); + $xmlStockArray = $this->explodeXMLFileString($data->xmlimport_stocktag); + $xmlPrdextArray = $this->explodeXMLFileString($data->xmlimport_prdextrafieldtag); + } + + $content = simplexml_load_file($file, 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_NOCDATA); + $mainelement = ""; + + foreach ($content as $key => $val) + { + $mainelement = $key; + break; + } + + $resultarray = array(); + + if (strtolower($mainelement) == strtolower($data->element_name)) + { + foreach ($content->$mainelement AS $mainelementval) + { + $row = array(); + $j = 0; + + foreach ($mainelementval AS $mainkey => $mainvalue) // Main element Array Start + { + if (!empty($mainvalue->children())) + { + $subrow = array(); + $subelement = ""; + + if (strtolower($mainkey) == strtolower($data->billing_element_name)) // Billing element Array Start + { + $subelement = $data->billing_element_name; + $l = 0; + + foreach ($mainvalue->children() AS $subkey => $subvalue) + { + $resultbillingarray[$l] = $subkey; + + if ($isImport == 0) + { + $subrow[$subkey] = (string) $subvalue; + } + + elseif ($isImport == 1 && trim($xmlBillingArray[$l][1]) != "" && $xmlBillingArray[$l][2] == 1) + { + $subrow[$xmlBillingArray[$l][1]] = (string) $subvalue; + } + + $l++; + } + } + elseif (strtolower($mainkey) == strtolower($data->shipping_element_name)) // Shipping element Array Start + { + $subelement = $data->shipping_element_name; + $l = 0; + + foreach ($mainvalue->children() AS $subkey => $subvalue) + { + $resulshippingtarray[$l] = $subkey; + + if ($isImport == 0) + { + $subrow[$subkey] = (string) $subvalue; + } + + elseif ($isImport == 1 && trim($xmlShippingArray[$l][1]) != "" && $xmlShippingArray[$l][2] == 1) + { + $subrow[$xmlShippingArray[$l][1]] = (string) $subvalue; + } + + $l++; + } + } + elseif (strtolower($mainkey) == strtolower($data->stock_element_name) + || strtolower(substr($mainkey, 0, -1)) == strtolower($data->stock_element_name)) // Stock element Array Start + { + $subelement = $data->stock_element_name; + $l = 0; + + foreach ($mainvalue->children() AS $subelementval) + { + $k = 0; + + foreach ($subelementval AS $subkey => $subvalue) + { + $resultstockarray[$k] = $subkey; + + if ($isImport == 0) + { + $subrow[$l][$subkey] = (string) $subvalue; + } + elseif ($isImport == 1 && trim($xmlStockArray[$k][1]) != "" && $xmlStockArray[$k][2] == 1) + { + $subrow[$l][$xmlStockArray[$k][1]] = (string) $subvalue; + } + + $k++; + } + + $l++; + } + } + elseif (strtolower($mainkey) == strtolower($data->prdextrafield_element_name) + || strtolower(substr($mainkey, 0, -1)) == strtolower($data->prdextrafield_element_name)) // Product Extra field element Array Start + { + $subelement = $data->prdextrafield_element_name; + $l = 0; + + foreach ($mainvalue->children() AS $subelementval) + { + $k = 0; + + foreach ($subelementval AS $subkey => $subvalue) + { + $resultprdextarray[$k] = $subkey; + + if ($isImport == 0) + { + $subrow[$l][$subkey] = (string) $subvalue; + } + elseif ($isImport == 1 && trim($xmlPrdextArray[$k][1]) != "" && $xmlPrdextArray[$k][2] == 1) + { + $subrow[$l][$xmlPrdextArray[$k][1]] = (string) $subvalue; + } + + $k++; + } + + $l++; + } + } + elseif (strtolower($mainkey) == strtolower($data->orderitem_element_name) || strtolower(substr($mainkey, 0, -1)) == strtolower($data->orderitem_element_name)) // Order item element Array Start + { + $subelement = $data->orderitem_element_name; + $l = 0; + + foreach ($mainvalue->children() AS $subelementval) + { + $k = 0; + + foreach ($subelementval AS $subkey => $subvalue) + { + $resultorderitemarray[$k] = $subkey; + + if ($isImport == 0) + { + $subrow[$l][$subkey] = (string) $subvalue; + } + elseif ($isImport == 1 && trim($xmlOrderitemArray[$k][1]) != "" && $xmlOrderitemArray[$k][2] == 1) + { + $subrow[$l][$xmlOrderitemArray[$k][1]] = (string) $subvalue; + } + + $k++; + } + + $l++; + } + } + + if ($subelement != "") + { + $row[$subelement] = $subrow; + } + } + else + { + $resultsectionarray[$j] = $mainkey; + + if ($isImport == 0) + { + $row[$mainkey] = (string) $mainvalue; + } + + elseif ($isImport == 1 && trim($xmlFileArray[$j][1]) != "" && $xmlFileArray[$j][2] == 1) + { + $row[$xmlFileArray[$j][1]] = (string) $mainvalue; + } + } + + $j++; + } + + $resultarray[] = $row; + } + } + + $result['xmlarray'] = $resultarray; + $result['xmlsectionarray'] = $resultsectionarray; + $result['xmlbillingarray'] = $resultbillingarray; + $result['xmlshippingarray'] = $resulshippingtarray; + $result['xmlorderitemarray'] = $resultorderitemarray; + $result['xmlstockarray'] = $resultstockarray; + $result['xmlprdextarray'] = $resultprdextarray; + + return $result; + } + + /** + * @param integer $xmlImportId Xml import id + * + * @return boolean + */ + public function importXMLFile($xmlImportId = 0) + { + $db = JFactory::getDbo(); + $xmlimportdata = $this->getXMLImportInfo($xmlImportId); + + if (count($xmlimportdata) <= 0) + { + return false; // Import record not exists + } + + $destpath = JPATH_SITE . "/components/com_redshop/assets/xmlfile/import/"; + + if (($xmlimportdata->filename == "" || !JFile::exists($destpath . $xmlimportdata->filename)) && $xmlimportdata->published == 0) + { + return false; + } + + $filedetail = $this->readXMLImportFile($destpath . $xmlimportdata->filename, $xmlimportdata, 1); + $datalist = $filedetail['xmlarray']; + + if (count($datalist) <= 0) + { + return false; // No data In imported xmlfile.So no need to write import file. + } + + switch ($xmlimportdata->section_type) + { + case "product": + for ($i = 0, $in = count($datalist); $i < $in; $i++) + { + $oldproduct_number = $datalist[$i]['product_number']; + $update = false; + + if (array_key_exists('product_number', $datalist[$i]) && $datalist[$i]['product_number'] != "") + { + if (\Redshop\Repositories\Product::getProductByNumber($datalist[$i]['product_number'])) + { + $update = true; + $datalist[$i]['product_number'] = $xmlimportdata->add_prefix_for_existing . $datalist[$i]['product_number']; + } + } + + if (array_key_exists('product_full_image', $datalist[$i]) && $datalist[$i]['product_full_image'] != "") + { + $src = $datalist[$i]['product_full_image']; + $filename = basename($src); + $dest = REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $filename; + + $this->importRemoteImage($src, $dest); + $datalist[$i]['product_full_image'] = $filename; + } + + if (array_key_exists('product_thumb_image', $datalist[$i]) && $datalist[$i]['product_thumb_image'] != "") + { + $src = $datalist[$i]['product_thumb_image']; + $filename = basename($src); + $dest = REDSHOP_FRONT_IMAGES_RELPATH . "product/thumb/" . $filename; + + $this->importRemoteImage($src, $dest); + $datalist[$i]['product_thumb_image'] = $filename; + } + + // UPDATE EXISTING IF RECORD EXISTS + if ($xmlimportdata->override_existing && $update) + { + $datalist[$i]['product_number'] = $oldproduct_number; + + $query = "SELECT product_id FROM " . "#__redshop_product " + . "WHERE product_number=" . $db->quote($oldproduct_number); + $product_id = $db->setQuery($query)->loadResult(); + + $prdarray = array(); + $catarray = array(); + + while (list($key, $value) = each($datalist[$i])) + { + if (!is_array($value)) + { + if ($key != "category_id" && $key != "category_name") + { + $prdarray[] = $key . "='" . addslashes($value) . "' "; + } + else + { + $catarray[$key] = addslashes($value); + } + } + elseif (!empty($value)) + { + for ($j = 0, $jn = count($value); $j < $jn; $j++) + { + if ($key == $xmlimportdata->stock_element_name) + { + if (isset($value[$j]['stockroom_name'])) + { + $stockarray = array(); + + while (list($subkey, $subvalue) = each($value[$j])) + { + $stockarray[] = $subkey . "='" . addslashes($subvalue) . "' "; + } + + $stockstring = implode(", ", $stockarray); + + if (trim($stockstring) != "") + { + $query = "UPDATE " . "#__redshop_stockroom AS s " + . ", " . "#__redshop_product_stockroom_xref AS sx " + . ", " . "#__redshop_product AS p " + . "SET $stockstring " + . "WHERE sx.stockroom_id=s.stockroom_id " + . "AND sx.product_id=p.product_id " + . "AND p.product_number=" . $db->quote($oldproduct_number) . " " + . "AND s.stockroom_name=" . $db->quote($value[$j]['stockroom_name']) . " "; + + $db->setQuery($query)->execute(); + $affected_rows = $db->getAffectedRows(); + + if (!$affected_rows) + { + $query = "SELECT stockroom_id FROM " . "#__redshop_stockroom " + . "WHERE stockroom_name=" . $db->quote($value[$j]['stockroom_name']) . ""; + $db->setQuery($query); + $stockroom_id = $db->loadResult(); + + if (!$stockroom_id) + { + $query = "INSERT IGNORE INTO " . "#__redshop_stockroom " + . "(stockroom_name) VALUES (" . $db->quote($value[$j]['stockroom_name']) . ")"; + $db->setQuery($query); + $db->execute(); + $stockroom_id = $db->insertid(); + } + + $query = "INSERT IGNORE INTO " . "#__redshop_product_stockroom_xref " + . "(stockroom_id,product_id,quantity) VALUES (" . (int) $stockroom_id . "," . (int) $product_id . ",0)"; + + $db->setQuery($query)->execute(); + + $query = "UPDATE " . "#__redshop_stockroom AS s " + . ", " . "#__redshop_product_stockroom_xref AS sx " + . ", " . "#__redshop_product AS p " + . "SET $stockstring " + . "WHERE sx.stockroom_id=s.stockroom_id " + . "AND sx.product_id=p.product_id " + . "AND p.product_number=" . $db->quote($oldproduct_number) . " " + . "AND s.stockroom_name=" . $db->quote($value[$j]['stockroom_name']) . " "; + + $db->setQuery($query)->execute(); + } + } + } + } + elseif ($key == $xmlimportdata->prdextrafield_element_name) + { + if (isset($value[$j]['fieldid'])) + { + $prdextarray = array(); + + while (list($subkey, $subvalue) = each($value[$j])) + { + $prdextarray[] = $subkey . "='" . addslashes($subvalue) . "' "; + } + + $prdextstring = implode(", ", $prdextarray); + + if (trim($prdextstring) != "") + { + $query = "UPDATE " . "#__redshop_fields_data AS fa " + . ", " . "#__redshop_product AS p " + . "SET $prdextstring " + . "WHERE p.product_id=fa.itemid " + . "AND fa.section='1' " + . "AND fa.fieldid=" . (int) $value[$j]['fieldid'] . " " + . "AND p.product_number=" . $db->quote($oldproduct_number); + + $db->setQuery($query)->execute(); + $affected_rows = $db->getAffectedRows(); + + if (!$affected_rows) + { + $query = "INSERT IGNORE INTO " . "#__redshop_fields_data " + . "(fieldid,itemid,section) VALUES (" . $db->quote($value[$j]['fieldid']) . "," . (int) $product_id . ",1)"; + + $db->setQuery($query)->execute(); + + $query = "UPDATE " . "#__redshop_fields_data AS fa " + . ", " . "#__redshop_product AS p " + . "SET $prdextstring " + . "WHERE p.product_id=fa.itemid " + . "AND fa.section='1' " + . "AND fa.fieldid=" . $db->quote($value[$j]['fieldid']) . " " + . "AND p.product_number=" . $db->quote($oldproduct_number) . " "; + + $db->setQuery($query)->execute(); + } + } + } + } + } + } + } + + if (!empty($prdarray)) + { + $upstring = implode(", ", $prdarray); + $query = "UPDATE " . "#__redshop_product " + . "SET $upstring " + . "WHERE product_number=" . $db->quote($oldproduct_number) . " "; + + $db->setQuery($query)->execute(); + } + + if (!empty($catarray)) + { + $category_id = 0; + + if (isset($catarray['category_id'])) + { + $category_id = $catarray['category_id']; + } + + elseif (isset($catarray['category_name'])) + { + $query = "SELECT category_id FROM " . "#__redshop_category " + . "WHERE category_name=" . $db->quote($catarray['category_name']) . " "; + + $category_id = $db->setQuery($query)->loadResult(); + } + + if ($category_id == 0 && isset($catarray['category_name']) && $catarray['category_name'] != "") + { + $query = "INSERT IGNORE INTO " . "#__redshop_category " + . "(category_name) VALUES (" . $db->quote($catarray['category_name']) . ")"; + + $db->setQuery($query)->execute(); + $category_id = $db->insertid(); + + $query = "INSERT IGNORE INTO " . "#__redshop_category_xref " + . "(category_parent_id,category_child_id) " + . "VALUES ('0', " . (int) $category_id . ")"; + + $db->setQuery($query)->execute(); + } + + if ($category_id != 0) + { + $query = 'DELETE FROM ' . '#__redshop_product_category_xref ' + . "WHERE product_id=" . (int) $product_id . " " + . "AND category_id=" . (int) $category_id . " "; + + $db->setQuery($query)->execute(); + + $query = "INSERT IGNORE INTO " . "#__redshop_product_category_xref " + . "(category_id,product_id) " + . "VALUES (" . (int) $category_id . ", " . (int) $product_id . ")"; + + $db->setQuery($query)->execute(); + } + } + } + else + { + if (!empty($datalist[$i]['product_number']) && trim($datalist[$i]['product_name']) != "") + { + $prdkeysarray = array(); + $prdvalsarray = array(); + $catarray = array(); + + while (list($key, $value) = each($datalist[$i])) + { + if (!is_array($value)) + { + if ($key != "category_id" && $key != "category_name") + { + $prdvalsarray[] = addslashes($value); + $prdkeysarray[] = $key; + } + else + { + $catarray[$key] = addslashes($value); + } + } + } + + if (!empty($prdkeysarray)) + { + $fieldstring = implode(", ", $prdkeysarray); + $valuestring = implode("', '", $prdvalsarray); + $valuestring = "'" . $valuestring . "'"; + $query = "INSERT IGNORE INTO " . "#__redshop_product " + . "($fieldstring) VALUES ($valuestring)"; + + $db->setQuery($query)->execute(); + $product_id = $db->insertid(); + + foreach ($datalist[$i] AS $key => $value) + { + if (is_array($value)) + { + for ($j = 0, $jn = count($value); $j < $jn; $j++) + { + if ($key == $xmlimportdata->stock_element_name) + { + if (isset($value[$j]['stockroom_name'])) + { + $stockvalsarray = array(); + $stockkeysarray = array(); + + while (list($subkey, $subvalue) = each($value[$j])) + { + if ($subkey == "quantity") + { + $stockvalsarray[] = addslashes($subvalue); + $stockkeysarray[] = $subkey; + } + } + + $fieldstring = implode(", ", $stockkeysarray); + $valuestring = implode("', '", $stockvalsarray); + $valuestring = "'" . $valuestring . "'"; + + if (trim($fieldstring) != "") + { + $query = "SELECT stockroom_id FROM " . "#__redshop_stockroom " + . "WHERE stockroom_name=" . $db->quote($value[$j]['stockroom_name']) . ""; + + $stockroom_id = $db->setQuery($query)->loadResult(); + + if (!$stockroom_id) + { + $query = "INSERT IGNORE INTO " . "#__redshop_stockroom " + . "(stockroom_name) VALUES (" . $db->quote($value[$j]['stockroom_name']) . ")"; + + $db->setQuery($query)->execute(); + $stockroom_id = $db->insertid(); + } + + if ($stockroom_id) + { + $fieldstring .= ",stockroom_id,product_id"; + $valuestring .= "," . (int) $stockroom_id . ", " . (int) $product_id . ""; + + $query = "INSERT IGNORE INTO " . "#__redshop_product_stockroom_xref " + . "($fieldstring) VALUES ($valuestring)"; + + $db->setQuery($query)->execute(); + } + } + } + } + elseif ($key == $xmlimportdata->prdextrafield_element_name) + { + if (isset($value[$j]['fieldid'])) + { + $extvalsarray = array(); + $extkeysarray = array(); + + while (list($subkey, $subvalue) = each($value[$j])) + { + if ($subkey != "itemid") + { + $extvalsarray[] = addslashes($subvalue); + $extkeysarray[] = $subkey; + } + } + + $fieldstring = implode(", ", $extkeysarray); + $valuestring = implode("', '", $extvalsarray); + $valuestring = "'" . $valuestring . "'"; + + if (trim($fieldstring) != "") + { + $fieldstring .= ",itemid,section"; + $valuestring .= "," . (int) $product_id . ", '1' "; + $query = "INSERT IGNORE INTO " . "#__redshop_fields_data " + . "($fieldstring) VALUES ($valuestring)"; + + $db->setQuery($query)->execute(); + } + } + } + } + } + } + + if (!empty($catarray)) + { + $category_id = 0; + + if (isset($catarray['category_id'])) + { + $category_id = $catarray['category_id']; + } + + elseif (isset($catarray['category_name'])) + { + $query = "SELECT category_id FROM " . "#__redshop_category " + . "WHERE category_name=" . $db->quote($catarray['category_name']) . " "; + + $category_id = $db->setQuery($query)->loadResult(); + } + + if ($category_id == 0 && isset($catarray['category_name']) && $catarray['category_name'] != "") + { + $query = "INSERT IGNORE INTO " . "#__redshop_category " + . "(category_name) VALUES (" . $db->quote($catarray['category_name']) . ")"; + + $db->setQuery($query)->execute(); + $category_id = $db->insertid(); + + $query = "INSERT IGNORE INTO " . "#__redshop_category_xref " + . "(category_parent_id,category_child_id) " + . "VALUES ('0', " . (int) $category_id . ")"; + + $db->setQuery($query)->execute(); + } + + if ($category_id != 0) + { + \Redshop\Repositories\Products::delete(array( + 'product_id' => $product_id, + 'category_id' => $category_id + )); + + $query = "INSERT IGNORE INTO #__redshop_product_category_xref " + . "(category_id,product_id) " + . "VALUES (" . (int) $category_id . ", " . (int) $product_id . ")"; + + $db->setQuery($query)->execute(); + } + } + } + } + } + } + break; + case "order": + for ($i = 0, $in = count($datalist); $i < $in; $i++) + { + $oldorder_number = $datalist[$i]['order_number']; + $update = false; + + if (array_key_exists('order_number', $datalist[$i]) && $datalist[$i]['order_number'] != "") + { + if (\Redshop\Repositories\Order::getOrderByNumber($datalist[$i]['order_number'])) + { + $update = true; + $datalist[$i]['order_number'] = $xmlimportdata->add_prefix_for_existing . $datalist[$i]['order_number']; + } + } + + // UPDATE EXISTING IF RECORD EXISTS + if ($xmlimportdata->override_existing && $update) + { + $datalist[$i]['order_number'] = $oldorder_number; + $ordarray = array(); + + while (list($key, $value) = each($datalist[$i])) + { + if (!is_array($value)) + { + $ordarray[] = $key . "='" . $value . "' "; + } + + elseif (!empty($value)) + { + if ($key == $xmlimportdata->orderitem_element_name) + { + for ($j = 0, $jn = count($value); $j < $jn; $j++) + { + if (isset($value[$j]['order_item_sku'])) + { + $oitemarray = array(); + + while (list($subkey, $subvalue) = each($value[$j])) + { + $oitemarray[] = $subkey . "='" . $subvalue . "' "; + } + + $oitemstring = implode(", ", $oitemarray); + + if (trim($oitemstring) != "") + { + $query = "UPDATE " . "#__redshop_order_item AS oi " + . ", " . "#__redshop_orders AS o " + . "SET $oitemstring " + . "WHERE oi.order_id=o.order_id " + . "AND o.order_number=" . $db->quote($oldorder_number) . " " + . "AND oi.order_item_sku=" . $db->quote($value[$j]['order_item_sku']) . " "; + + $db->setQuery($query)->execute(); + } + } + } + } + elseif ($key == $xmlimportdata->billing_element_name) + { + $billingarray = array(); + + while (list($subkey, $subvalue) = each($value)) + { + $billingarray[] = $subkey . "='" . $subvalue . "' "; + } + + $billingstring = implode(", ", $billingarray); + + if (trim($billingstring) != "") + { + $query = "UPDATE " . "#__redshop_order_users_info AS ou " + . ", " . "#__redshop_orders AS o " + . "SET $billingstring " + . "WHERE ou.order_id=o.order_id " + . "AND o.order_number=" . $db->quote($oldorder_number) . " " + . "AND ou.address_type='BT' "; + + $db->setQuery($query)->execute(); + } + } + elseif ($key == $xmlimportdata->shipping_element_name) + { + $shippingarray = array(); + + while (list($subkey, $subvalue) = each($value)) + { + $shippingarray[] = $subkey . "='" . $subvalue . "' "; + } + + $shippingstring = implode(", ", $shippingarray); + + if (trim($shippingstring) != "") + { + $query = "UPDATE " . "#__redshop_order_users_info AS ou " + . ", " . "#__redshop_orders AS o " + . "SET $shippingstring " + . "WHERE ou.order_id=o.order_id " + . "AND o.order_number=" . $db->quote($oldorder_number) . " " + . "AND ou.address_type='ST' "; + + $db->setQuery($query)->execute(); + } + } + } + } + + if (!empty($ordarray)) + { + $upstring = implode(", ", $ordarray); + $query = "UPDATE " . "#__redshop_orders " + . "SET $upstring " + . "WHERE order_number=" . $db->quote($oldorder_number) . " "; + + $db->setQuery($query)->execute(); + } + } + else + { + if (!empty($datalist[$i]['order_number'])) + { + $ordkeysarray = array(); + $ordvalsarray = array(); + + while (list($key, $value) = each($datalist[$i])) + { + if (!is_array($value)) + { + $ordvalsarray[] = $value; + $ordkeysarray[] = $key; + } + } + + if (!empty($ordkeysarray)) + { + $fieldstring = implode(", ", $ordkeysarray); + $valuestring = implode("', '", $ordvalsarray); + $valuestring = "'" . $valuestring . "'"; + $query = "INSERT IGNORE INTO " . "#__redshop_orders " + . "($fieldstring) VALUES ($valuestring)"; + + $db->setQuery($query)->execute(); + $order_id = $db->insertid(); + + foreach ($datalist[$i] AS $key => $value) + { + if (is_array($value)) + { + if ($key == $xmlimportdata->orderitem_element_name) + { + for ($j = 0, $jn = count($value); $j < $jn; $j++) + { + if (isset($value[$j]['order_item_sku'])) + { + $oitemvalsarray = array(); + $oitemkeysarray = array(); + + while (list($subkey, $subvalue) = each($value[$j])) + { + if ($subkey != "order_id") + { + $oitemvalsarray[] = $subvalue; + $oitemkeysarray[] = $subkey; + } + } + + $fieldstring = implode(", ", $oitemkeysarray); + $valuestring = implode("', '", $oitemvalsarray); + $valuestring = "'" . $valuestring . "'"; + + if (trim($fieldstring) != "") + { + $fieldstring .= ",order_id"; + $valuestring .= ",'" . $order_id . "'"; + + $query = "INSERT IGNORE INTO " . "#__redshop_order_item " + . "($fieldstring) VALUES ($valuestring)"; + + $db->setQuery($query)->execute(); + } + } + } + } + elseif ($key == $xmlimportdata->billing_element_name) + { + $billvalsarray = array(); + $billkeysarray = array(); + + while (list($subkey, $subvalue) = each($value)) + { + if ($subkey != "order_id") + { + $billvalsarray[] = $subvalue; + $billkeysarray[] = $subkey; + } + } + + $fieldstring = implode(", ", $billkeysarray); + $valuestring = implode("', '", $billvalsarray); + $valuestring = "'" . $valuestring . "'"; + + if (trim($fieldstring) != "") + { + $fieldstring .= ",order_id"; + $valuestring .= ",'" . $order_id . "'"; + + $query = "INSERT IGNORE INTO " . "#__redshop_order_users_info " + . "($fieldstring) VALUES ($valuestring)"; + + $db->setQuery($query)->execute(); + } + } + elseif ($key == $xmlimportdata->shipping_element_name) + { + $shippvalsarray = array(); + $shippkeysarray = array(); + + while (list($subkey, $subvalue) = each($value[$j])) + { + if ($subkey != "order_id") + { + $shippvalsarray[] = $subvalue; + $shippkeysarray[] = $subkey; + } + } + + $fieldstring = implode(", ", $shippkeysarray); + $valuestring = implode("', '", $shippvalsarray); + $valuestring = "'" . $valuestring . "'"; + + if (trim($fieldstring) != "") + { + $fieldstring .= ",order_id"; + $valuestring .= ",'" . $order_id . "'"; + + $query = "INSERT IGNORE INTO " . "#__redshop_order_users_info " + . "($fieldstring) VALUES ($valuestring)"; + + $db->setQuery($query)->execute(); + } + } + } + } + } + } + } + } + break; + default: + return false; + } + + $this->insertXMLImportlog($xmlImportId, $xmlimportdata->filename); + + return true; + } + + public function getProductList($xmlarray = array(), $xmlExport = array()) + { + if (empty($xmlarray)) + { + return array(); + } + + $db = JFactory::getDbo(); + $list = array(); + $field = array(); + $strfield = ""; + + foreach ($xmlarray AS $key => $value) + { + if ($key == "category_name") + { + $field[] = "c." . $key . " AS " . $value; + } + elseif ($key == "product_price") + { + $field[] = "if(p.product_on_sale='1' and ((p.discount_stratdate = 0 and p.discount_enddate=0) + or (p.discount_stratdate <= UNIX_TIMESTAMP() and p.discount_enddate>=UNIX_TIMESTAMP())), p.discount_price, p." + . $key . ") AS " . $value; + } + elseif ($key == "name") // Start Code for display manufacture name + { + $field[] = "m." . $key . " AS " . $value; + } + + elseif ($key == "link") // Start Code for display product_url + { + $field[] = "m.manufacturer_email AS link "; + } + + elseif ($key == "delivertime") // Start Code for display delivertime + { + $field[] = "s.max_del_time AS delivertime "; + } + + elseif ($key == "pickup") // Start Code for display pickup + { + $field[] = "m.manufacturer_email AS pickup "; + } + + elseif ($key == "charge") // Start Code for display charges + { + $field[] = "m.manufacturer_email AS charge "; + } + + elseif ($key == "freight") // Start Code for display freight + { + $field[] = "m.manufacturer_email AS freight "; + } + + else + { + $field[] = "p." . $key . " AS " . $value; + } + } + + if (!empty($field)) + { + $strfield = implode(", ", $field); + } + + $andcat = ($xmlExport->xmlexport_on_category != "") ? "AND c.category_id IN ($xmlExport->xmlexport_on_category) " : ""; + + if ($strfield != "") + { + $query = "SELECT " . $strfield . ", p.product_id FROM " . "#__redshop_product AS p " + . "LEFT JOIN " . "#__redshop_product_category_xref AS x ON x.product_id=p.product_id " + . "LEFT JOIN " . "#__redshop_category AS c ON c.category_id=x.category_id " + . "LEFT JOIN " . "#__redshop_manufacturer AS m ON m.manufacturer_id=p.manufacturer_id " + . "LEFT JOIN " . "#__redshop_product_stockroom_xref AS sx ON sx.product_id=p.product_id " + . "LEFT JOIN " . "#__redshop_stockroom AS s ON s.stockroom_id =sx.stockroom_id " + . "WHERE p.published=1 " + . $andcat + . "GROUP BY p.product_id " + . "ORDER BY p.product_id ASC "; + $list = $db->setQuery($query)->loadAssocList(); + } + + return $list; + } + + public function getOrderList($xmlArray = array()) + { + if (empty($xmlArray)) + { + return array(); + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + foreach ($xmlArray AS $key => $value) + { + $field[] = $key . " AS " . $value; + $query->select($db->quoteName($key, $value)); + } + + $query->select($db->quoteName('order_id')) + ->from($db->quoteName('#__redshop_orders')) + ->order($db->quoteName('order_id')); + + return $db->setQuery($query)->loadObjectlist(); + } + + public function getOrderUserInfoList($xmlarray = array(), $orderId = 0, $addresstype = "BT") + { + if (empty($xmlarray)) + { + return array(); + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + foreach ($xmlarray AS $key => $value) + { + $query->select($db->quoteName($key, $value)); + } + + $query->from($db->quoteName('#__order_users_info')) + ->where($db->quoteName('address_type') . ' = ' . $db->quoteName($addresstype)) + ->where($db->quoteName('order_id') . (int) $orderId); + + return $db->setQuery($query)->loadObjectList(); + } + + public function getOrderItemList($xmlArray = array(), $orderId = 0) + { + if (empty($xmlArray)) + { + return array(); + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + foreach ($xmlArray AS $key => $value) + { + $query->select($db->quoteName($key, $value)); + } + + $query->from($db->quoteName('#__redshop_order_item')) + ->where($db->quoteName('order_id') . (int) $orderId) + ->order($db->quoteName('order_item_id')); + + return $db->setQuery($query)->loadObjectList(); + } + + public function getStockroomList($xmls = array(), $product_id = 0) + { + $db = JFactory::getDbo(); + + if (empty($xmls)) + { + return array(); + } + + $field = array(); + + foreach ($xmls AS $key => $value) + { + $field[] = $key . " AS " . $value; + } + + if (empty($field)) + { + return array(); + } + + $query = "SELECT " . implode(", ", $field) . " FROM " . "#__redshop_stockroom AS s " + . "LEFT JOIN " . "#__redshop_product_stockroom_xref AS sx ON s.stockroom_id=sx.stockroom_id " + . "WHERE product_id=" . (int) $product_id . " " + . "ORDER BY s.stockroom_id ASC "; + $db->setQuery($query); + + return $db->loadObjectList(); + } + + /** + * @param array $xmls Xml + * @param integer $sectionId + * @param integer $fieldSection + * + * @return array|mixed + * + */ + public function getExtraFieldList($xmls = array(), $sectionId = 0, $fieldSection = 0) + { + if (empty($xmls)) + { + return array(); + } + + $db = JFactory::getDbo(); + $field = array(); + + foreach ($xmls AS $key => $value) + { + $field[] = $db->qn($key, $value); + } + + if (empty($field)) + { + return array(); + } + + $query = $db->getQuery(true) + ->select($field) + ->select($db->qn('f.name', 'name')) + ->from($db->qn('#__redshop_fields_data', 'fd')) + ->innerjoin($db->qn('#__redshop_fields', 'f') . ' ON fd.fieldid = f.id') + ->where($db->qn('fd.itemid') . ' = ' . (int) $sectionId) + ->where($db->qn('fd.section') . ' = ' . (int) $fieldSection); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * @param string $src Source + * @param string $dest Source + */ + public function importRemoteImage($src, $dest) + { + \Redshop\Environment\Remote\Curl::downloadFile($src, $dest); + } +} diff --git a/component/admin/index.html b/component/admin/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/language/en-GB/en-GB.com_redshop.ini b/component/admin/language/en-GB/en-GB.com_redshop.ini new file mode 100644 index 00000000000..ca73621de3f --- /dev/null +++ b/component/admin/language/en-GB/en-GB.com_redshop.ini @@ -0,0 +1,4847 @@ +; version 1.4.0 +; package Joomla.Administrator +; subpackage com_redshop +; author redWEB Aps +; translation en-GB source redWEB Aps +; copyright com_redshop (C) 2008 - 2017 redCOMPONENT.com +; license GNU/GPL, see LICENSE.php + +COM_REDSHOP_ID="ID" +COM_REDSHOP_DATEPICKER_ASC="Custom field Date picker ASC" +COM_REDSHOP_DATEPICKER_DESC="Custom field Date picker DESC" +COM_REDSHOP_NEW_ORDERING_SAVED="New Ordering Saved" +COM_REDSHOP_ORDERING_SAVED="Ordering Saved" +COM_REDSHOP_FILE_EXTENTION_WRONG_PROPERTY="File Extension is Wrong, Please upload Image file" +COM_REDSHOP_PROPERTY_SUB_IMAGE_IS_DELETE="Property Sub Image Is Delete" +COM_REDSHOP_STOCKROOM_ATTRIBUTE_XREF_SAVE="Stockroom Attribute Xref Saved" +COM_REDSHOP_ERROR_SAVING_STOCKROOM_ATTRIBUTE_XREF="Error Saving Stockroom Attribute Xref" +COM_REDSHOP_THANKS_FOR_YOUR_REVIEWS="Thanks For Your Reviews" +COM_REDSHOP_ERROR_PLEASE_TRY_AGAIN="Error Please Try Again" +COM_REDSHOP_TEMPLATE_ASSIGN_SUCESS="Template Successfully Assigned" +COM_REDSHOP_ERROR_ASSIGNING_TEMPLATE="Error Assigning Template" +COM_REDSHOP_SHIPPING_SAME_AS_BILLING="Shipping same as Billing" +COM_REDSHOP_WRONG_OPRAND="redSHOP Wrong Operand" +COM_REDSHOP_PRODUCT_DOWNLOAD_DIRECTORY_DOES_NO_EXIST="Product Download Directory Does&#039;t Exist" +COM_REDSHOP_CONFIGURATION_FILE_IS_NOT_WRITABLE="Configuration File Is Not Writable" +COM_REDSHOP_CONFIGURATION_FILE_IS_NOT_READABLE="Configuration File Is Not Readable" +COM_REDSHOP_TEMPLATE_HAS_BEEN_RESET="Template has been reset" +COM_REDSHOP_PLEASE_ENTER_EAN_NUMBER="Please enter EAN number" +COM_REDSHOP_EAN_NUMBER="EAN Number" +COM_REDSHOP_REQUISITION_NUMBER="Requisition Number" +COM_REDSHOP_PLEASE_ENTER_REQUISITION_NUMBER="Please enter requisition number" +COM_REDSHOP_ORDER_ID="Order ID" +COM_REDSHOP_NAME="Name" +COM_REDSHOP_FIELDS_ITEM_MUST_HAVE_A_TITLE="Fields item must have a title" +COM_REDSHOP_FIELDS_ITEM_MUST_HAVE_A_SECTION="Fields item must have a section" +COM_REDSHOP_FIELDS_ITEM_MUST_HAVE_A_TYPE="Fields item must have a type" +COM_REDSHOP_ORDER_DETAIL_LINK_LBL="Order Detail Link" +COM_REDSHOP_FROM="From" +COM_REDSHOP_TO="To" +COM_REDSHOP_ZIPCODE_FROM="Zipcodes" +COM_REDSHOP_PLEASE_SELECT="- Please Select -" +COM_REDSHOP_ZIPCODE_NOTE_DESC="If you enter only 1 city with 1 zip code then leave the To field blank. Zipcode range is working only for numeric zipcodes without space." +COM_REDSHOP_DEFAULT_STOCKAMOUNT_IMAGE_THUMB_WIDTH_HEIGHT_LBL="Default Stock amount Image Width/Height" +COM_REDSHOP_TOOLTIP_DEFAULT_STOCKAMOUNT_IMAGE_THUMB_WIDTH_HEIGHT_LBL="Default Stock amount Image Width/Height" +COM_REDSHOP_SHOW_TERMS_AND_CONDITIONS_LBL="Show Terms And Conditions" +COM_REDSHOP_TOOLTIP_SHOW_TERMS_AND_CONDITIONS_LBL="Select Show Terms And Conditions" +COM_REDSHOP_SHOW_PER_ORDER="Show Per Order" +COM_REDSHOP_SHOW_PER_USER="Show Per User" +COM_REDSHOP_RESET_FOR_ALL_USER="Reset For All Users" +COM_REDSHOP_PRIVATE_BILLING_TEMPLATE="Private Billing Template" +COM_REDSHOP_REQUIRED_TAG="Reguired tags" +COM_REDSHOP_OPTION_TAG="Optional tags" +COM_REDSHOP_TEMPLATE_TAG_PRIVATE_BILLING_HINT="Private Billing Template available Tags" +COM_REDSHOP_COMPANY_BILLING_TEMPLATE="Company Billing Template" +COM_REDSHOP_TEMPLATE_TAG_COMPANY_BILLING_HINT="Company Billing Template available Tags" +COM_REDSHOP_BILLING_TEMPLATE="Billing Template" +COM_REDSHOP_TEMPLATE_TAG_BILLING_HINT="Billing Template available Tags" +COM_REDSHOP_SHIPPING_TEMPLATE="Shipping Template" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_HINT="Shipping Template Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_SHIPMENT_INVOICE_HINT="Shipment Invoice Template available Tags" +COM_REDSHOP_IMPORT_STOCK_FROM_ECONOMIC="Import Stock From e-conomic" +COM_REDSHOP_IMPORT_LOG="Import Log" +COM_REDSHOP_IMPORT_STOCK_FROM_ECONOMIC_SUCCESS="Successfully import stock from e-conomic" +COM_REDSHOP_IMPORT_STOCK_FROM_ECONOMIC_IS_COMPLETED="Import stock from e-conomic is completed" +COM_REDSHOP_ERROR_IN_IMPORT_STOCK_FROM_ECONOMIC="Error in import stock from e-conomic" +COM_REDSHOP_ORDER_MAIL_INTRO_TEXT_TITLE="Order Mail Title" +COM_REDSHOP_ORDER_MAIL_INTRO_TEXT="Some Intro text...Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries..." +COM_REDSHOP_ORDER_ID_RESET_LBL="Order ID Reset" +COM_REDSHOP_TOOLTIP_ORDER_ID_RESET_LBL="Reset Order Id" +COM_REDSHOP_ORDER_ID_RESET="Reset Order Id" +COM_REDSHOP_CONFIRM_ORDER_ID_RESET="Are You sure you want to reset order Id? If you reset order id then all the previous orders will delete and empty order related tables." +COM_REDSHOP_SUCCESSFULLY_RESET_ORDER_ID="Successfully reset order id" +COM_REDSHOP_DETAIL_ERROR_MESSAGE_LBL="Detail Error message from e-conomic" +COM_REDSHOP_ADDRESS="Address" +COM_REDSHOP_TELEPHONE="Telephone" +COM_REDSHOP_AMOUNT="Amount" +COM_REDSHOP_PRODUCT="Product" +COM_REDSHOP_STATUS="Status" +COM_REDSHOP_XML_DOESNOT_EXISTS="XML file can not be found" +COM_REDSHOP_MANUFACTURER_DETAIL_SAVED="Manufacturer Detail Saved" +COM_REDSHOP_NEWSLETTER_SENT_SUCCESSFULLY="Newsletter sent successfully" +COM_REDSHOP_NEWSLETTER_MAIL_NOT_SENT="Newsletter Mail Not Sent" +COM_REDSHOP_SELECT="Select" +COM_REDSHOP_ORDER_ITEM_ADDED="Order Item Added" +COM_REDSHOP_QUANTITY_UPDATED="Quantity Updated" +COM_REDSHOP_ERROR_ADDING_ORDER_ITEM="Error Adding Order Item" +COM_REDSHOP_ERROR_UPDATING_QUANTITY="Error Updating Quantity" +COM_REDSHOP_PRODUCT_OUT_OF_STOCK="Product Is Out Of Stock" +COM_REDSHOP_ORDER_ITEM_DELETED="Order Item Deleted" +COM_REDSHOP_ERROR_DELETING_ORDER_ITEM="Error Deleting Order Item" +COM_REDSHOP_ERROR_UPDATING_PRICE="Error Updating Price" +COM_REDSHOP_ORDER_ITEM_PRICE_UPDATED="Order Item Price Updated" +COM_REDSHOP_DISCOUNT_UPDATED="Discount Updated" +COM_REDSHOP_ERROR_UPDATING_DISCOUNT="Error Updating Discount" +COM_REDSHOP_SPECIAL_DISCOUNT_APPLIED="Special Discount Applied" +COM_REDSHOP_ERROR_IN_SPECIAL_DISCOUNT="Error In Special Discount" +COM_REDSHOP_SHIPPING_RATE_UPDATED="Shipping Rate Updated" +COM_REDSHOP_ERROR_UPDATING_SHIPPING_RATE="Error Updating Shipping Rate" +COM_REDSHOP_SHIPPING_INFORMATION_UPDATED="Shipping Information Updated" +COM_REDSHOP_ERROR_UPDATING_SHIPPING_INFORMATION="Error Updating Shipping Information" +COM_REDSHOP_DOWNLOAD_MAIL_HAS_BEEN_SENT="Download mail link has been sent" +COM_REDSHOP_ERROR_DOWNLOAD_MAIL_FAIL="ERROR: Download mail fail" +COM_REDSHOP_ORDERSTATUS_CODE_IS_ALLREADY="Order status Code Is Already" +COM_REDSHOP_IMPORT_PRODUCTS_TO_ECONOMIC_SUCCESS="Product import to e-conomic has been finished" +COM_REDSHOP_IMPORT_ATTRIBUTES_TO_ECONOMIC_SUCCESS="Successfully import Attributes to e-conomic" +COM_REDSHOP_IMPORT_PRODUCT_TO_ECONOMIC_LOG="Import Products log to e-conomic" +COM_REDSHOP_IMPORT_PRODUCT_TO_ECONOMIC_IS_COMPLETED="Import products to e-conomic is completed" +COM_REDSHOP_ERROR_IN_IMPORT_PRODUCT_TO_ECONOMIC="Error in importing product to e-conomic" +COM_REDSHOP_IMPORT_ATTRIBUTES_TO_ECONOMIC_LOG="Import Attributes log to e-conomic" +COM_REDSHOP_IMPORT_ATTRIBUTES_TO_ECONOMIC_IS_COMPLETED="Import attributes to e-conomic is completed" +COM_REDSHOP_IMPORT_CHARS_ISO88591="(%s) Western European, Latin-1" +COM_REDSHOP_IMPORT_CHARS_ISO88595="(%s) Little used cyrillic charset (Latin/Cyrillic)" +COM_REDSHOP_IMPORT_CHARS_ISO885915="(%s) Western European, Latin-9. Adds the Euro sign, French and Finnish letters missing in Latin-1 (ISO-8859-1)." +COM_REDSHOP_IMPORT_CHARS_UTF8="(%s) ASCII compatible multi-byte 8-bit Unicode" +COM_REDSHOP_IMPORT_CHARS_CP866="(%s) DOS-specific Cyrillic charset" +COM_REDSHOP_IMPORT_CHARS_CP1251="(%s) Windows-specific Cyrillic charset" +COM_REDSHOP_IMPORT_CHARS_CP1252="(%s) Windows specific charset for Western European" +COM_REDSHOP_IMPORT_CHARS_KOI8R="(%s) Russian" +COM_REDSHOP_IMPORT_CHARS_BIG5="(%s) Traditional Chinese, mainly used in Taiwan" +COM_REDSHOP_IMPORT_CHARS_GB2312="(%s) Simplified Chinese, national standard character set" +COM_REDSHOP_IMPORT_CHARS_BIG5HKSCS="(%s) Big5 with Hong Kong extensions, Traditional Chinese" +COM_REDSHOP_IMPORT_CHARS_SHIFTJIS="(%s) Japanese" +COM_REDSHOP_IMPORT_CHARS_EUCJP="(%s) Japanese" +COM_REDSHOP_IMPORT_CHARS_MACROMAN="(%s) Charset that was used by Mac OS" +COM_REDSHOP_ERROR_IN_IMPORT_ATTRIBUTES_TO_ECONOMIC="Error in importing attribute to e-conomic" +COM_REDSHOP_PRICE_ALREADY_EXISTS="Price Already Exists" +COM_REDSHOP_CATEGORY_ASSIGNED_TO_PRODUCT_SUCCESSFULLY="Category Assigned to Products Successfully" +COM_REDSHOP_ERROR_WHILE_ASSIGNING_CATEGORY_TO_PRODUCT="Error while assigning Category to Products" +COM_REDSHOP_CATEGORY_REMOVED_FROM_PRODUCT_SUCCESSFULLY="Category Removed From Product Successfully" +COM_REDSHOP_ERROR_WHILE_REMOVING_CATEGORY_FROM_PRODUCT="Error while removing Category from Products" +COM_REDSHOP_PRODUCT_SERIALNUMBER_DELETED="Product Serial number deleted" +COM_REDSHOP_QUOTATION_ITEM_ADDED="Quotation Created" +COM_REDSHOP_ERROR_ADDING_QUOTATION_ITEM="Error in creating Quote" +COM_REDSHOP_SAMPLE_DATA_INSTALLED="Sample Data Installed Successfully" +COM_REDSHOP_IMPORT_RATES_TO_ECONOMIC_SUCCESS="Shipping Rates are Successfully Imported" +COM_REDSHOP_SHIPPING_SAVED="Shipping saved" +COM_REDSHOP_REDSHOP_TMP_FILE_NOT_FOUND="redSHOP TMP File Not Found" +COM_REDSHOP_REDSHOP_TMP_FILE_NOT_WRITABLE="redSHOP TMP File Not Writable" +COM_REDSHOP_STEP_SAVED="Step Saved" +COM_REDSHOP_ERROR_SAVING_STEP_DETAIL="Error Saving Step Detail" +COM_REDSHOP_FINISH_WIZARD="Wizard finished successfully" +COM_REDSHOP_ERROR_SAVING_DETAIL="Error Saving Detail" +COM_REDSHOP_SELECT_CATEGORY="- Select Category -" +COM_REDSHOP_SELECT_CATEGORY_LBL="Select Category" +COM_REDSHOP_ALL_MANUFACTURERS="- Select Manufacturer -" +COM_REDSHOP_UNDEFINED_MANUFACTURERS="(Undefined)" +COM_REDSHOP_SELECT_PUBLISHED="- Select Status -" +COM_REDSHOP_SELECT_MANUFACTURER="Select Manufacturer" +COM_REDSHOP_SELECT_SHOPPER_GROUP="Select Shopper Group" +COM_REDSHOP_SELECT_A_PRODUCT="Select A Product" +COM_REDSHOP_PRODUCT_N_ITEMS_CHECKED_IN_0="No product successfully checked in." +COM_REDSHOP_PRODUCT_N_ITEMS_CHECKED_IN_1="%d product successfully checked in." +COM_REDSHOP_PRODUCT_N_ITEMS_CHECKED_IN_MORE="%d products successfully checked in." +COM_REDSHOP_N_ITEMS_CHECKED_IN_1="%d items successfully checked in." +COM_REDSHOP_PRODUCT_NAME="Name" +COM_REDSHOP_SECTION_ID="Section id" +COM_REDSGOP_STOCKROOM_ID="Stockroom id" +COM_REDSHOP_PRODUCT_ID="Product id" +COM_REDSHOP_PRODUCT_DESCRIPTION="Product Description" +COM_REDSHOP_PRODUCT_NUMBER="SKU" +COM_REDSHOP_PRODUCT_NAME_AND_PRODUCT_DESCRIPTION="Product Name And Product Description" +COM_REDSHOP_SELECT_SEARCH_TYPE="Select Search Type" +COM_REDSHOP_SELECT_STOCKROOM="Select Stockroom" +COM_REDSHOP_SELECT_TEMPLATE="Select Template" +COM_REDSHOP_DONT_HAVE_PERMISSION="You do not have permission to view this page." +COM_REDSHOP_REDSHOP_DEF_FILE_NOT_FOUND="redSHOP Definitions File Not Found" +COM_REDSHOP_REDSHOP_DEF_FILE_NOT_WRITABLE="redSHOP Definitions File Not Writable" +COM_REDSHOP_JAN="Jan" +COM_REDSHOP_FEB="Feb" +COM_REDSHOP_MAR="Mar" +COM_REDSHOP_APR="Apr" +COM_REDSHOP_MAY="May" +COM_REDSHOP_JUN="Jun" +COM_REDSHOP_JUL="Jul" +COM_REDSHOP_AUG="Aug" +COM_REDSHOP_SEP="Sep" +COM_REDSHOP_OCT="Oct" +COM_REDSHOP_NOV="Nov" +COM_REDSHOP_DEC="Dec" +COM_REDSHOP_JANUARY="January" +COM_REDSHOP_FEBRUARY="February" +COM_REDSHOP_MARCH="March" +COM_REDSHOP_APRIL="April" +COM_REDSHOP_JUNE="June" +COM_REDSHOP_JULY="July" +COM_REDSHOP_AUGUST="August" +COM_REDSHOP_SEPTEMBER="September" +COM_REDSHOP_OCTOBER="October" +COM_REDSHOP_NOVEMBER="November" +COM_REDSHOP_DECEMBER="December" +COM_REDSHOP_MON="Mon" +COM_REDSHOP_TUE="Tue" +COM_REDSHOP_WED="Wed" +COM_REDSHOP_THU="Thu" +COM_REDSHOP_FRI="Fri" +COM_REDSHOP_SAT="Sat" +COM_REDSHOP_SUN="Sun" +COM_REDSHOP_MONDAY="Monday" +COM_REDSHOP_TUESDAY="Tuesday" +COM_REDSHOP_WEDNESDAY="Wednesday" +COM_REDSHOP_THURSDAY="Thursday" +COM_REDSHOP_FRIDAY="Friday" +COM_REDSHOP_SATURDAY="Saturday" +COM_REDSHOP_SUNDAY="Sunday" +COM_REDSHOP_ACCESSORY="Accessory" +COM_REDSHOP_ACCESSORY_QUANTITY_LBL="Accessory Quantity" +COM_REDSHOP_ATTRIBUTE="Attribute" +COM_REDSHOP_FILE_NOT_EXIST="File Do Not Exist" +COM_REDSHOP_IMAGE_HOVER="Hover" +COM_REDSHOP_IMAGE_LINK="Image Link" +COM_REDSHOP_ADD_VALUE="Add Option" +COM_REDSHOP_VALUE="Options" +COM_REDSHOP_OPTION_VALUE="Option Value" +COM_REDSHOP_UPLOAD="Upload" +COM_REDSHOP_UPLOADED_FILE="Uploaded File" +COM_REDSHOP_UPLOADING="Uploading" +COM_REDSHOP_SPECIAL_DISCOUNT="Special Discounts" +COM_REDSHOP_WRAPPER="Wrapping" +COM_REDSHOP_TOTAL_LBL="Total" +COM_REDSHOP_PRODUCT_MANAGEMENT="Product Management" +COM_REDSHOP_PRODUCT_LISTING="Products" +COM_REDSHOP_PRODUCTS="Products" +COM_REDSHOP_PRODUCT_PRICE_VIEW="Products Price" +COM_REDSHOP_ADD_PRODUCT="Add Product" +COM_REDSHOP_REMOVE_PRODUCT="Remove Product" +COM_REDSHOP_ADD_MASS_DISCOUNT="Add Mass Discount" +COM_REDSHOP_MASS_DISCOUNT="Mass Discounts" +COM_REDSHOP_IMPORT_PRODUCTS_TO_ECONOMIC="Import products to e-conomic" +COM_REDSHOP_IMPORT_ATTRIBUTES_TO_ECONOMIC="Import Attributes to e-conomic" +COM_REDSHOP_CATEGORY="Category" +COM_REDSHOP_CATEGORY_LISTING="Categories" +COM_REDSHOP_ADD_CATEGORY="Add Category" +COM_REDSHOP_MANUFACTURER="Manufacturer" +COM_REDSHOP_MANUFACTURER_LISTING="Manufacturers" +COM_REDSHOP_ADD_MANUFACTURER="Add Manufacturer" +COM_REDSHOP_MEDIA="Media" +COM_REDSHOP_MEDIA_LISTING="Medias" +COM_REDSHOP_ADD_MEDIA_ITEM="Add Media Item" +COM_REDSHOP_BULK_UPLOAD="Bulk upload" +COM_REDSHOP_ORDER="Order" +COM_REDSHOP_ORDER_LISTING="Orders" +COM_REDSHOP_ADD_ORDER="Add Order" +COM_REDSHOP_DOWNLOAD_LABEL="Download Label" +COM_REDSHOP_ORDERSTATUS_LISTING="Order Statuses" +COM_REDSHOP_PRODUCT_ORDER_SEARCH="Product Order Search" +COM_REDSHOP_CHANGE_ORDER_STATUS="Change Order Status" +COM_REDSHOP_QUOTATION="Quotation" +COM_REDSHOP_QUOTATION_LISTING="Quotations" +COM_REDSHOP_ADD_QUOTATION="Add Quotation" +COM_REDSHOP_STOCKROOM="Stockroom" +COM_REDSHOP_STOCKROOM_LISTING="Stockroom List" +COM_REDSHOP_ADD_STOCKROOM="Add Stockroom" +COM_REDSHOP_STOCKROOM_AMOUNT_LISTING="Inventory for all stockrooms" +COM_REDSHOP_STOCKIMAGE_LISTING="Stock Image List" +COM_REDSHOP_ADD_STOCKIMAGE="Add Stock Image" +COM_REDSHOP_STOCKIMAGE_FILTER="Filter by Stockroom Image Tooltip" +COM_REDSHOP_SUPPLIER="Supplier" +COM_REDSHOP_SUPPLIER_LISTING="Suppliers" +COM_REDSHOP_N_SUPPLIERS_DUPLICATED="%d suppliers successfully duplicated." +COM_REDSHOP_ADD_SUPPLIER="Add Supplier" +COM_REDSHOP_DISCOUNT="Discount" +COM_REDSHOP_DISCOUNT_LISTING="Order total discounts" +COM_REDSHOP_ADD_DISCOUNT="Add Discount" +COM_REDSHOP_DISCOUNT_PRODUCT_LISTING="Product price discounts" +COM_REDSHOP_ADD_DISCOUNT_PRODUCT="Add discount on product price" +COM_REDSHOP_GIFTCARD="Gift Card" +COM_REDSHOP_GIFTCARD_LISTING="Gift Cards" +COM_REDSHOP_ADD_GIFTCARD="Add Gift Card" +COM_REDSHOP_VOUCHER="Voucher" +COM_REDSHOP_VOUCHER_LISTING="Vouchers" +COM_REDSHOP_ADD_VOUCHER="Add Voucher" +COM_REDSHOP_VOUCHER_FILTER="Filter by Voucher Code" +COM_REDSHOP_VOUCHER_CODE_IS_EMPTY="Please enter voucher code" +COM_REDSHOP_VOUCHER_PRODUCT_IS_EMPTY="Please select any product for voucher." +COM_REDSHOP_COUPON="Coupon" +COM_REDSHOP_COUPON_LISTING="Coupons" +COM_REDSHOP_ADD_COUPON="Add coupon" +COM_REDSHOP_COMMUNICATION="Communication" +COM_REDSHOP_MAIL_CENTER="Mail Center" +COM_REDSHOP_MAIL_CENTER_LISTING="Mails" +COM_REDSHOP_ADD_MAIL_CENTER="Add Mail Template" +COM_REDSHOP_NEWSLETTER="Newsletter" +COM_REDSHOP_NEWSLETTER_LISTING="Newsletters" +COM_REDSHOP_ADD_NEWSLETTER="Add Newsletter" +COM_REDSHOP_NEWSLETTER_SUBSCR_LISTING="Newsletter Subscribers" +COM_REDSHOP_ADD_NEWSLETTER_SUBSCR="Add Newsletter Subscription" +COM_REDSHOP_NEWSLETTER_STATISTICS="Newsletter Statistics" +COM_REDSHOP_SHIPPING_METHOD="Shipping Method" +COM_REDSHOP_SHIPPING_METHOD_LISTING="Shipping Methods" +COM_REDSHOP_IMPORT_RATES_TO_ECONOMIC="Import Rates to e-conomic" +COM_REDSHOP_SHIPPING_BOX="Shipping Box" +COM_REDSHOP_SHIPPING_BOXES="Shipping Boxes" +COM_REDSHOP_ADD_SHIPPING_BOXES="Add Shipping Box" +COM_REDSHOP_SHIPPING_BOXES_DELETE_SUCCESSFULLY="Shipping box(es) deleted successfully" +COM_REDSHOP_SHIPPING_DETAIL="Shipping Detail" +COM_REDSHOP_SHIPPING_DETAIL_INSTALL="Add Shipping Method" +COM_REDSHOP_SHIPPING_SUPPORT_RATE="Support Rate" +COM_REDSHOP_SHIPPING_SUPPORT_LOCATION="Support Location" +COM_REDSHOP_ADD_SHIPPING_METHOD="Add Shipping Method" +COM_REDSHOP_WRAPPER_LISTING="Wrappings" +COM_REDSHOP_ADD_WRAPPER="Add Wrapping" +COM_REDSHOP_USER="User" +COM_REDSHOP_USER_LISTING="Users" +COM_REDSHOP_ADD_USER="Add User" +COM_REDSHOP_USER_SYNC="Synchronise Users" +COM_REDSHOP_DO_YOU_WANT_TO_SYNC="Do you really want to synchronise users?" +COM_REDSHOP_SHOPPER_GROUP_LISTING="Shopper Groups" +COM_REDSHOP_ADD_SHOPPER_GROUP="Add Shopper Group" +COM_REDSHOP_ACCESS_MANAGER="Backend Access Management" +COM_REDSHOP_BACKEND_ACCESS_CONFIG="Global permission configuration" +COM_REDSHOP_VAT_AND_CURRENCY="VAT/Tax and Currency" +COM_REDSHOP_TAX_GROUP="VAT/Tax Group" +COM_REDSHOP_TAX_GROUP_LISTING="VAT/Tax Groups" +COM_REDSHOP_TAX_GROUP_DETAIL="Add VAT/Tax Group" +COM_REDSHOP_CURRENCY="Currency" +COM_REDSHOP_CURRENCY_LISTING="Currencies" +COM_REDSHOP_CURRENCY_FILTER="Filter by Currency Name or Currency Code" +COM_REDSHOP_ADD_CURRENCY="Add Currency" +COM_REDSHOP_COUNTRY="Country" +COM_REDSHOP_COUNTRY_LISTING="Countries" +COM_REDSHOP_ADD_COUNTRY="Add Country" +COM_REDSHOP_COUNTRY_FILTER="Filter by Country Name" +COM_REDSHOP_STATE="State" +COM_REDSHOP_STATE_LISTING="States" +COM_REDSHOP_ADD_STATE="Add State" +COM_REDSHOP_ZIPCODE="Zipcodes" +COM_REDSHOP_ZIPCODE_LISTING="Zipcodes / Cities" +COM_REDSHOP_ADD_ZIPCODE="Add Zipcode" +COM_REDSHOP_IMPORT_EXPORT="Import/Export" +COM_REDSHOP_EXPORT_PRODUCT_EXTRAFIELD="Export Product Extra field" +COM_REDSHOP_DATA_IMPORT="Data Import" +COM_REDSHOP_DATA_EXPORT="Data Export" +COM_REDSHOP_IMPORT_FROM_VM="Import from VirtueMart" +COM_REDSHOP_DO_YOU_WANT_TO_IMPORT_VM="Do you really want to import data from VM?" +COM_REDSHOP_XML_IMPORT_EXPORT="XML Import/Export" +COM_REDSHOP_XML_IMPORT="XML Import" +COM_REDSHOP_XML_EXPORT="XML Export" +COM_REDSHOP_CUSTOMIZATION="Customization" +COM_REDSHOP_FIELDS="Custom Fields" +COM_REDSHOP_FIELDS_LISTING="Custom Fields" +COM_REDSHOP_ADD_FIELD="Add Custom Field" +COM_REDSHOP_TEMPLATE="Template" +COM_REDSHOP_TEMPLATE_LISTING="Templates" +COM_REDSHOP_ADD_TEMPLATE="Add Template" +COM_REDSHOP_TEXT_LIBRARY="Text Library" +COM_REDSHOP_TAGS_LISTING="Customer Tags" +COM_REDSHOP_CATALOG_MANAGEMENT="Catalogue Management" +COM_REDSHOP_CATALOG="Catalogues" +COM_REDSHOP_CATALOG_REQUEST="Catalogue Request List" +COM_REDSHOP_COLOUR_SAMPLE_MANAGEMENT="Product Sample" +COM_REDSHOP_CATALOG_PRODUCT_SAMPLE="Samples" +COM_REDSHOP_SAMPLE_REQUEST="Sample Request" +COM_REDSHOP_TAGS="Customer Tags" +COM_REDSHOP_ATTRIBUTE_BANK="Attribute Bank" +COM_REDSHOP_ATTRIBUTE_SET_LISTING="Attribute Sets" +COM_REDSHOP_ADD_ATTRIBUTE_SET="Add Attribute Set" +COM_REDSHOP_INTEGRATION="Integration" +COM_REDSHOP_CUSTOMER_INPUT="Customer Input" +COM_REDSHOP_QUESTION="Question" +COM_REDSHOP_QUESTION_LISTING="Questions" +COM_REDSHOP_REVIEW="Review" +COM_REDSHOP_RATING_REVIEW="Rating/Review" +COM_REDSHOP_RATING_REVIEW_LOGIN_REQUIRED_LBL="Login required" +COM_REDSHOP_TOOLTIP_RATING_REVIEW_LOGIN_REQUIRED_LBL="User must be Logged in to add a review?" +COM_REDSHOP_ACCOUNTING="Accounting" +COM_REDSHOP_ECONOMIC_ACCOUNT_GROUP="e-conomic Account Group" +COM_REDSHOP_ACCOUNTGROUP_LISTING="e-conomic Product Group Listing" +COM_REDSHOP_ADD_ACCOUNTGROUP="Add e-conomic Product Group" +COM_REDSHOP_TOTAL_VISITORS="Total Visitors" +COM_REDSHOP_TOTAL_PAGEVIEWERS="Total Page Views" +COM_REDSHOP_TOTAL_TURNOVER="Total Turnover" +COM_REDSHOP_AVG_ORDER_AMOUNT_CUSTOMER="Avg. order amount per customer" +COM_REDSHOP_TOP_CUSTOMER_AMOUNT_OF_ORDER="Top customers measured in amount of orders" +COM_REDSHOP_TOP_CUSTOMER_AMOUNT_OF_PRICE_PER_ORDER="Top customer measured in amount of price per order" +COM_REDSHOP_TOP_CUSTOMER_AMOUNT_SPENT_IN_TOTAL="Top customer measured in amount spent in total" +COM_REDSHOP_BEST_SELLERS="Most sold products" +COM_REDSHOP_MOST_VISITED_PRODUCTS="Most Popular (Viewed) Products" +COM_REDSHOP_NEWEST_PRODUCTS="Newest Products" +COM_REDSHOP_NEWEST_ORDERS="Newest Orders" +COM_REDSHOP_RESHOP_CONFIGURATION="redSHOP Configuration" +COM_REDSHOP_START_CONFIGURATION_WIZARD="Start Configuration Wizard" +COM_REDSHOP_RESET_TEMPLATE_LBL="Reset template" +COM_REDSHOP_SELECT_STATUS_LBL="Select Status" +COM_REDSHOP_SELECT_PAYMENT_STATUS="- Select Payment Status -" +COM_REDSHOP_PAYMENT_STA_PAID="Paid" +COM_REDSHOP_PAYMENT_STA_UNPAID="Unpaid" +COM_REDSHOP_PAYMENT_STA_PARTIAL_PAID="Partially paid" +COM_REDSHOP_PHPSHOP_PAYMENT_ERROR="Phpshop Payment Error" +COM_REDSHOP_ACCESSORY_PRODUCT="Accessories" +COM_REDSHOP_ATTRIBUTE_IS_REQUIRED="Attribute Is Required" +COM_REDSHOP_NO_SHIPPING_METHODS_TO_DISPLAY="No Shipping Methods To Display" +COM_REDSHOP_FILL_SHIPPING_ADDRESS="Fill Shipping Address" +COM_REDSHOP_REQUESTED="Requested" +COM_REDSHOP_REPLIED="Replied" +COM_REDSHOP_ACCEPTED="Accepted" +COM_REDSHOP_REJECTED="Rejected" +COM_REDSHOP_ORDERED="Ordered" +COM_REDSHOP_PRODUCT_USERFIELD="Product user field" +COM_REDSHOP_PRODUCT_DETAIL_NOT_MATCH="Product Detail Do Not Match" +COM_REDSHOP_USER_INFORMATION_NOT_MATCH="User Information Do Not Match" +COM_REDSHOP_CONFIRM_DELETE_RESPECTIVE_JOOMLA_USERS="Selected redSHOP users are going to be removed. Would you like to delete the respective Joomla Users too?" +COM_REDSHOP_CART_DIMENTION_NOT_MATCH="Cart Dimension Do Not Match" +COM_REDSHOP_SHIPPING_TEXT_LBL="Shipping Text" +COM_REDSHOP_RELATED_PRODUCT="Related Product" +COM_REDSHOP_MANUFACTURER_DETAIL="Manufacturer Details" +COM_REDSHOP_MANUFACTURER_PRODUCTS="Manufacturer Product List" +COM_REDSHOP_NEWSLETTER_PRODUCTS="Newsletter with products" +COM_REDSHOP_EMAIL="Email" +COM_REDSHOP_EMPTY_CART="Empty cart" +COM_REDSHOP_CART="Cart" +COM_REDSHOP_TOOLTIP_ENABLE_SMS_FROM_WEBPACK="Enable SMS from webpack" +COM_REDSHOP_TOOLTIP_ENABLE_SMS_FROM_WEBPACK_LBL="Enable SMS from webpack" +COM_REDSHOP_TOOLTIP_ENABLE_TRACK_AND_TRACE_EMAIL="Enable track and trace email" +COM_REDSHOP_TOOLTIP_ENABLE_TRACK_AND_TRACE_EMAIL_LBL="Enable track and trace email" +COM_REDSHOP_ADD_TO_CART="Add to cart" +COM_REDSHOP_PRODUCT_SAMPLE="Sample Management" +COM_REDSHOP_ORDER_LIST="Order list" +COM_REDSHOP_ORDER_DETAIL="Order Detail" +COM_REDSHOP_ORDER_RECEIPT="Order Receipt" +COM_REDSHOP_FRONTPAGE_CATEGORY="Frontpage category" +COM_REDSHOP_ATTRIBUTE_TEMPLATE="Attributes" +COM_REDSHOP_ATTRIBUTE_WITH_CART_TEMPLATE="Attributes with cart" +COM_REDSHOP_ACCESSORY_TEMPLATE="Accessory Template" +COM_REDSHOP_ACCOUNT_TEMPLATE="Account Template" +COM_REDSHOP_WISHLIST_TEMPLATE="Wish list" +COM_REDSHOP_WISHLIST_MAIL_TEMPLATE="Wish list mail" +COM_REDSHOP_WRAPPER_TEMPLATE="Wrapper" +COM_REDSHOP_AJAX_CART_DETAIL_BOX="Ajax cart detail box" +COM_REDSHOP_AJAX_CART_BOX_TMP="Ajax Cart Box" +COM_REDSHOP_ASK_QUESTION_TEMPLATE="Ask question" +COM_REDSHOP_GIFTCARD_LIST_TEMPLATE="Gift Card List Template" +COM_REDSHOP_GIFTCARD_TEMPLATE="Gift Card" +COM_REDSHOP_SHIPPING_PDF_TEMPLATE="Shipping PDF" +COM_REDSHOP_CLICKTELL_SMS_MESSAGE="Clickatell SMS" +COM_REDSHOP_ORDER_PRINT_TEMPLATE="Print order" +COM_REDSHOP_REDPRODUCTFINDER="redPRODUCTFINDER" +COM_REDSHOP_QUOTATION_DETAIL_TEMPLATE="Quotation Detail Template" +COM_REDSHOP_QUOTATION_REQUEST_TEMPLATE="Quotation Request Template" +COM_REDSHOP_CATALOGUE_CART_TEMPLATE="Catalogue Cart" +COM_REDSHOP_CATALOGUE_ORDER_DETAIL_TEMPLATE="Catalogue order detail" +COM_REDSHOP_CATALOGUE_ORDER_RECEIPT_TEMPLATE="Catalogue order receipt" +COM_REDSHOP_COMPARE_PRODUCT_TEMPLATE="Compare products" +COM_REDSHOP_CLICKATELL="Clickatell" +COM_REDSHOP_PAYMENT_METHOD_TEMPLATE="Payment method" +COM_REDSHOP_SHIPPING_METHOD_TEMPLATE="Shipping method" +COM_REDSHOP_SHIPPING_BOX_TEMPLATE="Shipping box" +COM_REDSHOP_ONESTEP_CHECKOUT_TEMPLATE="One step checkout template" +COM_REDSHOP_PRODUCT_CATEGORY_TEMPLATE="Product category" +COM_REDSHOP_CHANGE_CART_ATTRIBUTE_TEMPLATE="Change attribute in cart" +COM_REDSHOP_CHECKOUT_TEMPLATE="Checkout Template" +COM_REDSHOP_ORDER_MAIL="Order Mail" +COM_REDSHOP_CATALOGUE_ORDER_MAIL="Catalogue order mail" +COM_REDSHOP_ORDER_SPECIAL_DISCOUNT_MAIL="Order special discount mail" +COM_REDSHOP_ORDER_STATUS_CHANGE="Order status change" +COM_REDSHOP_REGISTRATION_MAIL="Registration mail" +COM_REDSHOP_PRODUCT_INFORMATION="Product Information" +COM_REDSHOP_TAX_EXEMPT_APPROVAL_MAIL="Tax exempt approval mail" +COM_REDSHOP_TAX_NO="No" +COM_REDSHOP_TAX_YES="Yes" +COM_REDSHOP_TAX_EXEMPT_DISAPPROVAL_MAIL="Tax Exempt Disapproval Mail" +COM_REDSHOP_TAX_EXEMPT_WAITING_APPROVAL_MAIL="Tax exempt waiting approval mail" +COM_REDSHOP_CATALOG_SEND_MAIL="Catalogue sent mail" +COM_REDSHOP_CATALOG_FIRST_REMINDER="Catalogue first reminder" +COM_REDSHOP_CATALOG_SECOND_REMINDER="Catalogue second reminder" +COM_REDSHOP_CATALOG_COUPON_REMINDER="Catalogue coupon reminder" +COM_REDSHOP_CATALOG_SAMPLE_FIRST_REMINDER="Catalogue sample first reminder" +COM_REDSHOP_CATALOG_SAMPLE_SECOND_REMINDER="Catalogue sample second reminder" +COM_REDSHOP_CATALOG_SAMPLE_THIRD_REMINDER="Catalogue Sample third reminder" +COM_REDSHOP_CATALOG_SAMPLE_COUPON_REMINDER="Catalogue sample coupon reminder" +COM_REDSHOP_SECOND_MAIL_AFTER_ORDER_PURCHASED="Second mail after order purchased" +COM_REDSHOP_THIRD_MAIL_AFTER_ORDER_PURCHASED="Third mail after order purchased" +COM_REDSHOP_ECONOMIC_INVOICE="e-conomic Invoice" +COM_REDSHOP_NEWSLETTER_CONFIRMTION="Newsletter confirmation" +COM_REDSHOP_NEWSLETTER_CANCELLATION="Newsletter Cancellation" +COM_REDSHOP_ASK_QUESTION_MAIL="Ask question about product" +COM_REDSHOP_DOWNLOADABLE_PRODUCT_MAIL="Downloadable product mail" +COM_REDSHOP_INVOICE_MAIL="Invoice mail" +COM_REDSHOP_QUOTATION_MAIL="Quotation mail" +COM_REDSHOP_QUOTATION_USER_REGISTER_MAIL="Quotation user registration mail" +COM_REDSHOP_CUSTOMER_ADDRESS="Private Billing Address" +COM_REDSHOP_COMPANY_ADDRESS="Company Billing Address" +COM_REDSHOP_COLOR_SAMPLE="Sample" +COM_REDSHOP_GIFTCARD_USERFIELD="Gift Card user field" +COM_REDSHOP_CUSTOMER_SHIPPING_ADDRESS="Private Shipping Address" +COM_REDSHOP_COMPANY_SHIPPING_ADDRESS="Company Shipping Address" +COM_REDSHOP_TEXT_FIELD="Text Tag Content" +COM_REDSHOP_TEXT_AREA="Text area" +COM_REDSHOP_CHECKBOX="Check box" +COM_REDSHOP_DROPDOWN_LIST="Dropdown List" +COM_REDSHOP_RADIOBOX="Radio buttons" +COM_REDSHOP_SINGLE_SELECT_BOX="Single Select" +COM_REDSHOP_MULTI_SELECT_BOX="Multiple select box" +COM_REDSHOP_SELECT_COUNTRY_BOX="Country selection box" +COM_REDSHOP_WYSIWYG="WYSIWYG" +COM_REDSHOP_DOCUMENTS="Documents" +COM_REDSHOP_IMAGE="Image" +COM_REDSHOP_DATE_PICKER="Date picker" +COM_REDSHOP_IMAGE_WITH_LINK="Image with link" +COM_REDSHOP_SELECTION_BASED_ON_SELECTED_CONDITIONS="Selection Based On Selected Conditions" +COM_REDSHOP_REDSHOP_CONFIGURATION_WIZARD="redSHOP Configuration Wizard" +COM_REDSHOP_REDSHOP_GENERAL_CONFIGURATION_WIZARD="Configuration Wizard: General" +COM_REDSHOP_REDSHOP_TERMS_CONFIGURATION_WIZARD="Configuration Wizard: Terms And Conditions" +COM_REDSHOP_REDSHOP_USER_CONFIGURATION_WIZARD="Configuration wizard: Users" +COM_REDSHOP_REDSHOP_PRICE_CONFIGURATION_WIZARD="Configuration wizard: Price" +COM_REDSHOP_REDSHOP_FINISH_WIZARD="Configuration Wizard: Finish" +COM_REDSHOP_WIZARD_STEPS="Steps" +COM_REDSHOP_WIZARD_WELCOME_STEP1="Welcome to Configuration Wizard" +COM_REDSHOP_WIZARD_GENERAL_STEP2="General settings" +COM_REDSHOP_WIZARD_TERM_STEP3="Terms And Conditions" +COM_REDSHOP_WIZARD_USER_STEP3="User Settings" +COM_REDSHOP_WIZARD_PRICE_STEP4="Price settings" +COM_REDSHOP_WIZARD_FINISH="Finish" +COM_REDSHOP_WIZARD_PREVIOUS_BUTTON="Previous" +COM_REDSHOP_WIZARD_FINISH_BUTTON="Save and exit" +COM_REDSHOP_WIZARD_NEXT_BUTTON="Next" +COM_REDSHOP_SKIP_DO_IT_LATER="Skip Wizard" +COM_REDSHOP_24_HOURS="24 hours" +COM_REDSHOP_12_HOURS="12 hours" +COM_REDSHOP_6_HOURS="6 hours" +COM_REDSHOP_FAILED_TO_COPY_SH404SEF_PLUGIN_LANGUAGE_FILE="failed To Copy Sh404sef Plugin Language File
    " +COM_REDSHOP_PLUGIN="Plugin" +COM_REDSHOP_FIRSTNAME="First Name" +COM_REDSHOP_LASTNAME="Last Name" +COM_REDSHOP_ZIP="Postal Code" +COM_REDSHOP_CITY="City" +COM_REDSHOP_PHONE="Phone" +COM_REDSHOP_CATEGORY_PARENT_ERROR_MSG="Can't remove %s(%s). This category contains child categories, kindly remove those child categories." +COM_REDSHOP_FILE_NOT_FOUND="File Not Found" +COM_REDSHOP_PLEASE_SELECT_SECTION="Please Select Import Data Section i.e. Category, Product etc..." +COM_REDSHOP_PLEASE_SELECT_FILE="Please Select File" +COM_REDSHOP_FILE_EXTENSION_WRONG="File extension wrong, please upload CSV file" +COM_REDSHOP_ERROR_DURING_IMPORT="Error During Import" +COM_REDSHOP_IMPORT_OK="Successfully imported records:" +COM_REDSHOP_UNSUBSCRIBE="Unsubscribe" +COM_REDSHOP_NO_OF_UNREAD_NEWSLETTER="Number of newsletter has been unread" +COM_REDSHOP_NO_OF_READ_NEWSLETTER="Number of Newsletter has been read" +COM_REDSHOP_NO_OF_SENT_NEWSLETTER="Number of Sent Newsletters" +COM_REDSHOP_SELECT_USER="Select User" +COM_REDSHOP_SELECT_USER_OR_ADD_NEW_USER_IN_BOTTOM_FIELDS="Start typing a user name to select an Existing User. For create new user leave this field empty" +COM_REDSHOP_SELECT_PRODUCT="Select Product" +COM_REDSHOP_NO_FILE_SELECTED="No File Selected" +COM_REDSHOP_PRODUCT_NUMBER_ALREADY_EXISTS="Product number already exists" +COM_REDSHOP_CSV_FILE_NOT_UPLOADED_TRY_AGAIN="CSV File not uploaded, Please Try Again!" +COM_REDSHOP_ONLY_CSV_FILE_ALLOWED="Only CSV file Allowed" +COM_REDSHOP_PRODUCT_PARENT_ERROR_MSG="Can not remove Product ID , %s products. This products has child products, Kindly remove child products." +COM_REDSHOP_HIGHER_THAN="Higher than" +COM_REDSHOP_EQUAL="Equals" +COM_REDSHOP_LOWER_THAN="Lower than" +COM_REDSHOP_REDSHOP_REMOTLY_UPDATED="redSHOP Remotely Updated" +COM_REDSHOP_REDSHOP_REMOTELY_UPDATED="redSHOP Remotely Updated" +COM_REDSHOP_PLEASE_ENTER_A_URL="Please Enter An URL" +COM_REDSHOP_INVALID_URL="Invalid URL" +COM_REDSHOP_PLEASE_ENTER_A_PACKAGE_DIRECTORY="Please Enter A Package Directory" +COM_REDSHOP_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE="Path Does Not Have A Valid Package" +COM_REDSHOP_IS_REQUIRED="Required" +COM_REDSHOP_COUNTRY_CODE_3_ALREADY_EXISTS="Country-3-Code Already Exists" +COM_REDSHOP_COUNTRY_CODE_2_ALREADY_EXISTS="Country-2-Code Already Exists" +COM_REDSHOP_STATE_CODE3_ALREADY_EXISTS="3-Digit State Code Already Exists" +COM_REDSHOP_STATE_CODE2_ALREADY_EXISTS="2-Digit State Code Already Exists" +COM_REDSHOP_ZIPCODE_ALREADY_EXISTS="Zipcode Already Exists" +COM_REDSHOP_SECTION="Section" +COM_REDSHOP_PLEASE_ENABLE_ACCESS_MANAGER_FIRST="Please enable access manager first." +COM_REDSHOP_SECTION_PERMISSION="User Group" +COM_REDSHOP_SEE_VIEW="View" +COM_REDSHOP_ADD="Add" +COM_REDSHOP_EDIT="Edit" +COM_REDSHOP_DELETE="Delete" +COM_REDSHOP_PRODUCT_DELETE_CONFIRM="Do you really want delete product(s) ?" +COM_REDSHOP_EDIT_ACCOUNTGROUP="Edit e-conomic product group" +COM_REDSHOP_DETAILS="Details" +COM_REDSHOP_ACCOUNTGROUP_NAME="e-conomic Product Group Name" +COM_REDSHOP_ECONOMIC_VAT_ACCOUNT_NUMBER="VAT Account" +COM_REDSHOP_ECONOMIC_NON_VAT_ACCOUNT_NUMBER="Non VAT Account" +COM_REDSHOP_ENTER_PRODUCT_GROUP_FOR_DISCOUNT_VAT="Enter Product Group For Discount VAT" +COM_REDSHOP_ECONOMIC_DISCOUNT_VAT_ACCOUNT="Discount VAT Account" +COM_REDSHOP_ECONOMIC_DISCOUNT_PRODUCT_NUMBER_LBL="e-conomic Discount Product Number" +COM_REDSHOP_ECONOMIC_DISCOUNT_NONVAT_ACCOUNT="Discount Non VAT Account" +COM_REDSHOP_ECONOMIC_SHIPPING_NONVAT_ACCOUNT="Shipping Non VAT Account" +COM_REDSHOP_ECONOMIC_SHIPPING_VAT_ACCOUNT="Shipping VAT Account" +COM_REDSHOP_PUBLISHED="Published" +COM_REDSHOP_NEW="New" +COM_REDSHOP_PLEASE_ENTER_FIRST_NAME="Please enter first name" +COM_REDSHOP_PLEASE_ENTER_LAST_NAME="Please enter last name" +COM_REDSHOP_PLEASE_ENTER_ADDRESS="Please enter address" +COM_REDSHOP_PLEASE_ENTER_ZIPCODE="Please enter postal code" +COM_REDSHOP_PLEASE_ENTER_CITY="Please enter city" +COM_REDSHOP_PLEASE_ENTER_PHONE="Please enter phone number" +COM_REDSHOP_PLEASE_ENTER_EMAIL_ADDRESS="Please enter email address" +COM_REDSHOP_PLEASE_ENTER_VALID_EMAIL_ADDRESS="Please enter valid email address" +COM_REDSHOP_EMAIL_ALREADY_EXISTS="Email already exists" +COM_REDSHOP_PLEASE_ENTER_PASSWORD="Please enter password" +COM_REDSHOP_CREATE_ACCOUNT="Create Account" +COM_REDSHOP_BILLING_ADDRESS_INFORMATION="Billing Address" +COM_REDSHOP_SHIPPING_ADDRESS_INFORMATION="Shipping Address" +COM_REDSHOP_VAT_NUMBER="Vat number" +COM_REDSHOP_TAX_EXEMPT="Tax exempt" +COM_REDSHOP_SELECT_SHIPPING="Select Shipping Address" +COM_REDSHOP_NEW_PASSWORD_LBL="New Password" +COM_REDSHOP_VERIFIED_PASSWORD_LBL="Confirm New Password" +COM_REDSHOP_SAVE="Save" +COM_REDSHOP_ORDER_DETAILS="Order Details" +COM_REDSHOP_ACTION="Action" +COM_REDSHOP_ORDER_PRODUCT_NOTE="Note" +COM_REDSHOP_PRODUCT_PRICE_WITHOUT_VAT="Price without VAT/Tax" +COM_REDSHOP_TAX="VAT/Tax" +COM_REDSHOP_PRODUCT_PRICE="Price" +COM_REDSHOP_PRODUCT_QTY="Quantity" +COM_REDSHOP_TOTAL_PRICE="Total" +COM_REDSHOP_ORDER_SUBTOTAL="Subtotal" +COM_REDSHOP_ORDER_TAX="VAT/Tax" +COM_REDSHOP_PAYMENT_DISCOUNT_LBL="Payment Discount" +COM_REDSHOP_ORDER_DISCOUNT="Discount" +COM_REDSHOP_ORDER_DISCOUNT_LBL="Discount (Optional. If applicable, add the amount to discount to the price without VAT)" +COM_REDSHOP_ORDER_SHIPPING="Shipping" +COM_REDSHOP_ORDER_TOTAL="Total" +COM_REDSHOP_ORDER_INFORMATION="Order Information" +COM_REDSHOP_ORDER_DATE="Date" +COM_REDSHOP_CUSTOMER_IP_ADDRESS="Customer IP Address" +COM_REDSHOP_COMMENT="comment" +COM_REDSHOP_ORDER_STATUS="Status" +COM_REDSHOP_ORDER_PAYMENT_METHOD="Payment Method" +COM_REDSHOP_ORDER_PAY="Pay using Saved Card" +COM_REDSHOP_NO_PAYMENT_METHOD_TO_DISPLAY="No Payment Method To Display" +COM_REDSHOP_ACCOUNT_INFORMATION="Account Information" +COM_REDSHOP_QUOTATION_DETAILS="Quotation Details" +COM_REDSHOP_QUOTATION_SUBTOTAL="Quotation Subtotal" +COM_REDSHOP_QUOTATION_VAT="Quotation Vat" +COM_REDSHOP_QUOTATION_TAX="Quotation Tax" +COM_REDSHOP_QUOTATION_TOTAL="Quotation Total" +COM_REDSHOP_QUOTATION_MANAGEMENT="Quotation Management" +COM_REDSHOP_SEND="Send" +COM_REDSHOP_FIELD_SECTION="Field section" +COM_REDSHOP_ADDRESS_FIELD_MANAGEMENT="Address Field Ordering Management" +COM_REDSHOP_FILTER="Filter" +COM_REDSHOP_RESET="Reset" +COM_REDSHOP_USER_NAME="User Name" +COM_REDSHOP_USER_EMAIL="Email" +COM_REDSHOP_ANSWERS="Answers" +COM_REDSHOP_QUESTION_ANSWERS="Answers" +COM_REDSHOP_ANSWER_DETAIL="Answer Detail" +COM_REDSHOP_QUESTION_NO_ANSWERS="There are no answers of this question." +COM_REDSHOP_EDIT_ATTRIBUTE_SET="Edit Attribute Set" +COM_REDSHOP_ATTRIBUTE_SET="Attribute Set Management" +COM_REDSHOP_SUBATTRIBUTE_REQUIRED="Required Sub Attribute" +COM_REDSHOP_SUBATTRIBUTE_MULTISELECTED="Multiple Select Sub Attribute" +COM_REDSHOP_ATTRIBUTE_SET_DETAIL="Attribute Set Detail" +COM_REDSHOP_DO_WANT_TO_DELETE="Do you Really Want to Remove this Image?" +COM_REDSHOP_CANCEL="Cancel" +COM_REDSHOP_ADD_ATTRIBUTE_PRICE="Add Attribute Price" +COM_REDSHOP_PROPERTY="Attribute value" +COM_REDSHOP_SHOPPER_GROUP="Shopper Groups" +COM_REDSHOP_QUANTITY_START_LBL="Quantity Start" +COM_REDSHOP_QUANTITY_END_LBL="Quantity end" +COM_REDSHOP_PRICE="Price" +COM_REDSHOP_DISCOUNT_PRICE="Discount Price" +COM_REDSHOP_DISCOUNT_PRICE_MUST_BE_LESS_THAN_PRICE="Discount Price must be less than Price" +COM_REDSHOP_DISCOUNT_START_DATE_END_DATE_CONDITION="Discount Start Date must be the same Or sooner than Discount End Date" +COM_REDSHOP_EDIT_ATTRIBUTE_PRICE="Edit Attribute Price" +COM_REDSHOP_ATTRIBUTE_PRICE="Attribute Price" +COM_REDSHOP_PROPERTY_NAME="Property Name" +COM_REDSHOP_SHOPPER_GROUP_NAME="Shopper Group Name" +COM_REDSHOP_PRODUCT_PRICE_LBL="Product Price" +COM_REDSHOP_BARCODE_TOOLTIP="Enter Barcode to View Order Details" +COM_REDSHOP_CHECK_BARCODE="Check Barcode" +COM_REDSHOP_BARCODE_INFO="Barcode Views" +COM_REDSHOP_BARCODE_INFO_LOG="Log of Barcode Views" +COM_REDSHOP_NUMBER_OF_VIEWS="Views" +COM_REDSHOP_DATE_AND_TIME="Date & Time" +COM_REDSHOP_DETAIL="Detail" +COM_REDSHOP_CATALOG_NAME="Catalogue Name" +COM_REDSHOP_CATALOG_NAME_DESC="Enter name of catalogue" +COM_REDSHOP_CATALOG_MANAGEMENT_DETAIL="Catalogue Management Detail" +COM_REDSHOP_CATALOG_REQUEST_MANAGEMENT="Catalogue Request Management" +COM_REDSHOP_DELETE_CATEGORY="Are you sure want to delete a category or multiple categories?" +COM_REDSHOP_DELETE_SHIPPING_BOXES="Are you sure want to delete a shipping box or multiple shipping boxes?" +COM_REDSHOP_PLEASE_SELECT_CATEGORY="Please Select Category" +COM_REDSHOP_SURE_WANT_TO_ASSIGN_TEMPLATE="Are you certain you want to assign template?" +COM_REDSHOP_CATEGORY_FILTER="Category Filter" +COM_REDSHOP_SEARCH="Search" +COM_REDSHOP_ASSIGN_TEMPLATE="Assign Template" +COM_REDSHOP_EDIT_CATEGORY="Edit Category" +COM_REDSHOP_CATEGORY_MANAGEMENT="Category Management" +COM_REDSHOP_CATEGORY_INFORMATION="Category Information" +COM_REDSHOP_CATEGORY_NAME="Category" +COM_REDSHOP_TOOLTIP_CATEGORY_NAME="Enter a name for this category." +COM_REDSHOP_CATEGORY_PARENT="Category Parent" +COM_REDSHOP_TOOLTIP_CATEGORY_PARENT="If you want this product to be a child product, enter the name of its parent product here." +COM_REDSHOP_CATEGORY_ACCESSORY_PRODUCT_INFO="

    By assigning accessory products here you will be able to set accessories to all the products under this category.

    i.e. You will able to assign accessory based on category.

    " +COM_REDSHOP_SHOW_PRODUCT_PER_PAGE="No. of Products per Page" +COM_REDSHOP_TOOLTIP_SHOW_PRODUCT_PER_PAGE="Select how many products to display per category page." +COM_REDSHOP_CATEGORY_TEMPLATE="Template" +COM_REDSHOP_TOOLTIP_CATEGORY_TEMPLATE="Select your category template." +COM_REDSHOP_CATEGORY_MORE_TEMPLATE="Allowed templates" +COM_REDSHOP_TOOLTIP_CATEGORY_MORE_TEMPLATE="Which templates should be available as alternative views for your customers to select?" +COM_REDSHOP_PRODUCT_COMPARE_TEMPLATE_FOR_CATEGORY="Product Comparison Template" +COM_REDSHOP_TOOLTIP_PRODUCT_COMPARE_TEMPLATE_FOR_CATEGORY="Select product compare template for category" +COM_REDSHOP_SHORT_DESCRIPTION="Short Description" +COM_REDSHOP_DESCRIPTION="Description" +COM_REDSHOP_CATEGORY_IMAGES="Category Images" +COM_REDSHOP_CATEGORY_IMAGE="Category Image" +COM_REDSHOP_TOOLTIP_CATEGORY_IMAGE="Upload image from your PC (click search) or from redSHOP Media Library (click image)" +COM_REDSHOP_DELETE_CURRENT_IMAGE="Delete Current Image" +COM_REDSHOP_CATEGORY_BACK_IMAGE="Back Image" +COM_REDSHOP_TOOLTIP_CATEGORY_BACK_IMAGE="If relevant, you can add a back image." +COM_REDSHOP_META_DATA_TAB="SEO" +COM_REDSHOP_PAGE_TITLE="SEO Page Title" +COM_REDSHOP_TOOLTIP_PAGE_TITLE="Here you can type a page title manually. This will change the automatically generated page title, if any." +COM_REDSHOP_PAGE_HEADING="SEO Page Heading" +COM_REDSHOP_TOOLTIP_PAGE_HEADING="Here you can type a page heading manually. This will replace the automatically generated page heading, if any." +COM_REDSHOP_SEF_URL="SEF URL" +COM_REDSHOP_TOOLTIP_SEF_URL="Here you can type a SEF URL manually. This will replace the automatically generated SEF URL, if any." +COM_REDSHOP_META_KEYWORDS="SEO Keywords" +COM_REDSHOP_TOOLTIP_META_KEYWORDS="Here you can type SEO keywords manually. They will replace automatically generated keywords, if any." +COM_REDSHOP_META_DESCRIPTION="SEO Page Description" +COM_REDSHOP_TOOLTIP_META_DESCRIPTION="Here you can type your page description manually. This will replace the automatically generated description, if any." +COM_REDSHOP_META_LANG_SETTING="Meta Language Setting" +COM_REDSHOP_TOOLTIP_META_LANG_SETTING="Keep English as your SEO language or replace with your preferred language." +COM_REDSHOP_META_ROBOT_INFO="SEO Robot Info" +COM_REDSHOP_TOOLTIP_META_ROBOT_INFO="Enter information for search engine robots, if you want it to differ from your configuration setting.

    INDEX, FOLLOW tells robots to index your site and to scan for links.
    If you want your site to be indexed, but not to be scanned for links, replace with INDEX, NO FOLLOW." +COM_REDSHOP_EXTRA_FIELD="Extra field" +COM_REDSHOP_RECORDS_DELETED="Records are deleted" +COM_REDSHOP_TOOLTIP_GOOGLE_ANALYATICS_TRACKER_KEY="Enter Web Property ID" +COM_REDSHOP_DEFAULT_CART_CHECKOUT_ITEMID_LBL="Default Cart/Checkout Item ID" +COM_REDSHOP_TOOLTIP_DEFAULT_CART_CHECKOUT_ITEMID="Every menu item in frontend has a specific item ID. Enter alternative item ID if you wish to bind the checkout process to a certain item ID (and inherit the module association for that item ID)." +COM_REDSHOP_SPLIT_DELIVERY_COST="Split delivery cost" +COM_REDSHOP_TOOLTIP_SPLIT_DELIVERY_COST="Enter cost for split delivery." +COM_REDSHOP_TOOLTIP_TIME_DIFF_SPILT_CALCULATION="Enter time difference." +COM_REDSHOP_TIME_DIFF_SPILT_CALCULATION="Delivery time difference for split delivery calculation" +COM_REDSHOP_TOOLTIP_DELIVERY_RULE_LBL="Delivery Rule" +COM_REDSHOP_TOOLTIP_DELIVERY_RULE="Enter delivery rule in week" +COM_REDSHOP_QUANTITY_TEXT_DISPLAY_LBL="Quantity change in cart" +COM_REDSHOP_TOOLTIP_QUANTITY_TEXT_DISPLAY_LBL="Select if your customer should be allowed to make changes in quantity by writing in the quantity field in the shopping cart." +COM_REDSHOP_DEFAULT_QUANTITY_LBL="Quantity Max Characters" +COM_REDSHOP_TOOLTIP_DEFAULT_QUANTITY_LBL="Type maximal number of characters for quantity" +COM_REDSHOP_DEFAULT_QUANTITY_SELECTBOX_VALUE_LBL="Default product quantities" +COM_REDSHOP_TOOLTIP_DEFAULT_QUANTITY_SELECTBOX_VALUE_LBL="If relevant, enter default product quantities. Separate with comma." +COM_REDSHOP_TOOLTIP_AJAX_CARTDISPLAY_TIME_LBL="Enter ajax card display time in xxx" +COM_REDSHOP_TOOLTIP_AJAX_CARTDISPLAY_TIME="Enter time in ms for ajax cart display, enter 0 if you want the display to be permanent until continue shopping or go to cart is clicked." +COM_REDSHOP_USE_STOCKROOM_LBL="Use Stockroom" +COM_REDSHOP_TOOLTIP_USE_STOCKROOM_LBL="Do you want to use stockroom?" +COM_REDSHOP_USE_BLANK_AS_INFINITE_LBL="Set Stock as Infinite (Leave blank for infinite stock)" +COM_REDSHOP_TOOLTIP_USE_BLANK_AS_INFINITE_LBL="Select 'Yes' to set infinite stock (Stockroom must be nil)." +COM_REDSHOP_ONESTEP_CHECKOUT_ENABLE_LBL="One step Checkout" +COM_REDSHOP_TOOLTIP_ONESTEP_CHECKOUT_ENABLE_LBL="Do you want to use one step checkout?" +COM_REDSHOP_TOOLTIP_INDIVIDUAL_ADD_TO_CART_ENABLE_LBL="Individual add to cart button." +COM_REDSHOP_TOOLTIP_INDIVIDUAL_ADD_TO_CART_ENABLE="Do you want one add to cart per product, or do you want individual add to cart on each attribute?" +COM_REDSHOP_ACCESSORY_AS_PRODUCT_IN_CART_ENABLE_LBL="Enable Accessory as individual product in cart." +COM_REDSHOP_TOOLTIP_ACCESSORY_AS_PRODUCT_IN_CART_ENABLE_LBL="Do you want to show accessories as individual products in the cart." +COM_REDSHOP_ALLOW_PRE_ORDER_LBL="Allow Pre-order" +COM_REDSHOP_TOOLTIP_ALLOW_PRE_ORDER="Do you to allow pre-order, when a product is not yet in stock?" +COM_REDSHOP_TOOLTIP_PAYMENT_CALCULATION_ON_LBL="Payment Calculation On" +COM_REDSHOP_TOOLTIP_PAYMENT_CALCULATION_ON="Select if the payment calculation is based on order total or order subtotal." +COM_REDSHOP_ALLOW_PRE_ORDER_MESSAGE_LBL="Pre-order Button tooltip" +COM_REDSHOP_TOOLTIP_ALLOW_PRE_ORDER_MESSAGE="This is a tooltip for your customers. Keep suggested text/tag or type new" +COM_REDSHOP_ADDTOCART_BUTTON_BEHAVE_LBL="Add to cart button leads" +COM_REDSHOP_TOOLTIP_ADDTOCART_BUTTON_BEHAVE="Select which view your customers should see right after adding a product to cart" +COM_REDSHOP_WANT_TO_SHOW_ATTRIBUTE_IMAGE_INCART_LBL="Attribute images in cart" +COM_REDSHOP_TOOLTIP_WANT_TO_SHOW_ATTRIBUTE_IMAGE_INCART_LBL="Do you want to display attribute images in cart?" +COM_REDSHOP_TOOLTIP_QUOTATION_MODE_LBL="Select if you want to activate quote mode." +COM_REDSHOP_TOOLTIP_QUOTATION_MODE="Do you want to allow creation of quotes?" +COM_REDSHOP_TOOLTIP_ORDER_NUMBER_TEMPLATE="This was formally known as Invoice Number Template in old version. Any letters in the template should be in front and will be static. # or X or x is placeholder for one digit. Minimum 2 digit is required for template." +COM_REDSHOP_TOOLTIP_INVOICE_NUMBER_TEMPLATE="This is a template for invoice numbers which is generated in chronological orders. Any letters in the template should be in front and will be static. # or X or x is placeholder for one digit. Minimum 2 digit is required for template." +COM_REDSHOP_FIRST_INVOICE_NUMBER_LBL="Current last Invoice Number" +COM_REDSHOP_TOOLTIP_FIRST_INVOICE_NUMBER_LBL="Enter number of your current last invoice. Your first redSHOP invoice will start with your `current last number` + 1. Leave empty to start with number 01" +COM_REDSHOP_TOOLTIP_CART_TIMEOUT_LBL="Cart timeout in minutes" +COM_REDSHOP_TOOLTIP_CART_TIMEOUT="Enter how many minutes products will stay in cart, if your customer is inactive" +COM_REDSHOP_TOOLTIP_AJAX_CART_BOX_LBL="Enable Add to Cart lightbox (Ajax)" +COM_REDSHOP_TOOLTIP_AJAX_CART_BOX="Select if you want the add to cart details to be shown in an Ajax lightbox." +COM_REDSHOP_TOOLTIP_AJAX_CART_BOX_TEMPLATE_LBL="Ajax Cart Template" +COM_REDSHOP_TOOLTIP_AJAX_CART_BOX_TEMPLATE="Select the ajax cart template which you want to display." +COM_REDSHOP_TOOLTIP_OPTIONAL_SHIPPING_ADDRESS_LBL="same address" +COM_REDSHOP_TOOLTIP_OPTIONAL_SHIPPING_ADDRESS="if active the checkbox Use Same Shipping Address as Billing Address will be shown in checkout" +COM_REDSHOP_OPTIONAL_SHIPPING_ADDRESS_LBL="Show checkbox Use same Address for Billing and Shipping" +COM_REDSHOP_SHIPPING_METHOD_ENABLE_LBL="Enable Shipping Method" +COM_REDSHOP_TOOLTIP_SHIPPING_METHOD_ENABLE="Under shipping you can set up different shipping methods. If you want to control shipping methods and rates from redSHOP, please enable shipping methods here." +COM_REDSHOP_TOOLTIP_DEDAULT_STOCKROOM_LBL="Select default stockroom." +COM_REDSHOP_TOOLTIP_DEDAULT_STOCKROOM="Select stockroom which you want to use" +COM_REDSHOP_CONTINUE_REDIRECT_LINK_LBL="Link Continue Shopping" +COM_REDSHOP_TOOLTIP_CONTINUE_REDIRECT_LINK="Type the URL you want to link to the [continue] button for shopping more." +COM_REDSHOP_MINIMUM_ORDER_TOTAL_LBL="Minimum Order Total" +COM_REDSHOP_MINIMUM_DELIVERY_TIME="Minimum Delivery Time" +COM_REDSHOP_TOOLTIP_MINIMUM_ORDER_TOTAL="Enter minimum amount for one purchase." +COM_REDSHOP_SHOW_SHIPPING_IN_CART_LBL="Show Shipping in Cart" +COM_REDSHOP_TOOLTIP_SHOW_SHIPPING_IN_CART_LBL="Select if shipping should be visible in cart" +COM_REDSHOP_SSL_ENABLE_IN_CHECKOUT_LBL="SSL URL in Checkout" +COM_REDSHOP_TOOLTIP_SSL_ENABLE_IN_CHECKOUT_LBL="SSL in Backend" +COM_REDSHOP_TOOLTIP_SSL_ENABLE_IN_BACKEND_LBL="Select if you want to enable SSL in backend. This is only for shop owners that have an active SSL certificate." +COM_REDSHOP_TOOLTIP_SSL_ENABLE_IN_BACKEND="Select if you want to enable SSL in backend. This is only for shop owners that have an active SSL certificate." +COM_REDSHOP_TOOLTIP_CART_RESERVATION_MESSAGE_LBL="Cart Reservation Message" +COM_REDSHOP_TOOLTIP_CART_RESERVATION_MESSAGE="Type the message you want to give customers when the last items in stock are reserved in another customers cart." +COM_REDSHOP_TOOLTIP_ADDTOCART_IMAGE_LBL="Add To Cart Image" +COM_REDSHOP_TOOLTIP_ADDTOCART_IMAGE="Upload your add to cart image here" +COM_REDSHOP_TOOLTIP_ADDTOCART_BACKGROUND_LBL="Add To Cart Background Color" +COM_REDSHOP_TOOLTIP_ADDTOCART_BACKGROUND="Add to cart background color here" +COM_REDSHOP_REQUESTQUOTE_IMAGE_LBL="Request Quote Image" +COM_REDSHOP_TOOLTIP_REQUESTQUOTE_IMAGE_LBL="Upload Request Quote Image" +COM_REDSHOP_REQUESTQUOTE_BACKGROUND_LBL="Request Quote Background Color" +COM_REDSHOP_TOOLTIP_REQUESTQUOTE_BACKGROUND_LBL="Request Quote Background Color" +COM_REDSHOP_TOOLTIP_ADDTOCART_UPDATE_LBL="Upload your add to cart update image here" +COM_REDSHOP_ADDTOCART_UPDATE_LBL="Add to Cart 'Update' image" +COM_REDSHOP_TOOLTIP_ADDTOCART_DELETE_LBL="Upload your add to cart delete image here" +COM_REDSHOP_ADDTOCART_DELETE_LBL="Add to Cart 'Delete' image" +COM_REDSHOP_CATALOG_REMAINDER_1_LBL="Catalogue Reminder 1" +COM_REDSHOP_TOOLTIP_CATALOG_REMAINDER_1="Enter number of days for First catalogue reminder" +COM_REDSHOP_CATALOG_REMAINDER_2_LBL="Catalogue Reminder 2" +COM_REDSHOP_TOOLTIP_CATALOG_REMAINDER_2="Enter number of days for Second catalogue reminder" +COM_REDSHOP_DISCOUNT_DURATION_LBL="Discount Duration in Days" +COM_REDSHOP_TOOLTIP_DISCOUNT_DURATION="Enter how many days after sending catalogue, discount should be valid." +COM_REDSHOP_DISCOUNT_PERCENTAGE_LBL="Discount percentage" +COM_REDSHOP_TOOLTIP_DISCOUNT_PERCENTAGE="Enter discount percentage." +COM_REDSHOP_TOOLTIP_CATALOG_DAYS_LBL="Catalogue Days" +COM_REDSHOP_TOOLTIP_CATALOG_DAYS="If you want a number of days to be included in your catalogue reminder, you can enter number of days here." +COM_REDSHOP_TOOLTIP_SEND_CATALOG_REMINDER_MAI_LBL="Set Catalogue Reminder" +COM_REDSHOP_TOOLTIP_SEND_CATALOG_REMINDER_MAI="You want to set catalogue reminder or not" +COM_REDSHOP_CONFIG_GLS="Gls Configuration" +COM_REDSHOP_GLS_CUSTOMER_ID_LBL="GLS Customer Id" +COM_REDSHOP_TOOLTIP_GLS_CUSTOMER_ID_LBL="Provide your GLS customer id" +COM_REDSHOP_CLICKTELL_ENABLE_LBL="Clickatell SMS Service" +COM_REDSHOP_TOOLTIP_CLICKTELL_ENABLE_LBL="Do you want to employ Clickatell SMS service?" +COM_REDSHOP_CLICKATELL_USERNAME_LBL="Clickatell Username" +COM_REDSHOP_TOOLTIP_CLICKATELL_USERNAME_LBL="Type your Clickatell username." +COM_REDSHOP_CLICKATELL_PASSWORD_LBL="Clickatell Password" +COM_REDSHOP_TOOLTIP_CLICKATELL_PASSWORD_LBL="Type your Clickatell password." +COM_REDSHOP_CLICKATELL_API_ID_LBL="Type your Clickatell API ID/KEY" +COM_REDSHOP_TOOLTIP_CLICKATELL_API_ID_LBL="Type your Clickatell API ID/KEY." +COM_REDSHOP_CLICKTELL_ORDER_STATUS_LBL="Order Status for sending SMS" +COM_REDSHOP_TOOLTIP_CLICKTELL_ORDER_STATUS_LBL="Select, at which order status the customer should be notified with an SMS." +COM_REDSHOP_COLOUR_SAMPLE_REMAINDER_1_LBL="Sample Reminder 1" +COM_REDSHOP_TOOLTIP_COLOUR_SAMPLE_REMAINDER_1_LBL="Enter no. of days after sending sample(s) until sending second sample reminder." +COM_REDSHOP_COLOUR_SAMPLE_REMAINDER_2_LBL="Sample Reminder 2" +COM_REDSHOP_TOOLTIP_COLOUR_SAMPLE_REMAINDER_2_LBL="Enter no. of days after sending sample(s) until sending first sample reminder." +COM_REDSHOP_COLOUR_SAMPLE_REMAINDER_3_LBL="Sample Reminder 3" +COM_REDSHOP_TOOLTIP_COLOUR_SAMPLE_REMAINDER_3_LBL="Enter no. of days after sending sample(s) until sending third sample reminder." +COM_REDSHOP_COLOUR_COUPON_DURATION_LBL="Discount Duration in Days" +COM_REDSHOP_TOOLTIP_COLOUR_COUPON_DURATION_LBL="Enter how many days after sending sample, discount should be valid." +COM_REDSHOP_COLOUR_DISCOUNT_PERCENTAGE_LBL="Discount percentage" +COM_REDSHOP_TOOLTIP_COLOUR_DISCOUNT_PERCENTAGE_LBL="Enter discount percentage." +COM_REDSHOP_TOOLTIP_COLOUR_SAMPLE_DAYS_LBL="Enter Number of Days for Samples" +COM_REDSHOP_TOOLTIP_COLOUR_SAMPLE_DAYS="If you want a number of days to be included in your catalogue reminder, you can enter number of days here." +COM_REDSHOP_MENUHIDE="Hidden Menus" +COM_REDSHOP_NEWEST_CUSTOMERS="Newest Customers" +COM_REDSHOP_SHOW_LAST_MONTH_STATISTIC="Show Statistics for Latest Month" +COM_REDSHOP_DISCOUNT_MAIL_SEND_LBL="Send discount mail" +COM_REDSHOP_TOOLTIP_DISCOUNT_MAIL_SEND_LBL="Do you want to follow up on purchases by sending an email offering a discount?" +COM_REDSHOP_SPECIAL_DISCOUNT_MAIL_SEND_LBL="Send Special discount mail" +COM_REDSHOP_TOOLTIP_SPECIAL_DISCOUNT_MAIL_SEND_LBL="Do you want to follow up on purchases by sending an email offering a special discount?" +COM_REDSHOP_DISCOUNT_TYPE="Discount type" +COM_REDSHOP_DISCOUNT_TYPE_LBL="Allowed combination of discounts" +COM_REDSHOP_TOOLTIP_DISCOUNT_TYPE_LBL="Select how many and what kinds of price reductions you would like to allow the customers to use in a single purchase." +COM_REDSHOP_DISCOUNT_ENABLE_LBL="Enable Discounts" +COM_REDSHOP_TOOLTIP_DISCOUNT_ENABLE_LBL="Select if you want to allow discounts to be used in your webshop." +COM_REDSHOP_COUPONS_ENABLE_LBL="Enable Coupons" +COM_REDSHOP_TOOLTIP_COUPONS_ENABLE_LBL="Enable/Disabled Coupon usage" +COM_REDSHOP_VOUCHERS_ENABLE_LBL="Enable Vouchers" +COM_REDSHOP_TOOLTIP_VOUCHERS_ENABLE_LBL="Vouchers give permission to a certain amount of purchases with the indicated price reduction. Vouchers can be assigned to specific products. Do you want to enable vouchers?" +COM_REDSHOP_APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT_LBL="Apply discount/voucher code for products already on discount" +COM_REDSHOP_TOOLTIP_APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT_LBL="Do not apply discount/voucher code for products already on discount" +COM_REDSHOP_TOOLTIP_MAIL1_AFTER_ORDER_LBL="Enter how long after purchase your first mail should be sent." +COM_REDSHOP_MAIL1_AFTER_ORDER_LBL="No of days after purchase before sending mail #1" +COM_REDSHOP_TOOLTIP_MAIL2_AFTER_ORDER_LBL="Enter how long after purchase your second mail should be sent." +COM_REDSHOP_MAIL2_AFTER_ORDER_LBL="No of days after purchase before sending mail #2" +COM_REDSHOP_TOOLTIP_MAIL3_AFTER_ORDER_LBL="Enter how long after purchase your third mail should be sent." +COM_REDSHOP_MAIL3_AFTER_ORDER_LBL="No of days after purchase before sending mail #3" +COM_REDSHOP_TOOLTIP_VAT_RATE_AFTER_DISCOUNT_LBL="Enter VAT rate after discount. (If 16%, write 0.16)." +COM_REDSHOP_TOOLTIP_VAT_RATE_AFTER_DISCOUNT="Enter VAT rate after discount. (If 16%, write 0.16)." +COM_REDSHOP_TOOLTIP_DISCOUNT_COUPON_DURATION_LBL="How many days after mail 1 should coupon be valid?" +COM_REDSHOP_TOOLTIP_DISCOUNT_COUPON_DURATION="Enter No of days till coupon will be valid after 1 mail" +COM_REDSHOP_TOOLTIP_SHIPPING_AFTER_LBL="Select if you want shipping costs based on normal price (total) or discount price (subtotal)." +COM_REDSHOP_TOOLTIP_SHIPPING_AFTER="Calculate shipping based on Total/Subtotal" +COM_REDSHOP_TOOLTIP_DISCOUNT_PERCENT_OR_TOTAL_LBL="Select Value of discount coupon" +COM_REDSHOP_TOOLTIP_DISCOUNT_PERCENT_OR_TOTAL="Value of discount coupon is percentage/total" +COM_REDSHOP_TOOLTIP_DISCOUNT_COUPON_VALUE_LBL="Discount coupon value" +COM_REDSHOP_TOOLTIP_DISCOUNT_COUPON_VALUE="Enter discount coupon value" +COM_REDSHOP_ECONOMIC_INTEGRATION_LBL="e-conomic Integration" +COM_REDSHOP_TOOLTIP_ECONOMIC_INTEGRATION_LBL="Select if you want to enable e-conomic integration." +COM_REDSHOP_ECONOMIC_CHOICE_OF_BOOK_INVOICE_LBL="Choice of Book Invoice" +COM_REDSHOP_TOOLTIP_ECONOMIC_CHOICE_OF_BOOK_INVOICE_LBL="Select option to book invoice" +COM_REDSHOP_DIRECTLY_BOOK="Directly Book Invoice" +COM_REDSHOP_MANUALLY_BOOK="Manually Book Invoice" +COM_REDSHOP_BOOK_ON_ORDER_STATUS="Book Invoice on Selected Order status" +COM_REDSHOP_SELECT_BOOK_INVOICE_ORDER_STATUS="Select Book Invoice Order status" +COM_REDSHOP_BOOKINVOICE_NUMBER="BookInvoice Number" +COM_REDSHOP_TOOLTIP_ECONMOMIC_TAX_ZONE_LBL="E-conomic tax zone" +COM_REDSHOP_ECONMOMIC_TAX_ZONE_LBL="E-conomic tax zone" +COM_REDSHOP_DEFAULT_ECONMOMIC_ACCOUNT_GROUP_LBL="Default e-conomic Account Group" +COM_REDSHOP_TOOLTIP_DEFAULT_ECONMOMIC_ACCOUNT_GROUP_LBL="Select your default e-conomic account group" +COM_REDSHOP_ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC_LBL="Store Attributes as Products in e-conomic" +COM_REDSHOP_TOOLTIP_ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC_LBL="Enable store attribute as product in e-conomic" +COM_REDSHOP_TOOLTIP_DETAIL_ERROR_MESSAGE_ON_LBL="Detail error message On?" +COM_REDSHOP_TOOLTIP_DETAIL_ERROR_MESSAGE_ON="If set to 'Yes' SOAP exception message will be shown directly otherwise it will show simple short error message." +COM_REDSHOP_TOOLTIP_EXPAND_ALL_LBL="Expand All" +COM_REDSHOP_TOOLTIP_EXPAND_ALL="Do you want to expand all?" +COM_REDSHOP_ACCESSORY_THUMB_WIDTH_LBL="Width/height of main accessory thumbnail" +COM_REDSHOP_ACCESSORY_THUMB_WIDTH_LBL_TWO="Width/height of accessory thumbnail #2" +COM_REDSHOP_TOOLTIP_ACCESSORY_THUMB_WIDTH_LBL_TWO="Enter width/height in pixel." +COM_REDSHOP_ACCESSORY_THUMB_WIDTH_LBL_THREE="Width/height of accessory thumbnail #3" +COM_REDSHOP_TOOLTIP_CART_THUMB_WIDTH_LBL="Enter width/height in pixel." +COM_REDSHOP_CART_THUMB_WIDTH_LBL="Width/height of Product Thumb in Cart" +COM_REDSHOP_WATERMARK_CART_THUMB_IMAGE_LBL="Watermark in Cart thumb" +COM_REDSHOP_TOOLTIP_WATERMARK_CART_THUMB_IMAGE="Watermark cart thumbnail image" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_THUMB_WIDTH="Category product thumb width/height" +COM_REDSHOP_CATEGORY_PRODUCT_THUMB_WIDTH_LBL="Width/height of Main Product Thumb in Category View" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_THUMB_WIDTH_TWO="Category product thumb2 width/height" +COM_REDSHOP_CATEGORY_PRODUCT_THUMB_WIDTH_LBL_TWO="Width/height of Product Thumb #2 in Category View 2" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_THUMB_WIDTH_THREE="Category product thumb3 width/height" +COM_REDSHOP_CATEGORY_PRODUCT_THUMB_WIDTH_LBL_THREE="Width/height of Product Thumb #3 in Category View 3" +COM_REDSHOP_TOOLTIP_WATERMARK_CATEGORY_IMAGE_LBL="Watermark Category Image" +COM_REDSHOP_TOOLTIP_WATERMARK_CATEGORY_IMAGE="Do you want watermark in your category image?" +COM_REDSHOP_TOOLTIP_WATERMARK_CATEGORY_THUMB_IMAGE_LBL="Watermark Category Thumb Image" +COM_REDSHOP_TOOLTIP_WATERMARK_CATEGORY_THUMB_IMAGE="Do you want watermark in category thumb image?" +COM_REDSHOP_GIFTCARD_THUMB_WIDTH_LBL="Gift Card Thumb Width/height" +COM_REDSHOP_TOOLTIP_GIFTCARD_THUMB_WIDTH_LBL="Enter width/height in pixel." +COM_REDSHOP_GIFTCARD_LIST_THUMB_WIDTH_LBL="Gift Card List Thumb Width/height" +COM_REDSHOP_TOOLTIP_GIFTCARD_LIST_THUMB_WIDTH_LBL="Enter width/height in pixel." +COM_REDSHOP_WATERMARK_GIFTCARD_IMAGE="Watermark Gift Card Image" +COM_REDSHOP_TOOLTIP_WATERMARK_GIFTCARD_IMAGE_LBL="Do you want watermark in your Gift Card image?" +COM_REDSHOP_WATERMARK_GIFTCARD_THUMB_IMAGE="Watermark Gift Card Thumb Image" +COM_REDSHOP_TOOLTIP_WATERMARK_GIFTCARD_THUMB_IMAGE_LBL="Do you want watermark in your Gift Card thumbnail image?" +COM_REDSHOP_TOOLTIP_MANUFACTURER_THUMB_WIDTH="Enter width/height in pixel." +COM_REDSHOP_MANUFACTURER_THUMB_WIDTH_LBL="Manufacturer Thumb width/height" +COM_REDSHOP_TOOLTIP_MANUFACTURER_PRODUCT_THUMB_WIDTH_LBL="Enter width/height in pixel." +COM_REDSHOP_TOOLTIP_MANUFACTURER_PRODUCT_THUMB_WIDTH="Manufacturer Product Thumbnail Width/height" +COM_REDSHOP_TOOLTIP_MANUFACTURER_PRODUCT_THUMB_WIDTH_LBL_TWO_LBL="Manufacturer Product Thumb Width/height Two" +COM_REDSHOP_TOOLTIP_MANUFACTURER_PRODUCT_THUMB_WIDTH_LBL_TWO="Enter width/height in pixel." +COM_REDSHOP_TOOLTIP_MANUFACTURER_PRODUCT_THUMB_WIDTH_THREE="Manufacturer Product Thumb3 Width/height" +COM_REDSHOP_MANUFACTURER_PRODUCT_THUMB_WIDTH_LBL_THREE="Width/height of Manufacturer Product Thumb #3" +COM_REDSHOP_TOOLTIP_WATERMARK_MANUFACTURER_IMAGE="Do you want to watermark manufacturer images?" +COM_REDSHOP_WATERMARK_MANUFACTURER_IMAGE_LBL="Watermark Manufacturer Image" +COM_REDSHOP_TOOLTIP_WATERMARK_MANUFACTURER_THUMB_IMAGE="Do you want to watermark manufacturer thumb images?" +COM_REDSHOP_WATERMARK_MANUFACTURER_THUMB_IMAGE_LBL="Watermark Manufacturer thumb Image" +COM_REDSHOP_PRODUCT_MAIN_IMAGE="Product Image Width/height" +COM_REDSHOP_TOOLTIP_PRODUCT_MAIN_IMAGE_LBL="Enter width/height in pixel for product main image 1" +COM_REDSHOP_PRODUCT_MAIN_IMAGE_TWO="Product Main Image Two" +COM_REDSHOP_TOOLTIP_PRODUCT_MAIN_IMAGE_LBL_TWO="Enter width/height in pixel." +COM_REDSHOP_PRODUCT_MAIN_IMAGE_THREE="Product Main Image Three" +COM_REDSHOP_TOOLTIP_PRODUCT_MAIN_IMAGE_LBL_THREE="Enter width/height in pixel." +COM_REDSHOP_TOOLTIP_PRODUCT_ADDITIONAL_IMAGE_LBL="Enter width/height in pixel." +COM_REDSHOP_TOOLTIP_PRODUCT_ADDITIONAL_IMAGE="Product Additional Image size which will show in product detail page" +COM_REDSHOP_PRODUCT_ADDITIONAL_IMAGE_LBL_TWO="Product Additional Image 2 Width/height" +COM_REDSHOP_TOOLTIP_PRODUCT_ADDITIONAL_IMAGE_TWO="Enter width/height in pixel." +COM_REDSHOP_PRODUCT_ADDITIONAL_IMAGE_THREE="Product Additional Image Three" +COM_REDSHOP_TOOLTIP_PRODUCT_ADDITIONAL_IMAGE_LBL_THREE="Enter width/height in pixel." +COM_REDSHOP_WATERMARK_PRODUCT_IMAGE_LBL="Water Mark Product Image" +COM_REDSHOP_TOOLTIP_WATERMARK_PRODUCT_IMAGE="Do you want a watermark inserted in product thumbs in cart?" +COM_REDSHOP_WATERMARK_PRODUCT_THUMB_IMAGE_LBL="Water Mark Product Thumb Image" +COM_REDSHOP_TOOLTIP_WATERMARK_PRODUCT_THUMB_IMAGE="Enable water mark for product thumbnails." +COM_REDSHOP_WATERMARK_PRODUCT_ADDITIONAL_IMAGE_LBL="Water Mark Product additional Image" +COM_REDSHOP_TOOLTIP_WATERMARK_PRODUCT_ADDITIONAL_IMAGE="Enable Water Mark Product additional Image" +COM_REDSHOP_TOOLTIP_PRODUCT_HOVER_IMAGE_ENABLE_LBL="Do want a larger image to be shown when your customers roll the mouse over a product image?" +COM_REDSHOP_TOOLTIP_PRODUCT_HOVER_IMAGE_ENABLE="Do want a larger image to be shown when your customers rolls the mouse over a product image?" +COM_REDSHOP_TOOLTIP_PRODUCT_HOVER_IMAGE_WIDTH_LBL="Enter width/height in pixel." +COM_REDSHOP_TOOLTIP_PRODUCT_HOVER_IMAGE_WIDTH="Enter width/height in pixel." +COM_REDSHOP_TOOLTIP_ADDITIONAL_HOVER_IMAGE_ENABLE_LBL="Do you want a larger image to be shown when your customers roll the mouse over an additional product image?" +COM_REDSHOP_TOOLTIP_ADDITIONAL_HOVER_IMAGE_ENABLE="Do you want a larger image to be shown when your customers rolls the mouse over an additional product image?" +COM_REDSHOP_TOOLTIP_ADDITIONAL_HOVER_IMAGE_WIDTH_LBL="Enter width/height in pixel." +COM_REDSHOP_TOOLTIP_ADDITIONAL_HOVER_IMAGE_WIDTH="Enter width/height in pixel." +COM_REDSHOP_TOOLTIP_PRODUCT_PREVIEW_IMAGE_WIDTH_LBL="Enter width/height in pixel." +COM_REDSHOP_TOOLTIP_PRODUCT_PREVIEW_IMAGE_WIDTH="Enter product preview image width/height in pixel" +COM_REDSHOP_CATEGORY_PRODUCT_PREVIEW_IMAGE_WIDTH_LBL="Product preview category view image width/height" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_PREVIEW_IMAGE_WIDTH_LBL="Enter width/height in pixel." +COM_REDSHOP_ATTRIBUTE_SCROLLER_THUMB_WIDTH_LBL="Attribute scroller thumb image width/height" +COM_REDSHOP_TOOLTIP_ATTRIBUTE_SCROLLER_THUMB_WIDTH_LBL="Enter attribute scroller thumb image width/height" +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_THUMB_WIDTH="Related Product Thumb Width/height" +COM_REDSHOP_RELATED_PRODUCT_THUMB_WIDTH_LBL="Width/height of Main Related Product Thumb" +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_THUMB_WIDTH_TWO="Related Product Thumb2 Width/height" +COM_REDSHOP_RELATED_PRODUCT_THUMB_WIDTH_LBL_TWO="Width/height of Related Product Thumb #2" +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_THUMB_WIDTH_THREE="Related Product Thumb3 Width/height" +COM_REDSHOP_RELATED_PRODUCT_THUMB_WIDTH_LBL_THREE="Width/height of Related Product Thumb #3" +COM_REDSHOP_POST_DENMART="Pacsoft" +COM_REDSHOP_ECONOMIC="e-conomic" +COM_REDSHOP_GENERAL="General" +COM_REDSHOP_ACCESSORY_PRODUCT_ORDERING_METHOD_LBL="Default Accessory Sorting" +COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_ORDERING_METHOD_LBL="Select how you want your accessory products to be sorted" +COM_REDSHOP_ACCESSORY_PRODUCT_DESC_MAX_CHARS_LBL="Max. Characters for Related Product Description" +COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_DESC_MAX_CHARS_LBL="Enter max. Characters for Related Product Description" +COM_REDSHOP_ACCESSORY_PRODUCT_DESC_END_SUFFIX_LBL="Accessory Product description end suffix:" +COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_DESC_END_SUFFIX_LBL="If your description of an accessory product is too long, the end will be cut off and replaced with your chosen suffix, e.g. […]. Enter suffix of your choice" +COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_TITLE_MAX_CHARS_LBL="Enter max. no. of characters for your accessory product title." +COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_TITLE_MAX_CHARS="Enter max. no. of characters for your accessory product title." +COM_REDSHOP_ACCESSORY_PRODUCT_TITLE_END_SUFFIX_LBL="Accessory Product Title Suffix" +COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_TITLE_END_SUFFIX_LBL="If your title for a related products is too long, the end will be cut off and replaced with your chosen suffix, e.g. […]. Enter suffix of your choice" +COM_REDSHOP_CATEGORY_TITLE_MAX_CHARS_LBL="Max. Characters for Category Title on Category View" +COM_REDSHOP_TOOLTIP_CATEGORY_TITLE_MAX_CHARS_LBL="Enter maximal amount of characters for the category titles when shown on category page" +COM_REDSHOP_CATEGORY_TITLE_END_SUFFIX_LBL="Category Title Suffix" +COM_REDSHOP_TOOLTIP_CATEGORY_TITLE_END_SUFFIX_LBL="If your category title is too long, the first part will be shown with your chosen suffix, e.g. … Enter suffix of your choice" +COM_REDSHOP_DEFAULT_CATEGORY_ORDERING_METHOD_LBL="Default Category Sorting" +COM_REDSHOP_TOOLTIP_DEFAULT_CATEGORY_ORDERING_METHOD_LBL="Select if categories should be ordered alphabetically, by time for creation or by sorting in backend" +COM_REDSHOP_CATEGORY_DESC_MAX_CHARS_LBL="Max. Characters for Category Description" +COM_REDSHOP_TOOLTIP_CATEGORY_DESC_MAX_CHARS_LBL="Enter maximal amount of characters for category description." +COM_REDSHOP_CATEGORY_DESC_END_SUFFIX_LBL="Category Description Suffix" +COM_REDSHOP_TOOLTIP_CATEGORY_DESC_END_SUFFIX_LBL="If your category description is too long, the first part will be shown with your chosen suffix, e.g. … Enter suffix of your choice" +COM_REDSHOP_TOOLTIP_CATEGORY_SHORT_DESC_MAX_CHARS_LBL="Category short description max chars" +COM_REDSHOP_TOOLTIP_CATEGORY_SHORT_DESC_MAX_CHARS="Enter maximal amount of characters for short category description" +COM_REDSHOP_CATEGORY_SHORT_DESC_END_SUFFIX_LBL="Short Category Description Suffix" +COM_REDSHOP_TOOLTIP_CATEGORY_SHORT_DESC_END_SUFFIX_LBL="If your short description of a category is too long, the first part will be shown with your chosen suffix, e.g. … Enter suffix of your choice" +COM_REDSHOP_CATEGORY_PRODUCT_TITLE_MAX_CHARS_LBL="Max. Characters for Product Title on Category View" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_TITLE_MAX_CHARS_LBL="Enter maximal amount of characters for the product titles when shown on category page" +COM_REDSHOP_CATEGORY_PRODUCT_TITLE_END_SUFFIX_LBL="Suffix for Product Title on Category View" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_TITLE_END_SUFFIX_LBL="If your product title is too long, the first part will be shown with your chosen suffix, e.g. … Enter suffix of your choice" +COM_REDSHOP_CATEGORY_PRODUCT_DESC_MAX_CHARS_LBL="Max Characters for Product Description on Category View" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_DESC_MAX_CHARS_LBL="Enter maximal amount of characters for product description on category view" +COM_REDSHOP_CATEGORY_PRODUCT_DESC_MAX_SUFFIX_LBL="Suffix for Product Description on Category View" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_DESC_MAX_SUFFIX_LBL="If your product description is too long, the first part will be shown with your chosen suffix, e.g. … Enter suffix of your choice" +COM_REDSHOP_CATEGORY_PRODUCT_SHORT_DESC_MAX_CHARS_LBL="Max Characters for Short Product Description on Category View" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_SHORT_DESC_MAX_CHARS_LBL="Enter maximal amount of characters for short product description on category view" +COM_REDSHOP_CATEGORY_PRODUCT_SHORT_DESC_END_SUFFIX_LBL="Suffix for Short Product Description on Category View" +COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_SHORT_DESC_END_SUFFIX_LBL="If your product description is too long, the first part will be shown with your chosen suffix, e.g. … Enter suffix of your choice" +COM_REDSHOP_FRONTPAGE_CATEGORY_PAGE_INTROTEXT="Front Page Category Page Intro text" +COM_REDSHOP_TOOLTIP_FRONTPAGE_CATEGORY_PAGE_INTROTEXT="Enter the text you want displayed on you category overview page" +COM_REDSHOP_TOOLTIP_PRODUCT_EXPIRE_LBL="Enter message you want to give when a product is discontinued" +COM_REDSHOP_TOOLTIP_PRODUCT_EXPIRE="Type in the box the message you want to show your customers when a product has been discontinued." +COM_REDSHOP_TOOLTIP_CATEGORY_DEFAULT_IMAGE_LBL="Category default image" +COM_REDSHOP_TOOLTIP_CATEGORY_DEFAULT_IMAGE="Upload your default category image." +COM_REDSHOP_PRODUCT_DEFAULT_IMAGE_LBL="Product Default Image" +COM_REDSHOP_TOOLTIP_PRODUCT_DEFAULT_IMAGE_LBL="Upload your default product image here." +COM_REDSHOP_TOOLTIP_WATERMARK_IMAGE_LBL="Watermark Image" +COM_REDSHOP_TOOLTIP_WATERMARK_IMAGE="Upload you watermark image here." +COM_REDSHOP_TOOLTIP_PRODUCT_OUTOFSTOCK_IMAGE_LBL="Product out of stock image" +COM_REDSHOP_TOOLTIP_PRODUCT_OUTOFSTOCK_IMAGE="Upload the image customers should see when a product is out of stock." +COM_REDSHOP_TOOLTIP_RETURN_TO_CATEGORY_PREFIX_LBL="Return To Category Prefix" +COM_REDSHOP_TOOLTIP_RETURN_TO_CATEGORY_PREFIX="Type the text that should be in front of the category name." +COM_REDSHOP_TOOLTIP_DAFULT_PREVIOUS_PREFIX_LBL="Prefix for Default text link to Previous" +COM_REDSHOP_TOOLTIP_DAFULT_PREVIOUS="Type text or graphic characters to be in front of name of previous product or category, typically <<" +COM_REDSHOP_TOOLTIP_DAFULT_NEXT_SUFFIX_LBL="Type text or graphic characters to be after name of next product or category, typically >>" +COM_REDSHOP_TOOLTIP_DAFULT_NEXT_SUFFIX="Type text or graphic characters to be after name of next product or category, typically >>" +COM_REDSHOP_TOOLTIP_CUSTOM_PREVIOUS_LINK_LBL="Tooltip Custom Previous Link" +COM_REDSHOP_TOOLTIP_CUSTOM_PREVIOUS_LINK="Type your own text for link to previous page" +COM_REDSHOP_TOOLTIP_CUSTOM_NEXT_LINK_LBL="Tooltip Custom Next Link" +COM_REDSHOP_TOOLTIP_CUSTOM_NEXT_LINK="Type your own text for link to next page" +COM_REDSHOP_TOOLTIP_IMAGE_PREVIOUS_LINK_LBL="Image Previous Link" +COM_REDSHOP_TOOLTIP_IMAGE_PREVIOUS_LINK="Upload your image for link to previous category page." +COM_REDSHOP_TOOLTIP_IMAGE_NEXT_LINK_LBL="Image Next Link" +COM_REDSHOP_TOOLTIP_IMAGE_NEXT_LINK="Upload your image for link to next category page." +COM_REDSHOP_TOOLTIP_DEFAULT_NP_LINK_LBL="Default Type of Link to Previous/Next" +COM_REDSHOP_TOOLTIP_DEFAULT_NP_LINK="Select if your links to next/previous pages should be default (category or product name with related prefix/suffix), custom (your own text) or image links" +COM_REDSHOP_TOOLTIP_ORDER_LISTS_INTRO_LBL="Order List Introtext:" +COM_REDSHOP_TOOLTIP_ORDER_DETAILS_INTRO_LBL="Order Details Introtext:" +COM_REDSHOP_TOOLTIP_ORDER_RECEIPT_INTRO_LBL="Enter text to be shown when order is received in the shop." +COM_REDSHOP_TOOLTIP_ORDER_RECEIPT_INTRO="Enter Order receipt page thank you text. Tag can be used in the Order receipt page -- {order_number} -- Order Number with thank you text" +COM_REDSHOP_TOOLTIP_PRE_ORDER_IMAGE_LBL="Pre-Order Image:" +COM_REDSHOP_TOOLTIP_PRE_ORDER_IMAGE="Pre-order image will replace add to cart image, when product is not in stock." +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_ORDERING_METHOD_LBL="Select default sorting of related products." +COM_REDSHOP_RELATED_PRODUCT_ORDERING_METHOD_LBL="Default sorting of related products" +COM_REDSHOP_RELATED_PRODUCT_DESC_MAX_CHARS_LBL="Related Product Description Max. Characters" +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_DESC_MAX_CHARS_LBL="Enter max. no of characters for your description of related products" +COM_REDSHOP_RELATED_PRODUCT_DESC_END_SUFFIX_LBL="Related Product Description Suffix" +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_DESC_END_SUFFIX_LBL="If your description of related products is too long, the end will be cut off and replaced with a suffix, e.g. […] Enter suffix of your choice" +COM_REDSHOP_RELATED_PRODUCT_SHORT_DESC_MAX_CHARS_LBL="Related Product Short Description Max Characters" +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_SHORT_DESC_MAX_CHARS_LBL="Enter max. no of characters for your short description of related products" +COM_REDSHOP_RELATED_PRODUCT_SHORT_DESC_END_SUFFIX_LBL="Related Product Short Description Suffix" +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_SHORT_DESC_END_SUFFIX_LBL="If your short description of related products is too long, the end will be cut off and replaced with your chosen suffix, e.g. [...] Enter suffix of your choice" +COM_REDSHOP_RELATED_PRODUCT_TITLE_MAX_CHARS_LBL="Related Product Title Max. Characters" +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_TITLE_MAX_CHARS_LBL="Enter max. no of characters for your product title for related products." +COM_REDSHOP_RELATED_PRODUCT_TITLE_END_SUFFIX_LBL="Related Product Title Suffix" +COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_TITLE_END_SUFFIX_LBL="If your title for a related product is too long, the end will be cut off and replaced with your chosen suffix, e.g. [...]. Enter suffix of your choice." +COM_REDSHOP_DEFAULT_PRODUCT_ORDERING_METHOD_LBL="Default sorting of products" +COM_REDSHOP_TOOLTIP_DEFAULT_PRODUCT_ORDERING_METHOD_LBL="Select how you want your products sorted." +COM_REDSHOP_DEFAULT_MANUFACTURER_ORDERING_METHOD_LBL="Default Sorting of Manufacturers" +COM_REDSHOP_TOOLTIP_DEFAULT_MANUFACTURER_ORDERING_METHOD_LBL="Select default sorting of manufacturers." +COM_REDSHOP_DEFAULT_MANUFACTURER_PRODUCT_ORDERING_METHOD_LBL="Default Sorting of Products in Manufacturer View" +COM_REDSHOP_TOOLTIP_DEFAULT_MANUFACTURER_PRODUCT_ORDERING_METHOD_LBL="Select default sorting of products in manufacturer view." +COM_REDSHOP_DEFAULT_ALLOWED_EXTENSION_TYPE_LBL="Legal Extensions (File Types)" +COM_REDSHOP_DEFAULT_ALLOWED_EXTENSION_TYPE_TOOLTIP="Add Extension which you want to allow to upload, add them by comma separated" +COM_REDSHOP_DEFAULT_IMAGE_QUALITY_LBL="Image Quality" +COM_REDSHOP_TOOLTIP_IMAGE_QUALITY_LBL="Select image quality." +COM_REDSHOP_TOOLTIP_MANUFACTURER_TITLE_MAX_CHARS="Max. Characters for Manufacturer Title" +COM_REDSHOP_TOOLTIP_MANUFACTURER_TITLE_MAX_CHARS_LBL="Characters for Manufacturer Title" +COM_REDSHOP_TOOLTIP_MANUFACTURER_TITLE_END_SUFFIX="Manufacturer Title Suffix" +COM_REDSHOP_TOOLTIP_MANUFACTURER_TITLE_END_SUFFIX_LBL="Enter maximal amount of characters for manufacturer Title." +COM_REDSHOP_CAT_IS_LIGHTBOX="Show category image in lightbox" +COM_REDSHOP_TOOLTIP_CAT_IS_LIGHTBOX="Do you want to show category image in lightbox?" +COM_REDSHOP_PRODUCT_ADDIMG_IS_LIGHTBOX_LBL="Show Additional Product Images in Lightbox" +COM_REDSHOP_TOOLTIP_PRODUCT_ADDIMG_IS_LIGHTBOX_LBL="Do you want to show additional product images in lightbox?" +COM_REDSHOP_PRODUCT_IS_LIGHTBOX_LBL="Show Product Images in Lightbox" +COM_REDSHOP_TOOLTIP_PRODUCT_IS_LIGHTBOX="Do you want to show product images in lightbox?" +COM_REDSHOP_PRODUCT_DETAIL_IS_LIGHTBOX_LBL="Show Product Detail Image in Lightbox" +COM_REDSHOP_TOOLTIP_PRODUCT_DETAIL_IS_LIGHTBOX="Show image in lightbox" +COM_REDSHOP_USE_PRODUCT_RESERVE_LBL="Enable Product Reserve" +COM_REDSHOP_TOOLTIP_USE_PRODUCT_RESERVE_LBL="Do you want to allow Product Reserve" +COM_REDSHOP_USE_PRODUCT_OUTOFSTOCK_IMAGE_LBL="Use Out of Stock Image" +COM_REDSHOP_TOOLTIP_USE_PRODUCT_OUTOFSTOCK_IMAGE="Do you want to enable out of stock image?" +COM_REDSHOP_TOOLTIP_COUPON_INFO_LBL="Select if registered users should be able to see their coupons on My Page" +COM_REDSHOP_COUPON_INFO_LBL="Enable Coupon Information" +COM_REDSHOP_MY_TAGS_LBL="Enable Customer Tagging" +COM_REDSHOP_TOOLTIP_MY_TAGS="Select if registered users should be able to tag products" +COM_REDSHOP_MY_WISHLIST_LBL="Enable Wish List" +COM_REDSHOP_TOOLTIP_MY_WISHLIST="Select if registered users should be able to create a wish list." +COM_REDSHOP_COMPARE_PRODUCTS_LBL="Enable Product Comparison" +COM_REDSHOP_TOOLTIP_COMPARE_PRODUCTS="Select if you want to enable product comparison." +COM_REDSHOP_TOOLTIP_DISPLAY_NEW_CUSTOMERS_LBL="Display New Customers" +COM_REDSHOP_TOOLTIP_DISPLAY_NEW_CUSTOMERS="Do you want to display new customers?" +COM_REDSHOP_TOOLTIP_DISPLAY_ORDERS_LBL="Display Orders" +COM_REDSHOP_TOOLTIP_DISPLAY_ORDERS="Do you want to display orders?" +COM_REDSHOP_STATISTICS_ENABLE_TEXT="Enable Statistics" +COM_REDSHOP_TOOLTIP_STATISTICS_ENABLE="Do you want to enable redSHOP Statistics for site viewer and page viewer?" +COM_REDSHOP_NEWSLETTER_ENABLE_TEXT="Enable Newsletter" +COM_REDSHOP_TOOLTIP_NEWSLETTER_ENABLE="Do you want to enable the sending of newsletters?" +COM_REDSHOP_NEWSLETTER_CONFIRMATION_LBL="Newsletter Confirmation" +COM_REDSHOP_TOOLTIP_NEWSLETTER_CONFIRMATION_LBL="Do you want your customers to receive an email containing a link for sign up confirmation?" +COM_REDSHOP_NEWS_FROM_NAME="Newsletter sender name" +COM_REDSHOP_TOOLTIP_NEWS_FROM_NAME="Select who should be shown as sender of your newsletters." +COM_REDSHOP_NEWS_MAIL_FROM="Mail From" +COM_REDSHOP_TOOLTIP_NEWS_MAIL_FROM="Select which email address should be shown as sender address for your newsletters." +COM_REDSHOP_DEFAULT_NEWSLETTER="Default Newsletter" +COM_REDSHOP_TOOLTIP_DEFAULT_NEWSLETTER="Select which newsletter form you want to use as default." +COM_REDSHOP_NEWSLETTER_TESTING_EMAIL_LBL="Test mail" +COM_REDSHOP_TOOLTIP_NEWSLETTER_TESTING_EMAIL_LBL="Enter email address for receiving test emails." +COM_REDSHOP_NEWSLETTER_TEST_LBL="Test Newsletter" +COM_REDSHOP_TOOLTIP_NEWSLETTER_TEST_LBL="Enter email address for receiving test emails." +COM_REDSHOP_POST_DK_INTEGRATION_LBL="Integration With Pacsoft" +COM_REDSHOP_TOOLTIP_POST_DK_INTEGRATION_LBL="Do you want to activate Pacsoft integration?" +COM_REDSHOP_POST_DK_CUSTOMER_ID_LBL="Pacsoft customer ID" +COM_REDSHOP_TOOLTIP_POST_DK_CUSTOMER_ID_LBL="Enter your Pacsoft customer ID." +COM_REDSHOP_POST_DK_PASSWORD_LBL="Pacsoft Password" +COM_REDSHOP_TOOLTIP_POST_DK_PASSWORD_LBL="Enter you Pacsoft password." +COM_REDSHOP_POSTDANMARK_ADDRESS_LBL="Pacsoft sender address" +COM_REDSHOP_TOOLTIP_POSTDANMARK_ADDRESS_LBL="Enter your Pacsoft sender address." +COM_REDSHOP_POSTDANMARK_POSTALCODE_LBL="Pacsoft Sender Postal Code" +COM_REDSHOP_TOOLTIP_POSTDANMARK_POSTALCODE_LBL="Enter your Pacsoft postal code." +COM_REDSHOP_POSTDANMARK_AUTO_GENERATE_LABEL_LBL="Generate PackSoft Label" +COM_REDSHOP_POSTDANMARK_AUTO_GENERATE_LABEL_TOOLTIP="Generate PackSoft Label" +COM_REDSHOP_POSTDANMARK_AUTO_GENERATE_LABEL_TOOLTIP_DESC="Select your choice for generating PackSoft label." +COM_REDSHOP_POSTDANMARK_GENERATE_LABEL_MANUALLY="Generate Parcel Manually from Order Listing Page" +COM_REDSHOP_POSTDANMARK_AUTO_GENERATE_LABEL="Generate Parcel Automatically on Selected Status" +COM_REDSHOP_TOOLTIP_CURRENCY_NAME="Select the default currency your shop will operate with." +COM_REDSHOP_CURRENCY_SYMBOL="Currency Symbol" +COM_REDSHOP_TOOLTIP_CURRENCY_SYMBOL="Enter symbol for your default shop currency." +COM_REDSHOP_CURRENCY_SYMBOL_POSITION_LBL="Currency Symbol Position" +COM_REDSHOP_TOOLTIP_CURRENCY_SYMBOL_POSITION="Select if you want your currency symbol to be displayed before or after the price or not at all. Front = £1.00 Behind = £1.00 None = 1.00" +COM_REDSHOP_PRICE_SEPERATOR_LBL="Decimal Separator" +COM_REDSHOP_TOOLTIP_PRICE_SEPERATOR_LBL="Enter the punctuation mark, you want to separate integers from decimals, e.g. comma for a shop in EU or period for a shop in US." +COM_REDSHOP_THOUSAND_SEPERATOR_LBL="Thousand Separator" +COM_REDSHOP_TOOLTIP_THOUSAND_SEPERATOR_LBL="Enter your thousand separator, e. g. period for a shop in EU, comma for a shop in US." +COM_REDSHOP_PRICE_DECIMAL_LBL="Number of Price Decimals" +COM_REDSHOP_TOOLTIP_PRICE_DECIMAL_LBL="Enter how many decimals you want displayed in prices." +COM_REDSHOP_USE_TAX_EXEMPT_LBL="Use Tax Exempt" +COM_REDSHOP_TOOLTIP_USE_TAX_EXEMPT_LBL="Select if you want to enable tax exempt." +COM_REDSHOP_SHOW_TAX_EXEMPT_INFRONT_LBL="Show Tax Exempt in Front" +COM_REDSHOP_TOOLTIP_SHOW_TAX_EXEMPT_INFRONT_LBL="Do you want to show tax exempt in front?" +COM_REDSHOP_TOOLTIP_TAX_EXEMPT_APPLY_VAT="Apply VAT for Tax Exempt" +COM_REDSHOP_TOOLTIP_TAX_EXEMPT_APPLY_VAT_LBL="Select if you want VAT to be added to the price given to your tax exempt customers." +COM_REDSHOP_TOOLTIP_USE_AS_CATALOG="Remove Add to Cart from front" +COM_REDSHOP_TOOLTIP_USE_AS_CATALOG_LBL="If you select yes, your products will be displayed as usual, but without add to cart button. Your customers will be able to browse your shop, but they can't purchase online." +COM_REDSHOP_SHOW_PRICE_LBL="Show Price" +COM_REDSHOP_TOOLTIP_SHOW_PRICE_LBL="Select if you want prices to be shown on your page." +COM_REDSHOP_TOOLTIP_SHOW_PRICE_SHOPPER_GROUP_LBL="Mark the user and/or shopper groups who should see prices. Only marked groups will be able to see prices." +COM_REDSHOP_DISCOUPON_TAB="Discount Coupon" +COM_REDSHOP_RATING_DONE_MSG="Rating/Review completed message" +COM_REDSHOP_TOOLTIP_RATING_DONE_MSG="This message would show after user completed rating or review an product." +COM_REDSHOP_FAVOURED_REVIEWS_LBL="Number of favoured reviews" +COM_REDSHOP_TOOLTIP_FAVOURED_REVIEWS_LBL="A number of reviews can be favoured so they will always be in top. If limit is passed, newest will be displayed. Select how many reviews can be favoured." +COM_REDSHOP_PRODUCT_COMPARE_LIMIT_LBL="Max. No. of Products to Compare" +COM_REDSHOP_TOOLTIP_PRODUCT_COMPARE_LIMIT_LBL="Select your limit for how many products can be compared at once." +COM_REDSHOP_COMPARE_PRODUCT_TEMPLATE_LBL="Product Comparison Template" +COM_REDSHOP_TOOLTIP_COMPARE_PRODUCT_TEMPLATE="Choose template to render compare product layout" +COM_REDSHOP_PRODUCT_COMPARISON_TYPE_LBL="Comparison can be done" +COM_REDSHOP_TOOLTIP_PRODUCT_COMPARISON_TYPE_LBL="Select if products can only be compared with other products from the same category, or if you want to allow comparison across categories (globally)." +COM_REDSHOP_NOOF_THUMB_FOR_SCROLLER_LBL="No. of thumbs in attribute scroller" +COM_REDSHOP_TOOLTIP_NOOF_THUMB_FOR_SCROLLER_LBL="You can display your attribute thumbs in a scroller on the product page. Set the number of thumbs here." +COM_REDSHOP_TOOLTIP_NOOF_SUBATTRIB_THUMB_FOR_SCROLLER_LBL="Enter No. of thumbs in sub-attribute scroller" +COM_REDSHOP_TOOLTIP_NOOF_SUBATTRIB_THUMB_FOR_SCROLLER="You can have your sub-attribute thumbs displayed in a scroller on product page. Set the number of thumbs here." +COM_REDSHOP_PRODUCT_DOWNLOAD_LIMIT_LBL="Maximal number of downloads" +COM_REDSHOP_PRODUCT_DOWNLOAD_DAYS_LBL="Download Period in Days" +COM_REDSHOP_TOOLTIP_PRODUCT_DOWNLOAD_DAYS_LBL="Enter how many days after purchase or registration your customer can download." +COM_REDSHOP_MAXCATEGORY_LBL="No. of Categories per page" +COM_REDSHOP_TOOLTIP_MAXCATEGORY_LBL="Enter no. of categories to be displayed at category front page (category overview)." +COM_REDSHOP_DEFAULT_PRODUCT_TEMPLATE_LBL="Default Product template" +COM_REDSHOP_TOOLTIP_DEFAULT_PRODUCT_TEMPLATE_FOR_VM_LBL="Select default product template." +COM_REDSHOP_DEFAULT_CATEGORY_TEMPLATE_LBL="Default Category Template" +COM_REDSHOP_TOOLTIP_DEFAULT_CATEGORY_TEMPLATE_FOR_VM_LBL="Select default category template." +COM_REDSHOP_DEFAULT_CATEGORYLIST_TEMPLATE_LBL="Main Category List Template" +COM_REDSHOP_TOOLTIP_DEFAULT_CATEGORY_TEMPLATELIST_LBL="Select which template to use for the page that shows an overview of all categories. If none is selected, the oldest template will be shown by default." +COM_REDSHOP_TWOWAY_RELATED_PRODUCT_LBL="Two-way related product" +COM_REDSHOP_TOOLTIP_TWOWAY_RELATED_PRODUCT_LBL="Select if related products should automatically have the main product added as related product on their own product page" +COM_REDSHOP_PRODUCT_DOWNLOAD_ROOT_LBL="Download Products root" +COM_REDSHOP_PRODUCT_DOWNLOAD_ROOT_WARNING="For security reason it is most recommended to store downloadable products in outside of website root folder. Typically, outside of public_html or www folder.

    For Example Linux Servers:
    /home/<user>/download/product/
    or
    /var/download/product/" +COM_REDSHOP_TOOLTIP_PRODUCT_DOWNLOAD_ROOT_LBL="This is the folder where your products for download will be stored. Only change this if you are an advanced user." +COM_REDSHOP_ENABLE_MANUFACTURER_EMAIL_LBL="Enable Manufacturer e-mail" +COM_REDSHOP_TOOLTIP_ENABLE_MANUFACTURER_EMAIL_LBL="Do you want manufacturers to receive an email, when one of their products is sold?" +COM_REDSHOP_ENABLE_SUPPLIER_EMAIL_LBL="Enable Supplier Email" +COM_REDSHOP_TOOLTIP_ENABLE_SUPPLIER_EMAIL_LBL="Do you want suppliers to receive an email, when one of their products is sold in your shop?" +COM_REDSHOP_DEFAULT_MANUFACTURER_TEMPLATE_LBL="Default Manufacturer Template" +COM_REDSHOP_TOOLTIP_DEFAULT_MANUFACTURER_TEMPLATE_FOR_VM_LBL="Manufacturer Template for VM importing" +COM_REDSHOP_SAVE_USER_INFORMATION="Apply user" +COM_REDSHOP_UNIT="Unit" +COM_REDSHOP_CHECK="Check" +COM_REDSHOP_RESULT="Result" +COM_REDSHOP_NOT_INSTALLED="Not installed" +COM_REDSHOP_INSTALLED="Installed" +COM_REDSHOP_REDSHOP_VERSION="redSHOP Version" +COM_REDSHOP_SYSTEM_INFORMATION="System Information" +COM_REDSHOP_REDSHOP_MODULES="redSHOP Modules" +COM_REDSHOP_REDSHOP_PAYMENT_PLUGINS="redSHOP Payment Plugins" +COM_REDSHOP_REDSHOP_SHIPPING_PLUGINS="redSHOP Shipping Plugins" +COM_REDSHOP_REGISTER_METHOD_LBL="Registration Method" +COM_REDSHOP_TOOLTIP_REGISTER_METHOD_LBL="Select if the account should be created on checkout. On normal account creation, the customer chooses a username and password.

    " +COM_REDSHOP_TOOLTIP_SHOW_REGISTER_EMAIL_VERIFICATION="Select if your customers should verify email by writing it once more." +COM_REDSHOP_NEW_CUSTOMER_SELECTION_LBL="New customer preselected" +COM_REDSHOP_TOOLTIP_NEW_CUSTOMER_SELECTION_LBL="Select if new customer (yes) or returning customer (no) should be preselected on checkout." +COM_REDSHOP_REQUIRED_VAT_NUMBER_LBL="Required VAT Number" +COM_REDSHOP_TOOLTIP_REQUIRED_VAT_NUMBER_LBL="Select Required VAT number" +COM_REDSHOP_TERMS_AND_CONDITIONS_LBL="Terms And Conditions" +COM_REDSHOP_TOOLTIP_TERMS_AND_CONDITIONS_LBL="Terms and conditions should be written in a normal Joomla article, and the title of the article should be indicated here." +COM_REDSHOP_SELECT_AN_ARTICLE="Select An Article" +COM_REDSHOP_ALLOW_CUSTOMER_REGISTRATION_TYPE_LBL="Who Can Register" +COM_REDSHOP_TOOLTIP_ALLOW_CUSTOMER_REGISTRATION_TYPE_LBL="Select if you will allow registration of private customers only, company customer only, or both." +COM_REDSHOP_DEFAULT_CUSTOMER_REGISTRATION_TYPE_LBL="Default Customer Type" +COM_REDSHOP_TOOLTIP_DEFAULT_CUSTOMER_REGISTRATION_TYPE_LBL="Select if one type of customer should be preselected on registration page." +COM_REDSHOP_WELCOMEPAGE_INTROTEXT_LBL="My Page Welcome Text" +COM_REDSHOP_TOOLTIP_WELCOMEPAGE_INTROTEXT_LBL="Enter the text you want your customers to see on their account page when logged in." +COM_REDSHOP_REGISTRATION_PAGE_INTRO_LBL="Intro text for Private Customer" +COM_REDSHOP_TOOLTIP_REGISTRATION_PAGE_INTRO_LBL="Type the text you want your private customers to see after registration." +COM_REDSHOP_REGISTRATION_PAGE_COMP_INTRO_LBL="Intro text for Company Customers" +COM_REDSHOP_TOOLTIP_REGISTRATION_PAGE_COMP_INTRO_LBL="Type the text you want your company customer to see after registration." +COM_REDSHOP_RESET_TEMPLATE_DESC="If you want to reset all templates then press go then ok. This will reset all your template..." +COM_REDSHOP_SEO_GENERAL_TAB="General" +COM_REDSHOP_SEO_CATEGORY_TAB="Category" +COM_REDSHOP_SEO_PRODUCT_TAB="Products" +COM_REDSHOP_SEO_MANUFACTURER_TAB="Manufacturer" +COM_REDSHOP_SEO_PAGE_TITLE_CATEGORY_LBL="SEO Page Titles" +COM_REDSHOP_TOOLTIP_SEO_PAGE_TITLE_CATEGORY_LBL="Indicate how you want your Category page titles to be generated." +COM_REDSHOP_SEO_PAGE_HEADING_CATEGORY_LBL="SEO Page Headings" +COM_REDSHOP_TOOLTIP_SEO_PAGE_HEADING_CATEGORY_LBL="Indicate how you want your Category page headings to be generated." +COM_REDSHOP_SEO_PAGE_DESCRIPTION_CATEGORY_LBL="SEO Page Descriptions" +COM_REDSHOP_TOOLTIP_SEO_PAGE_DESCRIPTION_CATEGORY_LBL="Indicate how you want your Category page descriptions to be generated." +COM_REDSHOP_SEO_PAGE_KEYWORDS_CATEGORY_LBL="SEO Keywords" +COM_REDSHOP_TOOLTIP_SEO_PAGE_KEYWORDS_CATEGORY_LBL="Indicate how you want your Category page keywords to be generated." +COM_REDSHOP_ENABLE_SEF_PRODUCT_NUMBER_LBL="Enable SEF Product Numbers" +COM_REDSHOP_TOOLTIP_ENABLE_SEF_PRODUCT_NUMBER_LBL="Select if you want to allow generation of search engine friendly product numbers." +COM_REDSHOP_TOOLTIP_ENABLE_SEF_NUMBER_NAME_LBL="Select if Joomla! SEF URLs should be generated by name or number." +COM_REDSHOP_AUTOGENERATED_SEO_LBL="Auto generated Meta Data" +COM_REDSHOP_TOOLTIP_AUTOGENERATED_SEO_LBL="Do you want meta data to be generated automatically?" +COM_REDSHOP_SEO_PAGE_LANGAUGE_LBL="SEO Language" +COM_REDSHOP_TOOLTIP_SEO_PAGE_LANGAUGE="Keep English as your SEO language or replace with your preferred language. Note that you can only use one language." +COM_REDSHOP_TOOLTIP_CATEGORY_IN_SEF_URL_LBL="Select 'Yes' if you want the product category to appear in the url of the product." +COM_REDSHOP_CATEGORY_TREE_IN_SEF_URL="Display Category Reverse Tree in SEF Url" +COM_REDSHOP_TOOLTIP_CATEGORY_TREE_IN_SEF_URL_HEAD="Display Category Reverse Tree in SEF Url" +COM_REDSHOP_TOOLTIP_CATEGORY_TREE_IN_SEF_URL_LBL="Select 'Yes' if you want to display category tree in sef url for product and category" +COM_REDSHOP_CATEGORY_IN_SEF_URL="Category in SEF URL" +COM_REDSHOP_SEO_PAGE_TITLE_MANUFACTUR_LBL="SEO Page Titles" +COM_REDSHOP_TOOLTIP_SEO_PAGE_TITLE_MANUFACTUR_LBL="Indicate how you want your manufacturer page titles to be generated." +COM_REDSHOP_TOOLTIP_SEO_PAGE_HEADING_MANUFACTUR="Indicate how you want your manufacturer page headings to be generated." +COM_REDSHOP_TOOLTIP_SEO_PAGE_HEADING_MANUFACTUR_LBL="SEO Page Headings" +COM_REDSHOP_SEO_PAGE_HEADING_MANUFACTUR_LBL="SEO Page Headings" +COM_REDSHOP_SEO_PAGE_DESCRIPTION_MANUFACTUR_LBL="SEO Page Descriptions" +COM_REDSHOP_TOOLTIP_SEO_PAGE_DESCRIPTION_MANUFACTUR_LBL="Indicate how you want your manufacturer page descriptions to be generated." +COM_REDSHOP_SEO_PAGE_KEYWORDS_MANUFACTUR_LBL="SEO Keywords" +COM_REDSHOP_TOOLTIP_SEO_PAGE_KEYWORDS_MANUFACTUR_LBL="Indicate how you want your manufacturer page keywords to be generated." +COM_REDSHOP_SEO_PAGE_TITLE_LBL="SEO Page Titles" +COM_REDSHOP_TOOLTIP_SEO_PAGE_TITLE="Indicate how you want your Product page titles to be generated." +COM_REDSHOP_SEO_PAGE_HEADING_LBL="SEO Page Headings" +COM_REDSHOP_TOOLTIP_SEO_PAGE_HEADING_LBL="Indicate how you want your Product page headings to be generated." +COM_REDSHOP_SEO_PAGE_DESCRIPTION_LBL="SEO Page Descriptions" +COM_REDSHOP_TOOLTIP_SEO_PAGE_DESCRIPTION="Indicate how you want your product page descriptions to be generated." +COM_REDSHOP_SEO_PAGE_KEYWORDS_LBL="SEO Keywords" +COM_REDSHOP_TOOLTIP_SEO_PAGE_KEYWORDS="SEO Page Keywords" +COM_REDSHOP_TOOLTIP_ADMINISTRATOR_EMAIL_LBL="Enter email address of your store administrator. If more than one, separate with comma." +COM_REDSHOP_ADMINISTRATOR_EMAIL_LBL="Administrator Email" +COM_REDSHOP_TABLE_PREFIX="Table prefix" +COM_REDSHOP_TOOLTIP_TABLE_PREFIX="Table prefix is used for naming specific tables in your database. Changing table prefix can cause trouble and is only relevant for few, very advanced users." +COM_REDSHOP_SHOP_COUNTRY="Shop Country" +COM_REDSHOP_TOOLTIP_SHOP_COUNTRY="Select the country in which your country is located." +COM_REDSHOP_DEFAULT_SHIPPING_COUNTRY_LBL="Default Shipping Country" +COM_REDSHOP_TOOLTIP_DEFAULT_SHIPPING_COUNTRY_LBL="Select the country which you ship to by default." +COM_REDSHOP_WELCOME_MESSAGE="Welcome Message" +COM_REDSHOP_TOOLTIP_WELCOME_MESSAGE="This is the message that will show up if you make a link directly to the redSHOP component, and there is no content." +COM_REDSHOP_SHOP_NAME_LBL="Shop Name" +COM_REDSHOP_TOOLTIP_SHOP_NAME_LBL="Enter the name of your shop." +COM_REDSHOP_DEFAULT_DATEFORMAT_LBL="Date Format" +COM_REDSHOP_TOOLTIP_DEFAULT_DATEFORMAT_LBL="Select how you want dates to be shown." +COM_REDSHOP_COUNTRY_LIST_LBL="Retail Countries" +COM_REDSHOP_TOOLTIP_COUNTRY_LIST_LBL="Select the countries you want to sell and ship to. Hold down the CTRL key to select more than one." +COM_REDSHOP_INVOICE_MAIL_ENABLE_LBL="Enable Invoice Email" +COM_REDSHOP_TOOLTIP_INVOICE_MAIL_ENABLE="When enabled, invoice mail is sent. Note that all customers will by default receive a mail when order is registered." +COM_REDSHOP_INVOICE_MAIL_SEND_OPTION_LBL="Send Invoice Mail to" +COM_REDSHOP_TOOLTIP_INVOICE_MAIL_SEND_OPTION="Select whether invoice mail has to be sent to the customer only, shop administrator only or both." +COM_REDSHOP_TOOLTIP_PORTAL_SHOP="Tooltip Portal Shop" +COM_REDSHOP_TOOLTIP_PORTAL_SHOP_LBL="Select if you want to have a portal shop. A portal shop can only be seen by registered customers." +COM_REDSHOP_TOOLTIP_URL_AFTER_PORTAL_LOGIN_LBL="Tooltip Url After Portal Login" +COM_REDSHOP_TOOLTIP_URL_AFTER_PORTAL_LOGIN="Select the page your customers should see right after logging in to your portal shop." +COM_REDSHOP_TOOLTIP_URL_AFTER_PORTAL_LOGOUT_LBL="Tooltip Url After Portal Logout" +COM_REDSHOP_TOOLTIP_URL_AFTER_PORTAL_LOGOUT="Select which page your customers should see right after logging out from your portal shop." +COM_REDSHOP_TOOLTIP_DEFAULT_PORTAL_NAME_LBL="Tooltip Default Portal Name" +COM_REDSHOP_TOOLTIP_DEFAULT_PORTAL_NAME="Type the text you want to appear just above the login field. Max 255 characters." +COM_REDSHOP_TOOLTIP_DEFAULT_PORTAL_LOGO="Tooltip Default Portal Logo" +COM_REDSHOP_TOOLTIP_DEFAULT_PORTAL_LOGO_LBL="If you want a special logo for your portal shop, upload here. It will be displayed above your portal name." +COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_DEFAULT_PRIVATE="Tooltip Shopper Group Default Private" +COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_DEFAULT_PRIVATE_LBL="Select which shopper group should be default private shopper group." +COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_DEFAULT_COMPANY="Tooltip Shopper Group Default Company" +COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_DEFAULT_COMPANY_LBL="Select which shopper group should be default company shopper group." +COM_REDSHOP_SHOPPER_GROUP_DEFAULT_UNREGISTERED_LBL="Select Shopper Group for Unregistered Users" +COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_DEFAULT_UNREGISTERED_LBL="Select Shopper Group for Unregistered Users" +COM_REDSHOP_NEW_SHOPPER_GROUP_GET_VALUE_FROM_LBL="A New Shopper Group will inherit value from" +COM_REDSHOP_TOOLTIP_NEW_SHOPPER_GROUP_GET_VALUE_FROM_LBL="This function saves you time, since you can just copy an existing shopper group and change few values." +COM_REDSHOP_TOOLTIP_SHOW_LAST_MONTH_STATISTIC_LBL="Show Statistics for Latest Month" +COM_REDSHOP_TOOLTIP_SHOW_LAST_MONTH_STATISTIC="Do you want to Show Statistics for Latest Month?" +COM_REDSHOP_WEB_SERVER="Web Server" +COM_REDSHOP_PHP_VERSION="PHP version" +COM_REDSHOP_MYSQL_VERSION="MYSQL Version" +COM_REDSHOP_GD_IMAGE_LIBRARY="GD Image Library" +COM_REDSHOP_DISABLED="Disabled" +COM_REDSHOP_MULTIBYTE_STRING_SUPPORT="Multi-byte string support" +COM_REDSHOP_ENABLED="Enabled" +COM_REDSHOP_UPLOAD_LIMIT="Upload Limit" +COM_REDSHOP_MEMORY_LIMIT="Memory Limit" +COM_REDSHOP_OPEN_REMOTE_FILES="Open Remote Files (allow_url_fopen)" +COM_REDSHOP_EXECUTION_TIME="Execution Time" +COM_REDSHOP_TOOLTIP_DEFAULT_VOLUME_UNIT_LBL="Select default length unit." +COM_REDSHOP_DEFAULT_VOLUME_UNIT_LBL="Default volume unit" +COM_REDSHOP_TOOLTIP_DEFAULT_WEIGHT_UNIT_LBL="Select default weight unit" +COM_REDSHOP_DEFAULT_WEIGHT_UNIT_LBL="Default weight unit" +COM_REDSHOP_TOOLTIP_UNIT_DECIMAL_LBL="How many decimals do you want displayed in measures?" +COM_REDSHOP_REGISTRATION="Registration" +COM_REDSHOP_SHOPPER_GROUP_TAB="Shopper Groups" +COM_REDSHOP_DEFAULT_VAT_COUNTRY_LBL="Default Country" +COM_REDSHOP_TOOLTIP_DEFAULT_VAT_COUNTRY="Select the country in which your shop is registered." +COM_REDSHOP_DEFAULT_VAT_STATE_LBL="Default State" +COM_REDSHOP_TOOLTIP_DEFAULT_VAT_STATE="Select a default state if relevant." +COM_REDSHOP_DEFAULT_VAT_GROUP_LBL="Default VAT Group" +COM_REDSHOP_TOOLTIP_DEFAULT_VAT_GROUP="Select your default VAT group." +COM_REDSHOP_DEFAULT_VAT_CALCULATION_BASED_LBL="Default VAT Calculation based on" +COM_REDSHOP_TOOLTIP_DEFAULT_VAT_CALCULATION_BASED="Select if VAT per default should be calculated based on shop address, customer address, or based on specific EU rules." +COM_REDSHOP_APPLY_VAT_ON_DISCOUNT_LBL="Apply VAT on Discount" +COM_REDSHOP_TOOLTIP_APPLY_VAT_ON_DISCOUNT="If no, discount will be calculated on product price(excl VAT). If yes, discount will be calculated on product price (incl. VAT)." +COM_REDSHOP_CALCULATE_VAT_BASED_ON_LBL="Calculation based on" +COM_REDSHOP_TOOLTIP_CALCULATE_VAT_BASED_ON_LBL="Select if VAT calculated on shipping address or billing address." +COM_REDSHOP_VAT_INTRO_LBL="VAT introtext" +COM_REDSHOP_TOOLTIP_VAT_INTRO_LBL="This is a text on VAT rules." +COM_REDSHOP_TOOLTIP_WITH_VAT_TEXT_INFO_LBL="This introtext is for customers not paying VAT" +COM_REDSHOP_TOOLTIP_WITH_VAT_TEXT_INFO="With Vat Text Info" +COM_REDSHOP_TOOLTIP_WITHOUT_VAT_TEXT_INFO_LBL="This introtext is for customers paying VAT" +COM_REDSHOP_TOOLTIP_WITHOUT_VAT_TEXT_INFO="Without Vat Text Info" +COM_REDSHOP_TOOLTIP_DEFAULT_WRAPPER_THUMB_WIDTH_LBL="Enter wrapping thumb width/height with." +COM_REDSHOP_TOOLTIP_DEFAULT_WRAPPER_THUMB_WIDTH="Enter default wrapping image width/height width" +COM_REDSHOP_TOOLTIP_AUTO_SCROLL_FOR_WRAPPER_LBL="Select Auto Scroll For Wrapping" +COM_REDSHOP_TOOLTIP_AUTO_SCROLL_FOR_WRAPPER="Do you want your wrapping thumbs to auto scroll?" +COM_REDSHOP_TOTAL="Total" +COM_REDSHOP_PERCENTAGE="Percentage" +COM_REDSHOP_GLOBAL="Globally" +COM_REDSHOP_PRIVATE="Private customer" +COM_REDSHOP_COMPANY="Company customer" +COM_REDSHOP_DIRECT_TO_CART="Directly to cart" +COM_REDSHOP_STAY_ON_CURRENT_VIEW="Back to current view" +COM_REDSHOP_BOTH="Both" +COM_REDSHOP_WEBSHOP_MODE="Webshop" +COM_REDSHOP_CUSTOMER_MODE="Customer" +COM_REDSHOP_EU_MODE="EU-mode" +COM_REDSHOP_REGISTER_WITH_ACCOUNT_CREATION="Normal account creation" +COM_REDSHOP_REGISTER_WITHOUT_ACCOUNT_CREATION="Without account creation" +COM_REDSHOP_REGISTER_ACCOUNT_OPTIONAL="Optional account creation" +COM_REDSHOP_REGISTER_ACCOUNT_SILENT="Silent account creation" +COM_REDSHOP_INDIVIDUAL_ADD_TO_CART_PER_PROPERTY="Add to cart per attribute" +COM_REDSHOP_ADD_TO_CART_PER_PRODUCT="Add to cart per product" +COM_REDSHOP_DEFAULT_LINK="Default Link" +COM_REDSHOP_CUSTOM_LINK="Custom Link" +COM_REDSHOP_SUBTOTAL_LBL="Subtotal" +COM_REDSHOP_BILLING_ADDRESS_LBL="Billing address" +COM_REDSHOP_SHIPPING_ADDRESS_LBL="Shipping address" +COM_REDSHOP_NEWEST="Newest" +COM_REDSHOP_ORDERING="Order" +COM_REDSHOP_FRONT="Front" +COM_REDSHOP_BEHIND="Behind" +COM_REDSHOP_ADMINISTRATOR="Administrator" +COM_REDSHOP_CUSTOMER="Customer" +COM_REDSHOP_DISCOUNT_OR_VOUCHER_OR_COUPON="Discount/voucher/coupon" +COM_REDSHOP_DISCOUNT_VOUCHER_OR_COUPON="Discount + voucher/coupon" +COM_REDSHOP_DISCOUNT_VOUCHER_COUPON="Discount + voucher (single) + coupon (single)" +COM_REDSHOP_DISCOUNT_VOUCHER_COUPON_MULTIPLE="Discount + voucher (multiple) + coupon (multiple)" +COM_REDSHOP_INCHES="Inches" +COM_REDSHOP_CENTIMETERS="Centimetres" +COM_REDSHOP_FEET="Feet" +COM_REDSHOP_METER="Meter" +COM_REDSHOP_POUNDS="Pounds" +COM_REDSHOP_GRAM="Grams" +COM_REDSHOP_KG="Kg." +COM_REDSHOP_LITER="Litre" +COM_REDSHOP_MILLILITER="Millilitre" +COM_REDSHOP_TOOLTIP_MINIMUM_DELIVERY_TIME="Enter minimum delivery time." +COM_REDSHOP_MAXIMUM_DELIVERY_TIME="Maximum Delivery Time" +COM_REDSHOP_TOOLTIP_MAXIMUM_DELIVERY_TIME="Enter maximum delivery time." +COM_REDSHOP_PRODUCT_QUANTITY="Product Quantity" +COM_REDSHOP_PRODUCT_VOLUME_UNIT="Product Volume Unit" +COM_REDSHOP_COUNTRY_NAME="Country Name" +COM_REDSHOP_COUNTRY_NAME_DESCRIPTION="Enter name of country." +COM_REDSHOP_COUNTRY_3_CODE="3-Digit Code" +COM_REDSHOP_COUNTRY_3_CODE_DESCRIPTION="Enter 3-Digit code of this country." +COM_REDSHOP_COUNTRY_2_CODE="2-Digit Code" +COM_REDSHOP_COUNTRY_2_CODE_DESCRIPTION="Enter 2-Digit code of this country." +COM_REDSHOP_COUNTRY_JTEXT="Description" +COM_REDSHOP_COUNTRY_JTEXT_DESCRIPTION="Enter description for this country." +COM_REDSHOP_EDIT_COUNTRY="Edit Country" +COM_REDSHOP_COUNTRY_MANAGEMENT="Country Management" +COM_REDSHOP_COUPON_FILTER="Filter by Coupon Code" +COM_REDSHOP_USER_SPECIFIC="User Specific" +COM_REDSHOP_TOOLTIP_COUPON_USER="Select User" +COM_REDSHOP_FREE_SHIPPING="Free Shipping" +COM_REDSHOP_TOOLTIP_COUPON_LEFT="Coupons Left" +COM_REDSHOP_COUPON_MANAGEMENT_DETAIL="Coupon Management Detail" +COM_REDSHOP_EDIT_CURRENCY="Edit Currency" +COM_REDSHOP_CURRENCY_MANAGEMENT="Currency Management" +COM_REDSHOP_PRODUCT_VOLUME="Product Volume" +COM_REDSHOP_EDIT_DISCOUNT="Edit discount" +COM_REDSHOP_LOWER="Lower" +COM_REDSHOP_HIGHER="Higher" +COM_REDSHOP_DISCOUNT_MANAGEMENT="Product Discount Management" +COM_REDSHOP_TOOLTIP_AMOUNT="Enter Amount" +COM_REDSHOP_CONDITION="Condition" +COM_REDSHOP_TOOLTIP_CONDITION="Set how the value should match the order total" +COM_REDSHOP_PRODUCT_AMOUNT="Product Price" +COM_REDSHOP_PRODUCT_PRICE_MANAGEMENT="Product Price Management" +COM_REDSHOP_DISCOUNT_MANAGEMENT_DETAIL="Discount Management Detail" +COM_REDSHOP_EXPORT_CATEGORIES="Export Categories" +COM_REDSHOP_EXPORT_PRODUCTS="Export Products" +COM_REDSHOP_PRODUCT_CATEGORY="Product Category" +COM_REDSHOP_PRODUCT_MANUFACTURER="Product Manufacturer" +COM_REDSHOP_EXPORT_ATTRIBUTES="Export Attributes" +COM_REDSHOP_EXPORT_RELATED_PRODUCTS="Export Related Products" +COM_REDSHOP_EXPORT_FIELDS="Export Fields" +COM_REDSHOP_EXPORT_USERS="Export Users" +COM_REDSHOP_EXPORT_SHIPPING_ADDRESS="Export Shipping addresses" +COM_REDSHOP_EXPORT="Export" +COM_REDSHOP_EXPORT_MANAGEMENT="Export Management" +COM_REDSHOP_FIELD_TYPE="Field Type" +COM_REDSHOP_USER_FILTER="Filter" +COM_REDSHOP_EDIT_FIELDS="Edit Field" +COM_REDSHOP_FIELDS_MANAGEMENT="Custom Field Management" +COM_REDSHOP_TYPE="Type" +COM_REDSHOP_TOOLTIP_TYPE="Select field type" +COM_REDSHOP_TOOLTIP_SECTION="Select which section this text library item is for." +COM_REDSHOP_FIELD_TITLE="Field Title" +COM_REDSHOP_TOOLTIP_FIELD_TITLE="Enter field title. The title will appear under product editing and as title of the connected tag under template editing." +COM_REDSHOP_CLASS="CSS Class" +COM_REDSHOP_TOOLTIP_CLASS="If you want to style your field with CSS, enter a class." +COM_REDSHOP_MAX_LENGTH="Maximum Length" +COM_REDSHOP_TOOLTIP_MAX_LENGTH="Enter maximum length measured in number of characters." +COM_REDSHOP_SIZE="Size" +COM_REDSHOP_TOOLTIP_SIZE="Enter size measured in pixels for width of the input field." +COM_REDSHOP_COLS="Columns" +COM_REDSHOP_TOOLTIP_COLS="Enter number of columns (only relevant for text area or multiple select)." +COM_REDSHOP_ROWS="Rows" +COM_REDSHOP_TOOLTIP_ROWS="Enter number of rows (only relevant for text area or multiple select)." +COM_REDSHOP_DISPLAY_IN_PRODUCT_LIST="Display in Product List" +COM_REDSHOP_SHOW_AT_FRONT="Show in Front" +COM_REDSHOP_USE_THE_TABLE_BELOW_TO_ADD_NEW_VALUES="Use the table below to add new options" +COM_REDSHOP_OPTION_NAME="Option Name" +COM_REDSHOP_FIELDS_MANAGEMENT_DETAIL="Field Management Detail" +COM_REDSHOP_GIFTCARD_NAME="Gift Card Name" +COM_REDSHOP_GIFTCARD_SEARCH_IN_NAME="Search giftcards by name" +COM_REDSHOP_GIFTCARD_NAME_TOOLTIP="Add gift card name" +COM_REDSHOP_CUSTOMER_AMOUNT="Customer Amount" +COM_REDSHOP_CUSTOMER_AMOUNT_TOOLTIP="User defined gift card amount" +COM_REDSHOP_GIFTCARD_PRICE="Gift Card Price" +COM_REDSHOP_GIFTCARD_PRICE_TOOLTIP="Gift card purchase price" +COM_REDSHOP_GIFTCARD_VALUE="Gift Card Value" +COM_REDSHOP_GIFTCARD_VALUE_TOOLTIP="Give card value to the user" +COM_REDSHOP_GIFTCARD_VALIDITY="Gift Card Validity" +COM_REDSHOP_GIFTCARD_VALIDITY_TOOLTIP="Gift card validity in days" +COM_REDSHOP_GIFTCARD_DATE="Gift Card Date" +COM_REDSHOP_GIFTCARD_FREE_SHIPPING="Free Shipping" +COM_REDSHOP_GIFTCARD_FREE_SHIPPING_DESC="Allow free shipping with gift card or not." +COM_REDSHOP_GIFTCARD_BGIMAGE="Gift Card Background Image" +COM_REDSHOP_GIFTCARD_BGIMAGE_TOOLTIP="Background image of your gift card." +COM_REDSHOP_GIFTCARD_IMAGE="Gift Card Image" +COM_REDSHOP_GIFTCARD_IMAGE_TOOLTIP="Gift card image" +COM_REDSHOP_GIFTCARD_MANAGEMENT="Gift Card Management" +COM_REDSHOP_GIFTCARDS="Gift Cards" +COM_REDSHOP_SEPRATOR="Separator" +COM_REDSHOP_IMPORT_CATEGORIES="Import Categories" +COM_REDSHOP_IMPORT_PRODUCTS="Import Products" +COM_REDSHOP_IMPORT_ATTRIBUTES="Import Attributes" +COM_REDSHOP_IMPORT_RELATED_PRODUCTS="Import Related Products" +COM_REDSHOP_IMPORT_FIELDS="Import Fields" +COM_REDSHOP_IMPORT_USERS="Import Users" +COM_REDSHOP_IMPORT_SHIPPING_ADDRESS="Import Shipping Address" +COM_REDSHOP_IMPORT_SHOPPER_GROUP_PRODUCT_SPECIFIC_PRICE="Import Shopper group specific PRODUCT prices" +COM_REDSHOP_IMPORT_SHOPPER_GROUP_ATTRIBUTE_SPECIFIC_PRICE="Import Shopper group specific ATTRIBUTE prices" +COM_REDSHOP_PRODUCT_SYNC="Products have been imported into redSHOP" +COM_REDSHOP_PRODUCT_SYNC_UPDATED="Products have been updated" +COM_REDSHOP_CATEGORY_SYNC="Categories have been imported into redSHOP" +COM_REDSHOP_SHOPPER_SYNC="Shopper Groups have been imported into redSHOP" +COM_REDSHOP_CUSTOMER_SYNC="Customer have been imported into redSHOP" +COM_REDSHOP_ORDER_SYNC="Orders have been imported into redSHOP" +COM_REDSHOP_STATUS_SYNC="Order Status have been imported into redSHOP" +COM_REDSHOP_MANUFACTURER_SYNC="Manufacturers have been imported into redSHOP" +COM_REDSHOP_NO_VM="VirtueMart is not installed" +COM_REDSHOP_IMPORT="Import" +COM_REDSHOP_IMPORT_MANAGEMENT="Import Management" +COM_REDSHOP_GBASE_SITE_XML_PATH="Google Base XML Site Path" +COM_REDSHOP_TOOLTIP_GBASE_SITE_XML_PATH="Google Base XML Site Path, paste this path in google base schedule uploader." +COM_REDSHOP_DOWNLOAD_XML="Download XML" +COM_REDSHOP_MAIL_SECTION="Mail Section" +COM_REDSHOP_INVOICE_FILE_MAIL="Invoice PDF file" +COM_REDSHOP_MAIL_NAME="Mail Name" +COM_REDSHOP_EDIT_MAIL="Edit Mail" +COM_REDSHOP_MAIL="Mail" +COM_REDSHOP_MAIL_MANAGEMENT="Mail Management" +COM_REDSHOP_TOOLTIP_MAIL_NAME="Enter mail name" +COM_REDSHOP_MAIL_SUBJECT="Mail Subject" +COM_REDSHOP_TOOLTIP_MAIL_SUBJECT="Enter mail subject" +COM_REDSHOP_TOOLTIP_MAIL_SECTION="Please Select Section" +COM_REDSHOP_PLEASE_SELECT_MAIL_SECTION="Please Select Mail Section" +COM_REDSHOP_MAIL_ORDER_STATUS="Mail Order Status" +COM_REDSHOP_BODY="Body" +COM_REDSHOP_MAIL_CENTER_HELPFUL_HINT="Helpful Hints" +COM_REDSHOP_PRODUCT_PER_PAGE="No. of Products per Page" +COM_REDSHOP_PRODUCT_IMAGES="Other Images" +COM_REDSHOP_PRODUCT_IMAGE="Product Image" +COM_REDSHOP_ADD_ADDITIONAL_IMAGES="Add additional images or Media" +COM_REDSHOP_DISCOUNT_PRODUCT="Discount Products" +COM_REDSHOP_DOWNLOAD_FOLDER="Select a file uploaded to the Server at your "_QQ_"Downloadable product root"_QQ_" folder" +COM_REDSHOP_FILE="File" +COM_REDSHOP_FILES="Files" +COM_REDSHOP_MAIN_IMAGE="Main Image" +COM_REDSHOP_ADDITIONAL_IMAGES="Additional Images" +COM_REDSHOP_ADDITIONAL_IMAGES_NOTICE="You can add additional images only after saving product information" +COM_REDSHOP_DEFAULT_MEDIA="Default Media" +COM_REDSHOP_ERROR_SET_DEFAULT_MEDIA="%s media type cannot be used as primary/default" +COM_REDSHOP_PUBLISH="Publish" +COM_REDSHOP_UNPUBLISH="Unpublish" +COM_REDSHOP_ADD_MEDIA="Add Media" +COM_REDSHOP_MEDIA_TYPE="Media Type" +COM_REDSHOP_MEDIA_SECTION="Media Section" +COM_REDSHOP_ADDITIONAL_DOWNLOAD_FILES="Additional Files for Download" +COM_REDSHOP_VIDEO="Video" +COM_REDSHOP_DOCUMENT="Document" +COM_REDSHOP_DOWNLOAD="Download" +COM_REDSHOP_SUBPROPERTY="Sub attribute value" +COM_REDSHOP_YOU_WANT_TO_UPLOAD_ZIP_FILE="Uncompressed or zip file" +COM_REDSHOP_TOOLTIP_YOU_WANT_TO_UPLOAD_ZIP_FILE="Do you want to upload a normal file or a ZIP file?" +COM_REDSHOP_MEDIA_NAME="Media name or Thumb" +COM_REDSHOP_MEDIA_BANK="Upload Image from redSHOP Media Library" +COM_REDSHOP_UPLOAD_FILE_FROM_COMPUTER="Upload File From Your Computer" +COM_REDSHOP_TOOLTIP_MEDIA_TYPE="Select media type." +COM_REDSHOP_MEDIA_ALTERNATE_TEXT="Media Alternative Text" +COM_REDSHOP_TOOLTIP_MEDIA_ALTERNATE_TEXT="Add media alternative text." +COM_REDSHOP_TOOLTIP_MEDIA_SECTION="Select media section." +COM_REDSHOP_SECTION_NAME="Section Item" +COM_REDSHOP_TOOLTIP_SECTION_NAME="Section item is the particular product, category, media or catalogue, this media belongs to." +COM_REDSHOP_MEDIAS="Medias" +COM_REDSHOP_NUMBER_ODERS="Number Of Orders" +COM_REDSHOP_ODERS_TOTAL="Orders Total" +COM_REDSHOP_START="Start" +COM_REDSHOP_END="End" +COM_REDSHOP_FILTER_CUSTOMER_BY="Filter by City" +COM_REDSHOP_HOW_LONG_USER="How Long They Customer" +COM_REDSHOP_CHECKOUT_SHOPPER="Send only to shoppers who confirmed newsletter sign up" +COM_REDSHOP_SELECT_ALL="[select all]" +COM_REDSHOP_NEWSLETTER_SEND_LOG="Newsletter Sent Log" +COM_REDSHOP_NEWSLETTER_MANAGEMENT="Newsletter Management" +COM_REDSHOP_SEND_NEWSLETTER="Send Newsletter" +COM_REDSHOP_SELECT_COUNTRY="-Select Country -" +COM_REDSHOP_SUBJECT="Subject" +COM_REDSHOP_TOOLTIP_SUBJECT="Enter a subject." +COM_REDSHOP_NEWSLETTER_BODY="Newsletter Body" +COM_REDSHOP_TOOLTIP_TEMPLATE="Select a template." +COM_REDSHOP_EDIT_TEMPLATE="Edit Template" +COM_REDSHOP_NEWSLETTER_FIXED_TAGS="Default Newsletter tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_NEWSLETTER_FIXED_TAGS_HINT="Tags can be used in the newsletter" +COM_REDSHOP_NEWSLETTER_TAGS_HINT="Newsletter Text Tags" +COM_REDSHOP_STATISTICS_FILTER="Statistics Filter" +COM_REDSHOP_NEWSLETTER_FILTER="Newsletter filter" +COM_REDSHOP_EDIT_NEWSLETTER_SUBSCR="Edit Newsletter Subscription" +COM_REDSHOP_IMPORT_NEWSLETTER_SUBS="Import Newsletter Subscribers" +COM_REDSHOP_NEWSLETTER_SELECT_NEWSLETTER="Select Newsletter" +COM_REDSHOP_NEWSLETTER_SUBSCR_EMAIL_IMPORT="Newsletter Subscribers Email Import" +COM_REDSHOP_TOOLTIP_NEWSLETTER_BROWSE="Upload file in the CSV comma separated format. name and email are required fields." +COM_REDSHOP_NEWSLETTER_BROWSE="Select File" +COM_REDSHOP_NEWSLETTER_SUBSCR="Newsletter Subscriber" +COM_REDSHOP_NEWSLETTER_SUBSCR_MANAGEMENT="Newsletter Subscribers Management" +COM_REDSHOP_NEWSLETTER_SELECT_USER="Select User" +COM_REDSHOP_TOOLTIP_NEWSLETTER_SELECT_USER="Select the user that should have this subscription" +COM_REDSHOP_TOOLTIP_NEWSLETTER_SELECT_NEWSLETTER="Select the newsletter this user wants to subscribe to." +COM_REDSHOP_NEWSLETTER_SUBSCR_DATE="Newsletter Subscription Date" +COM_REDSHOP_NEWSLETTER_SUBSCR_EMAIL="Subscriber Email" +COM_REDSHOP_TOOLTIP_NEWSLETTER_SUBSCR_EMAIL="Enter the subscriber's email address." +COM_REDSHOP_QUANTITY="Quantity" +COM_REDSHOP_EDIT_ORDER="Edit order" +COM_REDSHOP_EDIT_PRODUCT="Edit Product" +COM_REDSHOP_PRODUCT_ORDER_SEARCH_BY_CUSTOMER="Product Order Search by Customer" +COM_REDSHOP_SELECT_NEW_STATUS="Please select the common status first" +COM_REDSHOP_NEW_STATUS="Change status to" +COM_REDSHOP_INCLUDE_COMMENT_MSG="Include this comment?" +COM_REDSHOP_NOTIFY_CUSTOMER_MSG="Notify Customer?" +COM_REDSHOP_SEND_ORDER_MAIL="Send mail to customer" +COM_REDSHOP_RESEND_ORDER_MAIL="Resend Order Mail" +COM_REDSHOP_UPDATE_STATUS_BUTTON="Update Order Status" +COM_REDSHOP_CONFIRM_BOOK_INVOICE="Are you sure want to book invoice without payment received?" +COM_REDSHOP_ECONOMIC_BOOK_INVOICE_NUMBER_LBL="e-conomic book invoice number" +COM_REDSHOP_TOOLTIP_ECONOMIC_BOOK_INVOICE_NUMBER_LBL="select e-conomic book invoice number" +COM_REDSHOP_SAME_AS_ORDER_NUMBER="Same as Order Number" +COM_REDSHOP_SEQUENTIALLY_IN_ECONOMIC_NO_MATCH_UP_WITH_ORDER_NUMBER="Sequentially in e-conomic(No match up with order number)" +COM_REDSHOP_INVOICE_BOOKED_ON="Invoice booked on" +COM_REDSHOP_BOOK_INVOICE="Book Invoice" +COM_REDSHOP_OPEN_AND_PRINT="Open & Print" +COM_REDSHOP_PRINT="Print" +COM_REDSHOP_SHIPPING_METHOD_LBL="Shipping Method Name" +COM_REDSHOP_SUBSCRIPTION="Subscription" +COM_REDSHOP_ORDER_NUMBER="Number" +COM_REDSHOP_INVOICE_NUMBER="Invoice Number" +COM_REDSHOP_NOTE="Note" +COM_REDSHOP_MULTI_PRINT_ORDER_LBL="Print Multiple Orders" +COM_REDSHOP_ORDER_MANAGEMENT="Order Management" +COM_REDSHOP_CHANGE_STATUS_TO_ALL_LBL="Save Status Changes" +COM_REDSHOP_CHANGE_STATUS_TO_ALL_WITH_PACSOFT_LBL="Save Status Changes With Pacsoft" +COM_REDSHOP_EXPORT_DATA_LBL="Export Data" +COM_REDSHOP_EXPORT_FULL_DATA_LBL="Export Full Order CSV" +COM_REDSHOP_CREDIT_CARD_INFO="Credit card info" +COM_REDSHOP_CREDIT_CARD_NAME="Credit Card Name" +COM_REDSHOP_CREDIT_CARD_NUMBER="Credit Card Number" +COM_REDSHOP_CREDIT_CARD_EXPIRY_DATE="Credit Card Expiration Date" +COM_REDSHOP_CREDIT_CARD_SECURITY_NUMBER="Credit Card Security Number" +COM_REDSHOP_PAYMENT="Payment" +COM_REDSHOP_RECEIPT="Receipt" +COM_REDSHOP_CARD_INFORMATION="Card Information" +COM_REDSHOP_NAME_ON_CARD="Name On Card" +COM_REDSHOP_CARD_NUM="Card Number" +COM_REDSHOP_EXPIRY_DATE="Expiration Date" +COM_REDSHOP_CARD_SECURITY_CODE="Card Security Code" +COM_REDSHOP_ORDERTOTAL="Order total" +COM_REDSHOP_BTN_CHECKOUTNEXT="Check out next" +COM_REDSHOP_CREATE_STOCKNOTE="Stock Note" +COM_REDSHOP_CREATE_SHIPPING_LABEL="Shipping Label PDF" +COM_REDSHOP_SEND_DOWNLOEADMAIL="Send Download Mail" +COM_REDSHOP_BACK="Back" +COM_REDSHOP_CLICK_TO_VIEW_CREDIT_CARD_DETAIL="Click to View Credit Card Detail" +COM_REDSHOP_ORDER_PAYMENT_REFERENCE_NUMBER="Payment Reference Number" +COM_REDSHOP_ORDER_DETAIL_PARTIALLY_PAID_AMOUNT="Partially Paid Amount" +COM_REDSHOP_NO_DISCOUNT_AVAILABLE="No Discounts on this order" +COM_REDSHOP_DOWNLOAD_SETTING="Download Setting" +COM_REDSHOP_CONFIRM_DELETE_ORDER_ITEM="Confirm Delete Order Item" +COM_REDSHOP_UPDATE="Update" +COM_REDSHOP_TOKEN_ID="Token ID" +COM_REDSHOP_DOWNLOAD_LIMIT_OVER="Download Limit Over" +COM_REDSHOP_PRODUCT_DOWNLOAD_INFINITE_LIMIT="Infinite limit for download" +COM_REDSHOP_PRODUCT_DOWNLOAD_CLOCK_LBL="Download the last day before" +COM_REDSHOP_PAYMENT_CHARGES_LBL="Payment Charges" +COM_REDSHOP_SHIPPING_NAME="Shipping Method Name" +COM_REDSHOP_SHIPPING_RATE_NAME="Shipping Rate Name" +COM_REDSHOP_SHIPPING_MODE="Shipping Mode" +COM_REDSHOP_ORDER_STATUS_LOG="Order Status Log" +COM_REDSHOP_MODIFIED_DATE="Last modified" +COM_REDSHOP_PAYMENT_STATUS="Payment Status" +COM_REDSHOP_SHIPPING_INFORMATION="Shipping Information" +COM_REDSHOP_ORDERLIST="Orders" +COM_REDSHOP_COMPANY_NAME="Company name" +COM_REDSHOP_EDIT_ORDERSTATUS="Edit Order Status" +COM_REDSHOP_ORDERSTATUS="Order Status" +COM_REDSHOP_ORDERSTATUS_MANAGEMENT="Order Status Management" +COM_REDSHOP_ORDERSTATUS_CODE="Order Status Code" +COM_REDSHOP_TOOLTIP_ORDERSTATUS_CODE="Enter a code for your new order status." +COM_REDSHOP_ORDERSTATUS_NAME="Order Status Name" +COM_REDSHOP_TOOLTIP_ORDERSTATUS_NAME="Enter Order Status Name" +COM_REDSHOP_VERSION="redSHOP version" +COM_REDSHOP_SHOPPER_GROUP_LBL="Shopper Groups" +COM_REDSHOP_INSTALL_NEW_PACKAGE="Install New Package" +COM_REDSHOP_TEMPLATES_MANAGEMET="Templates Management" +COM_REDSHOP_REDSHOP="redSHOP" +COM_REDSHOP_CATEGORIES="Categories" +COM_REDSHOP_TEMPLATES="Templates" +COM_REDSHOP_EDIT_PRODUCT_PRICE="Edit Product Price" +COM_REDSHOP_PRICE_MANAGEMENT_DETAIL="Price Management Detail" +COM_REDSHOP_DEFAULT="Default" +COM_REDSHOP_PLEASE_SELECT_PRODUCT="Please Select Product" +COM_REDSHOP_NAME_AND_NUMBER="Name And Number" +COM_REDSHOP_CUSTOMER_REVIEWS="Reviews" +COM_REDSHOP_ADD_REVIEW="Add Review" +COM_REDSHOP_VOLUME="Volume" +COM_REDSHOP_TOOLTIP_PRODUCT_NAME="Enter name of the product" +COM_REDSHOP_TOOLTIP_PRODUCT_NUMBER="Enter product number" +COM_REDSHOP_TOOLTIP_PARENT_PRODUCT="If this is a child product, enter the parent product here." +COM_REDSHOP_TOOLTIP_PRODUCT_CATEGORY="Select the category/categories this product belongs to" +COM_REDSHOP_PRODUCT_ON_SALE_HINT="Remove discount start and end dates to remove sale from product.
    Current Status of Product on Sale: %s" +COM_REDSHOP_PRODUCT_ON_SALE="Product on sale" +COM_REDSHOP_PRODUCT_SPECIAL="Featured Product" +COM_REDSHOP_TOOLTIP_PRODUCT_SPECIAL="Featured products are your custom selected products for display in specific redSHOP modules." +COM_REDSHOP_TOOLTIP_PRODUCT_SPECIAL_LBL="Featured Product" +COM_REDSHOP_PRODUCT_EXPIRED="Product Discontinued" +COM_REDSHOP_TOOLTIP_PRODUCT_EXPIRED="Product Expired or Not" +COM_REDSHOP_TOOLTIP_PRODUCT_EXPIRED_LBL="Product Expired" +COM_REDSHOP_PRODUCT_NOT_FOR_SALE="Product not for sell" +COM_REDSHOP_TOOLTIP_PRODUCT_NOT_FOR_SALE="Product Not For Sell" +COM_REDSHOP_TOOLTIP_PRODUCT_NOT_FOR_SALE_LBL="Product Not For Sell" +COM_REDSHOP_PRODUCT_NOT_FOR_SALE_SHOWPRICE="Product not for sell will show price?" +COM_REDSHOP_TOOLTIP_PRODUCT_NOT_FOR_SALE_SHOWPRICE="Product not for sell will show price?" +COM_REDSHOP_TOOLTIP_PRODUCT_NOT_FOR_SALE_SHOWPRICE_LBL="Product not for sell will show price?" +COM_REDSHOP_PRODUCT_PREORDER="Product Pre-Order" +COM_REDSHOP_TOOLTIP_PRODUCT_PREORDER="Select 'Yes' if you want your customers to be able to pre-order products." +COM_REDSHOP_TOOLTIP_PRODUCT_PRICE="Enter product price." +COM_REDSHOP_TOOLTIP_DISCOUNT_PRICE="Enter discounted final price of the product. Do not use %, type the price. if you want to use % please check mass discounts" +COM_REDSHOP_PRODUCT_TAX_GROUP="VAT/Tax group" +COM_REDSHOP_TOOLTIP_PRODUCT_TAX="Select VAT/Tax group for this product. This is mainly relevant in countries with different rates for different countries." +COM_REDSHOP_TOOLTIP_PRODUCT_VOLUME="Enter the volume of your product in m3." +COM_REDSHOP_PRODUCT_LENGTH="Product Length" +COM_REDSHOP_TOOLTIP_PRODUCT_LENGTH="Enter product length." +COM_REDSHOP_PRODUCT_WIDTH="Width" +COM_REDSHOP_TOOLTIP_PRODUCT_WIDTH="Enter product width/height." +COM_REDSHOP_PRODUCT_HEIGHT="Height" +COM_REDSHOP_TOOLTIP_PRODUCT_HEIGHT="Enter product height." +COM_REDSHOP_PRODUCT_DIAMETER="Diameter" +COM_REDSHOP_TOOLTIP_PRODUCT_DIAMETER="The Diameter is only used for calculations in discount calculator and is meant for measurement of two-dimensional (flat) products." +COM_REDSHOP_TOOLTIP_PRODUCT_MANUFACTURER="Enter manufacturer." +COM_REDSHOP_TOOLTIP_SUPPLIER="Enter Supplier." +COM_REDSHOP_WEIGHT_LBL="Weight" +COM_REDSHOP_TOOLTIP_WEIGHT="Enter weight." +COM_REDSHOP_PRODUCT_TEMPLATE="Product Layout" +COM_REDSHOP_TOOLTIP_PRODUCT_TEMPLATE="Select which product template you want to use." +COM_REDSHOP_MINIMUM_ORDER_PRODUCT_QUANTITY_LBL="Minimum quantity per order" +COM_REDSHOP_TOOLTIP_MINIMUM_ORDER_PRODUCT_QUANTITY="Enter minimum quantity to be sold in one purchase." +COM_REDSHOP_MAXIMUM_ORDER_PRODUCT_QUANTITY_LBL="Maximum quantity per order" +COM_REDSHOP_TOOLTIP_MAXIMUM_ORDER_PRODUCT_QUANTITY="enter maximum quantity to be sold in one purchase." +COM_REDSHOP_MINIMUM_QUANTITY_PER_ORDER_MUST_BE_LESS_THAN_MAXIMUM_QUANTITY_PER_ORDER="Minimum quantity per order must be less than Maximum quantity per order" +COM_REDSHOP_PRODUCT_AVAILABILITY_DATE_LBL="Product Availability Date" +COM_REDSHOP_TOOLTIP_PRODUCT_AVAILABILITY_DATE="Enter availability date." +COM_REDSHOP_ECONOMIC_ACCOUNTGROUP_LBL="e-conomic Account Group" +COM_REDSHOP_TOOLTIP_ECONOMIC_ACCOUNTGROUP_LBL="If you have integration with e-conomic, select account group here." +COM_REDSHOP_FULL_DESCRIPTION="Full Description" +COM_REDSHOP_TOOLTIP_PRODUCT_IMAGE="Upload product image from your computer(click search) or from redSHOP media library (click image)." +COM_REDSHOP_PRODUCT_THUMB_IMAGE="Product thumb image" +COM_REDSHOP_TOOLTIP_PRODUCT_THUMB_IMAGE="Upload product thumb." +COM_REDSHOP_DELETE_CURRENT_THUMB_IMAGE="Delete Current Product Thumb" +COM_REDSHOP_PRODUCT_BACK_IMAGE="Product Back Image" +COM_REDSHOP_TOOLTIP_PRODUCT_BACK_IMAGE="Upload product back image." +COM_REDSHOP_PRODUCT_BACK_THUMB_IMAGE="Product Back Thumb Image" +COM_REDSHOP_TOOLTIP_PRODUCT_BACK_THUMB_IMAGE="Upload Product Back Thumb Image" +COM_REDSHOP_PRODUCT_PREVIEW_IMAGE="Product Preview Image" +COM_REDSHOP_TOOLTIP_PRODUCT_PREVIEW_IMAGE="Upload product preview image. Note that this image will not be resized before display in frontend." +COM_REDSHOP_PRODUCT_PREVIEW_BACK_IMAGE="Product Preview Back Image" +COM_REDSHOP_TOOLTIP_PRODUCT_PREVIEW_BACK_IMAGE="Upload product preview image. Note that this image will not be resized before display in frontend." +COM_REDSHOP_SELECT_CATEGORY_TO_USEIN_SEF="Category in SEF URL" +COM_REDSHOP_TOOLTIP_SELECT_CATEGORY_TO_USEIN_SEF="Type the name of the category you want included in automatically generated SEF URLs for this product." +COM_REDSHOP_PRODUCT_ATTRIBUTES="Product Attributes" +COM_REDSHOP_PRODUCT_NORMAIL_PRICE="Normal Price" +COM_REDSHOP_OPRAND="sign (+/-)" +COM_REDSHOP_ADDED_VALUE="Amount added" +COM_REDSHOP_REDPRODUCTFINDER_ASSOCIATION="redPRODUCTFINDER Association" +COM_REDSHOP_TAG_NAME_TIP="Tag Name" +COM_REDSHOP_TAG_NAME="Text Tag Name" +COM_REDSHOP_PRODUCT_TYPE="Product Type" +COM_REDSHOP_PRODUCT_TYPE_TIP="Indicate if this product is a physical product, a file for download, a subscription or any other custom type defined by a plugin." +COM_REDSHOP_STOCKROOM_TAB="Stockroom" +COM_REDSHOP_IMPORT_EXPORT_TAB="Import / Export" +COM_REDSHOP_IMPORT_SETTINGS="Import setting" +COM_REDSHOP_IMPORT_SETTINGS_MIN_FILE_SIZE="Min file size" +COM_REDSHOP_IMPORT_SETTINGS_MIN_FILE_SIZE_DESC="Enter minimum file size when import. In bytes" +COM_REDSHOP_IMPORT_SETTINGS_MAX_FILE_SIZE="Max file size" +COM_REDSHOP_IMPORT_SETTINGS_MAX_FILE_SIZE_DESC="Enter maximum file size when import. In bytes" +COM_REDSHOP_IMPORT_SETTINGS_FILE_MIME="Allowed file mime" +COM_REDSHOP_IMPORT_SETTINGS_FILE_MIME_DESC="Enter allowed file mimes. Separate by comma." +COM_REDSHOP_IMPORT_SETTINGS_FILE_EXTENSION="Allowed file extension" +COM_REDSHOP_IMPORT_SETTINGS_FILE_EXTENSION_DESC="Enter allowed file extension. Separate by comma" +COM_REDSHOP_IMPORT_SETTINGS_HELP="You can change setting in RedSHOP Configuration > Feature Settings > Import / Export" +COM_REDSHOP_DISCOUNT_CALCULATOR="Discount Calculator" +COM_REDSHOP_PLUS="Plus" +COM_REDSHOP_MINUS="Minus" + +COM_REDSHOP_USE_INDIVIDUAL_PAYMENT_METHOD="Use Individual Payment Method" +COM_REDSHOP_SELECT_PAYMENT_METHOD="Select Payment Method" + +COM_REDSHOP_USE_DISCOUNT_CALCULATOR="Use Discount Calculator" +COM_REDSHOP_DISCOUNT_CALCULATOR_METHOD="Discount Calculator Method" +COM_REDSHOP_USE_RANGE="Calculation based on" +COM_REDSHOP_ALLOW_DECIMAL_PIECE="Allow decimal piece" +COM_REDSHOP_RANGE="Range" +COM_REDSHOP_MILLIMETER="Millimetre" +COM_REDSHOP_CENTIMETER="Centimetre" +COM_REDSHOP_COPY_ATTRIBUTES_FROM_ATTRIBUTE_SET="Copy Attribute Set from Attribute Bank" +COM_REDSHOP_PRODUCT_ATTRIBUTE_SET_LBL="Attribute set" +COM_REDSHOP_NEW_ATTRIBUTE="Add Attribute parameter" +COM_REDSHOP_TITLE="Attribute parameter" +COM_REDSHOP_ATTRIBUTE_REQUIRED="Attribute required" +COM_REDSHOP_ALLOW_MULTIPLE_PROPERTY_SELECTION="Allow multiple selection of attributes" +COM_REDSHOP_HIDE_ATTRIBUTE_PRICE="Hide Attribute Price" +COM_REDSHOP_SUB_ATTRIBUTE="Attribute value" +COM_REDSHOP_DELETE_ATTRIBUTE="Delete attribute" +COM_REDSHOP_DEFAULT_SELECTED="Preselected" +COM_REDSHOP_REMOVE_IMAGE="Remove Image" +COM_REDSHOP_HINT_ATTRIBUTE="Here you can add attributes to your product." +COM_REDSHOP_STOCKROOM_NAME="Stockroom" +COM_REDSHOP_STOCKROOM_QTY="Quantity in stock" +COM_REDSHOP_MIN_DELIVERY_TIME="Minimum Delivery Time" +COM_REDSHOP_DAYS="Days" +COM_REDSHOP_WEEKS="Weeks" +COM_REDSHOP_WEEK="Week" +COM_REDSHOP_PRODUCT_DOWNLOAD="Downloadable Product" +COM_REDSHOP_UPLOAD_CSV_FILE="Upload CSV file" +COM_REDSHOP_SERIAL_NUMBERS="Serial Numbers" +COM_REDSHOP_IS_USED="Is Used" +COM_REDSHOP_SUBSCRIPTION_PERIOD="Subscription Period" +COM_REDSHOP_SUBSCRIPTION_PERIOD_TIP="Enter length of subscription period" +COM_REDSHOP_SUBSCRIPTION_PRICE="Subscription Price" +COM_REDSHOP_SUBSCRIPTION_PRICE_TIP="Enter subscription price." +COM_REDSHOP_MONTH="Month(s)" +COM_REDSHOP_YEAR="Year(s)" +COM_REDSHOP_SUBSCRIPTION_RENEWAL_MAIL="Subscription Renewal Mail" +COM_REDSHOP_DAYS_BEFORE_SUBSCRIPTION_END="days before subscription ends." +COM_REDSHOP_PRODUCT_BEING_EDITED="The product is locked because is being edited by other user or it was not saved properly. Fix it at: Site => Maintenance => Global Check-In" +COM_REDSHOP_THE_DETAIL="The Detail" +COM_REDSHOP_TYPE_LIST="Type:" +COM_REDSHOP_TAG_LIST="Tag:" +COM_REDSHOP_QUALITY_SCORE="Quality Score" +COM_REDSHOP_ADD_DEPENDENCY="Add Dependency" +COM_REDSHOP_PRODUCT_MANAGEMENT_DETAIL="Product Detail Management" +COM_REDSHOP_ADD_PRICE_LBL="Add Price" +COM_REDSHOP_PRICE_PER_PIECE="Price per piece" +COM_REDSHOP_AREA="Area" +COM_REDSHOP_CIRCUMFERENCE="Circumference" +COM_REDSHOP_EDIT_TAGS="Edit Tags" +COM_REDSHOP_TAGS_MANAGEMENT="Customer Tags Management" +COM_REDSHOP_TAGS_NAME="Tag Name" +COM_REDSHOP_TOOLTIP_TAGS_NAME="Enter Tag Name" +COM_REDSHOP_TAGS_MANAGEMENT_DETAIL="Tags Management Detail" +COM_REDSHOP_VIEW_QUESTION="View Question" +COM_REDSHOP_QUESTION_MANAGEMENT="Question Management" +COM_REDSHOP_PREVIOUS_ANSWERS="Previous Answers" +COM_REDSHOP_TIME="Time" +COM_REDSHOP_QUESTION_DETAIL="Question Detail" +COM_REDSHOP_QUOTATION_STATUS="Quotation Status" +COM_REDSHOP_VIEW_QUOTATION="View Quote" +COM_REDSHOP_CREATE_ACCOUNT_FOR_QUOTATION="Create Account for Quote" +COM_REDSHOP_CONFIRM_WITH_QUOTATION_TOTAL_ZERO="Are you sure you want to go with Quote Total zero?" +COM_REDSHOP_QUOTATION_INFORMATION="Quotation Information" +COM_REDSHOP_QUOTATION_DATE="Date" +COM_REDSHOP_QUOTATION_NUMBER="Number" +COM_REDSHOP_QUOTATION_IPADDRESS="Quotation IP Address" +COM_REDSHOP_QUOTATION_NOTE="Quotation Note" +COM_REDSHOP_QUOTATION_CUSTOMER_NOTE="Customer Note:" +COM_REDSHOP_DELETE_QUOTATION_ITEM="Delete Quotation Item" +COM_REDSHOP_QUOTATION_DISCOUNT="Quotation Discount" +COM_REDSHOP_QUOTATION_DETAIL="Quotation Detail" +COM_REDSHOP_RATING_TITLE="Title" +COM_REDSHOP_RATING="Rating" +COM_REDSHOP_RATING_MANAGEMENT="Rating Management" +COM_REDSHOP_RATING_DELETE_CONFIRM="Are you sure you want to delete these rating?" +COM_REDSHOP_TOOLTIP_RATING_USER="Begin typing a name, and redSHOP will provide suggestions." +COM_REDSHOP_TOOLTIP_RATING_PRODUCT="Begin typing a product name, and redSHOP will provide suggestions." +COM_REDSHOP_FAVOURED="Favoured" +COM_REDSHOP_RATING_MANAGEMENT_DETAIL="Rating Management Detail" +COM_REDSHOP_POPULAR="Popular" +COM_REDSHOP_PIE_CHART_FOR_LASTMONTH_SALES="Chart for Sales" +COM_REDSHOP_NUMBER_OF_ORDERS="Number" +COM_REDSHOP_AVG_AMOUNT_OF_ORDERS="Average" +COM_REDSHOP_TOTAL_AMOUNT_OF_ORDERS="Total" +COM_REDSHOP_SALES_AMOUNT="Amount of sales" +COM_REDSHOP_STATISTIC_DURATION="Time Duration" +COM_REDSHOP_CONFIGURATION_FILE_IS_NOT_EXIST="Configuration File does not exist" +COM_REDSHOP_PLEASE_CHECK_DIRECTORY_PERMISSON="Please check directory permission" +COM_REDSHOP_GET_BACK_CONFIG_FILE="Get Configuration File" +COM_REDSHOP_CREATE_CONFIG="Create Configuration" +COM_REDSHOP_DAILY="Daily" +COM_REDSHOP_WEEKLY="Weekly" +COM_REDSHOP_MONTHLY="Monthly" +COM_REDSHOP_YEARLY="Yearly" +COM_REDSHOP_SAMPLE_NAME="Sample Name" +COM_REDSHOP_CATALOG_COLOUR="Catalogue Colour" +COM_REDSHOP_COLOUR_CODE="Colour Code" +COM_REDSHOP_OR="Or" +COM_REDSHOP_COLOUR_IMAGE="Colour image" +COM_REDSHOP_ADD_COLOR="Add Colour" +COM_REDSHOP_SAMPLE_DETAIL="Sample detail" +COM_REDSHOP_CATALOG_SAMPLE="Catalogue Sample" +COM_REDSHOP_EDIT_SHIPPING="Edit Shipping" +COM_REDSHOP_SHIPPING_MANAGEMENT="Shipping Management" +COM_REDSHOP_EDIT_BOX="Edit box" +COM_REDSHOP_BOXES="Boxes" +COM_REDSHOP_BOX_NAME="Box Name" +COM_REDSHOP_BOX_LENGTH="Box Length" +COM_REDSHOP_BOX_WIDTH="Box Width" +COM_REDSHOP_BOX_HEIGHT="Box Height" +COM_REDSHOP_BOX_PRIORITY="Priority" +COM_REDSHOP_SHIPPING_CLASS="Shipping Class" +COM_REDSHOP_SHIPPING_RATE_LBL="Shipping Rates" +COM_REDSHOP_SHIPPING_LOCATION="Shipping Location" +COM_REDSHOP_SHIPPING_LOCATION_INFORMATION="Shipping Location Information" +COM_REDSHOP_SHIPPING_RATE_WEIGHT_START="Weight Start" +COM_REDSHOP_SHIPPING_RATE_WEIGHT_END="Weight End" +COM_REDSHOP_SHIPPING_RATE_VOLUME_START="Volume Start" +COM_REDSHOP_SHIPPING_RATE_VOLUME_END="Volume End" +COM_REDSHOP_SHIPPING_RATE_LENGTH_START="Shipping Rate Length Start" +COM_REDSHOP_SHIPPING_RATE_LENGTH_END="Shipping Rate Length End" +COM_REDSHOP_SHIPPING_RATE_WIDTH_START="Shipping Rate Width Start" +COM_REDSHOP_SHIPPING_RATE_WIDTH_END="Shipping Rate Width End" +COM_REDSHOP_SHIPPING_RATE_HEIGHT_START="Shipping Rate Height Start" +COM_REDSHOP_SHIPPING_RATE_HEIGHT_END="Shipping Rate Height End" +COM_REDSHOP_SHIPPING_RATE_ORDERTOTAL_START="Order Total Start" +COM_REDSHOP_SHIPPING_RATE_ORDERTOTAL_END="Order Total End" +COM_REDSHOP_SHIPPING_RATE_ZIP_START="Zip code start" +COM_REDSHOP_SHIPPING_RATE_ZIP_END="Zip code end" +COM_REDSHOP_SHIPPINGRATE_PRODUCT="Shipping Rate Product" +COM_REDSHOP_SHIPPING_RATE_VALUE="Shipping Rate" +COM_REDSHOP_SHIPPING_RATE_PRIORITY="Priority" +COM_REDSHOP_COMPANY_ONLY="Company customer only" +COM_REDSHOP_SHIPPING_RATE_FOR="This shipping rate is for" +COM_REDSHOP_SHIPPING_VAT_GROUP_LBL="VAT group" +COM_REDSHOP_ADD_VAT="Add Vat" +COM_REDSHOP_SHIPPING_RATE="Shipping Rate" +COM_REDSHOP_EDIT_SHOPPER_GROUP="Edit Shopper Group" +COM_REDSHOP_SHOPPER_GROUP_MANAGEMENT="Shopper Group Management" +COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_NAME="Enter a name for this shopper group." +COM_REDSHOP_SHOPPER_GROUP_TYPE="Shopper Group Type" +COM_REDSHOP_SHOPPER_GROUP_CUSTOMER_TYPE="Shopper Group Customer Type" +COM_REDSHOP_SHOPPER_GROUP_PORTAL="Shopper Group Portal" +COM_REDSHOP_SHOPPER_GROUP_CATEGORY="Shopper Group Category" +COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_CATEGORY="Select categories accessible for this shopper group." +COM_REDSHOP_SHOPPER_GROUP_URL="Shopper Group URL" +COM_REDSHOP_SHOPPER_GROUP_CART_ITEMID_LBL="Shopper group cart item ID override" +COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_CART_ITEMID="Select alternative cart Item ID for this shopper group." +COM_REDSHOP_USE_DEFAULT_SHIPPING="Use Default Shipping" +COM_REDSHOP_CHOOSE_DEFAULT_SHIPPING_RATE="Choose Default Shipping Rate" +COM_REDSHOP_TOOLTIP_CHOOSE_DEFAULT_SHIPPING_RATE="Enter default shipping rate." +COM_REDSHOP_DEFAULT_SHOPPER_GROUP_CART_CHECKOUT_ITEMID="Default Shopper Group Checkout Item ID" +COM_REDSHOP_TOOLTIP_DEFAULT_SHOPPER_GROUP_CART_CHECKOUT_ITEMID="Enter default shopper group checkout itemid." +COM_REDSHOP_USE_VAT_GROUP_LBL="Use Vat Group" +COM_REDSHOP_TOOLTIP_USE_VAT_GROUP="Use Vat Group" +COM_REDSHOP_TOOLTIP_ADD_VAT="Tooltip Add Vat" +COM_REDSHOP_SHOW_PRICE_WITHOUT_VAT="Show Price Without VAT / Tax" +COM_REDSHOP_TOOLTIP_SHOW_PRICE_WITHOUT_VAT="Show price with VAT (select no) or without VAT (select yes)." +COM_REDSHOP_SHOW_PRICE_WITH_OR_WITHOUT_VAT="Show Price With Or Without Vat" +COM_REDSHOP_PRODUCT_PRICE_VAT_LBL="Apply Product Price VAT" +COM_REDSHOP_TOOLTIP_PRODUCT_PRICE_VAT_LBL="Apply Product Price VAT" +COM_REDSHOP_TAX_EXEMPT_SHIPPING="TAX Exempt Shipping" +COM_REDSHOP_TOOLTIP_TAX_EXEMPT_SHIPPING="TAX Exempt Shipping" +COM_REDSHOP_QUOTATION_MODE_LBL="Quotation Mode" +COM_REDSHOP_SHOPPER_GROUP_LOGO="Shopper Group Logo" +COM_REDSHOP_SHOPPER_GROUP_INTROTEXT="Shopper Group Intro text" +COM_REDSHOP_SHOPPER_GROUP_DESCRIPTION="Shopper Group Description" +COM_REDSHOP_STATE_NAME="State Name" +COM_REDSHOP_STATE_NAME_DESC="Enter name for this state." +COM_REDSHOP_STATE_COUNTRY="Country" +COM_REDSHOP_STATE_COUNTRY_DESC="Choose country for this state." +COM_REDSHOP_STATE_3_CODE="3-Digit Code" +COM_REDSHOP_STATE_3_CODE_DESC="Enter 3-Digit state code" +COM_REDSHOP_STATE_2_CODE="2-Digit Code" +COM_REDSHOP_STATE_2_CODE_DESC="Enter 2-Digit state code" +COM_REDSHOP_STATE_DISPLAY_ABBERVIATION="Display" +COM_REDSHOP_STATE_DISPLAY_ABBERVIATION_DESC="Choose method for display state abbreviation." +COM_REDSHOP_EDIT_STATE="Edit State" +COM_REDSHOP_TOOLTIP_COUNTRY_NAME="Country Name" +COM_REDSHOP_STATE_DETAIL="State Detail" +COM_REDSHOP_STARTDATE="Start date" +COM_REDSHOP_ENDDATE="End date" +COM_REDSHOP_SUBMIT="Submit" +COM_REDSHOP_TOTAL_ORDERS="Number Of Orders" +COM_REDSHOP_DATE="Date" +COM_REDSHOP_NUMBER_OF_TIMES_SOLD="Number of Times Sold" +COM_REDSHOP_NUMBER_OF_ITEMS_SOLD="Number of Items Sold" +COM_REDSHOP_STOCK_AMOUNT_IMAGE_TOOLTIP_LBL="Stockroom Image Tooltip" +COM_REDSHOP_STOCK_AMOUNT_OPTION_LBL="Stock Amount" +COM_REDSHOP_STOCK_AMOUNT_QUANTITY_LBL="Stock Quantity" +COM_REDSHOP_STOCK_AMOUNT_IMAGE_LBL="Stock Amount Image" +COM_REDSHOP_STOCKIMAGE_MANAGEMENT_DETAIL="Stock amount Image Management detail" +COM_REDSHOP_STOCKIMAGE="Stock Amount Image" +COM_REDSHOP_LISTING="Inventory" +COM_REDSHOP_DELIVERY_TIME_IN="Delivery Time in" +COM_REDSHOP_SHOW_ON_STOCKLIST="Show in Frontend" +COM_REDSHOP_PRODUCT_ATTRIBUTE="Product Attribute" +COM_REDSHOP_SUPPLIER_EMAIL="Email" +COM_REDSHOP_SUPPLIER_EMAIL_DESC="Enter supplier email" +COM_REDSHOP_SUPPLIER_DESCRIPTION="Description" +COM_REDSHOP_SUPPLIER_DESCRIPTION_DESC="Enter description for this supplier" +COM_REDSHOP_SUPPLIER_MANAGEMENT_DETAIL="Supplier Management Detail" +COM_REDSHOP_EDIT_TAX="Edit Tax" +COM_REDSHOP_TAX_RATE_MANAGEMENT="VAT Rates" +COM_REDSHOP_ADD_RATES="Add Rates" +COM_REDSHOP_TAX_COUNTRY="VAT Country" +COM_REDSHOP_TOOLTIP_TAX_COUNTRY="Select the country you need to enter a VAT rate for." +COM_REDSHOP_TAX_STATE="VAT State" +COM_REDSHOP_TOOLTIP_TAX_STATE="If relevant, select the state you need to enter a VAT rate for." +COM_REDSHOP_EU_COUNRYT_LBL="EU Country" +COM_REDSHOP_TOOLTIP_EU_COUNRYT="Tooltip EU Country" +COM_REDSHOP_TAX_RATE="Tax Rate" +COM_REDSHOP_TOOLTIP_TAX_RATE="Enter tax rate (for 16% enter 0.16)" +COM_REDSHOP_TAX_RATE_INVALID_INPUT_MSG="Invalid input of tax rate, it must be numeric & not less than zero" +COM_REDSHOP_TAX_GROUP_NAME_LBL="VAT / Tax Group Name" +COM_REDSHOP_TAX_GROUP_MANAGEMENT="VAT / Tax Group Management" +COM_REDSHOP_TOOLTIP_TAX_GROUP_NAME_LBL="Enter a name for this VAT / Tax Group" +COM_REDSHOP_TAX_GROUP_PUBLISH_LBL="Published" +COM_REDSHOP_TOOLTIP_TAX_GROUP_PUBLISH_LBL="Do you want to publish this Vat / Tax Group?" +COM_REDSHOP_PAYMENT_METHOD="Payment Method" +COM_REDSHOP_AVAILABLE_TEMPLATE_TAGS="Available Tags" +COM_REDSHOP_AVAILABLE_TEXTLIBRARY_ITEMS="Available Library Items" +COM_REDSHOP_NO_FIELDS_AVAILABLE="No Fields Available" +COM_REDSHOP_ADD_TO_CART_TEMPLATE_AVAILABLE_HINT="User for Add To Cart Button" +COM_REDSHOP_PRODUCT_FIELDS="Product Fields" +COM_REDSHOP_ATTRIBUTE_TAGS_AVAILABLE="No Attribute Tags Available" +COM_REDSHOP_RELATED_PRODUCT_TEMPLATE="Related Product Template" +COM_REDSHOP_NO_WRAPPER_TEMPLATE_AVAILABLE="No wrapping template available" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SAMPLE_HINT="Product Sample Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_HINT="Manufacturer Template available Tags" +COM_REDSHOP_TEMPLATE_PRODUCT_FIELDS_TITLE="Product extra field for category template used in product loop" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_PRODUCTS_HINT="Manufacturer Products Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_CART_HINT="Cart Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_CHECKOUT_HINT="Checkout Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ORDER_RECEIPT_HINT="Order receipt Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ORDER_PRINT_HINT="Order print Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_NEWSLETTER_HINT="Newsletter Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_NEWSLETTER_PRODUCTS_HINT="Newsletter Products Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_RELATED_PRODUCT_HINT="Related Product Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ADD_TO_CART_HINT="Add To Cart Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_REVIEW_HINT="Review Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_HINT="Attribute Product Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_WITH_CART_HINT="Attribute with Cart Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_WRAPPER_HINT="Wrapping Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_WISHLIST_HINT="Wishlist Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_PDF_HINT="Shipping PDF Template available Tags" +COM_REDSHOP_AJAX_CART_BOX_TEMPLATE="Ajax Cart Template" +COM_REDSHOP_TEMPLATE_TAG_AJAX_CART_BOX_HINT="Ajax Cart Box Template available Tags" +COM_REDSHOP_AJAX_CART_BOX_DETAIL_TEMPLATE_HINT="Ajax Cart Box Detail Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_AJAX_PRODUCT_HINT="Ajax Cart Product Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_REDPRODUCTFINDER_HINT="redPRODUCTFINDER Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ACCOUNT_HINT="Account Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_COMPARE_PRODUCT_HINT="Compare Product Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_METHOD_HINT="Payment Method Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_METHOD_HINT="Shipping Method Template available tags" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_BOX_HINT="Shipping Box Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ONESTEP_CHECKOUT_HINT="One step Checkout Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_CHANGE_CART_ATTRIBUTE_HINT="Change Cart Attribute Template available Tags" +COM_REDSHOP_NO_RELATED_PRODUCT_LIGHTBOX_TEMPLATE_AVAILABLE="No Template Available to show Related Product in Lightbox" +COM_REDSHOP_RELATED_PRODUCT_LIGHTBOX_TEMPLATE_AVAILABLE_HINT="Template Available to show Related Product in Lightbox" +COM_REDSHOP_EXAMPLE_TEMPLATE="For Example:" +COM_REDSHOP_NO_TEXTLIBRARY_ITEMS="No text-library tags available" +COM_REDSHOP_CATEGORY_TEXTLIBRARY_ITEMS="Category Text Tags" +COM_REDSHOP_NEWSLETTER_TEXTLIBRARY_ITEMS="Newsletter Text Tags" +COM_REDSHOP_PRODUCT_TEXTLIBRARY_ITEMS="Product Text Tags" +COM_REDSHOP_EDIT_TAG="Edit Tag" +COM_REDSHOP_SHOPPERGRP_FILTER="Shopper Group Filter" +COM_REDSHOP_TAX_EXEMPT_REQUESTED="Tax Exempt Requested" +COM_REDSHOP_USER_COMPANY="Company Customer" +COM_REDSHOP_USER_CUSTOMER="Private Customer" +COM_REDSHOP_ADDED="Added" +COM_REDSHOP_YES_SYNC="New entries to Webshop from User's table" +COM_REDSHOP_NO_SYNC="No Sync" +COM_REDSHOP_LAST_NAME="Last Name" +COM_REDSHOP_TOOLTIP_LAST_NAME="Enter Last Name." +COM_REDSHOP_TOOLTIP_ADDRESS="Enter street name and no." +COM_REDSHOP_TOOLTIP_CITY="Enter city." +COM_REDSHOP_TOOLTIP_COUNTRY="Enter country." +COM_REDSHOP_TOOLTIP_STATE="Enter state, if relevant." +COM_REDSHOP_TOOLTIP_PHONE="Tooltip Phone" +COM_REDSHOP_TOOLTIP_VAT_NUMBER="Enter vat number" +COM_REDSHOP_TOOLTIP_TAX_EXEMPT="Enter tax exempt" +COM_REDSHOP_USER_REQUEST_TAX_EXEMPT_LBL="User requested VAT exempt" +COM_REDSHOP_TOOLTIP_USER_REQUEST_TAX_EXEMPT="User requested VAT exempt" +COM_REDSHOP_TEX_EXEMPT_APPROVED="Tax Exempt Approved" +COM_REDSHOP_TOOLTIP_TEX_EXEMPT_APPROVED="Tax Exempt Approved" +COM_REDSHOP_USER_DETAIL="User Details" +COM_REDSHOP_TOOLTIP_USERNAME="Enter a username." +COM_REDSHOP_TOOLTIP_EMAIL="Enter email address." +COM_REDSHOP_TOOLTIP_GROUP="Please select group(s) this user belongs to." +COM_REDSHOP_GROUP="Group" +COM_REDSHOP_BLOCK_USER="Block User" +COM_REDSHOP_REGISTER_AS="Registered as" +COM_REDSHOP_RECEIVE_SYSTEM_EMAIL="Receive System E-mail" +COM_REDSHOP_USER_MANAGEMENT_DETAIL="User Management Detail" +COM_REDSHOP_USER_SHIPPING_DETAIL="User shipping detail" +COM_REDSHOP_PLACE_ORDER="Place Order" +COM_REDSHOP_EDIT_VOUCHER="Edit Voucher" +COM_REDSHOP_FINISH_WIZARD_INTRO_TEXT="

    Finished!

    You have now configured the most essential settings. Now you are ready to add products and to customise your shop in details." +COM_REDSHOP_INSTALL_DEMO_CONTENT="Install Demo Content" +COM_REDSHOP_GENERAL_WIZARD_INTRO_TEXT1="First of all, you need to enter some details about your shop." +COM_REDSHOP_GENERAL_WIZARD_SHOP_NAME="Enter name of your shop:" +COM_REDSHOP_GENERAL_WIZARD_ADMIN_EMAIL="Enter email(s) for the one(s) responsible for operating your shop:" +COM_REDSHOP_GENERAL_WIZARD_SHOP_COUNTRY="Indicate where your shop is located, and which country you will most frequently ship to:" +COM_REDSHOP_GENERAL_WIZARD_COUNTRY_LIST="Select the countries you will sell to:" +COM_REDSHOP_GENERAL_WIZARD_DEFAULT_DATEFORMAT="Select date format:" +COM_REDSHOP_GENERAL_WIZARD_INVOICE_MAIL="An email is automatically sent when an order is registered in your shop.
    Select if an additional mail, invoice mail, should be sent when payment is registered:" +COM_REDSHOP_DISCOUNT_INTRO_TEXT="redSHOP operates with three kinds of price reductions: discounts, coupons, and vouchers" +COM_REDSHOP_DISCOUNT_ENABLE_INTRO_TEXT="Discounts are ordinary discounts that can be assigned to specific products, categories of products, or the whole shop." +COM_REDSHOP_COUPONS_ENABLE_INTRO_TEXT="Coupons give permission to a certain amount of purchases with the indicated price reduction. It can be assigned to all customers or one specific user." +COM_REDSHOP_VOUCHER_ENABLE_INTRO_TEXT="Vouchers give permission to a certain amount of purchases with the indicated price reduction. Vouchers can be assigned to specific products." +COM_REDSHOP_DISCOUNT_TYPE_INTRO_TEXT="Allowed combinations of discounts" +COM_REDSHOP_SHIPPING_AFTER_INTRO_TEXT="Select if shipping should be based on you normal price (total) or on the discount price (subtotal):" +COM_REDSHOP_SHIPPING_AFTER_LBL="Calculate shipping based on" +COM_REDSHOP_CURRENCY_INTRO_TEXT="Select the currency your shop will operate with:" +COM_REDSHOP_PRICE_SEPERATOR_INTRO_TEXT="Select how you want prices displayed:" +COM_REDSHOP_TERM_AND_CONDITION_INTRO_TEXT="Here you can select the Joomla article that contains your terms and conditions:" +COM_REDSHOP_REGISTRATION_METHOD_INTRO_TEXT="Your customers enter their details when buying from your shop. Select, if an account should be created:" +COM_REDSHOP_WELCOMEPAGE_INTRO_TEXT="Registered customers will have their own account page, My Page.

    Type the text to displayed on top of My Page:" +COM_REDSHOP_REGISTRATION_PAGE_INTRO_TEXT="When your customers have registered in your shop, they will see an introduction." +COM_REDSHOP_REGISTRATION_PAGE_COMP_INTRO_TEXT="Write your introduction for company customer here:" +COM_REDSHOP_WELCOME_WIZARD_INTRO_TEXT="

    Congratulations on installing your redSHOP component!

    We are very proud of our product, and we hope you will enjoy working with redSHOP." +COM_REDSHOP_WELCOME_REDSHOP_FEATURE_TEXT="redSHOP has a lot of features that we hope you will explore and utilise. To learn more about redSHOP, you can find documentation at our documentation wiki.
    redSHOP is a product from redCOMPONENT - specialists in Joomla components. Learn more about us and our products at redCOMPONENT.com" +COM_REDSHOP_WIZARD_BASIC_INFO_TEXT="

    Before you set up your shop

    There are some basic settings you will need to configure for your shop to work properly. We will guide you through the most essential settings here." +COM_REDSHOP_WRAPPER_NAME="Wrapping Name" +COM_REDSHOP_WRAPPER_IMAGE="Wrapping Image" +COM_REDSHOP_WRAPPER_PRICE="Wrapping Price" +COM_REDSHOP_USE_TO_ALL_PRODUCT="Use for all products" +COM_REDSHOP_EDIT_WRAPPER="Edit wrapping" +COM_REDSHOP_ENTER_WRAPPER_NAME="Enter Wrapping Name" +COM_REDSHOP_WRAPPER_PRICE_NOT_VALID="Wrapping Price not valid" +COM_REDSHOP_TOOLTIP_WRAPPER_NAME="Enter a name for this wrapping." +COM_REDSHOP_TOOLTIP_WRAPPER_PRICE="Enter a price for this wrapping." +COM_REDSHOP_TOOLTIP_WRAPPER_IMAGE="Upload an image of this wrapping." +COM_REDSHOP_EDIT_XMLEXPORT="Edit XML Export File" +COM_REDSHOP_XMLEXPORT="XML Export" +COM_REDSHOP_XML_EXPORT_MANAGEMENT="XML Export Management" +COM_REDSHOP_XMLEXPORT_DISPLAY_FILENAME="Display Filename" +COM_REDSHOP_XMLEXPORT_PARENT_NAME="XML Export Parent Name" +COM_REDSHOP_XMLEXPORT_ELEMENT_NAME="XML Export element name" +COM_REDSHOP_SECTION_TYPE="Section Type" +COM_REDSHOP_AUTO_SYNCHRONIZE="Auto synchronisation" +COM_REDSHOP_SYNCHRONIZE_ON_REQUEST="Synchronise On Request" +COM_REDSHOP_SYNCHRONIZE_INTERVAL="Synchronise Interval" +COM_REDSHOP_XMLFILE="XML File" +COM_REDSHOP_XMLEXPORT_ACCESS="XML Export Access" +COM_REDSHOP_IP_OR_URL_TO_ACCESS="IP or URL to access export file" +COM_REDSHOP_XMLEXPORT_FILE_DETAIL="XML Export Filename Detail" +COM_REDSHOP_ADD_ORDER_DETAIL="Add Order Detail" +COM_REDSHOP_ADD_ORDER_USER_BILLING_INFORMATION="Add Order User Billing Information" +COM_REDSHOP_ADD_ORDER_USER_SHIPPING_INFORMATION="Add Order User Shipping Information" +COM_REDSHOP_ADD_ORDERITEMDETAIL="Add Order Item Detail" +COM_REDSHOP_ADD_PRODUCT_DETAIL="Add Product Detail" +COM_REDSHOP_FIELD_NAME="Field Name" +COM_REDSHOP_XMLEXPORT_FILE_TAG_NAME="XML Export file tag" +COM_REDSHOP_ADD_PRODUCT_STOCK_DETAIL="Add Product Stock Detail" +COM_REDSHOP_EDIT_XMLIMPORT="Edit XML Import File" +COM_REDSHOP_XMLIMPORT="XML Import" +COM_REDSHOP_XML_IMPORT_MANAGEMENT="XML Import Management" +COM_REDSHOP_XMLIMPORT_DISPLAY_FILENAME="Display Filename" +COM_REDSHOP_XMLIMPORT_FILE_URL="XML Import file URL" +COM_REDSHOP_OVERRIDE_EXISTING_IF_EXISTS="Override existing number if number matches" +COM_REDSHOP_ADD_PREFIX_FOR_EXISTING="Add prefix for existing" +COM_REDSHOP_READ_XMLFILE="Read XML File" +COM_REDSHOP_BILLING_INFORMATION="Billing Information" +COM_REDSHOP_NO_DATA_TO_IMPORT="No Data to Import" +COM_REDSHOP_ARE_YOU_SURE="Do you want to continue with remote Update ?" +COM_REDSHOP_PLEASE_DO_NOT_DISTURB="Please do not interrupt while redSHOP is remotely updated." +COM_REDSHOP_CITY_NAME="City" +COM_REDSHOP_EDIT_ZIPCODE="Edit Zipcode / City" +COM_REDSHOP_ZIPCODE_DETAIL="Zipcode Detail" +COM_REDSHOP_DELIVERY_RULE="Delivery Rule (in week)" +COM_REDSHOP_INDIVIDUAL_ADD_TO_CART_ENABLE_LBL="Individual add to cart button" +COM_REDSHOP_ORDER_NUMBER_TEMPLATE_LBL="Order Number template" +COM_REDSHOP_INVOICE_NUMBER_TEMPLATE_LBL="Invoice Number Template" +COM_REDSHOP_INVOICE_NUMBER_FOR_FREE_ORDER_LBL="Generate Invoice Number for free order?" +COM_REDSHOP_TOOLTIP_INVOICE_NUMBER_FOR_FREE_ORDER_LBL="If setting is enabled then invoice number will be generated for free order too. Normally, invoice number only generates when order is Confirm & Paid." +COM_REDSHOP_CART_TIMEOUT_LBL="Cart time-out period in minutes" +COM_REDSHOP_AJAX_CART_BOX_LBL="Enable Add to Cart lightbox (Ajax)" +COM_REDSHOP_DEDAULT_STOCKROOM_LBL="Default Stockroom" +COM_REDSHOP_SSL_ENABLE_IN_BACKEND_LBL="SSL in Backend" +COM_REDSHOP_CATALOG_DAYS_LBL="Catalogue days" +COM_REDSHOP_COLOUR_SAMPLE_DAYS_LBL="Sample Days" +COM_REDSHOP_VAT_RATE_AFTER_DISCOUNT_LBL="VAT after discount" +COM_REDSHOP_DISCOUNT_COUPON_DURATION_LBL="Coupon Validity in Days" +COM_REDSHOP_DISCOUNT_PERCENT_OR_TOTAL_LBL="Value of discount coupon is percentage or total" +COM_REDSHOP_DISCOUNT_COUPON_VALUE_LBL="Amount" +COM_REDSHOP_WATERMARK_CATEGORY_IMAGE_LBL="Watermark Category Image" +COM_REDSHOP_WATERMARK_CATEGORY_THUMB_IMAGE_LBL="Watermark Category Thumb Image" +COM_REDSHOP_CATEGORY_SHORT_DESC_MAX_CHARS_LBL="Enter maximal amount of characters for short category description" +COM_REDSHOP_DEFAULT_NP_LINK_LBL="Default Type of Link to Previous/Next" +COM_REDSHOP_TAX_EXEMPT_APPLY_VAT_LBL="Apply VAT for Tax Exempt" +COM_REDSHOP_USE_AS_CATALOG_LBL="Remove Add to Cart from front (use as catalogue)" +COM_REDSHOP_HEIGHT="Height" +COM_REDSHOP_FIRST_NAME="First Name" +COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE="Select an item to delete" +COM_REDSHOP_SELECT_AN_ITEM_TO_PUBLISH="Select an item to publish" +COM_REDSHOP_SELECT_AN_ITEM_TO_UNPUBLISH="Select an item to unpublish" +COM_REDSHOP_INVALID_PRICE_SEPERATOR="Invalid Value for Price separator" +COM_REDSHOP_INVALID_THOUSAND_SEPERATOR="Invalid Value for Thousand separator" +COM_REDSHOP_ERROR_SAVING_STOCKROOM_DETAIL="Error saving StockRoom Detail" +COM_REDSHOP_STOCKROOM_DETAIL_SAVED="Stockroom Detail Saved" +COM_REDSHOP_STOCK_ROOM_DETAIL_DELETED_SUCCESSFULLY="Stockroom Detail Deleted Successfully" +COM_REDSHOP_STOCK_ROOM_DETAIL_PUBLISHED_SUCCESSFULLY="Stockroom Detail Published Successfully" +COM_REDSHOP_STOCK_ROOM_DETAIL_UNPUBLISHED_SUCCESSFULLY="Stockroom Detail UnPublished Successfully" +COM_REDSHOP_STOCK_ROOM_DETAIL_EDITING_CANCELLED="Stockroom Detail Editing Cancelled" +COM_REDSHOP_STOCK_ROOM_DETAIL_COPIED="Stockroom Detail Copied" +COM_REDSHOP_ERROR_COPING_STOCKROOM_DETAIL="Error Coping Stockroom Detail" +COM_REDSHOP_SHOW_ON_FRONTEND="Show in Frontend" +COM_REDSHOP_STOCKROOM_MANAGEMENT="Stockroom list Management" +COM_REDSHOP_ATTRIBUTE_SET_MUST_BE_SELECTED="Attribute set must be selected" +COM_REDSHOP_EDIT_STOCKROOM="Edit Stockroom" +COM_REDSHOP_STOCKROOM_ITEM_MUST_HAVE_A_NAME="Stockroom item must have a name" +COM_REDSHOP_STOCKROOM_LISTING_MANAGEMENT="Inventory Management" +COM_REDSHOP_FIELDS_DETAIL_SAVED="Field details saved" +COM_REDSHOP_ERROR_SAVING_FIELDS_DETAIL="Error Saving Fields Detail" +COM_REDSHOP_FIELD_DELETED_SUCCESSFULLY="Field Deleted Successfully" +COM_REDSHOP_FIELD_PUBLISHED_SUCCESSFULLY="Field Published Successfully" +COM_REDSHOP_FIELD_UNPUBLISHED_SUCCESSFULLY="Field UnPublished Successfully" +COM_REDSHOP_FIELD_EDITING_CANCELLED="Field editing cancelled" +COM_REDSHOP_FIELDS_ITEM_MUST_HAVE_A_NAME="Field must have a name" +COM_REDSHOP_ERROR_YOU_CAN_NOT_SELECT_THIS_SECTION_TYPE_UNDER_THIS_FIELD="You can not select this section under WYSIWYG & Media field." +COM_REDSHOP_TAG_NAME_MUST_HAVE_A_ENTER="You must enter a text tag name" +COM_REDSHOP_TAG_DESCRIPTION_MUST_HAVE_A_ENTER="You must enter a text tag description" +COM_REDSHOP_TEMPLATE_SAVED="Template Saved" +COM_REDSHOP_ERROR_SAVING_TEMPLATE="Error Saving Template" +COM_REDSHOP_TEMPLATE_COPIED="Template %s is copied to %s" +COM_REDSHOP_TEMPLATE_CLICKATELL_SMS_MESSAGE_HINT="Clickatell Sms Message Template available Tags" +COM_REDSHOP_ERROR_COPYING_TEMPLATE="Error Copying Template" +COM_REDSHOP_YOU_MUST_HAVE_A_SELECT_SECTION="You must have a select section" +COM_REDSHOP_TEMPLATE_MUST_HAVE_A_NAME="Template Must have a name" +COM_REDSHOP_IMPORT_DATA="Import Data" +COM_REDSHOP_EXPORT_DATA="Export Data" +COM_REDSHOP_EXPORT_ACY_MAILING_DATA="Export to AcyMailing" +COM_REDSHOP_DATA_IMPORT_SUCCESS="Data Import Successfully" +COM_REDSHOP_DATA_IMPORT_SUCCESS_AT_ROW="Data Import Successfully row %s" +COM_REDSHOP_ERROR_DATA_IMPORT="Error Importing Data" +COM_REDSHOP_ERROR_DATA_IMPORT_AT_ROW="Error Importing Data row %s" +COM_REDSHOP_FILE_EXTENTION_WRONG="File Extension Wrong, Please Upload CSV File" +COM_REDSHOP_MANUFACTURERS="Manufacturers" +COM_REDSHOP_ERROR_SAVING_MANUFACTURER_DETAIL="Error Saving Manufacturer Detail" +COM_REDSHOP_MANUFACTURER_DETAIL_DELETED_SUCCESSFULLY="Manufacturer Detail Deleted Successfully" +COM_REDSHOP_MANUFACTURER_DETAIL_PUBLISHED_SUCCESSFULLY="Manufacturer Detail Published Successfully" +COM_REDSHOP_MANUFACTURER_DETAIL_UNPUBLISHED_SUCCESSFULLY="Manufacturer Detail UnPublished Successfully" +COM_REDSHOP_MANUFACTURER_DETAIL_EDITING_CANCELLED="Manufacturer Detail Editing Cancelled" +COM_REDSHOP_MANUFACTURER_DETAIL_COPIED="Manufacturer Detail Copied" +COM_REDSHOP_ERROR_COPING_MANUFACTURER_DETAIL="Error Coping Manufacturer Detail" +COM_REDSHOP_EDIT_MANUFACTURER="Edit manufacturer" +COM_REDSHOP_MANUFACTURER_ITEM_MUST_HAVE_A_NAME="Manufacturer item must have a name" +COM_REDSHOP_SUPPLIER_DETAIL_SAVED="Supplier Detail Saved" +COM_REDSHOP_ERROR_SAVING_SUPPLIER_DETAIL="Error Saving Supplier Detail" +COM_REDSHOP_SUPPLIER_DETAIL_DELETED_SUCCESSFULLY="Supplier Detail Deleted Successfully" +COM_REDSHOP_SUPPLIER_DETAIL_PUBLISHED_SUCCESSFULLY="Supplier Detail Published Successfully" +COM_REDSHOP_SUPPLIER_DETAIL_UNPUBLISHED_SUCCESSFULLY="Supplier Detail UnPublished Successfully" +COM_REDSHOP_SUPPLIER_DETAIL_EDITING_CANCELLED="Supplier Detail Editing Cancelled" +COM_REDSHOP_SUPPLIER_DETAIL_COPIED="Supplier Detail Copied" +COM_REDSHOP_ERROR_COPING_SUPPLIER_DETAIL="Error Coping Supplier Detail" +COM_REDSHOP_SUPPLIER_MANAGEMENT="Supplier Management" +COM_REDSHOP_SUPPLIER_NAME="Name" +COM_REDSHOP_SUPPLIER_NAME_DESC="Enter supplier name" +COM_REDSHOP_EDIT_SUPPLIER="Edit supplier" +COM_REDSHOP_PRICE_DETAIL_SAVED="Price detail saved" +COM_REDSHOP_PRICE_DETAIL_EDITING_CANCELLED="Attribute Price detail editing cancelled" +COM_REDSHOP_CATEGORY_DETAIL_SAVED="Category Details Saved" +COM_REDSHOP_ERROR_SAVING_CATEGORY_DETAIL="Error in saving category detail" +COM_REDSHOP_CATEGORY_DETAIL_DELETED_SUCCESSFULLY="Category deleted successfully" +COM_REDSHOP_CATEGORY_DETAIL_PUBLISHED_SUCCESSFULLY="Category detail published successfully" +COM_REDSHOP_CATEGORY_DETAIL_UNPUBLISHED_SUCCESSFULLY="Category detail unpublished successfully" +COM_REDSHOP_CATEGORY_DETAIL_EDITING_CANCELLED="Category detail editing cancelled" +COM_REDSHOP_CATEGORY_COPIED="Category Copied" +COM_REDSHOP_ERROR_COPING_CATEGORY="Error in category copy" +COM_REDSHOP_CATEGORY_DESCRIPTION="Category Description" +COM_REDSHOP_CATEGORY_ITEM_MUST_HAVE_A_NAME="Category item must have a name" +COM_REDSHOP_PRODUCT_DETAIL_SAVED="Product details saved" +COM_REDSHOP_PRODUCT_DETAIL_DELETED_SUCCESSFULLY="Product deleted successfully" +COM_REDSHOP_PRODUCT_DETAIL_PUBLISHED_SUCCESSFULLY="Product detail published successfully" +COM_REDSHOP_PRODUCT_DETAIL_UNPUBLISHED_SUCCESSFULLY="Product detail unpublished successfully" +COM_REDSHOP_PRODUCT_DETAIL_EDITING_CANCELLED="Product detail editing cancelled" +COM_REDSHOP_ALERT_PRESELECTED_CHECK=""_QQ_"Allow multiple selection of attributes"_QQ_" was not checked, choosing more than one "_QQ_"Preselected"_QQ_" is not allowed" +COM_REDSHOP_CATEGORY_MUST_SELECTED="Category must be selected" +COM_REDSHOP_TEMPLATE_MUST_SELECTED="Template must selected" +COM_REDSHOP_PRODUCT_ITEM_MUST_HAVE_A_NAME="Product item must have a name" +COM_REDSHOP_PRODUCT_ITEM_MUST_HAVE_A_NUMBER="Product item must have a number" +COM_REDSHOP_PRODUCT_NO_EXTRA_FIELD_HINT="

    Heads up!

    No custom fields have been added yet in the current Product Template. To see your Product Custom Fields go to redSHOP Templates and add the Custom Field Tags in the template." +COM_REDSHOP_PROPERTY_MORE_IMAGES_INFORMATION="Property More Images Information" +COM_REDSHOP_PROPERTY_MAIN_IMAGE="Main product image" +COM_REDSHOP_PROPERTY_SUB_IMAGE="Additional images" +COM_REDSHOP_TOOLTIP_PROPERTY_MAIN_IMAGE="Upload a large product image that will be shown under product details when the associated property is selected.." +COM_REDSHOP_TOOLTIP_PROPERTY_SUB_IMAGE="Upload a small product image that will be shown under product details when the associated property is chosen" +COM_REDSHOP_CURREMCY_MUST_HAVE_A_NAME="Currency Must Have a Name" +COM_REDSHOP_CURRENCY_ERROR_DELETE_CURRENCY_SET_IN_CONFIG="This currency has been used in configuration. It is not available for delete." +COM_REDSHOP_WATERMARK_IMAGE_LBL="Watermark" +COM_REDSHOP_WATERMARK_GIFTCARD_IMAGE_LBL="Watermark Gift Card Image" +COM_REDSHOP_WATERMARK_GIFTCARD_THUMB_IMAGE_LBL="Watermark Gift Card Thumb Image" +COM_REDSHOP_CART_RESERVATION_MESSAGE_LBL="Cart Reservation Message" +COM_REDSHOP_GENERAL_CONFIGURATION="General" +COM_REDSHOP_LAYOUT_CONFIGURATION="Layout" +COM_REDSHOP_CONFIG_SAVED="Configuration Saved" +COM_REDSHOP_ERROR_IN_CONFIG_SAVE="Error in saving configuration" +COM_REDSHOP_SHOP_COUNTRY_LBL="Shop Country" +COM_REDSHOP_ACCESSORY_PRODUCT_TITLE_MAX_CHARS_LBL="Enter max. No. Of Characters for Accessory Product Title" +COM_REDSHOP_CLICK_HERE="click here" +COM_REDSHOP_NEWSLETTER_SEND_TO_TEST_EMAIL="A test e-mail has been sent to %s" +COM_REDSHOP_ECONOMIC_NOTE_LBL="NOTICE: If you are using DRAFT features you must finalise invoices from redSHOP or invoice numbers in redSHOP and e-conomic will not match." +COM_REDSHOP_ECONOMIC_AGREEMENT_NUMBER="Agreement Number" +COM_REDSHOP_ECONOMIC_USERNAME="Username" +COM_REDSHOP_ECONOMIC_PASSWORD="Password" +COM_REDSHOP_ADDTOCART_IMAGE_LBL="Add to Cart Image" +COM_REDSHOP_ADDTOCART_BACKGROUND_LBL="Add to Cart Background" +COM_REDSHOP_NO_DATA_DELETE="No Data Delete" +COM_REDSHOP_AVAILABLE_SEO_TAGS="Available SEO Tags" +COM_REDSHOP_TITLE_AVAILABLE_SEO_TAGS="Available Tags for Page Titles" +COM_REDSHOP_DESC_AVAILABLE_SEO_TAGS="Available Tags for Page Descriptions" +COM_REDSHOP_KEYWORD_AVAILABLE_SEO_TAGS="Available Tags for Keywords" +COM_REDSHOP_PRODUCT_SEO_DESC="Product Name" +COM_REDSHOP_MANUFACTURER_SEO_DESC="Manufacturer SEO Description" +COM_REDSHOP_PARENT_CATEGORY_LOOP_SEO_DEC="Parent Category Hierarchy" +COM_REDSHOP_CATEGORY_SEO_DESC="Category Name" +COM_REDSHOP_SALEPRICE_SEO_DESC="Sales Price SEO Description" +COM_REDSHOP_SAVING_SEO_DESC="Total Saving" +COM_REDSHOP_SHOPNAME_SEO_DESC="Shop name" +COM_REDSHOP_PRODUCTSKU_SEO_DESC="Product SKU or Product Number" +COM_REDSHOP_CATEGORY_DEFAULT_IMAGE_LBL="Category default Image" +COM_REDSHOP_PRODUCT_OUTOFSTOCK_IMAGE_LBL="Product Out of Stock Image" +COM_REDSHOP_CONFIG_ECONOMIC_DESCRIPTION_IMG="" +COM_REDSHOP_CONFIG_ECONOMIC_DESCRIPTION="e-conomic is a web based accounting program specifically developed for small or medium sized companies. Since e-conomic is web based you will never have to install bulky software, it is accessible anywhere, you can cooperate with your auditor or external accountant via the internet and you will never have to install new software. e-conomic makes it easy to keep track of your finances and reduces your paperwork." +COM_REDSHOP_PORTAL_SHOP_LBL="Portal Shop" +COM_REDSHOP_DEFAULT_PORTAL_NAME_LBL="Default Portal Name" +COM_REDSHOP_SHOPPER_GROUP_DEFAULT_PRIVATE_LBL="Default Private Shopper Group" +COM_REDSHOP_SHOPPER_GROUP_DEFAULT_COMPANY_LBL="Default Company Shopper Group" +COM_REDSHOP_DEFAULT_PORTAL_LOGO_LBL="Default Portal Logo" +COM_REDSHOP_PRODUCT_EXPIRE_LBL="Enter message you want to give when a product is discontinued" +COM_REDSHOP_ENTER_ECONOMIC_VAT_ACCOUNT_NUMBER="Enter e-conomic VAT Account Number" +COM_REDSHOP_ENTER_ECONOMIC_NON_VAT_ACCOUNT_NUMBER="Enter e-conomic non VAT Account Number" +COM_REDSHOP_ENTER_PRODUCT_GROUP_FOR_SHIPPING="Enter e-conomic Product Group for Shipping (VAT)" +COM_REDSHOP_ENTER_PRODUCT_GROUP_FOR_SHIPPING_NOVAT="Enter e-conomic Product Group for Shipping (Zero VAT)" +COM_REDSHOP_HEADING_AVAILABLE_SEO_TAGS="Available Tags for Headings" +COM_REDSHOP_TOOLTIP_CATALOG_REMAINDER_3="Enter number of days for Third catalogue reminder" +COM_REDSHOP_ECONOMIC_INVOICE_LAYOUTID_VAT_LBL="e-conomic layout group ID" +COM_REDSHOP_CUSTOM_PREVIOUS_LINK="Custom Link to Previous" +COM_REDSHOP_CUSTOM_NEXT_LINK="Custom Link to Next" +COM_REDSHOP_IMAGE_PREVIOUS_LINK="Upload your image for link to previous page" +COM_REDSHOP_IMAGE_NEXT_LINK="Image for link to Next" +COM_REDSHOP_ENABLE_SEF_NUMBER_NAME_LBL="Generate Joomla SEF URL by" +COM_REDSHOP_VOUCHER_DETAIL_SAVED="Voucher details saved" +COM_REDSHOP_ERROR_SAVING_VOUCHER_DETAIL="Error saving voucher details" +COM_REDSHOP_VOUCHER_DETAIL_DELETED_SUCCESSFULLY="Voucher detail deleted successfully" +COM_REDSHOP_VOUCHER_DETAIL_PUBLISHED_SUCCESSFULLY="Voucher detail published successfully" +COM_REDSHOP_VOUCHER_DETAIL_UNPUBLISHED_SUCCESSFULLY="Voucher detail unpublished successfully" +COM_REDSHOP_VOUCHER_DETAIL_EDITING_CANCELLED="Voucher detail editing cancelled" +COM_REDSHOP_VOUCHER_AMOUNT_MUST_FILLED="Voucher amount must be filled" +COM_REDSHOP_VOUCHER_STARTDATE="Start date of voucher" +COM_REDSHOP_VOUCHER_ENDDATE="Voucher End Date" +COM_REDSHOP_GENERAL_USER_INFO="General User Information" +COM_REDSHOP_USER_DETAIL_DELETED_SUCCESSFULLY="User detail deleted successfully" +COM_REDSHOP_USER_DETAIL_SAVED="User detail saved" +COM_REDSHOP_USER_DETAIL_PUBLISHED_SUCCESSFULLY="User detail published successfully" +COM_REDSHOP_USER_DETAIL_UNPUBLISHED_SUCCESSFULLY="User detail unpublished successfully" +COM_REDSHOP_DELETE_SHIPPING_DETAIL="Delete Shipping Information" +COM_REDSHOP_USER_MANAGEMENT="User Management" +COM_REDSHOP_YOUR_MUST_PROVIDE_A_FIRSTNAME="You must provide a first name" +COM_REDSHOP_YOUR_MUST_PROVIDE_A_LASTNAME="You must provide a last name" +COM_REDSHOP_VIEW_IMAGE="View image" +COM_REDSHOP_SELECT_MEDIA_SECTION_FIRST="Select Media section first" +COM_REDSHOP_PLEASE_SELECT_BULK_OPTION="Please select zip upload option" +COM_REDSHOP_YOU_HAVE_SELECTED_NO_OPTION="You have selected 'No', please select 'Yes' option" +COM_REDSHOP_PLEASE_SELECT_MEDIA_TYPE="Please select media type" +COM_REDSHOP_TYPE_SECTION_NAME="Type media section name" +COM_REDSHOP_TYPE_YOUTUBE_VIDEO_ID="Type youtube video id" +COM_REDSHOP_PRIMARY_MEDIA="Primary Media" +COM_REDSHOP_MEDIA_DETAIL_SAVED="Media Detail Saved" +COM_REDSHOP_ERROR_SAVING_MEDIA_DETAIL="Error saving media detail" +COM_REDSHOP_MEDIA_DETAIL_PUBLISHED_SUCCESSFULLY="Media Detail Published Successfully" +COM_REDSHOP_MEDIA_DETAIL_DELETED_SUCCESSFULLY="Media Detail Deleted Successfully" +COM_REDSHOP_MEDIA_DETAIL_UNPUBLISHED_SUCCESSFULLY="Media Detail UnPublished Successfully" +COM_REDSHOP_MEDIA_DETAIL_EDITING_CANCELLED="Media Detail Editing Cancelled" +COM_REDSHOP_PLEASE_SELECT_NO="For current file extension please select upload as Uncompressed file" +COM_REDSHOP_PLEASE_CHECK_DIRECTORY_PERMISSION="Please Check Directory Permission" +COM_REDSHOP_MEDIA_MANAGEMENT="Media Management" +COM_REDSHOP_MAIL_DETAIL_EDITING_CANCELLED="Mail template editing cancelled" +COM_REDSHOP_MAIL_DETAIL_SAVED="Mail template saved" +COM_REDSHOP_MAIL_DETAIL_PUBLISHED_SUCCESSFULLY="Mail template published successfully" +COM_REDSHOP_MAIL_DETAIL_UNPUBLISHED_SUCCESSFULLY="Mail template unpublished successfully" +COM_REDSHOP_MAIL_DETAIL_DELETED_SUCCESSFULLY="Mail template deleted successfully" +COM_REDSHOP_DISCOUNT_AMOUNT_MUST_FILLED="Please Enter Discount Amount." +COM_REDSHOP_AMOUNT_MUST_FILLED="Please Enter Amount" +COM_REDSHOP_SHOPPER_GROUP_MUST_BE_SELECTED="Shopper Group must be selected." +COM_REDSHOP_TAGS_USAGE="Tag Use" +COM_REDSHOP_TAGS_PRODUCTS="Products" +COM_REDSHOP_TAGS_USERS="Users" +COM_REDSHOP_TAGS_POPULARITY="Popularity" +COM_REDSHOP_TAGS_DETAIL_SAVED="Tags Detail Saved" +COM_REDSHOP_ERROR_SAVING_TAGS_DETAIL="Error Saving Tags Detail" +COM_REDSHOP_TAGS_DETAIL_DELETED_SUCCESSFULLY="Tags Detail Deleted Successfully" +COM_REDSHOP_TAGS_DETAIL_PUBLISHED_SUCCESSFULLY="Tags Detail Published Successfully" +COM_REDSHOP_TAGS_DETAIL_UNPUBLISHED_SUCCESSFULLY="Tags Detail UnPublished Successfully" +COM_REDSHOP_TAGS_DETAIL_EDITING_CANCELLED="Tags Detail Editing Cancelled" +COM_REDSHOP_RATING_DETAIL_SAVED="Rating details saved" +COM_REDSHOP_ERROR_SAVING_RATING_DETAIL="You can not rate/review the same product again" +COM_REDSHOP_RATING_DETAIL_DELETED_SUCCESSFULLY="Rating detail deleted successfully" +COM_REDSHOP_RATING_DETAIL_PUBLISHED_SUCCESFULLY="Rating detail published successfully" +COM_REDSHOP_RATING_DETAIL_UNPUBLISHED_SUCCESFULLY="Rating detail unpublished successfully" +COM_REDSHOP_RATING_DETAIL_EDITING_CANCELLED="Rating detail editing cancelled" +COM_REDSHOP_RATING_DATE="Date" +COM_REDSHOP_RATING_USERNAME="Author's name" +COM_REDSHOP_RATING_COMMENT_MUST_BE_FILLED="Rating comment must be filled" +COM_REDSHOP_RATING_MUST_SELECT_USER="Please select user" +COM_REDSHOP_RATING_MUST_SELECT_PRODUCT="Please select product" +COM_REDSHOP_NEWSLETTER_DETAIL_SAVED="Newsletter detail saved" +COM_REDSHOP_ERROR_SAVING_NEWSLETTER_DETAIL="Error saving newsletter details" +COM_REDSHOP_NEWSLETTER_DETAIL_DELETED_SUCCESSFULLY="Newsletter deleted successfully" +COM_REDSHOP_NEWSLETTER_DETAIL_UNPUBLISHED_SUCCESFULLY="Newsletter detail unpublished successfully" +COM_REDSHOP_NEWSLETTER_DETAIL_EDITING_CANCELLED="Newsletter detail editing cancelled" +COM_REDSHOP_NEWSLETTER_ITEM_MUST_HAVE_A_NAME="Newsletter must have a name" +COM_REDSHOP_NEWSLETTER_DETAIL_PUBLISHED_SUCCESFULLY="Newsletter detail published successfully" +COM_REDSHOP_EDIT_NEWSLETTER="Edit Newsletter" +COM_REDSHOP_NEWSLETTER_NAME="Newsletter Name" +COM_REDSHOP_NO_SUBSCRIBERS="No. of Subscribers" +COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_SAVED="Newsletter Subscriber Detail saved" +COM_REDSHOP_ERROR_SAVING_NEWSLETTER_SUBSCR_DETAIL="Error saving Newsletter subscriber detail" +COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_DELETED_SUCCESSFULLY="Newsletter subscriber deleted successfully" +COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_PUBLISHED_SUCCESFULLY="Newsletter subscriber published successfully" +COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_UNPUBLISHED_SUCCESFULLY="Newsletter subscriber unpublished successfully" +COM_REDSHOP_NEWSLETTER_SUBSCR_DETAIL_EDITING_CANCELLED="Newsletter subscriber editing cancel" +COM_REDSHOP_NEWSLETTER_USERNAME="Username for subscriber" +COM_REDSHOP_NEWSLETTER_SUB="Newsletter Subject" +COM_REDSHOP_NEWSLETTER_SUBSCR_SELECT_USER="Must select user" +COM_REDSHOP_COUPON_DETAIL_SAVED="Coupon detail saved" +COM_REDSHOP_ERROR_SAVING_COUPON_DETAIL="Error saving coupon detail" +COM_REDSHOP_COUPON_DETAIL_DELETED_SUCCESSFULLY="Coupon deleted successfully" +COM_REDSHOP_COUPON_DETAIL_PUBLISHED_SUCCESFULLY="Coupon detail published successfully" +COM_REDSHOP_COUPON_DETAIL_UNPUBLISHED_SUCCESFULLY="Coupon detail unpublished successfully" +COM_REDSHOP_COUPON_DETAIL_EDITING_CANCELLED="Coupon editing cancelled" +COM_REDSHOP_COUPON_USERNAME="Username" +COM_REDSHOP_YOU_MUST_LINK_COUPON_TO_USER="You must link coupon to user" +COM_REDSHOP_ORDERSTATUS_DETAIL_EDITING_CANCELLED="Order Status Detail Editing Cancelled" +COM_REDSHOP_ORDERSTATUS_DETAIL_SAVED="Order Status Detail Saved" +COM_REDSHOP_ORDERSTATUS_DETAIL_PUBLISHED_SUCCESSFULLY="Order Status Detail Published Successfully" +COM_REDSHOP_ORDERSTATUS_DETAIL_UNPUBLISHED_SUCCESSFULLY="Order Status Detail UnPublished Successfully" +COM_REDSHOP_ORDERSTATUS_DETAIL_DELETED_SUCCESSFULLY="Order Status Detail Deleted Successfully" +COM_REDSHOP_SHOPPER_GROUP_DETAIL_EDITING_CANCELLED="Shopper Group Detail Editing Cancelled" +COM_REDSHOP_SHOPPER_GROUP_DETAIL_PUBLISHED_SUCCESSFULLY="Shopper Group Detail Published Successfully" +COM_REDSHOP_SHOPPER_GROUP_DETAIL_UNPUBLISHED_SUCCESSFULLY="Shopper Group Detail Unpublished Successfully" +COM_REDSHOP_SHOPPER_GROUP_DETAIL_SAVED="Shopper Group Detail Saved" +COM_REDSHOP_SHOPPER_GROUP_DETAIL_DELETED_SUCCESSFULLY="Shopper Group Detail Deleted Successfully" +COM_REDSHOP_DEFAULT_SHOPPER_GROUP_CAN_NOT_BE_DELETED="Shopper Group can not be deleted." +COM_REDSHOP_SHOPPER_GROUP_DEFAULT_TAX_EXEMPT_LBL="Default Tax Exempt Shopper Group" +COM_REDSHOP_PRODUCT_SKU="Product SKU" +COM_REDSHOP_ERROR_SAVING_PRICE_DETAIL="Error Saving Price detail." +COM_REDSHOP_ERROR_SAVING_PRICE_QUNTITY_DETAIL="Quantity End should be greater than Quantity start." +COM_REDSHOP_TAX_DETAIL_EDITING_CANCELLED="VAT rate detail editing cancelled" +COM_REDSHOP_TAX_DETAIL_SAVED="VAT rate detail saved successfully" +COM_REDSHOP_TAX_DETAIL_DELETED_SUCCESSFULLY="VAT rate detail deleted successfully" +COM_REDSHOP_TAX_RATE_MUST_HAVE_VALUE="Vat rate must have value." +COM_REDSHOP_ENTER_SAMPLE_NAME="Enter sample name" +COM_REDSHOP_REMINDER_1="Reminder 1" +COM_REDSHOP_REMINDER_2="Reminder 2" +COM_REDSHOP_REMINDER_3="Reminder 3" +COM_REDSHOP_CATALOG_DETAIL_SAVED="Catalogue detail saved" +COM_REDSHOP_ERROR_SAVING_CATALOG_DETAIL="Error saving catalogue detail" +COM_REDSHOP_CATALOG_DETAIL_DELETED_SUCCESSFULLY="Catalogue detail deleted successfully" +COM_REDSHOP_CATALOG_DETAIL_PUBLISHED_SUCCESFULLY="Catalogue detail published successfully" +COM_REDSHOP_CATALOG_DETAIL_UNPUBLISHED_SUCCESFULLY="Catalogue detail unpublished successfully" +COM_REDSHOP_CATALOG_DETAIL_EDITING_CANCELLED="Catalogue detail editing cancelled" +COM_REDSHOP_SAMPLE_DETAIL_SAVED="Product Sample detail saved" +COM_REDSHOP_ERROR_SAVING_SAMPLE_DETAIL="Error saving Product Sample detail" +COM_REDSHOP_SAMPLE_DETAIL_DELETED_SUCCESSFULLY="Product Sample detail deleted successfully" +COM_REDSHOP_SAMPLE_DETAIL_PUBLISHED_SUCCESFULLY="Product Sample detail published successfully" +COM_REDSHOP_SAMPLE_DETAIL_UNPUBLISHED_SUCCESFULLY="Product Sample detail unpublished successfully" +COM_REDSHOP_SAMPLE_DETAIL_EDITING_CANCELLED="Product Sample detail editing cancelled" +COM_REDSHOP_SHIPPING_METHOD_MUST_HAVE_A_NAME="Shipping Method Must Have a Name." +COM_REDSHOP_SHIPPING_RATE_NAME_MUST_HAVE_A_NAME="Shipping Rate Name Must Have a Name." +COM_REDSHOP_SHIPPING_LOCATION_NAME_MUST_HAVE_A_NAME="Shipping location name must have a name." +COM_REDSHOP_SHIPPING_RATE_ORDERTOTAL_END_MUST_MORE="Oder Total End Must More Than Oder Total Start." +COM_REDSHOP_SHIPPING_RATE_ZIP_END_MUST_MORE="Zip Code End Must More Than Zip Code Start." +COM_REDSHOP_SHIPPING_RATE_SAVED="Shipping rate saved" +COM_REDSHOP_REGISTRATORDATE="Registration Date" +COM_REDSHOP_BLOCK="Block" +COM_REDSHOP_ORDER_DETAIL_SAVED="Order detail saved" +COM_REDSHOP_ERROR_SAVING_ORDER_DETAIL="Error saving order details" +COM_REDSHOP_ORDER_DETAIL_DELETED_SUCCESSFULLY="Order detail deleted successfully" +COM_REDSHOP_ORDER_DETAIL_EDITING_CANCELLED="Order detail editing cancelled" +COM_REDSHOP_ALPHABETICALLY="Alphabetically" +COM_REDSHOP_CSV_COLUMN_SEPARATOR_NOT_NULL="Please, Insert column separator to import CSV." +COM_REDSHOP_YOU_MUST_PROVIDE_LOGIN_NAME="You must provide a user login name." +COM_REDSHOP_PROVIDE_EMAIL_ADDRESS="You must provide an email address." +COM_REDSHOP_USERNAME_ALREADY_EXISTS="Username already exists" +COM_REDSHOP_USERNAME_NOT_AVAILABLE="Username is not available." +COM_REDSHOP_USERNAME_IS_AVAILABLE="Username is available." +COM_REDSHOP_EMAIL_NOT_AVAILABLE="Email address is not available." +COM_REDSHOP_EMAIL_INVALID="Email address is invalid." +COM_REDSHOP_PASSWORD_NOT_MATCH="Password not match" +COM_REDSHOP_OLDEST="Oldest" +COM_REDSHOP_STANDARD_LOGOUT="Standard Layout" +COM_REDSHOP_TAX_GROUP_MUST_HAVE_VALUE="VAT Group name must have value" +COM_REDSHOP_TAX_GROUP_DETAIL_SAVED="VAT Group Detail saved" +COM_REDSHOP_ERROR_SAVING_TAX_GROUP_DETAIL="Error in saving tax group detail" +COM_REDSHOP_DEFAULT_VAT_GROUP_CAN_NOT_BE_DELETED="Default VAT Group can not be deleted." +COM_REDSHOP_TAX_GROUP_DETAIL_DELETED_SUCCESSFULLY="VAT Group detail deleted successfully" +COM_REDSHOP_TAX_GROUP_DETAIL_PUBLISHED_SUCCESFULLY="VAT Group detail published successfully" +COM_REDSHOP_TAX_GROUP_DETAIL_UNPUBLISHED_SUCCESFULLY="VAT Group detail unpublished successfully" +COM_REDSHOP_TAX_GROUP_DETAIL_EDITING_CANCELLED="VAT Group detail editing cancelled" +COM_REDSHOP_ATTRIBUTE_PRICE_DETAIL_DELETED_SUCCESSFULLY="Attribute Price detail deleted successfully" +COM_REDSHOP_WRAPPER_DETAIL_EDITING_CANCELLED="Wrapping detail editing cancelled" +COM_REDSHOP_WRAPPER_DETAIL_DELETED_SUCCESSFULLY="Wrapping detail deleted successfully" +COM_REDSHOP_ERROR_SAVING_WRAPPER_DETAIL="Error Saving in wrapping detail" +COM_REDSHOP_WRAPPER_DETAIL_SAVED="Wrapping detail saved" +COM_REDSHOP_WRAPPER_PUBLISHED_SUCCESSFULLY="Wrapping published successfully" +COM_REDSHOP_WRAPPER_UNPUBLISHED_SUCCESSFULLY="Wrapping unpublished successfully" +COM_REDSHOP_USE_TO_ALL_ENABLE_SUCCESSFULLY="Wrapping use to all product enable successfully" +COM_REDSHOP_USE_TO_ALL_DISABLE_SUCCESSFULLY="Wrapping use to all product disable successfully" +COM_REDSHOP_AUTO_SCROLL_FOR_WRAPPER_LBL="Auto scroll for wrapping" +COM_REDSHOP_SHOW_CART_TEXT="Cart Redirection" +COM_REDSHOP_COUNTRY_DETAIL_EDITING_CANCELLED="Country detail editing cancelled" +COM_REDSHOP_COUNTRY_DETAIL_SAVED="Country detail saved" +COM_REDSHOP_COUNTRY_MUST_HAVE_A_NAME="Country Must Have a Name" +COM_REDSHOP_COUNTRY_3_CODE_MUST_HAVE_A_VALUE="3-Digit Country Code Must Have a Value" +COM_REDSHOP_COUNTRY_3_CODE_MUST_HAVE_A_3_DIGIT_CODE="Country Must Have 3-digit Country code" +COM_REDSHOP_COUNTRY_2_CODE_MUST_HAVE_A_VALUE="2-Digit Country Code Must Have a Value" +COM_REDSHOP_COUNTRY_2_CODE_MUST_HAVE_A_2_DIGIT_CODE="Country Must Have 2-digit Country code" +COM_REDSHOP_STATE_DETAIL_EDITING_CANCELLED="State detail editing cancelled" +COM_REDSHOP_STATE_DETAIL_SAVED="State detail saved" +COM_REDSHOP_COUNTRY_MUST_BE_SELECTED="Country Must be selected" +COM_REDSHOP_ERROR_SAVING_IN_STATE_DETAIL="Error Saving in State Detail" +COM_REDSHOP_STATE_MUST_HAVE_A_NAME="State Must Have Name" +COM_REDSHOP_STATE_MUST_HAVE_A_3_DIGIT_CODE="State Must Have 3-digit State code" +COM_REDSHOP_STATE_MUST_HAVE_A_2_DIGIT_CODE="State Must Have 2-digit State code" +COM_REDSHOP_STATE_3_CODE_MUST_HAVE_A_VALUE="3-Digit State Code Must Have a Value" +COM_REDSHOP_STATE_2_CODE_MUST_HAVE_A_VALUE="2-Digit State Code Must Have a Value" +COM_REDSHOP_STATE_MANAGEMENT="State Management" +COM_REDSHOP_GIFTCARD_MUST_HAVE_A_NAME="Gift Card must have a name." +COM_REDSHOP_GIFTCARD_MUST_HAVE_A_VALIDATE_PERIOD="Gift Card must have a validity period." +COM_REDSHOP_GIFTCARD_SAVED="Gift Card Saved." +COM_REDSHOP_ERROR_SAVING_GIFTCARD="Error in Saving Gift Card." +COM_REDSHOP_GIFTCARD_COPIED="Gift Card copied" +COM_REDSHOP_ERROR_COPYING_GIFTCARD="Error in coping Gift Card." +COM_REDSHOP_URL_AFTER_PORTAL_LOGIN="URL After Portal Login" +COM_REDSHOP_URL_AFTER_PORTAL_LOGOUT="URL After Portal Logout" +COM_REDSHOP_ENTER_ECONOMIC_DISCOUNT_PRODUCT_NUMBER="Enter e-conomic Discount Product Number" +COM_REDSHOP_SHIP_FROM_ZIPCODE_TOOLTIP="Enter a zip code to override the Vendor ship from zip code" +COM_REDSHOP_SHIP_FROM_ZIPCODE="Ship From Zip Code" +COM_REDSHOP_SHIPPING_METHOD_LBL_TOOLTIP="A percent of the base charge for each method is added for extra fuel charges. Leave blank or zero to remove the surcharge" +COM_REDSHOP_EMPTY_USERNAME="No username typed in - please try again" +COM_REDSHOP_EMPTY_EMAIL="No e-mail typed in - please try again" +COM_REDSHOP_PLEASE_ENTER_USERNAME="Please enter username" +COM_REDSHOP_PLEASE_ENTER_COMPANY_NAME="Please enter company name" +COM_REDSHOP_DAFULT_PREVIOUS_PREFIX_LBL="Prefix for Default text link to Previous" +COM_REDSHOP_DAFULT_NEXT_SUFFIX_LBL="Suffix for Default text Link to Next" +COM_REDSHOP_RETURN_TO_CATEGORY_PREFIX="Prefix for Return to Category" +COM_REDSHOP_EDIT_STOCKIMAGE="Edit Stock Amount Image" +COM_REDSHOP_STOCKIMAGE_MANAGEMENT="Stock Image Management" +COM_REDSHOP_STOCKIMAGE_TOOLTIP_MUST_HAVE_A_NAME="Stock Image must have tooltip" +COM_REDSHOP_STOCKIMAGE_OPTION_MUST_HAVE_VALUE="Stock Image must have option" +COM_REDSHOP_STOCKIMAGE_QUANTITY_MUST_HAVE_VALUE="Stock Image must have quantity" +COM_REDSHOP_STOCKIMAGE_DETAIL_SAVED="Stock Amount Image saved" +COM_REDSHOP_ERROR_SAVING_STOCKIMAGE_DETAIL="Error in saving stock image detail" +COM_REDSHOP_STOCKIMAGE_DETAIL_DELETED_SUCCESSFULLY="Stock Image detail deleted successfully" +COM_REDSHOP_STOCKIMAGE_DETAIL_EDITING_CANCELLED="Stock Image detail editing cancelled" +COM_REDSHOP_SHIPPING_LOCATION_SAVED="Shipping Location saved" +COM_REDSHOP_ERROR_SAVING_SHIPPING="Error saving shipping" +COM_REDSHOP_ADDITIONAL_FILES="Additional Files" +COM_REDSHOP_ATTRIBUTE_SET_NAME="Attribute Set Name" +COM_REDSHOP_ATTRIBUTE_SET_EDITING_CANCELLED="Attribute set editing cancelled" +COM_REDSHOP_ATTRIBUTE_SET_UNPUBLISHED_SUCCESSFULLY="Attribute set unpublished successfully" +COM_REDSHOP_ATTRIBUTE_SET_PUBLISHED_SUCCESSFULLY="Attribute set published successfully" +COM_REDSHOP_ATTRIBUTE_SET_DELETED_SUCCESSFULLY="Attribute set deleted successfully" +COM_REDSHOP_TOOLTIP_ATTRIBUTE_SET_NAME="Tooltip Attribute Set Name" +COM_REDSHOP_ATTRIBUTE_SET_INFORMATION="Attribute Set Information" +COM_REDSHOP_ATTRIBUTE_SET_DETAIL_SAVED="Attribute set saved" +COM_REDSHOP_ATTRIBUTE_SET_COPIED="Attribute set copied suscessfully" +COM_REDSHOP_ERROR_COPY_ATTRIBUTE_SET="There was error during copying attribute set" +COM_REDSHOP_UNIT_DECIMAL_LBL="No. of Decimals" +COM_REDSHOP_PRIORITY="Priority" +COM_REDSHOP_LENGTH="Length" +COM_REDSHOP_BOX_MUST_HAVE_A_NAME="Box Must Have a Name" +COM_REDSHOP_YOU_MUST_HAVE_A_BOX_LENGTH="Your box must have a length" +COM_REDSHOP_YOU_MUST_HAVE_A_BOX_WIDTH="Your box must have a width" +COM_REDSHOP_YOU_MUST_HAVE_A_BOX_HEIGHT="Your box must have a height" +COM_REDSHOP_SHIPPING_BOX_SAVED="Shipping Box Saved" +COM_REDSHOP_ERROR_SAVING_BOX="Error Saving Box" +COM_REDSHOP_QUOTATION_ID="ID" +COM_REDSHOP_QUOTATION_DETAIL_SAVED="Quotation detail saved" +COM_REDSHOP_PASSWORDS_DO_NOT_MATCH="Passwords do not match" +COM_REDSHOP_ERROR_SAVING_QUOTATION_DETAIL="Error saving quote detail" +COM_REDSHOP_QUOTATION_DETAIL_SENT="Quotation detail has been sent successfully" +COM_REDSHOP_QUOTATION_DETAIL_DELETED_SUCCESSFULLY="Quotation detail deleted successfully" +COM_REDSHOP_QUOTATION_DETAIL_EDITING_CANCELLED="Quotation detail editing cancelled" +COM_REDSHOP_QUOTATION_DISCOUNT_LBL="Quotation Discount" +COM_REDSHOP_QUOTATION_ITEM_DETAIL_DELETED_SUCCESSFULLY="Quotation item detail has been deleted" +COM_REDSHOP_ANSWER_DETAIL_SAVED="Answer Detail Saved Successfully" +COM_REDSHOP_ERROR_SAVING_ANSWER_DETAIL="Error in Saving Answer Detail" +COM_REDSHOP_ANSWER_DETAIL_DELETED_SUCCESSFULLY="Answer Detail Deleted Successfully" +COM_REDSHOP_ANSWER_DETAIL_EDITING_CANCELLED="Answer Detail Editing Cancelled" +COM_REDSHOP_ANSWER_DETAIL_PUBLISHED_SUCCESSFULLY="Answer Detail Published Successfully" +COM_REDSHOP_ANSWER_DETAIL_UNPUBLISHED_SUCCESSFULLY="Answer Detail Unpublished Successfully" +COM_REDSHOP_QUESTION_DETAIL_SAVED="Question Detail Saved" +COM_REDSHOP_ERROR_SAVING_QUESTION_DETAIL="Error in Saving Question Detail" +COM_REDSHOP_QUESTION_DETAIL_DELETED_SUCCESSFULLY="Question Detail Deleted Successfully" +COM_REDSHOP_QUESTION_DETAIL_EDITING_CANCELLED="Question Detail Editing Cancelled" +COM_REDSHOP_QUESTION_DETAIL_PUBLISHED_SUCCESSFULLY="Question Detail Published Successfully" +COM_REDSHOP_QUESTION_DETAIL_UNPUBLISHED_SUCCESSFULLY="Question Detail Unpublished Successfully" +COM_REDSHOP_PLEASE_SELECT_PRODUCT_NAME="Please Select Product Name" +COM_REDSHOP_REMOVE_CATEGORY="Remove Category" +COM_REDSHOP_ASSIGN_CATEGORY="Assign new Category" +COM_REDSHOP_PRE_ORDER_IMAGE_LBL="Pre-order Image" +COM_REDSHOP_XMLIMPORT_FILENAME="Filename" +COM_REDSHOP_XMLEXPORT_FILENAME="Filename" +COM_REDSHOP_XMLIMPORT_DATE="File Import Date" +COM_REDSHOP_XMLEXPORT_DATE="File Export Date" +COM_REDSHOP_XMLIMPORT_DETAIL_SAVED="XML Import detail saved" +COM_REDSHOP_ERROR_SAVING_XMLIMPORT_DETAIL="Error saving in XML import detail" +COM_REDSHOP_XMLIMPORT_DETAIL_DELETED_SUCCESSFULLY="XML import detail has been deleted successfully" +COM_REDSHOP_XMLEXPORT_DETAIL_SAVED="XML Export detail saved" +COM_REDSHOP_ERROR_SAVING_XMLEXPORT_DETAIL="Error saving in XML export detail" +COM_REDSHOP_XMLEXPORT_DETAIL_DELETED_SUCCESSFULLY="XML export detail has been deleted successfully" +COM_REDSHOP_XMLIMPORT_DETAIL_EDITING_CANCELLED="XML import detail editing cancelled" +COM_REDSHOP_XMLEXPORT_DETAIL_EDITING_CANCELLED="XML export detail editing cancelled" +COM_REDSHOP_PLEASE_ENTER_XMLEXPORT_FILE_NAME="Please enter XML Export file name" +COM_REDSHOP_PLEASE_ENTER_XMLIMPORT_FILE_NAME="Please enter XML Import file name" +COM_REDSHOP_PLEASE_SELECT_XMLEXPORT_SECTION_TYPE="Please select XML Export section" +COM_REDSHOP_SELECT_AN_ITEM_TO_AUTO_SYNCHRONIZE="Select an item to auto-synchronise" +COM_REDSHOP_PLEASE_ENTER_XMLIMPORT_URL_OR_UPLOAD_XMLFILE="Please enter XML import URL or upload XML file" +COM_REDSHOP_DUPLICATE_FIELDNAME="Duplication of Field name not allowed" +COM_REDSHOP_SELECT_FIELDNAME="Please select field name" +COM_REDSHOP_AUTO_SYNCHRONIZE_ENABLE_SUCCESSFULLY="Auto synchronise enable successfully" +COM_REDSHOP_AUTO_SYNCHRONIZE_DISABLE_SUCCESSFULLY="Auto synchronise disable successfully" +COM_REDSHOP_XMLEXPORT_FILE_SUCCESSFULLY_SYNCHRONIZED="XML Export file has been successfully synchronised" +COM_REDSHOP_ERROR_XMLEXPORT_FILE_SYNCHRONIZED="Error in synchronisation of XML Export file" +COM_REDSHOP_XMLIMPORT_FILE_SUCCESSFULLY_SYNCHRONIZED="XML Import file has been successfully synchronised" +COM_REDSHOP_ERROR_XMLIMPORT_FILE_SYNCHRONIZED="Error in synchronisation of XML Import file" +COM_REDSHOP_PLEASE_ENTER_XMLEXPORT_PARENT_NAME="Please enter XML Export Parent name" +COM_REDSHOP_XMLEXPORT_UNPUBLISHED_SUCCESSFULLY="XML Export unpublished successfully" +COM_REDSHOP_XMLEXPORT_PUBLISHED_SUCCESSFULLY="XML Export published successfully" +COM_REDSHOP_XMLIMPORT_UNPUBLISHED_SUCCESSFULLY="XML Import unpublished successfully" +COM_REDSHOP_XMLIMPORT_PUBLISHED_SUCCESSFULLY="XML Import published successfully" +COM_REDSHOP_SELECT_AN_ITEM_TO_USE_EXPORTFILE_TO_ALL="Select an item to use export file to all users" +COM_REDSHOP_EXPORTFILE_USE_TO_ALL_ENABLE_SUCCESSFULLY="Export file use to all users enable successfully" +COM_REDSHOP_EXPORTFILE_USE_TO_ALL_DISABLE_SUCCESSFULLY="Export file use to all users disable successfully" +COM_REDSHOP_USE_TO_ALL_USERS="XML file use to all users" +COM_REDSHOP_ADDITIONAL_HOVER_IMAGE_ENABLE_LBL="Enable Additional Hover Image" +COM_REDSHOP_NEWSLETTER_MAIL_BATCHES_SENT_AT_ONE_TIME_LBL="No. of Mails in Batch" +COM_REDSHOP_TOOLTIP_NEWSLETTER_MAIL_BATCHES_SENT_AT_ONE_TIME_LBL="Enter the number of newsletter mails that should be sent at a time." +COM_REDSHOP_PAUSE_SECONDS_EVERY_AMOUNT_OF_EMAILS_LBL="Pause Between Batches (in seconds)" +COM_REDSHOP_TOOLTIP_PAUSE_SECONDS_EVERY_AMOUNT_OF_EMAILS_LBL="Enter how many seconds the redSHOP should wait after each batch before sending the next." +COM_REDSHOP_DEFAULT_SHOPPER_GROUP_SHIPPING="Default Shopper Group Shipping" +COM_REDSHOP_TRANSACTION_APPROVED="This transaction has been approved." +COM_REDSHOP_TRANSACTION_DECLINE="This transaction has been declined." +COM_REDSHOP_CATEGORY_SHORT_DESCRIPTION="Category short description" +COM_REDSHOP_PRODUCT_SHORT_DESCRIPTION="Product short description" +COM_REDSHOP_CODE_IS_ALREADY_IN_USE="Discount code is already in use." +COM_REDSHOP_SHOW_REGISTER_EMAIL_VERIFICATION="Email verification" +COM_REDSHOP_ACCOUNTGROUP_DETAIL_EDITING_CANCELLED="e-conomic Product group detail editing cancelled" +COM_REDSHOP_ACCOUNTGROUP_DETAIL_SAVED="e-conomic Product group detail saved" +COM_REDSHOP_ACCOUNTGROUP_DETAIL_UNPUBLISHED_SUCCESSFULLY="e-conomic Product group detail unpublished successfully" +COM_REDSHOP_ACCOUNTGROUP_DETAIL_PUBLISHED_SUCCESSFULLY="e-conomic Product group detail published successfully" +COM_REDSHOP_ACCOUNTGROUP_MUST_HAVE_A_NAME="e-conomic product group must have a name" +COM_REDSHOP_ERROR_SAVING_ACCOUNTGROUP_DETAIL="Error saving e-conomic product group detail" +COM_REDSHOP_ACCOUNTGROUP_DETAIL_DELETED_SUCCESSFULLY="e-conomic Product group detail deleted successfully" +COM_REDSHOP_ANSWER_MAIL_SENT="Answer sent." +COM_REDSHOP_WITHOUT_VAT_TEXT_INFO_LBL="Intro text (with VAT)" +COM_REDSHOP_WITH_VAT_TEXT_INFO_LBL="Intro text (without VAT)" + +COM_REDSHOP_PRICE_TAB="Price" +COM_REDSHOP_CART_TAB="Cart / Checkout" +COM_REDSHOP_PRODUCT_NAME_ASC="Product name, ascending" +COM_REDSHOP_PRODUCT_NAME_DESC="Product Name, descending" +COM_REDSHOP_PRODUCT_PRICE_ASC="Price, ascending" +COM_REDSHOP_PRODUCT_PRICE_DESC="Price, descending" +COM_REDSHOP_PRODUCT_NUMBER_ASC="Product number, ascending" +COM_REDSHOP_PRODUCT_NUMBER_DESC="Product number, descending" +COM_REDSHOP_PRODUCT_ID_ASC="Product ID Asc." +COM_REDSHOP_PRODUCT_ID_DESC="Product ID Desc" +COM_REDSHOP_ACCESSORY_ID_ASC="Accessory ID Asc" +COM_REDSHOP_ACCESSORY_ID_DESC="Accessory ID Desc" +COM_REDSHOP_ACCESSORY_PRICE_ASC="Accessory Price Asc" +COM_REDSHOP_ACCESSORY_PRICE_DESC="Accessory Price Desc" +COM_REDSHOP_ORDERING_ASC="Ordering Asc" +COM_REDSHOP_ORDERING_DESC="Ordering Desc" +COM_REDSHOP_ADD_TERMS_AND_CONDITIONS_LBL="Add terms and conditions" +COM_REDSHOP_VAT_INTRO_TEXT="Enter your default VAT country and state:" +COM_REDSHOP_VAT_DISCOUNT_INTRO_TEXT="Select if you want VAT applied on discounts:" +COM_REDSHOP_VAT_RATES_INTRO_TEXT="Enter VAT rates:" +COM_REDSHOP_ADD_VAT_RATES_LBL="Add VAT Rates" +COM_REDSHOP_TOOLTIP_ADD_VAT_RATES_LBL="Add VAT rate for a country/state." +COM_REDSHOP_ACCESS_LEVEL_SAVED="Access Level Saved." +COM_REDSHOP_ERROR_ACCESS_LEVEL_SAVED="Error in access level saved." +COM_REDSHOP_ACCESS_LEVEL_CANCEL="Access Level Cancelled." +COM_REDSHOP_ABOUT="About" +COM_REDSHOP_BACKWARD_COMPATIBLE="Backward compatible" +COM_REDSHOP_BACKWARD_COMPATIBLE_JS_SCRIPT="Javascript backward compatible" +COM_REDSHOP_BACKWARD_COMPATIBLE_JS_SCRIPT_TOOLTIP="Enable load JS backward compatible for defined variables." +COM_REDSHOP_BACKWARD_COMPATIBLE_PHP_SCRIPT="PHP code backward compatible" +COM_REDSHOP_BACKWARD_COMPATIBLE_PHP_SCRIPT_TOOLTIP="Enable load PHP class for backward compatible." +COM_REDSHOP_SELECT_ECONOMIC_ACCOUNTING_GROUP="Select e-conomic Product Group" +COM_REDSHOP_INVOICE_NOT_BOOKED_IN_ECONOMIC="Invoice not booked in e-conomic" +COM_REDSHOP_SUCCESSFULLY_BOOKED_INVOICE_IN_ECONOMIC="Successfully booked invoice in e-conomic" +COM_REDSHOP_ENTER_PRODUCT_GROUP_FOR_DISCOUNT_NOVAT="Enter Non vat Account for Discount" +COM_REDSHOP_ORDER_STATUS_SUCCESSFULLY_SAVED_FOR_ORDER_ID="Order Status Successfully Saved For Order Number" +COM_REDSHOP_ORDER_STAUS_FAIL_DELETE="Order Status can't be delete because it used somewhere" +COM_REDSHOP_DASHBOARD="Dashboard" +COM_REDSHOP_DISPLAY_NEW_CUSTOMERS_LBL="Display Newest Customers" +COM_REDSHOP_DISPLAY_ORDERS_LBL="Display Newest Orders" +COM_REDSHOP_DASHBORAD_CONFIGURATION="Configure Dashboard" +COM_REDSHOP_AJAX_CART_DISPLAY_TIME_LBL="Ajax Cart Display Time" +COM_REDSHOP_PAYMENT_CALCULATION_ON_LBL="Payment Calculation based on" +COM_REDSHOP_ORDER_ID_LBL="Order ID" +COM_REDSHOP_ORDER_NUMBER_LBL="Order Number" +COM_REDSHOP_ORDER_DATE_LBL="Order Date" +COM_REDSHOP_ORDER_STAUS_LBL="Order Status" +COM_REDSHOP_ORDER_INFORMATION_LBL="Order Information" +COM_REDSHOP_BILLING_ADDRESS_INFORMATION_LBL="Billing Address Information" +COM_REDSHOP_SHIPPING_ADDRESS_INFO_LBL="Shipping Address Information" +COM_REDSHOP_ORDER_DETAIL_LBL="Order Details" +COM_REDSHOP_PRODUCT_NAME_LBL="Product Name" +COM_REDSHOP_NOTE_LBL="Note" +COM_REDSHOP_PRICE_LBL="Price" +COM_REDSHOP_QUANTITY_LBL="Quantity" +COM_REDSHOP_TOTAL_PRICE_LBL="Total Price" +COM_REDSHOP_ORDER_SUBTOTAL_LBL="Order Subtotal" +COM_REDSHOP_CART_LBL="Shopping Cart" +COM_REDSHOP_CUSTOMER_NOTE_LBL="Customer Note" +COM_REDSHOP_CHECKOUT_VAT_LBL="Vat :" +COM_REDSHOP_CHECKOUT_DISCOUNT_LBL="Discount :" +COM_REDSHOP_CHECKOUT_SHIPPING_LBL="Shipping :" +COM_REDSHOP_IMAGE_QUALITY_LBL="Image quality" +COM_REDSHOP_TOOLTIP_CATALOG_REMAINDER_1_LBL="Enter number of days from sending out catalogue until sending out first reminder." +COM_REDSHOP_TOOLTIP_CATALOG_REMAINDER_2_LBL="Enter number of days from sending out catalogue until sending out second reminder." +COM_REDSHOP_SEND_CATALOG_REMINDER_MAIL_LBL="Enable Catalogue Reminder" +COM_REDSHOP_50="Wrapping Image thumb height in pixel" +COM_REDSHOP_2="Split Delivery cost" +COM_REDSHOP_1="Show Category Image in Lightbox" +COM_REDSHOP_DEFAULT_NEWSLETTER_CAN_NOT_BE_DELETED="Default newsletter can not be deleted" +COM_REDSHOP_PLEASE_SELECT_TEXT_LIBRARY_SECTION="Please select section" +COM_REDSHOP_ADD_TO_CART_TOOLTIP="Add to Cart Tooltip" +COM_REDSHOP_DETAIL_ERROR_MESSAGE_ON_LBL="Short error messages" +COM_REDSHOP_MANUFACTURER_MAX_CHARS_LBL="Max. Characters for Manufacturer Title" +COM_REDSHOP_MANUFACTURER_TITLE_END_SUFFIX_LBL="Manufacturer Title Suffix" +COM_REDSHOP_EDIT_GIFTCARD="Edit Gift Card" +COM_REDSHOP_WIDTH="Width" +COM_REDSHOP_9="Template" +COM_REDSHOP_0TOOLTIP_DISCOUNT_TYPE="Select if discount should be a fixed monetary amount, or a percentage" +COM_REDSHOP_5="Template" +COM_REDSHOP_YES_ZIP_UPLOAD="Zip file" +COM_REDSHOP_NO_ZIP_UPLOAD="Uncompressed file" +COM_REDSHOP_EXPORT_SHOPPER_GROUP_PRODUCT_SPECIFIC_PRICE="Export Shopper Group PRODUCT Specific Price" +COM_REDSHOP_EXPORT_SHOPPER_GROUP_ATTRIBUTE_SPECIFIC_PRICE_HINT="Here in exported file you will find Product Number, Product Price and Product Name. Which are readonly purpose to support your import. This product and shopper group related information will not be update when you will import using exported CSV from here." +COM_REDSHOP_EXPORT_SHOPPER_GROUP_ATTRIBUTE_SPECIFIC_PRICE="Export Shopper Group Attribute Specific Price" +COM_REDSHOP_COLOR_SAMPLE_MANAGEMENT="Samples" +COM_REDSHOP_ZIPCODE_MANAGEMENT="Zipcode Management" +COM_REDSHOP_ZIPCODE_DETAIL_DELETED_SUCCESSFULLY="Zipcode / City Detail Deleted Successfully" +COM_REDSHOP_ZIPCODE_DETAIL_EDITING_CANCELLED="Zipcode / City detail editing cancelled" +COM_REDSHOP_ERROR_SAVING_IN_ZIPCODE_DETAIL="Error Saving in Zipcode / City Detail" +COM_REDSHOP_ZIPCODE_DETAIL_SAVED="Zipcode / City detail saved" +COM_REDSHOP_STATE_MUST_BE_SELECTED="State must be selected" +COM_REDSHOP_CITY_MUST_HAVE_A_NAME="City Must Have Name" +COM_REDSHOP_ZIPCODE_MUST_HAVE_A_CODE="Zipcode Must Have Code" +COM_REDSHOP_ZIPCODE_TO_MUST_HAVE_A_GREATER_VALUE="Zipcode To Must Be Greater Than Zipcode From." +COM_REDSHOP_DEFAULT_TEMPLATE_DETAIL="Default Demo Template - For Example Use Only" +COM_REDSHOP_DENOTATION_TXT="* Values denoted are vat exempt and will be calculated accordingly." +COM_REDSHOP_NOOF_SUBATTRIB_THUMB_FOR_SCROLLER_LBL="No. of thumbs in sub-attribute scroller" +COM_REDSHOP_FIELDS_ALLREADY_EXIST="Fields already exists" +COM_REDSHOP_PRODUCT_CONTENT="Product Content" +COM_REDSHOP_IS_LOGGED_IN="Apply Without Login" +COM_REDSHOP_TOOLTIP_PRODUCT_COMPARE_TEMPLATE_FOR_CATEGORY_LABEL="Select the template you want to use for product comparison for this category." +COM_REDSHOP_TEXT_LIBRARY_LISTING="Text Library" +COM_REDSHOP_ADD_TEXT_LIBRARY_TAG="Add Text Library Tags" +COM_REDSHOP_ORDERDETAIL_ELEMENT_NAME="Order Detail Element Name" +COM_REDSHOP_BILLING_ELEMENT_NAME="Billing Element Name" +COM_REDSHOP_SHIPPING_ELEMENT_NAME="Shipping Element Name" +COM_REDSHOP_ORDERITEM_ELEMENT_NAME="Order Item Element Name" +COM_REDSHOP_PRODUCT_ELEMENT_NAME="Product detail Element Name" +COM_REDSHOP_STOCKDETAIL_ELEMENT_NAME="Stock detail Element Name" +COM_REDSHOP_EXTRAFIELD_ELEMENT_NAME="Extra Field Element Name" +COM_REDSHOP_UPDATE_IMPORT_FIELD="Update Import Field" +COM_REDSHOP_PRODUCT_STOCK_DETAIL_ADDED="Product Stock Detail Added" +COM_REDSHOP_PRODUCT_EXTRA_FIELD_ADDED="Product Extra Field Added" +COM_REDSHOP_XML_ELEMENT_NOTE="Note: Please add XML tag name of uploaded file for this element" +COM_REDSHOP_PLEASE_ENTER_ELEMENT_NAME="Please Enter Element Name" +COM_REDSHOP_ADD_PRODUCT_FIELD_DETAIL="Product Extra Field Added" +COM_REDSHOP_PRODUCT_IMPORT_NOTE="Product Number must be in import file" +COM_REDSHOP_ORDER_IMPORT_NOTE="Order Number must be in import File" +COM_REDSHOP_ORDER_ITEM_IMPORT_NOTE="Order item Number must be in import File" +COM_REDSHOP_STOCK_IMPORT_NOTE="Stockroom Name must be in import File" +COM_REDSHOP_PRDEXTRA_IMPORT_NOTE="Field Id must be in import File" +COM_REDSHOP_TOOLTIP_COMPARE_PRODUCT_THUMB_WIDTH_LBL="Compare Product Thumb Image width/height" +COM_REDSHOP_TOOLTIP_COMPARE_PRODUCT_THUMB_WIDTH="Enter Compare Product Thumb Image width/height in Pixel" +COM_REDSHOP_ENTER_VALID_MANUFACTURER_URL="Please enter valid manufacturer URL." +COM_REDSHOP_TOOLTIP_SHOW_STATE="Select 2 or 3 letter abbreviation to display for state." +COM_REDSHOP_TWO_LETTER_ABBRIVATION="2 Letter abbreviation" +COM_REDSHOP_THREE_LETTER_ABBRIVATION="3 Letter abbreviation" +COM_REDSHOP_TOOLTIP_PRODUCT_DETAIL_LIGHTBOX_CLOSE_BUTTON_IMAGE_LBL="Product Detail LightBox Close Button Image" +COM_REDSHOP_TOOLTIP_PRODUCT_DETAIL_LIGHTBOX_CLOSE_BUTTON_IMAGE="Upload Product Detail LightBox Close Button Image Here" +COM_REDSHOP_PRODUCT_DETAIL_LIGHTBOX_CLOSE_BUTTON_IMAGE_LBL="Product Detail LightBox Close Button Image" +COM_REDSHOP_USE_ENCODING_LBL="Use Multibyte Encoding" +COM_REDSHOP_TOOLTIP_USE_ENCODING="Use To convert danish characters." +COM_REDSHOP_CREATE_ACCOUNT_CHECKBOX_LBL="Create New User Upon Registration Default" +COM_REDSHOP_TOOLTIP_CREATE_ACCOUNT_CHECKBOX="Select Yes to make create Account checkbox pre-checked and No to make unchecked." +COM_REDSHOP_SAME_RANGE="Same range is not allowed." +COM_REDSHOP_TOOLTIP_SHOW_QUOTATION_PRICE_LBL="Do you want to display quote price?" +COM_REDSHOP_TOOLTIP_SHOW_QUOTATION_PRICE="Do you want to enable quote price?" +COM_REDSHOP_SHOW_QUOTATION_PRICE_LBL="Quote product price" +COM_REDSHOP_CHILDPRODUCT_DROPDOWN_LBL="Child Product Drop down Output" +COM_REDSHOP_TOOLTIP_CHILDPRODUCT_DROPDOWN_LBL="Select Child product drop down display output" +COM_REDSHOP_CHILD_PRODUCT_NAME="Child Product Name" +COM_REDSHOP_CHILD_PRODUCT_NUMBER="CHild Product Number" +COM_REDSHOP_PURCHASE_PARENT_WITH_CHILD_LBL="Parent Product should be purchasable(if any child product is added)" +COM_REDSHOP_TOOLTIP_PURCHASE_PARENT_WITH_CHILD_LBL="Parent product will be purchasable or not if any child product is added to it." +COM_REDSHOP_CHILD_PRODUCT_AS_RELATED_PRODUCT_TEXT="Add Child Product as Related Product" +COM_REDSHOP_TOOLTIP_ENABLE_ADDRESS_DETAIL_IN_SHIPPING_LBL="Enable Address Detail in Shipping" +COM_REDSHOP_TOOLTIP_ENABLE_ADDRESS_DETAIL_IN_SHIPPING="Do you want to enable address detail in shipping?" +COM_REDSHOP_ENABLE_ADDRESS_DETAIL_IN_SHIPPING_LBL="Enable Address Detail in Shipping" +COM_REDSHOP_QUOTATION_CART="Quotation Cart" +COM_REDSHOP_PREORDER_STOCKROOM_QTY="Preorder Stock" +COM_REDSHOP_PREORDER_STOCK_NOT_ALLOWED="Enter Preorder Stock more than Ordered Preorder Amount. Or Please Use Reset button to reset Stock." +COM_REDSHOP_ALREDAY_ORDERED_PREORDER_STOCKROOM_QTY="Ordered preorder stock" +COM_REDSHOP_FJ_HANDLING_FEE_LBL="Handling fee" +COM_REDSHOP_FJ_NCDEMPRESA_LBL="Company name" +COM_REDSHOP_FJ_SDSSENHA_LBL="Password" +COM_REDSHOP_FJ_EMBARCADOR_LBL="Shipper name" +COM_REDSHOP_FJ_TIPOFRETE_LBL="Shipping type" +COM_REDSHOP_FJ_PICKUPZIPCODE_LBL="Pickup Zipcode" +COM_REDSHOP_TOOLTIP_CALCULATION_PRICE_DECIMAL_LBL="Number of Price Round" +COM_REDSHOP_TOOLTIP_CALCULATION_PRICE_DECIMAL="Enter how many decimals you want to calculate for price." +COM_REDSHOP_CALCULATION_PRICE_DECIMAL_LBL="Number of Price Round" +COM_REDSHOP_NEW_ORDERING_ERROR="New Ordering Error" +COM_REDSHOP_CATALOG_REQUEST_BLOCK_SUCCESFULLY="Catalogue Request Block Successfully" +COM_REDSHOP_CATALOG_REQUEST_DELETED_SUCCESSFULLY="Catalogue Request Successfully Deleted" +COM_REDSHOP_CATALOG_REQUEST_BLOCK_UNBLOCK_SUCCESFULLY="Catalogue Request Block Unblock Successfully" +COM_REDSHOP_ERROR_SAVING_COUNTRY_DETAIL="Error Saving Country Detail" +COM_REDSHOP_COUNTRY_DETAIL_DELETED_SUCCESSFULLY="Country detail deleted successfully" +COM_REDSHOP_ERROR_SAVING_MAIL_DETAIL="Error Saving Mail Detail" +COM_REDSHOP_UPLOAD_COMPLETE="Upload complete" +COM_REDSHOP_UPLOAD_FAIL="Sorry, the upload failed to send" +COM_REDSHOP_FILE_DELETED="File has been deleted" +COM_REDSHOP_ERROR_FILE_DELETING="Error Deleting File" +COM_REDSHOP_SELECT_AN_ITEM_TO_MAKE_PRIMARY_MEDIA="Select an item to make the Primary Media" +COM_REDSHOP_SELECT_ORDERING="Select Ordering" +COM_REDSHOP_NEWSLETTER_COPIED_WITH_SUBSCRIBER="Newsletter successfully copied with its subscribers" +COM_REDSHOP_ERROR_COPYING_NEWSLETTER="Error copying newsletter" +COM_REDSHOP_ORDER_DELETED_SUCCESSFULLY="Order deleted Successfully" +COM_REDSHOP_BILLING_INFORMATION_UPDATED="Billing Information Updated" +COM_REDSHOP_ERROR_UPDATING_BILLING_INFORMATION="Error updating billing information" +COM_REDSHOP_ERROR_SAVING_ORDERSTATUS_DETAIL="Error Saving Order Status Detail" +COM_REDSHOP_PRICE_DETAIL_DELETED_SUCCESSFULLY="Attribute Price detail successfully deleted" +COM_REDSHOP_PRODUCT_COPIED="Product Copied" +COM_REDSHOP_SAMPLE_REQUEST_BLOCK_SUCCESFULLY="Sample Request Block Successfully" +COM_REDSHOP_SAMPLE_REQUEST_DELETED_SUCCESSFULLY="Sample Request Successfully Deleted" +COM_REDSHOP_SAMPLE_REQUEST_BLOCK_UNBLOCK_SUCCESFULLY="Sample Request Block Unblock Successfully" +COM_REDSHOP_ERROR_SAVING_SHOPPER_GROUP_DETAIL="Error Saving Shopper Group detail" +COM_REDSHOP_STATE_DETAIL_DELETED_SUCCESSFULLY="State Detail Successfully Deleted" +COM_REDSHOP_ERROR_SAVING_TAX_DETAIL="Error Saving Tax Detail" +COM_REDSHOP_ERROR_SAVING_USER_DETAIL="Error Saving User Detail" +COM_REDSHOP_RECEIPT_PARTIALLY_PAID_AMOUNT="Receipt of Partially Paid Amount" +COM_REDSHOP_REMAINING_PARTIALLY_AMOUNT="Remaining Partially Amount" +COM_REDSHOP_ERROR_SENDING_CONFIRMATION_MAIL="Error sending confirmation mail" +COM_REDSHOP_INVOICE="Invoice" +COM_REDSHOP_NO_SHIPPING_RATE_AVAILABLE="No Shipping Rates Available" +COM_REDSHOP_NO_SHIPPING_RATE_AVAILABLE_WHEN_NOPRODUCT_IN_CART="No Shipping Rates Available when the cart is empty" +COM_REDSHOP_FREE_SHIPPING_RATE_IS_IN_USED="Free Shipping Rate is in use!" +COM_REDSHOP_PRODUCTFINDER_DATEPICKER="Productfinder Date picker" +COM_REDSHOP_PRODUCT_OUTOFSTOCK_MESSAGE="Product Out of Stock Message" +COM_REDSHOP_YES="Yes" +COM_REDSHOP_NO="No" +COM_REDSHOP_SEO="SEO" +COM_REDSHOP_ON="On" +COM_REDSHOP_OFF="Off" +COM_REDSHOP_NONE="None" +COM_REDSHOP_N_A="N/a" +COM_REDSHOP_TOOLTIP_FIELD_NAME="Field name tooltip" +COM_REDSHOP_GTOREQUEL=">=" +COM_REDSHOP_LTOREQUEL="<=" +COM_REDSHOP_EQUAL_SIGN="=" +COM_REDSHOP_CREATE_LABEL="Create Label" +COM_REDSHOP_NO_PACSOFT_LABEL="No label for PackSoft" +COM_REDSHOP_XML_ALREADY_GENERATED="XML Already Generated on Server" +COM_REDSHOP_DELIVER_TYPE="Delivery Type for PacSoft Stored Printing" +COM_REDSHOP_POSTOFFICE="Pickup at the Post Office" +COM_REDSHOP_HOME="Regular Delivery" +COM_REDSHOP_ECONOMIC_DISPLAYNUMBER="e-conomic display number" +COM_REDSHOP_SUBATTRIBUTE_NAME="Sub Attribute name" +COM_REDSHOP_HASH="#" +COM_REDSHOP_SHIPPING="Shipping" +COM_REDSHOP_NUM="Num" +COM_REDSHOP_CUSTOMER_SALES="Customer Sales" +COM_REDSHOP_EDIT_USER="Edit User" +COM_REDSHOP_ACCOUNT="Account" +COM_REDSHOP_COUNTRY_ALGERIA="Algeria" +COM_REDSHOP_COUNTRY_ANTARCTICA="Antarctica" +COM_REDSHOP_COUNTRY_ARGENTINA="Argentina" +COM_REDSHOP_COUNTRY_ARMENIA="Armenia" +COM_REDSHOP_COUNTRY_ARUBA="Aruba" +COM_REDSHOP_COUNTRY_AUSTRALIA="Australia" +COM_REDSHOP_COUNTRY_AUSTRIA="Austria" +COM_REDSHOP_COUNTRY_AZERBAIJAN="Azerbaijan" +COM_REDSHOP_COUNTRY_BAHAMAS="Bahamas" +COM_REDSHOP_COUNTRY_BAHRAIN="Bahrain" +COM_REDSHOP_COUNTRY_BANGLADESH="Bangladesh" +COM_REDSHOP_COUNTRY_BARBADOS="Barbados" +COM_REDSHOP_COUNTRY_BELARUS="Belarus" +COM_REDSHOP_COUNTRY_BELGIUM="Belgium" +COM_REDSHOP_COUNTRY_BELIZE="Belize" +COM_REDSHOP_COUNTRY_BENIN="Benin" +COM_REDSHOP_COUNTRY_BERMUDA="Bermuda" +COM_REDSHOP_COUNTRY_BHUTAN="Bhutan" +COM_REDSHOP_COUNTRY_BOLIVIA="Bolivia" +COM_REDSHOP_COUNTRY_BOS_AND_HERZ="Bosnia and Herzegovina" +COM_REDSHOP_COUNTRY_BOTSWANA="Botswana" +COM_REDSHOP_COUNTRY_BRAZIL="Brazil" +COM_REDSHOP_COUNTRY_BRUNEI="Brunei Darussalam" +COM_REDSHOP_COUNTRY_BULGARIA="Bulgaria" +COM_REDSHOP_COUNTRY_BURUNDI="Burundi" +COM_REDSHOP_COUNTRY_CAMBODIA="Cambodia" +COM_REDSHOP_COUNTRY_CAMEROON="Cameroon" +COM_REDSHOP_COUNTRY_CANADA="Canada" +COM_REDSHOP_COUNTRY_CHAD="Chad" +COM_REDSHOP_COUNTRY_CHILE="Chile" +COM_REDSHOP_COUNTRY_CHINA="China" +COM_REDSHOP_COUNTRY_COLOMBIA="Colombia" +COM_REDSHOP_COUNTRY_COMOROS="Comoros" +COM_REDSHOP_COUNTRY_CONGO="Congo, The Democratic Republic of" +COM_REDSHOP_COUNTRY_COTE_DIVOIRE=""Côte d'Ivoire" (Ivory Coast)" +COM_REDSHOP_COUNTRY_CROATIA="Croatia" +COM_REDSHOP_COUNTRY_CUBA="Cuba" +COM_REDSHOP_COUNTRY_CYPRUS="Cyprus" +COM_REDSHOP_COUNTRY_DENMARK="Denmark" +COM_REDSHOP_COUNTRY_DJIBOUTI="Djibouti" +COM_REDSHOP_COUNTRY_DOMINICA="Dominica" +COM_REDSHOP_COUNTRY_EDIT="Country: [edit]" +COM_REDSHOP_COUNTRY_EGYPT="Egypt" +COM_REDSHOP_COUNTRY_ERITREA="Eritrea" +COM_REDSHOP_COUNTRY_ESTONIA="Estonia" +COM_REDSHOP_COUNTRY_ETHIOPIA="Ethiopia" +COM_REDSHOP_COUNTRY_FIJI="Fiji" +COM_REDSHOP_COUNTRY_FINLAND="Finland" +COM_REDSHOP_COUNTRY_FRANCE="France" +COM_REDSHOP_COUNTRY_GABON="Gabon" +COM_REDSHOP_COUNTRY_GAMBIA="Gambia" +COM_REDSHOP_COUNTRY_GEORGIA="Georgia" +COM_REDSHOP_COUNTRY_GERMANY="Germany" +COM_REDSHOP_COUNTRY_GHANA="Ghana" +COM_REDSHOP_COUNTRY_GIBRALTAR="Gibraltar" +COM_REDSHOP_COUNTRY_GREECE="Greece" +COM_REDSHOP_COUNTRY_GREENLAND="Greenland" +COM_REDSHOP_COUNTRY_GRENADA="Grenada" +COM_REDSHOP_COUNTRY_GUADELOUPE="Guadeloupe" +COM_REDSHOP_COUNTRY_GUAM="Guam" +COM_REDSHOP_COUNTRY_GUATEMALA="Guatemala" +COM_REDSHOP_COUNTRY_GUERNSEY="Guernsey" +COM_REDSHOP_COUNTRY_GUINEA_BISSAU="Guinea-Bissau" +COM_REDSHOP_COUNTRY_GUINEA="Guinea" +COM_REDSHOP_COUNTRY_GUYANA="Guyana" +COM_REDSHOP_COUNTRY_HAITI="Haiti" +COM_REDSHOP_COUNTRY_HONDURAS="Honduras" +COM_REDSHOP_COUNTRY_HUNGARY="Hungary" +COM_REDSHOP_COUNTRY_ICELAND="Iceland" +COM_REDSHOP_COUNTRY_INDIA="India" +COM_REDSHOP_COUNTRY_INDONESIA="Indonesia" +COM_REDSHOP_COUNTRY_IRAN="Iran (Islamic Republic of)" +COM_REDSHOP_COUNTRY_IRAQ="Iraq" +COM_REDSHOP_COUNTRY_IRELAND="Ireland" +COM_REDSHOP_COUNTRY_ISRAEL="Israel" +COM_REDSHOP_COUNTRY_ITALY="Italy" +COM_REDSHOP_COUNTRY_JAMAICA="Jamaica" +COM_REDSHOP_COUNTRY_JAPAN="Japan" +COM_REDSHOP_COUNTRY_JERSEY="Jersey" +COM_REDSHOP_COUNTRY_JORDAN="Jordan" +COM_REDSHOP_COUNTRY_KAZAKHSTAN="Kazakhstan" +COM_REDSHOP_COUNTRY_KENYA="Kenya" +COM_REDSHOP_COUNTRY_KIRIBATI="Kiribati" +COM_REDSHOP_COUNTRY_KOREA_NORTH="North Korea (Democratic People's Republic of)" +COM_REDSHOP_COUNTRY_KOREA_SOUTH="South Korea (Republic of)" +COM_REDSHOP_COUNTRY_KUWAIT="Kuwait" +COM_REDSHOP_COUNTRY_KYRGYZSTAN="Kyrgyzstan" +COM_REDSHOP_COUNTRY_LAO="Lao People's Democratic Republic" +COM_REDSHOP_COUNTRY_LATVIA="Latvia" +COM_REDSHOP_COUNTRY_LEBANON="Lebanon" +COM_REDSHOP_COUNTRY_LESOTHO="Lesotho" +COM_REDSHOP_COUNTRY_LIBERIA="Liberia" +COM_REDSHOP_COUNTRY_LIBYA="Libya" +COM_REDSHOP_COUNTRY_LIECHTENSTEIN="Liechtenstein" +COM_REDSHOP_COUNTRY_LITHUANIA="Lithuania" +COM_REDSHOP_COUNTRY_LUXEMBOURG="Luxembourg" +COM_REDSHOP_COUNTRY_MACAU="Macau" +COM_REDSHOP_COUNTRY_MACEDONIA="Macedonia (Former Yugoslav Republic of)" +COM_REDSHOP_COUNTRY_MADAGASCAR="Madagascar" +COM_REDSHOP_COUNTRY_MALAWI="Malawi" +COM_REDSHOP_COUNTRY_MALAYSIA="Malaysia" +COM_REDSHOP_COUNTRY_MALDIVES="Maldives" +COM_REDSHOP_COUNTRY_MALI="Mali" +COM_REDSHOP_COUNTRY_MALTA="Malta" +COM_REDSHOP_COUNTRY_MARTINIQUE="Martinique" +COM_REDSHOP_COUNTRY_MAURITANIA="Mauritania" +COM_REDSHOP_COUNTRY_MAURITIUS="Mauritius" +COM_REDSHOP_COUNTRY_MAYOTTE="Mayotte" +COM_REDSHOP_COUNTRY_MEXICO="Mexico" +COM_REDSHOP_COUNTRY_MICRONESIA="Micronesia, Federated States of" +COM_REDSHOP_COUNTRY_MOLDOVA="Moldova, Republic of" +COM_REDSHOP_COUNTRY_MONACO="Monaco" +COM_REDSHOP_COUNTRY_MONGOLIA="Mongolia" +COM_REDSHOP_COUNTRY_MONTENEGRO="Montenegro" +COM_REDSHOP_COUNTRY_MONTSERRAT="Montserrat" +COM_REDSHOP_COUNTRY_MOROCCO="Morocco" +COM_REDSHOP_COUNTRY_MOZAMBIQUE="Mozambique" +COM_REDSHOP_COUNTRY_MYANMAR="Myanmar, Burma" +COM_REDSHOP_COUNTRY_NAMIBIA="Namibia" +COM_REDSHOP_COUNTRY_NAURU="Nauru" +COM_REDSHOP_COUNTRY_NEPAL="Nepal" +COM_REDSHOP_COUNTRY_NETHERLANDS="Holland" +COM_REDSHOP_COUNTRY_NICARAGUA="Nicaragua" +COM_REDSHOP_COUNTRY_NIGER="Niger" +COM_REDSHOP_COUNTRY_NIGERIA="Nigeria" +COM_REDSHOP_COUNTRY_NIUE="Niue" +COM_REDSHOP_COUNTRY_NORWAY="Norway" +COM_REDSHOP_COUNTRY_OMAN="Oman" +COM_REDSHOP_COUNTRY_PAKISTAN="Pakistan" +COM_REDSHOP_COUNTRY_PALAU="Palau" +COM_REDSHOP_COUNTRY_PALESTINIAN_TERR="Palestinian Territory, Occupied" +COM_REDSHOP_COUNTRY_PANAMA="Panama" +COM_REDSHOP_COUNTRY_PARAGUAY="Paraguay" +COM_REDSHOP_COUNTRY_PERU="Peru" +COM_REDSHOP_COUNTRY_PHILIPPINES="Philippines" +COM_REDSHOP_COUNTRY_PITCAIRN="Pitcairn" +COM_REDSHOP_COUNTRY_POLAND="Poland" +COM_REDSHOP_COUNTRY_PORTUGAL="Portugal" +COM_REDSHOP_COUNTRY_QATAR="Qatar" +COM_REDSHOP_COUNTRY_ROMANIA="Romania" +COM_REDSHOP_COUNTRY_RUSSIA="Russian Federation" +COM_REDSHOP_COUNTRY_RWANDA="Rwanda" +COM_REDSHOP_COUNTRY_SAMOA="Samoa" +COM_REDSHOP_COUNTRY_SENEGAL="Senegal" +COM_REDSHOP_COUNTRY_SERBIA="Serbia" +COM_REDSHOP_COUNTRY_SEYCHELLES="Seychelles" +COM_REDSHOP_COUNTRY_SINGAPORE="Singapore" +COM_REDSHOP_COUNTRY_SLOVAKIA="Slovakia (Slovak Republic)" +COM_REDSHOP_COUNTRY_SLOVENIA="Slovenia" +COM_REDSHOP_COUNTRY_SOMALIA="Somalia" +COM_REDSHOP_COUNTRY_SPAIN="Spain" +COM_REDSHOP_COUNTRY_ST_BARTHELEMY="St. Barthelemy" +COM_REDSHOP_COUNTRY_ST_EUSTATIUS="St. Eustatius" +COM_REDSHOP_COUNTRY_ST_HELENA="St. Helena" +COM_REDSHOP_COUNTRY_SUDAN="Sudan" +COM_REDSHOP_COUNTRY_SVALBARD="Svalbard and Jan Mayen Islands" +COM_REDSHOP_COUNTRY_SWAZILAND="Swaziland" +COM_REDSHOP_COUNTRY_SWEDEN="Sweden" +COM_REDSHOP_COUNTRY_SWITZERLAND="Switzerland" +COM_REDSHOP_COUNTRY_SYRIA="Syrian Arab Republic" +COM_REDSHOP_COUNTRY_TAIWAN="Taiwan" +COM_REDSHOP_COUNTRY_TAJIKISTAN="Tajikistan" +COM_REDSHOP_COUNTRY_TANZANIA="Tanzania" +COM_REDSHOP_COUNTRY_THAILAND="Thailand" +COM_REDSHOP_COUNTRY_TOGO="Togo" +COM_REDSHOP_COUNTRY_TOKELAU="Tokelau" +COM_REDSHOP_COUNTRY_TONGA="Tonga" +COM_REDSHOP_COUNTRY_TUNISIA="Tunesia" +COM_REDSHOP_COUNTRY_TURKEY="Turkey" +COM_REDSHOP_COUNTRY_TURKMENISTAN="Turkmenistan" +COM_REDSHOP_COUNTRY_TUVALU="Tuvalu" +COM_REDSHOP_COUNTRY_UGANDA="Uganda" +COM_REDSHOP_COUNTRY_UKRAINE="Ukraine" +COM_REDSHOP_COUNTRY_URUGUAY="Uruguay" +COM_REDSHOP_COUNTRY_UZBEKISTAN="Uzbekistan" +COM_REDSHOP_COUNTRY_VANUATU="Vanuatu" +COM_REDSHOP_COUNTRY_VENEZUELA="Venezuela" +COM_REDSHOP_COUNTRY_VIETNAM="Vietnam" +COM_REDSHOP_COUNTRY_YUGOSLAVIA="Yugoslavia" +COM_REDSHOP_COUNTRY_ZAMBIA="Zambia" +COM_REDSHOP_COUNTRY_ZIMBABWE="Zimbabwe" +COM_REDSHOP_COUNTRY_VIRGIN_ISLANDS_BRIT="Virgin Islands (UK)" +COM_REDSHOP_COUNTRY_VIRGIN_ISLANDS_US="Virgin Islands (US)" +COM_REDSHOP_DASHBOARD_CONFIGURATION="Configure Dashboard" +COM_REDSHOP_DAY_FRI="Fri" +COM_REDSHOP_DAY_FRIDAY="Friday" +COM_REDSHOP_DAY_MON="Mon" +COM_REDSHOP_DAY_MONDAY="Monday" +COM_REDSHOP_DAY_SAT="Sat" +COM_REDSHOP_DAY_SATURDAY="Saturday" +COM_REDSHOP_DAY_SUN="Sun" +COM_REDSHOP_DAY_SUNDAY="Sunday" +COM_REDSHOP_DAY_THU="Thu" +COM_REDSHOP_DAY_THURSDAY="Thursday" +COM_REDSHOP_DAY_TUE="Tue" +COM_REDSHOP_DAY_TUESDAY="Tuesday" +COM_REDSHOP_DAY_WED="Wed" +COM_REDSHOP_DAY_WEDNESDAY="Wednesday" +COM_REDSHOP_ENTER_CATALOG_NAME="Enter Catalogue Name" +COM_REDSHOP_MEDIA_FILE_EXTENSION_WRONG="File extension is wrong, please upload correct file" +COM_REDSHOP_FRONT_IMAGE="Front Image" +COM_REDSHOP_MAIL_ITEM_MUST_HAVE_A_NAME="Mail Item Must Have a Name" +COM_REDSHOP_MONTH_APR="Apr" +COM_REDSHOP_MONTH_APRIL="April" +COM_REDSHOP_MONTH_AUG="Aug" +COM_REDSHOP_MONTH_AUGUST="August" +COM_REDSHOP_MONTH_DEC="Dec" +COM_REDSHOP_MONTH_DECEMBER="December" +COM_REDSHOP_MONTH_FEB="Feb" +COM_REDSHOP_MONTH_FEBRUARY="February" +COM_REDSHOP_MONTH_JAN="Jan" +COM_REDSHOP_MONTH_JANUARY="January" +COM_REDSHOP_MONTH_JUL="Jul" +COM_REDSHOP_MONTH_JULY="July" +COM_REDSHOP_MONTH_JUN="Jun" +COM_REDSHOP_MONTH_JUNE="June" +COM_REDSHOP_MONTH_MAR="Mar" +COM_REDSHOP_MONTH_MARCH="March" +COM_REDSHOP_MONTH_MAY="May" +COM_REDSHOP_MONTH_NOV="Nov" +COM_REDSHOP_MONTH_NOVEMBER="November" +COM_REDSHOP_MONTH_OCT="Oct" +COM_REDSHOP_MONTH_OCTOBER="October" +COM_REDSHOP_MONTH_SEPTEMBER="September" +COM_REDSHOP_MY_TAGS="My Tags" +COM_REDSHOP_ORDERSTATUS_CODE_MUST_FILLED="Order Status Code must be filled" +COM_REDSHOP_PLEASE_ENTER_XMLEXPORT_CHILD_ELEMENT_NAME="Please enter XML Export Child Element name" +COM_REDSHOP_REDSHOP_CONFIGURATION="redSHOP Configuration" +COM_REDSHOP_SHOPPER_GROUP_ITEM_MUST_HAVE_A_NAME="Shopper Group Item Must Have a Name" +COM_REDSHOP_STATE_MUST_HAVE_A_2_CODE="State Must Have 2-digit State code" +COM_REDSHOP_STATE_MUST_HAVE_A_3_CODE="State Must Have 3-digit State code" +COM_REDSHOP_SUPPLIER_ITEM_MUST_HAVE_A_NAME="Supplier must have a name" +COM_REDSHOP_TAGS_NAME_MUST_FILLED="Tag name must be filled" +COM_REDSHOP_WARNLOGININVALID="Login Invalid" +COM_REDSHOP_SEND_INVOICEMAIL="Resend Invoice Mail" +COM_REDSHOP_INVOICE_MAIL_HAS_BEEN_SENT="Invoice mail has been sent" +COM_REDSHOP_ERROR_INVOICE_MAIL_FAIL="ERROR: Invoice mail fail" +COM_REDSHOP_DISPLAY_ATTRIBUTE_TYPE="Display Type" +COM_REDSHOP_TOOLTIP_SHOW_PRODUCT_DETAIL_LBL="Do you want to show product detail?" +COM_REDSHOP_SHOW_PRODUCT_DETAIL_LBL="Show Product Detail" +COM_REDSHOP_TOOLTIP_SHOW_PRODUCT_DETAIL="Select 'Yes' to set Show Product Detail." +COM_REDSHOP_SAVE_WITHOUT_SEND_ORDERMAIL_LBL="Save without mail" +COM_REDSHOP_OUT_OF_STOCK="out of stock" +COM_REDSHOP_STOCKROOM_DELIVERY_TIME="Delivery" +COM_REDSHOP_DISPLAY_IN_CHECKOUT="Show in Checkout" +COM_REDSHOP_CUSTOMER_MESSAGE_LBL="Customer message" +COM_REDSHOP_REFERRAL_CODE_LBL="Referral code" +COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_IN_LIGHTBOX_LBL="Show Accessory Product in lighbox" +COM_REDSHOP_ACCESSORY_PRODUCT_IN_LIGHTBOX_TOOLTIP="Do you want to show accessory image in lightbox?" +COM_REDSHOP_ACCESSORY_PRODUCT_IN_LIGHTBOX_LBL="Show Accessory Product in lighbox" +COM_REDSHOP_CONSIGNOR_CARRIER_CODE="Consignor Carrier Code" +COM_REDSHOP_ENABLE_TRACK_AND_TRACE_EMAIL_LBL="Enable track and trace email" +COM_REDSHOP_ENABLE_SMS_FROM_WEBPACK_LBL="Enable SMS from webpack" +COM_REDSHOP_MANUFACTURER_SETTINGS="Manufacturer Settings" +COM_REDSHOP_REDMANUFACTURER_TEMPLATE="Manufacturer Template" +COM_REDSHOP_MANUFACTURER_IMAGE_SETTINGS="Image Settings" +COM_REDSHOP_PRODUCT_INTRO_TAB="Products" +COM_REDSHOP_PRODUCT_INTRO="Here you can set up products, accessory products and related products." +COM_REDSHOP_PRODUCT_UNIT="Unit" +COM_REDSHOP_WRAPPING_MANAGEMENT="Wrapping Management" +COM_REDSHOP_WRAPPER_FILTER="Filter by Wrapping Name" +COM_REDSHOP_ACCESSORY_PRODUCT_TAB="Accessory Products" +COM_REDSHOP_ACCESSORY_PRODUCT_SETTINGS="Accessory Product Settings" +COM_REDSHOP_ACCESSORY_PRODUCT_IMAGE_SETTINGS="Accessory Product Image Settings" +COM_REDSHOP_RELATED_PRODUCTS="Related Products" +COM_REDSHOP_RELATED_PRODUCT_SETTINGS="Related Product Settings" +COM_REDSHOP_RELATED_PRODUCT_IMAGE_SETTINGS="Related Product Image Settings" +COM_REDSHOP_PRODUCT_MAIN_IMAGE_HEIGHT_WIDTH="Product main image width/height" +COM_REDSHOP_PRODUCT_MAIN_IMAGE_HEIGHT_WIDTH_TWO="Product main image #2 width/height" +COM_REDSHOP_PRODUCT_MAIN_IMAGE_HEIGHT_WIDTH_THREE="Product main image #3 width/height" +COM_REDSHOP_PRODUCT_ADDITIONAL_IMAGE_HEIGHT_WIDTH="Product additional image width/height" +COM_REDSHOP_PRODUCT_ADDITIONAL_IMAGE_HEIGHT_WIDTH_TWO="Product additional image #2 width/height" +COM_REDSHOP_PRODUCT_ADDITIONAL_IMAGE_WIDTH_HEIGHT_THREE="Product additional image #3 width/height" +COM_REDSHOP_PRODUCT_HOVER_IMAGE_WIDTH_HEIGHT="Product hover image width/height" +COM_REDSHOP_ADDITIONAL_HOVER_IMAGE_WIDTH_HEIGHT="Additional hover image width/height" +COM_REDSHOP_PRODUCT_PREVIEW_IMAGE_WIDTH_HEIGHT_LBL="Product preview image width/height" +COM_REDSHOP_CATEGORY_PRODUCT_PREVIEW_IMAGE_WIDTH_HEIGHT_LBL="Product preview category view image width/height" +COM_REDSHOP_ATTRIBUTE_SCROLLER_THUMB_WIDTH_HEIGHT_LBL="Attribute scroller thumb image width/height" +COM_REDSHOP_ACCESSORY_THUMB_WIDTH_HEIGHT="Main accessory thumbnail width/height" +COM_REDSHOP_ACCESSORY_THUMB_WIDTH_HEIGHT_TWO="Main accessory thumbnail #2 width/height" +COM_REDSHOP_ACCESSORY_THUMB_WIDTH_HEIGHT_THREE="Main accessory thumbnail #3 width/height" +COM_REDSHOP_RELATED_PRODUCT_THUMB_WIDTH_HEIGHT="Related Product thumbnail width/height" +COM_REDSHOP_RELATED_PRODUCT_THUMB_WIDTH_HEIGHT_TWO="Related Product thumbnail #2 width/height" +COM_REDSHOP_RELATED_PRODUCT_THUMB_WIDTH_HEIGHT_THREE="Related Product thumbnail #3 width/height" +COM_REDSHOP_DEFAULT_WRAPPER_THUMB_WIDTH_HEIGHT="Default wrapping image thumb width/height" +COM_REDSHOP_FEATURE_SETTING_TAB="Feature Settings" +COM_REDSHOP_FEATURE_SETTING="Here you will find all the features that you enabled on the general tab." +COM_REDSHOP_COMPARISON_SETTINGS="Comparison Settings" +COM_REDSHOP_COMPARISON_LAYOUT="Comparison Layout" +COM_REDSHOP_COMPARISON_PRODUCT_TAB="Comparison" +COM_REDSHOP_COMPARE_PRODUCT_THUMB_WIDTH_HEIGHT="Compare Product thumb width/height" +COM_REDSHOP_RATING_SETTING="Rating Settings" +COM_REDSHOP_STOCKROOM_SETTINGS="Stockroom" +COM_REDSHOP_PRICING="Pricing" +COM_REDSHOP_MAIN_PRICE="Main Price Settings" +COM_REDSHOP_GIFTCARD_IMAGE_SETTING_TAB="Gift Card image settings" +COM_REDSHOP_TAX_TAB="VAT" +COM_REDSHOP_GIFTCARD_THUMB_WIDTH_HEIGHT="Gift Card thumb width/height" +COM_REDSHOP_GIFTCARD_LIST_THUMB_WIDTH_HEIGHT="Gift Card list thumb width/height" +COM_REDSHOP_CART_CHECKOUT="Cart/Checkout" +COM_REDSHOP_ADD_TO_CART_SETTINGS="Add to cart settings" +COM_REDSHOP_CART_TEMPLATE_SETTINGS="Templates" +COM_REDSHOP_CART_IMAGE_SETTINGS="Cart image settings" +COM_REDSHOP_CART_DEFAULT_IMAGE_SETTINGS="Default images" +COM_REDSHOP_ORDER_MAIN_SETTINGS="Order Settings" +COM_REDSHOP_ORDER_INVOICE_SETTINGS="Invoice Settings" +COM_REDSHOP_ORDERS="Orders" +COM_REDSHOP_MANUFACTURER_THUMB_WIDTH_HEIGHT="Manufacturer thumb width/height" +COM_REDSHOP_MANUFACTURER_PRODUCT_THUMB_WIDTH_HEIGHT="Manufacturer product thumb width/height" +COM_REDSHOP_MANUFACTURER_PRODUCT_THUMB_WIDTH_HEIGHT_TWO="Manufacturer Product Thumb #2 width/height" +COM_REDSHOP_CATEGORY_PRODUCT_THUMB_WIDTH_HEIGHT_THREE="Category Product thumb #3 width/height" +COM_REDSHOP_CART_SETTINGS="Cart Settings" +COM_REDSHOP_PAYMENT_SETTINGS="Payment" +COM_REDSHOP_SHIPPING_SETTINGS="Shipping" +COM_REDSHOP_SECURING_SETTINGS="Securing" +COM_REDSHOP_DISCOUNT_MAIL="Discount Mail" +COM_REDSHOP_REMOVE_FILE="Remove File" +COM_REDSHOP_CATEGORY_TEMPLATE_TAB="Template" +COM_REDSHOP_CART_THUMB_WIDTH_HEIGHT="Cart thumb width/height" +COM_REDSHOP_STORE_SETTINGS="Store Settings" +COM_REDSHOP_GENERAL_LAYOUT_SETTING="General Layout Settings" +COM_REDSHOP_MODULES_AND_FEATURES="Modules and Features" +COM_REDSHOP_CATEGORY_TAB="Categories" +COM_REDSHOP_REDMANUFACTURER_TAB="Manufacturers" +COM_REDSHOP_PRODUCT_TAB="Products" +COM_REDSHOP_FEATURE_TAB="Feature Settings" +COM_REDSHOP_ORDER_TAB="Orders" +COM_REDSHOP_NEWSLETTER_TAB="Newsletter" +COM_REDSHOP_MAIN_CATEGORY_SETTINGS="Main Category Settings" +COM_REDSHOP_NEXT_PREVIOUS="Next/Previous" +COM_REDSHOP_MANUFACTURER_TAB="Manufacturer Template" +COM_REDSHOP_IMAGE_SETTINGS="Image settings" +COM_REDSHOP_CATEGORY_SUFFIXES="Category Suffixes" +COM_REDSHOP_DEFAULT_IMAGES="Default Images" +COM_REDSHOP_CATEGORY_THUMB_WIDTH_HEIGHT="Category thumb width/height" +COM_REDSHOP_CATEGORY_THUMB_WIDTH_HEIGHT_TWO="Category thumb #2 width/height" +COM_REDSHOP_CATEGORY_THUMB_WIDTH_HEIGHT_THREE="Category thumb #3 width/height" +COM_REDSHOP_CATEGORY_PRODUCT_THUMB_WIDTH_HEIGHT_LBL="Category product thumb width/height" +COM_REDSHOP_CATEGORY_PRODUCT_THUMB_WIDTH_HEIGHT_TWO="Category product thumb #2 width/height" +COM_REDSHOP_DISCOUNT_SETTING_TAB="Discount" +COM_REDSHOP_COPY="Copy" +COM_REDSHOP_ADD_SUB_ATTRIBUTE="Add Attribute value" +COM_REDSHOP_CHANGE_PRODUCT_TYPE_TAB="Product Type Specific Data" +COM_REDSHOP_CHANGE_PRODUCT_TYPE_TAB_DESC="Data specific to this product type." +COM_REDSHOP_PARENT_PRODUCT="Parent Product" +COM_REDSHOP_RANGE_MIN="Range Min" +COM_REDSHOP_RANGE_MAX="Range Max" +COM_REDSHOP_ECONOMIC_SETTINGS="E-conomic settings" +COM_REDSHOP_PRODUCT_SOURCE="Search for products:" +COM_REDSHOP_PARAMETER="Parameter" +COM_REDSHOP_SUBPROPERTY_TITLE="Sub property" +COM_REDSHOP_NEW_SUB_PROPERTY="Add sub property" +COM_REDSHOP_PROPERTY_NUMBER="Virtual product number" +COM_REDSHOP_SUBPROPERTY_NUMBER="Virtual product number" +COM_REDSHOP_STATISTIC="Statistics" +COM_REDSHOP_WIZARD="Configuration Wizard" +COM_REDSHOP_CONFIG="Configuration" +COM_REDSHOP_USERS="Users" +COM_REDSHOP_USER_PHONE_NO="User Phone No." +COM_REDSHOP_QUESTION_TELEPHONE="User Phone No." +COM_REDSHOP_USER_ADRESS="User Address" +COM_REDSHOP_QUESTION_USER_ADRESS="User Address" +COM_REDSHOP_DISPLAY_OUT_OF_STOCK_ATTRIBUTE_DATA="Display Out of Stock Attribute Data" +COM_REDSHOP_MAIL_BCC="Mail BCC" +COM_REDSHOP_TOOLTIP_MAIL_BCC="Enter email id for BCC" +COM_REDSHOP_LBL_MAIL_BCC_TOOLTIP="Mail BCC" +COM_REDSHOP_IMPORT_UPDATE_LOG="Import Update Log" +COM_REDSHOP_ORDER_CAPTURED="Payment Captured Successfully" +COM_REDSHOP_ORDER_NOT_CAPTURED="Payment Not Captured Successfully" +COM_REDSHOP_ORDER_REFUND="Payment Refund Successfully" +COM_REDSHOP_ORDER_NOT_REFUND="Payment Not Refund Successfully" +COM_REDSHOP_STOCK_NOTE_TEMPLATE="Stock Note Template" +COM_REDSHOP_APPEND_TO_GLOBAL_SEO="Append" +COM_REDSHOP_PREPEND_TO_GLOBAL_SEO="Prepend" +COM_REDSHOP_REPLACE_TO_GLOBAL_SEO="Replace" +COM_REDSHOP_APPEND_TO_GLOBAL_SEO_LBL="Append To Global Meta Data" +COM_REDSHOP_TOOLTIP_APPEND_TO_GLOBAL_SEO_LBL="Append To Global Meta Data" +COM_REDSHOP_REVIEW_MAIL="Review" +COM_REDSHOP_EXPORT_GLS_LBL="Export GLS" +COM_REDSHOP_EXPORT_GLS_BUSINESS_LBL="Export GLS Business" +COM_REDSHOP_PROVIDE_ZIPCODE_TO_PICKUP_PARCEL="Zipcode" +COM_REDSHOP_SELECT_GLS_LOCATION="Pickup location" +COM_REDSHOP_ENTER_GLS_MOBILE="Mobile" +COM_REDSHOP_IMPORT_MANUFACTURER="Import Manufacturer" +COM_REDSHOP_EXPORT_MANUFACTURER="Export Manufacturer" +COM_REDSHOP_ORDER_STATUS_UPDATE_LOG="Order Status Update Log" +COM_REDSHOP_ORDER_STATUS_UPDATE_BACK_TO_ORDER_LIST="Back to Order List" +COM_REDSHOP_AJAX_ORDER_UPDATE_SUCCESS="Updated order status successfully for %d" +COM_REDSHOP_AJAX_ORDER_UPDATE_FAIL="Sorry, your request failed :(" +COM_REDSHOP_INCL_VAT="incl vat" +COM_REDSHOP_PRODUCT_PUBLISHED="Published Products" +COM_REDSHOP_PRODUCT_UNPUBLISHED="Unpublished Products" +COM_REDSHOP_PRODUCT_NOT_ON_SALE="Product Not on Sale" +COM_REDSHOP_PRODUCT_SOLD_OUT="Sold Out Products" +COM_REDSHOP_ADD_REDPRODUCTFINDER_ASSOCIATION="Add redProductfinder Association" +COM_REDSHOP_NAVIGATOR_PRODUCT="Product Navigator" +COM_REDSHOP_DISPLAY_NAME="Display Name" +COM_REDSHOP_ATTRIBUTE_SKU="Product Virtual Number" +COM_REDSHOP_VIRTUAL_PRODUCT_NUM="Product Virtual Number" +COM_REDSHOP_SHOPPER_GROUP_MANUFACTURE="Shopper Group Manufacturer" +COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_MANUFACTURE="Select manufacturers accessible for this shopper group." +COM_REDSHOP_PRODUCT_STOCKROOM_DATA="Product Stockroom Data" +COM_REDSHOP_SEO_PAGE_CANONICAL_MANUFACTUR_LBL="SEO Canonical" +COM_REDSHOP_TOOLTIP_SEO_PAGE_CANONICAL_MANUFACTUR_LBL="Canonical Url for Manufacturer Products Page." +COM_REDSHOP_CANONICAL_URL_PRODUCT="Canonical Url" +COM_REDSHOP_TOOLTIP_CANONICAL_URL_PRODUCT="Here you can type a Canonical url manually. This will add as a Canonical url, if any." +COM_REDSHOP_TOOLTIP_CANONICAL_URL_PRODUCT_PLUGIN="You must enable/install canonical product plugin to use this feature." +COM_REDSHOP_TOOLTIP_SEND_MAIL_TO_CUSTOMER_LBL="Send mail to customer in order" +COM_REDSHOP_TOOLTIP_SEND_MAIL_TO_CUSTOMER="Send mail to customer checkbox in admin order section default checked or not" +COM_REDSHOP_AJAX_DETAIL_BOX_WIDTH_AND_HEIGHT_TOOLTIP="Enter Ajax Detail Box Width and Height" +COM_REDSHOP_AJAX_DETAIL_BOX_WIDTH_AND_HEIGHT_TOOLTIP_LBL="Ajax Detail Box Width/Height" +COM_REDSHOP_AJAX_BOX_WIDTH_AND_HEIGHT_TOOLTIP="Enter Ajax Box Width and Height" +COM_REDSHOP_AJAX_BOX_WIDTH_AND_HEIGHT_TOOLTIP_LBL="Ajax Box Width/Height" +COM_REDSHOP_ORDER_MAIL_AFTER_LBL="Send Order Email" +COM_REDSHOP_ORDER_MAIL_AFTER_PAYMENT="After Payment" +COM_REDSHOP_ORDER_MAIL_AFTER_PAYMENT_BUT_SEND_BEFORE_ADMINISTRATOR="After Payment, but send before to administrator" +COM_REDSHOP_ORDER_MAIL_BEFORE_PAYMENT="Before Payment" +COM_REDSHOP_PAYMENT_GATEWAY="Payment Gateway" +COM_REDSHOP_SHIPPING_GATEWAY="Shipping Gateway" +COM_REDSHOP_NOTIFY_STOCK="Notify Stock" +COM_REDSHOP_FIRST_MAIL_AFTER_ORDER_PURCHASED="Mail after order Purchased" +COM_REDSHOP_GIFTCARD_MAIL="Gift card Mail" +COM_REDSHOP_WISHLIST_MAIL="Wishlist Mail" +COM_REDSHOP_NEWSLETTER_CONFIRMATION="Newsletter Confirmation Mail" +COM_REDSHOP_SEND_FRIEND="Send Friend Mail" +COM_REDSHOP_QUOTATION_REGISTRATION_MAIL="Quotation Registration Mail" +COM_REDSHOP_REQUEST_TAX_EXEMPT_MAIL="Request Tax Exempt Mail" +COM_REDSHOP_PRODUCT_SUBSCRIPTION_MAIL="Product Subscription Mail" +COM_REDSHOP_TAX_EXEMPT_APPROVAL_DISAPPROVAL_MAIL="Tax Exempt Approval/Disapproval Mail" +COM_REDSHOP_CATALOG_ORDER_MAIL="Catalog Order Mail" +COM_REDSHOP_ORDER_PAYMENT_EXTRA_FILEDS="Additional Payment data" +COM_REDSHOP_ORDER_SHIPPING_EXTRA_FILEDS="Additional Shipping data" +COM_REDSHOP_XML_GENERATED_SUCCESSFULLY="Xml posted successfully" +COM_REDSHOP_SELECT_USER_GROUP="Please select Joomla Group" +COM_REDSHOP_MINIMUM_STOCK_AMOUNT="Minimum Stock Amount" +COM_REDSHOP_TRACK_LINK_LBL="Track and Trace" +COM_REDSHOP_TOOLBAR_COPY="Copy" +COM_REDSHOP_TOOLTIP_ORDER_MAIL_AFTER="When will be sent the order e-mail?" +COM_REDSHOP_ATTRIBUTE_PLUS_PRODUCT_IN_ECONOMIC_LBL="Store attribute and products in e-conomic" +COM_REDSHOP_ORDERID="Order ID" +COM_REDSHOP_ORDERNUMBER="Order Number" +COM_REDSHOP_FULLNAME="Name" +COM_REDSHOP_USERNAME="User name" +COM_REDSHOP_USEREMAIL="User email" +COM_REDSHOP_ATTRIBUTE_EXTRAFIELD="Extra Field" +COM_REDSHOP_QUOTATION_SPECIAL_DISCOUNT="Quotation Special Discount" +COM_REDSHOP_QUOTATION_SUBTOTAL_WITH_DISCOUNT="Quotation Subtotal After Discount" +COM_REDSHOP_DISCOUNT_EXCL_VAT="Discount Without Vat" +COM_REDSHOP_DISCOUNT_INCL_VAT="Discount With Vat" +COM_REDSHOP_STATES="States" +COM_REDSHOP_MINIMUM_PER_PRODUCT_TOTAL_LBL="Minimum Per Product Total" +COM_REDSHOP_TOOLTIP_MINIMUM_PER_PRODUCT_TOTAL="Enter Minimum Per Product Total" +COM_REDSHOP_BEFORE_DISCOUNT="Before" +COM_REDSHOP_AFTER_DISCOUNT="After" +COM_REDSHOP_WARNING_TO_DELETE="Are you sure you want to delete" +COM_REDSHOP_ACCOUNT_LINK="Account Link" +COM_REDSHOP_PRODUCT_HOVER_IMAGE_ENABLE_LBL="Product Hover Image Enable" +COM_REDSHOP_AUTOGENERATE_XMLFILE="Link for autogenerate xml file" +COM_REDSHOP_ORDER_DOWNLOAD_INVOICE_LINK="Multiple invoice is generating and can be download %s" +COM_REDSHOP_ORDER_DOWNLOAD_LABEL="Link for download %s" +COM_REDSHOP_OTHER_INFORMATION="Other information" +COM_REDSHOP_ORDER_DISCOUNT_INVALID="Value of Discount can not larger than Order Subtotal" +COM_REDSHOP_ORDER_DISCOUNT_NOT_LESS_THAN_ZERO="Valud of Discount can not less than zero" +COM_REDSHOP_ORDER_ITEM_QUANTITY_ATLEAST_ONE="Product quantity can not less than one" +COM_REDSHOP_CATEGORY_EXIST_PRODUCT="Cannot delete %s (%d). This category contains products, kindly remove those products." +COM_REDSHOP_BROWSER_NOT_SUPPORT_XMLHTML="Your browser does not support XMLHTTP!" +COM_REDSHOP_START_DATE_MUST_BE_SOONER_OR_EQUAL_TO_END_DATE="Start date must be sooner or equal to end date" + +; General +COM_REDSHOP_N_ITEMS_DELETED="%d items successfully deleted" +COM_REDSHOP_N_ITEMS_DELETED_1="%d item successfully deleted" +COM_REDSHOP_N_ITEMS_PUBLISHED="%d items successfully published" +COM_REDSHOP_N_ITEMS_PUBLISHED_1="%d item successfully published" +COM_REDSHOP_N_ITEMS_UNPUBLISHED="%d items successfully unpublished" +COM_REDSHOP_N_ITEMS_UNPUBLISHED_1="%d item successfully unpublished" +COM_REDSHOP_N_ITEMS_COPIED="%d items successfully copied" +COM_REDSHOP_N_ITEMS_COPIED_1="%d item successfully copied" +COM_REDSHOP_DELETE_ITEMS_CONFIRM="Are you sure you want to delete these items?" +COM_REDSHOP_NO_ITEM_SELECTED="No item selected" + +; WIZARD SECTION +COM_REDSHOP_COMPONENT_NAME="redSHOP" +COM_REDSHOP_BY_LINK="by redcomponent.com" +COM_REDSHOP_TERMS_AND_CONDITION="Released under the terms and conditions of the GNU General Public License." +COM_REDSHOP_CHECK_UPDATES="* Remember to check for updates on" + +; CONFIG SECTION +COM_REDSHOP_CONFIG_IMAGE_PROCESSING_METHOD_LBL="Image processing method" +COM_REDSHOP_CONFIG_IMAGE_PROCESSING_METHOD_DESC="Select whether redSHOP should perform proportional resizing of image width and height, and using or not crop." +COM_REDSHOP_CONFIG_NO_PROPORTIONAL_RESIZED="No proportional" +COM_REDSHOP_CONFIG_PROPORTIONAL_RESIZED="Proportional resizing" +COM_REDSHOP_CONFIG_PROPORTIONAL_RESIZED_AND_CROP="Proportional resizing and crop" +COM_REDSHOP_CONFIG_CHECKOUT_LOGIN_REGISTER_SWITCHER_LBL="Checkout login/register switcher" +COM_REDSHOP_CONFIG_CHECKOUT_LOGIN_REGISTER_SWITCHER_DESC="Select how display switcher for login/register in checkout view" +COM_REDSHOP_CONFIG_TABS="Tabs" +COM_REDSHOP_CONFIG_SLIDERS="Sliders" +COM_REDSHOP_CONFIG_ORDER_FIELD_MOVED_HINT="Some options are moved to %s tab" +COM_REDSHOP_CONFIG_IMAGE_MAX_WIDTH_LBL="Image max width" +COM_REDSHOP_CONFIG_IMAGE_MAX_WIDTH_DESC="Choose maximum width of image when upload" +COM_REDSHOP_CONFIG_IMAGE_MAX_HEIGHT_LBL="Image max height" +COM_REDSHOP_CONFIG_IMAGE_MAX_HEIGHT_DESC="Choose maximum height of image when upload" + +; TEMPLATE HINTS +COM_REDSHOP_MAIL_TEMPLATE_TAG_REGISTRATION_HINT="Registration Mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_ORDER_HINT="Order Mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_INVOICE_HINT="Invoice mail Template available Tags" +COM_REDSHOP_ORDER_STATUS_MAIL="Order Status Mail" +COM_REDSHOP_MAIL_TEMPLATE_TAG_ORDER_STATUS_HINT="Order status change mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SEND_HINT="Catalogue Send Mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_FIRST_REMINDER_HINT="Catalogue First Reminder mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SECOND_REMINDER_HINT="Catalogue Second Reminder mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_COUPON_REMINDER_HINT="Catalogue Coupon Reminder mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SAMPLE_FIRST_REMINDER_HINT="Catalogue Sample First Reminder mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SAMPLE_SECOND_REMINDER_HINT="Catalogue Sample Second Reminder mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SAMPLE_THIRD_REMINDER_HINT="Catalogue Sample Third Reminder mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SAMPLE_COUPON_REMINDER_HINT="Catalogue Sample Coupon Reminder mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_ECONOMIC_INVOICE_HINT="e-conomic Invoice Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_ASK_QUESTION_HINT="Ask Question About Product Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_QUOTATION_HINT="Quote mail Template available Tags" +COM_REDSHOP_MAIL_TEMPLATE_TAG_DOWNLOADABLE_PRODUCT_HINT="The Downloadable Product Mail" +COM_REDSHOP_MAIL_TEMPLATE_TAG_REVIEW_PRODUCT_HINT="Review mail Hint Template available Tags" + +; TEMPLATE TAG SECTION +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_HINT="Category Template Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_HINT="Giftcard Listing Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_HINT="Product Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_STOCK_NOTE_HINT="Stock Note Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_USERNAME="{username} %s Username" +COM_REDSHOP_TEMPLATE_TAG_FULLNAME="{fullname} %s Full Name" +COM_REDSHOP_TEMPLATE_TAG_FIRSTNAME="{firstname} %s Firstname" +COM_REDSHOP_TEMPLATE_TAG_LASTNAME="{lastname} %s Lastname" +COM_REDSHOP_TEMPLATE_TAG_RESET_TOKEN="{reset_token} %s Reset password token" +COM_REDSHOP_TEMPLATE_TAG_PASSWORD_COMPLETE_URL="{password_complete_url} %s Reset Password URL (Put it as href in anchor tag)." +COM_REDSHOP_TEMPLATE_TAG_SHOPNAME="{shopname} %s Shopname" +COM_REDSHOP_TEMPLATE_TAG_NAME="{name} %s Name" +COM_REDSHOP_TEMPLATE_TAG_PASSWORD="{password} %s Password" +COM_REDSHOP_TEMPLATE_TAG_EMAIL="{email} %s Email" +COM_REDSHOP_TEMPLATE_TAG_BILLING_ADDRESS_START="{billing_address_start} %s Billing address start" +COM_REDSHOP_TEMPLATE_TAG_BILLING_ADDRESS_END="{billing_address_end} %s Billing address end" +COM_REDSHOP_TEMPLATE_TAG_ORDER_MAIL_INTRO_TEXT_TITLE="{order_mail_intro_text_title} %s Order Mail Title" +COM_REDSHOP_TEMPLATE_TAG_ORDER_MAIL_INTRO_TEXT="{order_mail_intro_text} %s Order mail Intro text" +COM_REDSHOP_TEMPLATE_TAG_ORDER_INFORMATION_LBL="{order_information_lbl} %s Order Information Label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_ID_LBL="{order_id_lbl} %s Order ID Label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_ID="{order_id} %s Order ID" +COM_REDSHOP_TEMPLATE_TAG_ORDER_NUMBER_LBL="{order_number_lbl} %s Order Number Label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_NUMBER="{order_number} %s Order Number" +COM_REDSHOP_TEMPLATE_TAG_INVOICE_NUMBER="{invoice_number} %s Invoice number in chronological order" +COM_REDSHOP_TEMPLATE_TAG_ORDER_DATE_LBL="{order_date_lbl} %s Order Date Label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_DATE="{order_date} %s Order Date" +COM_REDSHOP_TEMPLATE_TAG_ORDER_STATUS_LBL="{order_status_lbl} %s Order Status Label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_STATUS="{order_status} %s Order status" +COM_REDSHOP_TEMPLATE_TAG_ORDER_STATUS_LOG="{order_status_log} %s Order status log" +COM_REDSHOP_TEMPLATE_TAG_STOCK_STATUS="{stock_status} %s Stock status" +COM_REDSHOP_TEMPLATE_TAG_ORDER_DETAIL_HINT="Order Detail Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_BILLING_TEMPLATE="{billing_template} %s Billing template" +COM_REDSHOP_TEMPLATE_TAG_BILLING_ADDRESS_INFORMATION_LBL="{billing_address_information_lbl} %s Billing address Information Label" +COM_REDSHOP_TEMPLATE_TAG_BILLING_ADDRESS="{billing_address} %s Billing Address" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_ADDRESS_INFORMATION_LBL="{shipping_address_information_lbl} %s Shipping Address Information Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_ADDRESS="{shipping_address} %s Shipping Address" +COM_REDSHOP_TEMPLATE_TAG_ORDER_DETAIL_LBL="{order_detail_lbl} %s Order Detail Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_NAME_LBL="{product_name_lbl} %s Product Name Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_NAME="{product_name} %s Product Name" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_S_DESC="{product_s_desc} %s Product Small Description" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_NUMBER="{product_number} %s Product Number" +COM_REDSHOP_TEMPLATE_TAG_NOTE_LBL="{note_lbl} %s Note Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_WRAPPER="{product_wrapper} %s Product Wrapper" +COM_REDSHOP_TEMPLATE_TAG_PRICE_LBL="{price_lbl} %s Price Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRICE="{product_price} %s Product Price" +COM_REDSHOP_TEMPLATE_TAG_LOWEST_PRICE="{lowest_price} %s Product Lowest Price" +COM_REDSHOP_TEMPLATE_TAG_HIGHEST_PRICE="{highest_price} %s Product Highest Price" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SKU="{product_sku} %s Product Number" +COM_REDSHOP_TEMPLATE_TAG_QUANTITY_LBL="{quantity_lbl} %s Quantity Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_QUANTITY="{product_quantity} %s Product Quantity" +COM_REDSHOP_TEMPLATE_TAG_TOTAL_PRICE_LBL="{total_price_lbl} %s Total Price Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_TOTAL_PRICE="{product_total_price} %s Product Total Price" +COM_REDSHOP_TEMPLATE_TAG_ORDER_SUBTOTAL_LBL="{order_subtotal_lbl} %s Order Subtotal Label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_SUBTOTAL="{order_subtotal} %s Order Subtotal" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_END_IF="{discount end if} %s Discount with conditional tags as disapply discount price" +COM_REDSHOP_TEMPLATE_TAG_VAT_END_IF="{vat end if} %s Receptacle with conditional tags that appear VAT" +COM_REDSHOP_TEMPLATE_TAG_TOTAL_LBL="{total_lbl} %s Total Label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_TOTAL="{order_total} %s Order Total" +COM_REDSHOP_TEMPLATE_TAG_ORDER_DETAIL_LINK="{order_detail_link} %s Order Detail Link" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_LBL="{payment_lbl} %s Order Payment Method Name" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_METHOD="{payment_method} %s Order Payment Method Name" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_LBL="{shipping_lbl} %s Shipping Label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_SHIPPING="{order_shipping} %s Order Shipping" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_METHOD_LBL="{shipping_method_lbl} %s Shipping Method Name" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_METHOD="{shipping_method} %s Shipping method" +COM_REDSHOP_TEMPLATE_TAG_CUSTOMER_NOTE_LBL="{customer_note_lbl} %s Customer Note Label" +COM_REDSHOP_TEMPLATE_TAG_CUSTOMER_NOTE="{customer_note} %s Customer Note" +COM_REDSHOP_TEMPLATE_TAG_REQUISITION_NUMBER_LBL="{requisition_number_lbl} %s Requisition Number Label" +COM_REDSHOP_TEMPLATE_TAG_REQUISITION_NUMBER="{requisition_number} %s Requisition Number" +COM_REDSHOP_TEMPLATE_TAG_IF_PAYMENT_DISCOUNT="{if payment_discount} %s Conditional payment discount" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_DISCOUNT_LBL="{payment_discount_lbl} %s Payment Discount Label" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_ORDER_DISCOUNT="{payment_order_discount} %s Payment order Discount" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_DISCOUNT_END_IF="{payment_discount end if} %s Conditional tag" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_TYPE_LBL="{discount_type_lbl} %s discount Type Label" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_TYPE="{discount_type} %s Discount type(coupon : coupon code, voucher : voucher code)" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_USERFIELDS="{product_userfields} %s Product Userfield value" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING="{shipping} %s Display Shipping." +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_EXCL_VAT="{shipping_excl_vat} %s shipping excluding vat" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SUBTOTAL="{product_subtotal} %s Product subtotal including tax" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SUBTOTAL_EXCL_VAT="{product_subtotal_excl_vat} , Display Subtotal Excluding VAT" +COM_REDSHOP_TEMPLATE_TAG_SUB_TOTAL_VAT="{sub_total_vat} %s Will show product vat + shipping vat" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_EXCL_VAT="{discount_excl_vat} %s discount excluding vat" +COM_REDSHOP_TEMPLATE_TAG_TOTAL_EXCL_VAT="{total_excl_vat} %s Total excluding vat" +COM_REDSHOP_TEMPLATE_TAG_DENOTATION_LABEL="{denotation_label} %s This will output NOTE for denotation tags" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_DENOTATION="{discount_denotation} %s This will output an asterisk(*) for discount [This will output only if {discount_excl_vat} tag exists]" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_DENOTATION="{shipping_denotation} %s This will output an asterisk(*) for shipping [This will output only if {shipping_excl_vat} tag exists]" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_EXTRAINFO="{payment_extrainfo} %s Will Display Extra info from Bank Transfer Plugin" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ATTRIBUTE_NUMBER="{product_attribute_number} %s Product Attribute Number" +COM_REDSHOP_TEMPLATE_TAG_ORDER_DETAIL_LINK_LBL="{order_detail_link_lbl} %s Order Detail Link" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ATTRIBUTE="{product_attribute} %s Product attribute" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ACCESSORY="{product_accessory} %s Product accessory" +COM_REDSHOP_TEMPLATE_TAG_SPECIAL_DISCOUNT="{special_discount} %s Special discount" +COM_REDSHOP_TEMPLATE_TAG_SPECIAL_DISCOUNT_AMOUNT="{special_discount_amount} %s Special discount amount" +COM_REDSHOP_TEMPLATE_TAG_DOWNLOAD_TOKEN="{download_token} %s Download token" +COM_REDSHOP_TEMPLATE_TAG_DOWNLOAD_TOKEN_LBL="{download_token_lbl} %s Download token label" +COM_REDSHOP_TEMPLATE_TAG_REFERRAL_CODE="{referral_code} %s Referral code" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SUBTOTAL_LBL="{product_subtotal_lbl} %s Product subtotal val" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SUBTOTAL_EXCL_VAT_LBL="{product_subtotal_excl_vat_lbl} %s Product subtotal excluding vat" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_WITH_VAT_LBL="{shipping_with_vat_lbl} %s Shipping with vat label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_EXCL_VAT_LBL="{shipping_excl_vat_lbl} %s Shipping excluding vat label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRICE_EXCL_LBL="{product_price_excl_lbl} %s Product price excluding vat label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_RATE_NAME="{shipping_rate_name} %s Shipping rate name" +COM_REDSHOP_TEMPLATE_TAG_ORDER_SHIPPING_SHOP_LOCATION="{order_shipping_shop_location} %s Order shipping shop location" +COM_REDSHOP_TEMPLATE_TAG_ORDER_PAYMENT_STATUS="{order_payment_status} %s Order Payment status" +COM_REDSHOP_TEMPLATE_TAG_TRANSACTION_ID_LABEL="{transaction_id_label} %s Label for Payment Transaction Id" +COM_REDSHOP_TEMPLATE_TAG_TRANSACTION_ID="{transaction_id} %s Payment Transaction Id" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_EXTRAFIELDS_LBL="{payment_extrafields_lbl} %s Payment Extra fields Label" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_EXTRAFIELDS="{payment_extrafields} %s Display Extra fields of Payment Method" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_EXTRAFIELDS_LBL="{shipping_extrafields_lbl} %s Shipping Extra fields Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_EXTRAFIELDS="{shipping_extrafields} %s Shipping Extra fields of Shipping Method" +COM_REDSHOP_TEMPLATE_TAG_ORDER_TRANSFEE_LABEL="{order_transfee_label} %s Order Payment Transaction fee Label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_TRANSFEE="{order_transfee} %s Order Payment Transaction fee Amount" +COM_REDSHOP_TEMPLATE_TAG_ORDER_TOTAL_INCL_TRANSFEE="{order_total_incl_transfee} %s Order Total Including Transaction Fee amount" +COM_REDSHOP_TEMPLATE_TAG_CUSTOMER_ID="{customer_id} %s redSHOP userinfo id" +COM_REDSHOP_TEMPLATE_TAG_ORDER_TRACK_URL="{order_track_url} %s Order Track URL" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT="{discount} %s Discount Amount in Percentage" +COM_REDSHOP_TEMPLATE_TAG_DAYS="{days} %s Number of Days" +COM_REDSHOP_TEMPLATE_TAG_COUPON_CODE="{coupon_code} %s Discount Coupon Code" +COM_REDSHOP_TEMPLATE_TAG_ORDER_COMMENT="{order_comment} %s Order comment." +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_LINK="{product_link} %s Product Page Link" +COM_REDSHOP_TEMPLATE_TAG_USER_QUESTION="{user_question} %s User Question About product" +COM_REDSHOP_TEMPLATE_TAG_ANSWER="{answer} %s Answer of the question" +COM_REDSHOP_TEMPLATE_TAG_USER_TELEPHONE_LBL="{user_telephone_lbl} %s User Telephone Label" +COM_REDSHOP_TEMPLATE_TAG_USER_TELEPHONE="{user_telephone} %s User Telephone" +COM_REDSHOP_TEMPLATE_TAG_USER_ADDRESS_LBL="{user_address_lbl} %s User Address Label" +COM_REDSHOP_TEMPLATE_TAG_USER_ADDRESS="{user_address} %s User Address" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_INFORMATION_LBL="{quotation_information_lbl} %s Quote Information Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_ID_LBL="{quotation_id_lbl} %s Quote ID Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_ID="{quotation_id} %s Quote ID" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_NUMBER_LBL="{quotation_number_lbl} %s Quote Number Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_NUMBER="{quotation_number} %s Quote Number" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_DATE_LBL="{quotation_date_lbl} %s Quote Date Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_DATE="{quotation_date} %s Quote Date" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_STATUS_LBL="{quotation_status_lbl} %s Quote Status Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_STATUS="{quotation_status} %s Quote status" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_NOTE_LBL="{quotation_note_lbl} %s Quote Note Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_NOTE="{quotation_note} %s Quote Customer Note" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_CUSTOMER_NOTE_LBL="{quotation_customer_note_lbl} %s Quote Customer Note Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_CUSTOMER_NOTE="{quotation_customer_note} %s Quote Customer Note" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_CART_HINT="Quote Cart Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_DETAIL_LBL="{quotation_detail_lbl} %s Quote Detail Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_NUMBER_LBL="{product_number_lbl} , Product Number Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_SUBTOTAL_LBL="{quotation_subtotal_lbl} %s Quote Subtotal Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_SUBTOTAL="{quotation_subtotal} %s Quote subtotal" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_VAT_LBL="{quotation_vat_lbl} %s Quote Vat Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_VAT="{quotation_vat} %s Quote vat" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_TOTAL="{quotation_total} %s Quote Total" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_DISCOUNT_LBL="{quotation_discount_lbl} %s Quote Discount Label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_DISCOUNT="{quotation_discount} %s Quote Discount" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_DETAIL_LINK="{quotation_detail_link} %s Quote Detail Link." +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_DETAIL_HINT="Quote Detail Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SERIAL_LOOP_START="{product_serial_loop_start} %s Product Serial Number Loop Start" +COM_REDSHOP_TEMPLATE_TAG_TOKEN="{token} %s Token Number" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SERIAL_NUMBER="{product_serial_number} %s Product Serial Number" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SERIAL_LOOP_END="{product_serial_loop_end} %s Product Serial Number Loop End" +COM_REDSHOP_TEMPLATE_TAG_TITLE="{title} %s Title" +COM_REDSHOP_TEMPLATE_TAG_COMMENT="{comment} %s Comment" +COM_REDSHOP_TEMPLATE_TAG_URL="{url} %s Site URL" +COM_REDSHOP_TEMPLATE_TAG_COUPON_AMOUNT="{coupon_amount} %s Coupon amount" +COM_REDSHOP_TEMPLATE_TAG_COUPON_DURATION="{coupon_duration} %s Coupon duration" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_PRICE_LBL="{giftcard_price_lbl} %s Giftcard price label" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_RECIVER_NAME_LBL="{giftcard_reciver_name_lbl} %s Giftcard receiver name label" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_RECIVER_EMAIL_LBL="{giftcard_reciver_email_lbl} %s Giftcard receiver email label" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_PRICE="{giftcard_price} %s Giftcard price" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_RECIVER_NAME="{giftcard_reciver_name} %s Giftcard receiver name" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_RECIVER_EMAIL="{giftcard_reciver_email} %s Giftcrad receiver email" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_DESC="{giftcard_desc} %s Giftcard description" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_VALIDITY_FROM="{giftcard_validity_from} %s Giftcard validity from" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_VALIDITY_TO="{giftcard_validity_to} %s Giftcard validity to" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_IMAGE="{giftcard_image} %s Giftcard image" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_VALIDITY="{giftcard_validity} %s Giftcard validity" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_CODE_LBL="{giftcard_code_lbl} %s Giftcard code label" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_CODE="{giftcard_code} %s Giftcard code" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_LOOP_START="{product_loop_start} %s Product loop start" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_THUMB_IMAGE="{product_thumb_image} %s Product thumb image" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_LOOP_END="{product_loop_end} %s Product loop end" +COM_REDSHOP_TEMPLATE_TAG_FROM_NAME="{from_name} %s From name" +COM_REDSHOP_TEMPLATE_TAG_LINK="{link} %s Newsletter subscription link" +COM_REDSHOP_TEMPLATE_TAG_FRIEND_NAME="{friend_name} %s Friend name" +COM_REDSHOP_TEMPLATE_TAG_YOUR_NAME="{your_name} %s Your name" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_DESC="{product_desc} %s Product description" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_URL="{product_url} %s Product link" +COM_REDSHOP_TEMPLATE_TAG_VAT_NUMBER="{vat_number} %s Vat number" +COM_REDSHOP_TEMPLATE_TAG_COMPANY_NAME="{company_name} %s Company name" +COM_REDSHOP_TEMPLATE_TAG_COUNTRY="{country} %s Country" +COM_REDSHOP_TEMPLATE_TAG_STATE="{state} %s State" +COM_REDSHOP_TEMPLATE_TAG_PHONE="{phone} %s Phone No." +COM_REDSHOP_TEMPLATE_TAG_PHONE_OPTIONAL="{phone_optional} %s Set Phone No. Optional using this tag." +COM_REDSHOP_TEMPLATE_TAG_ZIPCODE="{zipcode} %s Zipcode" +COM_REDSHOP_TEMPLATE_TAG_ADDRESS="{address} %s Address" +COM_REDSHOP_TEMPLATE_TAG_CITY="{city} %s City" +COM_REDSHOP_TEMPLATE_TAG_SUBSCIPTION_ENDDATE="{subsciption_enddate} %s Subscription daye" +COM_REDSHOP_TEMPLATE_TAG_SUBSCRIPTION_PERIOD="{subscription_period} %s Subscription period" +COM_REDSHOP_TEMPLATE_TAG_SUBSCRIPTION_PRICE="{subscription_price} %s Subscription Price" +COM_REDSHOP_TEMPLATE_TAG_IF_SUBCATS="{if subcats} %s Start If Condition for Subcategory" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_MAIN_DESCRIPTION="{category_main_description} %s Parent Category Description" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_MAIN_SHORT_DESC="{category_main_short_desc} %s Parent Category short Description" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_MAIN_NAME="{category_main_name} %s Parent Category Name" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_MAIN_THUMB_IMAGE="{category_main_thumb_image} %s Parent Category thumb image" +COM_REDSHOP_TEMPLATE_TAG_SUBCATS_END_IF="{subcats end if} %s End If Condition for Subcategory" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_LOOP_START="{category_loop_start} %s Category List Loop Start" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_LOOP_END="{category_loop_end} %s Category List Loop End" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_NAME="{category_name} %s category name" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_DESCRIPTION="{category_description} %s category description" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_SHORT_DESC="{category_short_desc} %s category short description" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_THUMB_IMAGE="{category_thumb_image} %s category thumb image" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_INCLUDE_PRODUCT_IN_SUB_CAT="{include_product_in_sub_cat} %s Include products from sub-categories of this category" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRICE_LBL="{product_price_lbl} %s Product Price Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRICE_SLIDER="{product_price_slider} %s Product Price Slider" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_RATING_SUMMARY="{product_rating_summary} %s Summary About Product Rating" +COM_REDSHOP_TEMPLATE_TAG_PAGINATION="{pagination} %s Pagination" +COM_REDSHOP_TEMPLATE_TAG_PERPAGELIMIT_X="{perpagelimit:X} %s Display X number of Products Per Page" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_DISPLAY_LIMIT="{product_display_limit} %s Show drop down by which user can set no of display product" +COM_REDSHOP_TEMPLATE_TAG_SHOW_ALL_PRODUCTS_IN_CATEGORY="{show_all_products_in_category} %s Show All Products Without Pagination" +COM_REDSHOP_TEMPLATE_TAG_ORDER_BY="{order_by} %s OrderBy DropDownlist" +COM_REDSHOP_TEMPLATE_TAG_IF_PRODUCT_ON_SALE="{if product_on_sale} %s Write string between {if product_on_sale} and {product_on_sale end if} for display string when product is on sale" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ON_SALE_END_IF="{product_on_sale end if} %s Write string between {if product_on_sale} and {product_on_sale end if} for display string when product is on sale" +COM_REDSHOP_TEMPLATE_TAG_PRICE_EXCLUDING_VAT="{price_excluding_vat} %s Product Price Excluding Vat" +COM_REDSHOP_TEMPLATE_TAG_MORE_DOCUMENTS="{more_documents} %s More Documents" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ID_LBL="{product_id_lbl} %s Product ID Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ID="{product_id} %s Product ID" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_DISCOUNT_PRICE="{product_discount_price} %s Product Discount Price which will not change at time of attribute and accessory" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_OLD_PRICE="{product_old_price} %s Price without discount price" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRICE_SAVING="{product_price_saving} %s Saving price (Difference between product price & discount price)" +COM_REDSHOP_TEMPLATE_TAG_WITH_VAT="{with_vat} %s Show price for product with VAT" +COM_REDSHOP_TEMPLATE_TAG_WITHOUT_VAT="{without_vat} %s Show price for product without VAT" +COM_REDSHOP_TEMPLATE_TAG_FILTER_BY="{filter_by} %s Filter By" +COM_REDSHOP_TEMPLATE_TAG_TEMPLATE_SELECTOR_CATEGORY_LBL="{template_selector_category_lbl} %s Template Selector Label for Category View" +COM_REDSHOP_TEMPLATE_TAG_TEMPLATE_SELECTOR_CATEGORY="{template_selector_category} %s Template Selector for Category View In Product Loop" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_LINK="{manufacturer_link} %s Link to the manufacturer page" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_NAME="{manufacturer_name} %s Manufacturer Name" +COM_REDSHOP_TEMPLATE_TAG_STOCK_STATUS="{stock_status:class for available stock : class for out of stock: class for pre order} %s tag for stock status,
    there are 3 default css classes in redshop.css called
    available_stock_cls = class for available stock
    out_stock_cls = class for out of stock
    pre_order_cls = class for pre order
    User can change it and pass the name of classes in tag instead of default class names." +COM_REDSHOP_TEMPLATE_TAG_READ_MORE="{read_more} %s Read More For This Product" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_READMORE="{category_readmore} %s Category Read more link" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_MAIN_THUMB_IMAGE_2="{category_main_thumb_image_2} %s Main Category thumb Image Type2" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_MAIN_THUMB_IMAGE_3="{category_main_thumb_image_3} %s Main Category thumb Image Type3" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_THUMB_IMAGE_2="{category_thumb_image_2} %s Category thumb Image Type2" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_THUMB_IMAGE_3="{category_thumb_image_3} %s Category thumb Image Type3" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_STOCK_AMOUNT_IMAGE="{product_stock_amount_image} %s Product Out of Stock Image" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRICE_TABLE="{product_price_table} %s Quantity Based Price Table" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_THUMB_IMAGE_3="{product_thumb_image_3} %s Product Thumb Image3" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_THUMB_IMAGE_2="{product_thumb_image_2} %s Product Thumb Image2" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_START_DATE="{discount_start_date} %s Discount Start Date when product On sale" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_END_DATE="{discount_end_date} %s Discount End Date when product On sale" +COM_REDSHOP_TEMPLATE_TAG_COMPARE_PRODUCTS_BUTTON="{compare_products_button} %s Compare Product button to add product to compare product div list. Use it between {product_loop_start} and {product_loop_end}" +COM_REDSHOP_TEMPLATE_TAG_COMPARE_PRODUCT_DIV="{compare_product_div} %s Display a list of products to compare with a link to the compare view. Use it outside the product loop: {product_loop_start} NOT HERE {product_loop_end}" +COM_REDSHOP_TEMPLATE_TAG_FRONT_IMG_LINK="{front_img_link} %s Display Front Image Link" +COM_REDSHOP_TEMPLATE_TAG_BACK_IMG_LINK="{back_img_link} %s Display Back Image Link" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PREVIEW_IMG="{product_preview_img} %s Display product image without compressed" +COM_REDSHOP_TEMPLATE_TAG_READ_MORE_LINK="{read_more_link} %s Read More Link" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_NAME_NOLINK="{product_name_nolink} %s Product Name Without Link" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_PRODUCT_LINK="{category_product_link} %s Product Link" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_PRODUCT_HINT="Category Product Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ORDER_BY_LBL="{order_by_lbl} %s Order by label" +COM_REDSHOP_TEMPLATE_TAG_FILTER_BY_LBL="{filter_by_lbl} %s Filter by label" +COM_REDSHOP_TEMPLATE_TAG_RETURNTOCATEGORY_LINK="{returntocategory_link} %s Return to parent category link" +COM_REDSHOP_TEMPLATE_TAG_RETURNTOCATEGORY_NAME="{returntocategory_name} %s Parent category name" +COM_REDSHOP_TEMPLATE_TAG_RETURNTOCATEGORY="{returntocategory} %s Return to parent category" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_TOTAL_PRODUCT_LBL="{category_total_product_lbl} %s Category total product label" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_TOTAL_PRODUCT="{category_total_product} %s Category total product in category loop" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_DELIVERY_TIME="{product_delivery_time} %s Product delivery time" +COM_REDSHOP_TEMPLATE_TAG_DELIVERY_TIME_LBL="{delivery_time_lbl} %s Delivery time label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_LENGTH="{product_length} %s Product length" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_WIDTH="{product_width} %s Product width" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_HEIGHT="{product_height} %s Product height" +COM_REDSHOP_TEMPLATE_TAG_FRONT_PREVIEW_IMG_LINK="{front_preview_img_link} %s Front preview image link" +COM_REDSHOP_TEMPLATE_TAG_FRONTPAGE_CATEGORY_HINT="Frontend Category Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_BACK_PREVIEW_IMG_LINK="{back_preview_img_link} %s Back Preview image link" +COM_REDSHOP_TEMPLATE_TAG_IF_PRODUCT_USERFIELD="{if product_userfield} %s Write Product User fields {if product_userfield} {fieldname1}{fieldname2}...{fieldnameN} {product_userfield end if}" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_USERFIELD_END_IF="{product_userfield end if} %s Write Product User fields {if product_userfield} {fieldname1}{fieldname2}...{fieldnameN} {product_userfield end if}" +COM_REDSHOP_TEMPLATE_TAG_CUSTOMER_QUANTITY_LBL="{customer_quantity_lbl} %s Customer Quantity Label" +COM_REDSHOP_TEMPLATE_TAG_CUSTOMER_QUANTITY="{customer_quantity} %s Customer Quantity" +COM_REDSHOP_TEMPLATE_TAG_CUSTOMER_AMOUNT_LBL="{customer_amount_lbl} %s Customer Amount Label" +COM_REDSHOP_TEMPLATE_TAG_CUSTOMER_AMOUNT="{customer_amount} %s Customer Amount" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_NAME="{giftcard_name} %s Giftcard Name" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_VALUE_LBL="{giftcard_value_lbl} %s Giftcard Value label" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_VALUE="{giftcard_value} %s Giftcard Value" +COM_REDSHOP_TEMPLATE_TAG_IF_GIFTCARD_USERFIELD="{if giftcard_userfield} %s Write Giftcard userfields {if giftcard_userfield}{fieldname1}{fieldname2}...{fieldnameN}{giftcard_userfield end if}" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_USERFIELD_END_IF="{giftcard_userfield end if} %s Write Giftcard userfields {if giftcard_userfield}{fieldname1}{fieldname2}...{fieldnameN}{giftcard_userfield end if}" +COM_REDSHOP_TEMPLATE_TAG_SUPPLIER_NAME="{supplier_name} %s supplier name" +COM_REDSHOP_TEMPLATE_TAG_PUBLISH_DATE="{publish_date} %s pudlish date" +COM_REDSHOP_TEMPLATE_TAG_UPDATE_DATE="{update_date} %s update date" +COM_REDSHOP_TEMPLATE_TAG_IF_PRODUCT_SPECIAL="{if product_special} %s Write string between {if product_special} and {product_special end if} for display string when this is a featured product" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SPECIAL_END_IF="{product_special end if} %s Write string between {if product_special} and {product_special end if} for display string when this is a featured product" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_RATING="{product_rating} %s product rating" +COM_REDSHOP_TEMPLATE_TAG_MORE_IMAGES="{more_images} %s More images" +COM_REDSHOP_TEMPLATE_TAG_BOOKMARK="{bookmark} %s Bookmark" +COM_REDSHOP_TEMPLATE_TAG_SEND_TO_FRIEND="{send_to_friend} %s Send to friend link" +COM_REDSHOP_TEMPLATE_TAG_ASK_QUESTION_ABOUT_PRODUCT="{ask_question_about_product} %s Ask Question About Product(With Lightbox)" +COM_REDSHOP_TEMPLATE_TAG_ASK_QUESTION_ABOUT_PRODUCT_WITHOUT_LIGHTBOX="{ask_question_about_product_without_lightbox} %s Ask Question About Product(Without Lightbox)" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_PRODUCT_LINK="{manufacturer_product_link} %s View all product of manufacturer" +COM_REDSHOP_TEMPLATE_TAG_FORM_RATING="{form_rating} %s Display Rating Form(with lightbox)" +COM_REDSHOP_TEMPLATE_TAG_FORM_RATING_WITHOUT_LIGHTBOX="{form_rating_without_lightbox} %s Display Rating Form(without lightbox)" +COM_REDSHOP_TEMPLATE_TAG_PRODUCTS_IN_STOCK="{products_in_stock} %s Total No of Product in Stock" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_CALCULATOR="{discount_calculator} %s Discount Calculator" +COM_REDSHOP_TEMPLATE_TAG_FACEBOOK_LIKE_BUTTON="{facebook_like_button} %s Facebook Like Button" +COM_REDSHOP_TEMPLATE_TAG_GOOGLEPLUS1="{googleplus1} %s Google +1 button" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SIZE="{product_size} %s Display Product Volume Related to Shipping" +COM_REDSHOP_TEMPLATE_TAG_COMPONENT_HEADING="{component_heading} %s Display Product Name" +COM_REDSHOP_TEMPLATE_TAG_NAVIGATION_LINK_RIGHT="{navigation_link_right} %s Link Navigate to Next product" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_WEIGHT="{product_weight} %s Product Weight" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_WEIGHT_LBL="{product_weight_lbl} %s Product Weight Label" +COM_REDSHOP_TEMPLATE_TAG_CHILD_PRODUCTS="{child_products} %s Child Product Dropdown" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_VOLUME="{product_volume} %s Product Volume ( L x B x H)" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_VOLUME_LBL="{product_volume_lbl} %s Product Volume Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRICE_NOVAT="{product_price_novat} %s Display Product Price Without VAT" +COM_REDSHOP_TEMPLATE_TAG_MORE_IMAGES_3="{more_images_3} %s More Images Type 3" +COM_REDSHOP_TEMPLATE_TAG_MORE_IMAGES_2="{more_images_2} %s More Images Type 2" +COM_REDSHOP_TEMPLATE_TAG_WISHLIST_BUTTON="{wishlist_button} %s Wishlist Button to add product in Wishlist" +COM_REDSHOP_TEMPLATE_TAG_WISHLIST_LINK="{wishlist_link} %s Wishlist Link to add product in Wishlist" +COM_REDSHOP_TEMPLATE_TAG_WISHLIST_MAIL_HINT="Wishlist Mail Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_MY_TAGS_BUTTON="{my_tags_button} %s My Tags Button to add tags on product" +COM_REDSHOP_TEMPLATE_TAG_SUBSCRIPTION="{subscription} %s Product Subscription Type" +COM_REDSHOP_TEMPLATE_TAG_AJAXDETAIL_TEMPLATE_TEMPLATENAME="{ajaxdetail_template:templatename} %s Ajax Detail box template, work is AJAX add to cart is enabled from configuration" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_TEMPLATE_TEMPLATENAME="{accessory_template:templatename} %s Accessory Product Template to display accessory Product" +COM_REDSHOP_TEMPLATE_TAG_QUESTION_LOOP_START="{question_loop_start} %s Question loop Start" +COM_REDSHOP_TEMPLATE_TAG_QUESTION="{question} %s Display Question" +COM_REDSHOP_TEMPLATE_TAG_QUESTION_OWNER="{question_owner} %s Display Question Owner Name" +COM_REDSHOP_TEMPLATE_TAG_QUESTION_DATE="{question_date} %s Question Date" +COM_REDSHOP_TEMPLATE_TAG_ANSWER_LOOP_START="{answer_loop_start} %s Answer loop Start" +COM_REDSHOP_TEMPLATE_TAG_ANSWER_OWNER="{answer_owner} %s Display Answer Owner Name" +COM_REDSHOP_TEMPLATE_TAG_ANSWER_DATE="{answer_date} %s Answer Date" +COM_REDSHOP_TEMPLATE_TAG_ANSWER_LOOP_END="{answer_loop_end} %s Answer loop end" +COM_REDSHOP_TEMPLATE_TAG_QUESTION_LOOP_END="{question_loop_end} %s Question loop end" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_PRODUCT_IMG="{category_product_img} %s Category image (if {category_front_img_link} tag is available in template then {category_front_img_link} and {category_back_img_link} will be parsed)" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_FRONT_IMG_LINK="{category_front_img_link} %s Display Category Front Image Link" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_BACK_IMG_LINK="{category_back_img_link} %s Display Category Back Image Link" +COM_REDSHOP_TEMPLATE_TAG_DIAMETER="{diameter} %s Product Diameter" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_DIAMETER_LBL="{product_diameter_lbl} %s Product Diameter Label" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_IMAGE="{manufacturer_image} %s Manufacturer Image" +COM_REDSHOP_TEMPLATE_TAG_BACK_LINK="{back_link} %s Back link" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_LENGTH_LBL="{product_length_lbl} %s Product length label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_WIDTH_LBL="{product_width_lbl} %s Product width label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_HEIGHT_LBL="{product_height_lbl} %s Product height label" +COM_REDSHOP_TEMPLATE_TAG_MIN_ORDER_PRODUCT_QUANTITY="{min_order_product_quantity} %s Replace Minimum quantity per order" +COM_REDSHOP_TEMPLATE_TAG_PRINT="{print} %s Print" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_CATEGORY_LIST="{product_category_list} %s Product Category List" +COM_REDSHOP_TEMPLATE_TAG_STOCK_NOTIFY_FLAG="{stock_notify_flag} %s To Display Flag to notify user when stock will be back. Requires stock_notifyemail plugin installed." +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_AVAILABILITY_DATE="{product_availability_date} %s Stock Availability Date" +COM_REDSHOP_TEMPLATE_TAG_IF_VAT="{if vat} %s If vat(Vat loop start)" +COM_REDSHOP_TEMPLATE_TAG_VAT_LBL="{vat_lbl} %s Vat label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_TAX="{order_tax} %s Order tax" +COM_REDSHOP_TEMPLATE_TAG_IF_DISCOUNT="{if discount} %s If discount(Discount loop start)" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_LBL="{discount_lbl} %s Discount label" +COM_REDSHOP_TEMPLATE_TAG_ORDER_DISCOUNT="{order_discount} %s Order discount" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_QUANTITY_LBL="{product_quantity_lbl} %s Product quantity Label" +COM_REDSHOP_TEMPLATE_TAG_NAME_LBL="{name_lbl} %s Name label" +COM_REDSHOP_TEMPLATE_TAG_EMAIL_LBL="{email_lbl} %s Email Label" +COM_REDSHOP_TEMPLATE_TAG_EMAIL_ADDRESS="{email_address} %s Email Address" +COM_REDSHOP_TEMPLATE_TAG_ADDRESS_FIELDS="{address_fields} %s Shows the dynamic field section 'Product Sample'" +COM_REDSHOP_TEMPLATE_TAG_SUBMIT_BUTTON_SAMPLE="{submit_button_sample} %s Shows the submit button for submitting the email address" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SAMPLES="{product_samples} %s Shows the product samples" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_LOOP_START="{manufacturer_loop_start} %s Manufacturer Loop Start" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_LOOP_END="{manufacturer_loop_end} %s Manufacturer Loop End" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_DESCRIPTION="{manufacturer_description} %s Manufacturer Description" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_DETAIL_HINT="Manufacturer Detail Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_ALLPRODUCTSLINK="{manufacturer_allproductslink} %s Manufacturer Products URL" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_HEADING_START="{category_heading_start} %s Category heading start" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_HEADING_END="{category_heading_end} %s Category heading end" +COM_REDSHOP_TEMPLATE_TAG_FORM_ADDTOCART_ADD_TO_CART1="{form_addtocart:add_to_cart1} %s Add to cart" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_EXTRA_FIELDS="{manufacturer_extra_fields} %s Manufacturer extra-fields" +COM_REDSHOP_TEMPLATE_TAG_CART_LBL="{cart_lbl} %s Cart Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ATTRIBUTE_LOOP_START="{product_attribute_loop_start} %s Attribute Loop Start" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ATTRIBUTE_NAME="{product_attribute_name} %s Cart Attributes Name" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ATTRIBUTE_VALUE="{product_attribute_value} %s Cart Attributes Value" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ATTRIBUTE_VALUE_PRICE="{product_attribute_value_price} %s Cart Attributes Price" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ATTRIBUTE_LOOP_END="{product_attribute_loop_end} %s Attribute Loop End" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_LABEL="{attribute_label} %s Attributes" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_CHANGE="{attribute_change} %s Change Attribute Link" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_CUSTOMFIELDS_LBL="{product_customfields_lbl} %s Product customfields label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_CUSTOMFIELDS="{product_customfields} %s Product customfields" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SUBSCRIPTION_LBL="{product_subscription_lbl} %s Product subscription label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SUBSCRIPTION="{product_subscription} %s Product subscription" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_RULE="{discount_rule} %s Discount Rules" +COM_REDSHOP_TEMPLATE_TAG_UPDATE="{update} %s Update Total Cart" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_FORM_LBL="{discount_form_lbl} %s Discount Form Label" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_FORM="{discount_form} %s Discount Form" +COM_REDSHOP_TEMPLATE_TAG_COUPON_CODE_LBL="{coupon_code_lbl} %s Coupon code Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRICE_EXCL_VAT="{product_price_excl_vat} %s Display Product Price Excluding VAT" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_TOTAL_PRICE_EXCL_VAT="{product_total_price_excl_vat} %s Display Product Total Price Excluding VAT" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_PRICE_WITH_VAT="{attribute_price_with_vat} %s Display attribute price with vat" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_PRICE_WITHOUT_VAT="{attribute_price_without_vat} %s Display attribute price without vat" +COM_REDSHOP_TEMPLATE_TAG_VAT_INFO="{vat_info} %s Vat info" +COM_REDSHOP_TEMPLATE_TAG_VAT_SHIPPING="{vat_shipping} %s Display Shipping Vat" +COM_REDSHOP_TEMPLATE_TAG_TAX_WITH_SHIPPING_LBL="{tax_with_shipping_lbl} %s Tax with shipping label" +COM_REDSHOP_TEMPLATE_TAG_TOTAL="{total} %s Total including tax" +COM_REDSHOP_TEMPLATE_TAG_UPDATE_CART="{update_cart} %s Shows an update button" +COM_REDSHOP_TEMPLATE_TAG_QUANTITY_INCREASE_DECREASE="{quantity_increase_decrease} %s Quantity change via increase decrease button for when customer has changed quantities" +COM_REDSHOP_TEMPLATE_TAG_REMOVE_PRODUCT="{remove_product} %s Shows a button that delete product from the cart" +COM_REDSHOP_TEMPLATE_TAG_EMPTY_CART="{empty_cart} %s Shows a button that empties the cart" +COM_REDSHOP_TEMPLATE_TAG_TOTALPURCHASE_LBL="{totalpurchase_lbl} %s Total Purchased Label" +COM_REDSHOP_TEMPLATE_TAG_CHECKOUT_BUTTON="{checkout_button} %s Shows checkout button" +COM_REDSHOP_TEMPLATE_TAG_SHOP_MORE="{shop_more} %s Shows button to continue shopping" +COM_REDSHOP_TEMPLATE_TAG_TERMS_AND_CONDITIONS="{terms_and_conditions} %s terms & condition {terms_and_conditions:width=500 height=450}" +COM_REDSHOP_TEMPLATE_TAG_THIRDPARTY_EMAIL="{thirdparty_email} %s Thirdparty email" +COM_REDSHOP_TEMPLATE_TAG_THIRDPARTY_EMAIL_LBL="{thirdparty_email_lbl} %s Thirdparty email label" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_REQUEST="{quotation_request} %s Quote request" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_REQUEST_HINT="Quote Requests Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ORDER_PRODUCTS="{order_products} %s Order Products" +COM_REDSHOP_TEMPLATE_TAG_REORDER_LINK="{reorder_link} %s Reorder Link" +COM_REDSHOP_TEMPLATE_TAG_PAGINATION_LIMIT="{pagination_limit} %s Pagination limit" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_FRONTPAGE_INTROTEXT="{category_frontpage_introtext} %s Category Frontpage Introtext" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_FRONTPAGE_LOOP_START="{category_frontpage_loop_start} %s Category Frontpage Loop Start" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_FRONTPAGE_LOOP_END="{category_frontpage_loop_end} %s Category Frontpage Loop End" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_LOOP_START="{giftcard_loop_start} %s Giftcard Loop Start" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_READMORE="{giftcard_readmore} %s Giftcard Readmore" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_LOOP_END="{giftcard_loop_end} %s Giftcard Loop End" +COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_LIST_HINT="Giftcard List Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_CUSTOMER_NAME="{customer_name} %s Customer Name" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_STATUS="{payment_status} %s Payment Status" +COM_REDSHOP_TEMPLATE_TAG_QUOTAION_ID="{quotaion_id} %s Quote ID" +COM_REDSHOP_TEMPLATE_TAG_ACCOUNT_INFORMATION_LBL="{account_information_lbl} %s Account Information Label" +COM_REDSHOP_TEMPLATE_TAG_ACCOUNT_INFORMATION="{account_information} %s Account Information" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_ADDRESS_INFO_LBL="{shipping_address_info_lbl} %s Shipping Address Information Label" +COM_REDSHOP_TEMPLATE_TAG_DELIVERY_TIME="{delivery_time} %s Delivery Time of products" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_TEMPLATE_ATTRIBUTES="{attribute_template:attributes} %s Attribute Template" +COM_REDSHOP_TEMPLATE_TAG_CANCEL_BTN="{cancel_btn} %s Cancel Button" +COM_REDSHOP_TEMPLATE_TAG_REQUEST_QUOTATION_BTN="{request_quotation_btn} %s Request Quote Button" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_CUSTOM_FIELD_LIST="{quotation_custom_field_list} %s Show Custom Fields For Quotation" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_DESC="{category_desc} %s category description" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_NAME_WITH_LINK="{category_name_with_link} %s category name with link" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_URL="{manufacturer_url} %s Manufacturer Site Url" +COM_REDSHOP_TEMPLATE_TAG_MANUFACTURER_ALLPRODUCTSLINK_LBL="{manufacturer_allproductslink_lbl} %s Manufacturer all product label" +COM_REDSHOP_TEMPLATE_TAG_SUBMIT_BUTTON_CATALOG="{submit_button_catalog} %s Shows the submit button for submitting the email address" +COM_REDSHOP_TEMPLATE_TAG_CATALOG_SELECT="{catalog_select} %s Catalogue Select Box" +COM_REDSHOP_TEMPLATE_TAG_CATALOGUE_HINT="Cataloge Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_CATALOGUE_ORDER_DETAIL_HINT="Catalogue Order Detail Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_CATALOGUE_ORDER_RECEIPT_HINT="Catalogue Order Receipt Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_CATALOGUE_CART_HINT="Catalogue Cart Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ORDER_STATUS_ORDER_ONLY_LBL="{order_status_order_only_lbl} %s Label for Only Order Status" +COM_REDSHOP_TEMPLATE_TAG_ORDER_STATUS_PAYMENT_ONLY_LBL="{order_status_payment_only_lbl} %s Label for Only Payment Status" +COM_REDSHOP_TEMPLATE_TAG_ORDER_STATUS_ORDER_ONLY="{order_status_order_only} %s Display Only Order Status" +COM_REDSHOP_TEMPLATE_TAG_ORDER_STATUS_PAYMENT_ONLY="{order_status_payment_only} %s Display Only Payment Status" +COM_REDSHOP_TEMPLATE_TAG_TRACKING_NUMBER_LBL="{tracking_number_lbl} %s Label for Tracking number" +COM_REDSHOP_TEMPLATE_TAG_TRACKING_NUMBER="{tracking_number} %s Tracking number" +COM_REDSHOP_TEMPLATE_TAG_TRACKING_URL="{tracking_url} %s Tracking URL" +COM_REDSHOP_TEMPLATE_TAG_ORDER_SUBTOTAL_EXCL_VAT="{order_subtotal_excl_vat} %s Display Order Subtotal Excluding VAT" +COM_REDSHOP_TEMPLATE_TAG_TAX="{tax} %s Display Tax" +COM_REDSHOP_TEMPLATE_TAG_REORDER_BUTTON="{reorder_button} %s Reorder Button" +COM_REDSHOP_TEMPLATE_TAG_DOWNLOAD_DATE_LIST_LBL="{download_date_list_lbl} %s label for download products log" +COM_REDSHOP_TEMPLATE_TAG_DOWNLOAD_DATE_LIST="{download_date_list} %s display download products log(remaining downloads)" +COM_REDSHOP_TEMPLATE_TAG_DOWNLOAD_COUNTER_LBL="{download_counter_lbl} %s Label for product download limit" +COM_REDSHOP_TEMPLATE_TAG_DOWNLOAD_COUNTER="{download_counter} %s product download limit(last date for download)" +COM_REDSHOP_TEMPLATE_TAG_DOWNLOAD_DATE_LBL="{download_date_lbl} %s Label for last date for download" +COM_REDSHOP_TEMPLATE_TAG_DOWNLOAD_DATE="{download_date} %s Last date for download this product(shows the download token for the product)" +COM_REDSHOP_TEMPLATE_TAG_DATA="{data} %s tag so that while sending the newsletter the actual content will be replaced." +COM_REDSHOP_TEMPLATE_TAG_UNSUBSCRIBE_LINK="{unsubscribe_link} %s Unsubscriber link" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_LINK="{relproduct_link} %s Related Product Link" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_IMAGE="{relproduct_image} %s Related Product Image" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_NAME="{relproduct_name} %s Related Product Name" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_PRICE="{relproduct_price} %s Related Product Price" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_NUMBER="{relproduct_number} %s Related Product Number" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_NUMBER_LBL="{relproduct_number_lbl} %s Related Product Number Label" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_OLD_PRICE="{relproduct_old_price} %s Price without discount price of Related Product" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_PRICE_TABLE="{relproduct_price_table} %s Prices table with different quantity" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_PRICE_SAVING="{relproduct_price_saving} %s Related Product Saving price (Difference between product price & discount price)" +COM_REDSHOP_TEMPLATE_TAG_RELATED_PRODUCT_START="{related_product_start} %s Related Product Start" +COM_REDSHOP_TEMPLATE_TAG_RELATED_PRODUCT_END="{related_product_end} %s Related Product End" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_S_DESC="{relproduct_s_desc} %s Related Product Short Description" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_PRICE_NOVAT="{relproduct_price_novat} %s Related Product Price Excluding VAT" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_OLD_PRICE_LBL="{relproduct_old_price_lbl} %s Related Product Old Price Label" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_IMAGE_2="{relproduct_image_2} %s Related Product Image Type2" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_IMAGE_3="{relproduct_image_3} %s Related Product Image Type3" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_TEMPLATE_TEMPLATENAME="{attribute_template:templatename} %s Related Product Attribute Template" +COM_REDSHOP_TEMPLATE_TAG_FORM_ADDTOCART_TEMPLATENAME="{form_addtocart:templatename} %s Related Product Add to cart Template" +COM_REDSHOP_TEMPLATE_TAG_PRODUCTTAG_RS_FIELD="{producttag:rs_field} %s Adds custom field where 'rs_field' is the name of the field" +COM_REDSHOP_TEMPLATE_TAG_RELPRODUCT_ATTRIBUTE_PRICELIST="{relproduct_attribute_pricelist} %s Related Product Attribute Price List" +COM_REDSHOP_TEMPLATE_TAG_ADDTOCART_QUANTITY_INCREASE_DECREASE="{addtocart_quantity_increase_decrease} %s Quantity Increase Decrease" +COM_REDSHOP_TEMPLATE_TAG_ADDTOCART_LINK="{addtocart_link} %s Add To Cart Link" +COM_REDSHOP_TEMPLATE_TAG_ADDTOCART_QUANTITY="{addtocart_quantity} %s Quantity input box" +COM_REDSHOP_TEMPLATE_TAG_ADDTOCART_IMAGE="{addtocart_image} %s Add To Cart Background Image" +COM_REDSHOP_TEMPLATE_TAG_ADDTOCART_IMAGE_ASLINK="{addtocart_image_aslink} %s Add To Cart a link" +COM_REDSHOP_TEMPLATE_TAG_ADDTOCART_BUTTON="{addtocart_button} %s Add To Cart Default Button" +COM_REDSHOP_TEMPLATE_TAG_ADDTOCART_TOOLTIP="{addtocart_tooltip} %s Add To Tooltip" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_TITLE="{product_title} %s Product Title" +COM_REDSHOP_TEMPLATE_TAG_REVIEW_LOOP_START="{review_loop_start} %s Review loop start" +COM_REDSHOP_TEMPLATE_TAG_STARS="{stars} %s Review stars Image" +COM_REDSHOP_TEMPLATE_TAG_REVIEW_DATE="{reviewdate} %s Review Date" +COM_REDSHOP_TEMPLATE_TAG_REVIEW_LOOP_END="{review_loop_end} %s Review Loop End" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_TITLE="{attribute_title} %s Outputs the title of the attribute product" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_TOOLTIP="{attribute_tooltip} %s Outputs the tooltip of the attribute product" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_DROPDOWN="{property_dropdown} %s Outputs the Dropdown of Property" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_IMAGE_WITHOUT_SCROLLER="{property_image_without_scroller} %s Outputs the property image without scroller" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_IMAGE_SCROLLER="{property_image_scroller} %s Outputs the Property Image Scroller" +COM_REDSHOP_TEMPLATE_TAG_SUBPROPERTY_START="{subproperty_start} %s Outputs The Sub Property Ajax Response Div Start" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_TITLE="{property_title} %s Outputs The Selected Property Title" +COM_REDSHOP_TEMPLATE_TAG_SUBPROPERTY_DROPDOWN="{subproperty_dropdown} %s Outputs The Selected Property Subproperty Dropdown" +COM_REDSHOP_TEMPLATE_TAG_SUBPROPERTY_IMAGE_WITHOUT_SCROLLER="{subproperty_image_without_scroller} %s Outputs the subpropertyimage without scroller" +COM_REDSHOP_TEMPLATE_TAG_SUBPROPERTY_IMAGE_SCROLLER="{subproperty_image_scroller} %s Outputs The Subproperty Image Scroller" +COM_REDSHOP_TEMPLATE_TAG_SUBPROPERTY_END="{subproperty_end} %s Outputs The Sub Property Ajax Response Div End" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_IMAGE_LBL="{property_image_lbl} %s Label for Property Image" +COM_REDSHOP_TEMPLATE_TAG_VIRTUAL_NUMBER_LBL="{virtual_number_lbl} %s Label for Virtual number" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_NAME_LBL="{property_name_lbl} %s Label for Property Name" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_PRICE_LBL="{property_price_lbl} %s Label for Property price" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_STOCK_LBL="{property_stock_lbl} %s Label for Property stock" +COM_REDSHOP_TEMPLATE_TAG_ADD_TO_CART_LBL="{add_to_cart_lbl} %s Label for add to cart" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_START="{property_start} %s Property Loop Start" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_IMAGE="{property_image} %s Image of Property" +COM_REDSHOP_TEMPLATE_TAG_VIRTUAL_NUMBER="{virtual_number} %s Virtual Number" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_NAME="{property_name} %s Name of Property" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_PRICE="{property_price} %s Price of Property" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_STOCK="{property_stock} %s Stock of property" +COM_REDSHOP_TEMPLATE_TAG_PROPERTY_END="{property_end} %s Property loop end" +COM_REDSHOP_TEMPLATE_TAG_IF_ACCESSORY_MAIN="{if accessory_main} %s Conditional tag for accessory main product" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_MAIN_END_IF="{accessory_main end if} %s Conditional tag for accessory main product" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_MAINPRODUCT_PRICE="{accessory_mainproduct_price} %s Main Product Price" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_MAIN_IMAGE="{accessory_main_image} %s Main Product Image" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_MAIN_TITLE="{accessory_main_title} %s Main Product Name" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_MAIN_SHORT_DESC="{accessory_main_short_desc} %s Main Product Short description" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_MAIN_READMORE="{accessory_main_readmore} %s Main Product Readmore" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_MAIN_IMAGE_3="{accessory_main_image_3} %s Main Product Image 3" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_MAIN_IMAGE_2="{accessory_main_image_2} %s Main Product Image 2" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_PRODUCT_START="{accessory_product_start} %s Accessory Product Loop Start" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_PRODUCT_END="{accessory_product_end} %s Accessory Product Loop End" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_TITLE="{accessory_title}, Outputs the title of the accessory product" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_IMAGE="{accessory_image} %s Outputs the accessory product Image" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_PRICE="{accessory_price} %s Price of accessory" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_PRICE_SAVING="{accessory_price_saving} %s Saving price of accessory" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_MAIN_PRICE="{accessory_main_price} %s Main price of Accessory product" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_SHORT_DESC="{accessory_short_desc} %s Outputs the accessory product short description" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_QUANTITY="{accessory_quantity} %s Accessory Quantity" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_READMORE="{accessory_readmore} %s Accessory Product Readmore" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_IMAGE_3="{accessory_image_3} %s Accessory Product Image Type3" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_IMAGE_2="{accessory_image_2} %s Accessory Product Image Type2" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_READMORE_LINK="{accessory_readmore_link} %s Accessory Readmore link" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_ADD_CHKBOX_LBL="{accessory_add_chkbox_lbl} %s Outputs the checkbox label" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_QUANTITY_LBL="{accessory_quantity_lbl} %s Accessory Quantity Label" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_PREVIEW_IMAGE="{accessory_preview_image} %s Accessory Preview image" +COM_REDSHOP_TEMPLATE_TAG_SELECTED_ACCESSORY_PRICE="{selected_accessory_price} %s Selected Accessory Price" +COM_REDSHOP_TEMPLATE_TAG_ACCESSORY_ADD_CHKBOX="{accessory_add_chkbox} %s Outputs the checkbox if checkbox is checked the accessory product will added to the product" +COM_REDSHOP_TEMPLATE_TAG_WRAPPER_DROPDOWN="{wrapper_dropdown} %s dropdown for wrapping name and wrapping price" +COM_REDSHOP_TEMPLATE_TAG_WRAPPER_IMAGE="{wrapper_image} %s Wrapping Image" +COM_REDSHOP_TEMPLATE_TAG_WRAPPER_ADD_CHECKBOX="{wrapper_add_checkbox} %s Wrapping checkbox if checkbox is checked the wrapping will added to the product price" +COM_REDSHOP_TEMPLATE_TAG_WRAPPER_PRICE="{wrapper_price} %s Display Wrapping Price" +COM_REDSHOP_TEMPLATE_TAG_ALL_CART="{all_cart} %s All product added in cart" +COM_REDSHOP_TEMPLATE_TAG_MAIL_LINK="{mail_link} %s Wishlist Mail Link" +COM_REDSHOP_TEMPLATE_TAG_REMOVE_PRODUCT_LINK="{remove_product_link} %s Remove Product Link" +COM_REDSHOP_TEMPLATE_TAG_EMAIL_TO_FRIEND="{email_to_friend} %s Display Send E-mail to Friend Title" +COM_REDSHOP_TEMPLATE_TAG_EMAILTO_LBL="{emailto_lbl} %s Email To label" +COM_REDSHOP_TEMPLATE_TAG_EMAILTO="{emailto} %s Email To Textbox" +COM_REDSHOP_TEMPLATE_TAG_SENDER_LBL="{sender_lbl} %s Sender label" +COM_REDSHOP_TEMPLATE_TAG_SENDER="{sender} %s Sender Textbox" +COM_REDSHOP_TEMPLATE_TAG_MAIL_LBL="{mail_lbl} %s Email From label" +COM_REDSHOP_TEMPLATE_TAG_MAIL="{mail} %s Email From Textbox" +COM_REDSHOP_TEMPLATE_TAG_SUBJECT_LBL="{subject_lbl} %s Subject label" +COM_REDSHOP_TEMPLATE_TAG_SUBJECT="{subject} %s Subject Textbox" +COM_REDSHOP_TEMPLATE_TAG_CANCEL_BUTTON="{cancel_button} %s Cancel Button" +COM_REDSHOP_TEMPLATE_TAG_SEND_BUTTON="{send_button} %s Send Button" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_FIRSTNAME_LBL="{shipping_firstname_lbl} %s Firstname Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_FIRSTNAME="{shipping_firstname} %s Firstname" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_LASTNAME_LBL="{shipping_lastname_lbl} %s Lastname Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_LASTNAME="{shipping_lastname} %s Lastname" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_ADDRESS_LBL="{shipping_address_lbl} %s Address Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_ZIP_LBL="{shipping_zip_lbl} %s Zip Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_ZIP="{shipping_zip} %s Zip" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_CITY_LBL="{shipping_city_lbl} %s City Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_CITY="{shipping_city} %s City" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_COUNTRY_LBL="{shipping_country_lbl} %s Shipping Country Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_STATE_LBL="{shipping_state_lbl} %s Shipping State Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_PHONE_LBL="{shipping_phone_lbl} %s Shipping Phone Label" +COM_REDSHOP_TEMPLATE_TAG_COMPANY_NAME_LBL="{company_name_lbl} %s Company Name Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_COUNTRY="{shipping_country} %s Shipping Country" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_PHONE="{shipping_phone} %s Shipping Phone" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_STATE="{shipping_state} %s Shipping State" +COM_REDSHOP_TEMPLATE_TAG_USER_EMAIL_LBL="{user_email_lbl} %s User Email Label" +COM_REDSHOP_TEMPLATE_TAG_USER_EMAIL="{user_email} %s User Email" +COM_REDSHOP_TEMPLATE_TAG_USER_NAME_LBL="{user_name_lbl} %s User Name Label" +COM_REDSHOP_TEMPLATE_TAG_USER_NAME="{user_name} %s User Name" +COM_REDSHOP_TEMPLATE_TAG_USER_QUESTION_LBL="{user_question_lbl} %s User Question Label" +COM_REDSHOP_TEMPLATE_TAG_CAPTCHA_LBL="{captcha_lbl} %s Captcha Label" +COM_REDSHOP_TEMPLATE_TAG_CAPTCHA="{captcha} %s Captcha" +COM_REDSHOP_TEMPLATE_TAG_AJAX_CART_BOX_TITLE="{ajax_cart_box_title} %s Display Cart Save Message" +COM_REDSHOP_TEMPLATE_TAG_SHOW_CART_TEXT="{show_cart_text} %s Show Cart Text" +COM_REDSHOP_TEMPLATE_TAG_SHOW_CART_BUTTON="{show_cart_button} %s View Cart Button/ it will redirect to cart Page" +COM_REDSHOP_TEMPLATE_TAG_CONTINUE_SHOPPING_BUTTON="{continue_shopping_button} %s Countinue With Shopping Button/ It will just close pop-up Box" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_IMAGE="{product_image} %s Product Image" +COM_REDSHOP_TEMPLATE_TAG_SEARCH_TAG_DISPLAY="{search_tag_display} %s Search Tags Display" +COM_REDSHOP_TEMPLATE_TAG_WELCOME_INTROTEXT="{welcome_introtext} %s Welcome introtext" +COM_REDSHOP_TEMPLATE_TAG_ACCOUNT_IMAGE="{account_image} %s Account Image" +COM_REDSHOP_TEMPLATE_TAG_ACCOUNT_TITLE="{account_title} %s Account Title" +COM_REDSHOP_TEMPLATE_TAG_FULLNAME_LBL="{fullname_lbl} %s Fullname Label" +COM_REDSHOP_TEMPLATE_TAG_VATNUMBER_LBL="{vatnumber_lbl} %s vat number Label" +COM_REDSHOP_TEMPLATE_TAG_VATNUMBER="{vatnumber} %s Vat Number" +COM_REDSHOP_TEMPLATE_TAG_ADDRESS_LBL="{address_lbl} %s Address Label" +COM_REDSHOP_TEMPLATE_TAG_CITY_LBL="{city_lbl} %s City Label" +COM_REDSHOP_TEMPLATE_TAG_ZIPCODE_LBL="{zipcode_lbl} %s Zipcode Label" +COM_REDSHOP_TEMPLATE_TAG_STATE_LBL="{state_lbl} %s State Label" +COM_REDSHOP_TEMPLATE_TAG_COUNTRY_LBL="{country_lbl} %s Country Label" +COM_REDSHOP_TEMPLATE_TAG_PHONE_LBL="{phone_lbl} %s Phone Label" +COM_REDSHOP_TEMPLATE_TAG_REQUESTING_TAX_EXEMPT_LBL="{requesting_tax_exempt_lbl} %s Requesting tax exempt Label" +COM_REDSHOP_TEMPLATE_TAG_REQUESTING_TAX_EXEMPT="{requesting_tax_exempt} %s Requesting tax exempt" +COM_REDSHOP_TEMPLATE_TAG_EDIT_ACCOUNT_LINK="{edit_account_link} %s Edit Account Link" +COM_REDSHOP_TEMPLATE_TAG_CUSTOMER_CUSTOM_FIELDS="{customer_custom_fields} %s Customer / Company Custom fields" +COM_REDSHOP_TEMPLATE_TAG_MORE_ORDERS="{more_orders} %s More Order Link" +COM_REDSHOP_TEMPLATE_TAG_ORDERLIST_HINT="Orderlist Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_ORDER_IMAGE="{order_image} %s Order Image" +COM_REDSHOP_TEMPLATE_TAG_ORDER_TITLE="{order_title} %s Order Title" +COM_REDSHOP_TEMPLATE_TAG_ORDER_LOOP_START="{order_loop_start} %s Order loop Start" +COM_REDSHOP_TEMPLATE_TAG_ORDER_INDEX="{order_index} %s Order Index" +COM_REDSHOP_TEMPLATE_TAG_ORDER_LOOP_END="{order_loop_end} %s Order loop end" +COM_REDSHOP_TEMPLATE_TAG_COUPON_IMAGE="{coupon_image} %s Coupon Image" +COM_REDSHOP_TEMPLATE_TAG_COUPON_TITLE="{coupon_title} %s Coupon Title" +COM_REDSHOP_TEMPLATE_TAG_COUPON_LOOP_START="{coupon_loop_start} %s Coupon loop start" +COM_REDSHOP_TEMPLATE_TAG_COUPON_VALUE_LBL="{coupon_value_lbl} %s Coupon Value Label" +COM_REDSHOP_TEMPLATE_TAG_COUPON_VALUE="{coupon_value} %s Coupon Value" +COM_REDSHOP_TEMPLATE_TAG_COUPON_LOOP_END="{coupon_loop_end} %s Coupon loop end" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_IMAGE="{shipping_image} %s Shipping Image" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_TITLE="{shipping_title} %s Shipping Title" +COM_REDSHOP_TEMPLATE_TAG_EDIT_SHIPPING_LINK="{edit_shipping_link} %s Edit shipping link" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_IMAGE="{quotation_image} %s Quote Image" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_TITLE="{quotation_title} %s Quote Title" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_LOOP_START="{quotation_loop_start} %s Quote loop start" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_INDEX="{quotation_index} %s Quote Index" +COM_REDSHOP_TEMPLATE_TAG_QUOTATION_LOOP_END="{quotation_loop_end} %s Quote loop end" +COM_REDSHOP_TEMPLATE_TAG_TAG_IMAGE="{tag_image} %s Tag Image" +COM_REDSHOP_TEMPLATE_TAG_TAG_TITLE="{tag_title} %s Tag Title" +COM_REDSHOP_TEMPLATE_TAG_EDIT_TAG_LINK="{edit_tag_link} %s Edit tag link" +COM_REDSHOP_TEMPLATE_TAG_WISHLIST_IMAGE="{wishlist_image} %s Wishlist Image" +COM_REDSHOP_TEMPLATE_TAG_WISHLIST_TITLE="{wishlist_title} %s Wishlist Title" +COM_REDSHOP_TEMPLATE_TAG_EDIT_WISHLIST_LINK="{edit_wishlist_link} %s Edit wishlist link" +COM_REDSHOP_TEMPLATE_TAG_COMPARE_IMAGE="{compare_image} %s Compare Image" +COM_REDSHOP_TEMPLATE_TAG_COMPARE_TITLE="{compare_title} %s Compare Title" +COM_REDSHOP_TEMPLATE_TAG_EDIT_COMPARE_LINK="{edit_compare_link} %s Edit compare link" +COM_REDSHOP_TEMPLATE_TAG_LOGOUT_LINK="{logout_link} %s Logout link" +COM_REDSHOP_TEMPLATE_TAG_NEWSLETTER_SIGNUP_LBL="{newsletter_signup_lbl} %s Newsletter subscribe and unsubscribe" +COM_REDSHOP_TEMPLATE_TAG_RESERVE_DISCOUNT="{reserve_discount} %s Reserve Discount" +COM_REDSHOP_TEMPLATE_TAG_RESERVE_DISCOUNT_LBL="{reserve_discount_lbl} %s Reserve Discount Label" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SERIAL_IMAGE="{product_serial_image} %s Product serial image" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_SERIAL_TITLE="{product_serial_title} %s product serial title" +COM_REDSHOP_TEMPLATE_TAG_COMPARE_PRODUCT_HEADING="{compare_product_heading} %s Compare Product Heading" +COM_REDSHOP_TEMPLATE_TAG_EXPAND_COLLAPSE="{expand_collapse} %s Expand Collapse Tag" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_CATEGORY="{product_category} %s Category Name" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_CONTENT_HINT="Product Content Template available Tags" +COM_REDSHOP_TEMPLATE_TAG_REMOVE="{remove} %s Remove product from compare list" +COM_REDSHOP_TEMPLATE_TAG_ADD_TO_CART="{add_to_cart} %s Add Product to cart" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_FIELD="{product_field} %s Replace product_field with your Customer Product field name" +COM_REDSHOP_TEMPLATE_TAG_PAYMENT_HEADING="{payment_heading} %s Payment Heading Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_HEADING="{shipping_heading} %s Shipping Heading Label," +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_METHOD_LOOP_START="{shipping_method_loop_start} %s Shipping Method loop start" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_METHOD_TITLE="{shipping_method_title} %s Shipping Method Title" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_RATE_LOOP_START="{shipping_rate_loop_start} %s Shipping rate loop start" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_RATE="{shipping_rate} %s Shipping rate" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_LOCATION="{shipping_location} %s Shipping Location" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_RATE_LOOP_END="{shipping_rate_loop_end} %s Shipping rate loop end" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_METHOD_LOOP_END="{shipping_method_loop_end} %s Shipping method loop end" +COM_REDSHOP_TEMPLATE_TAG_EDIT_BILLING_ADDRESS="{edit_billing_address} %s Edit Billing Address Button" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_BOX_HEADING="{shipping_box_heading} %s Shipping Box Heading Label" +COM_REDSHOP_TEMPLATE_TAG_SHIPPING_BOX_LIST="{shipping_box_list} %s Shipping Box list" +COM_REDSHOP_TEMPLATE_TAG_APPLY_BUTTON="{apply_button} %s Apply Button" +COM_REDSHOP_TEMPLATE_TAG_SEARCHED_TAG="{searched_tag} %s Extra field value which you selected in the Letter search module" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_ATTRIBUTE_CALCULATED_PRICE="{product_attribute_calculated_price} %s Show attribute final calculated price" +COM_REDSHOP_TEMPLATE_TAG_ACCOUNT_LINK="{account_link} %s Account link" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_GIFT="{product_gift} %s Product Gift List. Install Product gift Plugin before use" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_GIFT_TABLE="{product_gift_table} %s Product Gift Table. Install Product gift Plugin before use" + +; TEMPLATE TAGS FOR SEPARATE TEMPLATE +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SEND_MAIL_NAME="{name} %s recipient Name" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_FIRST_REMINDER_NAME="{name} %s recipient Name" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SECOND_REMINDER_NAME="{name} %s recipient Name" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_COUPON_REMINDER_NAME="{name} %s recipient Name" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SAMPLE_FIRST_REMINDER_NAME="{name} %s recipient Name" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SAMPLE_SECOND_REMINDER_NAME="{name} %s recipient Name" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SAMPLE_THIRD_REMINDER_NAME="{name} %s recipient Name" +COM_REDSHOP_MAIL_TEMPLATE_TAG_CATALOG_SAMPLE_COUPON_REMINDER_NAME="{name} %s recipient Name" +COM_REDSHOP_MAIL_TEMPLATE_TAG_QUOTATION_REGISTRATION_MAIL_LINK="{link} %s Quote detail link" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRODUCT_THUMB_IMAGE="{product_thumb_image} %s Product main image" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRODUCT_THUMB_IMAGE_2="{product_thumb_image_2} %s Product main image #2" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_PRODUCT_THUMB_IMAGE_3="{product_thumb_image_3} %s Product main image #3" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_RETURNTOCATEGORY_NAME="{returntocategory_name} %s Return to category name" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_RETURNTOCATEGORY_LINK="{returntocategory_link} %s Return to category page Link" +COM_REDSHOP_TEMPLATE_TAG_PRODUCT_RETURNTOCATEGORY="{returntocategory} %s Link to category Page" +COM_REDSHOP_TEMPLATE_TAG_CART_PRODUCT_NAME_NOLINK="{product_name_nolink} %s Cart item name without link" +COM_REDSHOP_TEMPLATE_TAG_CART_PRODUCT_THUMB_IMAGE="{product_thumb_image} %s Product Thumb Image of Cart Item" +COM_REDSHOP_TEMPLATE_TAG_CART_PRODUCT_ACCESSORY="{product_accessory} %s Cart Accessory" +COM_REDSHOP_TEMPLATE_TAG_CART_PRODUCT_TOTAL_PRICE="{product_total_price} %s Price of product * quantity" +COM_REDSHOP_TEMPLATE_TAG_CART_PRODUCT_NAME="{product_name} %s Cart item name" +COM_REDSHOP_TEMPLATE_TAG_CART_PRODUCT_ATTRIBUTE="{product_attribute} %s Cart Attributes" +COM_REDSHOP_TEMPLATE_TAG_CHECKOUT_SHIPPING="{shipping} %s Cost of shipping" +COM_REDSHOP_TEMPLATE_TAG_CHECKOUT_PRODUCT_ATTRIBUTE="{product_attribute} %s Cart Attributes" +COM_REDSHOP_TEMPLATE_TAG_CHECKOUT_PRODUCT_ACCESSORY="{product_accessory} %s Cart Accessory" +COM_REDSHOP_TEMPLATE_TAG_CHECKOUT_BACK_BUTTON="{checkout_back_button} %s Back to step 1 of checkout process" +COM_REDSHOP_TEMPLATE_TAG_CHECKOUT_PRODUCT_NAME="{product_name} %s Cart item name" +COM_REDSHOP_TEMPLATE_TAG_CHECKOUT_PRODUCT_NUMBER="{product_number} %s Product Number" +COM_REDSHOP_TEMPLATE_TAG_CATEGORY_PRODUCT_MANUFACTURER_PRODUCT_LINK="{manufacturer_product_link} %s Manufacturer" +COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_WITH_CART_WITHOUT_VAT="{without_vat} %s Property price withoutvat" +COM_REDSHOP_TEMPLATE_TAG_COMPARE_PRODUCT_REMOVE_ALL="{remove_all} %s Remove all items" +COM_REDSHOP_TEMPLATE_TAG_COMPARE_PRODUCT_RETURNTOCATEGORY_NAME="{returntocategory_name} %s Return to Category Name" +COM_REDSHOP_TEMPLATE_TAG_COMPARE_PRODUCT_RETURNTOCATEGORY_LINK="{returntocategory_link} %s Return to Category Link" +COM_REDSHOP_FIELDS_MEDIA_DEPRECATED="The media type is deprecated, please use content plugin to parse media on your page. Read more." + +; Credit Card Types +COM_REDSHOP_CARD_TYPE_ALL="Select All Cards" + +COM_REDSHOP_CARD_TYPE_VISA="Visa" +COM_REDSHOP_CARD_TYPE_MASTERCARD="MasterCard" +COM_REDSHOP_CARD_TYPE_AMERICAN_EXPRESS="American Express" +COM_REDSHOP_CARD_TYPE_MAESTRO="Maestro" +COM_REDSHOP_CARD_TYPE_JCB="JCB" +COM_REDSHOP_CARD_TYPE_DINERS_CLUB="Diners Club" +COM_REDSHOP_CARD_TYPE_DISCOVER="Discover" + +COM_REDSHOP_CARD_TYPE_DANKORT="Dankort" +COM_REDSHOP_CARD_TYPE_VD="VISA Dankort" +COM_REDSHOP_CARD_TYPE_VE="VISA Electron" +COM_REDSHOP_CARD_TYPE_MCDK="Mastercard (DK)" +COM_REDSHOP_CARD_TYPE_MC="Mastercard" +COM_REDSHOP_CARD_TYPE_VEDK="VISA Electron (DK)" +COM_REDSHOP_CARD_TYPE_JCB="JCB" +COM_REDSHOP_CARD_TYPE_DDK="Diners (DK)" +COM_REDSHOP_CARD_TYPE_MDK="Maestro (DK)" +COM_REDSHOP_CARD_TYPE_AEDK="American Express (DK)" +COM_REDSHOP_CARD_TYPE_DINERS="Diners Club" +COM_REDSHOP_CARD_TYPE_JCBS="JCB Secure (3D-Secure)" +COM_REDSHOP_CARD_TYPE_AE="American Express" +COM_REDSHOP_CARD_TYPE_MAESTRO="Maestro" +COM_REDSHOP_CARD_TYPE_FORBRUGSFORENINGEN="FORBRUGSFORENINGEN" +COM_REDSHOP_CARD_TYPE_EWIRE="Ewire" +COM_REDSHOP_CARD_TYPE_IKANO="Ikano" +COM_REDSHOP_CARD_TYPE_NORDEA="Nordea" +COM_REDSHOP_CARD_TYPE_DB="Danske Bank" +COM_REDSHOP_CARD_TYPE_MASTERCARDDEBETCARD="Mastercard Debet card" +COM_REDSHOP_CARD_TYPE_PAII="Mobilbetaling Paii" +COM_REDSHOP_CARD_TYPE_VIABILL="ViaBill" +COM_REDSHOP_ALERT="Alerts" +COM_REDSHOP_ALERT_MANAGEMENT="Alert Management" +COM_REDSHOP_ALERT_READ="Read" +COM_REDSHOP_ALERT_UNREAD="Unread" +COM_REDSHOP_ALERT_MESSAGE="Message" +COM_REDSHOP_ALERT_DATE="Date" +COM_REDSHOP_ALERT_READ_FILTER="Alert Filter" +COM_REDSHOP_ALERT_READ_SUCCESSFULLY="Read Successfully" +COM_REDSHOP_ALERT_UNREAD_SUCCESSFULLY="Unread Successfully" +COM_REDSHOP_ALERT_DELETED_SUCCESSFULLY="Deleted Successfully" +COM_REDSHOP_ALERT_VIEW_ALL="Read all" +COM_REDSHOP_SELECT_IMAGE="Select Image" +COM_REDSHOP_ADDITIONAL_INFORMATION="Additional Information" +COM_REDSHOP_PRODUCT_MEASURES="Product Measures" +COM_REDSHOP_UPLOAD_IMAGE_WARNING="The image will change after you click on save" +COM_REDSHOP_LOGIN_TEMPLATE="Login Template" +COM_REDSHOP_DEFAULT_STOCKROOM_BELOW_AMOUNT_NUMBER_LBL="Alert below amount number" +COM_REDSHOP_CONFIG_LOAD_REDSHOP_STYLE_LBL="Do you want to load redSHOP style?" +COM_REDSHOP_CONFIG_LOAD_REDSHOP_STYLE_DESC="Do you want to load redSHOP style?" +COM_REDSHOP_ADMIN_WELCOME="Welcome %s" +COM_REDSHOP_CUSTOMER_TYPE="Customer Type" +COM_REDSHOP_DISCOUNT_NAME_MUST_FILLED="Please Enter Discount Name." + +; Joomla! global configuration +COM_REDSHOP_CONFIGURATION="redSHOP configuration" + +; Add quotation detail view +COM_REDSHOP_PLEASE_ENTER_VALID_QUANTITY="Please enter valid quantity" + +; Mass discount view +COM_REDSHOP_MASS_DISCOUNT_DETAIL_NO_PRODUCTS_SELECTED="No product(s) selected. Please choose at least one product to create discount rule." +COM_REDSHOP_MASS_DISCOUNT_MISSING_DISCOUNT_NAME="Mass discount name is missing discount name" +COM_REDSHOP_MASS_DISCOUNT_DISCOUNT_AMOUNT_MUST_BE_LARGER_THAN_ZERO="Mass discount amount must be larger than zero" +COM_REDSHOP_MASS_DISCOUNT_DISCOUNT_TYPE_IS_REQUIRED="The discount type of mass discount is required" +COM_REDSHOP_ENABLE_STOCKROOM_NOTIFICATION="Enable Stockroom Notification" +COM_REDSHOP_MASS_DISCOUNT_ERROR_ENDDATE_LOWER_STARTDATE="Enddate lower than startdate" + +; Configuration - Reset template layout +COM_REDSHOP_GO="GO" +COM_REDSHOP_ARE_YOU_SURE_YOU_WANT_TO_CONTINUE="Are you sure you want to continue" + +; Order +COM_REDSHOP_ERROR_SENDING_ORDER_MAIL="Error sending order mail" +COM_REDSHOP_ORDER_DELETE_ORDERS_CONFIRM="Are you sure you want to delete these orders?" +COM_REDSHOP_ORDER_PLACED="Order placed" + +; Orders +COM_REDSHOP_ORDERS_CUSTOMER_NOTE="Customer note" +COM_REDSHOP_TRACKING_NUMBER="Tracking number" + +; redSHOP Attributes +COM_REDSHOP_ATTRIBUTES="Attributes" +COM_REDSHOP_ATTRIBUTE_LISTING="Attribute List" +COM_REDSHOP_ADD_PROPERTY_LISTING="Property List" +COM_REDSHOP_ATTRIBUTE_MANAGEMENT="Attribute Management" +COM_REDSHOP_ATTRIBUTE_NAME="Atrribute name" +COM_REDSHOP_ATTRIBUTE_DISPLAY_TYPE="Display type" +COM_REDSHOP_ATTRIBUTE_SEARCH_IN_NAME="Search attribute in name" +COM_REDSHOP_N_ITEMS_UNPUBLISHED="%d items successfully unpublished" +COM_REDSHOP_N_ITEMS_PUBLISHED="%d items successfully published" +COM_REDSHOP_DISPLAY_ATTRIBUTE_TYPE_SELECT="-- Select Display type --" +COM_REDSHOP_DISPLAY_ATTRIBUTE_TYPE_DROPDOWN="Dropdown list" +COM_REDSHOP_DISPLAY_ATTRIBUTE_TYPE_RADIO="Radio button" +COM_REDSHOP_PRODUCT_DESC="Select product name" +COM_REDSHOP_ATTRIBUTE_NAME_DESC="Enter attribute name" +COM_REDSHOP_ATTRIBUTE_REQUIRED_DESC="Choose attribute required" +COM_REDSHOP_ALLOW_MULTIPLE_PROPERTY_SELECT="Allow Multiple select" +COM_REDSHOP_ALLOW_MULTIPLE_PROPERTY_SELECT_DESC="Choose allow multiple property selection" +COM_REDSHOP_ATTRIBUTE_PRICE_NOT_VALID="Attribute price is not valid" +COM_REDSHOP_ATTRIBUTE_START_QUANTITY_NOT_VALID="Attribute start quantity is not valid" +COM_REDSHOP_ATTRIBUTE_END_QUANTITY_NOT_VALID="Attribute end quantity is not valid" + +; redSHOP Media +COM_REDSHOP_MEDIA_BUTTON_CROP="Crop" +COM_REDSHOP_MEDIA_BUTTON_REMOVE="Remove" +COM_REDSHOP_MEDIA_BUTTON_INSERT_FROM_MEDIA="Media" +COM_REDSHOP_MEDIA_MODAL_CROPPER_TITLE="Cropping Image" +COM_REDSHOP_MEDIA_MODAL_BTN_CANCEL="Cancel" +COM_REDSHOP_MEDIA_MODAL_BTN_CROP="Crop" +COM_REDSHOP_MEDIA_MODAL_BTN_CLOSE="Close" +COM_REDSHOP_MEDIA_MODAL_ALERT_TITLE="Warning" +COM_REDSHOP_MEDIA_ADDITIONAL_MEDIA_FILES="Additional media files" +COM_REDSHOP_MEDIA_SELECT_FROM_MEDIA="Select from media gallery" +COM_REDSHOP_MEDIA_ATTACHMENT_DETAIL="Attachment detail" +COM_REDSHOP_MEDIA_ASK_DELETE_PERMANENTLY_FILE="Are you sure you want to delete permanently this file?" + +; Statistic +COM_REDSHOP_STATISTIC_ORDER="Order Statistic" +COM_REDSHOP_ORDER_COUNT="Count order" +COM_REDSHOP_APPLY="Apply" +COM_REDSHOP_STATISTIC_PRODUCT="Product Statistic" +COM_REDSHOP_PRODUCT_TOTAL_SALE="Total sale" +COM_REDSHOP_STATISTIC_CUSTOMER="Customer Statistic" +COM_REDSHOP_STATISTIC_QUOTATION="Quotation Statistic" +COM_REDSHOP_STATISTIC_PRODUCT_VARIANT="Product variant Statistic" +COM_REDSHOP_PRODUCT_ATTRIBUTE_SKU="Product Attribute SKU" +COM_REDSHOP_STATISTIC_LAST_DAYS="Last %s days" +COM_REDSHOP_STATISTIC_TOTAL_SALES="Total Sales" +COM_REDSHOP_STATISTIC_ORDER_COUNT="Order Count" +COM_REDSHOP_STATISTIC_TOTAL_MEMBER="Members" +COM_REDSHOP_STATISTIC_TOTAL_VISITOR="Visitors" +COM_REDSHOP_STATISTIC_TODAY="Today" +COM_REDSHOP_STATISTIC_YESTERDAY="Yesterday" +COM_REDSHOP_STATISTIC_THIS_WEEK="This week" +COM_REDSHOP_STATISTIC_LAST_WEEK="Last week" +COM_REDSHOP_STATISTIC_THIS_MONTH="This month" +COM_REDSHOP_STATISTIC_LAST_MONTH="Last month" +COM_REDSHOP_STATISTIC_THIS_YEAR="This year" +COM_REDSHOP_STATISTIC_LAST_YEAR="Last year" +COM_REDSHOP_STATISTIC_LAST_DAYS="Last %d days" + +; Library +COM_REDSHOP_ERROR_INVALID_PRODUCT_ID="Invalid product ID" + +; redSHOP economic +COM_REDSHOP_USER_NOT_SAVED_IN_ECONOMIC="User not saved in economic" + +; Menu form field +COM_REDSHOP_SELECT_PRODUCTS="Select Product" +COM_REDSHOP_HOW_MANY_PRODUCTS="How many products" +COM_REDSHOP_HOW_MANY_PRODUCTS_DESCRIPTION="Enter number of product" + +COM_REDSHOP_TEMPLATE_TAG_MORE_VIDEOS="{more_videos} %s More videos" +COM_REDSHOP_YOUTUBE="Youtube" +COM_REDSHOP_MEDIA_YOUTUBE_ID="Youtube video ID" +COM_REDSHOP_NO_DATA="No data available" + +; Questions +COM_REDSHOP_QUESTION="Question" +COM_REDSHOP_QUESTION_QUESTION="Question" +COM_REDSHOP_QUESTION_LISTING="Questions" +COM_REDSHOP_QUESTION_PRODUCT_NAME="Product name" +COM_REDSHOP_QUESTION_PRODUCT_NAME_DESC="Choose product for ask question" +COM_REDSHOP_VIEW_ANSWER="View Answer" +COM_REDSHOP_ANSWER="Answer" +COM_REDSHOP_QUESTION_ANSWER="Answer" +COM_REDSHOP_ANSWER_MANAGEMENT="Answer Management" +COM_REDSHOP_QUESTION_OWNER_NAME="Question Owner Name" +COM_REDSHOP_QUESTION_OWNER_EMAIL="Question Owner Email" +COM_REDSHOP_QUESTION_TELEPHONE="User Phone" +COM_REDSHOP_QUESTION_TELEPHONE_DESC="Phone number of user who ask question." +COM_REDSHOP_QUESTION_USER_ADDRESS="User Address" +COM_REDSHOP_QUESTION_USER_ADDRESS_DESC="Address of user who ask question." +COM_REDSHOP_QUESTION_PUBLISHED="Published" +COM_REDSHOP_QUESTION_PUBLISHED_DESC="This question is published or not." + +; Table +COM_REDSHOP_TABLE_ORDER_REDSHOP_INVALID_ORDER_STATUS="Invalid order status" + +; Install +COM_REDSHOP_LEGACY_MIGRATING="Legacy migrating" +COM_REDSHOP_TRY_TO_MIGRATE_PREVIOUS_CONFIGURATION="Try to migrate previous configuration" +COM_REDSHOP_MIGRATED_PREVIOUS_CONFIGURATION="Migrated previous configuration" +COM_REDSHOP_DELETED_PREVIOUS_CONFIGURATION="Deleted previous configuration" +COM_REDSHOP_PREVIOUS_CONFIGURATION_NOT_FOUND="Previous configuration not found" + +; Order Status +COM_REDSHOP_ORDER_STATUS_CODE="Code" +COM_REDSHOP_ORDER_STATUS_CODE_DESC="Code of this order status." +COM_REDSHOP_ORDER_STATUS_NAME="Name" +COM_REDSHOP_ORDER_STATUS_NAME_DESC="Name of this order status." +COM_REDSHOP_ORDER_STATUS_PUBLISHED="Published" +COM_REDSHOP_ORDER_STATUS_PUBLISHED_DESC="Order status published state." +COM_REDSHOP_ORDER_STATUS_ERROR_STATUS_EXIST="This status code is already exist!" +COM_REDSHOP_ORDER_STATUS_CHANGE_TO="Status has been changed to" +COM_REDSHOP_ORDER_PAYMENT_STATUS_CHANGE_TO="Payment status has been changed to" + +; Tax groups +COM_REDSHOP_TAX_GROUPS_DELETE_CONFIRM="Are you sure you want to delete these tax group(s)?" +COM_REDSHOP_TAX_GROUP_ERROR_DELETE_HAVE_TAX_RATE="Can not delete tax group %s. This still have tax rate running." + +; Tax Rates +COM_REDSHOP_TAX_RATES_SIDEBAR="VAT/Tax rates" +COM_REDSHOP_TAX_RATES="VAT/Tax rates" +COM_REDSHOP_TAX_RATE_NAME="Name" +COM_REDSHOP_TAX_RATE_NAME_DESC="Enter name of tax rate" +COM_REDSHOP_TAX_RATE_COUNTRY="Country" +COM_REDSHOP_TAX_RATE_COUNTRY_DESC="Country where apply this tax rate" +COM_REDSHOP_TAX_RATE_STATE="State" +COM_REDSHOP_TAX_RATE_STATE_DESC="If relevant, select the state you need to enter a VAT rate for." +COM_REDSHOP_TAX_RATE_AMOUNT="Amount" +COM_REDSHOP_TAX_RATE_AMOUNT_DESC="Amount of tax rate (example for 16% enter 0.16)" +COM_REDSHOP_TAX_RATE_GROUP="Group" +COM_REDSHOP_TAX_RATE_GROUP_DESC="Group of tax" +COM_REDSHOP_TAX_RATE_EU="EU Country" +COM_REDSHOP_TAX_RATE_EU_SHORT="EU" +COM_REDSHOP_TAX_RATE_EU_DESC="Is this tax on EU countries?" +COM_REDSHOP_TAX_RATE_NAME_DEFAULT="VAT / Tax rate" +COM_REDSHOP_TAX_RATE_FILTER_SELECT_TAX_GROUP="-- Choose VAR/Tax group --" +COM_REDSHOP_TAX_RATE_FILTER_SELECT_COUNTRY="-- Choose country --" +COM_REDSHOP_TAX_RATE_FILTER_EU="-- EU country --" +COM_REDSHOP_TAX_RATE_STATE_SELECT="-- Select state --" +COM_REDSHOP_TAX_RATE_COUNTRY_SELECT="-- Select country --" +COM_REDSHOP_TAX_RATE_GROUP_SELECT="-- Select tax group --" + +; Mass discount view +COM_REDSHOP_MASS_DISCOUNT_PRODUCT="Product mass discount" + +; Mass discount +COM_REDSHOP_MASS_DISCOUNT_MANAGEMENT="Mass Discounts Management" +COM_REDSHOP_MASS_DISCOUNT_NAME="Name" +COM_REDSHOP_MASS_DISCOUNT_NAME_DESC="Enter a name for this mass discount." +COM_REDSHOP_MASS_DISCOUNT_TYPE="Type" +COM_REDSHOP_MASS_DISCOUNT_TYPE_DESC="Select if discount should be a fixed monetary amount, or a percentage" +COM_REDSHOP_MASS_DISCOUNT_TYPE_OPTION_PERCENTAGE="Percentage" +COM_REDSHOP_MASS_DISCOUNT_TYPE_OPTION_TOTAL="Total" +COM_REDSHOP_MASS_DISCOUNT_AMOUNT="Amount" +COM_REDSHOP_MASS_DISCOUNT_AMOUNT_DESC="Enter discount amount." +COM_REDSHOP_MASS_DISCOUNT_START_DATE="Start date" +COM_REDSHOP_MASS_DISCOUNT_START_DATE_DESC="Enter start date for discount." +COM_REDSHOP_MASS_DISCOUNT_END_DATE="End date" +COM_REDSHOP_MASS_DISCOUNT_END_DATE_DESC="Enter end date for discount." +COM_REDSHOP_MASS_DISCOUNT_PRODUCTS="Products" +COM_REDSHOP_MASS_DISCOUNT_PRODUCTS_DESC="Select products which this discount applied on." +COM_REDSHOP_MASS_DISCOUNT_PRODUCTS_SELECT_OPTION="-- Select products --" +COM_REDSHOP_MASS_DISCOUNT_CATEGORIES="Categories" +COM_REDSHOP_MASS_DISCOUNT_CATEGORIES_DESC="Select categories which this discount applied on." +COM_REDSHOP_MASS_DISCOUNT_CATEGORIES_SELECT_OPTION="-- Select categories --" +COM_REDSHOP_MASS_DISCOUNT_MANUFACTURERS="Manufacturers" +COM_REDSHOP_MASS_DISCOUNT_MANUFACTURERS_DESC="Select manufacturers which this discount would applied on." +COM_REDSHOP_MASS_DISCOUNT_MANUFACTURERS_SELECT_OPTION="-- Select manufacturers --" +COM_REDSHOP_MASS_DISCOUNT_DELETE_MASS_DISCOUNTS="Are you sure you want to delete these Mass Discounts?" +COM_REDSHOP_MASS_DISCOUNT_FILTER_TYPE_OPTION_SELECT="-- Select Type --" +; Mass discount table +COM_REDSHOP_MASS_DISCOUNT_ENDDATE_LOWER_STARTDATE="Enddate is lower than startdate" + +; PDF Generator +COM_REDSHOP_ERROR_MISSING_PDF_PLUGIN="Error! There are no available PDF library. Please install at least one plugin for use this feature." +COM_REDSHOP_ERROR_GENERATE_PDF="Error! There are some problem when generate PDF file." +COM_REDSHOP_WARNING_MISSING_PDF_PLUGIN="PDF features has been disabled because system does not find any PDF library available.
    • Install new for install an necessary PDF plugin.
    • Enable plugin: Please go here and enable at least one of them if already installed.
    " + +; Mass changing order status & order payment status in order backend +COM_REDSHOP_MASS_CHANGE_STATUS_ORDER="Change status of multi-order" + +; Export +COM_REDSHOP_EXPORT_START="Start Export" +COM_REDSHOP_EXPORT_STEP_1="Step 1. Select export part" +COM_REDSHOP_EXPORT_STEP_2="Step 2. Configuration" +COM_REDSHOP_EXPORT_STEP_3="Step 3. Process" +COM_REDSHOP_EXPORT_LOG="Log" +COM_REDSHOP_EXPORT_DONE="Done" +COM_REDSHOP_EXPORT_WARNING_MISSING_PLUGIN="There are no available plugins for Export features.
    • Install new for install an necessary Export plugin.
    • Enable plugin: Please go here and enable at least one of them if already installed.
    " +COM_REDSHOP_EXPORT_CONFIG_SEPARATOR="Separator" + +; Import +COM_REDSHOP_IMPORT_CONFIGURATION="Import configuration" +COM_REDSHOP_IMPORT_SELECT_TYPE="Select Import Scope" +COM_REDSHOP_IMPORT_WARNING_MISSING_PLUGIN="There are no available plugins for Import features.
    • Install new for install an necessary Import plugin.
    • Enable plugin: Please go here and enable at least one of them if already installed.
    " +COM_REDSHOP_IMPORT_STEP_1="1. Select import" +COM_REDSHOP_IMPORT_STEP_2="2. Configuration" +COM_REDSHOP_IMPORT_STEP_3="3. Upload file" +COM_REDSHOP_IMPORT_DATA_IMPORT="Data to import" +COM_REDSHOP_IMPORT_CONFIG_SEPARATOR="Separator" +COM_REDSHOP_IMPORT_ENCODING="Character encoding" +COM_REDSHOP_IMPORT_SELECT_FILE="Upload file" +COM_REDSHOP_IMPORT_FAIL="Import fail" +COM_REDSHOP_IMPORT_SUCCESS="Import success" +COM_REDSHOP_IMPORT_ERROR_FILE_TYPE="Error: Wrong file type. File type must be CSV" +COM_REDSHOP_IMPORT_ERROR_FILE_SIZE="Error: File size is too big. File size must smaller than %d bytes" +COM_REDSHOP_IMPORT_ERROR_FILE_MIN_SIZE="Error: File size is too small. File size must bigger than %d bytes" +COM_REDSHOP_IMPORT_ERROR_FILE_MAX_SIZE="Error: File size is too large. File size must smaller than %d bytes" +COM_REDSHOP_IMPORT_ERROR_UPLOAD_FILE="Error: Can not upload file." +COM_REDSHOP_IMPORT_MESSAGE_UPLOAD_FILE_SUCCESS="Upload file success." + +; Install +COM_REDSHOP_INSTALL_RUN_VERSION_TASKS_UPDATE_WARNING="This is list of migration or optimize tasks from last specific version. Each of version has list of tasks which already run when upgrade.
    Somehow some of them not run successfully, this is list allow you can re-run migration / optimize tasks from last version." +COM_REDSHOP_INSTALL_RUN_VERSION_TASKS_UPDATE="Run last version tasks." +COM_REDSHOP_INSTALL_TITLE="Installation process" +COM_REDSHOP_INSTALL_SUCCESS="Congratulation! redSHOP has been installed successfully." +COM_REDSHOP_INSTALL_STEP_SUCCESS="Success" +COM_REDSHOP_INSTALL_STEP_FAIL="Fail" +COM_REDSHOP_INSTALL_RUN="Run" + +COM_REDSHOP_INSTALL_STEP_SYNCHRONIZE_USERS="Synchronize users" +COM_REDSHOP_INSTALL_STEP_TEMPLATE_DATA="Template data" +COM_REDSHOP_INSTALL_STEP_TEMPLATE_FILES="Template files process" +COM_REDSHOP_INSTALL_STEP_INTEGRATE_SH404SEF="Integrate with Sh404SEF extension" +COM_REDSHOP_INSTALL_STEP_HANDLE_CONFIG="Check configuration file" + +COM_REDSHOP_INSTALL_ERROR_MISSING_CLASS="Missing class: %s" +COM_REDSHOP_INSTALL_ERROR_MISSING_PROCESS="Missing process" +COM_REDSHOP_INSTALL_ERROR_MISSING_METHOD_IN_CLASS="Missing method in class %s :: %s" + +; redSHOP 1.3.3.1 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE1331_UPDATEDATABASESCHEMA="Update database schemas" +COM_REDSHOP_UPDATE_REDSHOPUPDATE1331_CLEANOLDFILES="Clean old files" + +; redSHOP 1.6.0 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE160_CLEANOLDFILES="Clean unused files" + +; redSHOP 2.0.0.2 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE2002_CLEANOLDFILES="Clean unused files" + +; redSHOP 2.0.0.5 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE2005_CLEANOLDFILES="Clean unused files" + +; redSHOP 2.0.3 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE203_CLEANOLDFILES="Clean unused files" +COM_REDSHOP_UPDATE_REDSHOPUPDATE203_UPDATEOVERRIDETEMPLATE="Update override template" + +; redSHOP 2.0.4 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE204_CLEANOLDFILES="Clean unused files" +COM_REDSHOP_UPDATE_REDSHOPUPDATE204_UPDATEIMAGEFILENAMES="Change image file names" +COM_REDSHOP_UPDATE_REDSHOPUPDATE204_UPDATEMENUITEM="Update menu" + +; redSHOP 2.0.6 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE206_CLEANOLDFILES="Clean unused files" +COM_REDSHOP_UPDATE_REDSHOPUPDATE206_UPDATECATEGORY="Update Category" + +; redSHOP 2.0.7 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE207_MIGRATEVOUCHER="Migrate voucher" +COM_REDSHOP_UPDATE_REDSHOPUPDATE207_CLEANOLDFILES="Clean unused files and folders" + +; redSHOP 2.0.9 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE209_MIGRATETEMPLATEFILES="Migrate old templates files to new structure." +COM_REDSHOP_UPDATE_REDSHOPUPDATE209_CLEANOLDFILES="Clean unused files and folders" + +; redSHOP 2.0.10 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE2010_CLEANOLDFILES="Clean unused files and folders" + +; redSHOP 2.0.11 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE2011_CLEANOLDFILES="Clean unused files and folders" + +; redSHOP 2.0.12 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE2012_CLEANOLDFILES="Clean unused files and folders" + +; redSHOP 2.0.13 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE2013_CLEANOLDFILES="Clean unused files and folders" +COM_REDSHOP_UPDATE_REDSHOPUPDATE2013_MIGRATEMANUFACTURERIMAGES="Migrate manufacturer images from old path to new path" + +; redSHOP 2.0.14 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE2014_CLEANOLDFILES="Clean unused files and folders" +COM_REDSHOP_UPDATE_REDSHOPUPDATE2014_MIGRATECATEGORYIMAGES="Migrate category images from old path to new path" + +; redSHOP 2.0.15 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE2015_CLEANOLDFILES="Clean unused files and folders. Refactor Manufacturers" + +; redSHOP 2.1.0 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE210_MIGRATECOUPONS="Migrate coupons" +COM_REDSHOP_UPDATE_REDSHOPUPDATE210_CLEANOLDFILES="Clean unused files and folders" + +; redSHOP 2.1.1 Update +COM_REDSHOP_UPDATE_REDSHOPUPDATE211_FIXCALENDARFORMFIELD="Fix calendar form field" +COM_REDSHOP_UPDATE_REDSHOPUPDATE211_CLEANOLDFILES="Clean unused files and folders" + +; HTML Grid +COM_REDSHOP_GRID_SLIDERTEXT_MORE="More" +COM_REDSHOP_GRID_SLIDERTEXT_LESS="Less" +COM_REDSHOP_ACCESSORY_RELATED_PRODUCT="Accessory/Related Product" + +; Product Price +COM_REDSHOP_PRODUCT_PRICE_ERROR_PRICE_MUST_NOT_NEGATIVE_NUMBER="Oops! Price must be positive number (>= 0.0)" +COM_REDSHOP_IMPORT_SETTINGS_MAX_LINE="Max Line" +COM_REDSHOP_IMPORT_SETTINGS_MAX_LINE_DESC="Enter max line in split files" +COM_REDSHOP_N_ITEMS_CHECKED_IN="%d items successfully checked in" +COM_REDSHOP_PRODUCT_PRICE_SAVE_SUCCESS="Products price save successfully" +COM_REDSHOP_PRODUCT_PRICE_SAVE_FAILED="Failed to save products price" +COM_REDSHOP_PRODUCT_PRICE_INVALID="Product Price must have valid value" +COM_REDSHOP_PRODUCT_PRICE_END_DATE_MUST_MORE_THAN_START_DATE="Start Date is not more than End Date" +COM_REDSHOP_PRODUCT_PRICE_QUANTITY_END_MUST_MORE_THAN_QUANTITY_START="Quantity Start is not more than Quantity End" +COM_REDSHOP_PRODUCT_PRICE_SAVE_SUCCESS="Products price save successfully" +COM_REDSHOP_PRODUCT_PRICE_SAVE_FAILED="Failed to save products price" + +; Configuration +COM_REDSHOP_INVALID_EMAIL="Invalid email" +COM_REDSHOP_INLINE_EDIT_TAB="Inline Edit" +COM_REDSHOP_FEATURE_INLINE_EDIT_LBL="Enable" +COM_REDSHOP_FEATURE_INLINE_EDIT_DESC="If yes, in list view, you can click on data for edit it immediately, do not need open Edit page." + +; Alert +COM_REDSHOP_SUCCESS="Success" +COM_REDSHOP_DATA_UPDATE_SUCCESS="Item data update successful." +COM_REDSHOP_FAIL="Fail" +COM_REDSHOP_DATA_UPDATE_FAIL="Item data update fail." + +; General +COM_REDSHOP_DELETE_CONFIRM="Are you sure want to delete these items?" +COM_REDSHOP_CONFIG_IMAGE_MAX_FILE_SIZE_UPLOAD="Max file size upload" +COM_REDSHOP_CONFIG_IMAGE_MAX_FILE_SIZE_UPLOAD_DESC="Enter maximum media file size to upload" +COM_REDSHOP_UPLOAD_FILE_TOO_BIG="File upload too big" +COM_REDSHOP_MEDIA_ERROR_FILE_UPLOAD_INVALID="File upload invalid!" + +; Backend Access +COM_REDSHOP_ACTION_MANAGE_ACCESS="Backend Access" +COM_REDSHOP_ACTION_MANAGE_ACCOUNT_GROUP="Account Group" +COM_REDSHOP_ACTION_MANAGE_CATALOG="Catalogue" +COM_REDSHOP_ACTION_MANAGE_CATEGORY="Category" +COM_REDSHOP_ACTION_MANAGE_CONFIGURATION="Configuration" +COM_REDSHOP_ACTION_MANAGE_COUNTRY="Country" +COM_REDSHOP_ACTION_MANAGE_CURRENCY="Currencies" +COM_REDSHOP_ACTION_MANAGE_COUPON="Coupon" +COM_REDSHOP_ACTION_MANAGE_DISCOUNT="Order total discount" +COM_REDSHOP_ACTION_MANAGE_DISCOUNT_PRODUCT="Product price discount" +COM_REDSHOP_ACTION_MANAGE_EXPORT="Export" +COM_REDSHOP_ACTION_MANAGE_FIELD="Custom Fields" +COM_REDSHOP_ACTION_MANAGE_FIELD_GROUP="Custom Fields Group" +COM_REDSHOP_ACTION_MANAGE_GIFTCARD="Giftcard" +COM_REDSHOP_ACTION_MANAGE_IMPORT="Import" +COM_REDSHOP_ACTION_MANAGE_MAIL="Mail Center" +COM_REDSHOP_ACTION_MANAGE_MANUFACTURER="Manufacturer" +COM_REDSHOP_ACTION_MANAGE_MASS_DISCOUNT="Mass discounts" +COM_REDSHOP_ACTION_MANAGE_MEDIA="Media" +COM_REDSHOP_ACTION_MANAGE_NEWSLETTER="Newsletter" +COM_REDSHOP_ACTION_MANAGE_ORDER="Order" +COM_REDSHOP_ACTION_MANAGE_ORDER_STATUS="Order status" +COM_REDSHOP_ACTION_MANAGE_PRODUCT="Product" +COM_REDSHOP_ACTION_MANAGE_QUESTION="Question" +COM_REDSHOP_ACTION_MANAGE_QUOTATION="Quotation" +COM_REDSHOP_ACTION_MANAGE_SAMPLE="Product sample" +COM_REDSHOP_ACTION_MANAGE_SHIPPING="Shipping" +COM_REDSHOP_ACTION_MANAGE_STATE="State" +COM_REDSHOP_ACTION_MANAGE_STATISTIC="Statistic" +COM_REDSHOP_ACTION_MANAGE_STOCKROOM="Stockroom" +COM_REDSHOP_ACTION_MANAGE_TEMPLATE="Template" +COM_REDSHOP_ACTION_MANAGE_TEXT_LIBRARY="Text library" +COM_REDSHOP_ACTION_MANAGE_USER="User" +COM_REDSHOP_ACTION_MANAGE_TAX_GROUP="VAT/Tax Group" +COM_REDSHOP_ACTION_MANAGE_TAX_RATE="VAT/Tax Rate" +COM_REDSHOP_ACTION_MANAGE_TEXT="Text library" +COM_REDSHOP_ACTION_MANAGE_VOUCHER="Voucher" +COM_REDSHOP_ACTION_MANAGE_WRAPPING="Wrapping" +COM_REDSHOP_ACTION_MANAGE_SUPPLIER="Supplier" +COM_REDSHOP_ACTION_VIEW="View" +COM_REDSHOP_ACTION_VIEW_DESC="Allow user in this group can access page." +COM_REDSHOP_ACTION_CREATE="Create" +COM_REDSHOP_ACTION_CREATE_DESC="Allow user in this group can create content data." +COM_REDSHOP_ACTION_EDIT="Edit" +COM_REDSHOP_ACTION_EDIT_DESC="Allow user in this group can edit content data." +COM_REDSHOP_ACTION_DELETE="Delete" +COM_REDSHOP_ACTION_DELETE_DESC="Allow user in this group can delete content data." +COM_REDSHOP_ACCESS_SAVE_SUCCESS="Access permission saved successfully." +COM_REDSHOP_ACCESS_HELP_INFORMATION="Access Help" +COM_REDSHOP_ACCESS_HELP_INFORMATION_TEXT="Please click on label of permission for change" +COM_REDSHOP_ACCESS_ERROR_NOT_HAVE_PERMISSION="Oops! You don't have permission" + +; Rules +COM_REDSHOP_RULES_SET_ALL_FOR_ROW="-- Set for row --" +COM_REDSHOP_RULES_SET_ALL_FOR_COLUMN="-- Set for column --" +COM_REDSHOP_UPLOAD_FILE_TOO_BIG="File upload too big" +COM_REDSHOP_MEDIA_ERROR_FILE_UPLOAD_INVALID="File upload invalid!" + +; Fields +COM_REDSHOP_FIELD="Field" +COM_REDSHOP_FIELDS_FILTER_SELECT_FIELD_TYPE="-- Choose field type --" +COM_REDSHOP_FIELDS_FILTER_SELECT_FIELD_SECTION="-- Choose field section --" +COM_REDSHOP_FIELD_MANAGEMENT="Fields Management" +COM_REDSHOP_FIELD_TITLE_HEADER="Title" +COM_REDSHOP_FIELD_NAME_HEADER="Name" +COM_REDSHOP_FIELD_TYPE_HEADER="Type" +COM_REDSHOP_FIELD_SECTION_HEADER="Section" +COM_REDSHOP_TOOLTIP_FIELD_TYPE="Select field type" +COM_REDSHOP_TOOLTIP_FIELD_SECTION="Select field section" +COM_REDSHOP_FIELDS_FILTER_SELECT_FIELD_GROUP="Select field option" +COM_REDSHOP_FIELDS_MASS_ASSIGN_GROUP="Mass assign group" +COM_REDSHOP_FIELDS_MASS_ASSIGN_GROUP_MODAL_TITLE="Choose custom field group" +COM_REDSHOP_FIELDS_MASS_ASSIGN_GROUP_ASSIGN_BTN="Assign" +COM_REDSHOP_FIELDS_ERROR_MASS_ASSIGN_GROUP="Error! Mass assign group for multiple fields fail." +COM_REDSHOP_FIELDS_SUCCESS_MASS_ASSIGN_GROUP="Assign group for multiple fields success." +COM_REDSHOP_FIELDS_MASS_ASSIGN_GROUP_CLEAR="-- Clear group --" + +; Currency +COM_REDSHOP_CURRENCY_NAME="Currency" +COM_REDSHOP_CURRENCY_NAME_DESC="Name of currency" +COM_REDSHOP_CURRENCY_CODE_LBL="Currency Code" +COM_REDSHOP_CURRENCY_CODE_DESC="Short code of currency" +COM_REDSHOP_CURRENCY_LIBRARIES_LBL="Currency Libraries" +COM_REDSHOP_CURRENCY_LIBRARIES_DESC="Choose Currency Libraries to use for convert currency" +COM_REDSHOP_CURRENCY_LAYER_ACCESS_KEY_LBL="Access Key" +COM_REDSHOP_CURRENCY_LAYER_ACCESS_KEY_DESC="Enter Currency Layer Access Key to use this Library" +COM_REDSHOP_CURRENCY_LIBRARIES_LAYER="Currency Layer" +COM_REDSHOP_CURRENCY_LIBRARIES_ECB="European Central Bank" +COM_REDSHOP_CURRENCY_CODE_ALREADY_EXISTS="Currency code already exists" + +; Shopper Groups +COM_REDSHOP_SHOPPER_GROUPS_DELETE_CONFIRM="Are you sure you want to delete these Shopper Groups?" + +; Wishlist +COM_REDSHOP_WISHLIST_TAB="Wishlist" +COM_REDSHOP_WISHLIST_LOGIN_REQUIRED_LBL="Wishlist Login Required" +COM_REDSHOP_TOOLTIP_WISHLIST_LOGIN_REQUIRED="Select 'Yes' if a customer needs to be logged in to use the wishlist." +COM_REDSHOP_WISHLIST_LIST_LBL="Enable Wishlist List" +COM_REDSHOP_TOOLTIP_WISHLIST_LIST="Select 'Yes' if a customer can create the wishlist list." + +; Coupons +COM_REDSHOP_COUPON_MANAGEMENT="Coupon Management" +COM_REDSHOP_COUPON_CODE="Coupon Code" +COM_REDSHOP_COUPON_CODE_DESC="Enter code for this coupon" +COM_REDSHOP_COUPON_VALUE="Value" +COM_REDSHOP_COUPON_VALUE_DESC="Enter value of this coupon" +COM_REDSHOP_COUPON_TYPE="Type" +COM_REDSHOP_COUPON_TYPE_DESC="Choose of type of this coupon" +COM_REDSHOP_COUPON_TYPE_OPTION_SELECT="-- Select type --" +COM_REDSHOP_COUPON_TYPE_OPTION_TOTAL="Total" +COM_REDSHOP_COUPON_TYPE_OPTION_PERCENTAGE="Percentage" +COM_REDSHOP_COUPON_START_DATE="Start date" +COM_REDSHOP_COUPON_START_DATE_DESC="Choose start date when this coupon can be use" +COM_REDSHOP_COUPON_END_DATE="End date" +COM_REDSHOP_COUPON_END_DATE_DESC="Choose end date when this coupon can be use" +COM_REDSHOP_COUPON_EFFECT="Effect" +COM_REDSHOP_COUPON_EFFECT_DESC="Choose where coupon can apply on" +COM_REDSHOP_COUPON_EFFECT_OPTION_SELECT="-- Select effect --" +COM_REDSHOP_COUPON_EFFECT_OPTION_GLOBAL="Global" +COM_REDSHOP_COUPON_EFFECT_OPTION_USER="User specific" +COM_REDSHOP_COUPON_LEFT="Amount left" +COM_REDSHOP_COUPON_LEFT_DESC="Amount left of this coupon" +COM_REDSHOP_COUPON_SUBTOTAL="Subtotal" +COM_REDSHOP_COUPON_SUBTOTAL_DESC="Subtotal" +COM_REDSHOP_COUPON_FREE_SHIPPING="Free shipping" +COM_REDSHOP_COUPON_FREE_SHIPPING_DESC="Is this coupon free ship?" +COM_REDSHOP_COUPON_USER_SPECIFIC="User" +COM_REDSHOP_COUPON_USER_SPECIFIC_DESC="Choose user" +COM_REDSHOP_COUPON_USER_SPECIFIC_SELECT="-- Choose user --" +COM_REDSHOP_COUPON_REMAINING_AMOUNT="Unused Amount" +COM_REDSHOP_COUPON_ERROR_CODE_ALREADY_EXIST="Oops! Coupon Code already exists." + +; Vouchers +COM_REDSHOP_VOUCHER_MANAGEMENT="Voucher Management" +COM_REDSHOP_VOUCHER_AMOUNT="Amount" +COM_REDSHOP_VOUCHER_AMOUNT_DESC="Enter amount for the discount given with this voucher." +COM_REDSHOP_VOUCHER_CODE="Code" +COM_REDSHOP_VOUCHER_CODE_DESC="Enter a voucher code. Your customer will need to type that code to use the voucher in your shop." +COM_REDSHOP_VOUCHER_FREE_SHIP="Free Ship" +COM_REDSHOP_VOUCHER_FREE_SHIP_DESC="Is that voucher free ship." +COM_REDSHOP_VOUCHER_TYPE="Type" +COM_REDSHOP_VOUCHER_TYPE_DESC="Select if the voucher value should be indicated in percentage or a monetary amount." +COM_REDSHOP_VOUCHER_TYPE_OPTION_TOTAL="Total" +COM_REDSHOP_VOUCHER_TYPE_OPTION_PERCENTAGE="Percentage" +COM_REDSHOP_VOUCHER_START_DATE="Start Date" +COM_REDSHOP_VOUCHER_START_DATE_DESC="Choose the start date for the usage of this voucher" +COM_REDSHOP_VOUCHER_END_DATE="End Date" +COM_REDSHOP_VOUCHER_END_DATE_DESC="Choose the end date for the usage of this voucher" +COM_REDSHOP_VOUCHER_AMOUNT_LEFT="Amount left" +COM_REDSHOP_VOUCHER_AMOUNT_LEFT_DESC="Tooltip Voucher Left" +COM_REDSHOP_VOUCHER_PRODUCT="Voucher Products" +COM_REDSHOP_VOUCHER_MANAGEMENT_DETAIL="Voucher management detail" +COM_REDSHOP_VOUCHER_FILTER_TYPE_SELECT="-- Voucher type --" +COM_REDSHOP_VOUCHER_FILTER_FREE_SHIP_SELECT="-- Free ship --" +COM_REDSHOP_VOUCHER_PRODUCTS="Products" +COM_REDSHOP_VOUCHER_PRODUCTS_DESC="Select some products associated with this voucher. If there are no product selected, this voucher will effected on all products." +COM_REDSHOP_VOUCHER_ERROR_CODE_ALREADY_EXIST="Oops! Code already exists." +COM_REDSHOP_ZERO_PRICE_REPLACEMENT_LBL="Zero Price Replacement" +COM_REDSHOP_TOOLTIP_ZERO_PRICE_REPLACEMENT_LBL="Type the value which you want to show to your Zero price replacement output." + +; Template +COM_REDSHOP_TEMPLATE_ORDER_STATUS="Order Status" +COM_REDSHOP_TEMPLATE_ORDER_STATUS_DESC="Choose Order Status which this template has effect" +COM_REDSHOP_TEMPLATE_PAYMENT_METHOD="Payment Methods" +COM_REDSHOP_TEMPLATE_PAYMENT_METHOD_DESC="Choose Payment Methods which this template has effect" +COM_REDSHOP_TEMPLATE_SHIPPING_METHOD="Shipping Methods" +COM_REDSHOP_TEMPLATE_SHIPPING_METHOD_DESC="Choose Shipping Methods which this template has effect" +COM_REDSHOP_TEMPLATE_NAME="Template Name" +COM_REDSHOP_TEMPLATE_NAME_DESC="Enter name of template" +COM_REDSHOP_TEMPLATE_SECTION="Template Section" +COM_REDSHOP_TEMPLATE_SECTION_DESC="Choose section of template" +COM_REDSHOP_TEMPLATE_SWITCH_METHOD="Switch template editor temporary to..." +COM_REDSHOP_TEMPLATE_CODE_MIRRONR="Code Mirror" +COM_REDSHOP_TEMPLATE_JOOMLA_DEFAULT="Default - from Joomla! Configuration" +COM_REDSHOP_EDIT_TEMPLATES="Edit template" +COM_REDSHOP_TEMPLATE_MANAGEMENT="Template Management" +COM_REDSHOP_TEMPLATE_TAG_NO_TAGS_AVAILABLE="No tags available" + +; Discounts +COM_REDSHOP_DISCOUNT_NAME="Name" +COM_REDSHOP_DISCOUNT_NAME_DESC="Enter name of this discount." +COM_REDSHOP_DISCOUNT_AMOUNT="Total amount" +COM_REDSHOP_DISCOUNT_AMOUNT_DESC="Enter amount of order total for enable this discount." +COM_REDSHOP_DISCOUNT_CONDITION="Condition" +COM_REDSHOP_DISCOUNT_CONDITION_DESC="Choose condition of this discount." +COM_REDSHOP_DISCOUNT_CONDITION_OPTION_LOWER="Lower" +COM_REDSHOP_DISCOUNT_CONDITION_OPTION_EQUAL="Equal" +COM_REDSHOP_DISCOUNT_CONDITION_OPTION_HIGHER="Higher" +COM_REDSHOP_DISCOUNT_DISCOUNT_TYPE="Type" +COM_REDSHOP_DISCOUNT_DISCOUNT_TYPE_DESC="Choose discount type for total or percentage." +COM_REDSHOP_DISCOUNT_DISCOUNT_TYPE_OPTION_SELECT="-- Select discount type --" +COM_REDSHOP_DISCOUNT_DISCOUNT_TYPE_OPTION_TOTAL="Total" +COM_REDSHOP_DISCOUNT_DISCOUNT_TYPE_OPTION_PERCENTAGE="Percentage" +COM_REDSHOP_DISCOUNT_DISCOUNT_AMOUNT="Discount amount" +COM_REDSHOP_DISCOUNT_DISCOUNT_AMOUNT_DESC="Enter amount of discount." +COM_REDSHOP_DISCOUNT_START_DATE="Start date" +COM_REDSHOP_DISCOUNT_START_DATE_DESC="Enter start date when this discount has effect" +COM_REDSHOP_DISCOUNT_END_DATE="End date" +COM_REDSHOP_DISCOUNT_END_DATE_DESC="Enter end date when this discount has effect" +COM_REDSHOP_DISCOUNT_SHOPPER_GROUP="Shopper group" +COM_REDSHOP_DISCOUNT_SHOPPER_GROUP_DESC="Select which shopper group can apply this discount" +COM_REDSHOP_DISCOUNT_SHOPPER_GROUP_OPTION_SELECT="-- Select shopper group --" +COM_REDSHOP_DISCOUNT_ERROR_DISCOUNT_PERCENTAGE="Oops! Your discount type is percentage, but amount is higher than 100." +COM_REDSHOP_DISCOUNT_ERROR_START_DATE_SAME_HIGH_END_DATE="Oops! Discount start date is equal or higher than end date." +COM_REDSHOP_DISCOUNT_ERROR_AMOUNT_ZERO="Oops! Amount must be greater than 0" +COM_REDSHOP_DISCOUNT_ERROR_DISCOUNT_AMOUNT_ZERO="Oops! Discount amount must be greater than 0" +COM_REDSHOP_DISCOUNT_ERROR_MISSING_SHOPPER_GROUPS="Oops! Missing shopper groups" +COM_REDSHOP_DISCOUNT_ERROR_AMOUNT_HIGHT_DISCOUNT_AMOUNT="Oops! Amount must hight discount product" + +; Discount Products +COM_REDSHOP_DISCOUNT_PRODUCT_AMOUNT="Total amount" +COM_REDSHOP_DISCOUNT_PRODUCT_AMOUNT_DESC="Enter amount of order total for enable this discount." +COM_REDSHOP_DISCOUNT_PRODUCT_CONDITION="Condition" +COM_REDSHOP_DISCOUNT_PRODUCT_CONDITION_DESC="Choose condition of this discount." +COM_REDSHOP_DISCOUNT_PRODUCT_CONDITION_OPTION_LOWER="Lower" +COM_REDSHOP_DISCOUNT_PRODUCT_CONDITION_OPTION_EQUAL="Equal" +COM_REDSHOP_DISCOUNT_PRODUCT_CONDITION_OPTION_HIGHER="Higher" +COM_REDSHOP_DISCOUNT_PRODUCT_DISCOUNT_TYPE="Type" +COM_REDSHOP_DISCOUNT_PRODUCT_DISCOUNT_TYPE_DESC="Choose discount type for total or percentage." +COM_REDSHOP_DISCOUNT_PRODUCT_DISCOUNT_TYPE_OPTION_SELECT="-- Select discount type --" +COM_REDSHOP_DISCOUNT_PRODUCT_DISCOUNT_TYPE_OPTION_TOTAL="Total" +COM_REDSHOP_DISCOUNT_PRODUCT_DISCOUNT_TYPE_OPTION_PERCENTAGE="Percentage" +COM_REDSHOP_DISCOUNT_PRODUCT_DISCOUNT_AMOUNT="Discount amount" +COM_REDSHOP_DISCOUNT_PRODUCT_DISCOUNT_AMOUNT_DESC="Enter amount of discount." +COM_REDSHOP_DISCOUNT_PRODUCT_START_DATE="Start date" +COM_REDSHOP_DISCOUNT_PRODUCT_START_DATE_DESC="Enter start date when this discount has effect" +COM_REDSHOP_DISCOUNT_PRODUCT_END_DATE="End date" +COM_REDSHOP_DISCOUNT_PRODUCT_END_DATE_DESC="Enter end date when this discount has effect" +COM_REDSHOP_DISCOUNT_PRODUCT_MANAGEMENT="Product price discounts" +COM_REDSHOP_DISCOUNT_PRODUCT_CATEGORY="Category" +COM_REDSHOP_DISCOUNT_PRODUCT_CATEGORY_DESC="Select categories which can apply this discount." +COM_REDSHOP_DISCOUNT_PRODUCT_CATEGORY_OPTION_SELECT="-- Select category --" +COM_REDSHOP_DISCOUNT_PRODUCT_SHOPPER_GROUP="Shopper group" +COM_REDSHOP_DISCOUNT_PRODUCT_SHOPPER_GROUP_DESC="Select which shopper group can apply this discount" +COM_REDSHOP_DISCOUNT_PRODUCT_SHOPPER_GROUP_OPTION_SELECT="-- Select shopper group --" +COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_DISCOUNT_PERCENTAGE="Oops! Your discount type is percentage, but amount is higher than 100." +COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_START_DATE_SAME_HIGH_END_DATE="Oops! Discount start date is equal or higher than end date." +COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_AMOUNT_ZERO="Oops! Amount must be greater than 0" +COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_DISCOUNT_AMOUNT_ZERO="Oops! Discount amount must be greater than 0" +COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_MISSING_SHOPPER_GROUPS="Oops! Missing shopper groups" +COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_AMOUNT_HIGHT_DISCOUNT_AMOUNT="Oops! Amount must hight discount product" + +; Fields group +COM_REDSHOP_FIELD_GROUP="Field Group" +COM_REDSHOP_FIELD_GROUP_MANAGEMENT="Custom Field Groups" +COM_REDSHOP_FIELD_GROUP_NAME="Name" +COM_REDSHOP_FIELD_GROUP_NAME_DESCRIPTION="Enter name of group" +COM_REDSHOP_FIELD_GROUP_DESCRIPTION="Description" +COM_REDSHOP_FIELD_GROUP_DESCRIPTION_DESC="Enter description for this group" +COM_REDSHOP_FIELD_GROUP_NOGROUP="No group" +COM_REDSHOP_FIELD_GROUP_HEADER="Group" +COM_REDSHOP_FIELD_GROUP_HEADER_DESC="Choose group for this field." +COM_REDSHOP_FIELD_GROUP_ERROR_MISSING_NAME="Missing field group name" +COM_REDSHOP_FIELD_GROUP_ERROR_MISSING_SECTION="Missing field group section" + +; Texts Library +COM_REDSHOP_TEXT="Text" +COM_REDSHOP_TEXT_MANAGEMENT="Text Management" +COM_REDSHOP_TEXT_NAME="Name" +COM_REDSHOP_TEXT_NAME_DESC="Enter the name that should be included in the tag." +COM_REDSHOP_TEXT_DESCRIPTION="Description" +COM_REDSHOP_TEXT_DESCRIPTION_DESC="Enter your description of the tag." +COM_REDSHOP_TEXT_SECTION="Section" +COM_REDSHOP_TEXT_SECTION_DESC="Choose section of this tag." +COM_REDSHOP_TEXT_SECTION_OPTION_SELECT="-- Select section --" +COM_REDSHOP_TEXT_SECTION_OPTION_PRODUCT="Product" +COM_REDSHOP_TEXT_SECTION_OPTION_CATEGORY="Category" +COM_REDSHOP_TEXT_SECTION_OPTION_NEWSLETTER="Newsletter" +COM_REDSHOP_TEXT_CONTENT="Content" +COM_REDSHOP_TEXT_CONTENT_DESC="Enter content of this tag after replace" + +; Tools +COM_REDSHOP_BACKEND_TOOLS="Tools" +COM_REDSHOP_BACKEND_TOOLS_IMAGE="Image tool" +COM_REDSHOP_BACKEND_TOOLS_UPDATE="Update files & DB" +COM_REDSHOP_TOOLS="Tools" +COM_REDSHOP_TOOLS_IMAGE_WRAPPER="Images" +COM_REDSHOP_TOOLS_FOLDERS="Folders" +COM_REDSHOP_TOOLS_FILES="Files" +COM_REDSHOP_TOOLS_IMAGES_COUNT="Images file: %d" +COM_REDSHOP_TOOLS_IMAGES_DONE="Done" +COM_REDSHOP_TOOLS_IMAGE_SIZE_CHECK="Check images size" +COM_REDSHOP_TOOLS_IMAGE_CLEAN_THUMBNAIL="Clean thumbnail" + +; VirtueMart Import +COM_REDSHOP_IMPORT_VM_START="Start" +COM_REDSHOP_IMPORT_VM_DONE="Done" +COM_REDSHOP_IMPORT_VM_DATA="Data" +COM_REDSHOP_IMPORT_VM_COUNT="Count" +COM_REDSHOP_IMPORT_VM_RESULT="Result" +COM_REDSHOP_IMPORT_VM_PROGRESS="Progress" +COM_REDSHOP_IMPORT_VM_SHOPPERGROUP_DEFAULT="Default Shopper Group" +COM_REDSHOP_IMPORT_VM_SHOPPERGROUP_DEFAULT_TIP="New shoppers will be assigned to this group" +COM_REDSHOP_IMPORT_VM_SHOPPERGROUP_GUEST="Guest Shopper Group" +COM_REDSHOP_IMPORT_VM_SHOPPERGROUP_GUEST_TIP="People who are not logged get automatically assigned to the group guest" +COM_REDSHOP_IMPORT_VM_ERROR_METHOD_NOT_EXIST="Error! Method %s does not exist" + +; Admin/Shipping +COM_REDSHOP_SHIPPING_PUBLISHED_SUCCESSFULLY="Shipping method published successfully" +COM_REDSHOP_SHIPPING_UNPUBLISHED_SUCCESSFULLY="Shipping method unpublished successfully" + +; Tool +COM_REDSHOP_TOOL="Tools" +COM_REDSHOP_TOOL_VERSION="Version" +COM_REDSHOP_TOOL_TASKS="Tasks" +COM_REDSHOP_TOOL_RUN_TASK="Migrate files" +COM_REDSHOP_TOOL_RUN_DATABASE="Migrate DB" +COM_REDSHOP_TOOL_UPDATE_DB_MIGRATE_SUCCESS="Run update SQL success" +COM_REDSHOP_TOOL_AJAX_ERROR_VERSION_NOT_FOUND="DB version not available." + +; Manufacturer +COM_REDSHOP_MANUFACTURER_MANAGEMENT="Manufacturer Management" +COM_REDSHOP_MANUFACTURER_NAME="Name" +COM_REDSHOP_MANUFACTURER_NAME_DESC="Enter name of manufacturer" +COM_REDSHOP_MANUFACTURER_DESCRIPTION="Description" +COM_REDSHOP_MANUFACTURER_DESCRIPTION_DESC="Enter description of this manufacturer" +COM_REDSHOP_MANUFACTURER_EMAIL="Email" +COM_REDSHOP_MANUFACTURER_EMAIL_DESC="Enter manufacturer email" +COM_REDSHOP_MANUFACTURER_TEMPLATE="Template" +COM_REDSHOP_MANUFACTURER_TEMPLATE_DESC="Choose template for this manufacturer" +COM_REDSHOP_MANUFACTURER_TEMPLATE_OPTION_SELECT="-- Select template --" +COM_REDSHOP_MANUFACTURER_URL="Url" +COM_REDSHOP_MANUFACTURER_URL_DESC="Enter URL for this manufacturer (with leading http://)" +COM_REDSHOP_MANUFACTURER_PRODUCT_PER_PAGE="Products per Page" +COM_REDSHOP_MANUFACTURER_PRODUCT_PER_PAGE_DESC="Enter number of products display per page" +COM_REDSHOP_MANUFACTURER_IMAGE="Image" +COM_REDSHOP_MANUFACTURER_IMAGE_DESC="Image of manufacturer" +COM_REDSHOP_MANUFACTURER_EXCLUDING_CATEGORY_LIST="Excluding Category List" +COM_REDSHOP_MANUFACTURER_EXCLUDING_CATEGORY_LIST_DESC="Excluding Category List" +COM_REDSHOP_MANUFACTURER_ERROR_PRODUCT_PER_PAGE="No. of Products per Page must be greater than zero" + +; Shipping Box +COM_REDSHOP_SHIPPING_BOX_MANAGEMENT="Shipping Boxes" +COM_REDSHOP_SHIPPING_BOX_NAME="Name" +COM_REDSHOP_SHIPPING_BOX_NAME_DESC="Enter shipping box name" +COM_REDSHOP_SHIPPING_BOX_LENGTH="Length" +COM_REDSHOP_SHIPPING_BOX_LENGTH_DESC="Enter length of shipping box" +COM_REDSHOP_SHIPPING_BOX_WIDTH="Width" +COM_REDSHOP_SHIPPING_BOX_WIDTH_DESC="Enter width of shipping box" +COM_REDSHOP_SHIPPING_BOX_HEIGHT="Height" +COM_REDSHOP_SHIPPING_BOX_HEIGHT_DESC="Enter height of shipping box" +COM_REDSHOP_SHIPPING_BOX_PRIORITY="Priority" +COM_REDSHOP_SHIPPING_BOX_PRIORITY_DESC="Enter priority of shipping box" +COM_REDSHOP_SHIPPING_BOX_ERROR_LENGTH_INVALID="Length of shipping box is invalid" +COM_REDSHOP_SHIPPING_BOX_ERROR_WIDTH_INVALID="Width of shipping box is invalid" +COM_REDSHOP_SHIPPING_BOX_ERROR_HEIGHT_INVALID="Height of shipping box is invalid" + +; Configuration +COM_REDSHOP_PRODUCT_GENERAL="General" +COM_REDSHOP_DEFAULT_CATEGORY_LBL="Default category" +COM_REDSHOP_TOOLTIP_DEFAULT_CATEGORY_LBL="Enable select default category" + +; Send Discount Code +COM_REDSHOP_SEND_DISCOUNT_CODE="Send discount code" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_CODE="{discount_code} %s discount code" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_VALUE="{discount_value} %s discount value" +COM_REDSHOP_TEMPLATE_TAG_DISCOUNT_VOUCHER_PRODUCT="{discount_voucher_product} %s voucher product" + +; Product filter in category page (site) +COM_REDSHOP_PRODUCT_FILTERS="Product Filters" +COM_REDSHOP_CATEGORY_PRODUCT_FILTERS_NOTICE="To use this feature, you need to install and enable the module "mod_redshop_category_product_filters" and assign it to the menu item associated with this category" +COM_REDSHOP_PRODUCT_CUSTOM_FIELDS="Product Custom fields" +COM_REDSHOP_PRODUCT_CUSTOM_FIELDS_FILTER_NOTICE="Only product's custom fields which field type is "Checkbox/ Checkboxes list/ Single select/ Multi-select" can be used for filter" +COM_REDSHOP_FILTER_ENABLE="Enable Filters" +COM_REDSHOP_FILTER_ENABLE_CATEGORY="Filter by Subcategories" +COM_REDSHOP_FILTER_ENABLE_CATEGORY_NOTICE="If this is set to "Yes", then the frontpage category also displays all products belonging to its subcategories (recursively)" +COM_REDSHOP_FILTER_ENABLE_MANUFACTURER="Filter by Manufacturers" +COM_REDSHOP_FILTER_ENABLE_PRICE="Enable Price Slider" +COM_REDSHOP_FILTER_ENABLE_CUSTOM_FIELDS="Filter by Product Custom Fields" +COM_REDSHOP_FILTER_CUSTOM_FIELDS_AS_SLIDER="Product Custom fields (Slider)" + + + + diff --git a/component/admin/language/en-GB/en-GB.com_redshop.sys.ini b/component/admin/language/en-GB/en-GB.com_redshop.sys.ini new file mode 100644 index 00000000000..fbfba825298 --- /dev/null +++ b/component/admin/language/en-GB/en-GB.com_redshop.sys.ini @@ -0,0 +1,132 @@ +; version 1.5.0 +; package Joomla.Administrator +; subpackage com_REDSHOP +; author redWEB Aps +; translation en-GB source redWEB Aps +; copyright com_REDSHOP (C) 2008 - 2017 redCOMPONENT.com +; license GNU/GPL, see LICENSE.php + +COM_REDSHOP="redSHOP" +COM_REDSHOP_DESCRIPTION="redSHOP Joomla Webshop Component" +COM_REDSHOP_WIZARD="Configuration Wizard" +COM_REDSHOP_INSTALL_DEMO_CONTENT="Install Demo Content" + +COM_REDSHOP_ACCOUNT_LAYOUT="Account" +COM_REDSHOP_ACCOUNT_LAYOUT_DESC="redSHOP account information layout." +COM_REDSHOP_ACCOUNT_LAYOUT_CARDS="Credit Cards" +COM_REDSHOP_ACCOUNT_LAYOUT_CARDS_DESC="This view will show user's credit cards stored in payment gateway. For example: if site has paypal credit card plugin and vault is enabled then it will show list of all the credit cards." +COM_REDSHOP_MYWISHLIST_LAYOUT="My Wishlist" +COM_REDSHOP_MYWISHLIST_LAYOUT_DESC="My Wishlist products layout." +COM_REDSHOP_CART_LAYOUT="Cart" +COM_REDSHOP_CART_LAYOUT_DESC="redSHOP cart layout." +COM_REDSHOP_CATALOG_LAYOUT="Catalogue" +COM_REDSHOP_CATALOG_LAYOUT_DESC="redSHOP catalogue layout." +COM_REDSHOP_SAMPLE_LAYOUT="Sample" +COM_REDSHOP_SAMPLE_LAYOUT_DESC="Catalogue sample layout." +COM_REDSHOP_STANDARD_CATEGORY_LAYOUT_TO_SHOW_ALL_CATEGORY_PRODUCT="Subcategories" +COM_REDSHOP_STANDARD_CATEGORY_LAYOUT_TO_SHOW_ALL_CATEGORY_PRODUCT_DESC="List all subcategories inside a selected category" +COM_REDSHOP_STANDARD_CATEGORY_LAYOUT="Frontpage category" +COM_REDSHOP_STANDARD_CATEGORY_LAYOUT_DESC="Standard page to list all your categories. It can be edited at the Frontpage Category template." +COM_REDSHOP_STANDARD_CATEGORY_DETAIL_LAYOUT="Category Detailed" +COM_REDSHOP_STANDARD_CATEGORY_DETAIL_LAYOUT_DESC="Category detailed layout." +COM_REDSHOP_STANDARD_CHECKOUT_LAYOUT="Checkout" +COM_REDSHOP_STANDARD_CHECKOUT_LAYOUT_DESC="redSHOP checkout layout." +COM_REDSHOP_STANDARD_GIFTCARD_LIST="Gift Cards List" +COM_REDSHOP_STANDARD_GIFTCARD_LIST_DESC="Gift cards layout." +COM_REDSHOP_STANDARD_LOGIN_LAYOUT="Login" +COM_REDSHOP_STANDARD_LOGIN_LAYOUT_DESC="Login layout for redSHOP user." +COM_REDSHOP_STANDARD_LOGOUT_LAYOUT="Logout" +COM_REDSHOP_STANDARD_LOGOUT_LAYOUT_DESC="Logout layout for redSHOP user." +COM_REDSHOP_STANDARD_PORTAL_LAYOUT="Portal Layout For Shopper Group" +COM_REDSHOP_STANDARD_PORTAL_LAYOUT_DESC="Portal layout for redSHOP shopper group." +COM_REDSHOP_STANDARD_PORTAL_DETAIL_LAYOUT="Portal Detail Layout For Shopper Group" +COM_REDSHOP_STANDARD_MANUFACTURERS_LAYOUT="Manufacturers" +COM_REDSHOP_STANDARD_MANUFACTURERS_LAYOUT_DESC="redSHOP manufacturers list." +COM_REDSHOP_STANDARD_MANUFACTURER_DETAIL_LAYOUT="Manufacturer Details" +COM_REDSHOP_STANDARD_MANUFACTURER_DETAIL_LAYOUT_DESC="Displays the selected manufacturer detail page." +COM_REDSHOP_STANDARD_MANUFACTURER_PRODUCT_LAYOUT="Products From Selected Manufacturer" +COM_REDSHOP_STANDARD_MANUFACTURER_PRODUCT_LAYOUT_DESC="Displays listed products for selected manufacturer." +COM_REDSHOP_STANDARD_NEWSLETTER_LAYOUT="Newsletter Subscription" +COM_REDSHOP_STANDARD_NEWSLETTER_LAYOUT_DESC="Layout for redSHOP newsletter subscription." +COM_REDSHOP_STANDARD_NEWSLETTER_THANKYOU_LAYOUT="Newsletter Thank You Page" +COM_REDSHOP_STANDARD_NEWSLETTER_THANKYOU_LAYOUT_DESC="Newsletter Thank You Page" +COM_REDSHOP_STANDARD_ORDERS_LAYOUT="Orders" +COM_REDSHOP_STANDARD_ORDERS_LAYOUT_DESC="Orders list." +COM_REDSHOP_STANDARD_ORDERS_TRACKER_LAYOUT="Orders Tracker" +COM_REDSHOP_STANDARD_ORDERS_TRACKER_LAYOUT_DESC="Orders tracker layout for redSHOP orders." +COM_REDSHOP_STANDARD_PRODUCT_COMPARE_LAYOUT="Compare Products" +COM_REDSHOP_STANDARD_PRODUCT_COMPARE_LAYOUT_DESC="Layout for compare products." +COM_REDSHOP_STANDARD_PRODUCT_LAYOUT="Product" +COM_REDSHOP_STANDARD_PRODUCT_LAYOUT_DESC="Displays product details page." +COM_REDSHOP_STANDARD_PRODUCT_DOWNLOAD_LAYOUT="Product Download" +COM_REDSHOP_STANDARD_PRODUCT_DOWNLOAD_LAYOUT_DESC="Product download layout." +COM_REDSHOP_STANDARD_PRODUCT_RATING_LAYOUT="Product Rating" +COM_REDSHOP_STANDARD_PRODUCT_RATING_LAYOUT_DESC="Product rating layout where users can rate a product." +COM_REDSHOP_STANDARD_QUOTATION_LAYOUT="Quote" +COM_REDSHOP_STANDARD_QUOTATION_LAYOUT_DESC="Ask for a quote for the cart." +COM_REDSHOP_STANDARD_REGISTRATION_LAYOUT="Registration" +COM_REDSHOP_STANDARD_REGISTRATION_LAYOUT_DESC="Layout for a user to register at redSHOP." +COM_REDSHOP_FEATURED_PRODUCT_LAYOUT="Featured Products" +COM_REDSHOP_FEATURED_PRODUCT_LAYOUT_DESC="Featured products layout for redSHOP search." +COM_REDSHOP_STANDARD_NEWEST_PRODUCT_SEARCH_LAYOUT="Newest Products" +COM_REDSHOP_STANDARD_NEWEST_PRODUCT_SEARCH_LAYOUT_DESC="Newest Products" +COM_REDSHOP_STANDARD_PRODUCT_ON_SALE_LAYOUT="Products On Sale" +COM_REDSHOP_STANDARD_PRODUCT_ON_SALE_LAYOUT_DESC="Products on sale layout for redSHOP search." +COM_REDSHOP_STANDARD_RED_FILTER_LAYOUT="redFILTER" +COM_REDSHOP_STANDARD_RED_FILTER_LAYOUT_DESC="redSHOP Search Filter for products." +COM_REDSHOP_CREATE_WISH_LIST_LAYOUT="Create Wish List" +COM_REDSHOP_CREATE_WISH_LIST_LAYOUT_DESC="Create a wish list layout." +COM_REDSHOP_ALL_WISH_LISTS="All Wish Lists" +COM_REDSHOP_ALL_WISH_LISTS_DESC="All wish lists." + +COM_REDSHOP_ACCOUNT_INFORMATION="Account Information" +COM_REDSHOP_LOGOUT_REDIRECTION_PAGE="Logout Redirection Page" +COM_REDSHOP_PARAMLOGOUTREDIRECTURL="Select the page the user will be redirected to after a successful logout." +COM_REDSHOP_HOW_MANY_CATEGROY_TO_DISPLAY_PER_PAGE_LBL="Display category per page" +COM_REDSHOP_HOW_MANY_CATEGROY_TO_DISPLAY_PER_PAGE="Display category per page" +COM_REDSHOP_HOW_MANY_PRODUCTS_TO_DISPLAY_PER_CATEGROY_LBL="Display product per category" +COM_REDSHOP_HOW_MANY_PRODUCTS_TO_DISPLAY_PER_CATEGROY="Display product per category" +COM_REDSHOP_DISPLAYS_THE_SELECTED_CATEGORY_PRODUCT="Displays The Selected Category Product" +COM_REDSHOP_PRODUCT_SORTING="Product Sorting" +COM_REDSHOP_SELECT_PRODUCT_SORTING="Select Product Sorting" +COM_REDSHOP_HOW_MANY_PRODUCTS="How many products to display?" +COM_REDSHOP_HOW_MANY_PRODUCTS_DESCRIPTION="How many products to display on front page" +COM_REDSHOP_LOGIN_REDIRECTION_PAGE="Login Redirection Page" +COM_REDSHOP_PARAMLOGINREDIRECTURL="Select the page the user will be redirected to after a successful login." +COM_REDSHOP_HOW_MANY_MANUFACTURERS="How many manufacturers to display?" +COM_REDSHOP_HOW_MANY_MANUFACTURERS_DESCRIPTION="How many manufacturers to display on front page" +COM_REDSHOP_SELECT_PRODUCTS="Select Product" +COM_REDSHOP_A_PRODUCT="Select a product which you want to display." +COM_REDSHOP_ENTER_NUMBER_OF_DAYS_TO_FIND_NEWEST_PRODUCTS="Enter Number Of Days To Find Newest Products" +COM_REDSHOP_ENTER_NO_OF_DAYS_FOR_FIND_NEWEST_PRODUCT="Enter No Of Days For Find Newest Product" +COM_REDSHOP_HOW_MANY_PRODUCTS_TO_SHOW="How Many Products To Show" +COM_REDSHOP_ENTER_NO_OF_AMOUNT_HOW_MANY_PRODUCTS_TO_SHOW="Enter No Of Amount How Many Products To Show" +COM_REDSHOP_ENTER_CATEGORY_ID_FOR_TEMPLET="Enter Category Id For Template" +COM_REDSHOP_CATEGORY_ID_FOR_NEWEST_PRODUCT_SEARCH_TEMPLATE="Category Id For Newest Product Search Template" +COM_REDSHOP_CATEGORY_PRODUCT_ORDER_BY="Products Order By" +COM_REDSHOP_CATEGORY_PRODUCT_ORDER_BY_DESC="Select the method for sorting products under this menu items." + +COM_REDSHOP_COM_REDSHOP="redSHOP" +COM_REDSHOP_SEND_INVOICEMAIL="Resend Invoice Mail" +COM_REDSHOP_INVOICE_MAIL_HAS_BEEN_SENT="Invoice mail has been sent" +COM_REDSHOP_ERROR_INVOICE_MAIL_FAIL="ERROR: Invoice mail fail" +COM_REDSHOP_SELECT_ORDERLIST_TEMPLATE="Select OrderList Template" +COM_REDSHOP_SAVE_WITHOUT_SEND_ORDERMAIL_LBL="Save without mail" +COM_REDSHOP_CUSTOMER_MESSAGE_LBL="Customer message" +COM_REDSHOP_REFERRAL_CODE_LBL="Referral code" +COM_REDSHOP_REGISTRATION_REDIRECTION_PAGE="Redirect to the page after registration" +COM_REDSHOP_REGISTRATION_REDIRECTION_PAGE_DESC="Please select Redirection Menu item page, where you want to redirect after registration." + +; INSTALLATION AND UPDATE SECTION +COM_REDSHOP_COMPONENT_NAME="redSHOP" +COM_REDSHOP_BY_LINK="by redcomponent.com" +COM_REDSHOP_TERMS_AND_CONDITION="Released under the terms and conditions of the GNU General Public License." +COM_REDSHOP_CHECK_UPDATES="Remember to check for updates on" +COM_REDSHOP_INSTALL_KLARNA_INFO="We now support %s as one of our default payment methods." + +; Install +COM_REDSHOP_LEGACY_MIGRATING="Legacy migrating" +COM_REDSHOP_TRY_TO_MIGRATE_PREVIOUS_CONFIGURATION="Try to migrate previous configuration" +COM_REDSHOP_MIGRATED_PREVIOUS_CONFIGURATION="Migrated previous configuration" +COM_REDSHOP_DELETED_PREVIOUS_CONFIGURATION="Deleted previous configuration" +COM_REDSHOP_PREVIOUS_CONFIGURATION_NOT_FOUND="Previous configuration not found" \ No newline at end of file diff --git a/component/admin/language/en-GB/index.html b/component/admin/language/en-GB/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/language/en-GB/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/language/index.html b/component/admin/language/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/language/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/layouts/alert/header_link.php b/component/admin/layouts/alert/header_link.php new file mode 100644 index 00000000000..48634752875 --- /dev/null +++ b/component/admin/layouts/alert/header_link.php @@ -0,0 +1,42 @@ +countAlert(); +$alerts = $model->getAlert(5); +?> + diff --git a/component/admin/layouts/alert/index.html b/component/admin/layouts/alert/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/alert/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/cart/index.html b/component/admin/layouts/cart/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/layouts/cart/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/component/admin.php b/component/admin/layouts/component/admin.php new file mode 100644 index 00000000000..71f5f21690b --- /dev/null +++ b/component/admin/layouts/component/admin.php @@ -0,0 +1,122 @@ +loadTemplate($tpl); +$displayData['content'] = $content; + +$app = JFactory::getApplication(); +$input = $app->input; + +/** + * Handle raw format + */ +$format = $input->getString('format'); + +if ('raw' === $format) +{ + /** @var RView $view */ + $view = $data['view']; + + if (!($view instanceof RedshopViewAdmin || $view instanceof RedshopViewList || $view instanceof RedshopViewForm)) + { + throw new InvalidArgumentException( + sprintf( + 'Invalid view %s specified for the component layout', + get_class($view) + ) + ); + } + + $toolbar = $view->getToolbar(); + + // Get the view render. + return $content; +} + +$templateComponent = 'component' === $input->get('tmpl'); +$input->set('tmpl', 'component'); + +echo JLayoutHelper::render('component.assets'); + +// Do we have to display the sidebar ? +$displaySidebar = false; + +if (isset($data['sidebar_display'])) +{ + $displaySidebar = (bool) $data['sidebar_display']; +} + +// Do we have to display the sidebar ? +$disableSidebar = false; + +if (isset($data['sidebar_disable'])) +{ + $disableSidebar = (bool) $data['sidebar_disable']; +} + +// The view to render. +if (!isset($data['view'])) +{ + throw new InvalidArgumentException('No view specified in the component layout.'); +} + +/** @var RView $view */ +$view = $data['view']; + +if (!($view instanceof RedshopViewAdmin || $view instanceof RedshopViewList || $view instanceof RedshopViewForm)) +{ + throw new InvalidArgumentException( + sprintf( + 'Invalid view %s specified for the component layout', + get_class($view) + ) + ); +} + +if ($content instanceof Exception) +{ + return $content; +} +?> + + +getLayout() === 'modal' || $view->getName() == 'wizard') : ?> +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + + + "auto", "dropdownAutoWidth" => "auto")); +JHtml::_('redshopjquery.popover', '.hasPopover', array('placement' => 'top')); + +$app = JFactory::getApplication(); +$doc = new RedshopHelperDocument; + +$doc->addTopScript(JURI::root() . 'media/com_redshop/js/redshop.admin.min.js'); +$doc->addTopScript(JURI::root() . 'media/com_redshop/js/redshop.validation.min.js'); +$doc->addTopScript(JURI::root() . 'media/com_redshop/js/redshop.alert.min.js'); +$doc->addTopStylesheet(JURI::root() . 'media/com_redshop/css/redshop.admin.min.css'); +$doc->addTopStylesheet(JURI::root() . 'media/com_redshop/css/font-awesome.min.css'); + +// Disable template shit +$doc->disableStylesheet('administrator/templates/isis/css/template.css'); +$doc->disableScript('administrator/templates/isis/js/template.js'); + +// We will apply our own searchtools styles +$doc->disableStylesheet('media/redcore/lib/jquery-searchtools/jquery.searchtools.css'); +$doc->disableStylesheet('media/redcore/lib/jquery-searchtools/jquery.searchtools.min.css'); +$doc->disableStylesheet('media/redcore/css/lib/chosen.min.css'); +$doc->disableStylesheet('media/redcore/css/lib/chosen.css'); + +// Disable redCORE things +$doc->disableScript('media/redcore/js/lib/jquery.min.js'); +$doc->disableScript('media/redcore/js/lib/jquery-migrate.min.js'); +$doc->disableScript('media/redcore/js/lib/jquery-noconflict.js'); +$doc->disableScript('media/redcore/js/lib/bootstrap.min.js'); +$doc->disableScript('media/redcore/lib/bootstrap/js/bootstrap.min.js'); +$doc->disableScript('media/redcore/lib/jquery.min.js'); +$doc->disableScript('media/redcore/lib/jquery-migrate.min.js'); +$doc->disableScript('media/redcore/lib/jquery-noconflict.js'); +$doc->disableScript('media/redcore/lib/bootstrap.min.js'); +$doc->disableScript('media/redcore/lib/bootstrap/js/bootstrap.min.js'); + +// Disable core things +$doc->disableScript('media/jui/js/jquery.min.js'); +$doc->disableScript('media/jui/js/jquery-noconflict.js'); +$doc->disableScript('media/jui/js/jquery-migrate.min.js'); diff --git a/component/admin/layouts/component/component.php b/component/admin/layouts/component/component.php new file mode 100644 index 00000000000..8ce238fe5d1 --- /dev/null +++ b/component/admin/layouts/component/component.php @@ -0,0 +1,10 @@ +getName(); + +?> +
    +
    +
    + +
    + + + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    diff --git a/component/admin/layouts/component/full/content/body.php b/component/admin/layouts/component/full/content/body.php new file mode 100644 index 00000000000..32675494934 --- /dev/null +++ b/component/admin/layouts/component/full/content/body.php @@ -0,0 +1,14 @@ +getCurrentVersion(); + +$year = JFactory::getDate()->format('Y'); + +?> + + +Copyright © 2008- redCOMPONENT. All rights reserved. + diff --git a/component/admin/layouts/component/full/content/header.php b/component/admin/layouts/component/full/content/header.php new file mode 100644 index 00000000000..d64ab1000c1 --- /dev/null +++ b/component/admin/layouts/component/full/content/header.php @@ -0,0 +1,33 @@ +input->getCmd('view', 'redshop'); + +$classtoolbar = ""; + +if ($view == 'redshop') +{ + $classtoolbar = ' class="hidden-xs"'; +} + +?> + +
    + JComponentTitle; ?> +
    + +> + render() ?> + + +
    diff --git a/component/admin/layouts/component/full/content/index.html b/component/admin/layouts/component/full/content/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/component/full/content/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/component/full/header.php b/component/admin/layouts/component/full/header.php new file mode 100644 index 00000000000..1e2d155c32d --- /dev/null +++ b/component/admin/layouts/component/full/header.php @@ -0,0 +1,36 @@ + + + + + Toggle navigation + + + + + + + + \ No newline at end of file diff --git a/component/admin/layouts/component/full/header/index.html b/component/admin/layouts/component/full/header/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/component/full/header/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/component/full/header/menu.php b/component/admin/layouts/component/full/header/menu.php new file mode 100644 index 00000000000..a35c67c1944 --- /dev/null +++ b/component/admin/layouts/component/full/header/menu.php @@ -0,0 +1,42 @@ + + diff --git a/component/admin/layouts/component/full/index.html b/component/admin/layouts/component/full/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/component/full/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/component/full/sidebar.php b/component/admin/layouts/component/full/sidebar.php new file mode 100644 index 00000000000..dc1c9a79f8f --- /dev/null +++ b/component/admin/layouts/component/full/sidebar.php @@ -0,0 +1,16 @@ + + + diff --git a/component/admin/layouts/component/full/sidebar/index.html b/component/admin/layouts/component/full/sidebar/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/component/full/sidebar/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/component/full/sidebar/link.php b/component/admin/layouts/component/full/sidebar/link.php new file mode 100644 index 00000000000..35a4e85b39d --- /dev/null +++ b/component/admin/layouts/component/full/sidebar/link.php @@ -0,0 +1,17 @@ +input->getCmd('view'); +?> + + + diff --git a/component/admin/layouts/component/full/sidebar/menu.php b/component/admin/layouts/component/full/sidebar/menu.php new file mode 100644 index 00000000000..7ac17004b50 --- /dev/null +++ b/component/admin/layouts/component/full/sidebar/menu.php @@ -0,0 +1,145 @@ + + + + diff --git a/component/admin/layouts/component/full/tab/index.html b/component/admin/layouts/component/full/tab/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/component/full/tab/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/component/full/tab/layout.php b/component/admin/layouts/component/full/tab/layout.php new file mode 100644 index 00000000000..43ae1762cce --- /dev/null +++ b/component/admin/layouts/component/full/tab/layout.php @@ -0,0 +1,16 @@ + +
    + loadTemplate($row->param); ?> +
    diff --git a/component/admin/layouts/component/full/tab/link.php b/component/admin/layouts/component/full/tab/link.php new file mode 100644 index 00000000000..d77db38f398 --- /dev/null +++ b/component/admin/layouts/component/full/tab/link.php @@ -0,0 +1,17 @@ + + diff --git a/component/admin/layouts/component/full/tab/main.php b/component/admin/layouts/component/full/tab/main.php new file mode 100644 index 00000000000..bad45ffb1c0 --- /dev/null +++ b/component/admin/layouts/component/full/tab/main.php @@ -0,0 +1,35 @@ + + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + $row, 'view' => $view)); ?> + +
    +
    +
    diff --git a/component/admin/layouts/component/image.php b/component/admin/layouts/component/image.php new file mode 100644 index 00000000000..1717dfc4421 --- /dev/null +++ b/component/admin/layouts/component/image.php @@ -0,0 +1,58 @@ + + +
    + +
    + + + +get('USE_IMAGE_SIZE_SWAPPING') + ); +?> +
    + + + + +
    + + + +
    +
    + + + +
    + +
    + + diff --git a/component/admin/layouts/component/index.html b/component/admin/layouts/component/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/component/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/config/config.php b/component/admin/layouts/config/config.php new file mode 100644 index 00000000000..c6c6cbe9c0e --- /dev/null +++ b/component/admin/layouts/config/config.php @@ -0,0 +1,44 @@ + + + + + +
    + +
    +
    diff --git a/component/admin/layouts/config/group.php b/component/admin/layouts/config/group.php new file mode 100644 index 00000000000..d478177b3d7 --- /dev/null +++ b/component/admin/layouts/config/group.php @@ -0,0 +1,25 @@ + +
    +

    +
    +
    diff --git a/component/admin/layouts/config/index.html b/component/admin/layouts/config/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/config/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/fields/display.php b/component/admin/layouts/fields/display.php new file mode 100644 index 00000000000..3ae978c61d4 --- /dev/null +++ b/component/admin/layouts/fields/display.php @@ -0,0 +1,18 @@ + + + + + diff --git a/component/admin/layouts/fields/index.html b/component/admin/layouts/fields/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/fields/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/index.html b/component/admin/layouts/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/inline/index.html b/component/admin/layouts/inline/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/inline/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/inline/text.php b/component/admin/layouts/inline/text.php new file mode 100644 index 00000000000..9369dd91456 --- /dev/null +++ b/component/admin/layouts/inline/text.php @@ -0,0 +1,32 @@ + + +
    + +
    diff --git a/component/admin/layouts/joomla/form/index.html b/component/admin/layouts/joomla/form/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/joomla/form/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/joomla/form/renderfield.php b/component/admin/layouts/joomla/form/renderfield.php new file mode 100644 index 00000000000..4b426264a5f --- /dev/null +++ b/component/admin/layouts/joomla/form/renderfield.php @@ -0,0 +1,38 @@ + + +
    > + + + +
    + +
    +
    + diff --git a/component/admin/layouts/joomla/form/renderlabel.php b/component/admin/layouts/joomla/form/renderlabel.php new file mode 100644 index 00000000000..3c78a38abcd --- /dev/null +++ b/component/admin/layouts/joomla/form/renderlabel.php @@ -0,0 +1,51 @@ + + diff --git a/component/admin/layouts/joomla/index.html b/component/admin/layouts/joomla/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/joomla/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/joomla/system/index.html b/component/admin/layouts/joomla/system/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/joomla/system/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/joomla/system/message.php b/component/admin/layouts/joomla/system/message.php new file mode 100644 index 00000000000..4c0b86d812a --- /dev/null +++ b/component/admin/layouts/joomla/system/message.php @@ -0,0 +1,38 @@ + +
    +
    + $msgs): ?> + $type, + 'messages' => $msgs + ); + + echo JLayoutHelper::render('joomla.system.message.' . strtolower($type), $layoutData); + ?> + +
    +
    diff --git a/component/admin/layouts/joomla/system/message/error.php b/component/admin/layouts/joomla/system/message/error.php new file mode 100644 index 00000000000..e0cd7fd7cc4 --- /dev/null +++ b/component/admin/layouts/joomla/system/message/error.php @@ -0,0 +1,31 @@ + + diff --git a/component/admin/layouts/joomla/system/message/index.html b/component/admin/layouts/joomla/system/message/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/joomla/system/message/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/joomla/system/message/message.php b/component/admin/layouts/joomla/system/message/message.php new file mode 100644 index 00000000000..9855d38768e --- /dev/null +++ b/component/admin/layouts/joomla/system/message/message.php @@ -0,0 +1,31 @@ + + diff --git a/component/admin/layouts/joomla/system/message/notice.php b/component/admin/layouts/joomla/system/message/notice.php new file mode 100644 index 00000000000..303c8b6eb53 --- /dev/null +++ b/component/admin/layouts/joomla/system/message/notice.php @@ -0,0 +1,31 @@ + + diff --git a/component/admin/layouts/joomla/system/message/warning.php b/component/admin/layouts/joomla/system/message/warning.php new file mode 100644 index 00000000000..0c09fb1a41c --- /dev/null +++ b/component/admin/layouts/joomla/system/message/warning.php @@ -0,0 +1,26 @@ + + + + + diff --git a/component/admin/layouts/pagination/index.html b/component/admin/layouts/pagination/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/pagination/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/pagination/link.php b/component/admin/layouts/pagination/link.php new file mode 100644 index 00000000000..df7ebda0889 --- /dev/null +++ b/component/admin/layouts/pagination/link.php @@ -0,0 +1,112 @@ +text; + +switch ((string) $item->text) +{ + // Check for "Start" item + case JText::_('JLIB_HTML_START') : + $icon = 'icon-fast-backward icon-first'; + break; + + // Check for "Prev" item + case $item->text === JText::_('JPREV') : + $item->text = JText::_('JPREVIOUS'); + $icon = 'icon-step-backward icon-previous'; + break; + + // Check for "Prev" item + case $item->text == JText::_('LIB_REDCORE_PREVIOUS_10') : + $icon = "icon-backward"; + break; + + // Check for "Next" item + case JText::_('JNEXT') : + $icon = 'icon-step-forward icon-next'; + break; + + // Check for "Next" item + case JText::_('LIB_REDCORE_NEXT_10') : + $icon = "icon-forward"; + break; + + // Check for "End" item + case JText::_('JLIB_HTML_END') : + $icon = 'icon-fast-forward icon-last'; + break; + + default: + $icon = null; + break; +} + +if ($icon !== null) +{ + $display = ''; +} + +if ($displayData['active']) +{ + if ($item->base > 0) + { + $limit = 'limitstart.value=' . $item->base; + } + else + { + $limit = 'limitstart.value=0'; + } + + $cssClasses = array(); + + $title = ''; + + if (!is_numeric($item->text)) + { + JHtml::_('bootstrap.tooltip'); + $cssClasses[] = 'hasTooltip'; + $title = ' title="' . $item->text . '" '; + } + + $onClick = ''; + $href = trim($item->link); + + // Still using javascript approach in backend + if (JFactory::getApplication()->isAdmin()) + { + $onClick = 'onclick="document.adminForm.' . $item->prefix . $limit + . '; Joomla.submitform(document.forms[\'' . $item->formName . '\'].task.value, document.forms[\'' . $item->formName . '\']);return false;"'; + $href = '#'; + } +} +else +{ + $class = (property_exists($item, 'active') && $item->active) ? 'active' : 'disabled'; +} +?> + +
  • + + + + href="" + > + + +
  • + +
  • + +
  • +get('showLimitBox', true); +$showPagesLinks = $options->get('showPagesLinks', true); +$showLimitStart = $options->get('showLimitStart', true); + +// Calculate to display range of pages +$currentPage = 1; +$range = 1; +$step = 5; + +if (!empty($pages['pages'])) +{ + foreach ($pages['pages'] as $k => $page) + { + if (!$page['active']) + { + $currentPage = $k; + } + } +} + +if ($currentPage >= $step) +{ + if ($currentPage % $step === 0) + { + $range = ceil($currentPage / $step) + 1; + } + else + { + $range = ceil($currentPage / $step); + } +} +?> + + diff --git a/component/admin/layouts/product_detail/index.html b/component/admin/layouts/product_detail/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/product_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/product_detail/product_attribute.php b/component/admin/layouts/product_detail/product_attribute.php new file mode 100644 index 00000000000..f7fc49ff2ed --- /dev/null +++ b/component/admin/layouts/product_detail/product_attribute.php @@ -0,0 +1,579 @@ +detail->product_id)) +{ + $productId = $data->detail->product_id; +} + +if (isset($data->detail->attribute_set_id)) +{ + $attributeSetId = $data->detail->attribute_set_id; +} + +JText::script('COM_REDSHOP_TITLE'); +JText::script('COM_REDSHOP_ATTRIBUTE_REQUIRED'); +JText::script('COM_REDSHOP_PUBLISHED'); +JText::script('COM_REDSHOP_ALLOW_MULTIPLE_PROPERTY_SELECTION'); +JText::script('COM_REDSHOP_HIDE_ATTRIBUTE_PRICE'); +JText::script('COM_REDSHOP_DISPLAY_ATTRIBUTE_TYPE'); +JText::script('COM_REDSHOP_SUB_ATTRIBUTE'); +JText::script('COM_REDSHOP_PRICE'); +JText::script('COM_REDSHOP_NEW_SUB_PROPERTY'); +JText::script('COM_REDSHOP_SUBATTRIBUTE_REQUIRED'); +JText::script('COM_REDSHOP_SUBATTRIBUTE_MULTISELECTED'); +JText::script('COM_REDSHOP_DELETE_ATTRIBUTE'); +JText::script('COM_REDSHOP_ORDERING'); +JText::script('COM_REDSHOP_DEFAULT_SELECTED'); +JText::script('COM_REDSHOP_SUBPROPERTY_TITLE'); +JText::script('COM_REDSHOP_WARNING_TO_DELETE'); +JText::script('COM_REDSHOP_DELETE'); +JText::script('COM_REDSHOP_ATTRIBUTE_EXTRAFIELD'); +JText::script('COM_REDSHOP_DROPDOWN_LIST'); +JText::script('COM_REDSHOP_RADIOBOX'); +JText::script('COM_REDSHOP_ADD_SUB_ATTRIBUTE'); +JText::script('COM_REDSHOP_PARAMETER'); +JText::script('COM_REDSHOP_PROPERTY_NUMBER'); +JText::script('COM_REDSHOP_DO_WANT_TO_DELETE'); +JText::script('COM_REDSHOP_ALERT_PRESELECTED_CHECK'); +JText::script('COM_REDSHOP_DESCRIPTION'); +?> + +
    + +lists['attributes']) +{ + foreach ($data->lists['attributes'] as $keyAttr => $attributeData) + { + $displayType = $attributeData['display_type']; + $attributeId = $attributeData['attribute_id']; + $checkedRequired = ($attributeData['attribute_required'] == 1) ? ' checked="checked"' : ''; + $multipleSelection = ($attributeData['allow_multiple_selection'] == 1) ? ' checked="checked"' : ''; + $hideAttributePrice = ($attributeData['hide_attribute_price'] == 1) ? ' checked="checked"' : ''; + $attributePublished = ($attributeData['attribute_published'] == 1) ? ' checked="checked"' : ''; + $attrPref = 'attribute[' . $keyAttr . ']'; + ?> +
    + + + +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    +
    + $property) + { + $propertyId = $property->property_id; + $totalSubProp = (isset($property->subvalue)) ? count($property->subvalue) : 0; + $propertyPublished = ($property->property_published == 1) ? 'checked="checked"' : ''; + $style = ($totalSubProp) ? 'style="display:block;"' : 'style="display:none;"'; + $propPref = $attrPref . '[property][' . $keyProperty . ']'; + ?> +
    + + + +
    +
    + +
    + + + + +
    +
    + + +
    +
    + +
    +
    + + + +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + get('USE_STOCKROOM')): ?> + + + + +
    +
    +
    +
    + + + +
    +
    + +
    +
    + property_image && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $property->property_image)) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $property->property_image, + '', + 'thumb', + 'product_attributes', + 50, + 0, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + ?> + + + +
    + + + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + dispatcher. + * This is used for integration with other redSHOP extensions which can extend product type. + */ + + if ($productId && !empty($property->property_id)) + { + $property->product = $data->detail; + $property->k = $keyAttr; + $property->g = $keyProperty; + + $data->dispatcher->trigger('productTypeAttributeValue', array($property)); + } + ?> +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    + + + +
    +
    +
    + subvalue as $keySubProp => $subProperty) + { + $subPropertyPublished = ($subProperty->subattribute_published == 1) ? 'checked="checked"' : ''; + $subPropPref = $propPref . '[subproperty][' . $keySubProp . ']'; + ?> +
    +
    + + + + + +
    +
    + + +
    +
    + +
    +
    + + + +
    +
    + + +
    +
    +
    +
    + + + + + + + get('USE_STOCKROOM')): ?> + + + + +
    +
    +
    +
    + +
    +
    + +
    +
    + subattribute_color_image != '' && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $subProperty->subattribute_color_image)) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $subProperty->subattribute_color_image, + '', + 'thumb', + 'subcolor', + 50, + 0, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + ?> + + + +
    + + + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    diff --git a/component/admin/layouts/searchtools/default.php b/component/admin/layouts/searchtools/default.php new file mode 100755 index 00000000000..7c4afe6d219 --- /dev/null +++ b/component/admin/layouts/searchtools/default.php @@ -0,0 +1,55 @@ + isset($data['options']['filtersHidden']) ? $data['options']['filtersHidden'] : empty($data['view']->activeFilters), + 'defaultLimit' => isset($data['options']['defaultLimit']) ? $data['options']['defaultLimit'] : JFactory::getApplication()->get('list_limit', 20), + 'searchFieldSelector' => '#filter_search', + 'orderFieldSelector' => '#list_fullordering', + 'totalResults' => isset($data['options']['totalResults']) ? $data['options']['totalResults'] : -1, + 'noResultsText' => isset($data['options']['noResultsText']) ? $data['options']['noResultsText'] : JText::_('JGLOBAL_NO_MATCHING_RESULTS'), +); + +$data['options'] = array_merge($customOptions, $data['options']); + +$formSelector = !empty($data['options']['formSelector']) ? $data['options']['formSelector'] : '#adminForm'; + +// Load search tools +JHtml::_('searchtools.form', $formSelector, $data['options']); + +$filtersClass = isset($data['view']->activeFilters) && $data['view']->activeFilters ? ' js-stools-container-filters-visible' : ''; +$showFilter = isset($data['options']['showFilter']) ? (boolean) $data['options']['showFilter'] : true; +?> +
    +
    +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + + + diff --git a/component/admin/layouts/searchtools/default/bar.php b/component/admin/layouts/searchtools/default/bar.php new file mode 100755 index 00000000000..62fa53a2d9b --- /dev/null +++ b/component/admin/layouts/searchtools/default/bar.php @@ -0,0 +1,48 @@ +get('filterButton', true); +$searchButton = $data['options']->get('searchButton', true); + +$filters = $data['view']->filterForm->getGroup('filter'); +?> + + + +
    +
    + input; ?> + + +
    +
    + +
    + +
    + + +filterForm->getGroup('filter'); + +foreach ($filters as $field) +{ + if ($showonstring = $field->getAttribute('showon')) + { + $showonarr = array(); + + foreach (preg_split('%\[AND\]|\[OR\]%', $showonstring) as $showonfield) + { + $showon = explode(':', $showonfield, 2); + $showonarr[] = array( + 'field' => $showon[0], + 'values' => explode(',', $showon[1]), + 'op' => (preg_match('%\[(AND|OR)\]' . $showonfield . '%', $showonstring, $matches)) ? $matches[1] : '' + ); + } + + $data['view']->filterForm->setFieldAttribute($field->fieldname, 'dataShowOn', json_encode($showonarr), $field->group); + } +} + +// Load the form filters +$filters = $data['view']->filterForm->getGroup('filter'); +?> + + $field) : ?> + + getAttribute('dataShowOn')) + { + JHtml::_('jquery.framework'); + JHtml::_('script', 'jui/cms.js', false, true); + $showOn = " data-showon='" . $showOnData . "'"; + } + ?> +
    > + input; ?> +
    + + + diff --git a/component/admin/layouts/searchtools/default/index.html b/component/admin/layouts/searchtools/default/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/searchtools/default/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/searchtools/default/list.php b/component/admin/layouts/searchtools/default/list.php new file mode 100755 index 00000000000..ea777b3c333 --- /dev/null +++ b/component/admin/layouts/searchtools/default/list.php @@ -0,0 +1,25 @@ +filterForm->getGroup('list'); +?> + +
    + $field) : ?> +
    + input ?> +
    + +
    + diff --git a/component/admin/layouts/searchtools/default/noitems.php b/component/admin/layouts/searchtools/default/noitems.php new file mode 100755 index 00000000000..1da23a91d89 --- /dev/null +++ b/component/admin/layouts/searchtools/default/noitems.php @@ -0,0 +1,16 @@ + +
    + +
    diff --git a/component/admin/layouts/searchtools/grid/index.html b/component/admin/layouts/searchtools/grid/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/searchtools/grid/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/searchtools/grid/sort.php b/component/admin/layouts/searchtools/grid/sort.php new file mode 100755 index 00000000000..686d76546bf --- /dev/null +++ b/component/admin/layouts/searchtools/grid/sort.php @@ -0,0 +1,23 @@ +tip ? $data->tip : $data->title)); +JHtml::_('bootstrap.popover'); +?> + +icon)) : ?> +title)) : ?>title); ?> +order == $data->selected) : ?> + diff --git a/component/admin/layouts/searchtools/index.html b/component/admin/layouts/searchtools/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/searchtools/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/templates/index.html b/component/admin/layouts/templates/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/templates/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/templates/mail_template_tag.php b/component/admin/layouts/templates/mail_template_tag.php new file mode 100644 index 00000000000..00c09455bc9 --- /dev/null +++ b/component/admin/layouts/templates/mail_template_tag.php @@ -0,0 +1,208 @@ + +

    + {product_name} {product_link} {user_question} {answer} {user_telephone_lbl} {user_telephone} {user_address_lbl} {user_address} + +

    + {name} {discount} {coupon_code} + +

    + {name} {discount} + + {order_information_lbl} {order_id_lbl} {order_id} {order_number_lbl} {order_number} {order_date_lbl} {order_date}
    + {order_status_lbl} {order_status} {billing_address_information_lbl} {billing_address}
    + {shipping_address_information_lbl} {shipping_address} {order_detail_lbl} {product_name_lbl}
    + {note_lbl} {quantity_lbl} {product_loop_start} {product_name} {product_userfields} {product_wrapper} {product_quantity} {product_loop_end}
    + {order_payment_status} {shipping_method_lbl} {shipping_method} {shipping_rate_name} {order_detail_link} + +

    + {name} {discount} {days} {coupon_code} +

    + {name} + +

    + {name} + +

    + {name} {discount} {days} {coupon_code} + +

    + {name} {discount} {days} {coupon_code} + +

    + {name} + +

    + {fullname} {order_id} {order_number} {order_date} {product_serial_loop_start} {token} {product_serial_number} {product_name} {product_serial_loop_end} + +

    + {name} {order_id} {order_number} {order_date} {order_comment} + + {name} {url} {coupon_amount} {coupon_code} {coupon_duration} + + {giftcard_price_lbl} {giftcard_reciver_name_lbl} {giftcard_reciver_email_lbl} {giftcard_price} {giftcard_reciver_name} {giftcard_reciver_email} {giftcard_desc} {giftcard_price}
    + {giftcard_validity_from} {giftcard_validity_to} {giftcard_image} {giftcard_validity} {giftcard_code_lbl} {giftcard_code} + +

    + {invoice_number} + {order_information_lbl} {order_id_lbl} {order_id} {order_number_lbl} {order_number} {order_date_lbl} {order_date} {order_status_lbl} {order_status}
    + {billing_address_information_lbl} {billing_address} {shipping_address_information_lbl} {shipping_address} {order_detail_lbl} {product_name_lbl}
    + product_name} {product_number} {note_lbl} {product_wrapper} {price_lbl}
    + {product_price} {product_sku} {quantity_lbl} {product_quantity} {total_price_lbl}
    + {product_total_price} {order_subtotal_lbl} {order_subtotal} {if discount} {order_discount} {discount_in_percentage} {discount end if} {if vat} {order_tax} {vat end if}
    + {total_lbl} {order_total} {order_detail_link} {payment_lbl} {payment_method}
    + {shipping_lbl} {order_shipping} {shipping_method_lbl} {shipping_method} {customer_note_lbl} {customer_note} {requisition_number_lbl} {requisition_number} {if payment_discount} {payment_discount_lbl} {payment_order_discount} {payment_discount end if}
    + {discount_type_lbl} {discount_type} {product_userfields} {shipping} {shipping_excl_vat} {product_subtotal} {product_subtotal_excl_vat} {sub_total_vat} {discount_excl_vat} {total_excl_vat}
    + {denotation_label} {discount_denotation} {discount_excl_vat} {shipping_denotation} {shipping_excl_vat} {discount_excl_vat} {product_attribute_number} {order_detail_link_lbl}
    + {product_attribute} {product_accessory} {special_discount} {special_discount_amount} {download_token} {download_token_lbl} {referral_code}
    + {product_subtotal_lbl} {product_subtotal_excl_vat_lbl} {shipping_with_vat_lbl} {shipping_excl_vat_lbl} {product_price_excl_lbl} {shipping_rate_name}
    + {order_shipping_shop_location} {order_payment_status} {payment_extrainfo} {payment_extrafields_lbl} {payment_extrafields} {shipping_extrafields_lbl} {shipping_extrafields} + +

    + {username} {email} + + {shopname} {link} {name} + +

    + {order_mail_intro_text_title} {order_mail_intro_text} {order_information_lbl} {order_id_lbl} {order_id} {order_number_lbl} {order_number}
    + {order_date_lbl} {order_date} {order_status_lbl} {order_status} {billing_address_information_lbl}
    + {billing_address} {shipping_address_information_lbl} {shipping_address} {order_detail_lbl} {product_name_lbl} {stock_status} {tracking_number_lbl} {tracking_number} {tracking_url}
    + {product_name} {product_s_desc} {product_number} {note_lbl} {product_wrapper} {price_lbl}
    + {product_price} {product_sku} {quantity_lbl} {product_quantity} {total_price_lbl} {product_total_price} {order_subtotal_lbl} {order_subtotal} {if discount} {order_discount} {discount_in_percentage} {discount end if} {if vat} {order_tax} {vat end if} {total_lbl}
    + {order_total} {order_detail_link} {payment_lbl} {payment_method} {shipping_lbl}
    + {order_shipping} {shipping_method_lbl} {shipping_method} {customer_note_lbl} {customer_note} {requisition_number_lbl} {requisition_number} {if payment_discount} {payment_discount_lbl} {payment_order_discount} {payment_discount end if} {discount_type_lbl} {discount_type} {product_userfields}
    + {fullname} {firstname} {lastname} {shipping} {shipping_excl_vat} {product_subtotal} {product_subtotal_excl_vat} {sub_total_vat} {discount_excl_vat} {total_excl_vat}
    + {denotation_label} {discount_denotation} {discount_excl_vat} {shipping_denotation} {shipping_excl_vat} {discount_excl_vat} {payment_extrainfo} {product_attribute_number}
    + {order_detail_link_lbl} {product_attribute} {product_attribute_loop_start} {product_attribute_name} {product_attribute_value} {product_attribute_value_price} {product_attribute_calculated_price} {product_attribute_loop_end} {product_accessory} {special_discount} {special_discount_amount} {download_token} {download_token_lbl} {referral_code} {product_subtotal_lbl} {product_subtotal_excl_vat_lbl}
    + {shipping_with_vat_lbl} {shipping_excl_vat_lbl} {product_price_excl_lbl} {shipping_rate_name} {order_shipping_shop_location} {order_payment_status} {transaction_id_label} {transaction_id} {payment_extrafields_lbl} {payment_extrafields} {shipping_extrafields_lbl} {shipping_extrafields} {order_transfee_label} {order_transfee} {order_total_incl_transfee} + +

    + {fullname} {email} {order_id} {order_number} {order_date} {customer_note_lbl} {customer_note} {order_detail_link_lbl} {order_detail_link} {customer_id} {order_track_url} + + {firstname} {lastname} {product_name} {subsciption_enddate} {subscription_period} {subscription_price} {product_link} + +

    + {quotation_information_lbl} {quotation_id_lbl} {quotation_id} {quotation_number_lbl} {quotation_number} {quotation_date_lbl} {quotation_date}
    + {quotation_status_lbl} {quotation_status} {quotation_note_lbl} {quotation_note} {quotation_customer_note_lbl} {quotation_customer_note}
    + {billing_address_information_lbl} {billing_address} {quotation_detail_lbl} {product_name_lbl} {product_name} {product_number_lbl} {product_number} {product_s_desc}
    + {note_lbl} {product_wrapper} {price_lbl} {product_price} {quantity_lbl} {product_quantity} {total_price_lbl} {product_total_price} {quotation_subtotal_lbl} {quotation_subtotal}
    + {quotation_vat_lbl} {quotation_vat} {total_lbl} {quotation_total} {quotation_discount_lbl} {quotation_discount} {quotation_detail_link} + + {username} {password} {link} + +

    + {shopname} {fullname} {firstname} {lastname} {name} {username} {password} {email} {account_link} + + {vat_number} {username} {company_name} {country} {state} {phone} {zipcode} {address} {city} + +

    + {username} {product_name} {product_link} {title} {comment} + + {friend_name} {your_name} {product_name} {product_desc} {product_url} + + {username} {shopname} {name} {company_name} {address} {city} {zipcode} {country} {phone} + + {name} {product_loop_start} {product_thumb_image} {product_name} {product_price} {product_loop_end} {from_name} + + {discount_code} {discount_value} {discount_voucher_product} {discount_start_date} {discount_end_date} + +
    + +
    +
    + +

    + + + + $desc): ?> + + + + + + +
    + {} + + +
    + +
    +
    +
    diff --git a/component/admin/layouts/templates/template_tag.php b/component/admin/layouts/templates/template_tag.php new file mode 100644 index 00000000000..01297d71ca4 --- /dev/null +++ b/component/admin/layouts/templates/template_tag.php @@ -0,0 +1,488 @@ + +

    + {if accessory_main} {accessory_main end if} {accessory_mainproduct_price} {accessory_main_image} {accessory_main_title} {accessory_main_short_desc} {accessory_main_readmore} {accessory_main_image_3} {accessory_main_image_2}
    + {accessory_product_start} {accessory_product_end} {accessory_title} {accessory_image} {accessory_price} {accessory_price_saving} {accessory_main_price}
    + {accessory_short_desc} {accessory_quantity} {product_number} {accessory_readmore} {accessory_image_3} {accessory_image_2}
    + {manufacturer_name} {manufacturer_link} {without_vat} {accessory_readmore_link} {accessory_add_chkbox_lbl} {accessory_quantity_lbl} {accessory_preview_image}
    + {selected_accessory_price} {accessory_add_chkbox} {attribute_template:attributes} {stock_status} + +

    + {welcome_introtext} {account_image} {account_title} {billing_address_start} {billing_address_end} + {fullname_lbl} {fullname} {vatnumber_lbl} {vatnumber} {email_lbl} {email} {address_lbl} {address} {city_lbl} {city}
    + {zipcode_lbl} {zipcode} {state_lbl} {state} {country_lbl} {country} {phone_lbl} {phone}{phone_optional} {company_name_lbl} {company_name} {requesting_tax_exempt_lbl} {requesting_tax_exempt} {edit_account_link} {customer_custom_fields}
    + {more_orders} {order_image} {order_title} {order_loop_start} {order_index} {order_id} {order_detail_link} {order_loop_end}
    + {coupon_image} {coupon_title} {coupon_loop_start} {coupon_code_lbl} {coupon_code} {coupon_value_lbl} {coupon_value} {coupon_loop_end}
    + {shipping_image} {shipping_title} {edit_shipping_link}
    + {quotation_image} {quotation_title} {quotation_loop_start} {quotation_index} {quotation_id} {quotation_detail_link} {quotation_loop_end}
    + {tag_image} {tag_title} {edit_tag_link}
    + {wishlist_image} {wishlist_title} {edit_wishlist_link}
    + {compare_image} {compare_title} {edit_compare_link} {logout_link} {newsletter_signup_chk} {newsletter_signup_lbl} {reserve_discount} {reserve_discount_lbl}
    + {product_serial_loop_start} {product_serial_image} {product_serial_title} {product_name} {product_serial_number} {product_serial_loop_end} + +

    + {addtocart_quantity_increase_decrease} {addtocart_link} {addtocart_quantity} {addtocart_image} {addtocart_image_aslink} {addtocart_button} {addtocart_tooltip} {quantity_lbl} + +

    + {ajax_cart_box_title} {show_cart_text} {show_cart_button} {continue_shopping_button} + +

    + {product_name} {product_price} {product_image} {attribute_template:attributes} {accessory_template:templatename} {if product_userfield} {product_userfield end if} + +

    + {user_email_lbl} {user_email} {user_name_lbl} {user_name} {user_question_lbl} {user_question} {user_telephone_lbl} {user_telephone} {user_address_lbl} {user_address} {send_button} {captcha_lbl} {captcha} + +

    + {attribute_title} {attribute_tooltip} {property_dropdown} {property_image_without_scroller} {property_image_scroller}
    + {subproperty_start} {property_title} {subproperty_dropdown} {subproperty_image_without_scroller} {subproperty_image_scroller} {subproperty_end} + +

    + {attribute_title} {property_image_lbl} {virtual_number_lbl} {property_name_lbl} {property_price_lbl} {property_stock_lbl} {add_to_cart_lbl} {property_start} {property_image} {virtual_number} {property_name} {property_price} {without_vat} {property_stock} {property_end} + +

    +

    + {account_creation_start}
    + {username_lbl}{username} + {password_lbl}{password} + {confirm_password_lbl}{confirm_password}
    + {newsletter_signup_chk}{newsletter_signup_lbl}
    + {account_creation_end}
    + {required_lbl}
    + {shipping_same_as_billing_lbl} {shipping_same_as_billing} + +

    + {cart_lbl} {product_price} {product_loop_start} {product_total_price} {product_name} {product_number}
    + {product_attribute} {product_attribute_loop_start} {product_attribute_name} {product_attribute_value} {product_attribute_value_price} {product_attribute_calculated_price} {product_attribute_loop_end} {attribute_label} {attribute_change} {product_accessory} {product_old_price} {product_customfields_lbl} {product_customfields} {product_subscription_lbl} {product_subscription} {product_wrapper} {discount_rule}
    + {update} {discount_form_lbl} {discount_form} {product_userfields} {coupon_code_lbl} {shipping_lbl} {total_lbl} {product_name_lbl} {price_lbl} {quantity_lbl} {total_price_lbl} {print} {product_thumb_image} {product_price_excl_vat} {product_total_price_excl_vat} {product_loop_end} {attribute_price_with_vat} {attribute_price_without_vat} {shipping}
    + {vat_info} {vat_shipping} {shipping_lbl} {product_subtotal} {shipping_excl_vat} {sub_total_vat} {discount_excl_vat} {total_excl_vat} {denotation_label} {discount_denotation} {discount_excl_vat}
    + {shipping_denotation} {shipping_excl_vat} {product_subtotal_lbl} {product_subtotal_excl_vat_lbl} {shipping_with_vat_lbl} {shipping_excl_vat_lbl} {product_price_excl_lbl} {product_name_nolink} {product_attribute_number} {tax_with_shipping_lbl} {product_subtotal} {product_subtotal_excl_vat} {total}
    + {update_cart} {quantity_increase_decrease} {remove_product} {empty_cart} {if discount} {discount_lbl} {order_discount} {discount_in_percentage} {discount end if} {totalpurchase_lbl}
    + {if vat} {vat_lbl} {tax} {vat end if} {checkout_button} {shop_more} + +

    + {name_lbl} {name} {email_lbl} {email_address} {submit_button_catalog} {catalog_select} + +

    + {product_name_lbl} {quantity_lbl} {print} {product_loop_start} {product_name} {product_attribute} {product_accessory} {product_wrapper} {product_userfields} {product_thumb_image} {update_cart} {remove_product} {product_loop_end} {update} {empty_cart} {coupon_code_lbl} {discount_form} {checkout_button} {shop_more} + +

    + {discount_type_lbl} {discount_type} {order_information_lbl} {print} {order_id_lbl} {order_id} {order_number_lbl} {order_number} {order_date_lbl} {order_date} {order_status_lbl} {order_status} {billing_address_information_lbl} {billing_address} {shipping_address_info_lbl} {shipping_address} {order_detail_lbl} {product_name_lbl} {note_lbl} {quantity_lbl} {product_loop_start} {product_name} {product_userfields} {customer_note} {product_quantity} {product_loop_end} + +

    + {product_name_lbl} {print} {quantity_lbl} {product_loop_start} {product_name} {product_userfields} {product_thumb_image} {product_quantity} {product_loop_end} {order_number_lbl} {order_number} {delivery_time_lbl} {delivery_time} {order_id} {order_id_lbl} {print} + +

    + {if subcats} {category_main_description} {category_main_short_desc} {category_main_name} {category_main_thumb_image} {subcats end if}
    + {category_loop_start} {category_loop_end} {category_name} {category_description} {category_short_desc} {category_thumb_image}
    + {product_price_lbl} {product_price_slider} {include_product_in_sub_cat} {product_loop_start} {product_loop_end} {product_name} {product_price} {product_rating_summary} {product_s_desc}
    + {pagination} {perpagelimit:X} {product_display_limit} {show_all_products_in_category} {order_by} {if product_on_sale} {product_on_sale end if} {price_excluding_vat}
    + {more_documents} {product_id_lbl} {product_id} {product_number_lbl} {product_number} {product_discount_price} {product_old_price} {product_price_saving} {product_price_saving_percentage} {with_vat} {without_vat} {filter_by}
    + {template_selector_category_lbl} {template_selector_category} {manufacturer_link} {manufacturer_name} {stock_status:class for available stock : class for out of stock: class for pre order} {shopname} {read_more} {category_readmore} {category_main_thumb_image_2} {category_main_thumb_image_3} {category_thumb_image_2} {category_thumb_image_3}
    + {product_stock_amount_image} {product_price_table} {product_thumb_image_3} {product_thumb_image_2} {discount_start_date} {discount_end_date} {compare_products_button} {compare_product_div} {front_img_link} {back_img_link} {product_preview_img} {read_more_link} {product_name_nolink} {category_product_link}
    + {order_by_lbl} {filter_by_lbl} {returntocategory_link} {returntocategory_name} {returntocategory} {category_total_product_lbl} {category_total_product} {product_delivery_time} {delivery_time_lbl} {product_length} {product_width} {product_height} {front_preview_img_link} {back_preview_img_link} {if product_userfield} {product_userfield end if} + +

    + {print} {filter_by_lbl} {filter_by} {order_by_lbl} {order_by} {category_frontpage_introtext} {template_selector_category} {template_selector_category_lbl} {category_loop_start} {category_thumb_image} {category_name} {category_description} {category_thumb_image_2} {category_thumb_image_3} {category_readmore} {category_short_desc} {category_total_product_lbl} {category_total_product} {product_loop_start} {product_thumb_image} {product_name} {product_price} {read_more} {attribute_template:attributes} {form_addtocart:add_to_cart1} {product_id_lbl} {product_id} {product_thumb_image_3} {product_thumb_image_2} {product_number_lbl} {product_number} {product_size} {product_length} {product_width} {product_height} {read_more_link} {product_s_desc} {product_desc} {product_rating_summary} {manufacturer_link} {manufacturer_name} {manufacturer_product_link} {if product_userfield} {product_userfield end if} {product_loop_end} {category_loop_end} {pagination} + +

    + {apply_button} {cancel_button} + +

    + {product_name} {product_number} {product_thumb_image} {checkout_button} {terms_and_conditions} {product_subtotal} {product_subtotal_excl_vat} {total} {shop_more} {shipping}
    + {product_price} {update_cart} {product_total_price} {product_loop_start} {product_attribute} {product_attribute_loop_start} {product_attribute_name} {product_attribute_value} {product_attribute_value_price} {product_attribute_loop_end} {attribute_label} {product_accessory} {product_wrapper} {product_userfields} {coupon_code_lbl} {if discount} {discount_lbl} {order_discount} {discount_in_percentage} {discount end if} {totalpurchase_lbl}
    + {if vat} {vat_lbl} {tax} {vat end if} {shipping_lbl} {total_lbl} {product_name_lbl} {price_lbl} {quantity_lbl} {total_price_lbl} {product_loop_end} {product_thumb_image} {product_price_excl_vat} {product_total_price_excl_vat}
    + {attribute_price_with_vat} {attribute_price_without_vat} {vat_shipping} {shipping_lbl} {customer_note_lbl} {customer_note} {requisition_number_lbl} {requisition_number} {shipping_excl_vat} {sub_total_vat} {discount_excl_vat} {total_excl_vat} {denotation_label} {discount_denotation} {discount_excl_vat} {shipping_denotation} {shipping_excl_vat} {checkout_back_button} {product_attribute_number} {thirdparty_email} {thirdparty_email_lbl} {quotation_request} + +

    + {order_id} {order_status} {customer_name} {payment_status} + +

    +

    + {email_lbl}{email} + {retype_email_lbl}{retype_email}
    + {company_name_lbl}{company_name} + {vat_number_lbl}{vat_number} + {firstname_lbl}{firstname} + {lastname_lbl}{lastname} + {address_lbl}{address} + {zipcode_lbl}{zipcode} + {city_lbl}{city} + {country_lbl}{country} + {state_lbl}{state} + {phone_lbl}{phone}{phone_optional} + {tax_exempt_lbl}{tax_exempt}

    +

    + {ean_number_lbl}{ean_number}
    + {company_extrafield} + +

    + {print} {compare_product_heading} {returntocategory_name} {returntocategory_link} {remove_all} {expand_collapse}
    + {product_name} {product_image} {manufacturer_name} {discount_start_date} {discount_end_date} {product_price}
    + {product_s_desc} {product_desc} {product_rating_summary} {product_delivery_time} {product_number}
    + {products_in_stock} {product_stock_amount_image} {product_weight} {product_length} {product_height} {product_width}
    + {product_availability_date} {product_volume} {product_category} {remove} {add_to_cart} {product_field} + +

    + {category_frontpage_introtext} {category_frontpage_loop_start} {category_thumb_image} {category_name} {category_frontpage_loop_end} {pagination} {print} {category_thumb_image_2} {category_thumb_image_3} {category_readmore} {category_description} {category_short_desc} {category_total_product} {category_total_product_lbl} + +

    + {customer_quantity_lbl} {customer_quantity} {customer_amount_lbl} {customer_amount} {giftcard_name} {giftcard_desc} {giftcard_image}
    + {giftcard_price_lbl} {giftcard_price} {giftcard_value_lbl} {giftcard_value}
    + {giftcard_validity} {giftcard_validity_from} {giftcard_validity_to} {giftcard_reciver_name_lbl} {giftcard_reciver_name} {giftcard_reciver_email_lbl} {giftcard_reciver_email} {form_addtocart:cart_templatename}
    + {if giftcard_userfield} {giftcard_userfield end if} + +

    + {giftcard_loop_start} {giftcard_name} {giftcard_desc} {giftcard_readmore} {giftcard_value_lbl} {giftcard_value} {giftcard_price_lbl} {giftcard_price} {giftcard_validity} {giftcard_loop_end} + +

    + {order_by} {manufacturer_loop_start} {manufacturer_loop_end} {manufacturer_name} {manufacturer_image} {manufacturer_description} {manufacturer_link} {manufacturer_allproductslink} {print} {pagination} + +

    + {manufacturer_name} {manufacturer_image} {manufacturer_description} {category_name} {category_thumb_image} {category_desc} {category_name_with_link} {category_loop_start} {category_loop_end} {manufacturer_url} {manufacturer_allproductslink_lbl} {manufacturer_allproductslink} {manufacturer_extra_fields} + +

    + {order_by} {filter_by}
    + {product_loop_start} {category_heading_start} {category_name} {category_heading_end} {product_name} {product_thumb_image} {product_thumb_image_2} {product_thumb_image_3} {product_price} {product_s_desc}
    + {product_old_price} {product_price_saving} {product_price_saving_percentage} {product_loop_end} {manufacturer_product_link} {form_addtocart:add_to_cart1} {print} {product_id_lbl} {product_id} {product_number} {product_number_lbl} {product_desc} {read_more} {read_more_link} {manufacturer_image} {manufacturer_name} {manufacturer_description} {manufacturer_extra_fields} {manufacturer_link} {pagination} + +

    + {data} {username} {email} {unsubscribe_link} + +

    + {product_name} {product_price} {product_thumb_image} {product_s_desc} {product_desc} {unsubscribe_link} + +

    + {billing_template} {billing_address_information_lbl} {edit_billing_address} {billing_address} {shipping_address_information_lbl} {shipping_address} + +

    + {order_id} {order_number} {order_date} {order_status} {order_status_log} {order_status_order_only_lbl} {order_status_payment_only_lbl} {order_status_order_only} {order_status_payment_only} {tracking_number_lbl} {tracking_number} {tracking_url}
    + {billing_address} {shipping_address} {product_name} {product_number} {product_wrapper}
    + {product_price} {product_attribute_loop_start} {product_attribute_name} {product_attribute_value} {product_attribute_value_price} {product_attribute_calculated_price} {product_attribute_loop_end} {attribute_label} {product_quantity} {product_total_price} {order_subtotal} {order_total}
    + {order_information_lbl} {order_id_lbl} {order_number_lbl} {order_date_lbl} {order_status_lbl}
    + {billing_address_information_lbl} {shipping_address_information_lbl} {order_detail_lbl} {product_name_lbl} {note_lbl} {price_lbl}
    + {quantity_lbl} {total_price_lbl} {order_subtotal_lbl} {if discount} {discount_lbl} {order_discount} {discount_in_percentage} {discount end if} {if vat} {vat_lbl}
    + {order_tax} {vat end if} {shipping_lbl} {total_lbl} {payment_lbl} {payment_method} {customer_note_lbl} {customer_note} {requisition_number_lbl}
    + {requisition_number} {shipping_method_lbl} {shipping_method} {if payment_discount} {payment_discount_lbl} {payment_order_discount} {payment_discount end if} {product_userfields}
    + {print} {product_attribute} {product_accessory} {product_number_lbl} {product_subscription_lbl} {product_subscription}
    + {product_price_excl_vat} {product_total_price_excl_vat} {product_subtotal_excl_vat} {order_subtotal_excl_vat}
    + {tax} {reorder_button} {shipping} {vat_shipping} {shipping_lbl}
    + {download_date_list_lbl} {download_date_list} {download_counter_lbl} {download_counter} {download_date_lbl} {download_date} {download_token_lbl} {download_token}
    + {product_subtotal} {shipping_excl_vat} {product_subtotal} {sub_total_vat} {discount_excl_vat} {total_excl_vat} {denotation_label} {discount_denotation} {discount_excl_vat}
    + {shipping_denotation} {shipping_excl_vat} {product_s_desc} {product_thumb_image} {product_old_price} {special_discount} {special_discount_amount}
    + {payment_extrafields_lbl} {payment_extrafields} {shipping_extrafields_lbl} {shipping_extrafields} {product_gift} + +

    + {order_id} {order_number} {order_date} {order_status} {order_status_order_only_lbl}{order_status_payment_only_lbl} {order_status_order_only} {order_status_payment_only}
    + {billing_address} {shipping_address} {product_name} {product_number} {product_attribute_loop_start} {product_attribute_name} {product_attribute_value} {product_attribute_value_price} {product_attribute_loop_end} {attribute_label} {product_wrapper}
    + {product_price} {product_quantity} {product_total_price} {order_subtotal} {order_total}
    + {order_information_lbl} {order_id_lbl} {order_number_lbl} {order_date_lbl} {order_status_lbl} {billing_address_information_lbl} {shipping_address_information_lbl}
    + {order_detail_lbl} {product_name_lbl} {note_lbl} {price_lbl} {quantity_lbl} {total_price_lbl} {order_subtotal_lbl} {if discount} {discount_lbl} {order_discount} {discount_in_percentage} {discount end if} {if vat} {vat_lbl}
    + {order_tax} {vat end if} {shipping_lbl} {total_lbl} {payment_lbl} {payment_method} {customer_note_lbl} {customer_note} {requisition_number_lbl} {requisition_number}
    + {shipping_method_lbl} {shipping_method} {if payment_discount} {payment_discount_lbl} {payment_order_discount} {payment_discount end if}
    + {product_userfields} {print} {special_discount} {special_discount_amount} + +

    + {product_loop_start} {product_loop_end} {product_name} {product_number}
    + {product_attribute_loop_start} {product_attribute_name} {product_attribute_value} {product_attribute_value_price} {product_attribute_calculated_price} {product_attribute_loop_end} {attribute_label} {product_wrapper} {product_price} {product_quantity} {product_total_price} {order_subtotal} {tracking_number_lbl} {tracking_number} {tracking_url}
    + {order_id} {order_number} {order_shipping} {order_total} {delivery_time} {payment_status} {print}{delivery_time_lbl}
    + {if discount} {discount_lbl} {order_discount} {discount_in_percentage} {discount end if} {if vat} {vat_lbl} {order_tax} {vat end if} {shipping_lbl} {shipping_method_lbl} {shipping_method}
    + {if payment_discount} {payment_discount_lbl} {payment_order_discount} {payment_discount end if}
    + {product_userfields} {shipping} {vat_shipping} {shipping_lbl}
    + {download_date_list_lbl} {download_date_list} {download_counter_lbl} {download_counter} {download_date_lbl} {download_date} {download_token_lbl} {download_token}
    + {product_subtotal} {product_subtotal_excl_vat} {shipping_excl_vat} {product_subtotal} {sub_total_vat} {discount_excl_vat} {total_excl_vat} {denotation_label} {discount_denotation}
    + {discount_excl_vat} {shipping_denotation} {shipping_excl_vat} {payment_extrafields_lbl} {payment_extrafields} {shipping_extrafields_lbl} {shipping_extrafields} {product_gift} + +

    + {order_id_lbl} {product_name_lbl} {total_price_lbl} {order_date_lbl} {order_status_lbl} {order_detail_lbl} {product_loop_start} {order_id} {order_products} {order_total} {order_date} {order_status} {order_detail_link} {reorder_link} {product_loop_end} {pagination} {print} {order_number} {pagination_limit} + +

    +

    + {email_lbl}{email} + {firstname_lbl}{firstname} + {lastname_lbl}{lastname} + {address_lbl}{address} + {zipcode_lbl}{zipcode} + {city_lbl}{city} + {country_lbl}{country} + {state_lbl}{state} + {phone_lbl}{phone}{phone_optional} + {private_extrafield}
    + {retype_email_lbl}{retype_email} + +

    + {product_name} {manufacturer_name} {supplier_name} {publish_date} {update_date}
    + {discount_start_date} {discount_end_date} {product_discount_price} {product_old_price} {product_price_saving} {product_price_saving_percentage} {if product_on_sale}
    + {product_on_sale end if} {product_price_lbl} {if product_special} {product_special end if} {product_name} {product_price} {lowest_price} {highest_price}
    + {product_thumb_image} {product_thumb_image_2} {product_thumb_image_3} {product_s_desc} {product_rating} {more_images} {more_documents} {more_videos}
    + {product_desc} {bookmark} {send_to_friend} {ask_question_about_product} {ask_question_about_product_without_lightbox} {manufacturer_product_link} {product_rating_summary}
    + {product_delivery_time} {manufacturer_link} {form_rating} {form_rating_without_lightbox} {product_id_lbl} {product_id}
    + {product_number_lbl} {product_number} {product_price_table} {products_in_stock} {if product_userfield} {product_userfield end if}
    + {delivery_time_lbl} {with_vat} {without_vat} {discount_calculator} {facebook_like_button} {googleplus1}
    + {returntocategory_name} {returntocategory_link} {product_size}
    + {component_heading} {returntocategory} {navigation_link_right} {product_weight} {product_weight_lbl}
    + {child_products} {product_volume} {product_volume_lbl} {product_price_novat} {price_excluding_vat}
    + {more_images_3} {more_images_2} {product_stock_amount_image}
    + {wishlist_button} {wishlist_link} {compare_products_button} {compare_product_div} {my_tags_button} {subscription} {ajaxdetail_template:templatename} {accessory_template:templatename}
    + {question_loop_start} {question} {question_owner} {question_date} {answer_loop_start} {answer} {answer_owner} {answer_date} {answer_loop_end} {question_loop_end}
    + {product_length} {product_width} {product_height}
    + {front_img_link} {back_img_link} {category_product_img} {category_front_img_link} {category_back_img_link} {product_preview_img} {diameter} {product_diameter_lbl} {manufacturer_image}
    + {back_link} {product_length_lbl} {product_width_lbl} {product_height_lbl} {min_order_product_quantity} {print} {product_category_list} {stock_notify_flag} {product_availability_date}
    + {stock_status} {product_gift_table} + +

    + {product_thumb_image} {product_thumb_image_2} {product_thumb_image_3} {product_name} {product_desc} {product_price} {read_more} {attribute_template:attributes} {form_addtocart:add_to_cart1} + +

    + {name_lbl} {name} {email_lbl} {email_address} {address_fields} {submit_button_sample} {product_samples} + +

    + {cart_lbl} {print} {product_name_lbl} {quantity_lbl} {product_loop_start} {product_name} {product_attribute} {product_accessory} {product_wrapper} {product_userfields} {product_thumb_image} {update_cart} {remove_product} {product_loop_end} {update} {empty_cart} {checkout_button} {shop_more} + +

    + {print} {quotation_information_lbl} {quotation_id_lbl} {quotaion_id} {quotation_number_lbl} {quotation_number} {quotation_date_lbl} {quotation_date} {quotation_status_lbl} {quotation_status} {quotation_note_lbl} {quotation_note} {account_information_lbl} {account_information} {quotation_detail_lbl} {product_name_lbl} {note_lbl} {price_lbl} {quantity_lbl} {total_price_lbl} {product_loop_start} {product_name} {product_attribute} {product_accessory} {product_number_lbl} {product_number} {product_price} {product_quantity} {product_total_price} {product_loop_end} {product_userfields} {quotation_subtotal_lbl} {quotation_subtotal} {total_lbl} {quotation_total} {quotation_discount_lbl} {quotation_discount} {quotation_custom_field_list} + +

    + {order_detail_lbl} {product_name_lbl} {quantity_lbl} {product_loop_start} {product_name} {product_attribute} {product_accessory} {product_userfields} {update_cart} {product_wrapper} {product_loop_end} {customer_note_lbl} {customer_note} {billing_address_information_lbl} {billing_address} {cancel_btn} {request_quotation_btn} {quotation_custom_field_list} + +

    + {search_tag_display} {product_loop_start} {product_loop_end} {product_name} {product_price} {product_thumb_image}
    + {product_s_desc} {read_more} {product_id_lbl} {product_id} {product_number_lbl} {product_number} {manufacturer_link} {manufacturer_name} {order_by} {pagination}
    + {perpagelimit:X} {product_display_limit} {attribute_template:attributes} + +

    + {payment_heading} {payment_loop_start} {payment_method_name} {creditcard_information} {payment_extrafields} {payment_loop_end} + +

    + {shipping_heading} {shipping_method_loop_start} {shipping_method_title} {shipping_rate_loop_start} {shipping_rate_name} {shipping_rate} {shipping_location} {shipping_rate_loop_end} {shipping_method_loop_end} + +

    + {relproduct_link} {relproduct_image} {relproduct_name} {relproduct_price} {relproduct_number} {relproduct_number_lbl} {read_more} {relproduct_old_price} {relproduct_price_table} {relproduct_price_saving}
    + {related_product_start} {related_product_end} {relproduct_s_desc} {relproduct_price_novat} {relproduct_old_price_lbl} {relproduct_image_2} {relproduct_image_3}
    + {attribute_template:templatename} {form_addtocart:templatename} {producttag:rs_field}
    + {stock_status} {relproduct_attribute_pricelist} {manufacturer_name} {manufacturer_link} {read_more_link} + +

    + {product_loop_start} {product_title}
    + {review_loop_start} {fullname} {title} {comment} {stars} {reviewdate} {review_loop_end} {product_loop_end} + +

    + {order_information_lbl} {order_id_lbl} {order_id} {order_number_lbl} {order_number} {order_date_lbl} {order_date} {order_status_lbl} {order_status} {customer_note_lbl} {customer_note} {billing_address_information_lbl} {billing_address} {shipping_address_information_lbl} {shipping_address} {order_detail_lbl}
    + {product_loop_start} {product_name_lbl} {note_lbl} {price_lbl} {quantity_lbl} {total_price_lbl} {product_name} {product_number} {product_userfields} {product_attribute} {product_accessory} {product_wrapper} {product_price} {product_quantity} {product_total_price} {product_loop_end}
    + {if vat} {vat_lbl} {order_tax} {vat end if}
    + {if discount} {discount_lbl} {order_discount} {discount end if}
    + {order_subtotal_lbl} {product_subtotal} {shipping_lbl} {shipping_excl_vat} {total_lbl} {order_total} {order_payment_status} {shipping_method_lbl} {shipping_method} {order_detail_link} + +

    +

    + {firstname_st_lbl}{firstname_st}
    + {lastname_st_lbl}{lastname_st}
    + {address_st_lbl}{address_st}
    + {zipcode_st_lbl}{zipcode_st}
    + {city_st_lbl}{city_st}
    + {country_st_lbl}{country_st}
    + {state_st_lbl}{state_st}
    + {phone_st_lbl}{phone_st}

    + +

    + {extra_field_st_start}{extra_field_st}{extra_field_st_end} + +

    + {shipping_box_heading} {shipping_box_list} + +

    + {order_information_lbl} {order_id_lbl} {order_id} {order_number_lbl} {order_number} {order_date_lbl} {order_date}
    + {order_status_lbl} {order_status} {shipping_address_information_lbl} {shipping_firstname_lbl} {shipping_firstname} {shipping_lastname_lbl} {shipping_lastname}
    + {shipping_address_lbl} {shipping_address} {shipping_zip_lbl} {shipping_zip} {shipping_city_lbl} {shipping_city} {shipping_country_lbl} {shipping_state_lbl}
    + {shipping_phone_lbl} {company_name_lbl} {company_name} {shipping_country} {shipping_phone} {shipping_state} + +

    + {order_id_lbl} {order_id} {order_date_lbl} {order_date} {product_name_lbl} {product_number_lbl} {product_quantity_lbl} {product_name}
    + {product_attribute} {product_number} {product_quantity} {requisition_number} {requisition_number_lbl} + +

    + {if product_userfield} {product_userfield end if} {all_cart} {attribute_template:attributes} {product_loop_start} {product_loop_end} {mail_link} {product_price} {remove_product_link}
    + {product_thumb_image} {product_name} {back_link} {product_thumb_image_2} {product_thumb_image_3}
    + {price_excluding_vat} {product_price_table} {product_old_price} {product_price_saving} {product_price_saving_percentage} {accessory_template:templatename} {product_s_desc} {read_more} {read_more_link} + +

    + {email_to_friend} {emailto_lbl} {emailto} {sender_lbl} {sender}
    + {mail_lbl} {mail} {subject_lbl} {subject} {cancel_button} {send_button} + +

    + {wrapper_dropdown} {wrapper_image} {wrapper_add_checkbox} {wrapper_price} + getPrimaryKey(); +$itemId = $data->item->{$primaryKey}; +$action = 'index.php?option=com_redshop&task=' . $data->getInstanceName() . '.edit&' . $primaryKey . '=' . $itemId; +$fieldSetClass = 'col-md-' . (12 / $data->formFieldsetsColumn); +?> + +
    +
    + fields as $fieldSet): ?> +
    + JText::_('COM_REDSHOP_' . strtoupper($fieldSet->name)), 'content' => $fieldSet->html) + ) + ?> +
    + +
    + +
    diff --git a/component/admin/layouts/view/edit/index.html b/component/admin/layouts/view/edit/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/view/edit/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/view/edit/tab.php b/component/admin/layouts/view/edit/tab.php new file mode 100644 index 00000000000..c62d1a8cb75 --- /dev/null +++ b/component/admin/layouts/view/edit/tab.php @@ -0,0 +1,68 @@ +getPrimaryKey(); +$itemId = $data->item->{$primaryKey}; +$action = 'index.php?option=com_redshop&task=' . $data->getInstanceName() . '.edit&' . $primaryKey . '=' . $itemId; +?> + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + fields as $fieldSet): ?> +
    +
    +
    + html ?> +
    +
    +
    + + +
    +
    +
    + +
    diff --git a/component/admin/layouts/view/index.html b/component/admin/layouts/view/index.html new file mode 100644 index 00000000000..3af63015d22 --- /dev/null +++ b/component/admin/layouts/view/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/layouts/view/list.php b/component/admin/layouts/view/list.php new file mode 100644 index 00000000000..72185994969 --- /dev/null +++ b/component/admin/layouts/view/list.php @@ -0,0 +1,213 @@ +escape($data->state->get('list.ordering')); +$listDirn = $data->escape($data->state->get('list.direction')); +$viewName = $data->getInstancesName(); +$singleName = $data->getInstanceName(); +$search = $data->state->get('filter.search'); +$user = JFactory::getUser(); + +$filterOptions = array( + 'searchField' => 'search', + 'searchFieldSelector' => '#filter_search', + 'limitFieldSelector' => '#list_' . $viewName . '_limit', + 'activeOrder' => $listOrder, + 'activeDirection' => $listDirn, + 'filterButton' => (count($data->filterForm->getGroup('filter')) > 1) +); + +$filterOptions = array_merge($filterOptions, $data->filterFormOptions); + +if ($data->hasOrdering) +{ + $saveOrderUrl = 'index.php?option=com_redshop&task=' . $viewName . '.saveOrderAjax&tmpl=component'; + $orderingColumn = true === $data->isNested ? 'lft' : 'ordering'; + $allowOrder = ($listOrder == $orderingColumn && strtolower($listDirn) == 'asc' && $data->canEdit && empty($search)); + + if ($allowOrder) + { + JHtml::_('sortablelist.sortable', 'table-' . $viewName, 'adminForm', strtolower($listDirn), $saveOrderUrl, false, true); + } +} +?> + + +
    +
    + $data, + 'options' => $filterOptions + ) + ); + ?> +
    + items)) : ?> +
    + +
    + + getColumns(); ?> + + + + + + hasOrdering): ?> + + + + + + + + + + + items as $i => $row): ?> + {$data->getPrimaryKey()}; ?> + authorise('core.manage', 'com_checkin') || $row->checked_out == $user->id || $row->checked_out == 0; ?> + hasOrdering && $data->isNested && !empty($data->nestedOrdering)) : ?> + {$data->getPrimaryKey()}, $data->nestedOrdering[$row->parent_id]); ?> + level > 1) : ?> + parent_id; + $parentsStr = ' ' . $currentParentId; + ?> + level; $i2++) : ?> + nestedOrdering as $k => $v) : ?> + + + + + + + + + + + + + + + + hasOrdering): ?> + + + + + + + + + + + + + + + +
    # + + + ', $orderingColumn, $listDirn, $listOrder) ?> + +   + + + + + + + + getPrimaryKey(), $listDirn, $listOrder) ?> +
    pagination->getRowOffset($i) ?> + {$data->getPrimaryKey()}) ?> + + + + + + + + + checked_out)): ?> + checked_out, $row->checked_out_time, $viewName . '.', $canCheckIn) ?> + canEdit == false): ?> + + + + + + + + + + onRenderColumn($column, $i, $row) ?> + + +
    pagination->getListFooter() ?>
    + + + + + + + +
    diff --git a/component/admin/models/access.php b/component/admin/models/access.php new file mode 100644 index 00000000000..7a6a82d2f4f --- /dev/null +++ b/component/admin/models/access.php @@ -0,0 +1,98 @@ +authorise('core.manage', 'com_redshop')) + { + return false; + } + + $rules = $data['rules']; + $rules = array_map(function($item){ return array_filter($item, 'strlen'); }, $rules); + $rules = new JAccessRules($rules); + unset($data['rules']); + + /** @var RedshopTableAccess $table */ + $table = $this->getTable(); + + if (!$table->load($data['id']) || empty($table->parent_id)) + { + /** @var JTableAsset $root */ + $root = JTable::getInstance('asset'); + $root->loadByName('com_redshop'); + + $table->setLocation($root->id, 'last-child'); + $table->parent_id = $root->id; + } + + $table->name = $this->assetName; + $table->title = $data['title']; + $table->rules = (string) $rules; + + if (!$table->check() || !$table->store()) + { + return false; + } + + return true; + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return object|boolean Object on success, false on failure. + * + * @since 12.2 + */ + public function getItem($pk = null) + { + $table = $this->getTable(); + + if (!$table->loadByName($this->assetName)) + { + return false; + } + + $item = $table->getProperties(true); + $item = ArrayHelper::toObject($item, 'JObject'); + + return $item; + } +} diff --git a/component/admin/models/accountgroup.php b/component/admin/models/accountgroup.php new file mode 100644 index 00000000000..7f873535651 --- /dev/null +++ b/component/admin/models/accountgroup.php @@ -0,0 +1,94 @@ +_context = 'accountgroup_id'; + $this->_table_prefix = '#__redshop_'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + $query = ' SELECT * FROM ' . $this->_table_prefix . 'economic_accountgroup ' + . $orderby; + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'accountgroup_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } +} diff --git a/component/admin/models/accountgroup_detail.php b/component/admin/models/accountgroup_detail.php new file mode 100644 index 00000000000..d6abbf65e4e --- /dev/null +++ b/component/admin/models/accountgroup_detail.php @@ -0,0 +1,157 @@ +_table_prefix = '#__redshop_'; + + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'economic_accountgroup ' + . 'WHERE accountgroup_id = ' . (int) $this->_id . ' '; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + + $detail->accountgroup_id = 0; + $detail->accountgroup_name = null; + $detail->economic_vat_account = null; + $detail->economic_nonvat_account = null; + $detail->economic_discount_vat_account = null; + $detail->economic_discount_nonvat_account = null; + $detail->economic_shipping_vat_account = null; + $detail->economic_shipping_nonvat_account = null; + $detail->economic_discount_product_number = null; + $detail->published = 1; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + // Sanitise ids + $cid = Joomla\Utilities\ArrayHelper::toInteger($cid); + $cids = implode(',', $cid); + + $query = 'DELETE FROM ' . $this->_table_prefix . 'economic_accountgroup ' + . 'WHERE accountgroup_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + // Sanitise ids + $cid = Joomla\Utilities\ArrayHelper::toInteger($cid); + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'economic_accountgroup' + . ' SET published = ' . (int) $publish . ' ' + . ' WHERE accountgroup_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/addorder_detail.php b/component/admin/models/addorder_detail.php new file mode 100644 index 00000000000..230804cacea --- /dev/null +++ b/component/admin/models/addorder_detail.php @@ -0,0 +1,866 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + $this->_db = JFactory::getDbo(); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if (!$this->_loadData()) + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $this->_data = RedshopEntityOrder::getInstance($this->_id)->getItem(); + + return (boolean) $this->_data; + } + + return true; + } + + public function setBilling() + { + $post = JFactory::getApplication()->input->post->getArray(); + + $is_company = (Redshop::getConfig()->get('DEFAULT_CUSTOMER_REGISTER_TYPE') == 2) ? 1 : 0; + $detail = new stdClass; + $detail->users_info_id = (isset($post['users_info_id'])) ? $post['users_info_id'] : 0; + $detail->address_type = (isset($post['address_type'])) ? $post['address_type'] : ""; + $detail->company_name = (isset($post['company_name'])) ? $post['company_name'] : null; + $detail->firstname = (isset($post['firstname'])) ? $post['firstname'] : null; + $detail->lastname = (isset($post['lastname'])) ? $post['lastname'] : null; + $detail->country_code = (isset($post['country_code'])) ? $post['country_code'] : null; + $detail->state_code = (isset($post['state_code'])) ? $post['state_code'] : null; + $detail->zipcode = (isset($post['zipcode'])) ? $post['zipcode'] : null; + $detail->user_email = (isset($post['user_email'])) ? $post['user_email'] : null; + $detail->address = (isset($post['address'])) ? $post['address'] : null; + $detail->is_company = (isset($post['is_company'])) ? $post['is_company'] : $is_company; + $detail->city = (isset($post['city'])) ? $post['city'] : null; + $detail->phone = (isset($post['phone'])) ? $post['phone'] : null; + $detail->vat_number = (isset($post['vat_number'])) ? $post['vat_number'] : null; + $detail->tax_exempt_approved = (isset($post['tax_exempt_approved'])) ? $post['tax_exempt_approved'] : null; + $detail->requesting_tax_exempt = (isset($post['requesting_tax_exempt'])) ? $post['requesting_tax_exempt'] : null; + $detail->ean_number = (isset($post['ean_number'])) ? $post['ean_number'] : null; + $detail->tax_exempt = (isset($post['tax_exempt'])) ? $post['tax_exempt'] : null; + + return $detail; + } + + public function setShipping() + { + $post = JFactory::getApplication()->input->post->getArray(); + + $detail = new stdClass; + $detail->billisship = (isset($post['billisship'])) ? $post['billisship'] : 1; + $detail->users_info_id = (isset($post['users_info_id'])) ? $post['users_info_id'] : 0; + $detail->firstname = (isset($post['firstname_ST'])) ? $post['firstname_ST'] : null; + $detail->lastname = (isset($post['lastname_ST'])) ? $post['lastname_ST'] : null; + $detail->country_code = (isset($post['country_code_ST'])) ? $post['country_code_ST'] : null; + $detail->state_code = (isset($post['state_code_ST'])) ? $post['state_code_ST'] : null; + $detail->zipcode = (isset($post['zipcode_ST'])) ? $post['zipcode_ST'] : null; + $detail->address = (isset($post['address_ST'])) ? $post['address_ST'] : null; + $detail->city = (isset($post['city_ST'])) ? $post['city_ST'] : null; + $detail->phone = (isset($post['phone_ST'])) ? $post['phone_ST'] : null; + + return $detail; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->order_id = 0; + $detail->user_id = null; + $detail->order_number = null; + $detail->user_info_id = null; + $detail->order_total = null; + $detail->order_subtotal = null; + $detail->order_tax = null; + $detail->order_tax_details = null; + $detail->order_shipping = null; + $detail->order_shipping_tax = null; + $detail->coupon_discount = null; + $detail->payment_discount = null; + $detail->order_discount = null; + $detail->order_status = null; + $detail->cdate = null; + $detail->mdate = null; + $detail->ship_method_id = null; + $detail->customer_note = null; + $detail->ip_address = null; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function storeShipping($data) + { + $data['address_type'] = 'BT'; + $data['createaccount'] = (isset($data['username']) && $data['username'] != "") ? 1 : 0; + $data['user_email'] = $data['email1'] = $data['email']; + $data['sameasbilling'] = (isset($data['billisship']) && $data['billisship'] == 1) ? 1 : 0; + $data['billisship'] = 1; + $data['groups'] = array("Registered" => "2"); + + if ($data['guestuser'] && !$data['user_id']) + { + $joomlauser = RedshopHelperJoomla::updateJoomlaUser($data); + + if (!$joomlauser) + { + return false; + } + } + + $reduser = RedshopHelperUser::storeRedshopUser($data, $joomlauser->id, 1); + + if ($reduser) + { + if ($data['sameasbilling'] != 1) + { + $data['users_info_id'] = ($data['shipp_users_info_id'] != "") ? $data['shipp_users_info_id'] : 0; + $data['user_email'] = $reduser->user_email; + $data['user_id'] = $reduser->user_id; + $data['tax_exempt'] = $reduser->tax_exempt; + $data['requesting_tax_exempt'] = $reduser->requesting_tax_exempt; + $data['shopper_group_id'] = $reduser->shopper_group_id; + $data['tax_exempt_approved'] = $reduser->tax_exempt_approved; + $data['company_name'] = $reduser->company_name; + $data['vat_number'] = $reduser->vat_number; + + if ($data['firstname_ST'] == "") + { + $data['firstname_ST'] = $data['firstname']; + } + + if ($data['lastname_ST'] == "") + { + $data['lastname_ST'] = $data['lastname']; + } + + if ($data['address_ST'] == "") + { + $data['address_ST'] = $data['address']; + } + + if ($data['city_ST'] == "") + { + $data['city_ST'] = $data['city']; + } + + if ($data['state_code_ST'] == "0") + { + $data['state_code_ST'] = $data['state_code']; + } + + if ($data['country_code_ST'] == "0") + { + $data['country_code_ST'] = $data['country_code']; + } + + if ($data['zipcode_ST'] == "") + { + $data['zipcode_ST'] = $data['zipcode']; + } + + if ($data['phone_ST'] == "") + { + $data['phone_ST'] = $data['phone']; + } + + $rowsh = RedshopHelperUser::storeRedshopUserShipping($data); + + return $rowsh; + } + else + { + $reduser->users_info_id = 0; + + return $reduser; + } + } + + return $reduser; + } + + public function store($postdata) + { + $order_functions = order_functions::getInstance(); + $producthelper = productHelper::getInstance(); + $rsCarthelper = rsCarthelper::getInstance(); + + // For barcode generation + $barcode_code = $order_functions->barcode_randon_number(12, 0); + + $postdata['barcode'] = $barcode_code; + + /** @var Tableorder_detail $row */ + $row = $this->getTable('order_detail'); + + if (!$row->bind($postdata)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$row->check()) + { + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + $rowOrderStatus = $this->getTable('order_status_log'); + $rowOrderStatus->order_id = $row->order_id; + $rowOrderStatus->order_status = $row->order_status; + $rowOrderStatus->date_changed = time(); + $rowOrderStatus->customer_note = $row->customer_note; + $rowOrderStatus->store(); + + $billingAddresses = RedshopHelperOrder::getBillingAddress($row->user_id); + + if (isset($postdata['billisship']) && $postdata['billisship'] == 1) + { + $shippingAddresses = $billingAddresses; + } + else + { + $key = 0; + $shippingAddresses = RedshopHelperOrder::getShippingAddress($row->user_id); + $shippingUserInfoId = (isset($postdata['shipp_users_info_id']) && $postdata['shipp_users_info_id'] != 0) ? $postdata['shipp_users_info_id'] : 0; + + if ($shippingUserInfoId != 0) + { + foreach ($shippingAddresses as $index => $shippingaddress) + { + if ($shippingaddress->users_info_id == $shippingUserInfoId) + { + $key = $index; + break; + } + } + } + + $shippingAddresses = $shippingAddresses[$key]; + } + + // ORDER DELIVERY TIME IS REMAINING + + $user_id = $row->user_id; + $item = $postdata['order_item']; + + for ($i = 0, $in = count($item); $i < $in; $i++) + { + $product_id = $item[$i]->product_id; + $quantity = $item[$i]->quantity; + $product_excl_price = $item[$i]->prdexclprice; + $product_price = $item[$i]->productprice; + + // Attribute price added + $generateAttributeCart = Redshop\Cart\Helper::generateAttribute((array) $item[$i], $user_id); + $retAttArr = $producthelper->makeAttributeCart($generateAttributeCart, $product_id, $user_id, 0, $quantity); + $product_attribute = $retAttArr[0]; + + // Accessory price + $generateAccessoryCart = $rsCarthelper->generateAccessoryArray((array) $item[$i], $user_id); + $retAccArr = $producthelper->makeAccessoryCart($generateAccessoryCart, $product_id, $user_id); + $product_accessory = $retAccArr[0]; + $accessory_vat_price = $retAccArr[2]; + + $wrapper_price = 0; + $wrapper_vat = 0; + + if ($item[$i]->wrapper_data != 0 && $item[$i]->wrapper_data != '') + { + $wrapper = $producthelper->getWrapper($product_id, $item[$i]->wrapper_data); + + if (count($wrapper) > 0) + { + if ($wrapper[0]->wrapper_price > 0) + { + $wrapper_vat = RedshopHelperProduct::getProductTax($product_id, $wrapper[0]->wrapper_price, $user_id); + } + + $wrapper_price = $wrapper[0]->wrapper_price + $wrapper_vat; + } + } + + $product = Redshop::product((int) $product_id); + + $rowitem = $this->getTable('order_item_detail'); + + if (!$rowitem->bind($postdata)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + // STOCKROOM update + $updatestock = RedshopHelperStockroom::updateStockroomQuantity($product_id, $quantity); + $stockroom_id_list = $updatestock['stockroom_list']; + $stockroom_quantity_list = $updatestock['stockroom_quantity_list']; + $rowitem->stockroom_id = $stockroom_id_list; + $rowitem->stockroom_quantity = $stockroom_quantity_list; + $rowitem->order_item_id = 0; + $rowitem->order_id = $row->order_id; + $rowitem->user_info_id = $row->user_info_id; + $rowitem->supplier_id = $product->manufacturer_id; + $rowitem->product_id = $product_id; + $rowitem->order_item_sku = $product->product_number; + $rowitem->order_item_name = $product->product_name; + $rowitem->product_quantity = $quantity; + $rowitem->product_item_price = $product_price; + $rowitem->product_item_price_excl_vat = $product_excl_price; + $rowitem->product_final_price = $product_price * $quantity; + $rowitem->order_item_currency = Redshop::getConfig()->get('REDCURRENCY_SYMBOL'); + $rowitem->order_status = $row->order_status; + $rowitem->cdate = $row->cdate; + $rowitem->mdate = $row->cdate; + $rowitem->product_attribute = $product_attribute; + $rowitem->product_accessory = $product_accessory; + $rowitem->wrapper_id = $item[$i]->wrapper_data; + $rowitem->wrapper_price = $wrapper_price; + $rowitem->is_giftcard = 0; + + if (RedshopHelperProductDownload::checkDownload($product_id)) + { + $medianame = $producthelper->getProductMediaName($product_id); + + for ($j = 0, $jn = count($medianame); $j < $jn; $j++) + { + $product_serial_number = $producthelper->getProdcutSerialNumber($product_id); + $producthelper->insertProductDownload( + $product_id, $user_id, $rowitem->order_id, + $medianame[$j]->media_name, $product_serial_number->serial_number + ); + } + } + + if (!$rowitem->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + /** my accessory save in table start */ + if (count($generateAccessoryCart) > 0) + { + $attArr = $generateAccessoryCart; + + for ($a = 0, $an = count($attArr); $a < $an; $a++) + { + $accessory_vat_price = 0; + $accessory_attribute = ""; + $accessory_id = $attArr[$a]['accessory_id']; + $accessory_name = $attArr[$a]['accessory_name']; + $accessory_price = $attArr[$a]['accessory_price']; + $accessory_org_price = $accessory_price; + + if ($accessory_price > 0) + { + $accessory_vat_price = RedshopHelperProduct::getProductTax($product_id, $accessory_price, $user_id); + } + + $attchildArr = $attArr[$a]['accessory_childs']; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $attribute_id = $attchildArr[$j]['attribute_id']; + $accessory_attribute .= urldecode($attchildArr[$j]['attribute_name']) . ":
    "; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $accessory_id; + $rowattitem->section_name = $attchildArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 1; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + $propArr = $attchildArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = RedshopHelperProduct::getProductTax($product_id, $propArr[$k]['property_price'], $user_id); + } + + $property_id = $propArr[$k]['property_id']; + $accessory_attribute .= urldecode($propArr[$k]['property_name']) . " (" + . $propArr[$k]['property_oprand'] + . RedshopHelperProductPrice::formattedPrice($propArr[$k]['property_price'] + $section_vat) . ")
    "; + $subpropArr = $propArr[$k]['property_childs']; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = RedshopHelperProduct::getProductTax($rowitem->product_id, $subpropArr[$l]['subproperty_price'], $user_id); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + $accessory_attribute .= urldecode($subpropArr[$l]['subproperty_name']) + . " (" . $subpropArr[$l]['subproperty_oprand'] + . RedshopHelperProductPrice::formattedPrice($subpropArr[$l]['subproperty_price'] + $section_vat) . ")
    "; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + + $accdata = $this->getTable('accessory_detail'); + + if ($accessory_id > 0) + { + $accdata->load($accessory_id); + } + + $accProductinfo = Redshop::product((int) $accdata->child_product_id); + $rowaccitem = $this->getTable('order_acc_item'); + $rowaccitem->order_item_acc_id = 0; + $rowaccitem->order_item_id = $rowitem->order_item_id; + $rowaccitem->product_id = $accessory_id; + $rowaccitem->order_acc_item_sku = $accProductinfo->product_number; + $rowaccitem->order_acc_item_name = $accessory_name; + $rowaccitem->order_acc_price = $accessory_org_price; + $rowaccitem->order_acc_vat = $accessory_vat_price; + $rowaccitem->product_quantity = $quantity; + $rowaccitem->product_acc_item_price = $accessory_price; + $rowaccitem->product_acc_final_price = ($accessory_price * $quantity); + $rowaccitem->product_attribute = $accessory_attribute; + + if ($accessory_id > 0) + { + if (!$rowaccitem->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + } + + /** my attribute save in table start */ + if (count($generateAttributeCart) > 0) + { + $attArr = $generateAttributeCart; + + for ($j = 0, $jn = count($attArr); $j < $jn; $j++) + { + $attribute_id = $attArr[$j]['attribute_id']; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $rowitem->product_id; + $rowattitem->section_name = $attArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 0; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + $propArr = $attArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = RedshopHelperProduct::getProductTax($rowitem->product_id, $propArr[$k]['property_price'], $user_id); + } + + $property_id = $propArr[$k]['property_id']; + /** product property STOCKROOM update start */ + RedshopHelperStockroom::updateStockroomQuantity($property_id, $quantity, "property"); + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = RedshopHelperProduct::getProductTax($product_id, $subpropArr[$l]['subproperty_price'], $user_id); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + /** product subproperty STOCKROOM update start */ + RedshopHelperStockroom::updateStockroomQuantity($subproperty_id, $quantity, "subproperty"); + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + } + + // Store userfields + if (isset($item[$i]->extrafieldname) && isset($item[$i]->extrafieldId)) + { + $userfields = $item[$i]->extrafieldname; + $userfields_id = $item[$i]->extrafieldId; + + for ($ui = 0, $countUserField = count($userfields); $ui < $countUserField; $ui++) + { + RedshopHelperProduct::insertProductUserField($userfields_id[$ui], $rowitem->order_item_id, 12, $userfields[$ui]); + } + } + } + + $rowpayment = $this->getTable('order_payment'); + + if (!$rowpayment->bind($postdata)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + $rowpayment->order_id = $row->order_id; + $rowpayment->payment_method_id = $postdata['payment_method_class']; + $rowpayment->order_payment_amount = $row->order_total; + $rowpayment->order_payment_name = $postdata['order_payment_name']; + $rowpayment->payment_method_class = $postdata['payment_method_class']; + + if (!$rowpayment->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + // Add billing Info + $userrow = $this->getTable('user_detail'); + $userrow->load($billingAddresses->users_info_id); + $orderuserrow = $this->getTable('order_user_detail'); + + if (!$orderuserrow->bind($userrow)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + $orderuserrow->order_id = $row->order_id; + $orderuserrow->address_type = 'BT'; + + if (!$orderuserrow->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + // Add shipping Info + $userrow = $this->getTable('user_detail'); + + if (isset($shippingAddresses->users_info_id)) + { + $userrow->load($shippingAddresses->users_info_id); + } + + $orderuserrow = $this->getTable('order_user_detail'); + + if (!$orderuserrow->bind($userrow)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + $orderuserrow->order_id = $row->order_id; + $orderuserrow->address_type = 'ST'; + + if (!$orderuserrow->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if ($row->order_status == Redshop::getConfig()->get('CLICKATELL_ORDER_STATUS')) + { + RedshopHelperClickatell::clickatellSMS($row->order_id); + } + + // Economic Integration start for invoice generate and book current invoice + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1 && Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT') != 2) + { + $economicdata['economic_payment_terms_id'] = $postdata['economic_payment_terms_id']; + $economicdata['economic_design_layout'] = $postdata['economic_design_layout']; + $economicdata['economic_is_creditcard'] = $postdata['economic_is_creditcard']; + $payment_name = $postdata['payment_method_class']; + $paymentArr = explode("rs_payment_", $postdata['payment_method_class']); + + if (count($paymentArr) > 0) + { + $payment_name = $paymentArr[1]; + } + + $economicdata['economic_payment_method'] = $payment_name; + + RedshopEconomic::createInvoiceInEconomic($row->order_id, $economicdata); + + if (Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT') == 0) + { + // Check for bank transfer payment type plugin - `rs_payment_banktransfer` suffixed + $isBankTransferPaymentType = RedshopHelperPayment::isPaymentType($postdata['payment_method_class']); + + $checkOrderStatus = ($isBankTransferPaymentType) ? 0 : 1; + + $bookinvoicepdf = RedshopEconomic::bookInvoiceInEconomic($row->order_id, $checkOrderStatus); + + if (JFile::exists($bookinvoicepdf)) + { + Redshop\Mail\Invoice::sendEconomicBookInvoiceMail($row->order_id, $bookinvoicepdf); + } + } + } + + // ORDER MAIL SEND + if ($postdata['task'] != "save_without_sendmail") + { + Redshop\Mail\Order::sendMail($row->order_id); + } + + return $row; + } + + public function sendRegistrationMail($post) + { + Redshop\Mail\User::sendRegistrationMail($post); + } + + public function changeshippingaddress($shippingadd_id, $user_id, $is_company) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'users_info ' + . 'WHERE address_type like "ST" ' + . 'AND user_id = ' . (int) $user_id . ' ' + . 'AND users_info_id = ' . (int) $shippingadd_id; + $this->_db->setQuery($query); + $shipping = $this->_db->loadObject(); + + if (!$shipping) + { + $shipping = $this->setShipping(); + } + + $allowCustomer = ''; + $allowCompany = ''; + + if ($is_company) + { + $allowCustomer = 'style="display:none;"'; + } + else + { + $allowCompany = 'style="display:none;"'; + } + + $lists = array( + // Field_section 7 :Customer Address + 'shipping_customer_field' => RedshopHelperExtrafields::listAllField( + RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS, + $shipping->users_info_id + ), + // Field_section 8 :Company Address + 'shipping_company_field' => RedshopHelperExtrafields::listAllField( + RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS, + $shipping->users_info_id + ) + ); + + $countries = RedshopHelperWorld::getCountryList((array) $shipping, "country_code_ST", "ST", '', 'state_code_ST'); + $shipping->country_code_ST = $shipping->country_code = $countries['country_code_ST']; + $lists['country_code_ST'] = $countries['country_dropdown']; + + $states = RedshopHelperWorld::getStateList((array) $shipping, "state_code_ST", "ST"); + $lists['state_code_ST'] = $states['state_dropdown']; + + $html = ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= '
    ' . JText::_('COM_REDSHOP_FIRSTNAME') . ':
    ' . JText::_('COM_REDSHOP_LASTNAME') . ':
    ' . JText::_('COM_REDSHOP_ADDRESS') . ':
    ' . JText::_('COM_REDSHOP_ZIP') . ':
    ' . JText::_('COM_REDSHOP_CITY') . ':
    ' . JText::_('COM_REDSHOP_COUNTRY') . ':' . $lists['country_code_ST'] . '
    ' . JText::_('COM_REDSHOP_STATE') . ':' . $lists['state_code_ST'] . '
    ' . JText::_('COM_REDSHOP_PHONE') . ':
    ' . $lists['shipping_customer_field'] . '
    '; + $html .= '
    ' . $lists['shipping_company_field'] . '
    '; + + return $html; + } +} diff --git a/component/admin/models/addquotation_detail.php b/component/admin/models/addquotation_detail.php new file mode 100644 index 00000000000..ecb02f4de94 --- /dev/null +++ b/component/admin/models/addquotation_detail.php @@ -0,0 +1,644 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function setBilling() + { + $detail = new stdClass; + $detail->users_info_id = 0; + $detail->address_type = ""; + $detail->company_name = null; + $detail->firstname = null; + $detail->lastname = null; + $detail->country_code = null; + $detail->state_code = null; + $detail->zipcode = null; + $detail->user_email = null; + $detail->address = null; + $detail->city = null; + $detail->phone = null; + + return $detail; + } + + public function storeShipping($data) + { + $data['address_type'] = 'BT'; + + $row = $this->getTable('user_detail'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $data['address_type'] = 'ST'; + + $rowsh = $this->getTable('user_detail'); + + if (!$rowsh->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$rowsh->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return 0; + } + + return $row; + } + + public function sendRegistrationMail($post) + { + Redshop\Mail\User::sendRegistrationMail($post); + } + + public function store($data) + { + $producthelper = productHelper::getInstance(); + $rsCarthelper = rsCarthelper::getInstance(); + + /** @var Tableuser_detail $userRow */ + $userRow = $this->getTable('user_detail'); + + $userRow->load($data['user_info_id']); + $userRow->firstname = $data['firstname']; + $userRow->lastname = $data['lastname']; + $userRow->address = $data['address']; + $userRow->zipcode = $data['zipcode']; + $userRow->country_code = $data['country_code']; + $userRow->phone = $data['phone']; + $userRow->city = $data['city']; + $userRow->state_code = isset($data['state_code']) ? $data['state_code'] : ''; + + if (!$userRow->store()) + { + $this->setError($userRow->getErrorMsg()); + + return false; + } + + RedshopHelperExtrafields::extraFieldSave($data, 16, $data['user_info_id'], $data['user_email']); + + $row = $this->getTable('quotation_detail'); + + if (isset($data['quotation_discount']) && $data['quotation_discount'] > 0) + { + $data['order_total'] = $data['order_total'] - $data['quotation_discount'] - (($data['order_total'] * $data['quotation_special_discount']) / 100); + } + + $data['quotation_number'] = RedshopHelperQuotation::generateQuotationNumber(); + $data['quotation_encrkey'] = RedshopHelperQuotation::randomQuotationEncryptKey(); + $data['quotation_cdate'] = time(); + $data['quotation_mdate'] = time(); + $data['quotation_total'] = $data['order_total']; + $data['quotation_subtotal'] = $data['order_subtotal']; + $data['quotation_tax'] = $data['order_tax']; + $data['quotation_ipaddress'] = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER ['REMOTE_ADDR'] : 'unknown'; + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $row->quotation_status = 2; + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $quotation_item = array(); + + $user_id = $row->user_id; + $item = $data['order_item']; + + for ($i = 0, $in = count($item); $i < $in; $i++) + { + $product_id = $item[$i]->product_id; + $quantity = $item[$i]->quantity; + $product_excl_price = $item[$i]->prdexclprice; + $product_price = $item[$i]->productprice; + + // Attribute price added + $generateAttributeCart = Redshop\Cart\Helper::generateAttribute((array) $item[$i], $user_id); + $retAttArr = $producthelper->makeAttributeCart($generateAttributeCart, $product_id, $user_id, 0, $quantity); + $product_attribute = $retAttArr[0]; + + // Accessory price + $generateAccessoryCart = $rsCarthelper->generateAccessoryArray((array) $item[$i], $user_id); + $retAccArr = $producthelper->makeAccessoryCart($generateAccessoryCart, $product_id, $user_id); + $product_accessory = $retAccArr[0]; + + $wrapper_price = 0; + $wrapper_vat = 0; + $wrapper = $producthelper->getWrapper($product_id, $item[$i]->wrapper_data); + + if (count($wrapper) > 0) + { + if ($wrapper[0]->wrapper_price > 0) + { + $wrapper_vat = $producthelper->getProducttax($product_id, $wrapper[0]->wrapper_price, $user_id); + } + + $wrapper_price = $wrapper[0]->wrapper_price + $wrapper_vat; + } + + /** @var Tablequotation_item_detail $rowitem */ + $rowitem = $this->getTable('quotation_item_detail'); + + $product = Redshop::product((int) $product_id); + + $quotation_item[$i] = new stdClass; + $quotation_item[$i]->quotation_id = $row->quotation_id; + $quotation_item[$i]->product_id = $product_id; + $quotation_item[$i]->is_giftcard = 0; + $quotation_item[$i]->product_name = $product->product_name; + $quotation_item[$i]->actualitem_price = $product_price; + $quotation_item[$i]->product_price = $product_price; + $quotation_item[$i]->product_excl_price = $product_excl_price; + $quotation_item[$i]->product_final_price = $product_price * $quantity; + $quotation_item[$i]->product_attribute = $product_attribute; + $quotation_item[$i]->product_accessory = $product_accessory; + $quotation_item[$i]->product_wrapperid = $item[$i]->wrapper_data; + $quotation_item[$i]->wrapper_price = $wrapper_price; + $quotation_item[$i]->product_quantity = $quantity; + + if (!$rowitem->bind($quotation_item[$i])) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$rowitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $jinput = JFactory::getApplication()->input; + + // Store userfields + $userfields = $jinput->getSring('extrafieldname' . $product_id . 'product1'); + $userfields_id = $jinput->getInt('extrafieldId' . $product_id . 'product1'); + + for ($ui = 0, $countUserField = count($userfields); $ui < $countUserField; $ui++) + { + RedshopHelperQuotation::insertQuotationUserField($userfields_id[$ui], $rowitem->quotation_item_id, 12, $userfields[$ui]); + } + + /** my accessory save in table start */ + if (count($generateAccessoryCart) > 0) + { + $attArr = $generateAccessoryCart; + + for ($a = 0, $an = count($attArr); $a < $an; $a++) + { + $accessory_vat_price = 0; + $accessory_attribute = ""; + $accessory_id = $attArr[$a]['accessory_id']; + $accessory_name = $attArr[$a]['accessory_name']; + $accessory_price = $attArr[$a]['accessory_price']; + $accessory_org_price = $accessory_price; + + if ($accessory_price > 0) + { + $accessory_vat_price = $producthelper->getProductTax($rowitem->product_id, $accessory_price, $user_id); + } + + $attchildArr = $attArr[$a]['accessory_childs']; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $attribute_id = $attchildArr[$j]['attribute_id']; + $accessory_attribute .= urldecode($attchildArr[$j]['attribute_name']) . ":
    "; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $accessory_id; + $rowattitem->section_name = $attchildArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 1; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $propArr = $attchildArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = $producthelper->getProducttax($rowitem->product_id, $propArr[$k]['property_price'], $user_id); + } + + $property_id = $propArr[$k]['property_id']; + $accessory_attribute .= urldecode($propArr[$k]['property_name']) + . " (" . $propArr[$k]['property_oprand'] + . $producthelper->getProductFormattedPrice($propArr[$k]['property_price'] + $section_vat) . ")
    "; + $subpropArr = $propArr[$k]['property_childs']; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = $producthelper->getProducttax($rowitem->product_id, $subpropArr[$l]['subproperty_price'], $user_id); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + $accessory_attribute .= urldecode($subpropArr[$l]['subproperty_name']) + . " (" . $subpropArr[$l]['subproperty_oprand'] + . $producthelper->getProductFormattedPrice($subpropArr[$l]['subproperty_price'] + $section_vat) . ")
    "; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + + $accdata = $this->getTable('accessory_detail'); + + if ($accessory_id > 0) + { + $accdata->load($accessory_id); + } + + $accProductinfo = Redshop::product((int) $accdata->child_product_id); + $rowaccitem = $this->getTable('quotation_accessory_item'); + $rowaccitem->quotation_item_acc_id = 0; + $rowaccitem->quotation_item_id = $rowitem->quotation_item_id; + $rowaccitem->accessory_id = $accessory_id; + $rowaccitem->accessory_item_sku = $accProductinfo->product_number; + $rowaccitem->accessory_item_name = $accessory_name; + $rowaccitem->accessory_price = $accessory_org_price; + $rowaccitem->accessory_vat = $accessory_vat_price; + $rowaccitem->accessory_quantity = $rowitem->product_quantity; + $rowaccitem->accessory_item_price = $accessory_price; + $rowaccitem->accessory_final_price = ($accessory_price * $rowitem->product_quantity); + $rowaccitem->accessory_attribute = $accessory_attribute; + + if ($accessory_id > 0) + { + if (!$rowaccitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + + /** my attribute save in table start */ + if (count($generateAttributeCart) > 0) + { + $attArr = $generateAttributeCart; + + for ($j = 0, $jn = count($attArr); $j < $jn; $j++) + { + $attribute_id = $attArr[$j]['attribute_id']; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $rowitem->product_id; + $rowattitem->section_name = $attArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 0; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $propArr = $attArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = $producthelper->getProducttax($rowitem->product_id, $propArr[$k]['property_price'], $user_id); + } + + $property_id = $propArr[$k]['property_id']; + + /** product property STOCKROOM update start */ + RedshopHelperStockroom::updateStockroomQuantity($property_id, $rowitem->product_quantity, "property"); + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = $producthelper->getProducttax($rowitem->product_id, $subpropArr[$l]['subproperty_price'], $user_id); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + /** product subproperty STOCKROOM update start */ + RedshopHelperStockroom::updateStockroomQuantity($subproperty_id, $rowitem->product_quantity, "subproperty"); + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + } + } + + return $row; + } + + public function sendQuotationMail($quotaion_id) + { + return Redshop\Mail\Quotation::sendMail($quotaion_id); + } + + public function getUserData($user_id = 0, $billing = "", $user_info_id = 0) + { + $db = JFactory::getDbo(); + + $and = ''; + + if ($user_id != 0) + { + $and .= ' AND ui.user_id = ' . (int) $user_id . ' '; + } + + if ($billing != "") + { + $and .= ' AND ui.address_type like ' . $db->quote($billing) . ' '; + } + + if ($user_info_id != 0) + { + $and .= ' AND ui.users_info_id= ' . (int) $user_info_id . ' '; + } + + $query = 'SELECT *,CONCAT(ui.firstname," ",ui.lastname) AS text FROM ' . $this->_table_prefix . 'users_info AS ui ' + . 'WHERE 1=1 ' + . $and; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectList(); + + return $list; + } + + + public function replaceSubPropertyData($product_id = 0, $accessory_id = 0, $attribute_id = 0, $property_id = 0, $uniqueid = "") + { + $producthelper = productHelper::getInstance(); + + $subproperty = array(); + + if ($property_id != 0 && $attribute_id != 0) + { + $attributes = $producthelper->getProductAttribute(0, 0, $attribute_id); + $attributes = $attributes[0]; + $subproperty = RedshopHelperProduct_Attribute::getAttributeSubProperties(0, $property_id); + } + + if ($accessory_id != 0) + { + $prefix = $uniqueid . "acc_"; + } + else + { + $prefix = $uniqueid . "prd_"; + } + + $attributelist = ""; + + if (count($subproperty) > 0) + { + $commonid = $prefix . $product_id . '_' . $accessory_id . '_' . $attribute_id . '_' . $property_id; + $subpropertyid = 'subproperty_id_' . $commonid; + + for ($i = 0, $in = count($subproperty); $i < $in; $i++) + { + $attributes_subproperty_vat = 0; + + if ($subproperty [$i]->subattribute_color_price > 0) + { + $attributes_subproperty_vat = $producthelper->getProducttax($product_id, $subproperty[$i]->subattribute_color_price); + $subproperty [$i]->subattribute_color_price += $attributes_subproperty_vat; + $subproperty [$i]->text = urldecode($subproperty [$i]->subattribute_color_name) + . " (" . $subproperty [$i]->oprand + . $producthelper->getProductFormattedPrice($subproperty [$i]->subattribute_color_price) . ")"; + } + else + { + $subproperty [$i]->text = urldecode($subproperty [$i]->subattribute_color_name); + } + + $attributelist .= ''; + $attributelist .= ''; + $attributelist .= ''; + } + + $tmp_array = array(); + $tmp_array[0] = new stdClass; + $tmp_array[0]->value = 0; + $tmp_array[0]->text = JText::_('COM_REDSHOP_SELECT') . " " . urldecode($subproperty[0]->property_name); + + $new_subproperty = array_merge($tmp_array, $subproperty); + $chklist = ""; + $display_type = 'radio'; + + if (isset($subproperty[0]->setdisplay_type)) + { + $display_type = $subproperty[0]->setdisplay_type; + } + + if ($subproperty[0]->setmulti_selected) + { + $display_type = 'checkbox'; + } + + if ($display_type == 'checkbox' || $display_type == 'radio') + { + for ($chk = 0, $countSubProperty = count($subproperty); $chk < $countSubProperty; $chk++) + { + $chklist .= "
     " . $subproperty[$chk]->text; + } + } + else + { + $chklist = JHTML::_('select.genericlist', $new_subproperty, $subpropertyid . '[]', ' id="' + . $subpropertyid . '" class="inputbox" size="1" onchange="javascript:calculateOfflineTotalPrice(\'' + . $uniqueid . '\', true);" ', 'value', 'text', '' + ); + } + + $lists ['subproperty_id'] = $chklist; + + $attributelist .= "" . urldecode($subproperty[0]->property_name) . " : " . $lists ['subproperty_id']; + } + + return $attributelist; + } +} diff --git a/component/admin/models/alert.php b/component/admin/models/alert.php new file mode 100644 index 00000000000..709841b898a --- /dev/null +++ b/component/admin/models/alert.php @@ -0,0 +1,125 @@ +context)) + { + $input = JFactory::getApplication()->input; + $view = $input->getString('view', ''); + $this->context = strtolower('com_redshop.' . $view . '.' . $this->getName()); + } + + parent::__construct($config); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.5 + */ + protected function getStoreId($id = '') + { + $id .= ':' . $this->getState('read_filter'); + $id .= ':' . $this->getState('name_filter'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'a.sent_date', $direction = 'DESC') + { + $readFilter = $this->getUserStateFromRequest($this->context . '.read_filter', 'read_filter', 'select'); + $nameFilter = $this->getUserStateFromRequest($this->context . '.name_filter', 'name_filter', ''); + $this->setState('read_filter', $readFilter); + $this->setState('name_filter', $nameFilter); + + parent::populateState($ordering, $direction); + } + + public function _buildQuery() + { + $readFilter = $this->getState('read_filter'); + $nameFilter = $this->getState('name_filter'); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('a.*') + ->from($db->qn('#__redshop_alerts', 'a')); + + if ($readFilter != 'select') + { + $query->where($db->qn('a.read') . ' = ' . $db->q((int) $readFilter)); + } + + if (!empty($nameFilter)) + { + $search = $db->q('%' . $db->escape($nameFilter, true) . '%'); + $query->where($db->qn('a.message') . ' LIKE ' . $search); + } + + // Add the list ordering clause. + $query->order($db->escape($this->getState('list.ordering', 'a.sent_date')) . ' ' . $db->escape($this->getState('list.direction', 'DESC'))); + + return $query; + } + + public function countAlert() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from($db->qn('#__redshop_alerts')) + ->where($db->qn('read') . ' = 0'); + + return $db->setQuery($query)->loadResult(); + } + + public function getAlert($limit) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_alerts')) + ->where($db->qn('read') . ' = 0') + ->order($db->qn('sent_date') . ' DESC') + ->setLimit($limit); + + return $db->setQuery($query)->loadObjectList(); + } +} diff --git a/component/admin/models/alert_detail.php b/component/admin/models/alert_detail.php new file mode 100644 index 00000000000..d7498de66c6 --- /dev/null +++ b/component/admin/models/alert_detail.php @@ -0,0 +1,97 @@ +input->get('cid', 0, 'array'); + + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $db = $this->_db; + + $conditions = array( + $db->qn('id') . ' IN (' . $cids . ' )' + ); + + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_alerts')) + ->where($conditions); + + $db->setQuery($query); + + if (!$db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function read($cid = array(), $read = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $db = $this->_db; + + $fields = array( + $db->qn('read') . ' = ' . $db->q((int) $read) + ); + + // Conditions for which records should be updated. + $conditions = array( + $db->qn('id') . ' IN (' . $cids . ')' + ); + + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_alerts')) + ->set($fields) + ->where($conditions); + + $db->setQuery($query); + + if (!$db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/attribute.php b/component/admin/models/attribute.php new file mode 100644 index 00000000000..f5e5aaca538 --- /dev/null +++ b/component/admin/models/attribute.php @@ -0,0 +1,91 @@ +loadForm( + 'com_redshop.attribute', + 'attribute', + array( + 'control' => 'jform', + 'load_data' => $loadData + ) + ); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 2.0.0.2 + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $app = JFactory::getApplication(); + $data = $app->getUserState('com_redshop.edit.attribute.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.attribute', $data); + + return $data; + } +} + + diff --git a/component/admin/models/attribute_property.php b/component/admin/models/attribute_property.php new file mode 100644 index 00000000000..39a4d4b37bf --- /dev/null +++ b/component/admin/models/attribute_property.php @@ -0,0 +1,21 @@ +_context = 'attribute_set_id'; + $this->_table_prefix = '#__redshop_'; + + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + $query = 'SELECT distinct(a.attribute_set_id),a.* FROM ' . $this->_table_prefix . 'attribute_set AS a ' + . 'WHERE 1=1 ' + . $orderby; + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'attribute_set_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } +} diff --git a/component/admin/models/attribute_set_detail.php b/component/admin/models/attribute_set_detail.php new file mode 100644 index 00000000000..c893da13dfb --- /dev/null +++ b/component/admin/models/attribute_set_detail.php @@ -0,0 +1,1292 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if (!$this->_loadData()) + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'attribute_set WHERE attribute_set_id = ' . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->attribute_set_id = 0; + $detail->attribute_set_name = null; + $detail->published = 1; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $property_image = RedshopHelperProduct_Attribute::getAttributeProperties(0, 0, 0, $cids); + + foreach ($property_image as $imagename) + { + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $imagename->property_image; + + $tsrc = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/thumb/' . $imagename->property_image; + + if (JFile::exists($dest)) + { + JFile::delete($dest); + } + + if (JFile::exists($tsrc)) + { + JFile::delete($tsrc); + } + + $attr_delete = 'DELETE FROM ' . $this->_table_prefix . 'product_attribute WHERE attribute_id =' . $imagename->attribute_id; + $this->_db->setQuery($attr_delete); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + } + + $prop_delete = 'DELETE FROM ' . $this->_table_prefix . 'product_attribute_property WHERE attribute_id =' . $imagename->attribute_id; + $this->_db->setQuery($prop_delete); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'attribute_set WHERE attribute_set_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'UPDATE ' . $this->_table_prefix . 'attribute_set' + . ' SET published = ' . intval($publish) + . ' WHERE attribute_set_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function getattributes() + { + $attr = array(); + + if ($this->_id != 0) + { + $query = $this->_db->getQuery(true) + ->select('*') + ->from($this->_db->qn('#__redshop_product_attribute')) + ->where('attribute_set_id = ' . (int) $this->_id) + ->order('ordering'); + $this->_db->setQuery($query); + $attr = $this->_db->loadObjectlist(); + } + + $attribute_data = array(); + + for ($i = 0, $in = count($attr); $i < $in; $i++) + { + $db = $this->_db; + $query = $db->getQuery(true); + $query->select('*') + ->from($db->quoteName('#__redshop_product_attribute_property')) + ->where($db->quoteName('attribute_id') . ' = ' . (int) $attr[$i]->attribute_id) + ->order($db->quoteName('ordering') . ' ASC'); + + $db->setQuery($query); + $prop = $db->loadObjectlist(); + + $attribute_id = $attr[$i]->attribute_id; + $attribute_name = $attr[$i]->attribute_name; + $attribute_description = $attr[$i]->attribute_description; + $attribute_required = $attr[$i]->attribute_required; + $allow_multiple_selection = $attr[$i]->allow_multiple_selection; + $hide_attribute_price = $attr[$i]->hide_attribute_price; + $attribute_published = $attr[$i]->attribute_published; + $display_type = $attr[$i]->display_type; + $ordering = $attr[$i]->ordering; + + for ($j = 0, $jn = count($prop); $j < $jn; $j++) + { + $query = $db->getQuery(true); + $query->select('*') + ->from($db->quoteName('#__redshop_product_subattribute_color')) + ->where($db->quoteName('subattribute_id') . ' = ' . (int) $prop[$j]->property_id) + ->order($db->quoteName('ordering') . ' ASC'); + + $db->setQuery($query); + $subprop = $db->loadObjectlist(); + $prop[$j]->subvalue = $subprop; + } + + $attribute_data[] = array('attribute_id' => $attribute_id, 'attribute_name' => $attribute_name, + 'attribute_description' => $attribute_description, + 'attribute_required' => $attribute_required, 'ordering' => $ordering, + 'property' => $prop, 'allow_multiple_selection' => $allow_multiple_selection, + 'hide_attribute_price' => $hide_attribute_price, 'attribute_published' => $attribute_published, + 'display_type' => $display_type + ); + } + + return $attribute_data; + } + + public function getattributelist($data) + { + $db = $this->_db; + $attribute_data = array(); + $producthelper = productHelper::getInstance(); + $attr = $producthelper->getProductAttribute(0, $data); + + for ($i = 0, $in = count($attr); $i < $in; $i++) + { + $query = $db->getQuery(true); + $query->select('*') + ->from($db->quoteName('#__redshop_product_attribute_property')) + ->where($db->quoteName('attribute_id') . ' = ' . (int) $attr[$i]->attribute_id) + ->order($db->quoteName('property_id') . ' ASC'); + + $db->setQuery($query); + $prop = $db->loadObjectlist(); + $attribute_id = $attr[$i]->attribute_id; + $attribute_name = $attr[$i]->attribute_name; + $attribute_data[] = array('attribute_id' => $attribute_id, 'attribute_name' => $attribute_name, 'property' => $prop); + } + + return $attribute_data; + } + + public function getpropertylist($data) + { + $db = $this->_db; + + if (count($data)) + { + $cids = implode(',', $data); + $query = $db->getQuery(true); + $query->select('*') + ->from($db->quoteName('#__redshop_product_attribute_property')) + ->where($db->quoteName('property_id') . ' IN ( ' . $cids . ' )'); + + $db->setQuery($query); + $prop = $db->loadObjectlist(); + } + + return $prop; + } + + public function deleteattr($cid = array()) + { + + if (count($cid)) + { + $cids = implode(',', $cid); + + $prop = $this->property_image_list($cids); + + foreach ($prop as $imagename) + { + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $imagename->property_image; + + $tsrc = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/thumb/' . $imagename->property_image; + + if (file_exists($dest)) + { + JFile::delete($dest); + } + + if (file_exists($tsrc)) + { + JFile::delete($tsrc); + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_attribute WHERE attribute_id IN ( ' . $cids . ' )'; + + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_attribute_property WHERE attribute_id IN ( ' . $cids . ' )'; + + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + + public function deleteprop($cid = array(), $image_name) + { + + if (count($cid)) + { + $cids = implode(',', $cid); + + foreach ($image_name as $imagename) + { + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $imagename; + + $tsrc = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/thumb/' . $imagename; + + if (file_exists($dest)) + { + JFile::delete($dest); + } + + if (file_exists($tsrc)) + { + JFile::delete($tsrc); + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_attribute_property WHERE property_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + else + { + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_subattribute_color WHERE subattribute_id IN (' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + + public function deleteattr_current($cid = array()) + { + + if (count($cid)) + { + $cids = implode(',', $cid); + + $prop = $this->property_image_list($cids); + + foreach ($prop as $property_image) + { + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $property_image->property_image; + + $tsrc = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/thumb/' . $property_image->property_image; + + if (file_exists($dest)) + { + JFile::delete($dest); + } + + if (file_exists($tsrc)) + { + JFile::delete($tsrc); + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_attribute_property WHERE attribute_id IN ( ' . $cids . ' )'; + + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + + public function property_image_list($cid) + { + if (count($cid)) + { + $prop = RedshopHelperProduct_Attribute::getAttributeProperties(0, $cid); + } + + return $prop; + } + + public function store_attr($data) + { + $row = $this->getTable('product_attribute'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function store_pro($data) + { + /** @var Tableattribute_property $row */ + $row = $this->getTable('attribute_property'); + + if (!$row->bind($data) || !$row->store()) + { + /** @scrutinizer ignore-deprecated */$this->setError(/** @scrutinizer ignore-deprecated */$this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + /** + * Store Subattribute Color List + */ + public function store_sub($data) + { + $row = $this->getTable('subattribute_property'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function property_more_img($post, $main_img, $sub_img) + { + if ($main_img['name'] != '') + { + $filetype = strtolower(JFile::getExt($main_img['name'])); + + if ($filetype != 'png' && $filetype != 'gif' && $filetype != 'jpeg' && $filetype != 'jpg') + { + return false; + } + else + { + $main_name = RedshopHelperMedia::cleanFileName($main_img['name']); + $main_src = $main_img['tmp_name']; + + // Specific path of the file + $main_dest = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $main_name; + + JFile::upload($main_src, $main_dest); + + $query = "UPDATE " . $this->_table_prefix . "product_attribute_property SET property_main_image = '" + . $main_name . "' WHERE property_id ='" . $post['section_id'] . "' "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + + $num = count($sub_img['name']); + + for ($i = 0; $i < $num; $i++) + { + if ($sub_img['name'][$i] != "") + { + $filetype = strtolower(JFile::getExt($sub_img['name'][$i])); + + if ($filetype != 'png' && $filetype != 'gif' && $filetype != 'jpeg' && $filetype != 'jpg') + { + return false; + } + else + { + $sub_name = RedshopHelperMedia::cleanFileName($sub_img['name'][$i]); + + $sub_src = $sub_img['tmp_name'][$i]; + + $sub_type = $sub_img['type'][$i]; + + // Specific path of the file + $sub__dest = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $sub_name; + + JFile::upload($sub_src, $sub__dest); + + $query = "INSERT INTO " . $this->_table_prefix . "media + (`media_id`,`media_name`,`media_section`,`section_id`,`media_type`,`media_mimetype`,`published`) + VALUES ('','" . $sub_name . "','property','" . $post['section_id'] . "','images','" . $sub_type . "','1') "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + + public function deletesubimage($mediaid) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'media WHERE media_id = ' . $mediaid; + $this->_db->setQuery($query); + $imgdata = $this->_db->loadObject(); + + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $imgdata->media_name; + + $tsrc = REDSHOP_FRONT_IMAGES_RELPATH . 'property/thumb/' . $imgdata->media_name; + + if (file_exists($dest)) + { + JFile::delete($dest); + } + + if (file_exists($tsrc)) + { + JFile::delete($tsrc); + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'media WHERE media_id = ' . $mediaid; + + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + public function subattribute_color($post, $sub_img) + { + $num = count($sub_img['name']); + + for ($i = 0; $i < $num; $i++) + { + if ($sub_img['name'][$i] != "") + { + $filetype = strtolower(JFile::getExt($sub_img['name'][$i])); + + if ($filetype != 'png' && $filetype != 'gif' && $filetype != 'jpeg' && $filetype != 'jpg') + { + return false; + } + else + { + $sub_name = RedshopHelperMedia::cleanFileName($sub_img['name'][$i]); + + $sub_src = $sub_img['tmp_name'][$i]; + + // Specific path of the file + $sub__dest = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $sub_name; + + JFile::upload($sub_src, $sub__dest); + + if ($post['property_sub_img_tmp'][$i] != "") + { + $sub = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $post['property_sub_img_tmp'][$i]; + $sub_thumb = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/thumb/' . $post['property_sub_img_tmp'][$i]; + + if (file_exists($sub)) + { + JFile::delete($sub); + } + + if (file_exists($sub_thumb)) + { + JFile::delete($sub_thumb); + } + } + + if ($post['subattribute_color_id'][$i] == "") + { + $query = "INSERT INTO " . $this->_table_prefix . "product_subattribute_color + (`subattribute_color_id`,`subattribute_color_name`,`subattribute_color_image`,`subattribute_id`) + VALUES ('','" . $post['subattribute_name'][$i] . "','" . $sub_name . "','" . $post['section_id'] . "') "; + } + else + { + $query = "UPDATE " . $this->_table_prefix . "product_subattribute_color + SET `subattribute_color_name` = '" . $post['subattribute_name'][$i] . "' ,`subattribute_color_image` = '" . + $sub_name . "',`subattribute_id` = '" . $post['section_id'] . "' WHERE subattribute_color_id = '" . $post['subattribute_color_id'][$i] . "'"; + } + + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + else + { + if ($post['property_sub_img_tmp'][$i] != "" && $sub_img['name'][$i] == "") + { + $query = "UPDATE " . $this->_table_prefix . "product_subattribute_color + SET `subattribute_color_name` = '" . $post['subattribute_name'][$i] . "' ,`subattribute_color_image` = '" . + $post['property_sub_img_tmp'][$i] . "',`subattribute_id` = '" . $post['section_id'] . "' + WHERE subattribute_color_id = '" . $post['subattribute_color_id'][$i] . "'"; + + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + + public function subattr_diff($subattr_id, $section_id) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_subattribute_color WHERE subattribute_id = ' + . $section_id . ' and subattribute_color_id NOT IN (\'' . $subattr_id . '\') ORDER BY subattribute_color_id ASC'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function delsubattr_diff($subattr_diff) + { + foreach ($subattr_diff as $diff) + { + $sub_dest = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $diff->subattribute_color_image; + + if (file_exists($sub_dest)) + { + JFile::delete($sub_dest); + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_subattribute_color WHERE subattribute_color_id = "' + . $diff->subattribute_color_id . '"'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function attribute_empty() + { + $database = JFactory::getDbo(); + $producthelper = productHelper::getInstance(); + + if ($this->_id) + { + $attributes = $producthelper->getProductAttribute(0, $this->_id); + + for ($i = 0, $in = count($attributes); $i < $in; $i++) + { + $query = "DELETE FROM `" . $this->_table_prefix . "product_attribute` WHERE `attribute_id` = " . $attributes[$i]->attribute_id; + $database->setQuery($query); + + if ($database->execute()) + { + $property = RedshopHelperProduct_Attribute::getAttributeProperties(0, $attributes[$i]->attribute_id); + + for ($j = 0, $jn = count($property); $j < $jn; $j++) + { + $query = "DELETE FROM `" . $this->_table_prefix . "product_attribute_property` WHERE `property_id` = " + . $property[$j]->property_id; + $database->setQuery($query); + + if ($database->execute()) + { + $query = "DELETE FROM `" . $this->_table_prefix . "product_subattribute_color` WHERE `subattribute_id` = " + . $property[$j]->property_id; + $database->setQuery($query); + $database->execute(); + } + } + } + } + } + + return true; + } + + public function removepropertyImage($pid) + { + $image = RedshopHelperProduct_Attribute::getAttributeProperties($pid); + $image = $image[0]; + $imagename = $image->property_image; + + $imagethumbsrcphy = REDSHOP_FRONT_IMAGES_RELPATH . "product_attributes/thumb/" . $imagename; + + if (JFile::exists($imagethumbsrcphy)) + { + JFile::delete($imagethumbsrcphy); + } + + $imagesrc = REDSHOP_FRONT_IMAGES_ABSPATH . "product_attributes/" . $imagename; + $imagesrcphy = REDSHOP_FRONT_IMAGES_RELPATH . "product_attributes/" . $imagename; + + if (JFile::exists($imagesrcphy)) + { + JFile::delete($imagesrcphy); + } + + $query = "UPDATE `" . $this->_table_prefix . "product_attribute_property` SET `property_image` = '' WHERE `property_id` = " . $pid; + $this->_db->setQuery($query); + + return $this->_db->execute(); + } + + public function removesubpropertyImage($pid) + { + $image = RedshopHelperProduct_Attribute::getAttributeSubProperties($pid); + $image = $image[0]; + $imagename = $image->subattribute_color_image; + $imagethumbsrcphy = REDSHOP_FRONT_IMAGES_RELPATH . "subcolor/thumb/" . $imagename; + + if (JFile::exists($imagethumbsrcphy)) + { + JFile::delete($imagethumbsrcphy); + } + + $imagesrcphy = REDSHOP_FRONT_IMAGES_RELPATH . "subcolor/" . $imagename; + + if (JFile::exists($imagesrcphy)) + { + JFile::delete($imagesrcphy); + } + + $query = "UPDATE `" . $this->_table_prefix . "product_subattribute_color` SET `subattribute_color_image` = '' + WHERE `subattribute_color_id` = " . $pid; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + return false; + } + + return true; + } + + /** + * Store stockroom product xref + * + * @param $post + * + * @return boolean + */ + public function SaveAttributeStockroom($post) + { + $database = JFactory::getDbo(); + $query = "DELETE FROM " . $this->_table_prefix . "product_attribute_stockroom_xref" + . "\n WHERE section_id = " . $post['section_id'] . " AND section = '" . $post['section'] . "'"; + + $database->setQuery($query); + + $database->execute(); + + for ($i = 0, $countQuantity = count($post['quantity']); $i < $countQuantity; $i++) + { + if ($post['quantity'][$i] || (!Redshop::getConfig()->get('USE_BLANK_AS_INFINITE'))) + { + $q = "INSERT IGNORE INTO " . $this->_table_prefix . "product_attribute_stockroom_xref VALUES (" + . $post['section_id'] . ",'" . $post['section'] . "'," . $post['stockroom_id'][$i] . ",'" + . $post['quantity'][$i] . "') "; + + $database->setQuery($q); + + if (!$database->execute()) + { + return false; + } + } + } + + return true; + } + + public function save_product_attribute_price($product_attribute_price, $section) + { + // Create array for attribute price for property and subproperty section + $attribute['section_id'] = $product_attribute_price->section_id; + $attribute['section'] = $section; + $attribute['product_price'] = $product_attribute_price->product_price; + $attribute['product_currency'] = $product_attribute_price->product_currency; + $attribute['cdate'] = $product_attribute_price->cdate; + $attribute['shopper_group_id'] = $product_attribute_price->shopper_group_id; + $attribute['price_quantity_start'] = $product_attribute_price->price_quantity_start; + $attribute['price_quantity_end'] = $product_attribute_price->price_quantity_end; + + $row = $this->getTable('attributeprices_detail'); + + // Bind and save data into 'attributeprices_detail' + if (!$row->bind($attribute)) + { + /** @scrutinizer ignore-deprecated */$this->setError(/** @scrutinizer ignore-deprecated */$this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */$this->setError(/** @scrutinizer ignore-deprecated */$this->_db->getErrorMsg()); + + return false; + } + } + + public function save_product_attribute_stockquantity($product_attribute_stocks, $section) + { + $db = JFactory::getDbo(); + + $sql = "INSERT INTO " . $this->_table_prefix . "product_attribute_stockroom_xref (`section_id`,`section`,`stockroom_id`,`quantity`) + VALUES ('" . $product_attribute_stocks->section_id . "','" . $section . "','" . $product_attribute_stocks->stockroom_id . "','" + . $product_attribute_stocks->quantity . "' )"; + $db->setQuery($sql); + $db->execute(); + } + + public function copy($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'SELECT * FROM ' . $this->_table_prefix . 'attribute_set WHERE attribute_set_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + $copydata = $this->_db->loadObjectList(); + + for ($i = 0, $in = count($copydata); $i < $in; $i++) + { + $post = array(); + + // Insert into attribute set table + $post['attribute_set_id'] = 0; + $post['attribute_set_name'] = "copy" . $copydata[$i]->attribute_set_name; + $post['published'] = $copydata[$i]->published; + $row = $this->store($post); + + // Fetch attributes from the attribute set ID + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_attribute WHERE `attribute_set_id` = ' + . $copydata[$i]->attribute_set_id . ' '; + $this->_db->setQuery($query); + $product_attributes = $this->_db->loadObjectList(); + + $attribute_set_id = $row->attribute_set_id; + + if (count($product_attributes) > 0) + { + foreach ($product_attributes as $product_attribute) + { + // Create $attribute array of attributes + $attribute['attribute_name'] = $product_attribute->attribute_name; + $attribute['attribute_required'] = $product_attribute->attribute_required; + $attribute['allow_multiple_selection'] = $product_attribute->allow_multiple_selection; + $attribute['hide_attribute_price'] = $product_attribute->hide_attribute_price; + $attribute['product_id'] = $product_attribute->product_id; + $attribute['ordering'] = $product_attribute->ordering; + $attribute['attribute_set_id'] = $attribute_set_id; + + $row = $this->getTable('product_attribute'); + + // Bind and save data into 'product_attribute' + if (!$row->bind($attribute)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + // Fetch attributes from the attribute set ID + + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_attribute_property WHERE `attribute_id` = ' + . $product_attribute->attribute_id . ' '; + $this->_db->setQuery($query); + $product_attributes_properties = $this->_db->loadObjectList(); + + $query = 'SELECT * FROM `' . $this->_table_prefix . 'product_attribute_property` WHERE `attribute_id` = "' + . $product_attribute->attribute_id . '" '; + $this->_db->setQuery($query); + $att_property = $this->_db->loadObjectList(); + + $attribute_id = $product_attribute->attribute_id; + + if (count($product_attributes_properties)) + { + foreach ($product_attributes_properties as $product_attributes_property) + { + if (isset($row->attribute_id)) + { + $row->attribute_id = $row->attribute_id; + } + else + { + $row->attribute_id = $loopattribute_id; + } + + if ($product_attributes_property->property_image) + { + $image_split = $product_attributes_property->property_image; + + // Make the filename unique. + $filename = RedshopHelperMedia::cleanFileName($image_split); + $product_attributes_property->property_image = $filename; + $src = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $image_split; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $filename; + copy($src, $dest); + } + + if ($product_attributes_property->property_main_image) + { + $prop_main_img = $product_attributes_property->property_main_image; + $image_split = $prop_main_img; + $image_split = explode('_', $image_split); + $image_split = $image_split[1]; + + // Make the filename unique. + $filename = RedshopHelperMedia::cleanFileName($image_split); + $product_attributes_property->property_main_image = $filename; + $src = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $prop_main_img; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $filename; + copy($src, $dest); + } + + // Create $attribute_properties array of attributes properties + + $attribute_properties['attribute_id'] = $row->attribute_id; + $loopattribute_id = $row->attribute_id; + $attribute_properties['property_name'] = $product_attributes_property->property_name; + $attribute_properties['property_price'] = $product_attributes_property->property_price; + $attribute_properties['oprand'] = $product_attributes_property->oprand; + $attribute_properties['property_image'] = $product_attributes_property->property_image; + $attribute_properties['property_main_image'] = $product_attributes_property->property_main_image; + $attribute_properties['ordering'] = $product_attributes_property->ordering; + $attribute_properties['setdefault_selected'] = $product_attributes_property->setdefault_selected; + $attribute_properties['property_number'] = $product_attributes_property->property_number; + $attribute_properties['extra_field'] = $product_attributes_property->extra_field; + + $row = $this->getTable('attribute_property'); + + // Bind and save data into 'product_attribute_property' + if (!$row->bind($attribute_properties)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $listImages = $this->GetimageInfo($product_attributes_property->property_id, 'property'); + + for ($li = 0, $countImage = count($listImages); $li < $countImage; $li++) + { + $mImages = array(); + $mImages['media_name'] = $listImages[$li]->media_name; + $mImages['media_alternate_text'] = $listImages[$li]->media_alternate_text; + $mImages['media_section'] = 'property'; + $mImages['section_id'] = $row->property_id; + $mImages['media_type'] = 'images'; + $mImages['media_mimetype'] = $listImages[$li]->media_mimetype; + $mImages['published'] = $listImages[$li]->published; + $this->copyadditionalImage($mImages); + } + + // Attribute piggy bank price for property + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_attribute_price WHERE `section_id` = ' + . $product_attributes_property->property_id . ' AND `section`="property" '; + $this->_db->setQuery($query); + $product_attribute_prices = $this->_db->loadObjectList(); + + if (count($product_attribute_prices)) + { + foreach ($product_attribute_prices as $product_attribute_price) + { + $product_attribute_price->section_id = $row->property_id; + $this->save_product_attribute_price($product_attribute_price, 'property'); + } + } + + // Attribute stock quantity for property + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_attribute_stockroom_xref WHERE `section_id` = ' + . $product_attributes_property->property_id . ' AND `section`="property" '; + $this->_db->setQuery($query); + $product_attribute_stockquantities = $this->_db->loadObjectList(); + + if (count($product_attribute_stockquantities)) + { + foreach ($product_attribute_stockquantities as $product_attribute_stockquantity) + { + $product_attribute_stockquantity->section_id = $row->property_id; + $this->save_product_attribute_stockquantity($product_attribute_stockquantity, 'property'); + } + } + + // Fetch attributes from the attribute set ID + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_subattribute_color WHERE `subattribute_id` = ' + . $product_attributes_property->property_id . ' '; + $this->_db->setQuery($query); + $product_sub_attributes_properties = $this->_db->loadObjectList(); + + $subattribute_id = $product_attributes_property->property_id; + + if (count($product_sub_attributes_properties)) + { + foreach ($product_sub_attributes_properties as $product_sub_attributes_property) + { + if (isset($row->attribute_id)) + { + $row->property_id = $row->property_id; + } + else + { + $row->property_id = $loopproperty_id; + } + + if ($product_sub_attributes_property->subattribute_color_image) + { + $image_split = $product_sub_attributes_property->subattribute_color_image; + + // Make the filename unique. + $filename = RedshopHelperMedia::cleanFileName($image_split); + $product_sub_attributes_property->subattribute_color_image = $filename; + $src = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $image_split; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $filename; + copy($src, $dest); + } + + if ($product_sub_attributes_property->subattribute_color_main_image) + { + $sub_main_img = $product_sub_attributes_property->subattribute_color_main_image; + $image_split = $product_sub_attributes_property->subattribute_color_main_image; + $image_split = explode('_', $image_split); + $image_split = $image_split[1]; + + // Make the filename unique. + $filename = RedshopHelperMedia::cleanFileName($image_split); + + $product_sub_attributes_property->subattribute_color_main_image = $filename; + $src = REDSHOP_FRONT_IMAGES_RELPATH . 'subproperty/' . $sub_main_img; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'subproperty/' . $filename; + copy($src, $dest); + } + + // Create $sub_attribute_properties array of subattributes properties + $sub_attribute_properties['subattribute_id'] = $row->property_id; + $loopproperty_id = $row->property_id; + $sub_attribute_properties['subattribute_color_name'] = $product_sub_attributes_property->subattribute_color_name; + $sub_attribute_properties['subattribute_color_price'] = $product_sub_attributes_property->subattribute_color_price; + $sub_attribute_properties['oprand'] = $product_sub_attributes_property->oprand; + $sub_attribute_properties['subattribute_color_image'] = $product_sub_attributes_property->subattribute_color_image; + $sub_attribute_properties['ordering'] = $product_sub_attributes_property->ordering; + $sub_attribute_properties['setdefault_selected'] = $product_sub_attributes_property->setdefault_selected; + $sub_attribute_properties['subattribute_color_number'] = $product_sub_attributes_property->subattribute_color_number; + $sub_attribute_properties['subattribute_color_title'] = $product_sub_attributes_property->subattribute_color_title; + $sub_attribute_properties['extra_field'] = $product_sub_attributes_property->extra_field; + $sub_attribute_properties['subattribute_color_main_image'] = $product_sub_attributes_property->subattribute_color_main_image; + $row = $this->getTable('subattribute_property'); + + // Bind and save data into 'subattribute_property' + if (!$row->bind($sub_attribute_properties)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $listsubpropImages = $this->GetimageInfo($product_sub_attributes_property->subattribute_color_id, 'subproperty'); + $countSubpropertyImage = count($listsubpropImages); + + for ($lsi = 0; $lsi < $countSubpropertyImage; $lsi++) + { + $smImages = array(); + $smImages['media_name'] = $listsubpropImages[$lsi]->media_name; + $smImages['media_alternate_text'] = $listsubpropImages[$lsi]->media_alternate_text; + $smImages['media_section'] = 'subproperty'; + $smImages['section_id'] = $row->subattribute_color_id; + $smImages['media_type'] = 'images'; + $smImages['media_mimetype'] = $listsubpropImages[$lsi]->media_mimetype; + $smImages['published'] = $listsubpropImages[$lsi]->published; + + $this->copyadditionalImage($smImages); + } + + // Attribute piggy bank price for Subproperty + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_attribute_price WHERE `section_id` = ' . $product_sub_attributes_property->subattribute_color_id . ' AND `section`="subproperty" '; + $this->_db->setQuery($query); + $product_subattribute_prices = $this->_db->loadObjectList(); + + if (count($product_subattribute_prices)) + { + foreach ($product_subattribute_prices as $product_subattribute_price) + { + $product_subattribute_price->section_id = $row->subattribute_color_id; + $this->save_product_attribute_price($product_subattribute_price, 'subproperty'); + } + } + + // Attribute stock quantity for property + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_attribute_stockroom_xref WHERE `section_id` = ' . $product_sub_attributes_property->subattribute_color_id . ' AND `section`="subproperty" '; + $this->_db->setQuery($query); + $product_attribute_stockquantities = $this->_db->loadObjectList(); + + if (count($product_attribute_stockquantities)) + { + foreach ($product_attribute_stockquantities as $product_attribute_stockquantity) + { + $product_attribute_stockquantity->section_id = $row->subattribute_color_id; + $this->save_product_attribute_stockquantity($product_attribute_stockquantity, 'subproperty'); + } + } + } + } + } + } + } + } + } + } + + return true; + } + + public function copy_image($imageArray, $section, $section_id) + { + $src = $imageArray['tmp_name']; + $imgname = RedshopHelperMedia::cleanFileName($imageArray['name']); + $property_image = $section_id . '_' . $imgname; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . $section . '/' . $property_image; + copy($src, $dest); + + return $property_image; + + } + + public function copy_image_from_path($imagePath, $section, $section_id) + { + $src = JPATH_ROOT . '/' . $imagePath; + $imgname = RedshopHelperMedia::cleanFileName($imagePath); + $property_image = $section_id . '_' . JFile::getName($imgname); + $dest = REDSHOP_FRONT_IMAGES_RELPATH . $section . '/' . $property_image; + copy($src, $dest); + + return $property_image; + } + + public function copyadditionalImage($data) + { + $rowmedia = $this->getTable('media_detail'); + + $data['media_id '] = 0; + + if (!$rowmedia->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $section = $data['media_section']; + $path = $section . '/' . $data['media_name']; + $property_image = $this->copy_image_additionalimage_from_path($path, $data['media_section']); + $data['media_name'] = $property_image; + + if (!$rowmedia->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + public function copy_image_additionalimage_from_path($imagePath, $section) + { + $src = REDSHOP_FRONT_IMAGES_RELPATH . $imagePath; + + $imgname = basename($imagePath); + + $property_image = RedshopHelperMedia::cleanFileName($imgname); + + $dest = REDSHOP_FRONT_IMAGES_RELPATH . $section . '/' . $property_image; + + copy($src, $dest); + + return $property_image; + } + + public function GetimageInfo($id, $type) + { + $image_media = 'SELECT * FROM ' . $this->_table_prefix . 'media WHERE section_id = "' . $id . '" AND media_section = "' . $type . '" '; + $this->_db->setQuery($image_media); + + return $this->_db->loadObjectlist(); + } +} diff --git a/component/admin/models/attributeprices.php b/component/admin/models/attributeprices.php new file mode 100644 index 00000000000..6f40b49cbd4 --- /dev/null +++ b/component/admin/models/attributeprices.php @@ -0,0 +1,109 @@ +_context = 'price_id'; + + $this->_table_prefix = '#__redshop_'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + + $section_id = $app->input->get('section_id'); + $this->_section = $app->input->get('section'); + $this->setSectionId((int) $section_id); + } + + public function setSectionId($id) + { + // Set employees_detail id and wipe data + $this->_sectionid = $id; + $this->_data = null; + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + if ($this->_section == "property") + { + $field = "ap.property_name "; + $q = 'LEFT JOIN ' . $this->_table_prefix . 'product_attribute_property AS ap ON p.section_id = ap.property_id '; + } + else + { + $field = "ap.subattribute_color_name AS property_name "; + $q = 'LEFT JOIN ' . $this->_table_prefix . 'product_subattribute_color AS ap ON p.section_id = ap.subattribute_color_id '; + } + + $query = 'SELECT p.*, g.shopper_group_name, ' . $field . ' FROM ' . $this->_table_prefix . 'product_attribute_price AS p ' + . 'LEFT JOIN ' . $this->_table_prefix . 'shopper_group AS g ON p.shopper_group_id = g.shopper_group_id ' + . $q + . 'WHERE p.section_id="' . $this->_sectionid . '" ' + . 'AND p.section = "' . $this->_section . '" '; + + return $query; + } +} diff --git a/component/admin/models/attributeprices_detail.php b/component/admin/models/attributeprices_detail.php new file mode 100644 index 00000000000..27a045ddf73 --- /dev/null +++ b/component/admin/models/attributeprices_detail.php @@ -0,0 +1,180 @@ +_table_prefix = '#__redshop_'; + $jinput = JFactory::getApplication()->input; + + $array = $jinput->get('cid', 0, 'array'); + $this->_sectionid = $jinput->getInt('section_id', 0); + $this->_section = $jinput->get('section'); + + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + if ($this->_section == "property") + { + $field = "ap.property_name "; + $q = 'LEFT JOIN ' . $this->_table_prefix . 'product_attribute_property AS ap ON p.section_id = ap.property_id '; + } + else + { + $field = "ap.subattribute_color_name AS property_name "; + $q = 'LEFT JOIN ' . $this->_table_prefix . 'product_subattribute_color AS ap ON p.section_id = ap.subattribute_color_id '; + } + + $query = 'SELECT p.*, g.shopper_group_name, ' . $field . ' ' + . 'FROM ' . $this->_table_prefix . 'product_attribute_price as p ' + . 'LEFT JOIN ' . $this->_table_prefix . 'shopper_group as g ON p.shopper_group_id = g.shopper_group_id ' + . $q + . 'WHERE p.price_id = ' . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->price_id = 0; + $detail->section_id = $this->_sectionid; + $detail->product_price = 0.00; + $detail->product_currency = null; + $detail->shopper_group_id = 0; + $detail->price_quantity_start = 0; + $detail->price_quantity_end = 0; + $detail->discount_price = 0; + $detail->discount_start_date = 0; + $detail->discount_end_date = 0; + + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function getPropertyName() + { + $propertyid = $this->_sectionid; + + if ($this->_section == "property") + { + $q = 'SELECT * ' + . 'FROM ' . $this->_table_prefix . 'product_attribute_property AS ap ' + . 'WHERE property_id = ' . $propertyid; + } + else + { + $q = 'SELECT ap.subattribute_color_name AS property_name ' + . 'FROM ' . $this->_table_prefix . 'product_subattribute_color AS ap ' + . 'WHERE subattribute_color_id = ' . $propertyid; + } + + $this->_db->setQuery($q); + $rs = $this->_db->loadObject(); + + return $rs; + } + + public function store($data) + { + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->check()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_attribute_price ' + . 'WHERE price_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/attributes.php b/component/admin/models/attributes.php new file mode 100644 index 00000000000..00ee00f29b7 --- /dev/null +++ b/component/admin/models/attributes.php @@ -0,0 +1,150 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $product = $this->getUserStateFromRequest($this->context . '.filter.product', 'filter_product_id'); + $this->setState('filter.filter_product_id', $product); + + // List state information. + parent::populateState('attribute_id', 'ASC'); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + $id .= ':' . $this->getState('filter.product'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('a.*, p.product_name') + ->from($db->qn('#__redshop_product_attribute', 'a')) + ->leftJoin($db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('a.product_id') . ' = ' . $db->qn('p.product_id')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + // Filter by product ID. + $product = $this->getState('filter.filter_product_id'); + + // Filter by State. + $published = $this->getState('filter.published'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('a.attribute_id') . ' = ' . $db->q((int) substr($search, 3))); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('a.attribute_name') . ' LIKE ' . $search); + } + } + + if (!empty($product)) + { + $query->where($db->qn('a.product_id') . ' = ' . $db->q((int) $product)); + } + + if (is_numeric($published)) + { + $query->where($db->qn('a.attribute_published') . ' = ' . (int) $published); + } + elseif ($published === '') + { + $query->where($db->qn('a.attribute_published') . ' IN (0, 1)'); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'attribute_id'); + $orderDirn = $this->state->get('list.direction', 'ASC'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/barcode.php b/component/admin/models/barcode.php new file mode 100644 index 00000000000..089386008de --- /dev/null +++ b/component/admin/models/barcode.php @@ -0,0 +1,103 @@ +_table_prefix = '#__redshop_'; + } + + public function save($data) + { + $row = $this->getTable('barcode'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + public function checkorder($barcode) + { + $query = "SELECT order_id FROM " . $this->_table_prefix . "orders where barcode='" . $barcode . "'"; + $this->_db->setQuery($query); + $order = $this->_db->loadObject(); + + if (!$order) + { + return false; + } + + return $order; + } + + public function getLog($order_id) + { + $query = "SELECT count(*) as log FROM " . $this->_table_prefix . "orderbarcode_log where order_id=" . $order_id; + $this->_db->setQuery($query); + + return $this->_db->loadObject(); + } + + public function getLogdetail($order_id) + { + $logquery = "SELECT * FROM " . $this->_table_prefix . "orderbarcode_log where order_id=" . $order_id; + $this->_db->setQuery($logquery); + + return $this->_db->loadObjectlist(); + } + + public function getUser($user_id) + { + + $this->_table_prefix = '#__'; + $userquery = "SELECT name FROM " . $this->_table_prefix . "users where id=" . $user_id; + $this->_db->setQuery($userquery); + + return $this->_db->loadObject(); + } + + public function updateorderstatus($barcode, $order_id) + { + $update_query = "UPDATE " . $this->_table_prefix . "orders SET order_status = 'S' where barcode='" + . $barcode . "' and order_id ='" . $order_id . "'"; + $this->_db->setQuery($update_query); + $this->_db->execute(); + } +} diff --git a/component/admin/models/catalog.php b/component/admin/models/catalog.php new file mode 100644 index 00000000000..c2784ca9c12 --- /dev/null +++ b/component/admin/models/catalog.php @@ -0,0 +1,21 @@ +_context = 'catalog_user_id'; + $this->_table_prefix = '#__redshop_'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + $filter = $app->getUserStateFromRequest($this->_context . 'filter', 'filter', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + $this->setState('filter', $filter); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'catalog_request ' . $this->_buildContentOrderBy(); + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'catalog_user_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'DELETE FROM ' . $this->_table_prefix . 'catalog_request WHERE catalog_user_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'catalog_request' + . ' SET block = ' . intval($publish) + . ' WHERE catalog_user_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/catalogs.php b/component/admin/models/catalogs.php new file mode 100644 index 00000000000..fdde9873464 --- /dev/null +++ b/component/admin/models/catalogs.php @@ -0,0 +1,111 @@ +getUserStateFromRequest($this->context . 'filter.search', 'filter.search'); + $this->setState('filter.search', $search); + + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state + * + * @param string $id A prefix for the store id. + * + * @return string A store id + * + * @since 2.1.2 + */ + protected function getStoreId($id = '') + { + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query string to load the list data. + * + * @return string An SQL query + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select('*') + ->from($db->qn('#__redshop_catalog', 'c')); + + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('c.catalog_id') . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('c.catalog_name') . ' LIKE ' . $search); + } + } + + $orderCol = $this->state->get('list.ordering', 'c.catalog_id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } + + /** + * Method to get media of catalog + * + * @param integer $pid section id + * + * @return mixed + * @throws Exception + * + * @since 2.1.2 + */ + public function mediaDetail($pid) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select('*') + ->from($db->qn('#__redshop_media', 'c')) + ->where($db->qn('section_id') . '=' . $pid) + ->where($db->qn('media_section') . '=' . $db->q('catalog')); + + return $db->setQuery($query)->loadObjectList(); + } +} diff --git a/component/admin/models/categories.php b/component/admin/models/categories.php new file mode 100644 index 00000000000..0473a97685c --- /dev/null +++ b/component/admin/models/categories.php @@ -0,0 +1,190 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $categoryId = $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id', 0); + $this->setState('filter.filter_category_id', $categoryId); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.category_id'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + * + * @since 2.0.6 + */ + protected function getListQuery() + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('c.*') + ->select($db->qn('c.name', 'title')) + ->from($db->qn('#__redshop_category', 'c')); + + // Remove "ROOT" item + $query->where($db->qn('c.level') . ' > ' . $db->quote('0')); + + // Filter: Parent ID + $parentId = $this->getState('filter.category_id'); + + if (!empty($parentId)) + { + $info = RedshopHelperCategory::getCategoryById($parentId); + + // Filter: Get deeper child or parent + $lft = $info->lft; + $rgt = $info->rgt; + + if ($lft && $rgt) + { + $query->where($db->qn('c.lft') . ' >= ' . (int) $lft) + ->where($db->qn('c.rgt') . ' <= ' . (int) $rgt); + } + } + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('c.id') . ' = ' . $db->q((int) substr($search, 3))); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('c.name') . ' LIKE ' . $search); + } + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'lft'); + $orderDirn = $this->state->get('list.direction', 'ASC'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } + + /** + * Method to assign template for category. + * + * @param array $data data for assign template. + * + * @return void. + */ + public function assignTemplate($data) + { + $cid = $data['cid']; + $categoryTemplate = $data['category_template']; + + if (count($cid)) + { + $db = $this->getDbo(); + $fields = array( + $db->qn('template') . ' = ' . $db->q((int) $categoryTemplate) + ); + $conditions = array( + $db->qn('id') . ' IN (' . implode(',', $cid) . ')' + ); + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_category')) + ->set($fields) + ->where($conditions); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/category.php b/component/admin/models/category.php new file mode 100644 index 00000000000..6962067a3ee --- /dev/null +++ b/component/admin/models/category.php @@ -0,0 +1,541 @@ +loadForm( + 'com_redshop.category', + 'category', + array( + 'control' => 'jform', + 'load_data' => $loadData + ) + ); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 2.0.6 + * @throws Exception + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $app = JFactory::getApplication(); + $data = $app->getUserState('com_redshop.edit.category.data', array()); + + if (empty($data)) + { + /** @scrutinizer ignore-call */ + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.category', $data); + + return $data; + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return mixed Object on success, false on failure. + * + * @since 12.2 + */ + public function getItem($pk = null) + { + /** @scrutinizer ignore-call */ + $item = parent::getItem($pk); + + if (!empty($item->id)) + { + $item->more_template = explode(',', $item->more_template); + + return $item; + } + + $item->template = Redshop::getConfig()->get('CATEGORY_TEMPLATE', ""); + $item->products_per_page = 5; + + return $item; + } + + /** + * Method to get extra fields to category. + * + * @param integer $item The object category values. + * + * @return mixed Object on success, false on failure. + * @throws Exception + * + * @since 2.0.6 + */ + public function getExtraFields($item) + { + $templateDesc = RedshopHelperTemplate::getTemplate('category', $item->template, ''); + $template = $templateDesc[0]->template_desc; + $regex = '/{rs_[\w]{1,}\}/'; + preg_match_all($regex, $template, $matches); + + if (empty($matches[0])) + { + return ''; + } + + $listField = array(); + + $fieldName = implode(',', $matches[0]); + $fieldName = str_replace(array('{', '}'), '', $fieldName); + $listField[] = RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_CATEGORY, $item->id, $fieldName); + + return implode('', $listField); + } + + /** + * Method to store category. + * + * @param array $data The object category data. + * + * @return boolean + * @throws Exception + * + * @since 2.0.6 + */ + public function saveCategory(&$data) + { + JPluginHelper::importPlugin('redshop_category'); + + /** @var RedshopTableCategory $row */ + $row = $this->getTable(); + $pk = (!empty($data['id'])) ? $data['id'] : (int) $this->getState($this->getName() . '.id'); + + // Load the row if saving an existing record. + if ($pk > 0) + { + $row->load($pk); + } + + // Set the new parent id if parent id not matched OR while New/Save as Copy . + if ($row->parent_id != $data['parent_id'] || $data['id'] == 0) + { + $row->setLocation($data['parent_id'], 'last-child'); + } + + $data['product_filter_params'] = ""; + + if ($data['product_filter']['enable'] == 1) + { + $registry = new Registry($data['product_filter']); + $data['product_filter_params'] = (string) $registry; + } + + if (!$row->bind($data)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $row->getError()); + + return false; + } + + // Check the data. + if (!$row->check()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $row->getError()); + + return false; + } + + // Media store + $dropzoneMedia = JFactory::getApplication()->input->get('dropzone', array(), 'ARRAY'); + + if (!empty($dropzoneMedia)) + { + $row->setOption('media', $dropzoneMedia); + } + + if (!$row->store()) + { + return false; + } + + $data['id'] = $row->id; + + RedshopHelperUtility::getDispatcher()->trigger('onAfterCategorySave', array(&$row, $data['id'])); + + if (isset($row->id)) + { + $this->setState($this->getName() . '.id', $row->id); + } + + // Sheking for the image at the updation time + if (!empty($data['id']) && !empty($data['category_full_image'])) + { + JFile::delete(REDSHOP_FRONT_IMAGES_RELPATH . 'category/thumb/' . $data['old_image']); + JFile::delete(REDSHOP_FRONT_IMAGES_RELPATH . 'category/' . $data['old_image']); + } + + // Extra Field Data Saved + RedshopHelperExtrafields::extraFieldSave(JFactory::getApplication()->input->post->getArray(), 2, $row->id); + + // Start Accessory Product + // @TODO Need to add an better solution. + $this->productAccessoriesStore($row->id); + + return true; + } + + /** + * Method to copy. + * + * @param array $pks Category id list. + * + * @return boolean + * + * @since 2.0.6 + */ + public function copy(&$pks) + { + if (!count($pks)) + { + return false; + } + + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_category')) + ->where($db->qn('id') . ' IN (' . implode(',', $pks) . ')'); + + $copyData = $db->setQuery($query)->loadObjectList(); + + for ($i = 0, $in = count($copyData); $i < $in; $i++) + { + $post = array(); + $post['id'] = 0; + $post['name'] = $this->renameToUniqueValue('name', $copyData[$i]->name, '', 'Category'); + $post['short_description'] = $copyData[$i]->short_description; + $post['description'] = $copyData[$i]->description; + $post['template'] = $copyData[$i]->template; + $post['more_template'] = $copyData[$i]->more_template; + $post['products_per_page'] = $copyData[$i]->products_per_page; + $post['metakey'] = $copyData[$i]->metakey; + $post['metadesc'] = $copyData[$i]->metadesc; + $post['metalanguage_setting'] = $copyData[$i]->metalanguage_setting; + $post['metarobot_info'] = $copyData[$i]->metarobot_info; + $post['pagetitle'] = $copyData[$i]->pagetitle; + $post['pageheading'] = $copyData[$i]->pageheading; + $post['sef_url'] = $copyData[$i]->sef_url; + $post['published'] = $copyData[$i]->published; + $post['category_pdate'] = date("Y-m-d h:i:s"); + $post['ordering'] = count($copyData) + $i + 1; + $post['parent_id'] = $copyData[$i]->parent_id; + $post['level'] = $copyData[$i]->level; + $post['product_filter_params'] = $copyData[$i]->product_filter_params; + + $this->/** @scrutinizer ignore-call */ saveCategory($post); + + /** @var RedshopEntityCategory $medias */ + $medias = RedshopEntityCategory::getInstance($copyData[$i]->id)->getMedia(); + + foreach ($medias->/** @scrutinizer ignore-call */ getAll() as $media) + { + /** @var RedshopEntityMedia $media */ + if ($media->get('scope') == 'full') + { + $this->/** @scrutinizer ignore-call */ storeMediaCopy($copyData[$i]->id, $post['id'], $media, 'full'); + } + elseif ($media->get('scope') == 'back') + { + $this->/** @scrutinizer ignore-call */ storeMediaCopy($copyData[$i]->id, $post['id'], $media, 'back'); + } + } + + } + + return true; + } + + /** + * Method for store media copy + * + * @param integer $copyCatId + * @param integer $catId + * @param object $media + * @param string $scope + * + * @return void + * + * @since 2.1.0 + */ + public function storeMediaCopy($copyCatId, $catId, $media, $scope) + { + /** @var RedshopEntityMediaImage $fullImage */ + $fullImage = RedshopEntityMediaImage::getInstance($media->getId()); + $fullImageName = $fullImage->get('media_name'); + $newFullImage = time() . '_' . $fullImageName; + + $src = REDSHOP_MEDIA_IMAGE_RELPATH . 'category/' . $copyCatId . '/' . $fullImageName; + + $dest = REDSHOP_MEDIA_IMAGE_RELPATH . 'category/' . $catId . '/' . $newFullImage; + + if (JFile::exists($src)) + { + JFile::copy($src, $dest); + } + + if (JFile::exists($dest)) + { + $mediaFullImage = new stdClass; + $mediaFullImage->media_name = $newFullImage; + $mediaFullImage->media_alternate_text = ''; + $mediaFullImage->media_section = 'category'; + $mediaFullImage->section_id = $catId; + $mediaFullImage->media_type = 'images'; + $mediaFullImage->published = 1; + $mediaFullImage->scope = $scope; + + $this->_db->insertObject('#__redshop_media', $mediaFullImage); + } + } + + /** + * Process for store product accessories + * + * @param integer $categoryId ID of category + * + * @since 2.0.6 + * @throws Exception + * + * @return boolean + */ + public function productAccessoriesStore($categoryId) + { + $productAccessories = JFactory::getApplication()->input->get('product_accessory', array(), 'array'); + + if (empty($productAccessories) || !is_array($productAccessories)) + { + return true; + } + + $productAccessories = array_merge(array(), $productAccessories); + $productList = RedshopEntityCategory::getInstance($categoryId)->getProducts(); + $productIds = array_column($productList, 'id'); + + if (empty($productList)) + { + return true; + } + + foreach ($productList as $product) + { + $productId = $product->id; + + foreach ($productAccessories as $productAccessory) + { + if (in_array($productAccessory['child_product_id'], $productIds)) + { + continue; + } + + $accessoryId = RedshopHelperAccessory::checkAccessoryExists($productId, $productAccessory['child_product_id']); + $accessoryTable = JTable::getInstance('Accessory_detail', 'Table'); + + $accessoryTable->accessory_id = $accessoryId; + $accessoryTable->category_id = $categoryId; + $accessoryTable->product_id = $productId; + $accessoryTable->child_product_id = $productAccessory['child_product_id']; + $accessoryTable->accessory_price = $productAccessory['accessory_price']; + $accessoryTable->oprand = $productAccessory['oprand']; + $accessoryTable->ordering = $productAccessory['ordering']; + $accessoryTable->setdefault_selected = 0; + + if (isset($productAccessory['setdefault_selected']) && $productAccessory['setdefault_selected'] == 1) + { + $accessoryTable->setdefault_selected = 1; + } + + if (!$accessoryTable->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + } + + /** + * Saves the manually set order of records. + * + * @param array $pks An array of primary key ids. + * @param integer $order +1 or -1 + * + * @return boolean|JException Boolean true on success, false on failure, or JException if no items are selected + * + * @since 1.6 + */ + public function saveorder($pks = array(), $order = null) + { + // Get an instance of the table object. + $table = $this->getTable(); + + if (!$table->saveorder($pks, $order)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $table->getError()); + + return false; + } + + // Clear the cache + $this->cleanCache(); + + return true; + } + + /** + * Method for store media + * + * @param object $category Category data + * @param array $data File name + * @param string $scope Scope of media. + * + * @return void + * + * @since 2.1.0 + */ + public function storeMedia($category, $data, $scope) + { + if (empty($data)) + { + return; + } + + /** @var RedshopTableMedia $table */ + $table = RedshopTable::getAdminInstance('Media', array('ignore_request' => true), 'com_redshop'); + + foreach ($data as $key => $file) + { + if (strpos($key, 'media-') !== false) + { + $table->load(str_replace('media-', '', $key)); + + // Delete old image. + $oldMediaFile = JPath::clean(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' + . $category->id . '/' . $table->media_name + ); + + if (JFile::exists($oldMediaFile)) + { + JFile::delete($oldMediaFile); + } + + if (empty($file)) + { + $table->delete(); + + continue; + } + } + else + { + $table->set('section_id', $category->id); + $table->set('media_section', 'category'); + $table->set('ordering', 0); + $table->set('scope', $scope); + $table->set('media_type', 'images'); + $table->set('published', 1); + $table->set('media_alternate_text', $category->name); + } + + $file = JPath::clean(JPATH_ROOT . '/' . $file); + + // Check old image exist. + if (!JFile::exists($file)) + { + continue; + } + + // Generate new image using MD5 + $newFileName = md5(basename($category->name) . $scope) . '.' . JFile::getExt($file); + + if (!JFile::move( + $file, + JPath::clean(REDSHOP_MEDIA_IMAGE_RELPATH . 'category/' . $category->id . '/' . $newFileName) + )) + { + continue; + } + + if (JFolder::exists(REDSHOP_MEDIA_IMAGE_RELPATH . 'category/' . $category->id . '/thumb')) + { + JFolder::delete(REDSHOP_MEDIA_IMAGE_RELPATH . 'category/' . $category->id . '/thumb'); + } + + // Update media data with new file name. + $table->media_name = $newFileName; + $table->store(); + } + } +} diff --git a/component/admin/models/configuration.php b/component/admin/models/configuration.php new file mode 100644 index 00000000000..e9f687afff7 --- /dev/null +++ b/component/admin/models/configuration.php @@ -0,0 +1,603 @@ +redConfiguration = \Redshop\Config\App::getInstance(); + } + + /** + * Method for save configuration + * + * @param array $data Array of data. + * + * @return boolean + * + * @since 2.0.0 + * + * @throws Exception + */ + public function store($data) + { + $input = JFactory::getApplication()->input; + + $this->fileUpload($data); + + // Product Detail Lightbox close button Image End + // Save the HTML tags into the tables + $data["welcomepage_introtext"] = $input->get('welcomepage_introtext', '', 'RAW'); + $data["category_frontpage_introtext"] = $input->get('category_frontpage_introtext', '', 'RAW'); + $data["registration_introtext"] = $input->get('registration_introtext', '', 'RAW'); + $data["registration_comp_introtext"] = $input->get('registration_comp_introtext', '', 'RAW'); + $data["vat_introtext"] = $input->get('vat_introtext', '', 'RAW'); + $data["welcomepage_introtext"] = $input->get('welcomepage_introtext', '', 'RAW'); + $data["product_expire_text"] = $input->get('product_expire_text', '', 'RAW'); + $data["cart_reservation_message"] = $input->get('cart_reservation_message', '', 'RAW'); + $data["with_vat_text_info"] = $input->get('with_vat_text_info', '', 'RAW'); + $data["without_vat_text_info"] = $input->get('without_vat_text_info', '', 'RAW'); + $data["show_price_user_group_list"] = implode(",", $data['show_price_user_group_list']); + $data["show_price_shopper_group_list"] = is_array($data['show_price_shopper_group_list']) ? + implode(",", $data['show_price_shopper_group_list']) : $data['show_price_shopper_group_list']; + $data["show_price_user_group_list"] = $data["show_price_user_group_list"] ? $data["show_price_user_group_list"] : ''; + $data["show_price_shopper_group_list"] = $data["show_price_shopper_group_list"] ? $data["show_price_shopper_group_list"] : ''; + + if ($data['image_quality_output'] <= 10) + { + $data['image_quality_output'] = 90; + } + + if ($data['image_quality_output'] >= 100) + { + $data['image_quality_output'] = 100; + } + + $data['backward_compatible_js'] = isset($data['backward_compatible_js']) ? $data['backward_compatible_js'] : 0; + $data['backward_compatible_php'] = isset($data['backward_compatible_php']) ? $data['backward_compatible_php'] : 0; + + // Prepare post data to write + if (!$this->configurationPrepare($data)) + { + return false; + } + + JFactory::getApplication()->setUserState('com_redshop.config.global.data', $this->configData); + + JPluginHelper::importPlugin('redshop'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $dispatcher->trigger('onBeforeAdminSaveConfiguration', array(&$this->configData)); + + // Temporary new way to save config + $config = Redshop::getConfig(); + + try + { + if ($config->save(new Registry($this->configData))) + { + $dispatcher->trigger('onAfterAdminSaveConfiguration', array($config)); + } + } + catch (Exception $e) + { + $this->setError($e->getMessage()); + + return false; + } + + return true; + } + + /** + * @param array $data Array of data + * + * @return void + * + * @since 2.0.7 + * + * @throws Exception + */ + private function fileUpload(&$data) + { + $files = JFactory::getApplication()->input->files; + + // Product Default Image upload + $productImg = $files->get('productImg'); + $this->fileUploadProgress($data["product_default_image"], $productImg['name'], 'productdefault', $productImg['tmp_name'], 'product/'); + + // Watermark Image upload + $watermarkImg = $files->get('watermarkImg'); + $this->fileUploadProgress($data["watermark_image"], $watermarkImg['name'], 'watermark', $watermarkImg['tmp_name'], 'product/'); + + // Shopper Group default portal upload + $defaultPortalLogo = $files->get('default_portal_logo'); + $this->fileUploadProgress($data["default_portal_logo"], $defaultPortalLogo['name'], null, $defaultPortalLogo['tmp_name'], 'shopperlogo/'); + $data["default_portal_logo"] = empty($data["default_portal_logo"]) ? $data['default_portal_logo_tmp'] : $data['default_portal_logo']; + + // Product image which is out of stock + $productOutOfStockImg = $files->get('productoutofstockImg'); + $this->fileUploadProgress( + $data["product_outofstock_image"], $productOutOfStockImg['name'], null, $productOutOfStockImg['tmp_name'], 'product/' + ); + + // Category Default Image upload + $categoryImg = $files->get('categoryImg'); + $this->fileUploadProgress($data["category_default_image"], $categoryImg['name'], null, $categoryImg['tmp_name'], 'category/'); + + // Cart image upload + $cartImage = $files->get('cartimg'); + $this->fileUploadProgress($data["addtocart_image"], $cartImage['name'], null, $cartImage['tmp_name']); + + // Quote image + $quoteImage = $files->get('quoteimg'); + $this->fileUploadProgress($data["requestquote_image"], $quoteImage['name'], null, $quoteImage['tmp_name']); + + // Cart delete image upload + $cartDelete = $files->get('cartdelete'); + $this->fileUploadProgress($data["addtocart_delete"], $cartDelete['name'], null, $cartDelete['tmp_name']); + + // Cart update image upload + $cartUpdate = $files->get('cartupdate'); + $this->fileUploadProgress($data["addtocart_update"], $cartUpdate['name'], null, $cartUpdate['tmp_name']); + + // Pre Order image upload + $preOrderImage = $files->get('file_pre_order_image'); + $this->fileUploadProgress($data["pre_order_image"], $preOrderImage['name'], null, $preOrderImage['tmp_name']); + + // Image next link + $imageNext = $files->get('imgnext'); + $this->fileUploadProgress($data["image_next_link"], $imageNext['name'], null, $imageNext['tmp_name']); + + // Image previous link + $imagePrev = $files->get('imgpre'); + $this->fileUploadProgress($data["image_previous_link"], $imagePrev['name'], null, $imagePrev['tmp_name']); + + // Product Detail Lightbox close button Image Start + $imageSlimBox = $files->get('imgslimbox'); + $this->fileUploadProgress( + $data["product_detail_lighbox_close_button_image"], $imageSlimBox['name'], null, $imageSlimBox['tmp_name'], 'slimbox/' + ); + } + + /** + * Method for process upload file + * + * @param string $return Return data reference + * @param string $source Source data + * @param string $sourceClean Clean string. + * @param string $tmpFile Temporary upload file path. + * @param string $folderPrefix Is category path. + * + * @return void + * + * @since 2.0.7 + */ + private function fileUploadProgress(&$return, $source = '', $sourceClean = null, $tmpFile = '', $folderPrefix = '') + { + $allowedDefaultExt = array ('jpg', 'jpeg', 'gif', 'png'); + + if (empty($source) || !in_array(JFile::getExt($source), $allowedDefaultExt)) + { + return; + } + + $return = RedshopHelperMedia::cleanFileName($source, $sourceClean); + $dest = REDSHOP_FRONT_IMAGES_RELPATH . $folderPrefix . $return; + + // Delete old file + if (JFile::exists($dest)) + { + JFile::delete($dest); + } + + JFile::upload($tmpFile, $dest); + } + + /** + * @param array $data Data for prepare + * + * @return boolean + * + */ + public function configurationPrepare($data) + { + $this->configData = $this->redConfiguration->prepareConfigData($data); + + return (boolean) $this->configData; + } + + /** + * Method to get the configuration data. + * + * This method will load the global configuration data straight from + * RedshopConfig. If configuration data has been saved in the session, that + * data will be merged into the original data, overwriting it. + * + * @return object An object containing all redshop config data. + * + * @since 1.6 + * + * + * @throws Exception + */ + public function getData() + { + // Get the config data. + $data = Redshop::getConfig()->toArray(); + + // Check for data in the session. + $temp = JFactory::getApplication()->getUserState('com_redshop.config.global.data'); + + // Merge in the session data. + if (!empty($temp)) + { + $data = array_merge($data, $temp); + } + + $object = new Registry($data); + + return $object; + } + + /** + * Get Shop Currency Support + * + * @param string $currency Separated countries + * + * @return array Array for Shop country + * + * @since 2.0.0 + */ + public function getCurrencies($currency = '') + { + $db = $this->getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('code', 'value')) + ->select($db->qn('name', 'text')) + ->from($db->qn('#__redshop_currency')) + ->order($db->qn('name')); + + if ($currency) + { + $query->where($db->qn('code') . ' IN (' . $currency . ')'); + } + + return $db->setQuery($query)->loadObjectList(); + } + + public function getnewsletters() + { + $query = 'SELECT newsletter_id as value,name as text FROM #__redshop_newsletter WHERE published=1'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function getShopperGroupPrivate() + { + $query = "SELECT shopper_group_id as value , shopper_group_name as text " + . " FROM #__redshop_shopper_group " + . " WHERE `shopper_group_customer_type` = '1'"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function getShopperGroupCompany() + { + $query = "SELECT shopper_group_id as value , shopper_group_name as text " + . " FROM #__redshop_shopper_group " + . " WHERE `shopper_group_customer_type` = '0'"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function getVatGroup() + { + $query = 'SELECT tg.id as value,tg.name as text FROM #__redshop_tax_group as tg WHERE tg.published=1 '; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function getnewsletter_content($newsletter_id) + { + $query = 'SELECT n.template_id,n.body,n.subject FROM #__redshop_newsletter AS n ' + . 'LEFT JOIN #__redshop_template AS nt ON n.template_id=nt.id ' + . 'WHERE n.published=1 ' + . 'AND n.newsletter_id="' . $newsletter_id . '" '; + + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + public function getProductIdList() + { + $query = 'SELECT * FROM #__redshop_product WHERE published=1'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function getnewsletterproducts_content() + { + $query = 'SELECT nt.template_desc FROM #__redshop_template as nt ' + . 'WHERE nt.template_section="newsletter_product" '; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + /** + * @param array $data Data + * + * @return boolean + * + */ + public function newsletterEntry($data) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $newsletterId = $data['default_newsletter']; + $mailfrom = $data['news_mail_from']; + $mailfromname = $data['news_from_name']; + $to = $data['newsletter_test_email']; + $uri = JURI::getInstance(); + $url = $uri->root(); + + // Getting newsletter content + $newsbody = $this->getnewsletter_content($newsletterId); + + $subject = ""; + $newsletterBody = ""; + $newsletterTemplate = ""; + + if (count($newsbody) > 0) + { + $subject = $newsbody[0]->subject; + $newsletterBody = $newsbody[0]->body; + $newsletterTemplate = $newsbody[0]->template_desc; + } + + $o = new stdClass; + $o->text = $newsletterBody; + JPluginHelper::importPlugin('content'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $x = array(); + $dispatcher->trigger('onPrepareContent', array(&$o, &$x, 0)); + $newsletterTemplate2 = $o->text; + + $content = str_replace("{data}", $newsletterTemplate2, $newsletterTemplate); + + $products = $this->getProductIdList(); + + if ($products) + { + foreach ($products as $product) + { + $productId = $product->product_id; + + if (strstr($content, '{redshop:' . $productId . '}')) + { + $content = str_replace('{redshop:' . $productId . '}', "", $content); + } + + if (strstr($content, '{Newsletter Products:' . $productId . '}')) + { + $productId = $product->product_id; + $newsproductbody = $this->getnewsletterproducts_content(); + $npTemplateDesc = $newsproductbody[0]->template_desc; + + $thumbImage = ""; + + if ($product->product_full_image) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $product->product_full_image, + '', + 'thumb', + 'product', + Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE'), + Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $thumbImage = ""; + $thumbImage .= ""; + $thumbImage .= ""; + } + + $npTemplateDesc = str_replace("{product_thumb_image}", $thumbImage, $npTemplateDesc); + $npTemplateDesc = str_replace( + "{product_price}", + RedshopHelperProductPrice::formattedPrice($product->product_price), $npTemplateDesc + ); + $npTemplateDesc = str_replace("{product_name}", $product->product_name, $npTemplateDesc); + $npTemplateDesc = str_replace("{product_desc}", $product->product_desc, $npTemplateDesc); + $npTemplateDesc = str_replace("{product_s_desc}", $product->product_s_desc, $npTemplateDesc); + + $content = str_replace("{Newsletter Products:" . $productId . "}", $npTemplateDesc, $content); + } + } + } + + // Replacing the Text library texts + $content = RedshopHelperText::replaceTexts($content); + $data1 = $content; + Redshop\Mail\Helper::imgInMail($data1); + + $to = trim($to); + $today = time(); + + // Replacing the tags with the values + $name = explode('@', $to); + + // Insert columns. + $columns = array('newsletter_id', 'subscription_id', 'subscriber_name', 'user_id', 'read', 'date'); + $values = array((int) $newsletterId, '0', $db->quote($name[0]), 0, 0, $db->quote($today)); + + $query->insert($db->qn('#__redshop_newsletter_tracker')) + ->columns($db->qn($columns)) + ->values(implode(',', $values)); + + $db->setQuery($query)->execute(); + + $content = ''; + $content .= str_replace("{username}", $name[0], $data1); + $content = str_replace("{email}", $to, $content); + + // Replace tag {unsubscribe_link} for testing mail to empty link, because test mail not have subscribes + $content = str_replace("{unsubscribe_link}", "" . JText::_('COM_REDSHOP_UNSUBSCRIBE') . "", $content); + + return JFactory::getMailer()->sendMail($mailfrom, $mailfromname, $to, $subject, $content, 1); + + } + + /** + * + * @return array + */ + public function getOrderstatus() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select(array( + $db->qn('order_status_code', 'value'), + $db->qn('order_status_name', 'text') + ) + ); + $query->from($db->qn('#__redshop_order_status')); + $query->where($db->qn('published') . ' = 1'); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Get current redSHOP version + * + * @return string + */ + public function getCurrentVersion() + { + $xmlfile = JPATH_ROOT . '/administrator/components/com_redshop/redshop.xml'; + $version = JText::_('COM_REDSHOP_FILE_NOT_FOUND'); + + if (JFile::exists($xmlfile)) + { + $data = JInstaller::parseXMLInstallFile($xmlfile); + $version = $data['version']; + } + + return $version; + } + + /** + * Get all installed module for redshop + * + * @return array + * + */ + public function getinstalledmodule() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query + ->select('*') + ->from($db->qn('#__extensions')) + ->where($db->qn('element') . ' LIKE ' . $db->quote('%mod_redshop%')); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Get all installed payment plugins for redshop + * + * @param string $secion Section + * + * @return array + * + */ + public function getinstalledplugins($secion = 'redshop_payment') + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query + ->select('*') + ->from($db->qn('#__extensions')) + ->where($db->qn('folder') . ' = ' . $db->quote($secion)); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Reset template + * + * @return void + * + * @throws Exception + */ + public function resetTemplate() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_template')); + + $list = $db->setQuery($query)->loadObjectList(); + + if (empty($list)) + { + return; + } + + foreach ($list as $template) + { + $table = RedshopTable::getAdminInstance('Template', array('ignore_request' => true), 'com_redshop'); + + $table->bind((array) $template); + $table->templateDesc = RedshopHelperTemplate::getDefaultTemplateContent($table->section); + $table->store(); + } + } +} diff --git a/component/admin/models/countries.php b/component/admin/models/countries.php new file mode 100644 index 00000000000..186f023bc24 --- /dev/null +++ b/component/admin/models/countries.php @@ -0,0 +1,125 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + // List state information. + parent::populateState('country_name', 'asc'); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_country')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where('id = ' . (int) substr($search, 3)); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('country_name') . ' LIKE ' . $search); + } + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/country.php b/component/admin/models/country.php new file mode 100644 index 00000000000..5af9fdd0919 --- /dev/null +++ b/component/admin/models/country.php @@ -0,0 +1,44 @@ +getUserState('com_redshop.edit.country.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.country', $data); + + return $data; + } +} diff --git a/component/admin/models/coupon.php b/component/admin/models/coupon.php new file mode 100644 index 00000000000..c2f2b6970ac --- /dev/null +++ b/component/admin/models/coupon.php @@ -0,0 +1,109 @@ +handleDateTimeRange($data['start_date'], $data['end_date']); + + if ($data['start_date'] > $data['end_date']) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_START_DATE_MUST_BE_SOONER_OR_EQUAL_TO_END_DATE')); + + return false; + } + + if (!empty($data['start_date'])) + { + $data['start_date'] = \JFactory::getDate($data['start_date'])->toSql(); + } + + if (!empty($data['end_date'])) + { + $data['end_date'] = \JFactory::getDate($data['end_date'])->toSql(); + } + + return parent::save($data); + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + * + * @throws Exception + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $app = JFactory::getApplication(); + $data = $app->getUserState('com_redshop.edit.coupon.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.coupon', $data); + + return $data; + } + + /** + * Method for check duplicate code on voucher and coupon + * + * @param string $discountCode Discount code. + * + * @return integer + */ + public function checkDuplicate($discountCode) + { + $db = $this->getDbo(); + + $voucherQuery = $db->getQuery(true) + ->select($db->qn('code')) + ->from($db->qn('#__redshop_voucher')); + + $couponQuery = $db->getQuery(true) + ->select($db->qn('code')) + ->from($db->qn('#__redshop_coupons')); + + $couponQuery->union($voucherQuery); + + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from('(' . $couponQuery . ') AS ' . $db->qn('data')) + ->where($db->qn('data.code') . ' = ' . $db->quote($discountCode)); + + return $db->setQuery($query)->loadResult(); + } +} diff --git a/component/admin/models/coupons.php b/component/admin/models/coupons.php new file mode 100644 index 00000000000..334156d28f9 --- /dev/null +++ b/component/admin/models/coupons.php @@ -0,0 +1,173 @@ +getUserStateFromRequest((string) $this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $type = $this->getUserStateFromRequest((string) $this->context . '.filter.type', 'filter_type'); + $this->setState('filter.type', $type); + + $couponType = $this->getUserStateFromRequest((string) $this->context . '.filter.coupon_type', 'filter_coupon_type'); + $this->setState('filter.coupon_type', $couponType); + + $filterPublished = $this->getUserStateFromRequest((string) $this->context . '.filter.published', 'filter_published'); + $this->setState('filter.published', $filterPublished); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 2.1.0 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.type'); + $id .= ':' . $this->getState('filter.coupon_type'); + $id .= ':' . $this->getState('filter.published'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return JDatabaseQuery An SQL query + * + * @since 2.1.0 + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('c.*') + ->from($db->qn('#__redshop_coupons', 'c')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + $query->where($db->qn('c.code') . ' LIKE ' . $db->quote('%' . $search . '%')); + } + + // Filter: type + $filterType = $this->getState('filter.type', null); + + if (is_numeric($filterType)) + { + $query->where($db->qn('c.type') . ' = ' . $filterType); + } + else + { + $query->where($db->qn('c.type') . ' IN (0,1)'); + } + + // Filter: Effect + $filterEffect = $this->getState('filter.effect'); + + if (is_numeric($filterEffect)) + { + $query->where($db->qn('c.effect') . ' = ' . (int) $filterEffect); + } + elseif ($filterEffect === '') + { + $query->where($db->qn('c.effect') . ' IN (0,1)'); + } + + // Filter: Published + $filterPublished = $this->getState('filter.published'); + + if (is_numeric($filterPublished)) + { + $query->where($db->qn('c.published') . ' = ' . (int) $filterPublished); + } + elseif ($filterPublished === '') + { + $query->where($db->qn('c.published') . ' IN (0,1)'); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'c.id'); + $orderDirection = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirection)); + + return $query; + } +} diff --git a/component/admin/models/currencies.php b/component/admin/models/currencies.php new file mode 100644 index 00000000000..3f407ebb7d9 --- /dev/null +++ b/component/admin/models/currencies.php @@ -0,0 +1,125 @@ +getUserStateFromRequest((string) $this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 2.0.11 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return JDatabaseQuery An SQL query + * + * @since 2.0.11 + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('c.*') + ->from($db->qn('#__redshop_currency', 'c')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + $query->where('(' + . $db->qn('c.name') . ' LIKE ' . $db->quote('%' . $search . '%') + . ' OR ' . $db->qn('c.code') . ' LIKE ' . $db->quote('%' . $search . '%') + . ')' + ); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'c.id'); + $orderDirection = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirection)); + + return $query; + } +} diff --git a/component/admin/models/currency.php b/component/admin/models/currency.php new file mode 100644 index 00000000000..b72a2a9315f --- /dev/null +++ b/component/admin/models/currency.php @@ -0,0 +1,45 @@ +getUserState('com_redshop.edit.currency.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.currency', $data); + + return $data; + } +} diff --git a/component/admin/models/discount.php b/component/admin/models/discount.php new file mode 100644 index 00000000000..4d24a14db94 --- /dev/null +++ b/component/admin/models/discount.php @@ -0,0 +1,75 @@ +getUserState('com_redshop.edit.discount.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.discount', $data); + + return $data; + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return JObject|boolean Object on success, false on failure. + * + * @since 2.1.0 + */ + public function getItem($pk = null) + { + $item = parent::getItem(); + + if (false === $item) + { + return false; + } + + $item->shopper_group = RedshopEntityDiscount::getInstance($item->discount_id)->getShopperGroups()->ids(); + + $spgrpdisFilter = JFactory::getApplication()->input->getInt('spgrpdis_filter', 0); + + if (empty($item->shopper_group) && !empty($spgrpdisFilter)) + { + $item->shopper_group = $spgrpdisFilter; + } + + return $item; + } +} diff --git a/component/admin/models/discount_product.php b/component/admin/models/discount_product.php new file mode 100644 index 00000000000..d55c7f49837 --- /dev/null +++ b/component/admin/models/discount_product.php @@ -0,0 +1,85 @@ +getUserState('com_redshop.edit.discount_product.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.discount_product', $data); + + return $data; + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return JObject|boolean Object on success, false on failure. + * + * @since 2.1.0 + */ + public function getItem($pk = null) + { + $item = parent::getItem(); + + if (false === $item) + { + return false; + } + + $item->shopper_group = RedshopEntityDiscount_Product::getInstance($item->discount_product_id)->getShopperGroups()->ids(); + $item->category_ids = explode(',', $item->category_ids); + + return $item; + } +} diff --git a/component/admin/models/discount_products.php b/component/admin/models/discount_products.php new file mode 100644 index 00000000000..a57dc9f0f62 --- /dev/null +++ b/component/admin/models/discount_products.php @@ -0,0 +1,155 @@ +getUserStateFromRequest((string) $this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $filterPublished = $this->getUserStateFromRequest((string) $this->context . '.filter.published', 'filter_published'); + $this->setState('filter.published', $filterPublished); + + $filterShopperGroup = $this->getUserStateFromRequest((string) $this->context . '.filter.shopper_group', 'filter_shopper_group'); + $this->setState('filter.shopper_group', $filterShopperGroup); + + $filterType = $this->getUserStateFromRequest((string) $this->context . '.filter.type', 'filter_type'); + $this->setState('filter.type', $filterType); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 2.1.0 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return JDatabaseQuery An SQL query + * + * @since 2.1.0 + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('d.*') + ->from($db->qn('#__redshop_discount_product', 'd')); + + // Filter: Published + $filterPublished = $this->getState('filter.published', null); + + if (is_numeric($filterPublished)) + { + $query->where($db->qn('d.published') . ' = ' . (int) $filterPublished); + } + else + { + $query->where($db->qn('d.published') . ' IN (0,1)'); + } + + // Filter: Shopper Group + $filterShopperGroup = $this->getState('filter.shopper_group', null); + + if ($filterShopperGroup) + { + $subQuery = $db->getQuery(true) + ->select('DISTINCT(' . $db->qn('discount_product_id') . ')') + ->from($db->qn('#__redshop_discount_product_shoppers')) + ->where($db->qn('shopper_group_id') . ' = ' . (int) $filterShopperGroup); + + $query->where($db->qn('d.discount_product_id') . ' IN (' . $subQuery . ')'); + } + + // Filter: Type + $filterType = $this->getState('filter.type', null); + + if (is_numeric($filterType)) + { + $query->where($db->qn('d.discount_type') . ' = ' . (int) $filterType); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'd.discount_product_id'); + $orderDirection = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirection)); + + return $query; + } +} diff --git a/component/admin/models/discounts.php b/component/admin/models/discounts.php new file mode 100644 index 00000000000..3cf572ebc40 --- /dev/null +++ b/component/admin/models/discounts.php @@ -0,0 +1,164 @@ +getUserStateFromRequest((string) $this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $filterPublished = $this->getUserStateFromRequest((string) $this->context . '.filter.published', 'filter_published'); + $this->setState('filter.published', $filterPublished); + + $filterShopperGroup = $this->getUserStateFromRequest((string) $this->context . '.filter.shopper_group', 'filter_shopper_group'); + $this->setState('filter.shopper_group', $filterShopperGroup); + + $filterType = $this->getUserStateFromRequest((string) $this->context . '.filter.type', 'filter_type'); + $this->setState('filter.type', $filterType); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 2.1.0 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return JDatabaseQuery An SQL query + * + * @since 2.1.0 + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('d.*') + ->from($db->qn('#__redshop_discount', 'd')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + $query->where($db->qn('d.name') . ' LIKE ' . $db->quote('%' . $search . '%')); + } + + // Filter: Published + $filterPublished = $this->getState('filter.published', null); + + if (is_numeric($filterPublished)) + { + $query->where($db->qn('d.published') . ' = ' . (int) $filterPublished); + } + else + { + $query->where($db->qn('d.published') . ' IN (0,1)'); + } + + // Filter: Shopper Group + $filterShopperGroup = $this->getState('filter.shopper_group', null); + + if ($filterShopperGroup) + { + $subQuery = $db->getQuery(true) + ->select('DISTINCT(' . $db->qn('discount_id') . ')') + ->from($db->qn('#__redshop_discount_shoppers')) + ->where($db->qn('shopper_group_id') . ' = ' . (int) $filterShopperGroup); + + $query->where($db->qn('d.discount_id') . ' IN (' . $subQuery . ')'); + } + + // Filter: Type + $filterType = $this->getState('filter.type', null); + + if (is_numeric($filterType)) + { + $query->where($db->qn('d.discount_type') . ' = ' . (int) $filterType); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'd.discount_id'); + $orderDirection = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirection)); + + return $query; + } +} diff --git a/component/admin/models/export.php b/component/admin/models/export.php new file mode 100755 index 00000000000..9391ebf2175 --- /dev/null +++ b/component/admin/models/export.php @@ -0,0 +1,46 @@ +load('plg_redshop_export_' . $plugin->name, JPATH_SITE . '/plugins/redshop_export/' . $plugin->name); + } + + return $plugins; + } +} diff --git a/component/admin/models/field.php b/component/admin/models/field.php new file mode 100644 index 00000000000..e6a025f7d30 --- /dev/null +++ b/component/admin/models/field.php @@ -0,0 +1,85 @@ +getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('f.name')) + ->from($db->qn('#__redshop_fields', 'f')); + + if ($fieldId) + { + $query->where($db->qn('id') . ' <> ' . $fieldId); + } + + return $db->setQuery($query)->loadColumn(); + } + + /** + * Method for mass assign group into multiple fields + * + * @param mixed $fieldIds Field Id + * @param mixed $groupId Group Id + * + * @return boolean + * @throws Exception + * + * @since 2.1.0 + */ + public function massAssignGroup($fieldIds, $groupId = null) + { + $fieldIds = !is_array($fieldIds) ? array($fieldIds) : $fieldIds; + $fieldIds = \Joomla\Utilities\ArrayHelper::toInteger($fieldIds); + + if (empty($fieldIds)) + { + return false; + } + + // @TODO: Need change to use RedshopTableFields for update after fix error ordering field lost values. + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_fields')) + ->where($db->qn('id') . ' IN (' . implode(',', $fieldIds) . ')'); + + $groupId = (int) $groupId; + + if ($groupId) + { + $query->set($db->qn('groupId') . ' = ' . (int) $groupId); + } + else + { + $query->set($db->qn('groupId') . ' = NULL'); + } + + return $db->setQuery($query)->execute(); + } +} diff --git a/component/admin/models/field_group.php b/component/admin/models/field_group.php new file mode 100644 index 00000000000..11f108c64ea --- /dev/null +++ b/component/admin/models/field_group.php @@ -0,0 +1,51 @@ +getUserState('com_redshop.edit.field_group.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.field_group', $data); + + return $data; + } +} diff --git a/component/admin/models/field_groups.php b/component/admin/models/field_groups.php new file mode 100644 index 00000000000..cb34aa5ea45 --- /dev/null +++ b/component/admin/models/field_groups.php @@ -0,0 +1,133 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $section = $this->getUserStateFromRequest($this->context . '.filter.section', 'filter_section'); + $this->setState('filter.section', $section); + + // List state information. + parent::populateState('name', 'asc'); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 2.1.0 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.section'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->quoteName('#__redshop_fields_group')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->quoteName('id') . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('name') . ' LIKE ' . $search); + } + } + + // Filter by search in name. + $section = (int) $this->getState('filter.section'); + + if ($section) + { + $query->where($db->qn('section') . ' = ' . $section); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/fields.php b/component/admin/models/fields.php new file mode 100644 index 00000000000..8736c041dbb --- /dev/null +++ b/component/admin/models/fields.php @@ -0,0 +1,288 @@ +getState('filter.search'); + $id .= ':' . $this->getState('filter.field_type'); + $id .= ':' . $this->getState('filter.field_section'); + $id .= ':' . $this->getState('filter.field_group'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * Note. Calling getState in this method will result in recursion. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @since 1.6 + */ + protected function populateState($ordering = null, $direction = null) + { + $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $filterFieldType = $this->getUserStateFromRequest($this->context . '.filter.field_type', 'filter_field_type'); + $this->setState('filter.field_type', $filterFieldType); + + $filterFieldSection = $this->getUserStateFromRequest($this->context . '.filter.field_section', 'filter_field_section'); + $this->setState('filter.field_section', $filterFieldSection); + + $filterFieldGroup = $this->getUserStateFromRequest($this->context . '.filter.field_group', 'filter_field_group'); + $this->setState('filter.field_group', $filterFieldGroup); + + parent::populateState('ordering', $direction); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + * + * @since 2.0.6 + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('f.*') + ->select($db->quoteName('fg.name', 'groupName')) + ->from($db->quoteName('#__redshop_fields', 'f')) + ->join('LEFT', + $db->quoteName('#__redshop_fields_group', 'fg') + . ' ON ' . $db->quoteName('f.groupId') .' = ' . $db->quoteName('fg.id') + ); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('f.id') . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('f.title') . ' LIKE ' . $search); + } + } + + // Filter: Field type + $filterFieldType = $this->getState('filter.field_type', ''); + + if ($filterFieldType) + { + $query->where($db->qn('f.type') . ' = ' . $db->q($filterFieldType)); + } + + // Filter: Field section + $filterFieldSection = $this->getState('filter.field_section', ''); + + if ($filterFieldSection) + { + $query->where($db->qn('f.section') . ' = ' . $filterFieldSection); + } + + // Filter: Field group + $filterFieldGroup = $this->getState('filter.field_group', 0); + + if (!empty($filterFieldGroup)) + { + $query->where($db->qn('f.groupId') . ' = ' . (int) $filterFieldGroup); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'ordering'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + if ($orderCol == 'ordering') + { + $query->order($db->escape('f.section, f.ordering ' . $orderDirn)); + } + else + { + $query->order($db->escape($orderCol . ' ' . $orderDirn) . ', f.section, f.ordering'); + } + + return $query; + } + + /** + * Get Fields information from Sections + * Note: This will return non-published fields also + * + * @param array $section Sections in index array + * + * @return mixed Object information array of Fields + */ + public function getFieldInfoBySection($section) + { + if (!is_array($section)) + { + throw new InvalidArgumentException(__FUNCTION__ . 'only accepts Array. Input was ' . $section); + } + + $section = ArrayHelper::toInteger($section); + $sections = implode(',', $section); + + // Init variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + // Create the base select statement. + $query->select('f.name,f.type,f.section') + ->from($db->qn('#__redshop_fields', 'f')) + ->where($db->qn('f.section') . ' IN(' . $sections . ')'); + + // Set the query and load the result. + $db->setQuery($query); + + try + { + $fields = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + throw new RuntimeException($e->getMessage(), $e->getCode()); + } + + return $fields; + } + + /** + * Get Fields information from Section. + * + * @param string $section Section of fields + * @param string $fieldName Field name + * @param int $front Show field in front + * @param int $checkout Show field in checkout + * + * @return mixed + */ + public function getFieldsBySection($section, $fieldName = '', $front = 0, $checkout = 0) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('f.*') + ->select($db->quoteName('fg.name', 'groupName')) + ->from($db->qn('#__redshop_fields', 'f')) + ->join('LEFT', $db->quoteName('#__redshop_fields_group', 'fg') + . ' ON ' . $db->quoteName('f.groupId') .' = ' . $db->quoteName('fg.id')) + ->where($db->qn('f.section') . ' = ' . (int) $section) + ->where($db->qn('f.published') . '= 1 '); + + if ($front) + { + $query->where($db->qn('show_in_front') . ' = 1'); + } + + if ($checkout) + { + $query->where($db->qn('display_in_checkout') . ' = 1'); + } + + if ($fieldName != '') + { + $fieldName = RedshopHelperUtility::quote(explode(',', $fieldName)); + $query->where($db->qn('f.name') . ' IN (' . implode(',', $fieldName) . ') '); + } + + $query->order($db->qn('f.ordering')); + $db->setQuery($query); + + return $db->loadObjectList(); + } + + /** + * Get Field Data from Field Id, Section, Order Item Id and User Email + * + * @param int $fieldId Id of field + * @param integer $section Section of field + * @param integer $orderItemId Order item Id + * @param string $userEmail User's email + * + * @return mixed Object information array of Field's Data + */ + public function getFieldDataList($fieldId, $section = 0, $orderItemId = 0, $userEmail = "") + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_fields_data')) + ->where($db->qn('itemid') . ' = ' . (int) $orderItemId) + ->where($db->qn('fieldid') . ' = ' . (int) $fieldId) + ->where($db->qn('user_email') . ' = ' . $db->quote($userEmail)) + ->where($db->qn('section') . ' = ' . (int) $section); + + $db->setQuery($query); + + return $db->loadObject(); + } +} diff --git a/component/admin/models/forms/access.xml b/component/admin/models/forms/access.xml new file mode 100644 index 00000000000..85486144ea0 --- /dev/null +++ b/component/admin/models/forms/access.xml @@ -0,0 +1,38 @@ + +
    +
    + + + +
    +
    + +
    +
    diff --git a/component/admin/models/forms/attribute.xml b/component/admin/models/forms/attribute.xml new file mode 100644 index 00000000000..2ba00330cb3 --- /dev/null +++ b/component/admin/models/forms/attribute.xml @@ -0,0 +1,79 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/catalog.xml b/component/admin/models/forms/catalog.xml new file mode 100644 index 00000000000..bb11f5acedf --- /dev/null +++ b/component/admin/models/forms/catalog.xml @@ -0,0 +1,41 @@ + +
    +
    + + + + + + + +
    +
    \ No newline at end of file diff --git a/component/admin/models/forms/category.xml b/component/admin/models/forms/category.xml new file mode 100644 index 00000000000..2d46b2a97c8 --- /dev/null +++ b/component/admin/models/forms/category.xml @@ -0,0 +1,339 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    diff --git a/component/admin/models/forms/country.xml b/component/admin/models/forms/country.xml new file mode 100644 index 00000000000..ff22715e228 --- /dev/null +++ b/component/admin/models/forms/country.xml @@ -0,0 +1,65 @@ + +
    +
    + + + + + +
    +
    diff --git a/component/admin/models/forms/coupon.xml b/component/admin/models/forms/coupon.xml new file mode 100644 index 00000000000..ae9d9f09abd --- /dev/null +++ b/component/admin/models/forms/coupon.xml @@ -0,0 +1,136 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/currency.xml b/component/admin/models/forms/currency.xml new file mode 100644 index 00000000000..1822f8b239f --- /dev/null +++ b/component/admin/models/forms/currency.xml @@ -0,0 +1,35 @@ + +
    +
    + + + +
    +
    diff --git a/component/admin/models/forms/discount.xml b/component/admin/models/forms/discount.xml new file mode 100644 index 00000000000..d0cb484e40e --- /dev/null +++ b/component/admin/models/forms/discount.xml @@ -0,0 +1,115 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/discount_product.xml b/component/admin/models/forms/discount_product.xml new file mode 100644 index 00000000000..d09e2777877 --- /dev/null +++ b/component/admin/models/forms/discount_product.xml @@ -0,0 +1,111 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/field.xml b/component/admin/models/forms/field.xml new file mode 100755 index 00000000000..9a9ba4fd4c8 --- /dev/null +++ b/component/admin/models/forms/field.xml @@ -0,0 +1,171 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/field_group.xml b/component/admin/models/forms/field_group.xml new file mode 100644 index 00000000000..4f1d25a072d --- /dev/null +++ b/component/admin/models/forms/field_group.xml @@ -0,0 +1,55 @@ + +
    +
    + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/filter_attributes.xml b/component/admin/models/forms/filter_attributes.xml new file mode 100644 index 00000000000..059400734b5 --- /dev/null +++ b/component/admin/models/forms/filter_attributes.xml @@ -0,0 +1,41 @@ + +
    + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_catalogs.xml b/component/admin/models/forms/filter_catalogs.xml new file mode 100644 index 00000000000..b3867e86fb5 --- /dev/null +++ b/component/admin/models/forms/filter_catalogs.xml @@ -0,0 +1,23 @@ + +
    + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_categories.xml b/component/admin/models/forms/filter_categories.xml new file mode 100644 index 00000000000..226e891c69e --- /dev/null +++ b/component/admin/models/forms/filter_categories.xml @@ -0,0 +1,41 @@ + +
    + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_countries.xml b/component/admin/models/forms/filter_countries.xml new file mode 100644 index 00000000000..1ae47405f89 --- /dev/null +++ b/component/admin/models/forms/filter_countries.xml @@ -0,0 +1,23 @@ + +
    + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_coupons.xml b/component/admin/models/forms/filter_coupons.xml new file mode 100644 index 00000000000..acbe1fc2489 --- /dev/null +++ b/component/admin/models/forms/filter_coupons.xml @@ -0,0 +1,43 @@ + +
    + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_currencies.xml b/component/admin/models/forms/filter_currencies.xml new file mode 100644 index 00000000000..580230a95dd --- /dev/null +++ b/component/admin/models/forms/filter_currencies.xml @@ -0,0 +1,23 @@ + +
    + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_discount_products.xml b/component/admin/models/forms/filter_discount_products.xml new file mode 100644 index 00000000000..bbb06f3c4c6 --- /dev/null +++ b/component/admin/models/forms/filter_discount_products.xml @@ -0,0 +1,51 @@ + +
    + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_discounts.xml b/component/admin/models/forms/filter_discounts.xml new file mode 100644 index 00000000000..f59e1e055ae --- /dev/null +++ b/component/admin/models/forms/filter_discounts.xml @@ -0,0 +1,52 @@ + +
    + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_field_groups.xml b/component/admin/models/forms/filter_field_groups.xml new file mode 100644 index 00000000000..47c272c8480 --- /dev/null +++ b/component/admin/models/forms/filter_field_groups.xml @@ -0,0 +1,32 @@ + +
    + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_fields.xml b/component/admin/models/forms/filter_fields.xml new file mode 100755 index 00000000000..1ca11b27c44 --- /dev/null +++ b/component/admin/models/forms/filter_fields.xml @@ -0,0 +1,49 @@ + +
    + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_mails.xml b/component/admin/models/forms/filter_mails.xml new file mode 100644 index 00000000000..e2907f7c35e --- /dev/null +++ b/component/admin/models/forms/filter_mails.xml @@ -0,0 +1,40 @@ + +
    + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_manufacturers.xml b/component/admin/models/forms/filter_manufacturers.xml new file mode 100644 index 00000000000..580230a95dd --- /dev/null +++ b/component/admin/models/forms/filter_manufacturers.xml @@ -0,0 +1,23 @@ + +
    + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_mass_discounts.xml b/component/admin/models/forms/filter_mass_discounts.xml new file mode 100644 index 00000000000..00ced1e7ed0 --- /dev/null +++ b/component/admin/models/forms/filter_mass_discounts.xml @@ -0,0 +1,34 @@ + +
    + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_order_statuses.xml b/component/admin/models/forms/filter_order_statuses.xml new file mode 100644 index 00000000000..50fecc6bc64 --- /dev/null +++ b/component/admin/models/forms/filter_order_statuses.xml @@ -0,0 +1,23 @@ + +
    + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_questions.xml b/component/admin/models/forms/filter_questions.xml new file mode 100644 index 00000000000..ab88c1ae3fa --- /dev/null +++ b/component/admin/models/forms/filter_questions.xml @@ -0,0 +1,32 @@ + +
    + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_shipping_boxes.xml b/component/admin/models/forms/filter_shipping_boxes.xml new file mode 100644 index 00000000000..35637155f64 --- /dev/null +++ b/component/admin/models/forms/filter_shipping_boxes.xml @@ -0,0 +1,23 @@ + +
    + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_states.xml b/component/admin/models/forms/filter_states.xml new file mode 100644 index 00000000000..37ecd7027de --- /dev/null +++ b/component/admin/models/forms/filter_states.xml @@ -0,0 +1,33 @@ + +
    + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_statistic_customer.xml b/component/admin/models/forms/filter_statistic_customer.xml new file mode 100644 index 00000000000..e5f7acf11bc --- /dev/null +++ b/component/admin/models/forms/filter_statistic_customer.xml @@ -0,0 +1,28 @@ + +
    + + + + + + +
    diff --git a/component/admin/models/forms/filter_statistic_order.xml b/component/admin/models/forms/filter_statistic_order.xml new file mode 100644 index 00000000000..c7e09f9a7f0 --- /dev/null +++ b/component/admin/models/forms/filter_statistic_order.xml @@ -0,0 +1,47 @@ + +
    + + + + + + + + + + + + + +
    diff --git a/component/admin/models/forms/filter_statistic_product.xml b/component/admin/models/forms/filter_statistic_product.xml new file mode 100644 index 00000000000..89744c2328d --- /dev/null +++ b/component/admin/models/forms/filter_statistic_product.xml @@ -0,0 +1,28 @@ + +
    + + + + + + +
    diff --git a/component/admin/models/forms/filter_suppliers.xml b/component/admin/models/forms/filter_suppliers.xml new file mode 100644 index 00000000000..1ae47405f89 --- /dev/null +++ b/component/admin/models/forms/filter_suppliers.xml @@ -0,0 +1,23 @@ + +
    + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_tax_groups.xml b/component/admin/models/forms/filter_tax_groups.xml new file mode 100644 index 00000000000..1ae47405f89 --- /dev/null +++ b/component/admin/models/forms/filter_tax_groups.xml @@ -0,0 +1,23 @@ + +
    + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_tax_rates.xml b/component/admin/models/forms/filter_tax_rates.xml new file mode 100644 index 00000000000..cbaa202a5ce --- /dev/null +++ b/component/admin/models/forms/filter_tax_rates.xml @@ -0,0 +1,53 @@ + +
    + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_templates.xml b/component/admin/models/forms/filter_templates.xml new file mode 100644 index 00000000000..19796396682 --- /dev/null +++ b/component/admin/models/forms/filter_templates.xml @@ -0,0 +1,40 @@ + +
    + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_texts.xml b/component/admin/models/forms/filter_texts.xml new file mode 100644 index 00000000000..f4dced729a3 --- /dev/null +++ b/component/admin/models/forms/filter_texts.xml @@ -0,0 +1,33 @@ + +
    + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_vouchers.xml b/component/admin/models/forms/filter_vouchers.xml new file mode 100644 index 00000000000..350dd3d0df4 --- /dev/null +++ b/component/admin/models/forms/filter_vouchers.xml @@ -0,0 +1,43 @@ + +
    + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/filter_zipcodes.xml b/component/admin/models/forms/filter_zipcodes.xml new file mode 100644 index 00000000000..b137cf52941 --- /dev/null +++ b/component/admin/models/forms/filter_zipcodes.xml @@ -0,0 +1,31 @@ + +
    + + + + + + + + + +
    \ No newline at end of file diff --git a/component/admin/models/forms/giftcard.xml b/component/admin/models/forms/giftcard.xml new file mode 100644 index 00000000000..21509cfd444 --- /dev/null +++ b/component/admin/models/forms/giftcard.xml @@ -0,0 +1,130 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +
    +
    diff --git a/component/admin/models/forms/index.html b/component/admin/models/forms/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/models/forms/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/models/forms/mail.xml b/component/admin/models/forms/mail.xml new file mode 100644 index 00000000000..e4c4ff177a7 --- /dev/null +++ b/component/admin/models/forms/mail.xml @@ -0,0 +1,93 @@ + +
    +
    + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/manufacturer.xml b/component/admin/models/forms/manufacturer.xml new file mode 100644 index 00000000000..a1d6d65f28d --- /dev/null +++ b/component/admin/models/forms/manufacturer.xml @@ -0,0 +1,190 @@ + +
    +
    + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    +
    +
    diff --git a/component/admin/models/forms/mass_discount.xml b/component/admin/models/forms/mass_discount.xml new file mode 100644 index 00000000000..13f6ca262ca --- /dev/null +++ b/component/admin/models/forms/mass_discount.xml @@ -0,0 +1,102 @@ + +
    +
    + + + + + + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/order_status.xml b/component/admin/models/forms/order_status.xml new file mode 100644 index 00000000000..078f4f58e8d --- /dev/null +++ b/component/admin/models/forms/order_status.xml @@ -0,0 +1,48 @@ + +
    +
    + + + + + + + +
    +
    diff --git a/component/admin/models/forms/product_detail.xml b/component/admin/models/forms/product_detail.xml new file mode 100644 index 00000000000..e271bcc92de --- /dev/null +++ b/component/admin/models/forms/product_detail.xml @@ -0,0 +1,10 @@ + +
    +
    + +
    +
    diff --git a/component/admin/models/forms/question.xml b/component/admin/models/forms/question.xml new file mode 100644 index 00000000000..a541b737f85 --- /dev/null +++ b/component/admin/models/forms/question.xml @@ -0,0 +1,83 @@ + +
    +
    + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/shipping_box.xml b/component/admin/models/forms/shipping_box.xml new file mode 100644 index 00000000000..fc9037aa4b6 --- /dev/null +++ b/component/admin/models/forms/shipping_box.xml @@ -0,0 +1,89 @@ + +
    +
    + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/state.xml b/component/admin/models/forms/state.xml new file mode 100644 index 00000000000..04bacee30e0 --- /dev/null +++ b/component/admin/models/forms/state.xml @@ -0,0 +1,75 @@ + +
    +
    + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/supplier.xml b/component/admin/models/forms/supplier.xml new file mode 100644 index 00000000000..b9ea9dcb6a5 --- /dev/null +++ b/component/admin/models/forms/supplier.xml @@ -0,0 +1,57 @@ + +
    +
    + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/tax_group.xml b/component/admin/models/forms/tax_group.xml new file mode 100644 index 00000000000..13014d9c30e --- /dev/null +++ b/component/admin/models/forms/tax_group.xml @@ -0,0 +1,34 @@ + +
    +
    + + + + + + +
    +
    diff --git a/component/admin/models/forms/tax_rate.xml b/component/admin/models/forms/tax_rate.xml new file mode 100644 index 00000000000..81ba97cc0e9 --- /dev/null +++ b/component/admin/models/forms/tax_rate.xml @@ -0,0 +1,83 @@ + +
    +
    + + + + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/template.xml b/component/admin/models/forms/template.xml new file mode 100644 index 00000000000..0f451d5b1a4 --- /dev/null +++ b/component/admin/models/forms/template.xml @@ -0,0 +1,92 @@ + +
    +
    + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/text.xml b/component/admin/models/forms/text.xml new file mode 100644 index 00000000000..ad7ba471ff4 --- /dev/null +++ b/component/admin/models/forms/text.xml @@ -0,0 +1,69 @@ + +
    +
    + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/voucher.xml b/component/admin/models/forms/voucher.xml new file mode 100644 index 00000000000..01e04e8d843 --- /dev/null +++ b/component/admin/models/forms/voucher.xml @@ -0,0 +1,113 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + +
    +
    diff --git a/component/admin/models/forms/zipcode.xml b/component/admin/models/forms/zipcode.xml new file mode 100644 index 00000000000..bc9df48c21c --- /dev/null +++ b/component/admin/models/forms/zipcode.xml @@ -0,0 +1,72 @@ + +
    +
    + + + + + + +
    +
    \ No newline at end of file diff --git a/component/admin/models/giftcard.php b/component/admin/models/giftcard.php new file mode 100644 index 00000000000..9341c9d29e0 --- /dev/null +++ b/component/admin/models/giftcard.php @@ -0,0 +1,23 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + // List state information. + parent::populateState('giftcard_name', 'asc'); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_giftcard')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where('giftcard_id = ' . (int) substr($search, 3)); + } + else + { + $search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where('giftcard_name LIKE ' . $search); + } + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'giftcard_id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/import.php b/component/admin/models/import.php new file mode 100755 index 00000000000..5c44b4a57b3 --- /dev/null +++ b/component/admin/models/import.php @@ -0,0 +1,46 @@ +load('plg_redshop_import_' . $plugin->name, JPATH_SITE . '/plugins/redshop_import/' . $plugin->name); + } + + return $plugins; + } +} diff --git a/component/admin/models/import_vm.php b/component/admin/models/import_vm.php new file mode 100755 index 00000000000..f86f2b0cb26 --- /dev/null +++ b/component/admin/models/import_vm.php @@ -0,0 +1,1275 @@ +_db; + + $query = $db->getQuery(true) + ->select('COUNT(' . $db->qn('virtuemart_product_id') . ')') + ->from($db->qn('#__virtuemart_products')); + + return (int) $db->setQuery($query)->loadResult(); + } + + /** + * Method for count Virtuemart's Categories + * + * @return integer + * + * @since 2.1.0 + */ + public function countCategories() + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('COUNT(' . $db->qn('virtuemart_category_id') . ')') + ->from($db->qn('#__virtuemart_categories')); + + return (int) $db->setQuery($query)->loadResult(); + } + + /** + * Method for count Virtuemart's Shopper Groups + * + * @return integer + * + * @since 2.1.0 + */ + public function countShopperGroups() + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('COUNT(' . $db->qn('virtuemart_shoppergroup_id') . ')') + ->from($db->qn('#__virtuemart_shoppergroups')); + + return (int) $db->setQuery($query)->loadResult(); + } + + /** + * Method for count Virtuemart's Users + * + * @return integer + * + * @since 2.1.0 + */ + public function countUsers() + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('COUNT(' . $db->qn('virtuemart_userinfo_id') . ')') + ->from($db->qn('#__virtuemart_userinfos')); + + return (int) $db->setQuery($query)->loadResult(); + } + + /** + * Method for count Virtuemart's Order Statuses + * + * @return integer + * + * @since 2.1.0 + */ + public function countOrderStatuses() + { + $db = $this->_db; + $query = $db->getQuery(true) + ->select('COUNT(' . $db->qn('virtuemart_orderstate_id') . ')') + ->from($db->qn('#__virtuemart_orderstates')); + + return (int) $db->setQuery($query)->loadResult(); + } + + /** + * Method for count Virtuemart's Manufacturers + * + * @return integer + * + * @since 2.1.0 + */ + public function countManufacturers() + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('COUNT(' . $db->qn('virtuemart_manufacturer_id') . ')') + ->from($db->qn('#__virtuemart_manufacturers')); + + return (int) $db->setQuery($query)->loadResult(); + } + + /** + * Method for count Virtuemart's Orders + * + * @return integer + * + * @since 2.1.0 + */ + public function countOrders() + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('COUNT(' . $db->qn('virtuemart_order_id') . ')') + ->from($db->qn('#__virtuemart_orders')); + + return (int) $db->setQuery($query)->loadResult(); + } + + /** + * Method for sync category + * + * @param int $index Index + * + * @return bool + * + * @since 2.1.0 + */ + public function syncCategory($index) + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('vmc.*') + ->select($db->qn('vm.category_name')) + ->select($db->qn('vm.category_description')) + ->select($db->qn('vm.metadesc')) + ->select($db->qn('vm.metakey')) + ->select($db->qn('m.file_url', 'file_name')) + ->select($db->qn('m.file_mimetype', 'file_mimetype')) + ->select($db->qn('vmc2.category_parent_id', 'parent_id')) + ->from($db->qn('#__virtuemart_categories', 'vmc')) + ->leftJoin( + $db->qn('#__virtuemart_categories_en_gb', 'vm') . ' ON ' + . $db->qn('vmc.virtuemart_category_id') . ' = ' . $db->qn('vm.virtuemart_category_id') + ) + ->leftJoin( + $db->qn('#__virtuemart_category_medias', 'cm') . ' ON ' + . $db->qn('vmc.virtuemart_category_id') . ' = ' . $db->qn('cm.virtuemart_category_id') + ) + ->leftJoin( + $db->qn('#__virtuemart_medias', 'm') . ' ON ' + . $db->qn('cm.virtuemart_media_id') . ' = ' . $db->qn('m.virtuemart_media_id') + ) + ->leftJoin( + $db->qn('#__virtuemart_category_categories', 'vmc2') . ' ON ' + . $db->qn('vmc.virtuemart_category_id') . ' = ' . $db->qn('vmc2.category_child_id') + ) + ->order($db->qn('parent_id') . ' ASC,' . $db->qn('vmc.virtuemart_category_id') . ' ASC'); + + $db->setQuery($query, $index, 1); + + $categoryVM = $db->setQuery($query)->loadObject(); + + if (empty($categoryVM)) + { + $this->setState($this->logName, null); + + return false; + } + + $this->setState($this->logName, $categoryVM->category_name); + + // Load redshop category + $query->clear() + ->select($db->qn('id')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('name') . ' = ' . $db->quote((string) $categoryVM->category_name)); + $rsCategoryId = $db->setQuery($query)->loadResult(); + + /** @var RedshopTableCategory $table */ + $table = RedshopTable::getInstance('Category', 'RedshopTable'); + + if ($rsCategoryId) + { + $table->load($rsCategoryId); + } + + $table->name = addslashes($categoryVM->category_name); + $table->description = $categoryVM->category_description; + $table->category_full_image = !empty($categoryVM->file_name) ? basename($categoryVM->file_name) : null; + $table->published = $categoryVM->published; + $table->category_pdate = $categoryVM->created_on; + $table->products_per_page = $categoryVM->products_per_row; + $table->metakey = $categoryVM->metakey; + $table->metadesc = $categoryVM->metadesc; + $table->ordering = $categoryVM->ordering; + $table->template = Redshop::getConfig()->get('CATEGORY_TEMPLATE'); + + $parentId = $categoryVM->parent_id ? $this->getCategoryIdSynced($categoryVM->parent_id) : $table->getRootId(); + + $table->setLocation((int) $parentId, 'last-child'); + + if (!$table->store()) + { + return false; + } + + // Copy image + if (!empty($categoryVM->file_name)) + { + JFile::copy(JPATH_ROOT . '/' . $categoryVM->file_name, REDSHOP_FRONT_IMAGES_RELPATH . 'category/' . basename($categoryVM->file_name)); + } + + return true; + } + + /** + * Method for get category id of given virtuemart category id + * + * @param int $vmCategoryId Virtuemart category ID + * + * @return int Redshop category id + * + * @since 2.1.0 + */ + protected function getCategoryIdSynced($vmCategoryId) + { + if (!$vmCategoryId) + { + return 0; + } + + $db = $this->_db; + $query = $db->getQuery(true) + ->select($db->qn('c.id')) + ->from($db->qn('#__redshop_category', 'c')) + ->leftJoin($db->qn('#__virtuemart_categories_en_gb', 'vmc') . ' ON ' . $db->qn('vmc.category_name') . ' = ' . $db->qn('c.name')) + ->where($db->qn('vmc.virtuemart_category_id') . ' = ' . $db->quote($vmCategoryId)); + + return $db->setQuery($query)->loadResult(); + } + + /** + * Method for sync shopper group + * + * @param int $index Index + * + * @return boolean + * + * @since 2.1.0 + */ + public function syncShopperGroup($index) + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('vms.*') + ->from($db->qn('#__virtuemart_shoppergroups', 'vms')) + ->order($db->qn('vms.virtuemart_shoppergroup_id') . ' ASC'); + + $db->setQuery($query, $index, 1); + + $shopperGroupVM = $db->setQuery($query)->loadObject(); + + if (empty($shopperGroupVM)) + { + $this->setState($this->logName, null); + + return false; + } + + if ($shopperGroupVM->shopper_group_name == 'COM_VIRTUEMART_SHOPPERGROUP_DEFAULT') + { + $shopperGroupName = JText::_('COM_REDSHOP_IMPORT_VM_SHOPPERGROUP_DEFAULT'); + } + elseif ($shopperGroupVM->shopper_group_name == 'COM_VIRTUEMART_SHOPPERGROUP_GUEST') + { + $shopperGroupName = JText::_('COM_REDSHOP_IMPORT_VM_SHOPPERGROUP_GUEST'); + } + else + { + $shopperGroupName = addslashes($shopperGroupVM->shopper_group_name); + } + + $this->setState($this->logName, $shopperGroupName); + + if ($shopperGroupVM->shopper_group_desc == 'COM_VIRTUEMART_SHOPPERGROUP_DEFAULT_TIP') + { + $shopperGroupDescription = JText::_('COM_REDSHOP_IMPORT_VM_SHOPPERGROUP_DEFAULT_TIP'); + } + elseif ($shopperGroupVM->shopper_group_desc == 'COM_VIRTUEMART_SHOPPERGROUP_GUEST_TIP') + { + $shopperGroupDescription = JText::_('COM_REDSHOP_IMPORT_VM_SHOPPERGROUP_GUEST_TIP'); + } + else + { + $shopperGroupDescription = $shopperGroupVM->shopper_group_desc; + } + + // Load redshop manufacturer + $query->clear() + ->select($db->qn('shopper_group_id')) + ->from($db->qn('#__redshop_shopper_group')) + ->where($db->qn('shopper_group_name') . ' = ' . $db->quote($shopperGroupName)); + $rsShopperGroupId = $db->setQuery($query)->loadResult(); + + /** @var \TableShopper_Group_Detail $table */ + $table = JTable::getInstance('Shopper_Group_Detail', 'Table'); + + if ($rsShopperGroupId) + { + $table->load($rsShopperGroupId); + } + + $table->shopper_group_name = $shopperGroupName; + $table->shopper_group_desc = $shopperGroupDescription; + $table->published = $shopperGroupVM->published; + + return $table->store(); + } + + /** + * Method for sync shopper group + * + * @param int $index Index + * + * @return boolean + * + * @since 2.1.0 + */ + public function syncUser($index) + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('u.*') + ->select($db->qn('ref.virtuemart_shoppergroup_id')) + ->select($db->qn('c.country_3_code')) + ->select($db->qn('s.state_3_code')) + ->from($db->qn('#__virtuemart_userinfos', 'u')) + ->leftJoin( + $db->qn('#__virtuemart_vmuser_shoppergroups', 'ref') . ' ON ' + . $db->qn('u.virtuemart_user_id') . ' = ' . $db->qn('ref.virtuemart_user_id') + ) + ->leftJoin( + $db->qn('#__virtuemart_countries', 'c') . ' ON ' + . $db->qn('c.virtuemart_country_id') . ' = ' . $db->qn('u.virtuemart_country_id') + ) + ->leftJoin( + $db->qn('#__virtuemart_states', 's') . ' ON ' + . $db->qn('s.virtuemart_state_id') . ' = ' . $db->qn('u.virtuemart_state_id') + ) + ->order($db->qn('u.virtuemart_userinfo_id') . ' ASC') + ->group($db->qn('u.virtuemart_user_id')); + + $db->setQuery($query, $index, 1); + + $userVM = $db->setQuery($query)->loadObject(); + + if (empty($userVM)) + { + $this->setState($this->logName, null); + + return false; + } + + $this->setState($this->logName, $userVM->first_name . ' ' . $userVM->last_name); + + $userTable = JTable::getInstance('user_detail', 'Table'); + $isPrivate = (boolean) $userVM->address_type == 'BT'; + + if ($isPrivate) + { + $redshopUser = RedshopHelperOrder::getBillingAddress($userVM->virtuemart_user_id); + + if ($redshopUser) + { + $userTable->load($redshopUser->users_info_id); + + $userTable->firstname = $userVM->first_name; + $userTable->lastname = $userVM->last_name; + $userTable->company_name = $userVM->company; + $userTable->address = $userVM->address_1; + $userTable->city = $userVM->city; + $userTable->country_code = $userVM->country_3_code; + $userTable->state_code = $userVM->state_3_code; + $userTable->zipcode = $userVM->zip; + $userTable->phone = $userVM->phone_1; + } + else + { + $user = JFactory::getUser($userVM->virtuemart_user_id); + + $userTable->reset(); + + $userTable->user_email = $user->email; + $userTable->user_id = $user->id; + $userTable->firstname = $userVM->first_name; + $userTable->lastname = $userVM->last_name; + $userTable->company_name = $userVM->company; + $userTable->address = $userVM->address_1; + $userTable->city = $userVM->city; + $userTable->country_code = $userVM->country_3_code; + $userTable->state_code = $userVM->state_3_code; + $userTable->zipcode = $userVM->zip; + $userTable->phone = $userVM->phone_1; + $userTable->address_type = $userVM->address_type; + } + } + else + { + $user = JFactory::getUser($userVM->virtuemart_user_id); + + $userTable->reset(); + + $userTable->user_email = $user->email; + $userTable->user_id = $user->id; + $userTable->firstname = $userVM->first_name; + $userTable->lastname = $userVM->last_name; + $userTable->company_name = $userVM->company; + $userTable->address = $userVM->address_1; + $userTable->city = $userVM->city; + $userTable->country_code = $userVM->country_3_code; + $userTable->state_code = $userVM->state_3_code; + $userTable->zipcode = $userVM->zip; + $userTable->phone = $userVM->phone_1; + $userTable->address_type = $userVM->address_type; + } + + $useDefault = true; + + if (!empty($userVM->virtuemart_shoppergroup_id)) + { + $groupName = RedshopHelperVirtuemart::getVirtuemartShopperGroups($userVM->virtuemart_shoppergroup_id); + + if (!empty($groupName)) + { + $userTable->shopper_group_id = RedshopHelperVirtuemart::getRedshopShopperGroups($groupName); + + $useDefault = false; + } + } + + if ($useDefault) + { + $userTable->shopper_group_id = $isPrivate ? + Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_PRIVATE') : Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_COMPANY'); + } + + return $userTable->store(); + } + + /** + * Method for sync shopper group + * + * @param int $index Index + * + * @return boolean + * + * @since 2.1.0 + */ + public function syncOrderStatus($index) + { + $db = $this->_db; + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__virtuemart_orderstates')) + ->order($db->qn('virtuemart_orderstate_id')); + + $db->setQuery($query, $index, 1); + + $orderStatusVM = $db->setQuery($query)->loadObject(); + + if (empty($orderStatusVM)) + { + $this->setState($this->logName, null); + + return true; + } + + JFactory::getLanguage()->load('com_virtuemart_orders', JPATH_SITE . '/components/com_virtuemart'); + + $this->setState($this->logName, JText::_($orderStatusVM->order_status_name)); + + /** @var \RedshopTableOrder_Status $table */ + $table = JTable::getInstance('Order_Status', 'RedshopTable'); + + if (!$table->load(array('order_status_code' => $orderStatusVM->order_status_code))) + { + $table->order_status_id = 0; + } + + $table->order_status_name = JText::_($orderStatusVM->order_status_name); + $table->order_status_code = $orderStatusVM->order_status_code; + $table->published = (int) $orderStatusVM->published; + + return $table->store(); + } + + /** + * Method for sync manufacturer + * + * @param int $index Index + * + * @return boolean + * + * @since 2.1.0 + */ + public function syncManufacturer($index) + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('vmm.*') + ->select($db->qn('vmd.mf_name')) + ->select($db->qn('vmd.mf_email')) + ->select($db->qn('vmd.mf_desc')) + ->select($db->qn('vmd.mf_url')) + ->select($db->qn('vmd.metadesc')) + ->select($db->qn('vmd.metakey')) + ->select($db->qn('m.file_url', 'file_name')) + ->select($db->qn('m.file_mimetype', 'file_mime')) + ->select($db->qn('m.file_description', 'file_description')) + ->select($db->qn('m.published', 'file_published')) + ->from($db->qn('#__virtuemart_manufacturers', 'vmm')) + ->leftJoin( + $db->qn('#__virtuemart_manufacturers_en_gb', 'vmd') + . ' ON ' . $db->qn('vmm.virtuemart_manufacturer_id') . ' = ' . $db->qn('vmd.virtuemart_manufacturer_id') + ) + ->leftJoin( + $db->qn('#__virtuemart_manufacturer_medias', 'cm') + . ' ON ' . $db->qn('vmm.virtuemart_manufacturer_id') . ' = ' . $db->qn('cm.virtuemart_manufacturer_id') + ) + ->leftJoin($db->qn('#__virtuemart_medias', 'm') . ' ON ' . $db->qn('cm.virtuemart_media_id') . ' = ' . $db->qn('m.virtuemart_media_id')) + ->order($db->qn('vmm.virtuemart_manufacturer_id') . ' ASC'); + + $db->setQuery($query, $index, 1); + + $manufacturerVM = $db->setQuery($query)->loadObject(); + + if (empty($manufacturerVM)) + { + $this->setState($this->logName, null); + + return false; + } + + $this->setState($this->logName, $manufacturerVM->mf_name); + + // Load redshop manufacturer + $query->clear() + ->select($db->qn('manufacturer_id')) + ->from($db->qn('#__redshop_manufacturer')) + ->where($db->qn('manufacturer_name') . ' = ' . $db->quote((string) $manufacturerVM->mf_name)); + $rsManufacturerId = $db->setQuery($query)->loadResult(); + + /** @var TableManufacturer_Detail $table */ + $table = JTable::getInstance('Manufacturer_Detail', 'Table'); + + if ($rsManufacturerId) + { + $table->load($rsManufacturerId); + } + + $table->manufacturer_name = addslashes($manufacturerVM->mf_name); + $table->manufacturer_desc = $manufacturerVM->mf_desc; + $table->manufacturer_email = $manufacturerVM->mf_email; + $table->published = $manufacturerVM->published; + $table->metakey = $manufacturerVM->metakey; + $table->metadesc = $manufacturerVM->metadesc; + $table->manufacturer_url = $manufacturerVM->mf_url; + $table->template_id = Redshop::getConfig()->get('MANUFACTURER_TEMPLATE'); + + if (!$table->store()) + { + return false; + } + + // Copy image + if (!empty($manufacturerVM->file_name)) + { + $mediaFile = REDSHOP_FRONT_IMAGES_RELPATH . 'manufacturer/' . basename($manufacturerVM->file_name); + + if (!JFile::exists($mediaFile)) + { + JFile::copy(JPATH_ROOT . '/' . $manufacturerVM->file_name, $mediaFile); + } + + /** @var Tablemedia_detail $mediaTable */ + $mediaTable = JTable::getInstance('Media_Detail', 'Table'); + + if (!$mediaTable->load( + array('media_section' => 'manufacturer', 'media_type' => 'images', 'section_id' => $table->manufacturer_id) + )) + { + $mediaTable->media_name = basename($manufacturerVM->file_name); + $mediaTable->media_alternate_text = $manufacturerVM->file_description; + $mediaTable->media_section = 'manufacturer'; + $mediaTable->media_type = 'images'; + $mediaTable->media_mimetype = $manufacturerVM->file_mime; + $mediaTable->published = $manufacturerVM->file_published; + $mediaTable->section_id = $table->manufacturer_id; + + $mediaTable->store(); + } + } + + return true; + } + + public function getProductIdByNumber($product_number) + { + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->quoteName(array('product_id'))) + ->from($db->quoteName('#__redshop_product')) + ->where($db->quoteName('product_number') . ' = ' . $db->quote($product_number)); + + $db->setQuery($query); + + $product_id = $db->loadResult(); + + return $product_id; + } + + /** + * Get Extra Field Names + * + * @param array $keyProducts Array key products + * + * @return array + */ + public function getExtraFieldNames($keyProducts) + { + $extraFieldNames = array(); + + if (is_array($keyProducts)) + { + $pattern = '/rs_/'; + + foreach ($keyProducts as $key => $value) + { + if (preg_match($pattern, $key)) + { + $extraFieldNames[] = $key; + } + } + } + + return $extraFieldNames; + } + + /** + * Method for sync product + * + * @param int $index Index + * + * @return boolean + * + * @since 2.1.0 + */ + public function syncProduct($index) + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('vmp.*') + ->select($db->qn('rp.product_id', 'redshop_product_id')) + ->select($db->qn('vmprice.product_price', 'product_price')) + ->select($db->qn('vmdata.product_s_desc', 'product_s_desc')) + ->select($db->qn('vmdata.product_desc', 'product_desc')) + ->select($db->qn('vmdata.product_name', 'product_name')) + ->select($db->qn('vmdata.metadesc', 'metadesc')) + ->select($db->qn('vmdata.metakey', 'metakey')) + ->select($db->qn('vmdata.customtitle', 'customtitle')) + ->select($db->qn('vmdata.slug', 'product_slug')) + ->select($db->qn('vmmanu.virtuemart_manufacturer_id', 'virtuemart_manufacturer_id')) + ->from($db->qn('#__virtuemart_products', 'vmp')) + ->leftJoin( + $db->qn('#__virtuemart_products_en_gb', 'vmdata') + . ' ON ' . $db->qn('vmp.virtuemart_product_id') . ' = ' . $db->qn('vmdata.virtuemart_product_id') + ) + ->leftJoin( + $db->qn('#__redshop_product', 'rp') . ' ON ' + . '((' . $db->qn('vmp.product_sku') . ' IS NOT NULL' + . ' OR ' . $db->qn('vmp.product_sku') . ' != ' . $db->quote('') . ') AND ' + . $db->qn('rp.product_number') . ' = ' . $db->qn('vmp.product_sku') . ')' + . ' OR ((' . $db->qn('vmp.product_sku') . ' IS NULL OR ' + . $db->qn('vmp.product_sku') . ' = ' . $db->quote('') . ') AND ' + . $db->qn('rp.product_number') . ' = ' . $db->qn('vmdata.slug') . ')' + ) + ->leftJoin( + $db->qn('#__virtuemart_product_prices', 'vmprice') + . ' ON ' . $db->qn('vmp.virtuemart_product_id') . ' = ' . $db->qn('vmprice.virtuemart_product_id') + . ' AND ' . $db->qn('vmprice.price_quantity_start') . ' = ' . $db->quote(0) + ) + ->leftJoin( + $db->qn('#__virtuemart_product_manufacturers', 'vmmanu') + . ' ON ' . $db->qn('vmp.virtuemart_product_id') . ' = ' . $db->qn('vmmanu.virtuemart_product_id') + ) + ->order($db->qn('vmp.product_parent_id') . ' ASC, ' . $db->qn('vmp.virtuemart_product_id') . ' ASC'); + + $db->setQuery($query, $index, 1); + + $productVM = $db->setQuery($query)->loadObject(); + + if (empty($productVM)) + { + $this->setState($this->logName, null); + + return false; + } + + $this->setState($this->logName, $productVM->product_name); + + $productInStock = (int) $productVM->product_in_stock; + + /** @var TableProduct_Detail $table */ + $table = JTable::getInstance('Product_Detail', 'Table'); + + if ($productVM->redshop_product_id) + { + $table->load($productVM->redshop_product_id); + } + + // Product length + switch ($productVM->product_weight_uom) + { + // Kilograms to grams + case 'KG': + $weight = (float) $productVM->product_weight * 1000; + break; + + // Milligrams to grams + case 'MG': + $weight = 1000 / (float) $productVM->product_weight; + break; + + // Pounds to grams + case 'LB': + $weight = (float) $productVM->product_weight * 453.59237; + break; + + // Ounces to grams + case 'OZ': + $weight = (float) $productVM->product_weight * 28.3495231; + break; + + default: + $weight = (float) $productVM->product_weight; + } + + $table->weight = $weight; + + // Product dimensions + switch ($productVM->product_lwh_uom) + { + // Meters to centimeters + case 'M': + $length = (float) $productVM->product_length * 100; + $height = (float) $productVM->product_height * 100; + $width = (float) $productVM->product_width * 100; + break; + + // Millimetres to centimeters + case 'MM': + $length = (float) $productVM->product_length * 0.1; + $height = (float) $productVM->product_height * 0.1; + $width = (float) $productVM->product_width * 0.1; + break; + + // Yards to centimeters + case 'YD': + $length = (float) $productVM->product_length * 91.44; + $height = (float) $productVM->product_height * 91.44; + $width = (float) $productVM->product_width * 91.44; + break; + + // Foots to centimeters + case 'FT': + $length = (float) $productVM->product_length * 30.48; + $height = (float) $productVM->product_height * 30.48; + $width = (float) $productVM->product_width * 30.48; + break; + + // Inches to centimeters + case 'IN': + $length = (float) $productVM->product_length * 2.54; + $height = (float) $productVM->product_height * 2.54; + $width = (float) $productVM->product_width * 2.54; + break; + + default: + $length = (float) $productVM->product_length; + $height = (float) $productVM->product_height; + $width = (float) $productVM->product_width; + break; + } + + // Product params convert + if ($productVM->product_params) + { + $vmProductParams = explode("|", $productVM->product_params); + + foreach ($vmProductParams as $vmProductParam) + { + $param = explode('=', str_replace('"', '', $vmProductParam)); + + if (count($param) != 2) + { + continue; + } + + if ($param[0] == 'min_order_level') + { + $table->min_order_product_quantity = (int) $param[1]; + } + elseif ($param[0] == 'max_order_level') + { + $table->max_order_product_quantity = (int) $param[1]; + } + } + } + + $table->product_number = empty($productVM->product_sku) ? $productVM->product_slug : $productVM->product_sku; + $table->product_length = $length; + $table->product_height = $height; + $table->product_width = $width; + $table->sef_url = $productVM->product_url; + $table->product_special = (int) $productVM->product_special; + $table->expired = (int) $productVM->product_discontinued; + $table->product_on_sale = (int) $productVM->product_sales; + $table->visited = (int) $productVM->hits; + $table->metarobot_info = $productVM->metarobot; + $table->published = (int) $productVM->published; + $table->product_s_desc = $productVM->product_s_desc; + $table->product_desc = $productVM->product_desc; + $table->product_name = $productVM->product_name; + $table->metadesc = $productVM->metadesc; + $table->metakey = $productVM->metakey; + $table->pagetitle = $productVM->customtitle; + $table->product_price = (float) $productVM->product_price; + $table->product_template = Redshop::getConfig()->get('PRODUCT_TEMPLATE'); + + // Product manufacturer + if ($productVM->virtuemart_manufacturer_id) + { + $query->clear() + ->select($db->qn('manufacturer_id')) + ->from($db->qn('#__redshop_manufacturer', 'm')) + ->leftJoin( + $db->qn('#__virtuemart_manufacturers_en_gb', 'vm') . ' ON ' + . $db->qn('vm.mf_name') . ' = ' . $db->qn('m.manufacturer_name') + ) + ->where($db->qn('vm.virtuemart_manufacturer_id') . ' = ' . $productVM->virtuemart_manufacturer_id); + $table->manufacturer_id = $db->setQuery($query)->loadResult(); + } + + // Product parent + if ($productVM->product_parent_id) + { + $query->clear() + ->select($db->qn('product_id')) + ->from($db->qn('#__redshop_product', 'p')) + ->leftJoin( + $db->qn('#__virtuemart_products', 'vm') . ' ON ' + . $db->qn('vm.product_sku') . ' = ' . $db->qn('p.product_number') + ) + ->where($db->qn('vm.virtuemart_product_id') . ' = ' . $productVM->product_parent_id); + $table->product_parent_id = $db->setQuery($query)->loadResult(); + + if (!$table->product_parent_id) + { + $query->clear() + ->select($db->qn('product_id')) + ->from($db->qn('#__redshop_product', 'p')) + ->leftJoin( + $db->qn('#__virtuemart_products_en_gb', 'vm') . ' ON ' + . $db->qn('vm.slug') . ' = ' . $db->qn('p.product_number') + ) + ->where($db->qn('vm.virtuemart_product_id') . ' = ' . $productVM->product_parent_id); + $table->product_parent_id = $db->setQuery($query)->loadResult(); + } + } + + if (!$table->store()) + { + $this->setError($table->getError()); + + return false; + } + + // Product price + $query->clear() + ->delete($db->qn('#__redshop_product_price')) + ->where($db->qn('product_id') . ' = ' . $db->quote($table->product_id)); + $db->setQuery($query)->execute(); + + $query->clear() + ->select('*') + ->from($db->qn('#__virtuemart_product_prices')) + ->where($db->qn('virtuemart_product_id') . ' = ' . $db->quote((string) $productVM->virtuemart_product_id)); + $prices = $db->setQuery($query)->loadObjectList(); + + if (!empty($prices)) + { + $defaultShopperGroup = Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_PRIVATE'); + + foreach ($prices as $price) + { + if ($price->virtuemart_product_id) + { + $shopperGroupName = RedshopHelperVirtuemart::getVirtuemartShopperGroups($price->virtuemart_shoppergroup_id); + $shopperGroupId = RedshopHelperVirtuemart::getRedshopShopperGroups($shopperGroupName); + } + + $shopperGroupId = !$shopperGroupId ? $defaultShopperGroup : $shopperGroupId; + $createdDate = JFactory::getDate($price->created_on); + $priceQuery = 'INSERT IGNORE ' . $db->qn('#__redshop_product_price') + . '(' . $db->qn('product_id') . ',' . $db->qn('product_price') . ',' . $db->qn('cdate') + . ',' . $db->qn('price_quantity_start') . ',' . $db->qn('price_quantity_end') . ',' . $db->qn('shopper_group_id') . ')' + . ' VALUES(' . $table->product_id . ',' . $db->quote((string) $price->product_price) . ',' + . $db->quote((string) $createdDate->format('Y-m-d')) . ',' + . $db->quote((string) $price->price_quantity_start) . ',' + . $db->quote((string) $price->price_quantity_end) . ',' . $shopperGroupId + . ')'; + + $db->setQuery($priceQuery)->execute(); + } + } + + // Product stock + if ($productInStock && Redshop::getConfig()->get('DEFAULT_STOCKROOM') != 0) + { + $stockQuery = 'INSERT IGNORE INTO ' . $db->qn('#__redshop_product_stockroom_xref') + . '(' . $db->qn('product_id') . ',' . $db->qn('stockroom_id') . ',' . $db->qn('quantity') . ')' + . 'VALUES (' . $table->product_id . ',' . Redshop::getConfig()->get('DEFAULT_STOCKROOM') . ',' . $productInStock . ')'; + $db->setQuery($stockQuery); + + if (!$db->execute()) + { + $this->setError($db->getErrorMsg()); + } + } + + // Product images + $this->syncMedia($table->product_id, $productVM->virtuemart_product_id); + + // Remove all current product category + $query->clear() + ->delete($db->qn('#__redshop_product_category_xref')) + ->where($db->qn('product_id') . ' = ' . $db->quote($table->product_id)); + $db->setQuery($query)->execute(); + + // Product categories + $query->clear() + ->select($db->qn('c.id')) + ->from($db->qn('#__redshop_category', 'c')) + ->leftJoin( + $db->qn('#__virtuemart_categories_en_gb', 'vmc') . ' ON ' . $db->qn('vmc.category_name') . ' = ' . $db->qn('c.name') + ) + ->leftJoin( + $db->qn('#__virtuemart_product_categories', 'ref') . ' ON ' + . $db->qn('ref.virtuemart_category_id') . ' = ' . $db->qn('vmc.virtuemart_category_id') + ) + ->where($db->qn('ref.virtuemart_product_id') . ' = ' . $productVM->virtuemart_product_id); + $categoryIds = $db->setQuery($query)->loadColumn(); + + if (!empty($categoryIds)) + { + // Insert new categories + $query->clear() + ->insert($db->qn('#__redshop_product_category_xref')) + ->columns(array('category_id', 'product_id')); + + foreach ($categoryIds as $categoryId) + { + $query->values($categoryId . ',' . $table->product_id); + } + + return $db->setQuery($query)->execute(); + } + + return true; + } + + /** + * Method for sync media + * + * @param integer $productId Product ID + * @param integer $vmProductId Virtuemart ID + * + * @return void + */ + protected function syncMedia($productId, $vmProductId) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('m.*') + ->from($db->qn('#__virtuemart_medias', 'm')) + ->leftJoin( + $db->qn('#__virtuemart_product_medias', 'ref') . ' ON ' + . $db->qn('ref.virtuemart_media_id') . ' = ' . $db->qn('m.virtuemart_media_id') + ) + ->where($db->qn('ref.virtuemart_product_id') . ' = ' . $vmProductId) + ->where($db->qn('m.file_type') . ' = ' . $db->quote('product')) + ->order($db->qn('ref.virtuemart_product_id')); + + $medias = $db->setQuery($query)->loadObjectList(); + + if (empty($medias)) + { + return; + } + + foreach ($medias as $media) + { + // Skip migrate image file if not exist. + if (empty($media->file_url) || !JFile::exists(JPATH_ROOT . '/' . $media->file_url)) + { + continue; + } + + $fileName = basename($media->file_url); + + $mediaTable = JTable::getInstance('Media_Detail', 'Table'); + $mediaTable->media_id = 0; + $mediaTable->media_name = $fileName; + $mediaTable->media_section = 'product'; + $mediaTable->media_alternate_text = $media->file_description; + $mediaTable->section_id = $productId; + $mediaTable->media_type = 'images'; + $mediaTable->media_mimetype = $media->file_mimetype; + $mediaTable->published = $media->published; + + // Skip migrate image file if fail in insert media. + if (!$mediaTable->store()) + { + continue; + } + + JFile::copy(JPATH_ROOT . '/' . $media->file_url, REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $fileName); + } + } + + /** + * Method for sync order + * + * @param int $index Index + * + * @return boolean + * @throws Exception + * + * @since 2.1.0 + */ + public function syncOrder($index) + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('vmo.*') + ->select($db->qn('ro.vm_order_number', 'redshop_order_number_ref')) + ->select($db->qn('ru.users_info_id', 'redshop_user_info_id')) + ->select($db->qn('vmu.customer_note', 'customer_note')) + ->from($db->qn('#__virtuemart_orders', 'vmo')) + ->leftJoin( + $db->qn('#__redshop_orders', 'ro') + . ' ON ' . $db->qn('vmo.order_number') . ' = ' . $db->qn('ro.vm_order_number') + ) + ->leftJoin( + $db->qn('#__virtuemart_order_userinfos', 'vmu') + . ' ON ' . $db->qn('vmu.virtuemart_order_id') . ' = ' . $db->qn('vmo.virtuemart_order_id') + ) + ->leftJoin( + $db->qn('#__redshop_users_info', 'ru') + . ' ON ' . $db->qn('vmo.virtuemart_user_id') . ' = ' . $db->qn('ru.user_id') + . ' AND ' . $db->qn('ru.address_type') . ' = ' . $db->quote('BT') + ) + ->order($db->qn('vmo.virtuemart_order_id')); + + $db->setQuery($query, $index, 1); + + $orderVM = $db->setQuery($query)->loadObject(); + + if (empty($orderVM)) + { + $this->setState($this->logName, null); + + return false; + } + + $this->setState($this->logName, $orderVM->order_number); + + if (!empty($orderVM->redshop_order_number_ref)) + { + return true; + } + + /** @var TableOrder_Detail $orderTable */ + $orderTable = JTable::getInstance('Order_Detail', 'Table'); + + $orderTable->set('order_id', 0); + $orderTable->set('user_id', $orderVM->virtuemart_user_id); + $orderTable->set('order_number', RedshopHelperOrder::generateOrderNumber()); + $orderTable->set('user_info_id', $orderVM->redshop_user_info_id); + $orderTable->set('order_total', $orderVM->order_total); + $orderTable->set('order_subtotal', $orderVM->order_subtotal); + $orderTable->set('order_tax', $orderVM->order_tax); + $orderTable->set('order_shipping', $orderVM->order_shipment); + $orderTable->set('order_shipping_tax', $orderVM->order_shipment_tax); + $orderTable->set('coupon_discount', $orderVM->coupon_discount); + $orderTable->set('order_discount', $orderVM->order_discount); + $orderTable->set('order_status', $orderVM->order_status); + $orderTable->set('order_payment_status', $orderVM->order_status == 'S' ? 'Paid' : 'Unpaid'); + + $createDate = JFactory::getDate($orderVM->created_on); + $modifyDate = JFactory::getDate($orderVM->modified_on); + + $orderTable->set('cdate', $createDate->toUnix()); + $orderTable->set('mdate', $modifyDate->toUnix()); + $orderTable->set('ship_method_id', null); + $orderTable->set('customer_note', $orderVM->customer_note); + $orderTable->set('ip_address', $orderVM->ip_address); + $orderTable->set('vm_order_number', $orderVM->order_number); + + if (!$orderTable->store()) + { + return false; + } + + // Order Items process + $query->clear() + ->select('vmoi.*') + ->select($db->qn('rdoi.order_id', 'rdoi_order_id')) + ->select($db->qn('rdp.product_id', 'rdp_product_id')) + ->from($db->qn('#__virtuemart_order_items', 'vmoi')) + ->leftJoin($db->qn('#__redshop_order_item', 'rdoi') . ' ON ' . $db->qn('rdoi.order_id') . ' = ' . $orderTable->order_id) + ->leftJoin($db->qn('#__redshop_product', 'rdp') . ' ON ' . $db->qn('rdp.product_number') . ' = ' . $db->qn('vmoi.order_item_sku')) + ->where($db->qn('vmoi.virtuemart_order_id') . ' = ' . $orderVM->virtuemart_order_id); + + $orderItems = $db->setQuery($query)->loadObjectList(); + + if (!empty($orderItems)) + { + /** @var Tableorder_item_detail $orderItemTable */ + $orderItemTable = $this->getTable('order_item_detail'); + + foreach ($orderItems as $orderItem) + { + $orderItemTable->reset(); + + $orderItemTable->set('order_item_id', 0); + $orderItemTable->set('order_id', $orderTable->order_id); + $orderItemTable->set('user_info_id', $orderVM->redshop_user_info_id); + $orderItemTable->set('product_id', $orderItem->rdp_product_id); + $orderItemTable->set('order_item_sku', $orderItem->order_item_sku); + $orderItemTable->set('order_item_name', $orderItem->order_item_name); + $orderItemTable->set('product_quantity', $orderItem->product_quantity); + $orderItemTable->set('product_item_price', $orderItem->product_item_price); + $orderItemTable->set('product_final_price', $orderItem->product_final_price); + $orderItemTable->set('order_item_currency', $orderItem->order_item_currency); + $orderItemTable->set('order_status', $orderItem->order_status); + $orderItemTable->set('cdate', JFactory::getDate($orderItem->created_on)->toUnix()); + $orderItemTable->set('mdate', JFactory::getDate($orderItem->modified_on)->toUnix()); + $orderItemTable->set('product_attribute', $orderItem->product_attribute); + + $orderItemTable->store(); + } + } + + // @TODO: Can not migrate VirtueMart payment in Order to redSHOP. + + // Order user infor + $query->clear() + ->select('vmou.*') + ->select($db->qn('vms.state_3_code')) + ->select($db->qn('vmc.country_3_code')) + ->select($db->qn('rsui.users_info_id', 'redshop_users_info_id')) + ->select($db->qn('rsui.shopper_group_id', 'redshop_user_shopper_group')) + ->from($db->qn('#__virtuemart_order_userinfos', 'vmou')) + ->leftJoin( + $db->qn('#__redshop_users_info', 'rsui') . ' ON ' + . $db->qn('rsui.user_id') . ' = ' . $db->qn('vmou.virtuemart_user_id') + ) + ->leftJoin( + $db->qn('#__virtuemart_states', 'vms') . ' ON ' + . $db->qn('vmou.virtuemart_state_id') . ' = ' . $db->qn('vms.virtuemart_state_id') + ) + ->leftJoin( + $db->qn('#__virtuemart_countries', 'vmc') . ' ON ' + . $db->qn('vmou.virtuemart_country_id') . ' = ' . $db->qn('vmc.virtuemart_country_id') + ) + ->where($db->qn('vmou.virtuemart_order_id') . ' = ' . $orderVM->virtuemart_order_id); + + $vmOrderUser = $db->setQuery($query)->loadObject(); + + if ($vmOrderUser) + { + /** @var Tableorder_user_detail $orderUserTable */ + $orderUserTable = JTable::getInstance('order_user_detail', 'Table'); + + $orderUserTable->order_info_id = 0; + $orderUserTable->users_info_id = $vmOrderUser->redshop_users_info_id; + $orderUserTable->order_id = $orderTable->order_id; + $orderUserTable->user_id = $vmOrderUser->virtuemart_user_id; + $orderUserTable->firstname = $vmOrderUser->first_name; + $orderUserTable->lastname = $vmOrderUser->last_name; + $orderUserTable->address_type = $vmOrderUser->address_type; + $orderUserTable->vat_number = ''; + $orderUserTable->tax_exempt = 0; + $orderUserTable->shopper_group_id = $vmOrderUser->redshop_user_shopper_group; + $orderUserTable->address = $vmOrderUser->address_1; + $orderUserTable->city = $vmOrderUser->city; + $orderUserTable->zipcode = ''; + $orderUserTable->phone = $vmOrderUser->phone_1; + $orderUserTable->tax_exempt_approved = ''; + $orderUserTable->approved = ''; + $orderUserTable->is_company = empty($vmOrderUser->company) ? 0 : 1; + $orderUserTable->user_email = $vmOrderUser->email; + $orderUserTable->company_name = $vmOrderUser->company; + $orderUserTable->ean_number = ''; + $orderUserTable->requesting_tax_exempt = ''; + $orderUserTable->thirdparty_email = ''; + + // State + if (!empty($vmOrderUser->virtuemart_state_id)) + { + $orderUserTable->state_code = $vmOrderUser->state_3_code; + } + + // Country + if (!empty($vmOrderUser->virtuemart_country_id)) + { + $orderUserTable->country_code = $vmOrderUser->country_3_code; + } + + $orderUserTable->store(); + } + + return true; + } +} diff --git a/component/admin/models/index.html b/component/admin/models/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/models/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/models/install.php b/component/admin/models/install.php new file mode 100644 index 00000000000..152fa1b9d83 --- /dev/null +++ b/component/admin/models/install.php @@ -0,0 +1,170 @@ +getUpdateSteps(); + } + + return RedshopInstall::getInstallTasks(); + } + + /** + * Method for get all available version of installation. + * + * @return array + * + * @since 2.0.7 + */ + public function getAvailableUpdate() + { + $updatePath = JPATH_COMPONENT_ADMINISTRATOR . '/updates'; + + $files = JFolder::files($updatePath, '.php', false, true); + $versions = array(); + + foreach ($files as $file) + { + $version = new stdClass; + + $version->version = JFile::stripExt(basename($file)); + + require_once $file; + + $version->class = 'RedshopUpdate' . str_replace(array('.', '-'), '', $version->version); + + /** @var RedshopInstallUpdate $updateClass */ + $updateClass = new $version->class; + $classTasks = $updateClass->getTasksList(); + $version->tasks = array(); + + if (empty($classTasks)) + { + continue; + } + + foreach ($classTasks as $classTask) + { + $version->tasks[] = JText::_($classTask->name); + } + + $versions[$version->version] = $version; + } + + arsort($versions); + + return $versions; + } + + /** + * Method for get all available step of update. + * + * @return array + * + * @since 2.0.6 + */ + public function getUpdateSteps() + { + $updatePath = JPATH_COMPONENT_ADMINISTRATOR . '/updates'; + + // Get available updates class. + if (!is_dir($updatePath)) + { + return array(); + } + + $app = JFactory::getApplication(); + $version = $app->getUserState('redshop.old_version', null); + $specificVersion = $app->input->get('version', null); + + $tasks = array( + array( + 'text' => JText::_('COM_REDSHOP_INSTALL_STEP_HANDLE_CONFIG'), + 'func' => 'RedshopInstall::handleConfig' + ) + ); + + if (is_null($version) && is_null($specificVersion)) + { + $app->setUserState(RedshopInstall::REDSHOP_INSTALL_STATE_NAME, $tasks); + $app->setUserState('redshop.old_version', null); + + return $tasks; + } + + $files = JFolder::files($updatePath, '.php', false, true); + $classes = array(); + + foreach ($files as $file) + { + $updateVersion = JFile::stripExt(basename($file)); + + if (!is_null($version) && version_compare($version, $updateVersion, '<')) + { + $classes[$updateVersion] = array('class' => 'RedshopUpdate' . str_replace(array('.', '-'), '', $updateVersion), 'path' => $file); + } + elseif (!is_null($specificVersion) && version_compare($specificVersion, $updateVersion, '=')) + { + $classes[$updateVersion] = array('class' => 'RedshopUpdate' . str_replace(array('.', '-'), '', $updateVersion), 'path' => $file); + } + } + + asort($classes); + + foreach ($classes as $class) + { + require_once $class['path']; + + /** @var RedshopInstallUpdate $updateClass */ + $updateClass = new $class['class']; + $classTasks = $updateClass->getTasksList(); + + if (empty($classTasks)) + { + continue; + } + + foreach ($classTasks as $classTask) + { + $tasks[] = array( + 'text' => $classTask->name, + 'func' => $class['class'] . '.' . $classTask->func, + 'path' => $class['path'] + ); + } + } + + $app->setUserState(RedshopInstall::REDSHOP_INSTALL_STATE_NAME, $tasks); + $app->setUserState('redshop.old_version', null); + + return $tasks; + } +} diff --git a/component/admin/models/mail.php b/component/admin/models/mail.php new file mode 100644 index 00000000000..9922f786581 --- /dev/null +++ b/component/admin/models/mail.php @@ -0,0 +1,43 @@ +getUserState('com_redshop.edit.mail.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.mail', $data); + + return $data; + } +} diff --git a/component/admin/models/mails.php b/component/admin/models/mails.php new file mode 100644 index 00000000000..ec7e60769b2 --- /dev/null +++ b/component/admin/models/mails.php @@ -0,0 +1,129 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_section'); + $this->setState('filter.section', $search); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.section'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('*') + ->from($db->qn('#__redshop_mail')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('mail_name') . ' LIKE ' . $search . ' OR ' . $db->qn('mail_subject') . ' LIKE ' . $search); + } + + // Filter by section + $section = $this->getState('filter.section'); + + if (!empty($section)) + { + $query->where($db->qn('mail_section') . ' = ' . $db->quote($section)); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'mail_id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/manufacturer.php b/component/admin/models/manufacturer.php new file mode 100644 index 00000000000..e5eb425dda2 --- /dev/null +++ b/component/admin/models/manufacturer.php @@ -0,0 +1,62 @@ +bind($source)->getMedia(); + + if (!$media->isValid()) + { + return; + } + + /** @var RedshopTableMedia $table */ + $table = RedshopTable::getAdminInstance('Media', array('ignore_request' => true), 'com_redshop'); + $table->bind((array) $media->getItem()); + + // Copy new image for this media + $newFileName = md5($target->name) . '.' . JFile::getExt($media->get('media_name')); + \Redshop\Helper\Media::createFolder(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $target->id); + \Redshop\Helper\Media::createFolder(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $target->id . '/thumb'); + JFile::copy($media->getImagePath(), REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $target->id . '/' . $newFileName); + + // Store media table + $table->set('media_id', 0); + $table->set('media_name', $newFileName); + $table->set('section_id', $target->id); + $table->store(); + } +} diff --git a/component/admin/models/manufacturers.php b/component/admin/models/manufacturers.php new file mode 100644 index 00000000000..2db1c8f6acd --- /dev/null +++ b/component/admin/models/manufacturers.php @@ -0,0 +1,118 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('m.*') + ->from($db->qn('#__redshop_manufacturer', 'm')); + + // Filter by search in name. + $search = $this->getState('filter.search', ''); + + if (!empty($search)) + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('m.name') . ' LIKE ' . $search); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'm.id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/mass_discount.php b/component/admin/models/mass_discount.php new file mode 100644 index 00000000000..ffb6e403f6d --- /dev/null +++ b/component/admin/models/mass_discount.php @@ -0,0 +1,21 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $type = $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type'); + $this->setState('filter.type', $type); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('m.*') + ->from($db->qn('#__redshop_mass_discount', 'm')); + + // Filter by search in name. + $search = $this->getState('filter.search', ''); + + if (!empty($search)) + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('m.name') . ' LIKE ' . $search); + } + + // Filter by type. + $type = $this->getState('filter.type', null); + + if (is_numeric($type)) + { + $query->where($db->qn('m.type') . ' = ' . (int) $type); + } + else + { + $query->where($db->qn('m.type') . ' IN (0,1)'); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'm.id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/media.php b/component/admin/models/media.php new file mode 100644 index 00000000000..dd312e78a0a --- /dev/null +++ b/component/admin/models/media.php @@ -0,0 +1,506 @@ +input; + $this->context .= '.' . $jInput->getCmd('media_section', 'none') . '.' . $jInput->getInt('section_id', 0); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.5 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter_media_section'); + $id .= ':' . $this->getState('media_type'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'media_id', $direction = 'desc') + { + $filter_media_section = $this->getUserStateFromRequest($this->context . '.filter_media_section', 'filter_media_section', 0); + $this->setState('filter_media_section', $filter_media_section); + + $media_type = $this->getUserStateFromRequest($this->context . '.media_type', 'media_type', ''); + $this->setState('media_type', $media_type); + + $folder = JFactory::getApplication()->input->getPath('folder', ''); + $this->setState('folder', $folder); + + $parent = str_replace("\\", "/", dirname($folder)); + $parent = ($parent == '.') ? null : $parent; + $this->setState('parent', $parent); + + parent::populateState($ordering, $direction); + } + + public function _buildQuery() + { + $app = JFactory::getApplication(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('m.*') + ->from($db->qn('#__redshop_media', 'm')); + + if ($filterMediaSection = $this->getState('filter_media_section')) + { + $query->where('media_section = ' . $db->q($filterMediaSection)); + } + elseif ($mediaSection = $app->input->getCmd('media_section', '')) + { + $query->where('media_section = ' . $db->q($mediaSection)); + + if ($section_id = $app->input->getInt('section_id', 0)) + { + $query->where('section_id = ' . (int) $section_id); + } + } + + if ($media_type = $this->getState('media_type')) + { + $query->where('media_type = ' . $db->q($media_type)); + } + + $filterOrderDir = $this->getState('list.direction'); + $filterOrder = $this->getState('list.ordering'); + $query->order($db->escape($filterOrder . ' ' . $filterOrderDir)); + + return $query; + } + + public function getImages() + { + $list = $this->getList(); + + return $list['images']; + } + + public function getFolders() + { + $list = $this->getList(); + + return $list['folders']; + } + + public function getDocuments() + { + $list = $this->getList(); + + return $list['docs']; + } + + /** + * Build imagelist + * + * @param string $listFolder The image directory to display + * + * @since 1.5 + */ + public function getList() + { + static $list; + + // Only process the list once per request + if (is_array($list)) + { + return $list; + } + + // Get current path from request + $current = $this->getState('folder'); + + // If undefined, set to empty + if ($current == 'undefined') + { + $current = ''; + } + + $fdownload = JRequest::getInt('fdownload'); + + if ($fdownload != 1) + { + // Initialize variables + if (strlen($current) > 0) + { + $basePath = REDSHOP_FRONT_IMAGES_RELPATH . $current; + } + else + { + $basePath = REDSHOP_FRONT_IMAGES_RELPATH; + } + + $mediaBase = str_replace(DIRECTORY_SEPARATOR, '/', REDSHOP_FRONT_IMAGES_RELPATH); + } + else + { + if (strlen($current) > 0) + { + $basePath = Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT') . '/' . $current; + } + else + { + $basePath = Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT'); + } + + $mediaBase = str_replace(DIRECTORY_SEPARATOR, '/', Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT') . '/'); + } + + $images = array(); + $folders = array(); + $docs = array(); + + // Get the list of files and folders from the given folder + $fileList = JFolder::files($basePath); + $folderList = JFolder::folders($basePath); + + // Iterate over the files if they exist + if ($fileList !== false) + { + foreach ($fileList as $file) + { + if (file_exists($basePath . '/' . $file) && substr($file, 0, 1) != '.' && strtolower($file) !== 'index.html') + { + $tmp = new JObject; + $tmp->name = $file; + $tmp->path = str_replace(DIRECTORY_SEPARATOR, '/', JPath::clean($basePath . '/' . $file)); + $tmp->path_relative = str_replace($mediaBase, '', $tmp->path); + $tmp->size = filesize($tmp->path); + + $ext = strtolower(JFile::getExt($file)); + + switch ($ext) + { + // Image + case 'jpg': + case 'png': + case 'gif': + case 'xcf': + case 'odg': + case 'bmp': + case 'jpeg': + $info = @getimagesize($tmp->path); + $tmp->width = @$info[0]; + $tmp->height = @$info[1]; + $tmp->type = @$info[2]; + $tmp->mime = @$info['mime']; + + if (($info[0] > 60) || ($info[1] > 60)) + { + $dimensions = RedshopHelperMedia::imageResize($info[0], $info[1], 60); + $tmp->width_60 = $dimensions[0]; + $tmp->height_60 = $dimensions[1]; + } + else + { + $tmp->width_60 = $tmp->width; + $tmp->height_60 = $tmp->height; + } + + if (($info[0] > 16) || ($info[1] > 16)) + { + $dimensions = RedshopHelperMedia::imageResize($info[0], $info[1], 16); + $tmp->width_16 = $dimensions[0]; + $tmp->height_16 = $dimensions[1]; + } + else + { + $tmp->width_16 = $tmp->width; + $tmp->height_16 = $tmp->height; + } + + $images[] = $tmp; + break; + + // Non-image document + default: + $iconfile_32 = JPATH_ROOT . '/media/com_redshop/images/mime-icon-32/' . $ext . '.png'; + + if (file_exists($iconfile_32)) + { + $tmp->icon_32 = 'media/com_redshop/images/mime-icon-32/' . $ext . '.png'; + } + else + { + $tmp->icon_32 = 'media/com_redshop/images/con_info.png'; + } + + $iconfile_16 = JPATH_ADMINISTRATOR . '/media/com_redshop/images/mime-icon-16/' . $ext . '.png'; + + if (file_exists($iconfile_16)) + { + $tmp->icon_16 = 'media/com_redshop/images/mime-icon-16/' . $ext . '.png'; + } + else + { + $tmp->icon_16 = 'media/com_redshop/images/con_info.png'; + } + + $docs[] = $tmp; + break; + } + } + } + } + + // Iterate over the folders if they exist + if ($folderList !== false) + { + foreach ($folderList as $folder) + { + $tmp = new JObject; + $tmp->name = basename($folder); + $tmp->path = str_replace(DIRECTORY_SEPARATOR, '/', JPath::clean($basePath . '/' . $folder)); + $tmp->path_relative = str_replace($mediaBase, '', $tmp->path); + $count = RedshopHelperMedia::countFiles($tmp->path); + $tmp->files = $count[0]; + $tmp->folders = $count[1]; + + $folders[] = $tmp; + } + } + + $list = array('folders' => $folders, 'docs' => $docs, 'images' => $images); + + return $list; + } + + public function store($data) + { + $row = $this->getTable('media_download'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function getAdditionalFiles($media_id) + { + $query = "SELECT * FROM `#__redshop_media_download` " + . "WHERE `media_id`='" . $media_id . "' "; + + return $this->_getList($query); + } + + public function deleteAddtionalFiles($fileId) + { + $query = "SELECT name FROM `#__redshop_media_download` " + . "WHERE `id`='" . $fileId . "' "; + $this->_db->setQuery($query); + $filename = $this->_db->loadResult(); + $path = JPATH_ROOT . '/components/com_redshop/assets/download/product/' . $filename; + + if (JFile::exists($path)) + { + JFile::delete($path); + } + + $query = "DELETE FROM `#__redshop_media_download` WHERE `id`='" . $fileId . "' "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + public function saveorder($cid = array(), $order) + { + $row = $this->getTable('media_detail'); + $order = JFactory::getApplication()->input->post->get('order', array(0), 'array'); + $conditions = array(); + + // Update ordering values + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + $row->load((int) $cid[$i]); + + // Track categories + if ($row->ordering != $order[$i]) + { + $row->ordering = $order[$i]; + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + // Remember to updateOrder this group + $condition = 'section_id = ' . (int) $row->section_id . ' AND media_section = "' . $row->media_section . '"'; + $found = false; + + foreach ($conditions as $cond) + { + if ($cond[1] == $condition) + { + $found = true; + break; + } + } + + if (!$found) + { + $conditions[] = array($row->media_id, $condition); + } + } + } + + // Execute updateOrder for each group + foreach ($conditions as $cond) + { + $row->load($cond[0]); + $row->reorder($cond[1]); + } + } + + /** + * Get all media items + * + * @return array + */ + public function all() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn("#__redshop_media")); + + $db->setQuery($query); + + return $db->loadObjectlist(); + } + + /** + * Delete media item by ID + * + * @param integer $id [description] + * + * @return boolean + */ + public function deleteFile($id) + { + $db = JFactory::getDbo(); + + // Check item is existed + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn("#__redshop_media")) + ->where($db->qn('media_id') . ' = ' . $id); + $db->setQuery($query); + $file = $db->loadObject(); + + if ($file) + { + $path = JPATH_ROOT . '/components/com_redshop/assets/images/' . $file->media_section . '/' . $file->media_name; + + if (JFile::exists($path)) + { + JFile::delete($path); + } + } + + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_media')) + ->where($db->qn('media_id') . ' = ' . $id); + $db->setQuery($query); + + if (!$db->execute()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + + return true; + } + + /** + * Create a media item by ID + * + * @param array $file File array data + * + * @return boolean + */ + public function newFile($file) + { + $db = JFactory::getDbo(); + $fileObj = new stdClass; + + $fileObj->media_name = $file['media_name']; + $fileObj->media_section = $file['media_section']; + $fileObj->media_type = $file['media_type']; + $fileObj->media_mimetype = $file['media_mimetype']; + $fileObj->published = 1; + + if (!$db->insertObject('#__redshop_media', $fileObj)) + { + $this->setError($db->getErrorMsg()); + + return false; + } + + return $db->insertid(); + } +} diff --git a/component/admin/models/media_detail.php b/component/admin/models/media_detail.php new file mode 100644 index 00000000000..489b83cc1c0 --- /dev/null +++ b/component/admin/models/media_detail.php @@ -0,0 +1,465 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'media ' + . 'WHERE media_id = "' . $this->_id . '" ' + . 'order by section_id'; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + /** + * Init data method + * + * @return boolean + */ + public function _initData() + { + if (empty($this->_data)) + { + // Get stored post data from user state + $tmpPost = JFactory::getApplication()->getUserState('com_redshop.edit.media.data', false); + + if ($tmpPost) + { + $detail = json_decode($tmpPost); + } + else + { + $detail = new stdClass; + $detail->media_id = 0; + $detail->media_title = null; + $detail->media_type = null; + $detail->media_name = null; + $detail->media_alternate_text = null; + $detail->media_section = null; + $detail->section_id = null; + $detail->published = 1; + } + + if (!isset($detail->media_name)) + { + $detail->media_name = null; + } + + if (!isset($detail->media_title)) + { + $detail->media_title = null; + } + + if (!isset($detail->media_name)) + { + $detail->media_name = null; + } + + if (!isset($detail->media_alternate_text)) + { + $detail->media_alternate_text = null; + } + + if (!isset($detail->media_section)) + { + $detail->media_section = null; + } + + if (!isset($detail->section_id)) + { + $detail->section_id = null; + } + + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $row = $this->getTable(); + + if (empty($data['media_alternate_text']) && $data['media_type'] == 'images') + { + $sectionItem = $this->getSection($data['section_id'], $data['media_section']); + $data['media_alternate_text'] = $sectionItem->name; + } + + if (!$row->bind($data)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + $db = JFactory::getDbo(); + $condition = 'section_id = ' . $db->q($row->section_id) . ' AND media_section = ' . $db->q($row->media_section); + $row->reorder($condition); + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $q = 'SELECT * FROM ' . $this->_table_prefix . 'media WHERE media_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($q); + $this->_data = $this->_db->loadObjectList(); + + foreach ($this->_data as $mediadata) + { + $ntsrc = JPATH_ROOT . '/components/com_redshop/assets/' . $mediadata->media_type . '/' + . $mediadata->media_section . '/thumb/' . $mediadata->media_name; + $nsrc = JPATH_ROOT . '/components/com_redshop/assets/' . $mediadata->media_type . '/' + . $mediadata->media_section . '/' . $mediadata->media_name; + + if (JFile::exists($nsrc)) + { + JFile::delete($nsrc); + } + + if (JFile::exists($ntsrc)) + { + JFile::delete($ntsrc); + } + + if ($mediadata->media_section == 'manufacturer') + { + $query = 'DELETE FROM ' . $this->_table_prefix . 'media WHERE section_id IN ( ' . $mediadata->section_id . ' )'; + $this->_db->setQuery($query); + $this->_db->execute(); + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'media WHERE media_id IN ( ' . $mediadata->media_id . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'media' + . ' SET published = ' . intval($publish) + . ' WHERE media_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function getSection($id, $type) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $search = ' = ' . (int) $id; + + switch ($type) + { + case 'category': + $query->select( + array( + $db->qn('id'), + $db->qn('name') + ) + ) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('id') . $search); + break; + case 'property': + $query->select( + array( + $db->qn('property_id', 'id'), + $db->qn('property_name', 'name') + ) + ) + ->from($db->qn('#__redshop_product_attribute_property')) + ->where($db->qn('property_id') . $search); + break; + case 'subproperty': + $query->select( + array( + $db->qn('subattribute_color_id', 'id'), + $db->qn('subattribute_color_name', 'name') + ) + ) + ->from($db->qn('#__redshop_product_subattribute_color')) + ->where($db->qn('subattribute_color_id') . $search); + break; + case 'manufacturer': + $query->select( + array( + $db->qn('id', 'id'), + $db->qn('name', 'name') + ) + ) + ->from($db->qn('#__redshop_manufacturer')) + ->where($db->qn('id') . $search); + break; + case 'catalog': + $query->select( + array( + $db->qn('catalog_id', 'id'), + $db->qn('catalog_name', 'name') + ) + ) + ->from($db->qn('#__redshop_catalog')) + ->where('catalog_id' . $search); + break; + case 'product': + default: + $query->select( + array( + $db->qn('product_id', 'id'), + $db->qn('product_name', 'name') + ) + ) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_id') . $search); + break; + } + + return $db->setQuery($query)->loadObject(); + } + + public function defaultmedia($media_id = 0, $section_id = 0, $media_section = "") + { + if ($media_id && $media_section) + { + $query = "SELECT * FROM " . $this->_table_prefix . "media " + . "WHERE `section_id`='" . $section_id . "' " + . "AND `media_section` = '" . $media_section . "' " + . "AND `media_id` = '" . $media_id . "'"; + $this->_db->setQuery($query); + $rs = $this->_db->loadObject(); + + if (count($rs) > 0) + { + if ($rs->media_type == "images") + { + switch ($media_section) + { + case "product": + $query = "UPDATE `" . $this->_table_prefix . "product` " + . "SET `product_thumb_image` = '', `product_full_image` = '" . $rs->media_name . "' " + . "WHERE `product_id`='" . $section_id . "' "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + break; + case "property": + $query = "UPDATE `" . $this->_table_prefix . "product_attribute_property` " + . "SET `property_main_image` = '" . $rs->media_name . "' " + . "WHERE `property_id`='" . $section_id . "' "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + break; + case "subproperty": + $query = "UPDATE `" . $this->_table_prefix . "product_subattribute_color` " + . "SET `subattribute_color_main_image` = '" . $rs->media_name . "' " + . "WHERE `subattribute_color_id`='" . $section_id . "' "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + break; + } + } + else + { + JFactory::getApplication()->enqueueMessage(JText::sprintf('COM_REDSHOP_ERROR_SET_DEFAULT_MEDIA', $rs->media_type), 'warning'); + + return false; + } + } + } + + return true; + } + + /** + * Save order + * + * @param array $cid + * @param array $order + * + * @return boolean + */ + public function saveorder($cid = array(), $order) + { + $row = $this->getTable(); + + if (empty($order)) + { + $order = JFactory::getApplication()->input->post->get('order', array(0), 'array'); + } + + $conditions = array(); + + // Update ordering values + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + $row->load((int) $cid[$i]); + + // Track categories + if ($row->ordering != $order[$i]) + { + $row->ordering = $order[$i]; + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + // Remember to updateOrder this group + $condition = 'section_id = ' . (int) $row->section_id . ' AND media_section = "' . $row->media_section . '"'; + $found = false; + + foreach ($conditions as $cond) + { + if ($cond[1] == $condition) + { + $found = true; + break; + } + } + + if (!$found) + { + $conditions[] = array($row->media_id, $condition); + } + } + } + + // Execute updateOrder for each group + foreach ($conditions as $cond) + { + $row->load($cond[0]); + $row->reorder($cond[1]); + } + + return true; + } + + public function orderup() + { + $row = $this->getTable(); + $row->load($this->_id); + $row->move(-1, 'section_id = ' . (int) $row->section_id . ' AND media_section = "' . $row->media_section . '"'); + $row->store(); + + return true; + } + + public function orderdown() + { + $row = $this->getTable(); + $row->load($this->_id); + $row->move(1, 'section_id = ' . (int) $row->section_id . ' AND media_section = "' . $row->media_section . '"'); + $row->store(); + + return true; + } +} diff --git a/component/admin/models/newsletter.php b/component/admin/models/newsletter.php new file mode 100644 index 00000000000..60e3ce71124 --- /dev/null +++ b/component/admin/models/newsletter.php @@ -0,0 +1,502 @@ +_buildContentOrderBy(); + $filter = $this->getState('filter'); + $where = ''; + + if ($filter) + { + $where = " AND n.name like '%" . $filter . "%' "; + } + + $query = 'SELECT distinct(n.newsletter_id),n.* FROM #__redshop_newsletter AS n ' + . 'WHERE 1=1 ' + . $where + . $orderby; + + return $query; + } + + public function noofsubscribers($nid) + { + $query = 'SELECT count(*) FROM #__redshop_newsletter_subscription WHERE newsletter_id=' . (int) $nid . ' AND published=1'; + $this->_db->setQuery($query); + + return $this->_db->loadResult(); + } + + /** + * Method for list all subscribers + * + * @param integer $newsletterId ID of newsletter + * + * @return array + * + * @since 2.0.7 + */ + public function listAllSubscribers($newsletterId = 0) + { + $input = JFactory::getApplication()->input; + + $newsletterId = $input->getInt('newsletter_id', $newsletterId); + + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn(array('uf.firstname', 'uf.lastname', 'u.username'))) + ->select('ns.*') + ->from($db->qn('#__redshop_newsletter_subscription', 'ns')) + ->leftJoin($db->qn('#__redshop_users_info', 'uf') . ' ON ' . $db->qn('uf.user_id') . ' = ' . $db->qn('ns.user_id')) + ->leftJoin($db->qn('#__users', 'u') . ' ON ' . $db->qn('u.id') . ' = ' . $db->qn('ns.user_id')) + ->where($db->qn('ns.newsletter_id') . ' = ' . (int) $newsletterId) + ->where($db->qn('ns.published') . ' = 1'); + + $zipStart = $input->getString('zipstart', ''); + $zipEnd = $input->getString('zipend', ''); + $filterCity = $input->getString('cityfilter', ''); + $startDate = $input->getString('start_date', ''); + $endDate = $input->getString('end_date', ''); + $filterCountry = $input->get('country', array(), 'array'); + + // Filter: Country + if (!empty($filterCountry)) + { + $query->where($db->qn('uf.country_code') . ' IN (' . implode(',', $filterCountry) . ')'); + } + + // Filter: Start date and end date + if (!empty($startDate) && !empty($endDate)) + { + $query->where( + 'CAST(' . $db->qn('u.registerDate') . ' AS ' . $db->qn('date') . ') ' + . 'BETWEEN ' . $db->quote($startDate) . ' AND ' . $db->quote($endDate) + ); + } + + // Filter: zip code start + if (!empty($zipStart)) + { + $query->where($db->qn('uf.zipcode') . ' LIKE ' . $db->quote($zipStart . '%')); + } + + // Filter: zip code start and end + if (!empty($zipStart) && !empty($zipEnd)) + { + $query->where( + '(' . $db->qn('uf.zipcode') . ' LIKE ' . $db->quote($zipStart . '%') + . ' OR ' . $db->qn('uf.zipcode') . ' LIKE ' . $db->quote($zipEnd . '%') . ')' + ); + } + + // Filter: city + if (!empty($filterCity)) + { + $cityQuery = $db->getQuery(true) + ->select($db->qn('field_id')) + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('field_name') . ' = ' . $db->quote('field_city')); + $cityFieldIds = $db->setQuery($cityQuery)->loadRow(); + + $query->leftJoin($db->qn('#__redshop_fields_data', 'f') . ' ON ' . $db->qn('f.itemid') . ' = ' . $db->qn('ns.users_info_id')) + ->where($db->qn('uf.address_type') . ' = ' . $db->quote('BT')) + ->where($db->qn('f.fieldid') . ' IN (' . implode(',', $cityFieldIds) . ')') + ->where($db->qn('f.section') . ' = 7') + ->where($db->qn('f.data_txt') . ' LIKE ' . $db->quote($filterCity . '%')); + } + else + { + $query->select($db->qn('uf.address_type')) + ->where('(' . $db->qn('uf.address_type') . ' = ' . $db->quote('BT') . ' OR ' . $db->qn('uf.address_type') . ' IS NULL)'); + + $shopperGroupFilter = $input->get('shoppergroups', array(), 'array'); + + if (!empty($shopperGroupFilter)) + { + $query->where($db->qn('uf.shopper_group_id') . ' IN (' . implode(',', $shopperGroupFilter) . ')'); + } + } + + return $db->setQuery($query)->loadObjectList(); + } + + public function category($uid) + { + $return = 1; + $categories = JFactory::getApplication()->input->get('product_category'); + + if (count($categories) > 0) + { + $categories_ids = implode("','", $categories); + $query = "SELECT * FROM #__redshop_product_category_xref AS pcx " + . "LEFT JOIN #__redshop_order_item AS oi ON pcx.product_id = oi.product_id " + . "LEFT JOIN #__redshop_orders AS o ON o.order_id = oi.order_id " + . "WHERE o.user_id='" . $uid . "' " + . "AND category_id IN ('" . $categories_ids . "') "; + $this->_db->setQuery($query); + $result = $this->_db->loadObjectlist(); + + if (count($result) <= 0) + { + $return = 0; + } + } + + return $return; + } + + public function product($user_id) + { + $return = 1; + $product = JFactory::getApplication()->input->get('product'); + + if (count($product) > 0) + { + $product_ids = implode("','", $product); + $query = "SELECT o.* FROM #__redshop_orders AS o " + . "LEFT JOIN #__redshop_order_item AS oi ON o.order_id=oi.order_id " + . "WHERE o.user_id='" . $user_id . "' " + . "AND product_id IN ('" . $product_ids . "') "; + $this->_db->setQuery($query); + $result = $this->_db->loadObjectlist(); + + if (count($result) <= 0) + { + $return = 0; + } + } + + return $return; + } + + public function order_user($uid) + { + $jInput = JFactory::getApplication()->input; + $number_order = $jInput->getInt('number_order', 0); + $oprand = $jInput->getCmd('oprand', 'select'); + $start = $jInput->get('total_start', ''); + $end = $jInput->get('total_end', ''); + $order_total = ''; + + if ($start != '' && $end != '') + { + $order_total = " or order_total between " . $start . " and " . $end; + } + + switch ($oprand) + { + case 'more': + $cond = '>=' . $number_order; + break; + case 'less': + $cond = '<=' . $number_order; + break; + case 'select': + $cond = "=" . $this->_db->quote(''); + break; + case 'equally': + default: + $cond = '=' . $number_order; + break; + } + + $query = "SELECT COUNT(*) AS total,order_total FROM #__redshop_orders " + . "GROUP BY user_id " + . "HAVING total " . $cond . $order_total . " AND user_id =" . $uid; + $this->_db->setQuery($query); + $result = $this->_db->loadResult(); + + if ($result || ($start == '' && $end == '' && $oprand == 'select')) + { + return 1; + } + else + { + return 0; + } + } + + public function getContry() + { + $query = "SELECT country_3_code as value, country_name as text from #__redshop_country"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function getProduct() + { + $query = "SELECT product_name as text, product_id as value from #__redshop_product" + . " ORDER BY product_id "; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function getShopperGroup() + { + $query = "SELECT shopper_group_id as value,shopper_group_name as text FROM `#__redshop_shopper_group` "; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function getShoppers($shopperid) + { + $query = "SELECT * FROM `#__redshop_users_info` WHERE `shopper_group_id` IN (" . $shopperid . ")"; + $this->_db->setQuery($query); + $data = $this->_db->loadObjectlist(); + $userid = array(); + + for ($d = 0, $dn = count($data); $d < $dn; $d++) + { + $userid[] = $data[$d]->user_id; + } + + $uids = implode(",", $userid); + + return $uids; + } + + public function getNewsletterSubscriber($newsletter_id, $subscription_id) + { + $query = "SELECT * FROM #__redshop_newsletter_subscription " + . "where newsletter_id='" . $newsletter_id . "' " + . "AND subscription_id='" . $subscription_id . "' "; + + $this->_db->setQuery($query); + $result = $this->_db->loadObject(); + + return $result; + } + + public function newsletterEntry($subscriberIds = array(), $userid = array(), $username = array()) + { + $newsletterId = JFactory::getApplication()->input->getInt('newsletter_id'); + + $url = JUri::root(); + + $mailfrom = JFactory::getConfig()->get('mailform'); + $fromname = JFactory::getConfig()->get('fromname'); + + if (Redshop::getConfig()->get('NEWS_MAIL_FROM') != "") + { + $mailfrom = Redshop::getConfig()->get('NEWS_MAIL_FROM'); + } + + if (Redshop::getConfig()->get('NEWS_FROM_NAME') != "") + { + $fromname = Redshop::getConfig()->get('NEWS_FROM_NAME'); + } + + // Getting newsletter content + $newsletterContent = $this->getnewsletter_content($newsletterId); + + $subject = ""; + $newsletterBody = ""; + $newsletterTemplate = ""; + + if (count($newsletterContent) > 0) + { + $subject = $newsletterContent[0]->subject; + $newsletterBody = $newsletterContent[0]->body; + $newsletterTemplate = $newsletterContent[0]->template_desc; + } + + $o = new stdClass; + $o->text = $newsletterBody; + JPluginHelper::importPlugin('content'); + $x = array(); + RedshopHelperUtility::getDispatcher()->trigger('onPrepareContent', array(&$o, &$x, 1)); + $newsletterTemplate2 = $o->text; + + $content = str_replace("{data}", $newsletterTemplate2, $newsletterTemplate); + + $products = $this->getProductIdList(); + $imgWidth = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE'); + $imgHeight = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT'); + $sizeSwapping = Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + + foreach ($products as $product) + { + $productId = $product->product_id; + + if (strpos($content, '{redshop:' . $productId . '}') !== false) + { + $content = str_replace('{redshop:' . $productId . '}', "", $content); + } + + if (strpos($content, '{Newsletter Products:' . $productId . '}') === false) + { + continue; + } + + $newsProductBody = $this->getnewsletterproducts_content(); + $tmpTemplate = $newsProductBody[0]->template_desc; + + $thumbImage = ""; + + if (!empty($product->product_full_image)) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $product->product_full_image, '', 'thumb', 'product', $imgWidth, $imgHeight, $sizeSwapping + ); + $thumbImage = ""; + $thumbImage .= ""; + $thumbImage .= ""; + } + + $tmpTemplate = str_replace("{product_thumb_image}", $thumbImage, $tmpTemplate); + $tmpTemplate = str_replace("{product_price}", RedshopHelperProductPrice::formattedPrice($product->product_price), $tmpTemplate); + $tmpTemplate = str_replace("{product_name}", $product->product_name, $tmpTemplate); + $tmpTemplate = str_replace("{product_desc}", $product->product_desc, $tmpTemplate); + $tmpTemplate = str_replace("{product_s_desc}", $product->product_s_desc, $tmpTemplate); + + $content = str_replace("{Newsletter Products:" . $productId . "}", $tmpTemplate, $content); + } + + // Replacing the Text library texts + $content = RedshopHelperText::replaceTexts($content); + Redshop\Mail\Helper::imgInMail($content); + + $subscribers = array(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $columns = $db->qn(array('tracker_id', 'newsletter_id', 'subscription_id', 'subscriber_name', 'user_id', 'read', 'date')); + $today = time(); + + foreach ($subscriberIds as $index => $subscriberId) + { + $subscriber = $this->subscribersinfo($subscriberId); + + if (empty($subscriber)) + { + continue; + } + + $subscriber = $subscriber[0]; + + $subscribeEmail = trim($subscriber->email); + + if (empty($subscribeEmail)) + { + continue; + } + + $unSubscribeLink = $url . 'index.php?option=com_redshop&view=newsletter&task=unsubscribe&email1=' . $subscribeEmail; + $values = array('', $newsletterId, $subscriberId, $username[$index], $userid[$index], 0, $today); + + $query->clear() + ->insert($db->qn('#__redshop_newsletter_tracker')) + ->columns($columns) + ->values(implode(',', $values)); + $db->setQuery($query)->execute(); + + $message = ''; + + // Replacing the tags with the values + $message .= str_replace("{username}", $subscriber->username, $content); + $message = str_replace("{email}", $subscribeEmail, $message); + + $unSubscribeLink = "" . JText::_('COM_REDSHOP_UNSUBSCRIBE') . ""; + $message = str_replace("{unsubscribe_link}", $unSubscribeLink, $message); + + $subscribers[$index] = (int) JFactory::getMailer()->sendMail($mailfrom, $fromname, $subscribeEmail, $subject, $message, true); + } + + return $subscribers; + } + + public function getnewsletter_content($newsletter_id) + { + $query = 'SELECT n.template_id,n.body,n.subject FROM #__redshop_newsletter AS n ' + . 'LEFT JOIN #__redshop_template AS nt ON n.template_id=nt.id ' + . 'WHERE n.published=1 ' + . 'AND n.newsletter_id="' . $newsletter_id . '" '; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + public function getProductIdList() + { + $query = 'SELECT * FROM #__redshop_product WHERE published=1'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function getnewsletterproducts_content() + { + $query = 'SELECT nt.template_desc FROM #__redshop_template as nt ' + . 'WHERE nt.template_section="newsletter_product" '; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function subscribersinfo($subscriberid) + { + $query = 'SELECT IFNULL(u.email,s.email) AS email,IFNULL(u.username,s.name) AS username FROM #__redshop_newsletter_subscription AS s ' + . 'LEFT JOIN #__users as u ON u.id=s.user_id ' + . 'WHERE s.subscription_id="' . $subscriberid . '" ' + . 'AND published=1 '; + + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.5 + */ + protected function getStoreId($id = '') + { + $id .= ':' . $this->getState('filter'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'newsletter_id', $direction = '') + { + $filter = $this->getUserStateFromRequest($this->context . '.filter', 'filter', ''); + $this->setState('filter', $filter); + + parent::populateState($ordering, $direction); + } +} diff --git a/component/admin/models/newsletter_detail.php b/component/admin/models/newsletter_detail.php new file mode 100644 index 00000000000..eb0841fca4b --- /dev/null +++ b/component/admin/models/newsletter_detail.php @@ -0,0 +1,305 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'newsletter WHERE newsletter_id = ' . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->newsletter_id = 0; + $detail->name = null; + $detail->subject = null; + $detail->body = null; + $detail->template_id = 0; + $detail->published = 1; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'DELETE FROM ' . $this->_table_prefix . 'newsletter WHERE newsletter_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'newsletter' + . ' SET published = ' . intval($publish) + . ' WHERE newsletter_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function copy($cid = array()) + { + $copydata = array(); + + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'SELECT * FROM ' . $this->_table_prefix . 'newsletter ' + . 'WHERE newsletter_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + $copydata = $this->_db->loadObjectList(); + } + + for ($i = 0, $in = count($copydata); $i < $in; $i++) + { + $post['newsletter_id'] = 0; + $post['name'] = $this->renameToUniqueValue('name', $copydata[$i]->name); + $post['subject'] = $copydata[$i]->subject; + $post['body'] = $copydata[$i]->body; + $post['template_id'] = $copydata[$i]->template_id; + $post['published'] = $copydata[$i]->published; + + $row = $this->store($post); + + // Copy subscriber of newsletters + $query = 'SELECT * FROM ' . $this->_table_prefix . 'newsletter_subscription ' + . 'WHERE newsletter_id IN ( ' . $copydata[$i]->newsletter_id . ' )'; + $this->_db->setQuery($query); + $subscriberdata = $this->_db->loadObjectList(); + + for ($j = 0, $jn = count($subscriberdata); $j < $jn; $j++) + { + $rowsubscr = $this->getTable('newslettersubscr_detail'); + $rowsubscr->subscription_id = 0; + $rowsubscr->user_id = $subscriberdata[$j]->user_id; + $rowsubscr->date = time(); + $rowsubscr->newsletter_id = $row->newsletter_id; + $rowsubscr->name = $subscriberdata[$j]->name; + $rowsubscr->email = $subscriberdata[$j]->email; + $rowsubscr->published = $subscriberdata[$j]->published; + $rowsubscr->checkout = $subscriberdata[$j]->checkout; + $rowsubscr->store(); + } + } + + return true; + } + + public function gettemplates() + { + $query = 'SELECT id AS value,name AS text FROM ' . $this->_table_prefix . 'template ' + . 'WHERE section="newsletter" ' + . 'AND published=1'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + /** + * Method for get texts of newsletter. + * + * @return array + */ + public function getnewslettertexts() + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select($db->qn(array('name', 'desc'))) + ->from($db->qn('#__redshop_textlibrary')) + ->where($db->qn('section') . ' = ' . $db->quote('newsletter')) + ->where($db->qn('published') . ' = 1'); + + return $db->setQuery($query)->loadObjectList(); + } + + public function getNewsletterList($newsletter_id = 0) + { + $and = ""; + + if ($newsletter_id != 0) + { + $and .= "AND n.newsletter_id='" . $newsletter_id . "' "; + } + + $query = 'SELECT n.*,CONCAT(n.name," (",n.subject,")") AS text FROM ' . $this->_table_prefix . 'newsletter AS n ' + . 'WHERE 1=1 ' + . $and; + + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + public function getNewsletterTracker($newsletter_id = 0) + { + $data = $this->getNewsletterList($newsletter_id); + + $return = array(); + $qs = array(); + + for ($d = 0, $dn = count($data); $d < $dn; $d++) + { + $query = "SELECT COUNT(*) AS total FROM " . $this->_table_prefix . "newsletter_tracker " + . "WHERE newsletter_id='" . $data[$d]->newsletter_id . "' "; + $this->_db->setQuery($query); + $totalresult = $this->_db->loadResult(); + + if (!$totalresult) + { + $totalresult = 0; + } + + if ($newsletter_id != 0) + { + $totalread = $this->getReadNewsletter($data[$d]->newsletter_id); + $qs[0] = new stdClass; + $qs[0]->xdata = JText::_('COM_REDSHOP_NO_OF_UNREAD_NEWSLETTER'); + $qs[0]->ydata = $totalresult - $totalread; + $qs[1] = new stdClass; + $qs[1]->xdata = JText::_('COM_REDSHOP_NO_OF_READ_NEWSLETTER'); + $qs[1]->ydata = $totalread; + } + else + { + $qs[$d] = new stdClass; + $qs[$d]->xdata = $data[$d]->name; + $qs[$d]->ydata = $totalresult; + } + } + + if ($newsletter_id != 0) + { + $return = array($qs, $data[0]->name); + } + else + { + $return = array($qs, JText::_('COM_REDSHOP_NO_OF_SENT_NEWSLETTER')); + } + + return $return; + } + + public function getReadNewsletter($newsletter_id) + { + $query = "SELECT COUNT(*) AS total FROM " . $this->_table_prefix . "newsletter_tracker " + . "WHERE `newsletter_id`='" . $newsletter_id . "' " + . "AND `read`='1' "; + + $this->_db->setQuery($query); + $result = $this->_db->loadObject(); + + if (!$result) + { + $result->total = 0; + } + + return $result->total; + } +} diff --git a/component/admin/models/newslettersubscr.php b/component/admin/models/newslettersubscr.php new file mode 100644 index 00000000000..87d38cb1fb1 --- /dev/null +++ b/component/admin/models/newslettersubscr.php @@ -0,0 +1,88 @@ +getState('filter'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'subscription_id', $direction = '') + { + $filter = $this->getUserStateFromRequest($this->context . 'filter', 'filter', ''); + $this->setState('filter', $filter); + + parent::populateState($ordering, $direction); + } + + public function _buildQuery() + { + $filter = $this->getState('filter'); + $where = ''; + + if ($filter) + { + $where = " AND (ns.name like '%" . $filter . "%' OR ns.email like '%" . $filter . "%') "; + } + + $orderby = $this->_buildContentOrderBy(); + $query = 'SELECT distinct(ns.subscription_id),ns.*,n.name as n_name FROM #__redshop_newsletter_subscription as ns ' + . ',#__redshop_newsletter as n ' + . 'WHERE ns.newsletter_id=n.newsletter_id ' + . $where + . $orderby; + + return $query; + } + + public function getnewslettername($nid) + { + $query = 'SELECT name FROM #__redshop_newsletter WHERE newsletter_id=' . $nid; + $this->_db->setQuery($query); + + return $this->_db->loadResult(); + } + + public function getnewsletters() + { + $query = 'SELECT newsletter_id as value,name as text FROM #__redshop_newsletter WHERE published=1'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } +} diff --git a/component/admin/models/newslettersubscr_detail.php b/component/admin/models/newslettersubscr_detail.php new file mode 100644 index 00000000000..37c589bdc1e --- /dev/null +++ b/component/admin/models/newslettersubscr_detail.php @@ -0,0 +1,219 @@ +_table_prefix = '#__redshop_'; + + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT ns.*,uf.firstname FROM ' . $this->_table_prefix . 'newsletter_subscription as ns left join ' + . $this->_table_prefix . 'users_info as uf on ns.user_id = uf.user_id WHERE ns.subscription_id = ' . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->subscription_id = 0; + $detail->user_id = 0; + $detail->date = null; + $detail->newsletter_id = null; + $detail->name = null; + $detail->email = null; + $detail->published = 1; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $data['date'] = strtotime($data['date']); + + /** @var Tablenewslettersubscr_detail $row */ + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'DELETE FROM ' . $this->_table_prefix . 'newsletter_subscription WHERE subscription_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'newsletter_subscription' + . ' SET published = ' . intval($publish) + . ' WHERE subscription_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function getuserlist() + { + $query = 'SELECT user_id as value,firstname as text FROM ' . $this->_table_prefix + . 'users_info as rdu, #__users as u WHERE rdu.user_id=u.id AND rdu.address_type LIKE "BT"'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function getnewsletters() + { + $query = 'SELECT newsletter_id as value,name as text FROM ' . $this->_table_prefix . 'newsletter WHERE published=1'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function getuserfullname2($uid) + { + $query = "SELECT firstname,lastname,username FROM " . $this->_table_prefix + . "users_info as uf LEFT JOIN #__users as u ON (uf.user_id=u.id) WHERE user_id='" . $uid . "' AND uf.address_type like 'BT'"; + $this->_db->setQuery($query); + $this->_username = $this->_db->loadObject(); + + if (count($this->_username) > 0) + { + $fullname = $this->_username->firstname . " " . $this->_username->lastname . ($this->_username->username != "" ? + " (" . $this->_username->username . ")" : "" + ); + } + else + { + $fullname = ""; + } + + return $fullname; + } + + public function getnewslettersbsc($subsc = array()) + { + $where = ""; + + if (count($subsc) > 0) + { + $sbscids = implode(",", $subsc); + $where = " AND ns.subscription_id IN (" . $sbscids . ")"; + } + + $query = 'SELECT ns.*,ns.name as subscribername,n.name' + . ' FROM ' . $this->_table_prefix . 'newsletter_subscription as ns,' . $this->_table_prefix + . 'newsletter as n WHERE ns.newsletter_id=n.newsletter_id ' + . $where; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function getUserFromEmail($email) + { + $query = "SELECT * FROM " . $this->_table_prefix . "users_info AS uf " + . "WHERE uf.address_type='BT' " + . "AND uf.user_email='" . $email . "' "; + $this->_db->setQuery($query); + $list = $this->_db->loadObject(); + + return $list; + } +} diff --git a/component/admin/models/opsearch.php b/component/admin/models/opsearch.php new file mode 100644 index 00000000000..e1bd65e0b69 --- /dev/null +++ b/component/admin/models/opsearch.php @@ -0,0 +1,106 @@ +getState('filter_user'); + $id .= ':' . $this->getState('filter_product'); + $id .= ':' . $this->getState('filter_status'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'order_item_name', $direction = '') + { + $filter_user = $this->getUserStateFromRequest($this->context . '.filter_user', 'filter_user', 0); + $filter_product = $this->getUserStateFromRequest($this->context . '.filter_product', 'filter_product', 0); + $filter_status = $this->getUserStateFromRequest($this->context . '.filter_status', 'filter_status', 0); + + $this->setState('filter_user', $filter_user); + $this->setState('filter_product', $filter_product); + $this->setState('filter_status', $filter_status); + + parent::populateState($ordering, $direction); + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + $filter_user = $this->getState('filter_user', ''); + $filter_product = $this->getState('filter_product', ''); + $filter_status = $this->getState('filter_status', ''); + + $where = ''; + + if ($filter_user) + { + $where .= 'AND op.user_info_id="' . $filter_user . '" '; + } + + if ($filter_product) + { + $where .= 'AND op.product_id ="' . $filter_product . '" '; + } + + if ($filter_status) + { + $where .= 'AND op.order_status="' . $filter_status . '" '; + } + + $query = 'SELECT op.*, CONCAT(ouf.firstname," ",ouf.lastname) AS fullname, ouf.company_name FROM #__redshop_order_item AS op ' + . 'LEFT JOIN #__redshop_order_users_info as ouf ON ouf.order_id=op.order_id AND ouf.address_type="BT" ' + . 'WHERE 1=1 ' + . $where + . $orderby; + + return $query; + } + + public function getuserlist($name = 'userlist', $selected = '', $attributes = ' class="inputbox" size="1" ') + { + $query = "SELECT uf.users_info_id AS value, CONCAT(uf.firstname,' ',uf.lastname) AS text FROM #__redshop_users_info AS uf " + . "WHERE uf.address_type='BT' AND (uf.firstname <> '' OR uf.lastname <> '') " + . "ORDER BY text "; + $userlist = $this->_getList($query); + $types[] = JHTML::_('select.option', '0', '- ' . JText::_('COM_REDSHOP_SELECT_USER') . ' -'); + $types = array_merge($types, $userlist); + $mylist['userlist'] = JHTML::_('select.genericlist', $types, $name, $attributes, 'value', 'text', $selected); + + return $mylist['userlist']; + } +} diff --git a/component/admin/models/order.php b/component/admin/models/order.php new file mode 100644 index 00000000000..2d81f2b9a2a --- /dev/null +++ b/component/admin/models/order.php @@ -0,0 +1,520 @@ +getState('filter'); + $id .= ':' . $this->getState('filter_by'); + $id .= ':' . $this->getState('filter_status'); + $id .= ':' . $this->getState('filter_payment_status'); + $id .= ':' . $this->getState('filter_from_date'); + $id .= ':' . $this->getState('filter_to_date'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'o.order_id', $direction = 'desc') + { + $filterStatus = $this->getUserStateFromRequest($this->context . 'filter_status', 'filter_status', '', 'string'); + $filterPaymentStatus = $this->getUserStateFromRequest($this->context . 'filter_payment_status', 'filter_payment_status', '', ''); + $filter = $this->getUserStateFromRequest($this->context . 'filter', 'filter', ''); + $filterBy = $this->getUserStateFromRequest($this->context . 'filter_by', 'filter_by', '', ''); + $filterFromDate = $this->getUserStateFromRequest($this->context . 'filter_from_date', 'filter_from_date', '', ''); + $filterToDate = $this->getUserStateFromRequest($this->context . 'filter_to_date', 'filter_to_date', '', ''); + + $this->setState('filter', $filter); + $this->setState('filter_by', $filterBy); + $this->setState('filter_status', $filterStatus); + $this->setState('filter_payment_status', $filterPaymentStatus); + $this->setState('filter_from_date', $filterFromDate); + $this->setState('filter_to_date', $filterToDate); + + parent::populateState($ordering, $direction); + } + + /** + * Method for build query + * + * @return JDatabaseQuery + * @throws Exception + */ + public function _buildQuery() + { + $app = JFactory::getApplication(); + $db = $this->getDbo(); + + $query = $db->getQuery(true) + ->select( + array( + 'o.*', + $db->qn('uf.lastname'), + $db->qn('uf.firstname'), + $db->qn('uf.user_email'), + $db->qn('uf.is_company'), + $db->qn('uf.company_name'), + $db->qn('uf.ean_number'), + $db->qn('os.order_status_name') + ) + ) + ->from($db->qn('#__redshop_orders', 'o')) + ->leftjoin( + $db->qn('#__redshop_order_users_info', 'uf') + . ' ON ' . $db->qn('o.order_id') . ' = ' . $db->qn('uf.order_id') + ) + ->innerJoin($db->qn('#__redshop_order_status', 'os') . ' ON ' . $db->qn('os.order_status_code') . '=' . $this->_db->qn('o.order_status')) +// ->where($db->qn('uf.address_type') . '=' . $db->q('BT')) + ->group($db->qn('o.order_id')); + + $filterBy = $this->getState('filter_by'); + + // Filter: From date. + $filterFromDate = $this->getState('filter_from_date'); + + if ($filterFromDate) + { + $query->where($db->qn('o.cdate') . '>=' . strtotime($filterFromDate)); + } + + // Filter: To date + $filterToDate = $this->getState('filter_to_date'); + + if ($filterToDate) + { + // Adding 24 hours to the end date to consider whole end day + $query->where($db->qn('o.cdate') . ' <= ' . (strtotime($filterToDate) + 24 * 3600)); + } + + // Filter: order status + $filterStatus = $this->getState('filter_status'); + + if ($filterStatus) + { + $query->where($db->qn('o.order_status') . ' = ' . $db->q($filterStatus)); + } + + // Filter: Order payment status + $filterPaymentStatus = $this->getState('filter_payment_status'); + + if ($filterPaymentStatus) + { + $query->where($db->qn('o.order_payment_status') . ' = ' . $db->q($filterPaymentStatus)); + } + + // Filter + $filter = $this->getState('filter'); + + if ($filter) + { + $filter = str_replace(' ', '', $filter); + + if ($filterBy == 'orderid') + { + $query->where($db->qn('o.order_id') . ' LIKE ' . $db->q('%' . $filter . '%')); + } + elseif ($filterBy == 'ordernumber') + { + $query->where($db->qn('o.order_number') . ' LIKE ' . $db->q('%' . $filter . '%')); + } + elseif ($filterBy == 'fullname') + { + $query->where( + "REPLACE(CONCAT(" . $db->qn('uf.firstname') . ", " + . $db->qn('uf.lastname') . "), ' ', '') LIKE " . $db->q('%' . $filter . '%') + ); + } + elseif ($filterBy == 'useremail') + { + $query->where($db->qn('uf.user_email') . ' LIKE ' . $db->q('%' . $filter . '%')); + } + // $filter_by == 'all' + else + { + $query->where( + "(REPLACE(CONCAT(" . $db->qn('uf.firstname') . ", " + . $db->qn('uf.lastname') . "), ' ', '') LIKE " . $db->q('%' . $filter . '%') + . " OR " . $db->qn('o.order_id') . " LIKE " . $db->q('%' . $filter . '%') + . " OR " . $db->qn('o.order_number') . " LIKE " . $db->q('%' . $filter . '%') + . " OR " . $db->qn('o.referral_code') . " LIKE " . $db->q('%' . $filter . '%') + . " OR " . $db->qn('uf.user_email') . " LIKE " . $db->q('%' . $filter . '%') + . ")" + ); + } + } + + $orderIds = $app->input->get('cid', array(), 'array'); + $orderIds = \Joomla\Utilities\ArrayHelper::toInteger($orderIds); + $orderIds = array_filter(array_values($orderIds)); + + if (!empty($orderIds)) + { + $query->where($db->qn('o.order_id') . ' IN (' . implode(',', $orderIds) . ')'); + } + + if ('labellisting' == $app->input->getCmd('layout')) + { + $query->where($db->qn('o.order_label_create') . '=1'); + } + + $filterOrderDir = $this->getState('list.direction'); + $filterOrder = $this->getState('list.ordering'); + $query->order($db->escape($filterOrder . ' ' . $filterOrderDir)); + + return $query; + } + + /** + * Method for export data. + * + * @param array $cid List of order ID + * + * @return array + */ + public function export_data($cid = array()) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('DISTINCT(' . $db->qn('o.cdate') . ')') + ->select('o.*') + ->select('ouf.*') + ->from($db->qn('#__redshop_orders', 'o')) + ->leftJoin($db->qn('#__redshop_order_users_info', 'ouf') . ' ON ' . $db->qn('o.order_id') . ' = ' . $db->qn('ouf.order_id')) + ->where($db->qn('ouf.address_type') . ' = ' . $db->quote('BT')) + ->order($db->qn('o.order_id') . ' DESC'); + + if (!empty($cid)) + { + $cid = \Joomla\Utilities\ArrayHelper::toInteger($cid); + $query->where($db->qn('o.order_id') . ' IN (' . implode(',', $cid) . ')'); + } + + return $this->_getList($query); + } + + /** + * Method for update download setting + * + * @param integer $did Download ID + * @param integer $limit Limiit + * @param integer $enddate End date. + * + * @return boolean + */ + public function updateDownloadSetting($did, $limit, $enddate) + { + $db = $this->getDbo(); + + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_product_download')) + ->set($db->qn('download_max') . ' = ' . $limit) + ->set($db->qn('end_date') . ' = ' . $enddate) + ->where($db->qn('download_id') . ' = ' . $did); + + return $db->setQuery($query)->execute(); + } + + /** + * GLS Export + * + * @param array $cid sOrder Ids + * + * @return void + * @throws Exception + */ + public function gls_export($cid) + { + ob_clean(); + + // Start the output + $outputCsv = fopen('php://output', 'w'); + + if ($outputCsv === false) + { + JFactory::getApplication()->close(); + } + + $ordersInfo = $this->getOrdersDetail($cid); + + foreach ($ordersInfo as $order) + { + $details = Redshop\Shipping\Rate::decrypt($order->ship_method_id); + + if (strtolower($details[0]) != 'plgredshop_shippingdefault_shipping_gls' || $order->shop_id == '') + { + continue; + } + + $orderProducts = RedshopHelperOrder::getOrderItemDetail($order->order_id); + $billingDetails = RedshopEntityOrder::getInstance($order->order_id)->getBilling(); + + $totalWeight = 0; + + foreach ($orderProducts as $orderProduct) + { + $weight = (float) $this->getProductWeight($orderProduct->product_id); + $totalWeight += ($weight * (float) $orderProduct->product_quantity); + } + + $unitRatio = \Redshop\Helper\Utility::getUnitConversation('kg', Redshop::getConfig()->get('DEFAULT_WEIGHT_UNIT')); + + if ($unitRatio != 0) + { + // Converting weight in kg + $totalWeight = $totalWeight * $unitRatio; + } + + $parcelType = 'A'; + $shopDetail = explode("|", $order->shop_id); + $userPhone = explode("###", $order->shop_id); + $shopDetailTemp = explode("###", $shopDetail[7]); + $shopDetail[7] = $shopDetailTemp[0]; + $shopDetail[2] = str_replace(',', '-', $shopDetail[2]); + + $row = array( + $order->order_number, + $shopDetail[1], + $shopDetail[2], + 'Pakkeshop: ' . $shopDetail[0], + $shopDetail[3], + $shopDetail[7], + '008', + date("d-m-Y", $order->cdate), + $totalWeight, + 1, + '', + '', + $parcelType, + 'Z' // Shippment Type + ); + + $userDetail = array(); + + if (!empty($order->ship_method_id)) + { + $userDetail = array( + $billingDetails->get('firstname') . ' ' . $billingDetails->get('lastname'), + substr($order->customer_note, 0, 29), // GLS only support max 29 characters + Redshop::getConfig()->get('GLS_CUSTOMER_ID'), + $billingDetails->get('user_email'), + $userPhone[1] + ); + } + + $row = array_map('utf8_decode', array_merge($row, $userDetail)); + + foreach ($row as &$column) + { + $column = '"' . $column . '"'; + } + + unset($column); + + // Output CSV line + fputcsv($outputCsv, $row, ",", " "); + } + + header('Content-Type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename=redshop_gls_order_export.csv'); + header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); + + JFactory::getApplication()->close(); + } + + /** + * Business GLS Export + * + * @param array $cid Order Ids + * + * @return void + * @throws Exception + */ + public function business_gls_export($cid) + { + ob_clean(); + + // Start the ouput + $outputCsv = fopen('php://output', 'w'); + + if ($outputCsv === false) + { + JFactory::getApplication()->close(); + } + + $ordersInfo = $this->getOrdersDetail($cid); + + foreach ($ordersInfo as $order) + { + $details = Redshop\Shipping\Rate::decrypt($order->ship_method_id); + + if (strtolower($details[0]) != 'plgredshop_shippingdefault_shipping_glsbusiness') + { + continue; + } + + $orderProducts = RedshopHelperOrder::getOrderItemDetail($order->order_id); + $shippingDetails = RedshopEntityOrder::getInstance($order->order_id)->getShipping(); + $billingDetails = RedshopEntityOrder::getInstance($order->order_id)->getBilling(); + $totalWeight = 0; + + foreach ($orderProducts as $orderProduct) + { + $weight = (float) $this->getProductWeight($orderProduct->product_id); + $totalWeight += ($weight * (float) $orderProduct->product_quantity); + } + + $unitRatio = \Redshop\Helper\Utility::getUnitConversation('kg', Redshop::getConfig()->get('DEFAULT_WEIGHT_UNIT')); + + if ($unitRatio != 0) + { + // Converting weight in kg + $totalWeight = $totalWeight * $unitRatio; + } + + // Initialize row + $row = array($order->order_number); + $extraFieldData = RedshopHelperExtrafields::getSectionFieldList(RedshopHelperExtrafields::SECTION_SHIPPING_GATEWAY, 1); + $extraInfo = array(); + + foreach ($extraFieldData as $extraFieldDatum) + { + $extraFieldResult = RedshopHelperExtrafields::getData( + $extraFieldDatum->field_id, + RedshopHelperExtrafields::SECTION_SHIPPING_GATEWAY, + $order->order_id + ); + + if ($extraFieldResult->data_txt != "" && $extraFieldDatum->field_show_in_front == 1) + { + $extraInfo[] = $extraFieldResult->data_txt; + } + } + + $rowAppend = array( + '8', + date("d-m-Y", $order->cdate), + $totalWeight, + 1, + '', + '', + 'A', + 'A', + $billingDetails->get('firstname') . ' ' . $billingDetails->get('lastname'), + $order->customer_note, + Redshop::getConfig()->get('GLS_CUSTOMER_ID'), + $billingDetails->get('user_email'), + $shippingDetails->get('phone') + ); + + $row = array_map('utf8_decode', array_merge($row, $extraInfo, $rowAppend)); + + foreach ($row as &$column) + { + $column = '"' . $column . '"'; + } + + unset($column); + + // Output CSV line + fputcsv($outputCsv, $row, ",", " "); + } + + header('Content-Type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename=redshop_gls_business_order_export.csv'); + header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); + + JFactory::getApplication()->close(); + } + + /** + * Get Order details of the ids + * + * @param array $orderIds Order Information Ids + * + * @return array Information of the orders in array + */ + public function getOrdersDetail($orderIds) + { + $orderIds = Joomla\Utilities\ArrayHelper::toInteger($orderIds); + + // Init variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_orders')); + + if ($orderIds[0] != 0) + { + $query->where($db->qn('order_id') . ' IN(' . implode(',', $orderIds) . ')'); + } + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Get Product weight + * + * @param integer $productId Product Id + * + * @return integer Product Weight + * @throws Exception + */ + public function getProductWeight($productId) + { + return RedshopHelperProduct::getProductById($productId)->weight; + } +} diff --git a/component/admin/models/order_detail.php b/component/admin/models/order_detail.php new file mode 100644 index 00000000000..058b1926880 --- /dev/null +++ b/component/admin/models/order_detail.php @@ -0,0 +1,1273 @@ +_table_prefix = '#__redshop_'; + + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + + $this->setId((int) $array[0]); + + JPluginHelper::importPlugin('redshop'); + + $this->_dispatcher = RedshopHelperUtility::getDispatcher(); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $this->_data = RedshopEntityOrder::getInstance($this->_id)->getItem(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->order_id = 0; + $detail->user_id = null; + $detail->order_number = null; + $detail->user_info_id = null; + $detail->order_total = null; + $detail->order_subtotal = null; + $detail->order_tax = null; + $detail->order_tax_details = null; + $detail->order_shipping = null; + $detail->order_shipping_tax = null; + $detail->coupon_discount = null; + $detail->payment_discount = null; + $detail->order_discount = null; + $detail->order_status = null; + $detail->cdate = null; + $detail->mdate = null; + $detail->ship_method_id = null; + $detail->customer_note = null; + $detail->ip_address = null; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + public function delete($cid = array()) + { + $producthelper = productHelper::getInstance(); + + if (count($cid)) + { + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + $orderdata = $this->getTable('order_detail'); + $orderdata->load($cid[$i]); + RedshopEconomic::deleteInvoiceInEconomic($orderdata); + } + } + + $cids = implode(',', $cid); + $order_item = RedshopHelperOrder::getOrderItemDetail($cids); + + for ($i = 0, $in = count($order_item); $i < $in; $i++) + { + $quntity = $order_item[$i]->product_quantity; + + $order_id = $order_item[$i]->order_id; + $order_detail = RedshopEntityOrder::getInstance($order_id)->getItem(); + + if ($order_detail->order_payment_status == "Unpaid") + { + // Update stock roommanageStockAmount + RedshopHelperStockroom::manageStockAmount($order_item[$i]->product_id, $quntity, $order_item[$i]->stockroom_id); + } + + $producthelper->makeAttributeOrder($order_item[$i]->order_item_id, 0, $order_item[$i]->product_id, 1); + $query = "DELETE FROM `" . $this->_table_prefix . "order_attribute_item` " + . "WHERE `order_item_id` = " . $order_item[$i]->order_item_id; + $this->_db->setQuery($query); + $this->_db->execute(); + + $query = "DELETE FROM `" . $this->_table_prefix . "order_acc_item` " + . "WHERE `order_item_id` = " . $order_item[$i]->order_item_id; + $this->_db->setQuery($query); + $this->_db->execute(); + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'orders WHERE order_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'order_item WHERE order_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'order_payment WHERE order_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'order_users_info WHERE order_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $quotation = RedshopHelperQuotation::getQuotationWithOrder($cids); + + for ($q = 0, $qn = count($quotation); $q < $qn; $q++) + { + $quotation_item = RedshopHelperQuotation::getQuotationProduct($quotation[$q]->quotation_id); + + for ($j = 0, $jn = count($quotation_item); $j < $jn; $j++) + { + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_fields_data ' + . 'WHERE quotation_item_id=' . $quotation_item[$j]->quotation_item_id; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_item ' + . 'WHERE quotation_id=' . $quotation[$q]->quotation_id; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation WHERE order_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function getProducts($order_id) + { + $query = "SELECT DISTINCT( p.product_id ) as value,p.product_name as text,oi.order_id FROM " + . $this->_table_prefix . "product as p ," . $this->_table_prefix + . "order_item as oi WHERE oi.product_id != p.product_id AND oi.order_id = " . $order_id; + $this->_db->setQuery($query); + $products = $this->_db->loadObjectlist(); + + return $products; + } + + public function neworderitem($data, $quantity, $order_item_id) + { + $producthelper = productHelper::getInstance(); + $rsCarthelper = rsCarthelper::getInstance(); + + // Get Order Info + $orderdata = $this->getTable('order_detail'); + $orderdata->load($this->_id); + + $item = $data['order_item']; + + // Get product Info + + // Set Order Item Info + $orderitemdata = $this->getTable('order_item_detail'); + $orderitemdata->load($order_item_id); + + $user_id = $orderdata->user_id; + + for ($i = 0, $in = count($item); $i < $in; $i++) + { + $product_id = $item[$i]->product_id; + $product_excl_price = $item[$i]->prdexclprice; + $product_price = $item[$i]->productprice; + + // Attribute price added + $generateAttributeCart = Redshop\Cart\Helper::generateAttribute((array) $item[$i], $user_id); + $retAttArr = $producthelper->makeAttributeCart($generateAttributeCart, $product_id, $user_id, 0, $quantity); + $product_attribute = $retAttArr[0]; + + // Accessory price + $generateAccessoryCart = $rsCarthelper->generateAccessoryArray((array) $item[$i], $user_id); + $retAccArr = $producthelper->makeAccessoryCart($generateAccessoryCart, $product_id, $user_id); + $product_accessory = $retAccArr[0]; + + $wrapper_price = 0; + $wrapper_vat = 0; + + if ($item[$i]->wrapper_data != 0 && $item[$i]->wrapper_data != '') + { + $wrapper = $producthelper->getWrapper($product_id, $item[$i]->wrapper_data); + + if (count($wrapper) > 0) + { + if ($wrapper[0]->wrapper_price > 0) + { + $wrapper_vat = $producthelper->getProducttax($product_id, $wrapper[0]->wrapper_price, $user_id); + } + + $wrapper_price = $wrapper[0]->wrapper_price + $wrapper_vat; + } + } + + $product = Redshop::product((int) $product_id); + + $updatestock = RedshopHelperStockroom::updateStockroomQuantity($product_id, $quantity); + $stockroom_id_list = $updatestock['stockroom_list']; + $stockroom_quantity_list = $updatestock['stockroom_quantity_list']; + + $orderitemdata->stockroom_id = $stockroom_id_list; + $orderitemdata->stockroom_quantity = $stockroom_quantity_list; + $orderitemdata->order_item_id = 0; + $orderitemdata->order_id = $this->_id; + $orderitemdata->user_info_id = $orderdata->user_info_id; + $orderitemdata->supplier_id = $product->manufacturer_id; + $orderitemdata->product_id = $product_id; + $orderitemdata->order_item_sku = $product->product_number; + $orderitemdata->order_item_name = $product->product_name; + $orderitemdata->product_quantity = $quantity; + $orderitemdata->product_item_price = $product_price; + $orderitemdata->product_item_price_excl_vat = $product_excl_price; + $orderitemdata->product_final_price = $product_price * $quantity; + $orderitemdata->order_item_currency = Redshop::getConfig()->get('REDCURRENCY_SYMBOL'); + $orderitemdata->order_status = "P"; + $orderitemdata->cdate = time(); + $orderitemdata->mdate = time(); + $orderitemdata->product_attribute = $product_attribute; + $orderitemdata->product_accessory = $product_accessory; + $orderitemdata->wrapper_id = $item[$i]->wrapper_data; + $orderitemdata->wrapper_price = $wrapper_price; + + if (RedshopHelperProductDownload::checkDownload($product_id)) + { + $medianame = $producthelper->getProductMediaName($product_id); + + for ($j = 0, $jn = count($medianame); $j < $jn; $j++) + { + $sql = "INSERT INTO " . $this->_table_prefix . "product_download " + . "(product_id, user_id, order_id, end_date, download_max, download_id, file_name) " + . "VALUES('" . $product_id . "', '" . $user_id . "', '" . $this->_id . "', " + . "'" . (time() + (Redshop::getConfig()->get('PRODUCT_DOWNLOAD_DAYS') * 23 * 59 * 59)) . "', '" . Redshop::getConfig()->get('PRODUCT_DOWNLOAD_LIMIT') . "', " + . "'" . md5(uniqid(mt_rand(), true)) . "', '" . $medianame[$j]->media_name . "')"; + $this->_db->setQuery($sql); + $this->_db->execute(); + } + } + + if (!$orderitemdata->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + /** my accessory save in table start */ + if (count($generateAccessoryCart) > 0) + { + $attArr = $generateAccessoryCart; + + for ($a = 0, $an = count($attArr); $a < $an; $a++) + { + $accessory_vat_price = 0; + $accessory_attribute = ""; + $accessory_id = $attArr[$a]['accessory_id']; + $accessory_name = $attArr[$a]['accessory_name']; + $accessory_price = $attArr[$a]['accessory_price']; + $accessory_org_price = $accessory_price; + + if ($accessory_price > 0) + { + $accessory_vat_price = $producthelper->getProductTax($product_id, $accessory_price, $user_id); + } + + $attchildArr = $attArr[$a]['accessory_childs']; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $attribute_id = $attchildArr[$j]['attribute_id']; + $accessory_attribute .= urldecode($attchildArr[$j]['attribute_name']) . ":
    "; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $orderitemdata->order_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $accessory_id; + $rowattitem->section_name = $attchildArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 1; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $propArr = $attchildArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = $producthelper->getProducttax($product_id, $propArr[$k]['property_price'], $user_id); + } + + $property_id = $propArr[$k]['property_id']; + $accessory_attribute .= urldecode($propArr[$k]['property_name']) . " (" . $propArr[$k]['property_oprand'] + . $producthelper->getProductFormattedPrice($propArr[$k]['property_price'] + $section_vat) . ")
    "; + $subpropArr = $propArr[$k]['property_childs']; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $orderitemdata->order_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = $producthelper->getProducttax($product_id, $subpropArr[$l]['subproperty_price'], $user_id); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + $accessory_attribute .= urldecode($subpropArr[$l]['subproperty_name']) . " (" + . $subpropArr[$l]['subproperty_oprand'] + . $producthelper->getProductFormattedPrice($subpropArr[$l]['subproperty_price'] + $section_vat) + . ")
    "; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $orderitemdata->order_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + + $accdata = $this->getTable('accessory_detail'); + + if ($accessory_id > 0) + { + $accdata->load($accessory_id); + } + + $accessoryproduct = Redshop::product((int) $accdata->child_product_id); + $rowaccitem = $this->getTable('order_acc_item'); + $rowaccitem->order_item_acc_id = 0; + $rowaccitem->order_item_id = $orderitemdata->order_item_id; + $rowaccitem->product_id = $accessory_id; + $rowaccitem->order_acc_item_sku = $accessoryproduct->product_number; + $rowaccitem->order_acc_item_name = $accessory_name; + $rowaccitem->order_acc_price = $accessory_org_price; + $rowaccitem->order_acc_vat = $accessory_vat_price; + $rowaccitem->product_quantity = $quantity; + $rowaccitem->product_acc_item_price = $accessory_price; + $rowaccitem->product_acc_final_price = ($accessory_price * $quantity); + $rowaccitem->product_attribute = $accessory_attribute; + + if ($accessory_id > 0) + { + if (!$rowaccitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + + /** my attribute save in table start */ + if (count($generateAttributeCart) > 0) + { + $attArr = $generateAttributeCart; + + for ($j = 0, $jn = count($attArr); $j < $jn; $j++) + { + $attribute_id = $attArr[$j]['attribute_id']; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $orderitemdata->order_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $product_id; + $rowattitem->section_name = $attArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 0; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $propArr = $attArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = $producthelper->getProducttax($product_id, $propArr[$k]['property_price']); + } + + $property_id = $propArr[$k]['property_id']; + /** product property STOCKROOM update start */ + RedshopHelperStockroom::updateStockroomQuantity($property_id, $quantity, "property"); + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $orderitemdata->order_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = $producthelper->getProducttax($product_id, $subpropArr[$l]['subproperty_price'], $user_id); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + /** product subproperty STOCKROOM update start */ + $updatestock = RedshopHelperStockroom::updateStockroomQuantity($subproperty_id, $quantity, "subproperty"); + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $orderitemdata->order_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + } + + // Store userfields + $userfields = $item[$i]->extrafieldname; + $userfields_id = $item[$i]->extrafieldId; + + for ($ui = 0, $countUserField = count($userfields); $ui < $countUserField; $ui++) + { + RedshopHelperProduct::insertProductUserField($userfields_id[$ui], $orderitemdata->order_item_id, 12, $userfields[$ui]); + } + } + + if ($orderitemdata->order_item_id > 0) + { + $totalItemVat = $orderitemdata->product_item_price - $orderitemdata->product_item_price_excl_vat; + + $orderdata->order_tax = $orderdata->order_tax + ($totalItemVat * $orderitemdata->product_quantity); + $orderdata->order_total = $orderdata->order_total + $orderitemdata->product_final_price; + $orderdata->order_subtotal = $orderdata->order_subtotal + $orderitemdata->product_final_price; + $orderdata->mdate = time(); + + // Update order detail + if (!$orderdata->store()) + { + return false; + } + + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + RedshopEconomic::renewInvoiceInEconomic($orderdata); + } + + // Send mail from template + Redshop\Mail\Order::sendSpecialDiscountMail($this->_id); + } + + else + { + return false; + } + + $this->_dispatcher->trigger('onAfterAddNewOrderItem', array($orderdata)); + + return true; + } + + /** + * Method for delete single order item from order. + * + * @param array $data Array of data + * + * @return boolean + */ + public function delete_item($data) + { + $productId = $data['productid']; + $orderItemId = $data['order_item_id']; + + // Get Order Item Info + $orderItem = RedshopEntityOrder_Item::getInstance($orderItemId); + $orderItemQuantity = $orderItem->get('product_quantity'); + + // Get Order Info + $order = RedshopEntityOrder::getInstance($this->_id); + + // Update stock room + RedshopHelperStockroom::manageStockAmount( + $productId, $orderItem->get('product_quantity'), $orderItem->get('stockroom_id') + ); + + $db = $this->_db; + + // Delete order item + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_order_item')) + ->where($db->qn('order_item_id') . ' = ' . $orderItem->getId()); + $db->setQuery($query); + + unset($orderItem); + + if (!$db->execute()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $db->getErrorMsg()); + + return false; + } + + $this->updateAttributeItem($orderItemId, $orderItemQuantity); + + // Remove order item attribute + $query->clear() + ->delete($db->qn('#__redshop_order_attribute_item')) + ->where($db->qn('order_item_id') . ' = ' . $orderItemId); + $db->setQuery($query)->execute(); + + // Remove accessory of order item + $query->clear() + ->delete($db->qn('#__redshop_order_acc_item')) + ->where($db->qn('order_item_id') . ' = ' . $orderItemId); + $db->setQuery($query)->execute(); + + $this->/** @scrutinizer ignore-call */ + special_discount( + array('order_item_id' => $orderItemId, 'special_discount' => $order->get('special_discount')), + true + ); + + // Economic Integration start for invoice generate + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + RedshopEconomic::renewInvoiceInEconomic($order->getItem()); + } + + // Send mail from template ********************/ + Redshop\Mail\Order::sendSpecialDiscountMail($this->_id); + + return true; + } + + public function updateItem($data) + { + $order_item_id = $data['order_item_id']; + $orderitemdata = $this->getTable('order_item_detail'); + $orderitemdata->load($order_item_id); + $orderdata = $this->getTable('order_detail'); + $orderdata->load($this->_id); + $order_id = $this->_id; + $product_id = $orderitemdata->product_id; + $currentStock = RedshopHelperStockroom::getStockroomTotalAmount($product_id); + $user_id = $orderdata->user_id; + $productPrice = $data['update_price']; + $productPrice_new = 0; + + if ($productPrice < 0) + { + $productPrice_new = $productPrice; + $productPrice = $productPrice * -1; + } + + $customer_note = $data['customer_note']; + + $product_tax = 0; + + if ($productPrice > 0) + { + $product_tax = RedshopHelperProduct::getProductTax($product_id, $productPrice, $user_id); + } + + if ($productPrice_new < 0) + { + $product_tax = $product_tax * -1; + $productPrice = $productPrice_new; + } + + $new_added_qty = $data['quantity'] - $orderitemdata->product_quantity; + + if ($currentStock >= $new_added_qty || Redshop::getConfig()->get('USE_STOCKROOM') == 0) + { + $quantity = (int) $data['quantity']; + } + else + { + $quantity = (int) $orderitemdata->product_quantity; + } + + $product_item_price = $productPrice + $product_tax; + $product_item_price_excl_vat = $productPrice; + $product_final_price = $product_item_price * $quantity; + $subtotal = $product_item_price * $quantity; + + $OrderItems = RedshopHelperOrder::getOrderItemDetail($order_id); + $totalTax = $product_tax * $quantity; + + for ($i = 0, $in = count($OrderItems); $i < $in; $i++) + { + if ($order_item_id != $OrderItems[$i]->order_item_id) + { + $itemtax = $OrderItems[$i]->product_item_price - $OrderItems[$i]->product_item_price_excl_vat; + $totalTax = $totalTax + ($itemtax * $OrderItems[$i]->product_quantity); + $subtotal = $subtotal + ($OrderItems[$i]->product_item_price * $OrderItems[$i]->product_quantity); + } + + if ($order_item_id == $OrderItems[$i]->order_item_id) + { + $newquantity = $OrderItems[$i]->product_quantity - $quantity; + + if ($newquantity > 0) + { + RedshopHelperStockroom::manageStockAmount($product_id, $newquantity, $orderitemdata->stockroom_id); + } + elseif ($newquantity < 0) + { + $updatestock = RedshopHelperStockroom::updateStockroomQuantity($product_id, (-$newquantity)); + + $stockroom_id_list = $updatestock['stockroom_list']; + $stockroom_quantity_list = $updatestock['stockroom_quantity_list']; + $orderitemdata->stockroom_id = $stockroom_id_list; + $orderitemdata->stockroom_quantity = $stockroom_quantity_list; + } + + $this->updateAttributeItem($order_item_id, $newquantity); + } + } + + $total = $subtotal + $orderdata->order_shipping - abs($orderdata->order_discount); + $orderitemdata->product_item_price = $product_item_price; + $orderitemdata->product_item_price_excl_vat = $product_item_price_excl_vat; + $orderitemdata->product_final_price = $product_final_price; + $orderitemdata->product_quantity = $quantity; + $orderitemdata->customer_note = $customer_note; + $orderdata->order_tax = $totalTax; + $orderdata->order_total = $total; + $orderdata->order_subtotal = $subtotal; + + if ($orderitemdata->store()) + { + $this->_dispatcher->trigger('onAfterUpdateOrderItem', array($orderitemdata)); + + if (!$orderdata->store()) + { + return false; + } + + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + RedshopEconomic::renewInvoiceInEconomic($orderdata); + } + + $tmpArr['special_discount'] = $orderdata->special_discount; + $this->/** @scrutinizer ignore-call */ special_discount($tmpArr, true); + } + else + { + return false; + } + + RedshopHelperOrder::updateStatus(); + + return true; + } + + public function updateAttributeItem($order_item_id, $quantity = 0) + { + $attArr = RedshopHelperOrder::getOrderItemAttributeDetail($order_item_id, 0, "attribute"); + + /** my attribute save in table start */ + for ($j = 0, $jn = count($attArr); $j < $jn; $j++) + { + $propArr = RedshopHelperOrder::getOrderItemAttributeDetail($order_item_id, 0, "property", $attArr[$j]->section_id); + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $propitemdata = $this->getTable('order_attribute_item'); + $propitemdata->load($propArr[$k]->order_att_item_id); + + /** product property STOCKROOM update start */ + if ($quantity > 0) + { + RedshopHelperStockroom::manageStockAmount($propitemdata->section_id, $quantity, $propArr[$k]->stockroom_id, "property"); + } + elseif ($quantity < 0) + { + RedshopHelperStockroom::updateStockroomQuantity($propitemdata->section_id, (-$quantity), "property"); + } + + $subpropArr = RedshopHelperOrder::getOrderItemAttributeDetail($order_item_id, 0, "subproperty", $propitemdata->section_id); + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $subpropitemdata = $this->getTable('order_attribute_item'); + $subpropitemdata->load($subpropArr[$l]->order_att_item_id); + + if ($quantity > 0) + { + RedshopHelperStockroom::manageStockAmount($subpropitemdata->section_id, $quantity, $subpropArr[$l]->stockroom_id, "subproperty"); + } + elseif ($quantity < 0) + { + RedshopHelperStockroom::updateStockroomQuantity($subpropitemdata->section_id, (-$quantity), "subproperty"); + } + } + } + } + + return true; + } + + public function update_discount($data) + { + // Get Order Info + $orderData = $this->getTable('order_detail'); + $orderData->load($this->_id); + + $orderItems = RedshopHelperOrder::getOrderItemDetail($this->_id); + $update_discount = abs($data['update_discount']); + + if ($update_discount == $orderData->order_discount) + { + return false; + } + + $subtotal = 0; + + if ($orderItems) + { + for ($i = 0, $in = count($orderItems); $i < $in; $i++) + { + $subtotal = $subtotal + ($orderItems[$i]->product_item_price * $orderItems[$i]->product_quantity); + } + } + + $temporder_total = $subtotal + $orderData->order_discount + $orderData->special_discount_amount; + + if ($update_discount > $temporder_total) + { + $update_discount = $subtotal; + } + + if (Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT') == '0' && Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') && $update_discount != "0.00" && $orderData->order_tax && !empty($update_discount)) + { + $Discountvat = (Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') * $update_discount); + $update_discount = $update_discount + $Discountvat; + } + + if (abs($data['update_discount']) == 0) + { + $order_total = ($subtotal + $orderData->order_shipping) - ($orderData->special_discount_amount); + } + else + { + $order_total = ($subtotal + $orderData->order_shipping) - ($update_discount) - ($orderData->special_discount_amount); + } + + $orderData->order_total = $order_total; + $orderData->order_tax = $orderData->order_tax + $orderData->order_discount_vat - $Discountvat; + $orderData->order_discount_vat = $Discountvat; + $orderData->order_discount = $update_discount; + $orderData->mdate = time(); + + if (!$orderData->store()) + { + return false; + } + + $this->_dispatcher->trigger('onAfterUpdateDiscount', array($orderData)); + + // Economic Integration start for invoice generate + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + RedshopEconomic::renewInvoiceInEconomic($orderData); + } + + // Send mail from template + Redshop\Mail\Order::sendSpecialDiscountMail($this->_id); + + return true; + } + + /** + * Method for re-calculate price of order when update order item. + * + * @param array $data Array data of updated order + * @param boolean $chk True for check + * + * @return boolean + */ + public function special_discount($data, $chk = false) + { + $orderData = $this->getTable('order_detail'); + $orderData->load($this->_id); + + $orderItems = RedshopHelperOrder::getOrderItemDetail($this->_id, 0, 0, true); + $orderItemId = isset($data['order_item_id']) ? $data['order_item_id'] : 0; + + if (!$orderData->special_discount) + { + $orderData->special_discount = 0; + } + + if (!$orderData->special_discount_amount) + { + $orderData->special_discount_amount = 0; + } + + if ($data['special_discount'] == $orderData->special_discount && $chk != true) + { + return false; + } + + $specialDiscount = $data['special_discount']; + $orderSubTotal = 0; + $orderSubTotalNoVat = 0; + $orderTax = $orderData->order_tax; + $orderDetailTax = array(); + + foreach ($orderItems as $orderItem) + { + if ($orderItemId != $orderItem->order_item_id) + { + $orderSubTotalNoVat += $orderItem->product_item_price_excl_vat * $orderItem->product_quantity; + $orderSubTotal += $orderItem->product_item_price * $orderItem->product_quantity; + } + + $orderDetailTax[] = ((float) $orderItem->product_item_price - (float) $orderItem->product_item_price_excl_vat) * $orderItem->product_quantity; + } + + if (!empty($orderDetailTax)) + { + $orderTax = array_sum($orderDetailTax); + } + + $discountPrice = ($orderSubTotal * $specialDiscount) / 100; + $orderData->special_discount = $specialDiscount; + $orderData->special_discount_amount = $discountPrice; + + $orderData->order_total = $orderSubTotal + $orderData->order_shipping - $discountPrice - $orderData->order_discount; + $orderData->order_subtotal = $orderSubTotal; + $orderData->order_tax = $orderTax; + $orderData->mdate = time(); + + if (!$orderData->store()) + { + return false; + } + + $this->_dispatcher->trigger('onAfterUpdateSpecialDiscount', array($orderData)); + + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + RedshopEconomic::renewInvoiceInEconomic($orderData); + } + + // Send mail from template + Redshop\Mail\Order::sendSpecialDiscountMail($this->_id); + + return true; + } + + public function update_shippingrates($data) + { + // Get Order Info + $orderdata = $this->getTable('order_detail'); + $orderdata->load($this->_id); + + if ($data['shipping_rate_id'] != "") + { + // Get Shipping rate info Info + $neworder_shipping = Redshop\Shipping\Rate::decrypt($data['shipping_rate_id']); + + if ($data['shipping_rate_id'] != $orderdata->ship_method_id || $neworder_shipping[0] == 'plgredshop_shippingdefault_shipping_gls') + { + if (count($neworder_shipping) > 4) + { + // Shipping_rate_value + $orderdata->order_total = $orderdata->order_total - $orderdata->order_shipping + $neworder_shipping[3]; + $orderdata->order_shipping = $neworder_shipping[3]; + $orderdata->ship_method_id = $data['shipping_rate_id']; + $orderdata->order_shipping_tax = (isset($neworder_shipping[6]) && $neworder_shipping[6]) ? $neworder_shipping[6] : 0; + $orderdata->mdate = time(); + $orderdata->shop_id = $data['shop_id'] . "###" . $data['gls_mobile'] . "###" . $data['gls_zipcode']; + + if (!$orderdata->store()) + { + return false; + } + + // Economic Integration start for invoice generate + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + RedshopEconomic::renewInvoiceInEconomic($orderdata); + } + } + } + } + + $this->_dispatcher->trigger('onAfterUpdateShippingRates', array($orderdata)); + + return true; + } + + public function updateShippingAdd($data) + { + $row = $this->getTable('order_user_detail'); + $row->load($data['order_info_id']); + + $row->bind($data); + + if ($row->store()) + { + // Field_section 14 :Customer Address Section + $fieldSection = 14; + + if ($row->is_company == 1) + { + // Field_section 15 :Company Address Section + $fieldSection = 15; + } + + RedshopHelperExtrafields::extraFieldSave($data, $fieldSection, $row->users_info_id); + + $this->_dispatcher->trigger('onAfterUpdateShippingAddress', array($data)); + + return true; + } + else + { + return false; + } + } + + public function updateBillingAdd($data) + { + $row = $this->getTable('order_user_detail'); + $row->load($data['order_info_id']); + + $row->bind($data); + + if ($row->store()) + { + // Field_section 7 :Customer Address Section + $fieldSection = 7; + + if ($row->is_company == 1) + { + // Field_section 8 :Company Address Section + $fieldSection = 8; + } + + RedshopHelperExtrafields::extraFieldSave($data, $fieldSection, $row->users_info_id); + + $this->_dispatcher->trigger('onAfterUpdateBillingAddress', array($data)); + + return true; + } + else + { + return false; + } + } + + // Get order stats log + public function getOrderLog($order_id) + { + $database = JFactory::getDbo(); + $sql = "SELECT log.*,order_status_name " + . " FROM " . $this->_table_prefix . "order_status_log AS log , " . $this->_table_prefix . "order_status ros" + . " WHERE log.order_id=" . $order_id . " AND log.order_status=ros.order_status_code"; + $database->setQuery($sql); + + return $database->loadObjectList(); + } + + // Get Product subscription price + public function getProductSubscriptionDetail($product_id, $subscription_id) + { + $db = JFactory::getDbo(); + + $query = "SELECT * " + . " FROM " . $this->_table_prefix . "product_subscription" + . " WHERE " + . " product_id = " . $product_id . " And subscription_id = " . $subscription_id; + $db->setQuery($query); + + return $db->loadObject(); + } + + // Get User Product subscription detail + public function getUserProductSubscriptionDetail($order_item_id) + { + $db = JFactory::getDbo(); + $query = "SELECT * " + . " FROM " . $this->_table_prefix . "product_subscribe_detail" + . " WHERE " + . " order_item_id = " . $order_item_id; + $db->setQuery($query); + + return $db->loadObject(); + } + + // Get credit card detail + public function getccdetail($order_id) + { + $db = JFactory::getDbo(); + $query = "SELECT * " + . " FROM " . $this->_table_prefix . "order_payment " + . " WHERE " + . " order_id = " . $order_id + . " AND payment_method_class='rs_payment_localcreditcard'"; + $db->setQuery($query); + + return $db->loadObject(); + } + + public function getvar($name) + { + global $_GET, $_POST; + + if (isset($_GET[$name])) + { + return $_GET[$name]; + } + + elseif (isset($_POST[$name])) + { + return $_POST[$name]; + } + + else + { + return false; + } + } + + public function update_ccdata($order_id, $payment_transaction_id) + { + $db = JFactory::getDbo(); + + $session = JFactory::getSession(); + $ccdata = $session->get('ccdata'); + + $order_payment_code = $ccdata['creditcard_code']; + $order_payment_cardname = base64_encode($ccdata['order_payment_name']); + $order_payment_number = base64_encode($ccdata['order_payment_number']); + $order_payment_ccv = base64_encode($ccdata['credit_card_code']); + $order_payment_expire = $ccdata['order_payment_expire_month'] . $ccdata['order_payment_expire_year']; + + $payment_update = "UPDATE " . $this->_table_prefix . "order_payment " + . " SET order_payment_code = '" . $order_payment_code . "' ," + . " order_payment_cardname = '" . $order_payment_cardname . "' ," + . " order_payment_number = '" . $order_payment_number . "' ," + . " order_payment_ccv = '" . $order_payment_ccv . "' ," + . " order_payment_expire = '" . $order_payment_expire . "' ," + . " order_payment_trans_id = '" . $payment_transaction_id . "' " + . " WHERE order_id = '" . $order_id . "'"; + + $db->setQuery($payment_update); + + if (!$db->execute()) + { + return false; + } + } +} diff --git a/component/admin/models/order_status.php b/component/admin/models/order_status.php new file mode 100644 index 00000000000..06a45288541 --- /dev/null +++ b/component/admin/models/order_status.php @@ -0,0 +1,43 @@ +getValue('order_status_id'); + + if ($id) + { + $form->setFieldAttribute('order_status_code', 'readonly', true); + } + + return $form; + } +} diff --git a/component/admin/models/order_statuses.php b/component/admin/models/order_statuses.php new file mode 100644 index 00000000000..55b6d30197b --- /dev/null +++ b/component/admin/models/order_statuses.php @@ -0,0 +1,115 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_order_status')); + + // Filter by search in name. + $search = $this->getState('filter.search', ''); + + if (!empty($search)) + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('order_status_name') . ' LIKE ' . $search); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'order_status_id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/prices.php b/component/admin/models/prices.php new file mode 100644 index 00000000000..e94e74d0049 --- /dev/null +++ b/component/admin/models/prices.php @@ -0,0 +1,101 @@ +_context = 'price'; + + $this->_table_prefix = '#__redshop_'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + + $pid = $app->input->get('product_id'); + $this->setProductId((int) $pid); + } + + public function setProductId($id) + { + // Set employees_detail id and wipe data + $this->_prodid = $id; + $this->_data = null; + } + + public function getProductId() + { + return $this->_prodid; + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $query = ' SELECT p.*, ' + . ' g.shopper_group_name, prd.product_name ' + . ' FROM ' . $this->_table_prefix . 'product_price as p ' + . ' LEFT JOIN ' . $this->_table_prefix . 'shopper_group as g ON p.shopper_group_id = g.shopper_group_id ' + . ' LEFT JOIN ' . $this->_table_prefix . 'product as prd ON p.product_id = prd.product_id ' + . 'WHERE p.product_id = \'' . $this->_prodid . '\' '; + + return $query; + } +} diff --git a/component/admin/models/prices_detail.php b/component/admin/models/prices_detail.php new file mode 100644 index 00000000000..5759e1a8303 --- /dev/null +++ b/component/admin/models/prices_detail.php @@ -0,0 +1,178 @@ +_table_prefix = '#__redshop_'; + + $jinput = JFactory::getApplication()->input; + + $array = $jinput->get('cid', 0, 'array'); + $this->_prodid = $jinput->getInt('product_id', 0); + + $this->setId((int) $array[0]); + $this->setProductName(); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function setProductName() + { + $query = ' SELECT prd.product_name ' + . ' FROM ' . $this->_table_prefix . 'product as prd ' + . ' WHERE prd.product_id = ' . $this->_prodid; + $this->_db->setQuery($query); + $this->_prodname = $this->_db->loadObject()->product_name; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = ' SELECT p.*, ' + . ' g.shopper_group_name, prd.product_name ' + . ' FROM ' . $this->_table_prefix . 'product_price as p ' + . ' LEFT JOIN ' . $this->_table_prefix . 'shopper_group as g ON p.shopper_group_id = g.shopper_group_id ' + . ' LEFT JOIN ' . $this->_table_prefix . 'product as prd ON p.product_id = prd.product_id ' + . ' WHERE p.price_id = ' . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + // Get stored post data from user state + $tmpPost = JFactory::getApplication()->getUserState('com_redshop.edit.product_price.data', false); + + if ($tmpPost) + { + $detail = json_decode($tmpPost); + } + else + { + $detail = new stdClass; + $detail->price_id = 0; + $detail->product_id = $this->_prodid; + $detail->product_name = $this->_prodname; + $detail->product_price = 0.00; + $detail->product_currency = null; + $detail->shopper_group_id = 0; + $detail->price_quantity_start = 0; + $detail->price_quantity_end = 0; + $detail->shopper_group_name = null; + $detail->discount_price = 0; + $detail->discount_start_date = 0; + $detail->discount_end_date = 0; + } + + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + if (((float) $data['price_quantity_start'] > (float) $data['price_quantity_end']) || + ($data['discount_start_date'] > $data['discount_end_date'])) + { + return false; + } + + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->check()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_price WHERE price_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/product.php b/component/admin/models/product.php new file mode 100644 index 00000000000..be3df580fc6 --- /dev/null +++ b/component/admin/models/product.php @@ -0,0 +1,714 @@ +context)) + { + $input = JFactory::getApplication()->input; + $view = $input->getString('view', ''); + $layout = $input->getString('layout', 'none'); + $this->context = strtolower('com_redshop.' . $view . '.' . $this->getName() . '.' . $layout); + } + + if (empty($config['filter_fields'])) + { + $config['filter_fields'] = array( + 'product_number' + ); + } + + parent::__construct($config); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.5 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('product_sort'); + $id .= ':' . $this->getState('search_field'); + $id .= ':' . $this->getState('keyword'); + $id .= ':' . $this->getState('category_id'); + $id .= ':' . $this->getState('manufacturer_id'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'p.product_id', $direction = 'desc') + { + $search_field = $this->getUserStateFromRequest($this->context . '.search_field', 'search_field', 'p.product_name'); + $this->setState('search_field', $search_field); + + $keyword = $this->getUserStateFromRequest($this->context . '.keyword', 'keyword', ''); + $this->setState('keyword', $keyword); + + $category_id = $this->getUserStateFromRequest($this->context . '.category_id', 'category_id', 0); + $this->setState('category_id', $category_id); + + $manufacturer_id = $this->getUserStateFromRequest($this->context . '.manufacturer_id', 'manufacturer_id', 0); + $this->setState('manufacturer_id', $manufacturer_id); + + $product_sort = $this->getUserStateFromRequest($this->context . '.product_sort', 'product_sort', 0); + $this->setState('product_sort', $product_sort); + + parent::populateState($ordering, $direction); + } + + public function getData() + { + if (empty($this->_data)) + { + $this->_data = parent::getData(); + + // Product parent - child - format generation + $products = $this->_data; + + if (!is_array($products)) + { + $products = array(); + } + + // Establish the hierarchy of the menu + $children = array(); + + // First pass - collect children + foreach ($products as $v) + { + $pt = $v->parent; + $v->parent_id = $v->parent; + $list = @$children[$pt] ? $children[$pt] : array(); + array_push($list, $v); + $children[$pt] = $list; + } + + // Second pass - get an indent list of the items + $this->_data = JHTML::_('menu.treerecurse', 0, '', array(), $children, max(0, 9)); + $this->_data = array_values($this->_data); + } + + return $this->_data; + } + + /** + * + * @return string + * + * @since 2.0.7 + */ + public function _buildQuery() + { + static $items; + + if (isset($items)) + { + return $items; + } + + $db = JFactory::getDbo(); + + $orderby = $this->_buildContentOrderBy(); + $search_field = $this->getState('search_field'); + $keyword = $this->getState('keyword'); + $category_id = $this->getState('category_id'); + $manufacturer_id = $this->getState('manufacturer_id'); + $product_sort = $this->getState('product_sort'); + $keyword = addslashes($keyword); + $arr_keyword = array(); + + $where = ''; + $and = ''; + + if (!empty($product_sort)) + { + if ($product_sort == 'p.published') + { + $and = 'AND p.published=1 '; + } + elseif ($product_sort == 'p.unpublished') + { + $and = 'AND p.published=0 '; + } + elseif ($product_sort == 'p.product_on_sale') + { + $and = 'AND p.product_on_sale=1 '; + } + elseif ($product_sort == 'p.product_special') + { + $and = 'AND p.product_special=1 '; + } + elseif ($product_sort == 'p.expired') + { + $and = 'AND p.expired=1 '; + } + elseif ($product_sort == 'p.not_for_sale') + { + $and = 'AND p.not_for_sale > 0 '; + } + elseif ($product_sort == 'p.product_not_on_sale') + { + $and = 'AND p.product_on_sale=0 '; + } + elseif ($product_sort == 'p.sold_out') + { + $query_prd = "SELECT DISTINCT(p.product_id),p.attribute_set_id FROM #__redshop_product AS p "; + $tot_products = $this->_getList($query_prd); + $product_id_array = ''; + $producthelper = productHelper::getInstance(); + $products_stock = $producthelper->removeOutofstockProduct($tot_products); + $final_product_stock = $this->getFinalProductStock($products_stock); + + if (count($final_product_stock) > 0) + { + $product_id_array = implode(',', $final_product_stock); + } + else + { + $product_id_array = "0"; + } + + $and = "AND p.product_id IN (" . $product_id_array . ")"; + } + } + + if (trim($keyword) != '') + { + $arr_keyword = preg_split("/[\s-]+/", $keyword); + } + + if ($search_field != 'pa.property_number') + { + for ($k = 0, $kn = count($arr_keyword); $k < $kn; $k++) + { + if ($k == 0) + { + $where .= " AND ( "; + } + + if ($search_field == 'p.name_number') + { + $where .= " p.product_name LIKE '%$arr_keyword[$k]%' OR p.product_number LIKE '%$arr_keyword[$k]%' "; + } + else + { + $where .= $search_field . " LIKE '%$arr_keyword[$k]%' "; + } + + if ($k != count($arr_keyword) - 1) + { + if ($search_field == 'p.name_number') + { + $where .= ' OR '; + } + else + { + $where .= ' AND '; + } + } + + if ($k == count($arr_keyword) - 1) + { + $where .= " ) "; + } + } + } + + if ($this->getState('filter.product_number')) + { + $where .= " AND p.product_number = '" . $db->escape($this->getState('filter.product_number')) . "'"; + } + + if ($category_id) + { + $where .= " AND c.id = '" . $category_id . "' "; + } + + if ($manufacturer_id !== 0) + { + switch ($manufacturer_id) + { + case "all": + + break; + case "undefined": + $where .= " AND p.manufacturer_id = 0 "; + break; + default: + $where .= " AND p.manufacturer_id = '" . $manufacturer_id . "' "; + } + } + + if ($where == '' && $search_field != 'pa.property_number') + { + $query = "SELECT x.category_id AS category_id, p.product_id,p.product_id AS id,p.product_name,p.product_name AS treename,p.product_name + AS title,p.product_price,p.product_parent_id,p.product_parent_id AS parent_id,p.product_parent_id AS parent " + . ",p.published,p.visited,p.manufacturer_id,p.product_number ,p.checked_out,p.checked_out_time,p.discount_price " + . ",p.product_template " + . ",m.name " + . " FROM #__redshop_product AS p " + . "LEFT JOIN #__redshop_product_category_xref AS x ON x.product_id = p.product_id " + . "LEFT JOIN #__redshop_manufacturer AS m ON m.id = p.manufacturer_id " + . "WHERE 1=1 GROUP BY p.product_id " . $and . $orderby; + } + else + { + $query = "SELECT x.category_id AS category_id, p.product_id AS id,p.product_id,p.product_name,p.product_name AS treename,p.product_name AS + name,p.product_name AS title,p.product_parent_id,p.product_parent_id AS parent,p.product_price " . ", + p.published,p.visited,p.manufacturer_id,p.product_number,p.product_template,p.checked_out,p.checked_out_time,p.discount_price " . ", + x.ordering , x.category_id ,m.name " + . " FROM #__redshop_product AS p " . "LEFT JOIN #__redshop_product_category_xref + AS x ON x.product_id = p.product_id " . "LEFT JOIN #__redshop_category AS c ON x.category_id = c.id " + . "LEFT JOIN #__redshop_manufacturer AS m ON m.id = p.manufacturer_id "; + + if ($search_field == 'pa.property_number' && $keyword != '') + { + $query .= "LEFT JOIN #__redshop_product_attribute AS a ON a.product_id = p.product_id " + . "LEFT JOIN #__redshop_product_attribute_property AS pa ON pa.attribute_id = a.attribute_id " + . "LEFT JOIN #__redshop_product_subattribute_color AS ps ON ps.subattribute_id = pa.property_id "; + } + + $query .= "WHERE 1=1 "; + + if ($search_field == 'pa.property_number' && $keyword != '') + { + $query .= "AND (pa.property_number LIKE '%$keyword%' OR ps.subattribute_color_number LIKE '%$keyword%') "; + } + + $query .= $where . $and . " GROUP BY p.product_id "; + $query .= $orderby; + } + + return $query; + } + + public function getFinalProductStock($product_stock) + { + if (count($product_stock) > 0) + { + $product = array(); + + for ($i = 0, $in = count($product_stock); $i < $in; $i++) + { + $product[] = $product_stock[$i]->product_id; + } + + $product_id = implode(',', $product); + $query_prd = "SELECT DISTINCT(p.product_id) FROM #__redshop_product AS p WHERE p.product_id NOT IN(" . $product_id . ")"; + $this->_db->setQuery($query_prd); + $final_products = $this->_db->loadColumn(); + + return $final_products; + } + + return null; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + + $category_id = $this->getState('category_id'); + $filter_order_Dir = $this->getState('list.direction'); + + if ($category_id) + { + $filter_order = $this->getState('list.ordering', 'x.ordering'); + } + else + { + $filter_order = $this->getState('list.ordering', 'p.product_id'); + + if ($filter_order == 'x.ordering') + { + $filter_order = 'p.product_id'; + } + } + + $orderby = " ORDER BY " . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } + + public function MediaDetail($pid) + { + $query = 'SELECT * FROM #__redshop_media WHERE section_id ="' . $pid . '" AND media_section = "product"'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function listedincats($pid) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('name')) + ->from($db->qn('#__redshop_product_category_xref', 'pcx')) + ->leftjoin($db->qn('#__redshop_category', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pcx.category_id')) + ->where($db->qn('pcx.product_id') . ' = ' . $db->q((int) $pid)) + ->order($db->qn('c.name')); + + return $db->setQuery($query)->loadObjectlist(); + } + + /** + * @param integer $template_id Template ID + * @param integer $product_id Product ID + * @param integer $section Section + * + * @return array|string|void + * @throws Exception + */ + public function product_template($template_id, $product_id, $section) + { + if ($section == RedshopHelperExtrafields::SECTION_PRODUCT || $section == RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD) + { + $template_desc = RedshopHelperTemplate::getTemplate("product", $template_id); + } + else + { + $template_desc = RedshopHelperTemplate::getTemplate("category", $template_id); + } + + if (count($template_desc) == 0) + { + return; + } + + $template = $template_desc[0]->template_desc; + $str = array(); + $sec = explode(',', $section); + + for ($t = 0, $tn = count($sec); $t < $tn; $t++) + { + $inArr[] = "'" . $sec[$t] . "'"; + } + + $in = implode(',', $inArr); + $q = "SELECT field_name,field_type,field_section from #__redshop_fields where field_section in (" . $in . ") "; + $this->_db->setQuery($q); + $fields = $this->_db->loadObjectlist(); + + for ($i = 0, $in = count($fields); $i < $in; $i++) + { + if (strstr($template, "{" . $fields[$i]->field_name . "}")) + { + if ($fields[$i]->field_section == 12) + { + if ($fields[$i]->field_type == 15) + { + $str[] = $fields[$i]->field_name; + } + } + else + { + $str[] = $fields[$i]->field_name; + } + } + } + + $list_field = array(); + + if (count($str) > 0) + { + $dbname = implode(",", $str); + + for ($t = 0, $tn = count($sec); $t < $tn; $t++) + { + $list_field[] = RedshopHelperExtrafields::listAllField($sec[$t], $product_id, $dbname); + } + } + + if (count($list_field) > 0) + { + return $list_field; + } + + else + { + return ""; + } + } + + public function assignTemplate($data) + { + $cid = $data['cid']; + + $product_template = $data['product_template']; + + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'UPDATE #__redshop_product' . ' SET `product_template` = "' + . intval($product_template) . '" ' . ' WHERE product_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function getCategoryList() + { + if ($this->_categorytreelist) + { + return $this->_categorytreelist; + } + + $this->_categorytreelist = array(); + + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn(array('id', 'parent_id', 'level'))) + ->select($db->qn('name', 'title')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('published') . ' = 1') + ->where($db->qn('level') . ' > 0') + ->order($db->qn('lft')); + + $rows = $db->setQuery($query)->loadObjectList(); + + // Establish the hierarchy of the menu + $children = array(); + + // First pass - collect children + foreach ($rows as $v) + { + $pt = $v->parent_id; + $list = @$children[$pt] ? $children[$pt] : array(); + array_push($list, $v); + $children[$pt] = $list; + } + + // Get first key to generate tree recursive + $firstKey = current(array_keys($children)); + + // Second pass - get an indent list of the items + $list = $this->treerecurse($firstKey, '- ', array(), $children); + + if (count($list) > 0) + { + $this->_categorytreelist = $list; + } + + return $this->_categorytreelist; + } + + public function treerecurse($id, $indent, $list, &$children, $maxlevel = 9999, $level = 0) + { + if (@$children[$id] && $level <= $maxlevel) + { + foreach ($children[$id] as $v) + { + $id = $v->id; + + if ($v->parent_id == 0) + { + $txt = $v->title; + } + else + { + $txt = str_repeat($indent, $v->level) . $v->title; + } + + $list[$id] = $v; + $list[$id]->treename = $txt; + $list[$id]->children = isset($children[$id]) ? count($children[$id]) : 0; + $list = $this->treerecurse($id, $indent, $list, $children, $maxlevel, $level + 1); + } + } + + return $list; + } + + /* + * Save product ordering + * @params: $cid - array , $order-array + * $cid= product ids + * $order = product current ordring + * @return: boolean + */ + public function saveorder($cid = array(), $order = 0) + { + $category_id_my = $this->getState('category_id'); + + $orderarray = array(); + + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + // Set product id as key AND order as value + $orderarray[$cid[$i]] = $order[$i]; + } + + // Sorting array using value ( order ) + asort($orderarray); + $i = 1; + + if (count($orderarray) > 0) + { + foreach ($orderarray as $productid => $order) + { + if ($order >= 0) + { + // Update ordering + $query = 'UPDATE #__redshop_product_category_xref' . ' SET ordering = ' . (int) $i + . ' WHERE product_id=' . $productid . ' AND category_id = ' . $category_id_my; + $this->_db->setQuery($query); + $this->_db->execute(); + } + + $i++; + } + } + + return true; + } + + /** + * Method for save discount for list of product Ids + * + * @param array $productIds Product Id + * @param array $discountPrices List of discount price. + * + * @return boolean + * + * @since 2.0.4 + */ + public function saveDiscountPrices($productIds = array(), $discountPrices = array()) + { + if (empty($productIds)) + { + return false; + } + + $productIds = ArrayHelper::toInteger($productIds); + $case = array(); + $db = $this->_db; + + foreach ($productIds as $index => $productId) + { + // Skip if discount price doesn't populate + if (!isset($discountPrices[$index])) + { + continue; + } + + $price = (float) $discountPrices[$index]; + + $case[] = 'WHEN ' . $db->qn('product_id') . ' = ' . $productId . ' AND ' . $db->qn('product_price') . ' >= ' . $price + . ' THEN ' . $db->quote($price); + } + + if (empty($case)) + { + return false; + } + + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_product')) + ->set($db->qn('discount_price') . ' = CASE ' . implode(' ', $case) . ' ELSE ' . $db->qn('discount_price') . ' END'); + + return $db->setQuery($query)->execute(); + } + + /** + * Method for save discount for list of product Ids + * + * @param array $productIds Product Id + * @param array $prices List of discount price. + * + * @return boolean + * + * @since 2.0.4 + */ + public function savePrices($productIds = array(), $prices = array()) + { + if (empty($productIds)) + { + return false; + } + + $productIds = ArrayHelper::toInteger($productIds); + $case = array(); + $db = $this->_db; + + foreach ($productIds as $index => $productId) + { + // Skip if discount price doesn't populate + if (!isset($prices[$index])) + { + continue; + } + + $price = (float) $prices[$index]; + + $case[] = 'WHEN ' . $db->qn('product_id') . ' = ' . $productId . ' THEN ' . $db->quote($price); + } + + if (empty($case)) + { + return false; + } + + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_product')) + ->set($db->qn('product_price') . ' = CASE ' . implode(' ', $case) . ' ELSE ' . $db->qn('product_price') . ' END'); + + return $db->setQuery($query)->execute(); + } +} diff --git a/component/admin/models/product_attribute.php b/component/admin/models/product_attribute.php new file mode 100644 index 00000000000..a621fdb5654 --- /dev/null +++ b/component/admin/models/product_attribute.php @@ -0,0 +1,21 @@ +_table_prefix = '#__redshop_'; + } + + public function getProductlist() + { + $pid = JFactory::getApplication()->input->post->get('cid', array(), 'array'); + $pids = implode(",", $pid); + $query = 'SELECT product_id,product_name FROM ' . $this->_table_prefix . 'product WHERE product_id IN(' . $pids . ')'; + $this->_db->setQuery($query); + + if ($products = $this->_db->loadObjectlist('product_id')) + { + $products = $this->getProductCategories($products); + } + + return $products; + } + + /** + * Get Product Categories + * + * @param array $products Data products + * + * @return mixed + */ + public function getProductCategories($products) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('c.name, pcx.product_id') + ->from($db->qn('#__redshop_category', 'c')) + ->leftJoin($db->qn('#__redshop_product_category_xref', 'pcx') . ' ON pcx.category_id = c.id') + ->where('pcx.product_id IN (' . implode(',', array_keys($products)) . ')'); + + if ($categories = $db->setQuery($query)->loadObjectList()) + { + foreach ($categories as $category) + { + if (!isset($products[$category->product_id]->categories)) + { + $products[$category->product_id]->categories = array(); + } + + $products[$category->product_id]->categories[] = $category->name; + } + } + + return $products; + } + + public function saveProduct_Category() + { + $app = JFactory::getApplication(); + $pid = $app->input->post->get('cid', array(), 'array'); + $cat_id = $app->input->get('category_id'); + + for ($i = 0, $in = count($pid); $i < $in; $i++) + { + for ($j = 0, $jn = count($cat_id); $j < $jn; $j++) + { + if (count($this->getIdfromXref($pid[$i], $cat_id[$j])) <= 0) + { + $query = "INSERT INTO " . $this->_table_prefix . "product_category_xref " + . "(`category_id`,`product_id`) VALUES ('" . $cat_id[$j] . "','" . $pid[$i] . "')"; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + return false; + } + } + } + } + + return true; + } + + public function removeProduct_Category() + { + $app = JFactory::getApplication(); + $pid = $app->input->post->get('cid', array(), 'array'); + $cat_id = $app->input->post->get('category_id', array(), 'array'); + $cat_ids = implode(",", $cat_id); + + for ($i = 0, $in = count($pid); $i < $in; $i++) + { + $query = "DELETE FROM " . $this->_table_prefix . "product_category_xref " + . " WHERE product_id=" . $pid[$i] . " AND category_id IN (" . $cat_ids . ")"; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + return false; + } + } + + return true; + } + + public function getIdfromXref($pid, $cid) + { + $query = 'SELECT product_id FROM ' . $this->_table_prefix . 'product_category_xref ' + . ' WHERE product_id ="' . $pid . '" AND category_id="' . $cid . '"'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } +} diff --git a/component/admin/models/product_detail.php b/component/admin/models/product_detail.php new file mode 100644 index 00000000000..75ef6b66dcb --- /dev/null +++ b/component/admin/models/product_detail.php @@ -0,0 +1,4981 @@ +table_prefix = '#__redshop_'; + $this->app = JFactory::getApplication(); + $this->input = $this->app->input; + $array = $this->input->get('cid', array(0), 'array'); + + $this->setId((int) $array[0]); + } + + /** + * Function setId. + * + * @param int $id ID. + * + * @return void + */ + public function setId($id) + { + $this->id = $id; + $this->data = null; + } + + /** + * Function getData. + * + * @return object + */ + public function &getData() + { + if ($this->_loadData()) + { + if (!empty($_POST)) + { + $this->_initData(); + } + } + else + { + $this->_initData(); + } + + // Set discount Price null for '0' value + if (!$this->data->discount_price) + { + $this->data->discount_price = null; + } + + return $this->data; + } + + /** + * Function _loadData. + * + * @return boolean + */ + public function _loadData() + { + if (empty($this->data)) + { + // Initialiase variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_id') . ' = ' . (int) $this->id); + + // Set the query and load the result. + $db->setQuery($query); + + try + { + $this->data = $db->loadObject(); + } + catch (RuntimeException $e) + { + throw new RuntimeException($e->getMessage(), $e->getCode()); + } + + return (boolean) $this->data; + } + + return true; + } + + /** + * Function _initData. + * + * @return mixed + */ + public function _initData() + { + $detail = new stdClass; + + // ToDo: This is potentially unsafe because $_POST elements are not sanitized. + $data = $this->input->post->getArray(); + $data['product_desc'] = JFilterInput::getInstance(null, null, 1, 1)->clean($this->input->get('product_desc', '', 'RAW'), 'html'); + $data['product_s_desc'] = JFilterInput::getInstance(null, null, 1, 1)->clean($this->input->get('product_s_desc', '', 'RAW'), 'html'); + $detail->product_id = (isset($data['product_id'])) ? $data['product_id'] : 0; + $detail->product_parent_id = (isset($data['product_parent_id'])) ? $data['product_parent_id'] : 0; + $detail->product_number = (isset($data['product_number'])) ? $data['product_number'] : null; + $detail->product_price = (isset($data['product_price'])) ? $data['product_price'] : 0; + $detail->discount_price = (isset($data['discount_price'])) ? $data['discount_price'] : null; + $detail->discount_stratdate = (isset($data['discount_stratdate'])) ? $data['discount_stratdate'] : null; + $detail->discount_enddate = (isset($data['discount_enddate'])) ? $data['discount_enddate'] : null; + $detail->product_volume = (isset($data['product_volume'])) ? $data['product_volume'] : 0; + $detail->product_type = (isset($data['product_type'])) ? $data['product_type'] : null; + $detail->product_name = (isset($data['product_name'])) ? $data['product_name'] : null; + $detail->product_s_desc = (isset($data['product_s_desc'])) ? $data['product_s_desc'] : null; + $detail->product_desc = (isset($data['product_desc'])) ? $data['product_desc'] : null; + $detail->product_template = (isset($data['product_template'])) ? $data['product_template'] : 0; + $detail->product_full_image = (isset($data['old_image'])) ? $data['old_image'] : null; + $detail->product_thumb_image = (isset($data['old_thumb_image'])) ? $data['old_thumb_image'] : null; + $detail->product_back_full_image = (isset($data['product_back_full_image'])) ? $data['product_back_full_image'] : null; + $detail->product_back_thumb_image = (isset($data['product_back_thumb_image'])) ? $data['product_back_thumb_image'] : null; + $detail->product_preview_image = (isset($data['product_preview_image'])) ? $data['product_preview_image'] : null; + $detail->product_preview_back_image = (isset($data['product_preview_back_image'])) ? $data['product_preview_back_image'] : null; + + $detail->visited = (isset($data['visited'])) ? $data['visited'] : 0; + $detail->metakey = (isset($data['metakey'])) ? $data['metakey'] : null; + $detail->metadesc = (isset($data['metadesc'])) ? $data['metadesc'] : null; + $detail->metalanguage_setting = (isset($data['metalanguage_setting'])) ? $data['metalanguage_setting'] : null; + $detail->metarobot_info = (isset($data['metarobot_info'])) ? $data['metarobot_info'] : null; + $detail->pagetitle = (isset($data['pagetitle'])) ? $data['pagetitle'] : null; + $detail->pageheading = (isset($data['pageheading'])) ? $data['pageheading'] : null; + $detail->sef_url = (isset($data['sef_url'])) ? $data['sef_url'] : null; + $detail->cat_in_sefurl = (isset($data['cat_in_sefurl'])) ? $data['cat_in_sefurl'] : null; + $detail->manufacturer_id = (isset($data['manufacturer_id'])) ? $data['manufacturer_id'] : null; + $detail->supplier_id = (isset($data['supplier_id'])) ? $data['supplier_id'] : null; + $detail->product_on_sale = (isset($data['product_on_sale'])) ? $data['product_on_sale'] : null; + $detail->product_special = (isset($data['product_special'])) ? $data['product_special'] : 0; + $detail->product_download = (isset($data['product_download'])) ? $data['product_download'] : 0; + $detail->not_for_sale = (isset($data['not_for_sale'])) ? $data['not_for_sale'] : 0; + $detail->published = (isset($data['published'])) ? $data['published'] : 1; + $detail->product_tax_id = (isset($data['product_tax_id'])) ? $data['product_tax_id'] : null; + $detail->product_tax_group_id = (isset($data['product_tax_group_id'])) ? $data['product_tax_group_id'] : null; + $detail->weight = (isset($data['weight'])) ? $data['weight'] : 0; + $detail->expired = (isset($data['expired'])) ? $data['expired'] : 0; + $detail->use_discount_calc = (isset($data['use_discount_calc'])) ? $data['use_discount_calc'] : 0; + $detail->discount_calc_method = (isset($data['discount_calc_method'])) ? $data['discount_calc_method'] : null; + $detail->min_order_product_quantity = (isset($data['min_order_product_quantity'])) ? $data['min_order_product_quantity'] : 0; + $detail->product_length = (isset($data['product_length'])) ? $data['product_length'] : 0; + $detail->product_width = (isset($data['product_width'])) ? $data['product_width'] : 0; + $detail->product_height = (isset($data['product_height'])) ? $data['product_height'] : 0; + $detail->product_diameter = (isset($data['product_diameter'])) ? $data['product_diameter'] : 0; + $detail->use_range = (isset($data['use_range'])) ? $data['use_range'] : 0; + $detail->product_availability_date = (isset($data['product_availability_date'])) ? $data['product_availability_date'] : 0; + $detail->product_download_days = (isset($data['product_download_days'])) ? $data['product_download_days'] : 0; + $detail->product_download_limit = (isset($data['product_download_limit'])) ? $data['product_download_limit'] : 0; + $detail->product_download_clock = (isset($data['product_download_clock'])) ? $data['product_download_clock'] : 0; + $detail->product_download_clock_min = (isset($data['product_download_clock_min'])) ? $data['product_download_clock_min'] : 0; + $detail->product_download_infinite = (isset($data['product_download_infinite'])) ? $data['product_download_infinite'] : 0; + + $detail->checked_out = (isset($data['checked_out'])) ? $data['checked_out'] : 0; + $detail->checked_out_time = (isset($data['checked_out_time'])) ? $data['checked_out_time'] : 0; + $detail->accountgroup_id = (isset($data['accountgroup_id'])) ? $data['accountgroup_id'] : 0; + $detail->quantity_selectbox_value = (isset($data['quantity_selectbox_value'])) ? $data['quantity_selectbox_value'] : null; + $detail->preorder = (isset($data['preorder'])) ? $data['preorder'] : 'global'; + $detail->minimum_per_product_total = (isset($data['minimum_per_product_total'])) ? $data['minimum_per_product_total'] : 0; + $detail->attribute_set_id = (isset($data['attribute_set_id'])) ? $data['attribute_set_id'] : 0; + $detail->append_to_global_seo = ((isset($data['append_to_global_seo'])) + ? $data['append_to_global_seo'] : JText::_('COM_REDSHOP_APPEND_TO_GLOBAL_SEO')); + $detail->allow_decimal_piece = (isset($data['allow_decimal_piece'])) ? $data['allow_decimal_piece'] : 0; + + $detail->use_individual_payment_method = (isset($data['use_individual_payment_method'])) ? $data['use_individual_payment_method'] : 0; + + $this->data = $detail; + + return (boolean) $this->data; + } + + /** + * Function store. + * + * @param array $data Product detail data. + * + * @return boolean|TableProduct_Detail + * @throws Exception + */ + public function store($data) + { + $dispatcher = RedshopHelperUtility::getDispatcher(); + + $catorder = array(); + $oldcategory = array(); + + /** @var TableProduct_Detail $row */ + $row = $this->getTable('product_detail'); + + if (!empty($data['product_id'])) + { + $row->load($data['product_id']); + } + + $this->handleDateTimeRange($data['discount_stratdate'], $data['discount_enddate']); + + if (!$row->bind($data)) + { + $this->app->enqueueMessage(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg(), 'error'); + + return false; + } + + if (isset($data['copy_attribute'])) + { + if ($data['copy_attribute'] > 0) + { + if ($data['attribute_set_id'] <= 0) + { + return false; + } + + $row->attribute_set_id = 0; + } + } + + if (!$row->check()) + { + $this->app->enqueueMessage($row->getError(), 'error'); + + return false; + } + + if (isset($data['thumb_image_delete'])) + { + $row->product_thumb_image = ""; + $unlink_path = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $data['old_thumb_image']); + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + } + + $thumbfile = $this->input->files->get('product_thumb_image', array(), 'array'); + + if ($thumbfile['name'] != "") + { + $filename = RedshopHelperMedia::cleanFileName($thumbfile['name'], $row->product_id); + $row->product_thumb_image = $filename; + + // Image Upload + $src = $thumbfile['tmp_name']; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $filename; + JFile::upload($src, $dest); + } + + // Get File name, tmp_name + $file = $this->input->files->get('product_full_image', array(), 'array'); + + if (isset($data['image_delete']) || !empty($file['name']) || !empty($data['product_full_image'])) + { + $unlink_path = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'product/thumb/' . $data['old_image']); + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + + $unlink_path = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $data['old_image']); + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + + $query = 'DELETE FROM ' . $this->table_prefix . 'media + WHERE media_name = "' . $data['old_image'] . '" + AND media_section = "product" AND section_id = "' . $row->product_id . '" '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + if (isset($data['product_full_image_delete']) && boolval($data['product_full_image_delete']) === true) + { + if (!empty($row->product_full_image)) + { + $oldImage = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $row->product_full_image); + + if (JFile::exists($oldImage)) + { + JFile::delete($oldImage); + } + } + + $row->product_full_image = ''; + } + + $mediaFullImage = ''; + + if (!$data['copy_product']) + { + // Media: Store product full image + $mediaFullImage = $this->storeMedia($row, 'product_full_image'); + } + + if (isset($data['back_thumb_image_delete'])) + { + $row->product_back_thumb_image = ""; + $unlink_path = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $data['product_back_thumb_image']); + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + } + + $backthumbfile = $this->input->files->get('product_back_thumb_image', array(), 'array'); + + if ($backthumbfile['name'] != "") + { + $filename = RedshopHelperMedia::cleanFileName($backthumbfile['name'], $row->product_id); + $row->product_back_thumb_image = $filename; + + // Image Upload + $src = $backthumbfile['tmp_name']; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $filename; + JFile::upload($src, $dest); + } + + if (isset($data['back_image_delete'])) + { + $row->product_back_full_image = ""; + $unlink_path = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $data['product_back_full_image']); + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + } + + $backthumbfile = $this->input->files->get('product_back_full_image', array(), 'array'); + + if ($backthumbfile['name'] != "") + { + $filename = RedshopHelperMedia::cleanFileName($backthumbfile['name'], $row->product_id); + $row->product_back_full_image = $filename; + + // Image Upload + $src = $backthumbfile['tmp_name']; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $filename; + JFile::upload($src, $dest); + } + + // Upload product preview image. + if (isset($data['preview_image_delete'])) + { + $row->product_preview_image = ""; + $unlink_path = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $data['product_preview_image']); + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + } + + $previewfile = $this->input->files->get('product_preview_image', array(), 'array'); + + if ($previewfile['name'] != "") + { + $filename = RedshopHelperMedia::cleanFileName($previewfile['name'], $row->product_id); + $row->product_preview_image = $filename; + + // Image Upload + $src = $previewfile['tmp_name']; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $filename; + JFile::upload($src, $dest); + } + + // Upload product preview back image + if (isset($data['preview_back_image_delete'])) + { + $row->product_preview_image = ""; + $unlink_path = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $data['product_preview_back_image']); + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + } + + $previewbackfile = $this->input->files->get('product_preview_back_image', array(), 'array'); + + if ($previewbackfile['name'] != "") + { + $filename = RedshopHelperMedia::cleanFileName($previewfile['name'], $row->product_id); + $row->product_preview_back_image = $filename; + + // Image Upload + $src = $previewbackfile['tmp_name']; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $filename; + JFile::upload($src, $dest); + } + + // Product not for sell - Show price or not + if ($row->not_for_sale && $data['not_for_sale_showprice']) + { + $row->not_for_sale = 2; + } + + $isNew = ($row->product_id > 0) ? false : true; + + JPluginHelper::importPlugin('redshop_product'); + JPluginHelper::importPlugin('redshop_product_type'); + + /** + * @var array Trigger redSHOP Product Plugin + */ + $result = $dispatcher->trigger('onBeforeProductSave', array(&$row, $isNew)); + + if (in_array(false, $result, true)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $row->getError()); + + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + $dispatcher->trigger('onAfterProductSave', array(&$row, $isNew)); + + // Upgrade media reference Id if needed + if ($isNew && !empty($mediaFullImage) !== false && !$data['copy_product']) + { + /** @var Tablemedia_detail $mediaTable */ + $mediaTable = $this->getTable('media_detail'); + + if ($mediaTable->load($mediaFullImage)) + { + $mediaTable->set('section_id', $row->product_id); + $mediaTable->store(); + } + } + + if (isset($data['copy_attribute'])) + { + if ($data['copy_attribute'] > 0) + { + $row->attribute_set_id = 0; + $this->copyAttributeSetAttribute($data['attribute_set_id'], $row->product_id); + } + } + + if (!$data['product_id']) + { + $prodid = $row->product_id; + } + else + { + $prodid = $data['product_id']; + $cids = implode(",", $data['product_category']); + $query = "SELECT category_id,ordering FROM " . $this->table_prefix . "product_category_xref + WHERE product_id='" . $prodid . "' + AND category_id IN(" . $cids . ")"; + $categories = $this->_getList($query); + + for ($g = 0, $gn = count($categories); $g < $gn; $g++) + { + $oldcategory[$g] = $categories[$g]->category_id; + $catorder[$categories[$g]->category_id] = $categories[$g]->ordering; + } + + $query = 'DELETE FROM ' . $this->table_prefix . 'product_category_xref WHERE product_id="' . $prodid . '" '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + // Delete redshop_product_payment_xref + $db = $this->_db; + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_product_payment_xref')) + ->where($db->qn('product_id') . ' = ' . $db->q($prodid)); + + if (!$db->setQuery($query)->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + $catDiscountQuery = $this->_db->getQuery(true); + $catDiscountQuery->select('*')->from('#__redshop_mass_discount'); + + $categories = array_unique($data['product_category']); + + // Building product categories relationship + foreach ($categories as $index => $category) + { + if (array_key_exists($category, $catorder)) + { + $ordering = $catorder [$category]; + } + else + { + $queryorder = "SELECT max(ordering) FROM " . $this->table_prefix . "product_category_xref WHERE category_id ='" . $category . "' "; + $this->_db->setQuery($queryorder); + $result = $this->_db->loadResult(); + $ordering = $result + 1; + } + + $query = 'INSERT INTO ' . $this->table_prefix . 'product_category_xref(category_id,product_id,ordering) + VALUES ("' . $category . '","' . $prodid . '","' . $ordering . '")'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if ((count($categories) - 1) != $index) + { + $catDiscountQuery->where(' FIND_IN_SET(' . (int) $category . ',' . $this->_db->quoteName('category_id') . ')', 'OR'); + } + else + { + $catDiscountQuery->where(' FIND_IN_SET(' . (int) $category . ',' . $this->_db->quoteName('category_id') . ')'); + } + } + + $category_array = array_diff($categories, $oldcategory); + + if (count($category_array) > 0) + { + $category_array = array_diff($oldcategory, $categories); + } + + $catDiscountQuery->order($this->_db->quoteName('id') . ' DESC LIMIT 0, 1'); + $this->_db->setQuery($catDiscountQuery); + $mass_discount = $this->_db->loadObject(); + + if (count($category_array) > 0) + { + $this->updateproductdiscount($mass_discount, $row); + } + + // Insert product_payment + if (!empty($data['payment_method'])) + { + $payments = array_unique($data['payment_method']); + + // Building product payments relationship + foreach ($payments as $index => $paymentMethod) + { + $query = $this->_db->getQuery(true); + $columns = array('payment_id', 'product_id'); + $values = array($this->_db->q($paymentMethod), $this->_db->q($prodid)); + + // Prepare the insert query. + $query + ->insert($this->_db->qn($this->table_prefix . 'product_payment_xref')) + ->columns($this->_db->qn($columns)) + ->values(implode(',', $values)); + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + + $sel = "SELECT * FROM " . $this->table_prefix . "mass_discount WHERE FIND_IN_SET('" . $row->manufacturer_id . + "',manufacturer_id) ORDER BY id desc limit 0,1"; + $this->_db->setQuery($sel); + $mass_discount = $this->_db->loadObject(); + + if ($data['old_manufacturer_id'] != $row->manufacturer_id) + { + $this->updateproductdiscount($mass_discount, $row); + } + + // Save Stcok and Preorder stock for Product + if ((isset($data['quantity']) && $data['quantity']) || (isset($data['preorder_stock']) && $data['preorder_stock'])) + { + $product_id = $row->product_id; + + for ($i = 0, $countQuantity = count($data['quantity']); $i < $countQuantity; $i++) + { + if ($data['ordered_preorder'][$i] > $data['preorder_stock'][$i]) + { + $this->app->enqueueMessage(JText::_('COM_REDSHOP_PREORDER_STOCK_NOT_ALLOWED'), 'notice'); + + return false; + } + + $query = "DELETE FROM " . $this->table_prefix . "product_stockroom_xref " + . "WHERE product_id = '" . $product_id . "' and stockroom_id ='" . $data['stockroom_id'][$i] . "'"; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + return false; + } + else + { + if ($data['quantity'][$i] != "" || !Redshop::getConfig()->get('USE_BLANK_AS_INFINITE')) + { + $this->insertProductStock( + $product_id, + $data['stockroom_id'][$i], + $data['quantity'][$i], + $data['preorder_stock'][$i], + $data['ordered_preorder'][$i] + ); + } + } + } + } + + // Building product categories relationship end. + if (!empty($data['product_accessory'])) + { + $data['product_accessory'] = array_merge(array(), $data['product_accessory']); + + for ($a = 0, $countAccessory = count($data['product_accessory']); $a < $countAccessory; $a++) + { + $acc = $data['product_accessory'][$a]; + $accdetail = $this->getTable('accessory_detail'); + + if (!isset($data['copy_product']) || $data['copy_product'] != 1) + { + $accdetail->accessory_id = $acc['accessory_id']; + } + + $accdetail->product_id = $row->product_id; + $accdetail->child_product_id = $acc['child_product_id']; + $accdetail->accessory_price = $acc['accessory_price']; + $accdetail->oprand = $acc['oprand']; + $accdetail->ordering = $acc['ordering']; + $accdetail->setdefault_selected = (isset($acc['setdefault_selected']) && $acc['setdefault_selected'] == 1) ? 1 : 0; + + if (!$accdetail->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + + $query_rel_del = 'DELETE FROM ' . $this->table_prefix . 'product_related ' . 'WHERE product_id IN ( ' . $row->product_id . ' )'; + $this->_db->setQuery($query_rel_del); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + $ordering_related = 0; + + if (isset($data['related_product']) && ($relatedProducts = explode(',', $data['related_product']))) + { + foreach ($relatedProducts as $related_data) + { + $ordering_related++; + $related_id = $related_data; + $product_id = $row->product_id; + $query_related = 'INSERT INTO ' . $this->table_prefix . 'product_related(related_id,product_id,ordering) + VALUES ("' . $related_id . '","' . $product_id . '","' . $ordering_related . '")'; + $this->_db->setQuery($query_related); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + + // Discount calculator start + $query = "DELETE FROM `" . $this->table_prefix . "product_discount_calc` WHERE product_id='" . $row->product_id . "' "; + $this->_db->setQuery($query); + $this->_db->execute(); + + $calc_error = 0; + $calc_extra = 0; + $err_msg = ''; + $extra_err_msg = ''; + + if (isset($data['area_start']) && count($data['area_start']) > 0) + { + $discount_calc_unit = $data['discount_calc_unit']; + $area_start = $data['area_start']; + $area_end = $data['area_end']; + $area_price = $data['area_price']; + + for ($c = 0, $cn = count($area_start); $c < $cn; $c++) + { + // Convert whatever unit into meter + $unit = \Redshop\Helper\Utility::getUnitConversation("m", $discount_calc_unit[$c]); + + // Replace comma with dot + $new_area_start = str_replace(",", ".", $area_start[$c]); + $new_area_end = str_replace(",", ".", $area_end[$c]); + + if ($data['discount_calc_method'] == 'volume') + { + $calcunit = pow($unit, 3); + } + + elseif ($data['discount_calc_method'] == 'area') + { + $calcunit = pow($unit, 2); + } + else + { + $calcunit = $unit; + } + + // Updating value + $converted_area_start = $new_area_start * $calcunit; + $converted_area_end = $new_area_end * $calcunit; + + $calcrow = $this->getTable('product_discount_calc'); + $calcrow->load(); + $calcrow->discount_calc_unit = $discount_calc_unit[$c]; + $calcrow->area_start = $new_area_start; + $calcrow->area_end = $new_area_end; + $calcrow->area_price = $area_price[$c]; + $calcrow->area_start_converted = $converted_area_start; + $calcrow->area_end_converted = $converted_area_end; + $calcrow->product_id = $row->product_id; + + if ($calcrow->check()) + { + if (!$calcrow->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + else + { + $calc_error = 1; + $err_msg = $calcrow->_error; + } + } + } + + // Discount calculator add extra data + $query = "DELETE FROM `" . $this->table_prefix . "product_discount_calc_extra` WHERE product_id='" . $row->product_id . "' "; + $this->_db->setQuery($query); + $this->_db->execute(); + + if (isset($data['pdc_option_name']) && count($data['pdc_option_name']) > 0) + { + $pdc_oprand = $data['pdc_oprand']; + $pdc_option_name = $data['pdc_option_name']; + $pdc_price = $data['pdc_price']; + $calc_extra = 0; + + for ($c = 0, $cn = count($pdc_option_name); $c < $cn; $c++) + { + if (trim($pdc_option_name[$c]) != "") + { + $pdcextrarow = $this->getTable('product_discount_calc_extra'); + $pdcextrarow->load(); + $pdcextrarow->pdcextra_id = 0; + $pdcextrarow->option_name = $pdc_option_name[$c]; + $pdcextrarow->oprand = $pdc_oprand[$c]; + $pdcextrarow->price = $pdc_price[$c]; + $pdcextrarow->product_id = $row->product_id; + + if (!$pdcextrarow->store()) + { + $calc_extra = 1; + $extra_err_msg = /** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg(); + } + } + } + } + + if ($calc_error == 1) + { + $this->setError($err_msg); + + return false; + } + + if ($calc_extra == 1) + { + $this->setError($extra_err_msg); + + return false; + } + + // Product subscription start + if (isset($data['subscription_id']) && is_array($data['subscription_id'])) + { + $sub_cond = " AND subscription_id NOT IN(" . implode(",", $data['subscription_id']) . ")"; + } + else + { + $sub_cond = ""; + } + + $subscription_query = "DELETE FROM `" . $this->table_prefix . "product_subscription`" . "WHERE product_id=" . $row->product_id . $sub_cond; + $this->_db->setQuery($subscription_query); + $this->_db->execute(); + + if (isset($data['subscription_period']) && count($data['subscription_period']) > 0) + { + for ($sub = 0, $countSubcription = count($data['subscription_period']); $sub < $countSubcription; $sub++) + { + $sub_row = $this->getTable('product_subscription'); + $sub_row->subscription_id = $data['subscription_id'][$sub]; + $sub_row->subscription_period = $data['subscription_period'][$sub]; + $sub_row->period_type = $data['period_type'][$sub]; + $sub_row->subscription_price = $data['subscription_price'][$sub]; + $sub_row->product_id = $row->product_id; + + if (!$sub_row->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + + // Subscription renewal + $sub_renewal = $this->getTable('product_subscription_renewal'); + $sub_renewal->renewal_id = ""; + $sub_renewal->before_no_days = ""; + $sub_renewal->product_id = $row->product_id; + + if (isset($data['renewal_id'])) + { + $sub_renewal->renewal_id = $data['renewal_id']; + } + + if (isset($data['before_no_days'])) + { + $sub_renewal->before_no_days = $data['before_no_days']; + } + + if (!$sub_renewal->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + // If product_type = file and csv file uploaded than do this + $productCSVfile = $this->input->files->get('serialcsvFile', array(), 'array'); + $ext = ""; + + if (isset($productCSVfile['name'])) + { + $ext = strtolower(JFile::getExt($productCSVfile['name'])); + } + + if (isset($productCSVfile['tmp_name']) && $productCSVfile['tmp_name'] != "") + { + if ($ext == 'csv') + { + if (($handle = fopen($productCSVfile['tmp_name'], "r")) !== false) + { + while (($csv_row = fgetcsv($handle, 1000, ",")) !== false) + { + if ($csv_row[0] != "") + { + $product_serial = $this->getTable('product_serial_number'); + $product_serial->serial_number = $csv_row[0]; + $product_serial->product_id = $row->product_id; + + if (!$product_serial->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + + fclose($handle); + } + else + { + $this->app->enqueueMessage(JText::_("COM_REDSHOP_CSV_FILE_NOT_UPLOADED_TRY_AGAIN"), 'notice'); + } + } + else + { + $this->app->enqueueMessage(JText::_("COM_REDSHOP_ONLY_CSV_FILE_ALLOWED"), 'notice'); + + return false; + } + } + + // Tags + $tagsHelper = new JHelperTags; + $tagsHelper->typeAlias = $this->typeAlias; + + $jtags = !empty($data['jtags']) ? $data['jtags'] : array(); + + $tagsHelper->preStoreProcess($row, $jtags); + $tagsHelper->postStoreProcess($row, $jtags); + + return $row; + } + + /** + * Function updateproductdiscount. + * + * @param array $mass_discount Object. + * @param object $row Data detail row. + * + * @return boolean + */ + public function updateproductdiscount($mass_discount, $row) + { + if (count($mass_discount) > 0) + { + $p_price = ($mass_discount->discount_type == 1) ? + ($row->product_price - ($row->product_price * $mass_discount->discount_amount / 100)) : + $mass_discount->discount_amount; + + $query = 'UPDATE ' . $this->table_prefix . 'product SET product_on_sale="1" ' + . ', discount_price="' . $p_price . '" , discount_stratdate="' . $mass_discount->discount_startdate . '" ' + . ', discount_enddate="' . $mass_discount->discount_enddate . '" WHERE product_id="' . $row->product_id . '" '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + return false; + } + } + + return true; + } + + /** + * Function delete. + * + * @param array $cid Array of IDs. + * + * @return boolean + * @throws Exception + */ + public function delete($cid = array()) + { + if (empty($cid)) + { + return true; + } + + $productIds = implode(',', $cid); + + if (empty($productIds)) + { + return false; + } + + $parents = array(); + $db = $this->_db; + + JPluginHelper::importPlugin('redshop_product'); + JPluginHelper::importPlugin('redshop_product_type'); + + RedshopHelperUtility::getDispatcher()->trigger('onBeforeProductDelete', array($cid)); + + $query = $db->getQuery(true) + ->select('COUNT(' . $db->qn('product_id') . ') AS ' . $db->qn('total')) + ->select($db->qn('product_parent_id')) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_parent_id') . ' IN (' . $productIds . ')') + ->group($db->qn('product_parent_id')); + + $parentIds = (array) $db->setQuery($query)->loadObjectList(); + + foreach ($parentIds as $parentId) + { + $parents[] = $parentId->product_parent_id; + $parentKeys = array_keys($cid, $parentId->product_parent_id); + unset($cid[$parentKeys[0]]); + } + + if (count($parentIds) > 0) + { + $parentIds = implode(',', $parents); + $errorMSG = sprintf(JText::_('COM_REDSHOP_PRODUCT_PARENT_ERROR_MSG'), $parentIds); + $this->app->enqueueMessage($errorMSG, 'error'); + + return false; + } + + $image_query = 'SELECT pa.attribute_id,pap.property_image + FROM ' . $this->table_prefix . 'product_attribute as pa,' . $this->table_prefix . 'product_attribute_property as pap + WHERE pa.product_id IN( ' . $productIds . ') and pa.attribute_id = pap.attribute_id'; + $this->_db->setQuery($image_query); + $property_image = $this->_db->loadObjectlist(); + + foreach ($property_image as $imagename) + { + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $imagename->property_image; + $tsrc = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/thumb/' . $imagename->property_image; + + if (JFile::exists($dest)) + { + JFile::delete($dest); + } + + if (JFile::exists($tsrc)) + { + JFile::delete($tsrc); + } + + // Subattribute delete + $subattr_delete = 'DELETE FROM ' . $this->table_prefix . 'product_subattribute_color WHERE subattribute_id ="' . + $imagename->property_id . '" '; + $this->_db->setQuery($subattr_delete); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + $attr_delete = 'DELETE FROM ' . $this->table_prefix . 'product_attribute WHERE attribute_id ="' . $imagename->attribute_id . '" '; + $this->_db->setQuery($attr_delete); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + $prop_delete = 'DELETE FROM ' . $this->table_prefix . 'product_attribute_property WHERE attribute_id ="' . $imagename->attribute_id . '" '; + $this->_db->setQuery($prop_delete); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + } + + $image_query = 'SELECT p.product_thumb_image, + p.product_full_image, + p.product_back_full_image, + p.product_back_thumb_image, + p.product_preview_image, + p.product_preview_back_image + FROM ' . $this->table_prefix . 'product as p + WHERE p.product_id IN( ' . $productIds . ')'; + $this->_db->setQuery($image_query); + $product_image = $this->_db->loadObjectlist(); + + foreach ($product_image as $imagename) + { + $dest_full = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $imagename->product_full_image; + $tsrc_thumb = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $imagename->product_thumb_image; + $dest_back_full = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $imagename->product_back_full_image; + $tsrc_back_thumb = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $imagename->product_back_thumb_image; + $dest_preview = REDSHOP_FRONT_IMAGES_RELPATH . '/product/' . $imagename->product_preview_image; + $tsrc_preview_back = REDSHOP_FRONT_IMAGES_RELPATH . '/product/' . $imagename->product_preview_back_image; + + if (JFile::exists($dest_full)) + { + JFile::delete($dest_full); + } + + if (JFile::exists($tsrc_thumb)) + { + JFile::delete($tsrc_thumb); + } + + if (JFile::exists($dest_back_full)) + { + JFile::delete($dest_back_full); + } + + if (JFile::exists($tsrc_back_thumb)) + { + JFile::delete($tsrc_back_thumb); + } + + if (JFile::exists($dest_preview)) + { + JFile::delete($dest_preview); + } + + if (JFile::exists($tsrc_preview_back)) + { + JFile::delete($tsrc_preview_back); + } + } + + $query = 'DELETE FROM ' . $this->table_prefix . 'product WHERE product_id IN ( ' . $productIds . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + $query_related = 'DELETE FROM ' . $this->table_prefix . 'product_accessory WHERE product_id IN ( ' . $productIds . ' )'; + + $this->_db->setQuery($query_related); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + $query_related = 'DELETE FROM ' . $this->table_prefix . 'product_related WHERE product_id IN ( ' . $productIds . ' )'; + + $this->_db->setQuery($query_related); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + $query_media = 'DELETE FROM ' . $this->table_prefix . 'media WHERE section_id IN ( ' . $productIds . ' ) AND media_section = "product"'; + $this->_db->setQuery($query_media); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + // Remove product category xref relation + $query_relation = 'DELETE FROM ' . $this->table_prefix . 'product_category_xref WHERE product_id IN ( ' . $productIds . ' ) '; + $this->_db->setQuery($query_relation); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + // Delete Association if Exist + + $check_asso = $this->CheckRedProductFinder(); + + if ($check_asso > 0) + { + $this->RemoveAssociation($cid); + } + + // Remove product tags relation + $query = 'DELETE FROM ' . $this->table_prefix . 'product_tags_xref WHERE product_id IN ( ' . $productIds . ' ) '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + // Remove product wishlist relation + $query = 'DELETE FROM ' . $this->table_prefix . 'wishlist_product WHERE product_id IN ( ' . $productIds . ' ) '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + // Remove product compare relation + $query = 'DELETE FROM ' . $this->table_prefix . 'product_compare WHERE product_id IN ( ' . $productIds . ' ) '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + // Remove fields_data relation + $query = 'DELETE FROM ' . $this->table_prefix . 'fields_data WHERE itemid IN ( ' . $productIds . ' ) '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + RedshopHelperUtility::getDispatcher()->trigger('onAfterProductDelete', array($cid)); + + return true; + } + + /** + * Function publish. + * + * @param array $cid Array of IDs. + * @param int $publish Publish. + * + * @return boolean + */ + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'UPDATE ' . $this->table_prefix . 'product' + . ' SET published = "' . intval($publish) . '" ' + . ' WHERE product_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + /** + * Function copy. + * + * @param array $cid Array of IDs. + * @param bool $postMorePriority Flag what data more priority for copy - POST or DB + * + * @return boolean|TableProduct_Detail + */ + public function copy($cid = array(), $postMorePriority = false) + { + $row = null; + $db = JFactory::getDbo(); + + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'SELECT * FROM ' . $this->table_prefix . 'product WHERE product_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + $this->copydata = $this->_db->loadObjectList(); + } + + foreach ($this->copydata as $pdata) + { + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_price WHERE product_id IN ( ' . $pdata->product_id . ' )'; + $this->_db->setQuery($query); + $productpricedata = $this->_db->loadObjectList(); + + $query = 'SELECT * FROM ' . $this->table_prefix . 'media WHERE media_section = "product" AND section_id IN ( ' . $pdata->product_id . ' ) ORDER BY media_id ASC'; + $this->_db->setQuery($query); + $mediadata = $this->_db->loadObjectList(); + + if (!$postMorePriority) + { + $query = 'SELECT category_id FROM ' . $this->table_prefix . 'product_category_xref + WHERE product_id IN ( ' . $pdata->product_id . ' )'; + $this->_db->setQuery($query); + $categorydata = $this->_db->loadObjectList(); + $copycategory = array(); + + for ($i = 0, $in = count($categorydata); $i < $in; $i++) + { + $copycategory[$i] = $categorydata[$i]->category_id; + } + + $query = $this->_db->getQuery(true); + $query->select('*') + ->from($this->_db->qn($this->table_prefix . 'product_stockroom_xref')) + ->where($this->_db->qn('product_id') . 'IN(' . $pdata->product_id . ')'); + $stockroomdata = $this->_db->setQuery($query)->loadObjectList(); + $copystockroom = array(); + $copyquantity = array(); + $copypreorder_stock = array(); + $copyordered_preorder = array(); + + for ($i = 0, $in = count($stockroomdata); $i < $in; $i++) + { + $copystockroom[$i] = $stockroomdata[$i]->stockroom_id; + $copyquantity[$i] = $stockroomdata[$i]->quantity; + $copypreorder_stock[$i] = $stockroomdata[$i]->preorder_stock; + $copyordered_preorder[$i] = $stockroomdata[$i]->ordered_preorder; + } + + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_accessory WHERE product_id IN ( ' . $pdata->product_id . ' )'; + $this->_db->setQuery($query); + $accessorydata = $this->_db->loadObjectList(); + $copyaccessory = array(); + + // Accessory_product. + for ($i = 0, $in = count($accessorydata); $i < $in; $i++) + { + $copyaccessory[$i] = (array) $accessorydata[$i]; + } + + if (!isset($pdata->use_individual_payment_method)) + { + $pdata->use_individual_payment_method = ''; + } + else + { + $post['payment_method'] = RedshopHelperPayment::getPaymentByIdProduct($pdata->product_id); + } + + $post['product_parent_id'] = $pdata->product_parent_id; + $post['manufacturer_id'] = $pdata->manufacturer_id; + $post['supplier_id'] = $pdata->supplier_id; + $post['product_on_sale'] = $pdata->product_on_sale; + $post['product_special'] = $pdata->product_special; + $post['product_download'] = $pdata->product_download; + $post['product_template'] = $pdata->product_template; + $post['product_name'] = $pdata->product_name; + $post['product_price'] = $pdata->product_price; + $post['discount_price'] = $pdata->discount_price; + $post['discount_stratdate'] = $pdata->discount_stratdate; + $post['discount_enddate'] = $pdata->discount_enddate; + $post['product_length'] = $pdata->product_length; + $post['product_height'] = $pdata->product_height; + $post['product_width'] = $pdata->product_width; + $post['product_diameter'] = $pdata->product_diameter; + $post['discount_calc_method'] = $pdata->discount_calc_method; + $post['use_discount_calc'] = $pdata->use_discount_calc; + $post['use_range'] = $pdata->use_range; + $post['product_number'] = $pdata->product_number; + $post['product_type'] = $pdata->product_type; + $post['product_s_desc'] = $pdata->product_s_desc; + $post['product_desc'] = $pdata->product_desc; + $post['product_volume'] = $pdata->product_volume; + $post['product_tax_id'] = $pdata->product_tax_id; + $post['attribute_set_id'] = $pdata->attribute_set_id; + $post['product_tax_group_id'] = $pdata->product_tax_group_id; + $post['min_order_product_quantity'] = $pdata->min_order_product_quantity; + $post['max_order_product_quantity'] = $pdata->max_order_product_quantity; + $post['accountgroup_id'] = $pdata->accountgroup_id; + $post['quantity_selectbox_value'] = $pdata->quantity_selectbox_value; + $post['not_for_sale'] = $pdata->not_for_sale; + $post['product_availability_date'] = $pdata->product_availability_date; + $post['published'] = 0; + $post['product_thumb_image'] = $pdata->product_thumb_image; + $post['product_full_image'] = $pdata->product_full_image; + $post['product_back_full_image'] = $pdata->product_back_full_image; + $post['product_back_thumb_image'] = $pdata->product_back_thumb_image; + $post['product_preview_image'] = $pdata->product_preview_image; + $post['product_preview_back_image'] = $pdata->product_preview_back_image; + $post['metakey'] = $pdata->metakey; + $post['metadesc'] = $pdata->metadesc; + $post['metalanguage_setting'] = $pdata->metalanguage_setting; + $post['metarobot_info'] = $pdata->metarobot_info; + $post['pagetitle'] = $pdata->pagetitle; + $post['pageheading'] = $pdata->pageheading; + $post['cat_in_sefurl'] = $pdata->cat_in_sefurl; + $post['weight'] = $pdata->weight; + $post['expired'] = $pdata->expired; + $post['sef_url'] = $pdata->sef_url; + $post['canonical_url'] = $pdata->canonical_url; + $post['product_category'] = $copycategory; + $post['quantity'] = $copyquantity; + $post['preorder_stock'] = $copypreorder_stock; + $post['ordered_preorder'] = $copyordered_preorder; + $post['stockroom_id'] = $copystockroom; + $post['product_accessory'] = $copyaccessory; + $post['use_individual_payment_method'] = $pdata->use_individual_payment_method; + } + else + { + $post = $this->input->post->getArray(); + $this->_initData(); + $post = array_merge($post, (array) $this->data); + } + + $post['copy_product'] = 1; + $post['product_id'] = 0; + $post['product_name'] = $this->renameToUniqueValue('product_name', $post['product_name']); + $post['product_number'] = $this->renameToUniqueValue('product_number', $post['product_number'], 'dash'); + $post['publish_date'] = date("Y-m-d H:i:s"); + $post['update_date'] = date("Y-m-d H:i:s"); + $post['visited'] = 0; + $post['checked_out'] = 0; + $post['checked_out_time'] = '0000-00-00 00:00:00'; + + if (isset($post['sef_url']) && $post['sef_url'] != '') + { + $post['sef_url'] = $this->renameToUniqueValue('sef_url', $post['sef_url'], 'dash'); + } + + if (isset($post['canonical_url']) && $post['canonical_url'] != '') + { + $post['canonical_url'] = $this->renameToUniqueValue('canonical_url', $post['canonical_url'], 'dash'); + } + + $new_product_thumb_image = $this->changeCopyImageName($post['product_thumb_image']); + $new_product_full_image = $this->changeCopyImageName($post['product_full_image']); + $new_product_back_full_image = $this->changeCopyImageName($post['product_back_full_image']); + $new_product_back_thumb_image = $this->changeCopyImageName($post['product_back_thumb_image']); + $new_product_preview_image = $this->changeCopyImageName($post['product_preview_image']); + $new_product_preview_back_image = $this->changeCopyImageName($post['product_preview_back_image']); + + // Prevent remove old images + if (isset($post['old_image'])) + { + unset($post['old_image']); + } + + if ($row = $this->store($post)) + { + $path = REDSHOP_FRONT_IMAGES_RELPATH . 'product/'; + copy($path . $pdata->product_full_image, $path . $new_product_full_image); + copy($path . $pdata->product_thumb_image, $path . $new_product_thumb_image); + copy($path . $pdata->product_preview_image, $path . $new_product_preview_image); + copy($path . $pdata->product_preview_back_image, $path . $new_product_preview_back_image); + copy($path . $pdata->product_back_full_image, $path . $new_product_back_full_image); + copy($path . $pdata->product_back_thumb_image, $path . $new_product_back_thumb_image); + + // Copy related product only when not send in POST data + // When POST data is set related product will be created using above store method. + if (!isset($post['related_product'])) + { + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_product_related')) + ->where('product_id = ' . (int) $pdata->product_id); + + $relatedProductData = $db->setQuery($query)->loadObjectList(); + + if ($relatedProductData) + { + foreach ($relatedProductData as $relatedData) + { + $query = $db->getQuery(true) + ->insert($db->qn('#__redshop_product_related')) + ->set('related_id = ' . (int) $relatedData->related_id) + ->set('product_id = ' . (int) $row->product_id) + ->set('ordering = ' . (int) $relatedData->ordering); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + } + } + } + + // Field_section 1 :Product. + RedshopHelperExtrafields::copyProductExtraField($pdata->product_id, $row->product_id); + + // End. + $this->copyProductAttribute($pdata->product_id, $row->product_id); + $this->copyDiscountCalcdata($pdata->product_id, $row->product_id, $pdata->discount_calc_method); + + for ($i = 0, $in = count($productpricedata); $i < $in; $i++) + { + $rowprices_detail = $this->getTable('prices_detail'); + $data['price_id '] = 0; + $data['product_id'] = $row->product_id; + $data['product_price'] = $productpricedata[$i]->product_price; + $data['product_currency'] = $productpricedata[$i]->product_currency; + $data['shopper_group_id'] = $productpricedata[$i]->shopper_group_id; + $data['price_quantity_start'] = $productpricedata[$i]->price_quantity_start; + $data['price_quantity_end'] = $productpricedata[$i]->price_quantity_end; + + if (!$rowprices_detail->bind($data)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$rowprices_detail->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + for ($j = 0, $jn = count($mediadata); $j < $jn; $j++) + { + $old_img = $mediadata[$j]->media_name; + $new_img = strstr($old_img, '_') ? strstr($old_img, '_') : $old_img; + $old_media = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $mediadata[$j]->media_name; + $mediaName = RedshopHelperMedia::cleanFileName($new_img); + + if ($pdata->product_full_image == $old_img) + { + $mediaName = $new_product_full_image; + } + + $new_media = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $mediaName; + copy($old_media, $new_media); + + $rowmedia = $this->getTable('media_detail'); + $data['media_id '] = 0; + $data['media_name'] = $mediaName; + $data['media_alternate_text'] = $mediadata[$j]->media_alternate_text; + $data['media_section'] = $mediadata[$j]->media_section; + $data['section_id'] = $row->product_id; + $data['media_type'] = $mediadata[$j]->media_type; + $data['media_mimetype'] = $mediadata[$j]->media_mimetype; + $data['published'] = $mediadata[$j]->published; + $data['ordering'] = $mediadata[$j]->ordering; + + if (!$rowmedia->bind($data)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$rowmedia->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + } + + return $row; + } + + /** + * Change Copy Image Name + * + * @param string &$imageName Image name + * + * @return null|string + */ + public function changeCopyImageName(&$imageName) + { + if ($imageName && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $imageName)) + { + $newImageName = strstr($imageName, '_') ? strstr($imageName, '_') : $imageName; + $newImageName = $imageName = RedshopHelperMedia::cleanFileName($newImageName); + } + else + { + $imageName = ''; + $newImageName = null; + } + + return $newImageName; + } + + /** + * Function copyProductAttribute. + * + * @param string|int $cid Array of IDs. + * @param int $product_id Product ID. + * + * @return boolean + */ + public function copyProductAttribute($cid, $product_id) + { + $db = $this->_db; + + $query = $db->getQuery(true) + ->select( + $db->qn( + array( + 'attribute_id', + 'attribute_name', + 'attribute_required', + 'ordering', + 'attribute_description', + 'attribute_published' + ) + ) + ) + ->from($db->qn('#__redshop_product_attribute')) + ->where($db->qn('product_id') . " IN ( " . $cid . " )") + ->order($db->qn('ordering')); + + $attribute = $db->setQuery($query)->loadObjectList(); + + for ($att = 0, $countAttribute = count($attribute); $att < $countAttribute; $att++) + { + $attribute[$att]->product_id = $product_id; + $oldAttributeId = $attribute[$att]->attribute_id; + $attribute[$att]->attribute_id = 0; + + $resultInsertAttr = $db->insertObject('#__redshop_product_attribute', $attribute[$att]); + + if (!$resultInsertAttr) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + $attribute_id = $this->_db->insertid(); + $query = 'SELECT * FROM `' . $this->table_prefix . 'product_attribute_property` + WHERE `attribute_id` = "' . $oldAttributeId . '" order by ordering asc'; + $this->_db->setQuery($query); + $att_property = $this->_db->loadObjectList(); + + + + for ($prop = 0, $countProperty = count($att_property); $prop < $countProperty; $prop++) + { + $property_save['attribute_id'] = $attribute_id; + $property_save['property_name'] = $att_property[$prop]->property_name; + $property_save['property_price'] = $att_property[$prop]->property_price; + $property_save['oprand'] = $att_property[$prop]->oprand; + $property_save['property_number'] = $att_property[$prop]->property_number; + $property_save['property_image'] = $att_property[$prop]->property_image; + $property_save['property_main_image'] = $att_property[$prop]->property_main_image; + $property_save['ordering'] = $att_property[$prop]->ordering; + $property_save['setrequire_selected'] = $att_property[$prop]->setrequire_selected; + $property_save['setdefault_selected'] = $att_property[$prop]->setdefault_selected; + $property_save['extra_field'] = $att_property[$prop]->extra_field; + $property_array = $this->store_pro($property_save); + $property_id = $property_array->property_id; + $listImages = $this->getImageInfor($att_property[$prop]->property_id, 'property'); + $property_image = ''; + $property_main_image = ''; + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn($this->table_prefix . 'product_attribute_price')) + ->where($db->qn('section_id') . ' = ' . $db->q($att_property[$prop]->property_id)); + + $price_prop = $db->setQuery($query)->loadObjectList(); + + for ($i = 0, $in = count($price_prop); $i < $in; $i++) + { + $attribute_price_detail = $this->getTable('attributeprices_detail'); + $attr_price['price_id '] = 0; + $attr_price['section_id'] = $property_id; + $attr_price['product_price'] = $price_prop[$i]->product_price; + $attr_price['section'] = $price_prop[$i]->section; + $attr_price['product_currency'] = $price_prop[$i]->product_currency; + $attr_price['cdate'] = $price_prop[$i]->cdate; + $attr_price['shopper_group_id'] = $price_prop[$i]->shopper_group_id; + $attr_price['price_quantity_start'] = $price_prop[$i]->price_quantity_start; + $attr_price['price_quantity_end'] = $price_prop[$i]->price_quantity_end; + $attr_price['discount_price'] = $price_prop[$i]->discount_price; + $attr_price['discount_start_date'] = $price_prop[$i]->discount_start_date; + $attr_price['discount_end_date'] = $price_prop[$i]->discount_end_date; + + if (!$attribute_price_detail->bind($attr_price)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$attribute_price_detail->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn($this->table_prefix . 'product_attribute_stockroom_xref')) + ->where($db->qn('section_id') . ' = ' . $db->q($att_property[$prop]->property_id)); + + $stock_prop = $db->setQuery($query)->loadObjectList(); + + for ($i = 0, $in = count($stock_prop); $i < $in; $i++) + { + $attr_stock['section_id'] = $property_id; + $attr_stock['section'] = $stock_prop[$i]->section; + $attr_stock['stockroom_id'][$i] = $stock_prop[$i]->stockroom_id; + $attr_stock['quantity'][$i] = $stock_prop[$i]->quantity; + $attr_stock['preorder_stock'][$i] = $stock_prop[$i]->preorder_stock; + $attr_stock['ordered_preorder'][$i] = $stock_prop[$i]->ordered_preorder; + + $this->SaveAttributeStockroom($attr_stock); + } + + // Update image names and copy + if (!empty($att_property[$prop]->property_image)) + { + $property_image = 'product_attributes/' . $att_property[$prop]->property_image; + $new_property_image = $this->copy_image_from_path($property_image, 'product_attributes'); + $property_image = $new_property_image; + } + + if (!empty($att_property[$prop]->property_main_image)) + { + $property_main_image = 'property/' . $att_property[$prop]->property_main_image; + $new_property_main_image = $this->copy_image_from_path($property_main_image, 'property'); + $property_main_image = $new_property_main_image; + } + + $this->update_attr_property_image($property_id, $property_image, $property_main_image); + + $countImage = count($listImages); + + for ($li = $countImage - 1; $li >= 0; $li--) + { + $mImages = array(); + $mImages['media_name'] = $listImages[$li]->media_name; + $mImages['media_alternate_text'] = $listImages[$li]->media_alternate_text; + $mImages['media_section'] = 'property'; + $mImages['section_id'] = $property_id; + $mImages['media_type'] = 'images'; + $mImages['media_mimetype'] = $listImages[$li]->media_mimetype; + $mImages['published'] = $listImages[$li]->published; + $isMainImage = false; + + // detect main image + if ($listImages[$li]->media_name == $att_property[$prop]->property_main_image) + { + $isMainImage = true; + } + + $this->copyadditionalImage($mImages, $isMainImage, $property_main_image); + } + + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_subattribute_color + WHERE `subattribute_id` = "' . $att_property[$prop]->property_id . '" order by ordering asc'; + $this->_db->setQuery($query); + $subatt_property = $this->_db->loadObjectList(); + $countSubProperty = count($subatt_property); + + for ($subprop = 0; $subprop < $countSubProperty; $subprop++) + { + $subproperty_save = array(); + $subproperty_save['subattribute_color_name'] = $subatt_property[$subprop]->subattribute_color_name; + $subproperty_save['subattribute_color_title'] = $subatt_property[$subprop]->subattribute_color_title; + $subproperty_save['subattribute_color_price'] = $subatt_property[$subprop]->subattribute_color_price; + $subproperty_save['oprand'] = $subatt_property[$subprop]->oprand; + $subproperty_save['subattribute_id'] = $property_id; + $subproperty_save['ordering'] = $subatt_property[$subprop]->ordering; + $subproperty_save['subattribute_color_number'] = $subatt_property[$subprop]->subattribute_color_number; + $subproperty_save['subattribute_color_image'] = $subatt_property[$subprop]->subattribute_color_image; + $subproperty_save['subattribute_color_main_image'] = $subatt_property[$subprop]->subattribute_color_main_image; + $subproperty_save['setdefault_selected'] = $subatt_property[$subprop]->setdefault_selected; + + $subproperty_array = $this->store_sub($subproperty_save); + $subproperty_id = $subproperty_array->subattribute_color_id; + $new_subattribute_color_image = ''; + $new_subattribute_color_main_image = ''; + + // Update image names and copy + if (!empty($subatt_property[$subprop]->subattribute_color_image)) + { + $subattribute_color_image = 'subcolor/' . $subatt_property[$subprop]->subattribute_color_image; + $new_subattribute_color_image = $this->copy_image_from_path($subattribute_color_image, 'subcolor'); + } + + if (!empty($subatt_property[$subprop]->subattribute_color_main_image)) + { + $subattribute_color_main_image = 'subproperty/' . $subatt_property[$subprop]->subattribute_color_main_image; + $new_subattribute_color_main_image = $this->copy_image_from_path($subattribute_color_main_image, 'subproperty'); + } + + $this->update_subattr_image($subproperty_id, $new_subattribute_color_image, $new_subattribute_color_main_image); + + $listsubpropImages = $this->getImageInfor($subatt_property[$subprop]->subattribute_color_id, 'subproperty'); + $countSubPropertyImage = count($listsubpropImages); + + for ($lsi = $countSubPropertyImage - 1; $lsi >= 0; $lsi--) + { + $smImages = array(); + $smImages['media_name'] = $listsubpropImages[$lsi]->media_name; + $smImages['media_alternate_text'] = $listsubpropImages[$lsi]->media_alternate_text; + $smImages['media_section'] = 'subproperty'; + $smImages['section_id'] = $subproperty_id; + $smImages['media_type'] = 'images'; + $smImages['media_mimetype'] = $listsubpropImages[$lsi]->media_mimetype; + $smImages['published'] = $listsubpropImages[$lsi]->published; + + $isMainImage = false; + + // detect main image + if ($listsubpropImages[$lsi]->media_name == $subatt_property[$subprop]->subattribute_color_main_image) + { + $isMainImage = true; + } + + $this->copyadditionalImage($smImages, $isMainImage, $new_subattribute_color_main_image); + } + } + } + } + + return true; + } + + /** + * Function gettax. + * + * @return array + */ + public function gettax() + { + $query = 'SELECT id as value,tax_rate as text FROM ' . $this->table_prefix . 'tax_rate '; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + /** + * Function getmanufacturers. + * + * @return array + */ + public function getmanufacturers() + { + $query = 'SELECT id as value,name as text FROM ' . $this->table_prefix . 'manufacturer + WHERE published=1 ORDER BY `name`'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + /** + * Function getsupplier. + * + * @return array + */ + public function getsupplier() + { + $query = 'SELECT id as value,name as text FROM ' . $this->table_prefix . 'supplier '; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + /** + * Function getproductcats. + * + * @return array + */ + public function getproductcats() + { + $query = 'SELECT category_id FROM ' . $this->table_prefix . 'product_category_xref WHERE product_id="' . $this->id . '" '; + $this->_db->setQuery($query); + + return $this->_db->loadColumn(); + } + + /** + * Function getprductpaymes. + * + * @return array + */ + public function getproductpayments() + { + $db = $this->_db; + $query = $db->getQuery(true); + $query + ->select($db->qn('a.payment_id')) + ->from($db->qn($this->table_prefix . 'product_payment_xref', 'a')) + ->where($db->qn('a.product_id') . ' = ' . $db->q($this->id)); + + return $db->setQuery($query)->loadColumn(); + } + + /** + * Function catin_sefurl. + * + * @return array + */ + public function catin_sefurl() + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('c.id', 'value')) + ->select($db->qn('c.name', 'text')) + ->from($db->qn('#__redshop_product_category_xref', 'pcx')) + ->leftjoin($db->qn('#__redshop_category', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pcx.category_id')) + ->where($db->qn('pcx.product_id') . ' = ' . $db->q((int) $this->id)); + + return $db->setQuery($query)->loadObjectlist(); + } + + /** + * Function getPropertyImages. + * + * @param int $property_id Property ID. + * + * @return array + */ + public function getPropertyImages($property_id) + { + $query = "SELECT * FROM " . $this->table_prefix . "product_attribute_property as p, " . $this->table_prefix . "media AS m + WHERE m.section_id = p.property_id and m.media_section='property' and media_type='images' + AND p.property_id = '" . $property_id . "' and m.published = 1 order by m.ordering,m.media_id asc"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + /** + * Function getSubpropertyImages. + * + * @param int $subproperty_id Subproperty ID. + * + * @return array + */ + public function getSubpropertyImages($subproperty_id) + { + $query = "SELECT * FROM " . $this->table_prefix . "product_subattribute_color as p, " . $this->table_prefix . "media AS m + WHERE m.section_id = p.subattribute_color_id and m.media_section='subproperty' and media_type='images' + AND p.subattribute_color_id = '" . $subproperty_id . "' and m.published = 1 order by m.ordering,m.media_id asc"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + /** + * Function getPropertyMainImage. + * + * @param int $property_id Property ID. + * + * @return array + */ + public function getPropertyMainImage($property_id) + { + $query = "SELECT * FROM " . $this->table_prefix . "product_attribute_property as p + WHERE p.property_id = '" . $property_id . "' ORDER BY p.property_id ASC "; + $this->_db->setQuery($query); + + return $this->_db->loadObject(); + } + + /** + * Function getSubAttributeColor. + * + * @param int $property_id Property ID. + * + * @return array + */ + public function getSubAttributeColor($property_id) + { + $query = "SELECT * FROM " . $this->table_prefix . "product_attribute_property AS p, + " . $this->table_prefix . "product_subattribute_color AS m + WHERE m.subattribute_id = p.property_id and p.property_id = '" . $property_id . "' "; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + /** + * Function getParentProduct. + * + * @param int $product_id Product ID. + * + * @return array + */ + public function getParentProduct($product_id) + { + $query = "SELECT product_name FROM " . $this->table_prefix . "product + WHERE product_id = '" . $product_id . "' "; + $this->_db->setQuery($query); + + return $this->_db->loadResult(); + } + + /** + * Function getattributes. + * + * @return mixed + */ + public function getattributes() + { + if ($this->id != 0) + { + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_attribute WHERE product_id="' . $this->id . '" ORDER BY ordering ASC'; + + $this->_db->setQuery($query); + $attr = $this->_db->loadObjectlist(); + $attribute_data = array(); + + for ($i = 0, $in = count($attr); $i < $in; $i++) + { + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_attribute_property WHERE attribute_id ="' + . $attr[$i]->attribute_id . '" ORDER BY ordering ASC'; + + $this->_db->setQuery($query); + $prop = $this->_db->loadObjectlist(); + $attribute_id = $attr[$i]->attribute_id; + $attribute_name = $attr[$i]->attribute_name; + $attribute_description = $attr[$i]->attribute_description; + $attribute_required = $attr[$i]->attribute_required; + $allow_multiple_selection = $attr[$i]->allow_multiple_selection; + $hide_attribute_price = $attr[$i]->hide_attribute_price; + $ordering = $attr[$i]->ordering; + $attribute_published = $attr[$i]->attribute_published; + $display_type = $attr[$i]->display_type; + + for ($j = 0, $jn = count($prop); $j < $jn; $j++) + { + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_subattribute_color WHERE subattribute_id ="' + . $prop[$j]->property_id . '" ORDER BY ordering ASC'; + $this->_db->setQuery($query); + $subprop = $this->_db->loadObjectlist(); + $prop[$j]->subvalue = $subprop; + } + + $attribute_data[] = array('attribute_id' => $attribute_id, 'attribute_name' => $attribute_name, + 'attribute_description' => $attribute_description, + 'attribute_required' => $attribute_required, 'ordering' => $ordering, 'property' => $prop, + 'allow_multiple_selection' => $allow_multiple_selection, 'hide_attribute_price' => $hide_attribute_price, + 'attribute_published' => $attribute_published, 'display_type' => $display_type, + 'attribute_set_id' => $attr[$i]->attribute_set_id); + } + + return $attribute_data; + } + + return false; + } + + /** + * Function getpropertylist. + * + * @param array $data Data. + * + * @return array + */ + public function getpropertylist($data) + { + $prop = null; + + if (count($data)) + { + $cids = implode(',', $data); + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_attribute_property WHERE property_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + $prop = $this->_db->loadObjectlist(); + } + + return $prop; + } + + /** + * Function deleteprop. + * + * @param array $cid Array of IDs. + * @param array $image_name Image name. + * + * @return boolean + */ + public function deleteprop($cid = array(), $image_name = array()) + { + if (!empty($cid)) + { + $cids = implode(',', $cid); + + foreach ($image_name as $imagename) + { + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $imagename; + + $tsrc = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/thumb/' . $imagename; + + if (file_exists($dest)) + { + JFile::delete($dest); + } + + if (file_exists($tsrc)) + { + JFile::delete($tsrc); + } + } + + $query = 'DELETE FROM ' . $this->table_prefix . 'product_attribute_property WHERE property_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + else + { + // Changed 5 feb + $query = 'DELETE FROM ' . $this->table_prefix . 'product_subattribute_color WHERE subattribute_id IN (' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + + return true; + } + + /** + * Function property_image_list. + * + * @param string $cid string of IDs. + * + * @return array + */ + public function property_image_list($cid) + { + $prop = null; + + if ($cid != null) + { + $image_query = 'SELECT property_image FROM ' . $this->table_prefix . 'product_attribute_property WHERE attribute_id IN ( ' . $cid . ' )'; + $this->_db->setQuery($image_query); + $prop = $this->_db->loadObjectlist(); + } + + return $prop; + } + + /** + * Function store_attr. + * + * @param array $data Array of IDs. + * + * @return mixed + */ + public function store_attr($data) + { + $row = $this->getTable('product_attribute'); + + if (!$row->bind($data)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + /** + * Function store_pro. + * + * @param array $data Array of IDs. + * + * @return mixed + */ + public function store_pro($data) + { + $row = $this->getTable('attribute_property'); + + if (!$row->bind($data)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + /** + * Function store_sub. + * + * @param array $data Array of IDs. + * + * @return mixed + */ + public function store_sub($data) + { + $row = $this->getTable('subattribute_property'); + + if (!$row->bind($data)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + /** + * Function accessory_product_data. + * + * @param int $product_id Product ID. + * + * @return array + */ + public function accessory_product_data($product_id) + { + $query = "SELECT cp.child_product_id as product_id, + p.product_name, + cp.accessory_price as price, + cp.oprand, + p.product_price as normal_price + FROM " . $this->table_prefix . "product as p , " . $this->table_prefix . "product_accessory as cp + WHERE cp.product_id='" . $product_id . "' and cp.child_product_id=p.product_id "; + $this->_db->setQuery($query); + $productdata = $this->_db->loadObjectList(); + + return $productdata; + } + + /** + * Function related_product_data. + * + * @param int $product_id Product ID. + * + * @return array + */ + public function related_product_data($product_id) + { + $query = "SELECT cp.related_id as value,p.product_name as text + FROM " . $this->table_prefix . "product as p , " . $this->table_prefix . "product_related as cp + WHERE cp.product_id='" . $product_id . "' and cp.related_id=p.product_id order by cp.ordering asc"; + $this->_db->setQuery($query); + $productdata = $this->_db->loadObjectList(); + + return $productdata; + } + + /** + * Function property_more_img. + * + * @param array $post Post. + * @param array $main_img Main img. + * @param array $sub_img Sub img. + * + * @return mixed + */ + public function property_more_img($post, $main_img, $sub_img) + { + if ($main_img['name'] != '') + { + $filetype = strtolower(JFile::getExt($main_img['name'])); + + if ($filetype != 'png' && $filetype != 'gif' && $filetype != 'jpeg' && $filetype != 'jpg') + { + return false; + } + + else + { + $main_name = RedshopHelperMedia::cleanFileName($main_img['name']); + $main_src = $main_img['tmp_name']; + + if ($post['fsec'] == 'subproperty') + { + $main_dest = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $main_name; + + JFile::upload($main_src, $main_dest); + + $query = "UPDATE " . $this->table_prefix . "product_subattribute_color SET subattribute_color_image = '" . $main_name . + "' WHERE subattribute_color_id ='" . $post['section_id'] . "' "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + else + { + $main_dest = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $main_name; + + JFile::upload($main_src, $main_dest); + + $query = "UPDATE " . $this->table_prefix . "product_attribute_property SET property_main_image = '" . $main_name + . "' WHERE property_id ='" . $post['section_id'] . "' "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + } + } + + $num = count($sub_img['name']); + + for ($i = 0; $i < $num; $i++) + { + if ($sub_img['name'][$i] != "") + { + $filetype = strtolower(JFile::getExt($sub_img['name'][$i])); + + if ($filetype != 'png' && $filetype != 'gif' && $filetype != 'jpeg' && $filetype != 'jpg') + { + return false; + } + + else + { + $sub_name = RedshopHelperMedia::cleanFileName($sub_img['name'][$i]); + + $sub_src = $sub_img['tmp_name'][$i]; + + $sub_type = $sub_img['type'][$i]; + + $sub__dest = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $sub_name; + + JFile::upload($sub_src, $sub__dest); + + $mediarow = $this->getTable('media_detail'); + $mediapost = array(); + $mediapost['media_id'] = 0; + $mediapost['media_name'] = $sub_name; + $mediapost['media_section'] = $post['fsec']; + $mediapost['section_id'] = $post['section_id']; + $mediapost['media_type'] = "images"; + $mediapost['media_mimetype'] = $sub_type; + $mediapost['published'] = 1; + + if (!$mediarow->bind($mediapost)) + { + return false; + } + + if (!$mediarow->store()) + { + return false; + } + } + } + } + + return true; + } + + /** + * Function deletesubimage. + * + * @param int $mediaid Media ID. + * + * @return boolean + */ + public function deletesubimage($mediaid) + { + $query = 'SELECT * FROM ' . $this->table_prefix . 'media WHERE media_id = ' . $mediaid; + $this->_db->setQuery($query); + $imgdata = $this->_db->loadObject(); + + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $imgdata->media_name; + $tsrc = REDSHOP_FRONT_IMAGES_RELPATH . 'property/thumb/' . $imgdata->media_name; + + if (file_exists($dest)) + { + JFile::delete($dest); + } + + if (file_exists($tsrc)) + { + JFile::delete($tsrc); + } + + $query = 'DELETE FROM ' . $this->table_prefix . 'media WHERE media_id = "' . $mediaid . '" '; + + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + /** + * Function subattribute_color. + * + * @param array $post Post. + * @param array $sub_img Sub img. + * + * @return boolean + */ + public function subattribute_color($post, $sub_img) + { + $num = count($sub_img['name']); + + for ($i = 0; $i < $num; $i++) + { + if ($sub_img['name'][$i] != "") + { + $filetype = strtolower(JFile::getExt($sub_img['name'][$i])); + + if ($filetype != 'png' && $filetype != 'gif' && $filetype != 'jpeg' && $filetype != 'jpg') + { + return false; + } + + else + { + $sub_name = RedshopHelperMedia::cleanFileName($sub_img['name'][$i]); + + $sub_src = $sub_img['tmp_name'][$i]; + + $sub__dest = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $sub_name; + + JFile::upload($sub_src, $sub__dest); + + if ($post['property_sub_img_tmp'][$i] != "") + { + $sub = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $post['property_sub_img_tmp'][$i]; + $sub_thumb = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/thumb/' . $post['property_sub_img_tmp'][$i]; + + if (file_exists($sub)) + { + JFile::delete($sub); + } + + if (file_exists($sub_thumb)) + { + JFile::delete($sub_thumb); + } + } + + $subpost = array(); + $subpost['subattribute_color_id'] = $post['subattribute_color_id'][$i]; + $subpost['subattribute_color_name'] = $post['subattribute_name'][$i]; + $subpost['subattribute_color_image'] = $sub_name; + $subpost['subattribute_id'] = $post['section_id']; + $this->store_sub($subpost); + } + } + else + { + if ($post['property_sub_img_tmp'][$i] != "" && $sub_img['name'][$i] == "") + { + $subpost = array(); + $subpost['subattribute_color_id'] = $post['subattribute_color_id'][$i]; + $subpost['subattribute_color_name'] = $post['subattribute_name'][$i]; + $subpost['subattribute_color_image'] = $post['property_sub_img_tmp'][$i]; + $subpost['subattribute_id'] = $post['section_id']; + $this->store_sub($subpost); + } + } + } + + return true; + } + + /** + * Function subattr_diff. + * + * @param string $subattr_id ID. + * @param int $section_id ID. + * + * @return array + */ + public function subattr_diff($subattr_id, $section_id) + { + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_subattribute_color + WHERE subattribute_id = "' . $section_id . '" + AND subattribute_color_id NOT IN (\'' . $subattr_id . '\') + ORDER BY subattribute_color_id ASC'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + /** + * Function delsubattr_diff. + * + * @param array $subattr_diff ID. + * + * @return boolean + */ + public function delsubattr_diff($subattr_diff) + { + foreach ($subattr_diff as $diff) + { + $sub_dest = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $diff->subattribute_color_image; + + if (file_exists($sub_dest)) + { + JFile::delete($sub_dest); + } + + $query = 'DELETE FROM ' . $this->table_prefix . 'product_subattribute_color WHERE subattribute_color_id = "' . + $diff->subattribute_color_id . '"'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + /** + * Check That redproductfinder is installed or not. + * + * @return array + */ + public function CheckRedProductFinder() + { + $query = "SELECT extension_id FROM `#__extensions` WHERE `element` LIKE '%com_redproductfinder%'"; + $this->_db->setQuery($query); + + return $this->_db->loadResult(); + } + + /** + * Get Association related to perticular Product + * + * @return array + */ + public function getAssociation() + { + if (!$this->CheckRedProductFinder()) + { + return array(); + } + + $query = "SELECT * FROM `#__redproductfinder_associations` WHERE `product_id` ='" . $this->id . "'"; + $this->_db->setQuery($query); + + return $this->_db->loadObject(); + } + + /** + * Show all tags that have been created + * + * @return array + */ + public function Associations() + { + if (!$this->CheckRedProductFinder()) + { + return array(); + } + + // Get all the fields based on the limits + + $query = "SELECT a.*, p.product_name + FROM #__redproductfinder_associations a, " . $this->table_prefix . "product p + WHERE a.product_id = p.product_id + ORDER BY a.ordering"; + $this->_db->setQuery($query); + $products = $this->_db->loadObjectList(); + + return $products; + } + + /** + * Get a multi-select list with types and tags + * + * @return array + */ + public function TypeTagList() + { + if (!$this->CheckRedProductFinder()) + { + return array(); + } + + // 1. Get all types. + $q = "SELECT id, type_name FROM #__redproductfinder_types where type_select!='Productfinder_datepicker' ORDER by ordering"; + $this->_db->setQuery($q); + $types = $this->_db->loadAssocList('id'); + + // 2. Go through each type and get the tags. + if (count($types) > 0) + { + foreach ($types as $id => $type) + { + $q = "SELECT t.id, tag_name + FROM #__redproductfinder_tag_type j, #__redproductfinder_tags t + WHERE j.tag_id = t.id + AND j.type_id = '" . $id . "' + ORDER BY t.ordering"; + $this->_db->setQuery($q); + $types[$id]['tags'] = $this->_db->loadAssocList('id'); + } + } + + return $types; + } + + /** + * Get the list of selected type names for this tag + * + * @return array + */ + public function AssociationTagNames() + { + if (!$this->CheckRedProductFinder()) + { + return array(); + } + + $q = "SELECT association_id, CONCAT(y.type_name, ':', g.tag_name) AS tag_name + FROM #__redproductfinder_association_tag a + LEFT JOIN #__redproductfinder_tags g ON a.tag_id = g.id + LEFT JOIN #__redproductfinder_types y ON a.type_id = y.id"; + $this->_db->setQuery($q); + $list = $this->_db->loadObjectList(); + $sortlist = array(); + + if (count($list) > 0) + { + foreach ($list as $tag) + { + $sortlist[$tag->association_id][] = $tag->tag_name; + } + } + + return $sortlist; + } + + /** + * Show all tags that have been created. + * + * @return array + */ + public function Tags() + { + if (!$this->CheckRedProductFinder()) + { + return array(); + } + + // Get all the fields based on the limits + + $query = "SELECT t.* FROM #__redproductfinder_tags t + LEFT JOIN #__redproductfinder_tag_type y ON t.id = y.tag_id + GROUP BY t.id + ORDER BY t.ordering"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + /** + * Get the list of selected types for this tag. + * + * @param int $id ID. + * + * @return array + */ + public function AssociationTags($id) + { + if (!$this->CheckRedProductFinder()) + { + return array(); + } + + if (!$id) + { + return array(); + } + else + { + $q = "SELECT tag_id + FROM #__redproductfinder_association_tag + WHERE association_id = '" . $id . "' "; + $this->_db->setQuery($q); + + return $this->_db->loadColumn(); + } + } + + /** + * Save an association. + * + * @param int $product_id ID. + * @param array $post $_POST. + * + * @return boolean|array + */ + public function SaveAssociations($product_id, $post) + { + if (!$this->CheckRedProductFinder()) + { + return array(); + } + + $row = $this->getTable('associations'); + + // Get the posted data. + $association = array(); + $association['id'] = $post['association_id']; + $association['published'] = 1; + $association['checked_out'] = 0; + $association['checked_out_time'] = '0000-00-00 00:00:00'; + $association['ordering'] = 1; + $association['product_id'] = $product_id; + + if (!$row->bind($association)) + { + return false; + } + + // Save the changes. + if (!$row->store()) + { + return false; + } + else + { + // Delete all tag type relations. + $q = "DELETE FROM #__redproductfinder_association_tag + WHERE association_id = '" . $row->id . "' "; + $this->_db->setQuery($q); + $this->_db->execute(); + + // Store the tag type relations. + $tags = $this->input->get('tag_id', array(), 'array'); + $qs = $this->input->get('qs_id', array(), 'array'); + + if (count($tags) > 0) + { + foreach ($tags as $tag) + { + // Split tag to type ID and tag ID. + list($type_id, $tag_id) = explode('.', $tag); + + if (empty($qs[$type_id . '.' . $tag_id])) + { + $qs_id = 0; + } + else + { + $qs_id = $qs[$type_id . '.' . $tag_id]; + } + + $q = "INSERT IGNORE INTO #__redproductfinder_association_tag + VALUES (" . $row->id . "," . $tag_id . "," . $type_id . ",'" . $qs_id . "')"; + $this->_db->setQuery($q); + $this->_db->execute(); + } + } + } + + $row->reorder(); + + return true; + } + + /** + * Get all Quality Score values. + * + * @return array + */ + public function getQualityScores() + { + if (empty($this->CheckRedProductFinder())) + { + return array(); + } + + $association = $this->getAssociation(); + + if (!empty($association)) + { + $query = "SELECT CONCAT(type_id,'.',tag_id) AS qs_id, quality_score + FROM #__redproductfinder_association_tag WHERE association_id = '" . $association->id . "' "; + $this->_db->setQuery($query); + + return $this->_db->loadAssocList('qs_id'); + } + + return array(); + } + + /** + * Delete a product. + * + * @param array $cid ID. + * + * @return array|boolean + */ + public function RemoveAssociation($cid) + { + $asscid = array(); + + if (empty($this->CheckRedProductFinder())) + { + return array(); + } + + $database = JFactory::getDbo(); + + if (count($cid)) + { + $cids = 'product_id=' . implode(' OR product_id=', $cid); + + $q = "SELECT id FROM #__redproductfinder_associations WHERE (" . $cids . ")"; + $database->setQuery($q); + $asso = $database->loadObjectList(); + + foreach ($asso as $newasso) + { + $asscid[] = $newasso->id; + } + + $query = "DELETE FROM #__redproductfinder_associations WHERE (" . $cids . ")"; + $database->setQuery($query); + + if (!$database->execute()) + { + } + else + { + // Now remove the type associations + + $cids = 'association_id=' . implode(' OR association_id=', $asscid); + $query = "DELETE FROM #__redproductfinder_association_tag WHERE (" . $cids . ")"; + $database->setQuery($query); + $database->execute(); + } + } + + return true; + } + + /** + * Get dependent tags. + * + * @param int $product_id ID. + * @param int $type_id ID. + * @param int $tag_id ID. + * + * @return array + */ + public function getDependenttag($product_id = 0, $type_id = 0, $tag_id = 0) + { + $where = " product_id='" . $product_id . "'"; + $where .= " AND type_id='" . $type_id . "'"; + $where .= " AND tag_id='" . $tag_id . "'"; + $query = "SELECT dependent_tags FROM #__redproductfinder_dependent_tag WHERE " . $where; + $this->_db->setQuery($query); + $rs = $this->_db->loadResult(); + + return explode(",", $rs); + } + + /** + * Getting the list of StockRoom. + * + * @return array + */ + public function StockRoomList() + { + $database = JFactory::getDbo(); + + $q = "SELECT * FROM " . $this->table_prefix . "stockroom WHERE published = 1"; + $database->setQuery($q); + $arrStockrooms = $database->loadObjectList(); + + return $arrStockrooms; + } + + /** + * Getting the StockRoom Product Quantity. + * + * @param int $pid ID. + * @param int $sid ID. + * + * @return int + */ + public function StockRoomProductQuantity($pid, $sid) + { + $database = JFactory::getDbo(); + + $q = "SELECT `quantity` FROM `" . $this->table_prefix . "product_stockroom_xref` + WHERE `product_id` = '" . $pid . "' + AND `stockroom_id` = '" . $sid . "' "; + $database->setQuery($q); + $quantity = $database->loadResult(); + + return $quantity; + } + + /** + * Getting the StockRoom Product Quantity. + * + * @param int $pid ID. + * @param int $sid ID. + * @param int $section ID. + * + * @return integer + */ + public function StockRoomAttProductQuantity($pid, $sid, $section) + { + $database = JFactory::getDbo(); + + $q = "SELECT `quantity` FROM `" . $this->table_prefix . "product_attribute_stockroom_xref` + WHERE `section_id` = '" . $pid . "' + AND `stockroom_id` = '" . $sid . "' + AND section = '" . $section . "'"; + $database->setQuery($q); + $quantity = $database->loadResult(); + + return $quantity; + } + + /** + * StockRoomAttProductPreorderstock. + * + * @param int $pid ID. + * @param int $sid ID. + * @param int $section ID. + * + * @return array + */ + public function StockRoomAttProductPreorderstock($pid, $sid, $section) + { + $database = JFactory::getDbo(); + + $q = "SELECT `preorder_stock`, `ordered_preorder` + FROM `" . $this->table_prefix . "product_attribute_stockroom_xref` + WHERE `section_id` = '" . $pid . "' and `stockroom_id` = '" . $sid . "' + AND section = '" . $section . "'"; + $database->setQuery($q); + $preorder_stock_data = $database->loadObjectList(); + + return $preorder_stock_data; + } + + /** + * Getting Preorder Stock Quantity. + * + * @param int $pid ID. + * @param int $sid ID. + * + * @return array + */ + public function StockRoomPreorderProductQuantity($pid, $sid) + { + $database = JFactory::getDbo(); + + $q = "SELECT `preorder_stock`, `ordered_preorder` FROM `" . $this->table_prefix . "product_stockroom_xref` + WHERE `product_id` = '" . $pid . "' and `stockroom_id` = '" . $sid . "' "; + $database->setQuery($q); + $preorder_stock_data = $database->loadObjectList(); + + return $preorder_stock_data; + } + + /** + * Store stockroom product xref. + * + * @param int $pid ID. + * @param array $post Post. + * + * @return boolean + */ + public function SaveStockroom($pid, $post) + { + $database = JFactory::getDbo(); + $query = "DELETE FROM " . $this->table_prefix . "product_stockroom_xref" + . "\n WHERE product_id = '" . $pid . "' "; + + $database->setQuery($query); + + if (!$database->execute()) + { + return false; + } + else + { + for ($i = 0, $countQuantity = count($post['quantity']); $i < $countQuantity; $i++) + { + $this->insertProductStock($pid, $post['stockroom_id'][$i], $post['quantity'][$i]); + } + } + + return true; + } + + /** + * Function attribute_empty. + * + * @return boolean + */ + public function attribute_empty() + { + $producthelper = /** @scrutinizer ignore-deprecated */ productHelper::getInstance(); + $database = JFactory::getDbo(); + + if ($this->id) + { + $attributes = /** @scrutinizer ignore-deprecated */ $producthelper->getProductAttribute($this->id); + + for ($i = 0, $in = count($attributes); $i < $in; $i++) + { + $query = "DELETE FROM `" . $this->table_prefix . "product_attribute` WHERE `attribute_id` = '" + . $attributes[$i]->attribute_id . "' "; + $database->setQuery($query); + + if ($database->execute()) + { + $property = RedshopHelperProduct_Attribute::getAttributeProperties(0, $attributes[$i]->attribute_id); + + for ($j = 0, $jn = count($property); $j < $jn; $j++) + { + $query = "DELETE FROM `" . $this->table_prefix . "product_attribute_property` WHERE `property_id` = '" + . $property[$j]->property_id . "' "; + $database->setQuery($query); + + if ($database->execute()) + { + $query = "DELETE FROM `" . $this->table_prefix . "product_subattribute_color` WHERE `subattribute_id` = '" + . $property[$j]->property_id . "' "; + $database->setQuery($query); + $database->execute(); + } + } + } + } + } + + return true; + } + + /** + * Remove property image. + * + * @param int $pid ID. + * + * @return boolean + */ + public function removepropertyImage($pid) + { + $query = "SELECT property_image FROM `" . $this->table_prefix . "product_attribute_property` WHERE property_id = '" . $pid . "' "; + $this->_db->setQuery($query); + $image = $this->_db->LoadObject(); + $imagename = $image->property_image; + + $imagethumbsrcphy = REDSHOP_FRONT_IMAGES_RELPATH . "product_attributes/thumb/" . $imagename; + + if (JFile::exists($imagethumbsrcphy)) + { + JFile::delete($imagethumbsrcphy); + } + + $imagesrcphy = REDSHOP_FRONT_IMAGES_RELPATH . "product_attributes/" . $imagename; + + if (JFile::exists($imagesrcphy)) + { + JFile::delete($imagesrcphy); + } + + $query = "UPDATE `" . $this->table_prefix . "product_attribute_property` SET `property_image` = '' WHERE `property_id` = '" . $pid . "' "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + return false; + } + + return true; + } + + /** + * Function removesubpropertyImage. + * + * @param int $pid ID. + * + * @return boolean + */ + public function removesubpropertyImage($pid) + { + $query = "SELECT subattribute_color_image + FROM `" . $this->table_prefix . "product_subattribute_color` + WHERE subattribute_color_id = '" . $pid . "' "; + $this->_db->setQuery($query); + $image = $this->_db->LoadObject(); + $imagename = $image->subattribute_color_image; + + $imagethumbsrcphy = REDSHOP_FRONT_IMAGES_RELPATH . "subcolor/thumb/" . $imagename; + + if (JFile::exists($imagethumbsrcphy)) + { + JFile::delete($imagethumbsrcphy); + } + + $imagesrcphy = REDSHOP_FRONT_IMAGES_RELPATH . "subcolor/" . $imagename; + + if (JFile::exists($imagesrcphy)) + { + JFile::delete($imagesrcphy); + } + + $query = "UPDATE `" . $this->table_prefix . "product_subattribute_color` + SET `subattribute_color_image` = '' + WHERE `subattribute_color_id` = '" . $pid . "' "; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + return false; + } + + return true; + } + + /** + * Function getQuantity. + * + * @param string $stockroom_type Type. + * @param int $sid ID. + * @param int $pid ID. + * + * @return array + */ + public function getQuantity($stockroom_type, $sid, $pid) + { + $product = " AND product_id='" . $pid . "' "; + $section = ""; + $stock = ""; + $table = "product"; + + if ($stockroom_type != 'product') + { + $product = " AND section_id='" . $pid . "' "; + $section = " AND section = '" . $stockroom_type . "' "; + $table = "product_attribute"; + } + + if ($sid != 0) + { + $stock = "AND stockroom_id='" . $sid . "' "; + } + + $query = "SELECT * FROM " . $this->table_prefix . $table . "_stockroom_xref + WHERE 1=1 " . $stock . $product . $section; + + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + /** + * Function SaveAttributeStockroom. + * + * @param array $post Type. + * + * @return array|boolean + */ + public function SaveAttributeStockroom($post) + { + $product = " AND section_id='" . $post['section_id'] . "' "; + $section = " AND section = '" . $post['section'] . "' "; + $table = "product_attribute"; + + for ($i = 0, $countQuantity = count($post['quantity']); $i < $countQuantity; $i++) + { + $preorder_stock = $post['preorder_stock'][$i]; + $ordered_preorder = $post['ordered_preorder'][$i]; + $sid = $post['stockroom_id'][$i]; + $quantity = $post['quantity'][$i]; + $stock_update = false; + $list = $this->getQuantity($post['section'], $sid, $post['section_id']); + + if ($list[0]->section_id == 0) + { + $list = array(); + } + + if (count($list) > 0) + { + if ($quantity == "" && Redshop::getConfig()->get('USE_BLANK_AS_INFINITE')) + { + $query = "DELETE FROM " . $this->table_prefix . $table . "_stockroom_xref + WHERE stockroom_id='" . $post['stockroom_id'][$i] . "' " . $product . $section; + $this->_db->setQuery($query); + $this->_db->execute(); + } + else + { + if (($preorder_stock < $ordered_preorder) && $preorder_stock != "" && $ordered_preorder != "") + { + $this->app->enqueueMessage(JText::_('COM_REDSHOP_PREORDER_STOCK_NOT_ALLOWED'), 'notice'); + + return false; + } + else + { + $query = "UPDATE " . $this->table_prefix . $table . "_stockroom_xref + SET quantity='" . $quantity . "' , preorder_stock= '" . $preorder_stock . "' + WHERE stockroom_id='" . $sid . "'" . $product . $section; + $this->_db->setQuery($query); + $this->_db->execute(); + $stock_update = true; + } + } + } + else + { + if ($preorder_stock < $ordered_preorder && $preorder_stock != "" && $ordered_preorder != "") + { + $msg = JText::_('COM_REDSHOP_PREORDER_STOCK_NOT_ALLOWED'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return false; + } + else + { + if (Redshop::getConfig()->get('USE_BLANK_AS_INFINITE')) + { + $this->InsertStockroom( + $post['section_id'], + $post['section'], + $post['stockroom_id'][$i], + $post['quantity'][$i], + $preorder_stock, + $ordered_preorder + ); + + $stock_update = true; + } + elseif ($preorder_stock != "" || $quantity != "") + { + $this->InsertStockroom( + $post['section_id'], + $post['section'], + $post['stockroom_id'][$i], + (int) $post['quantity'][$i], + (int) $preorder_stock, + $ordered_preorder + ); + + $stock_update = true; + } + } + } + + if ($stock_update) + { + // For stockroom Notify Email. + $stockroom_data = array(); + $stockroom_data['section'] = $post['section']; + $stockroom_data['section_id'] = $post['section_id']; + $stockroom_data['regular_stock'] = $quantity; + $stockroom_data['preorder_stock'] = $preorder_stock; + + JPluginHelper::importPlugin('redshop_product'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $dispatcher->trigger('onAfterUpdateStock', array($stockroom_data)); + } + } + + return true; + } + + /** + * Function getVatGroup. + * + * @return array + */ + public function getVatGroup() + { + $query = "SELECT tg.name as text, tg.id as value FROM `" . $this->table_prefix . "tax_group` as tg + WHERE tg.published = 1 + ORDER BY tg.id ASC"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + /** + * Save product ordering. + * + * @param array $cid IDs. + * @param array $order Order. + * + * @return boolean + */ + public function saveorder($cid = array(), $order = array()) + { + // Get global category id. + $category_id_my = $this->app->getUserStateFromRequest('category_id', 'category_id', 0); + + // Init array. + $orderarray = array(); + + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + // Set product id as key AND order as value. + $orderarray[$cid[$i]] = $order[$i]; + } + + // Sorting array using value (order). + asort($orderarray); + $i = 1; + + if (count($orderarray) > 0) + { + foreach ($orderarray as $productid => $order) + { + if ($order >= 0) + { + // Update ordering. + $query = 'UPDATE ' . $this->table_prefix . 'product_category_xref + SET ordering = ' . (int) $i . ' + WHERE product_id=' . $productid . ' + AND category_id = ' . $category_id_my; + $this->_db->setQuery($query); + $this->_db->execute(); + } + + $i++; + } + } + + return true; + } + + /** + * Orderup. + * + * @return void + */ + public function orderup() + { + $category_id_my = $this->app->getUserStateFromRequest('category_id', 'category_id', 0); + $cid = $this->input->post->get('cid', array(), 'array'); + $cid = $cid[0]; + + $q = "SELECT ordering,category_id," . $this->table_prefix . "product.product_id + FROM " . $this->table_prefix . "product," . $this->table_prefix . "product_category_xref "; + $q .= "WHERE " . $this->table_prefix . "product_category_xref.product_id='" . $cid . "' "; + $q .= "AND " . $this->table_prefix . "product_category_xref.category_id='" . $category_id_my . "' "; + $q .= "AND " . $this->table_prefix . "product_category_xref.product_id = " . $this->table_prefix . "product.product_id"; + echo '
    '; + + $this->_db->setQuery($q); + $cat = $this->_db->loadObject(); + + $currentpos = $cat->ordering; + $category_id = $cat->category_id; + + $q = "SELECT " . $this->table_prefix . "product.product_id + FROM " . $this->table_prefix . "product, " . $this->table_prefix . "product_category_xref "; + $q .= "WHERE " . $this->table_prefix . "product_category_xref.category_id='" . $category_id . "' "; + $q .= "AND " . $this->table_prefix . "product_category_xref.product_id=" . $this->table_prefix . "product.product_id + AND category_id= '" . $category_id_my . "' "; + $q .= "AND " . $this->table_prefix . "product_category_xref.ordering='" . intval($currentpos - 1) . "'"; + $this->_db->setQuery($q); + $cat = $this->_db->loadObject(); + + $pred = $cat->product_id; + + $q = "UPDATE " . $this->table_prefix . "product_category_xref "; + $q .= "SET ordering=ordering-1 "; + $q .= "WHERE product_id='" . $cid . "' AND ordering >1 AND category_id = '" . $category_id_my . "' "; + $this->_db->setQuery($q); + $this->_db->execute(); + + $q = "UPDATE " . $this->table_prefix . "product_category_xref "; + $q .= "SET ordering=ordering+1 "; + $q .= "WHERE product_id='" . $pred . "' AND category_id = '" . $category_id_my . "' "; + $this->_db->setQuery($q); + $this->_db->execute(); + } + + /** + * Orderdown. + * + * @return void + */ + public function orderdown() + { + $category_id_my = $this->app->getUserStateFromRequest('category_id', 'category_id', 0); + $cid = $this->input->post->get('cid', array(), 'array'); + $cid = $cid[0]; + + $q = "SELECT ordering,category_id," . $this->table_prefix . "product.product_id + FROM " . $this->table_prefix . "product," . $this->table_prefix . "product_category_xref "; + $q .= "WHERE " . $this->table_prefix . "product_category_xref.product_id='" . $cid . "' "; + $q .= "AND " . $this->table_prefix . "product_category_xref.category_id='" . $category_id_my . "' "; + $q .= "AND " . $this->table_prefix . "product_category_xref.product_id = " . $this->table_prefix . "product.product_id"; + $this->_db->setQuery($q); + $cat = $this->_db->loadObject(); + $currentpos = $cat->ordering; + $category_id = $cat->category_id; + + $q = "SELECT ordering," . $this->table_prefix . "product.product_id + FROM " . $this->table_prefix . "product, " . $this->table_prefix . "product_category_xref "; + $q .= "WHERE " . $this->table_prefix . "product_category_xref.category_id='" . $category_id . "' "; + $q .= "AND " . $this->table_prefix . "product_category_xref.product_id=" . $this->table_prefix . "product.product_id + AND category_id= '" . $category_id_my . "'"; + $q .= "AND ordering='" . intval($currentpos + 1) . "'"; + $this->_db->setQuery($q); + $cat = $this->_db->loadObject(); + $succ = $cat->product_id; + + $q = "UPDATE " . $this->table_prefix . "product_category_xref "; + $q .= "SET ordering=ordering+1 "; + $q .= "WHERE product_id='" . $cid . "' AND category_id = '" . $category_id_my . "' "; + $this->_db->setQuery($q); + $this->_db->execute(); + + $q = "UPDATE " . $this->table_prefix . "product_category_xref "; + $q .= "SET ordering=ordering-1 "; + $q .= "WHERE product_id='" . $succ . "' AND category_id = '" . $category_id_my . "' "; + $this->_db->setQuery($q); + $this->_db->execute(); + } + + /** + * Function getDiscountCalcData. + * + * @return array + */ + public function getDiscountCalcData() + { + $query = "SELECT * FROM `" . $this->table_prefix . "product_discount_calc` + WHERE product_id = '" . $this->id . "' ORDER BY area_start "; + + return $this->_getList($query); + } + + /** + * Function getDiscountCalcDataExtra. + * + * @return array + */ + public function getDiscountCalcDataExtra() + { + $query = "SELECT * FROM `" . $this->table_prefix . "product_discount_calc_extra` + WHERE product_id = '" . $this->id . "' ORDER BY option_name "; + + return $this->_getList($query); + } + + /** + * Product subscription detail. + * + * @return array + */ + public function getSubscription() + { + $query = "SELECT * FROM `" . $this->table_prefix . "product_subscription` + WHERE product_id = '" . $this->id . "' order by subscription_id"; + + return $this->_getList($query); + } + + /** + * Function getSubscriptionrenewal. + * + * @return array + */ + public function getSubscriptionrenewal() + { + $query = "SELECT * FROM `" . $this->table_prefix . "subscription_renewal` + WHERE product_id ='" . $this->id . "' "; + + return $this->_getList($query); + } + + /** + * Function getAttributeSetList. + * + * @return array + */ + public function getAttributeSetList() + { + $query = "SELECT attribute_set_id as value, attribute_set_name as text FROM `" . $this->table_prefix . "attribute_set` + WHERE published = 1"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + /** + * Get serial numbers for downloadable products. + * + * @param bool $only_used IDs. + * + * @return array + */ + public function getProdcutSerialNumbers($only_used = false) + { + $usedCond = $this->_db->qn('is_used') . ' = 0'; + + if ($only_used) + { + $usedCond = $this->_db->qn('is_used') . ' = 1'; + } + + $query = $this->_db->getQuery(true) + ->select('*') + ->from($this->_db->qn($this->table_prefix . "product_serial_number")) + ->where($this->_db->qn('product_id') . ' = ' . $this->id) + ->where($usedCond); + + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + /** + * Function deleteProdcutSerialNumbers. + * + * @param int $serial_id ID. + * + * @return boolean + */ + public function deleteProdcutSerialNumbers($serial_id) + { + $query = "DELETE FROM " . $this->table_prefix . "product_serial_number + WHERE serial_id = '" . $serial_id . "'"; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + return false; + } + + return true; + } + + /** + * Function deleteProdcutSerialNumbers. + * + * @param int $id ID. + * @param string $type ID. + * + * @return array + */ + public function getImageInfor($id, $type) + { + $image_media = 'SELECT * FROM ' . $this->table_prefix . 'media + WHERE section_id = "' . $id . '" + AND media_section = "' . $type . '" '; + $this->_db->setQuery($image_media); + + return $this->_db->loadObjectlist(); + } + + /** + * Function copyadditionalImage. + * + * @param array $data Data. + * + * @return boolean + */ + public function copyadditionalImage($data, $isMainImage = false, $mainImageName = "") + { + $src_image = $data['media_name']; + + if ($isMainImage) + { + $new_imgname = $mainImageName; + } + else + { + $old_imgname = strstr($data['media_name'], '_') ? strstr($data['media_name'], '_') : $data['media_name']; + $new_imgname = RedshopHelperMedia::cleanFileName($old_imgname); + } + + $data['media_name'] = $new_imgname; + $data['media_id '] = 0; + $rowmedia = $this->getTable('media_detail'); + + if (!$rowmedia->bind($data)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$rowmedia->store()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if(!$isMainImage) + { + $section = $data['media_section']; + $path = $section . '/' . $src_image; + $this->copy_image_additionalimage_from_path($path, $data['media_section']); + } + + return true; + } + + /** + * Function copy_image_additionalimage_from_path. + * + * @param string $imagePath Image path. + * @param int $section ID. + * + * @return string + */ + public function copy_image_additionalimage_from_path($imagePath, $section) + { + $src = REDSHOP_FRONT_IMAGES_RELPATH . $imagePath; + + $imgname = basename($imagePath); + $imgname = strstr($imgname, '_') ? strstr($imgname, '_') : $imgname; + $property_image = RedshopHelperMedia::cleanFileName($imgname); + $dest = REDSHOP_FRONT_IMAGES_RELPATH . $section . '/' . $property_image; + + copy($src, $dest); + + return $property_image; + } + + /** + * Function copyAttributeSetAttribute. + * + * @param int $attribute_set_id ID. + * @param int $product_id ID. + * + * @return array + */ + public function copyAttributeSetAttribute($attribute_set_id, $product_id) + { + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_attribute WHERE attribute_set_id ="' . $attribute_set_id . '" '; + $this->_db->setQuery($query); + $attribute = $this->_db->loadObjectList(); + + for ($att = 0, $countAttribute = count($attribute); $att < $countAttribute; $att++) + { + $attpost = array(); + $attpost['attribute_id'] = 0; + $attpost['attribute_name'] = $attribute[$att]->attribute_name; + $attpost['attribute_required'] = $attribute[$att]->attribute_required; + $attpost['product_id'] = $product_id; + $attpost['ordering'] = $attribute[$att]->ordering; + $attpost['allow_multiple_selection'] = $attribute[$att]->allow_multiple_selection; + $attpost['hide_attribute_price'] = $attribute[$att]->hide_attribute_price; + $attpost['display_type'] = $attribute[$att]->display_type; + $attpost['attribute_published'] = $attribute[$att]->attribute_published; + $attrow = $this->store_attr($attpost); + $attribute_id = $attrow->attribute_id; + + $query = 'SELECT * FROM `' . $this->table_prefix . 'product_attribute_property` + WHERE `attribute_id` = "' . $attribute[$att]->attribute_id . '" '; + $this->_db->setQuery($query); + $att_property = $this->_db->loadObjectList(); + + for ($prop = 0, $countProperty = count($att_property); $prop < $countProperty; $prop++) + { + $listImages = $this->getImageInfor($att_property[$prop]->property_id, 'property'); + $listStockroomData = $this->GetStockroomData($att_property[$prop]->property_id, 'property'); + $listAttributepriceData = $this->GetAttributepriceData($att_property[$prop]->property_id, 'property'); + + if ($att_property[$prop]->property_image) + { + $image_split = $att_property[$prop]->property_image; + + // Make the filename unique. + $filename = RedshopHelperMedia::cleanFileName($image_split); + $att_property[$prop]->property_image = $filename; + $src = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $image_split; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'product_attributes/' . $filename; + copy($src, $dest); + } + + if ($att_property[$prop]->property_main_image) + { + $prop_main_img = $att_property[$prop]->property_main_image; + $image_split = $att_property[$prop]->property_main_image; + $image_split = explode('_', $image_split); + $image_split = $image_split[1]; + + // Make the filename unique. + $filename = RedshopHelperMedia::cleanFileName($image_split); + $att_property[$prop]->property_main_image = $filename; + $src = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $prop_main_img; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $filename; + copy($src, $dest); + } + + $proppost = array(); + $proppost['property_id'] = 0; + $proppost['attribute_id'] = $attribute_id; + $proppost['property_name'] = $att_property[$prop]->property_name; + $proppost['property_price'] = $att_property[$prop]->property_price; + $proppost['oprand'] = $att_property[$prop]->oprand; + $proppost['property_image'] = $att_property[$prop]->property_image; + $proppost['property_main_image'] = $att_property[$prop]->property_main_image; + $proppost['ordering'] = $att_property[$prop]->ordering; + $proppost['setdefault_selected'] = $att_property[$prop]->setdefault_selected; + $proppost['setrequire_selected'] = $att_property[$prop]->setrequire_selected; + $proppost['setdisplay_type'] = $att_property[$prop]->setdisplay_type; + $proppost['extra_field'] = $att_property[$prop]->extra_field; + $proppost['property_published'] = $att_property[$prop]->property_published; + $proppost['property_number'] = $att_property[$prop]->property_number; + $proprow = $this->store_pro($proppost); + $property_id = $proprow->property_id; + + for ($ls = 0, $countStockroom = count($listStockroomData); $ls < $countStockroom; $ls++) + { + $this->InsertStockroom($property_id, 'property', $listStockroomData[$ls]->stockroom_id, $listStockroomData[$ls]->quantity, 0, 0); + } + + $countAttributePrice = count($listAttributepriceData); + + for ($lp = 0; $lp < $countAttributePrice; $lp++) + { + $this->InsertAttributeprice( + $property_id, + 'property', + $listAttributepriceData[$lp]->product_price, + $listAttributepriceData[$lp]->product_currency, + $listAttributepriceData[$lp]->shopper_group_id, + $listAttributepriceData[$lp]->price_quantity_start, + $listAttributepriceData[$lp]->price_quantity_end, + $listAttributepriceData[$lp]->discount_price, + $listAttributepriceData[$lp]->discount_start_date, + $listAttributepriceData[$lp]->discount_end_date + ); + } + + for ($li = 0, $countImage = count($listImages); $li < $countImage; $li++) + { + $mImages = array(); + $mImages['media_name'] = $listImages[$li]->media_name; + $mImages['media_alternate_text'] = $listImages[$li]->media_alternate_text; + $mImages['media_section'] = 'property'; + $mImages['section_id'] = $property_id; + $mImages['media_type'] = 'images'; + $mImages['media_mimetype'] = $listImages[$li]->media_mimetype; + $mImages['published'] = $listImages[$li]->published; + $this->copyadditionalImage($mImages); + } + + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_subattribute_color + WHERE `subattribute_id` = "' . $att_property[$prop]->property_id . '" '; + $this->_db->setQuery($query); + $subatt_property = $this->_db->loadObjectList(); + $countSuboproperty = count($subatt_property); + + for ($subprop = 0; $subprop < $countSuboproperty; $subprop++) + { + $listsubpropImages = $this->getImageInfor($subatt_property[$subprop]->subattribute_color_id, 'subproperty'); + $listSubStockroomData = $this->GetStockroomData($subatt_property[$subprop]->subattribute_color_id, 'subproperty'); + $listSubAttributepriceData = $this->GetAttributepriceData($subatt_property[$subprop]->subattribute_color_id, 'subproperty'); + + if ($subatt_property[$subprop]->subattribute_color_image) + { + $image_split = $subatt_property[$subprop]->subattribute_color_image; + + // Make the filename unique. + $filename = RedshopHelperMedia::cleanFileName($image_split); + $subatt_property[$subprop]->subattribute_color_image = $filename; + $src = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $image_split; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'subcolor/' . $filename; + copy($src, $dest); + } + + if ($subatt_property[$subprop]->subattribute_color_main_image) + { + $sub_main_img = $subatt_property[$subprop]->subattribute_color_main_image; + $image_split = $subatt_property[$subprop]->subattribute_color_main_image; + $image_split = explode('_', $image_split); + $image_split = $image_split[1]; + + // Make the filename unique. + $filename = RedshopHelperMedia::cleanFileName($image_split); + + $subatt_property[$subprop]->subattribute_color_main_image = $filename; + $src = REDSHOP_FRONT_IMAGES_RELPATH . 'subproperty/' . $sub_main_img; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'subproperty/' . $filename; + copy($src, $dest); + } + + $subpost = array(); + $subpost['subattribute_color_id'] = 0; + $subpost['subattribute_color_name'] = $subatt_property[$subprop]->subattribute_color_name; + $subpost['subattribute_color_title'] = htmlspecialchars($subatt_property[$subprop]->subattribute_color_title); + $subpost['subattribute_color_price'] = $subatt_property[$subprop]->subattribute_color_price; + $subpost['oprand'] = $subatt_property[$subprop]->oprand; + $subpost['ordering'] = $subatt_property[$subprop]->ordering; + $subpost['subattribute_color_image'] = $subatt_property[$subprop]->subattribute_color_image; + $subpost['subattribute_id'] = $property_id; + $subpost['setdefault_selected'] = $subatt_property[$subprop]->setdefault_selected; + $subpost['subattribute_color_main_image'] = $subatt_property[$subprop]->subattribute_color_main_image; + $subpost['subattribute_color_number'] = $subatt_property[$subprop]->subattribute_color_number; + $subpost['extra_field'] = $subatt_property[$subprop]->extra_field; + $subpost['subattribute_published'] = $subatt_property[$subprop]->subattribute_published; + $subrow = $this->store_sub($subpost); + $subproperty_id = $subrow->subattribute_color_id; + $countSubPropertyImage = count($listsubpropImages); + + for ($lsi = 0; $lsi < $countSubPropertyImage; $lsi++) + { + $smImages = array(); + $smImages['media_name'] = $listsubpropImages[$lsi]->media_name; + $smImages['media_alternate_text'] = $listsubpropImages[$lsi]->media_alternate_text; + $smImages['media_section'] = 'subproperty'; + $smImages['section_id'] = $subproperty_id; + $smImages['media_type'] = 'images'; + $smImages['media_mimetype'] = $listsubpropImages[$lsi]->media_mimetype; + $smImages['published'] = $listsubpropImages[$lsi]->published; + $this->copyadditionalImage($smImages); + } + + $countSubStockroom = count($listSubStockroomData); + + for ($lss = 0; $lss < $countSubStockroom; $lss++) + { + $this->InsertStockroom( + $subproperty_id, + 'subproperty', + $listSubStockroomData[$lss]->stockroom_id, + $listSubStockroomData[$lss]->quantity, + 0, + 0 + ); + } + + $countSubAttributePrice = count($listSubAttributepriceData); + + for ($lsp = 0; $lsp < $countSubAttributePrice; $lsp++) + { + $this->InsertAttributeprice( + $subproperty_id, + 'subproperty', + $listSubAttributepriceData[$lsp]->product_price, + $listSubAttributepriceData[$lsp]->product_currency, + $listSubAttributepriceData[$lsp]->shopper_group_id, + $listSubAttributepriceData[$lsp]->price_quantity_start, + $listSubAttributepriceData[$lsp]->price_quantity_end, + $listSubAttributepriceData[$lsp]->discount_price, + $listSubAttributepriceData[$lsp]->discount_start_date, + $listSubAttributepriceData[$lsp]->discount_end_date + ); + } + } + } + } + } + + /** + * Function GetStockroomData. + * + * @param int $section_id ID. + * @param string $name ID. + * + * @return array + */ + public function GetStockroomData($section_id, $name) + { + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_attribute_stockroom_xref + WHERE `section_id` = "' . $section_id . '" + AND section="' . $name . '" '; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectList(); + + return $list; + } + + /** + * Function insertProductStock. + * + * @param int $product_id product_id + * @param int $stockroom_id stockroom_id + * @param int $quantiy quantiy + * @param int $preorder_stock preorder_stock + * @param int $ordered_preorder ordered_preorder + * + * @return boolean + */ + public function insertProductStock($product_id, $stockroom_id, $quantiy = 0, $preorder_stock = 0, $ordered_preorder = 0) + { + $query = 'INSERT INTO ' . $this->table_prefix . 'product_stockroom_xref (product_id,stockroom_id,quantity,preorder_stock,ordered_preorder) + VALUE("' . $product_id . '","' . $stockroom_id . '","' . $quantiy . '","' . $preorder_stock . '","' . $ordered_preorder . '")'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + // For stockroom Notify Email. + $stockroom_data = array(); + $stockroom_data['section'] = "product"; + $stockroom_data['section_id'] = $product_id; + $stockroom_data['regular_stock'] = $quantiy; + $stockroom_data['preorder_stock'] = $preorder_stock; + + JPluginHelper::importPlugin('redshop_product'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $dispatcher->trigger('onAfterUpdateStock', array($stockroom_data)); + + return true; + } + + /** + * Function InsertStockroom. + * + * @param int $section_id section_id + * @param string $name name + * @param int $stockroom_id stockroom_id + * @param int $quantiy quantiy + * @param int $preorder_stock preorder_stock + * @param int $ordered_preorder ordered_preorder + * + * @return boolean + */ + public function InsertStockroom($section_id, $name, $stockroom_id, $quantiy, $preorder_stock, $ordered_preorder) + { + $query = 'INSERT INTO ' . $this->table_prefix . 'product_attribute_stockroom_xref + (section_id,section,stockroom_id,quantity,preorder_stock, ordered_preorder) + VALUES ("' . $section_id . '", + "' . $name . '", + "' . $stockroom_id . '", + "' . $quantiy . '", + "' . $preorder_stock . '", + "' . $ordered_preorder . '")'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + /** + * Function GetAttributepriceData. + * + * @param int $section_id section_id + * @param string $name name + * + * @return array + */ + public function GetAttributepriceData($section_id, $name) + { + $query = 'SELECT * FROM ' . $this->table_prefix . 'product_attribute_price + WHERE `section_id` = "' . $section_id . '" and section="' . $name . '" '; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + /** + * Function InsertAttributeprice. + * + * @param int $section_id section_id + * @param string $name name + * @param float $product_price product_price + * @param string $product_currency product_currency + * @param int $shopper_group_id shopper_group_id + * @param int $price_quantity_start price_quantity_start + * @param int $price_quantity_end price_quantity_end + * @param float $discount_price discount_price + * @param string $discount_start_date discount_start_date + * @param string $discount_end_date discount_end_date + * + * @return boolean + */ + public function InsertAttributeprice($section_id, $name, $product_price, $product_currency, $shopper_group_id, + $price_quantity_start, $price_quantity_end, $discount_price, $discount_start_date, $discount_end_date + ) + { + $row = $this->getTable('product_attribute_price_detail'); + $post = array(); + $post['price_id'] = 0; + $post['section_id'] = $section_id; + $post['section'] = $name; + $post['product_price'] = $product_price; + $post['product_currency'] = $product_currency; + $post['cdate'] = time(); + $post['shopper_group_id'] = $shopper_group_id; + $post['price_quantity_start'] = $price_quantity_start; + $post['price_quantity_end'] = $price_quantity_end; + $post['discount_price'] = $discount_price; + $post['discount_start_date'] = $discount_start_date; + $post['discount_end_date'] = $discount_end_date; + + if (!$row->bind($post)) + { + return false; + } + + if (!$row->store()) + { + return false; + } + + return true; + } + + /** + * Method to checkout/lock the product_detail. + * + * @param int $uid User ID of the user checking the helloworl detail out. + * + * @return boolean True on success + * + * @since 1.5 + */ + public function checkout($uid = null) + { + if ($this->id) + { + // Make sure we have a user id to checkout the article with. + if (is_null($uid)) + { + $user = JFactory::getUser(); + $uid = (int) $user->get('id'); + } + + // Lets get to it and checkout the thing. + $product_detail = $this->getTable('product_detail'); + + if (!$product_detail->checkout($uid, $this->id)) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + return false; + } + + /** + * Method to checkin a row. + * + * @param integer $pk The numeric id of the primary key. + * + * @return boolean|integer False on failure or error, true otherwise. + * + * @since 1.6 + */ + public function checkin($pks = array()) + { + $pks = (array) $pks; + $table = $this->getTable('product_detail'); + $count = 0; + + if (empty($pks)) + { + $pks = array((int) $this->getState($this->getName() . '.id')); + } + + // Check in all items. + foreach ($pks as $pk) + { + if ($table->load($pk)) + { + if ($table->checked_out > 0) + { + if (!$this->doCheckIn($pk)) + { + return false; + } + + $count++; + } + } + else + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $table->getError()); + + return false; + } + } + + return $count; + } + + public function doCheckIn($pk = null) + { + // Only attempt to check the row in if it exists. + if ($pk) + { + $user = JFactory::getUser(); + + // Get an instance of the row to checkin. + $table = $this->getTable('product_detail'); + + if (!$table->load($pk)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $table->getError()); + + return false; + } + + // If there is no checked_out or checked_out_time field, just return true. + if (!property_exists($table, 'checked_out') || !property_exists($table, 'checked_out_time')) + { + return true; + } + + // Check if this is the user having previously checked out the row. + if ($table->checked_out > 0 && $table->checked_out != $user->get('id') && !$user->authorise('core.admin', 'com_checkin')) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('JLIB_APPLICATION_ERROR_CHECKIN_USER_MISMATCH')); + + return false; + } + + // Attempt to check the row in. + if (!$table->checkin($pk)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $table->getError()); + + return false; + } + } + + return true; + } + + /** + * Tests if product_detail is checked out. + * + * @param int $uid A user id. + * + * @return boolean True if checked out. + * + * @since 1.5 + */ + public function isCheckedOut($uid = 0) + { + if ($this->_loadData()) + { + if ($uid) + { + return ($this->data->checked_out && $this->data->checked_out != $uid); + } + else + { + return $this->data->checked_out; + } + } + + return false; + } + + /** + * Function delete_subprop. + * + * @param int $sp sp + * @param int $subattribute_id subattribute_id + * + * @return void + */ + public function delete_subprop($sp, $subattribute_id) + { + $subPropertyList = RedshopHelperProduct_Attribute::getAttributeSubProperties(0, $subattribute_id, true); + + if ($sp) + { + $subproperty = RedshopHelperProduct_Attribute::getAttributeSubProperties($sp); + } + else + { + $subproperty = $subPropertyList; + } + + for ($j = 0, $jn = count($subproperty); $j < $jn; $j++) + { + $query = "DELETE FROM `" . $this->table_prefix . "product_subattribute_color` + WHERE `subattribute_id` = '" . $subattribute_id . "' + AND subattribute_color_id= '" . $subproperty[$j]->subattribute_color_id . "'"; + $this->_db->setQuery($query); + $this->_db->execute(); + + if (isset($subproperty[$j]->subattribute_color_image) + && $subproperty[$j]->subattribute_color_image) + { + $this->delete_image($subproperty[$j]->subattribute_color_image, 'subcolor'); + } + } + + if (count($subPropertyList) <= 1) + { + $query = "UPDATE `" . $this->table_prefix . "product_attribute_property` + SET `setrequire_selected` = '0' + WHERE `property_id` = " . (int) $subattribute_id; + $this->_db->setQuery($query); + $this->_db->execute(); + } + } + + /** + * Function delete_prop. + * + * @param int $attribute_id attribute_id + * @param int $property_id property_id + * + * @return void + */ + public function delete_prop($attribute_id, $property_id) + { + $propertyList = RedshopHelperProduct_Attribute::getAttributeProperties(0, $attribute_id, 0, '', 0, 0, true); + + if ($property_id) + { + $property = RedshopHelperProduct_Attribute::getAttributeProperties($property_id); + } + else + { + $property = $propertyList; + } + + for ($j = 0, $jn = count($property); $j < $jn; $j++) + { + $property_id = $property[$j]->property_id; + $query = "DELETE FROM `" . $this->table_prefix . "product_attribute_property` + WHERE `attribute_id`='" . $attribute_id . "' + AND `property_id` = '" . $property[$j]->property_id . "' "; + $this->_db->setQuery($query); + + if ($this->_db->execute()) + { + if (isset($property[$j]->property_image) && $property[$j]->property_image) + { + $this->delete_image($property[$j]->property_image, 'product_attributes'); + } + + $this->delete_subprop(0, $property_id); + } + } + + if (count($propertyList) <= 1) + { + $query = "UPDATE `" . $this->table_prefix . "product_attribute` + SET `attribute_required` = '0' + WHERE `attribute_id` = " . (int) $attribute_id; + $this->_db->setQuery($query); + $this->_db->execute(); + } + + JFactory::getApplication()->close(); + } + + /** + * Function delete_attibute. + * + * @param int $product_id attribute_id + * @param int $attribute_id property_id + * @param int $attribute_set_id attribute_set_id + * + * @return void + */ + public function delete_attibute($product_id, $attribute_id, $attribute_set_id) + { + $producthelper = productHelper::getInstance(); + + if (empty($attribute_set_id) && empty($product_id)) + { + return; + } + + if ($attribute_id) + { + $attributes = array(); + $attributes[0] = new stdClass; + $attributes[0]->attribute_id = $attribute_id; + } + else + { + if ($product_id) + { + $attributes = /** @scrutinizer ignore-deprecated */ $producthelper->getProductAttribute($product_id); + } + else + { + $attributes = /** @scrutinizer ignore-deprecated */ $producthelper->getProductAttribute(0, $attribute_set_id); + } + } + + if ($product_id) + { + $and = "`product_id`='" . $product_id . "'"; + } + else + { + $and = "`attribute_set_id`='" . $attribute_set_id . "'"; + } + + for ($i = 0, $in = count($attributes); $i < $in; $i++) + { + $query = "DELETE FROM `" . $this->table_prefix . "product_attribute` + WHERE " . $and . " and `attribute_id` = '" . $attributes[$i]->attribute_id . "' "; + $this->_db->setQuery($query); + + if ($this->_db->execute()) + { + $this->delete_prop($attributes[$i]->attribute_id, 0); + } + } + } + + /** + * Function delete_image. + * + * @param string $imagename imagename + * @param int|string $section section + * + * @return void + */ + public function delete_image($imagename, $section) + { + $imagesrcphy = REDSHOP_FRONT_IMAGES_RELPATH . $section . "/" . $imagename; + + if (JFile::exists($imagesrcphy)) + { + JFile::delete($imagesrcphy); + } + } + + /** + * Function copy_image. + * + * @param array $imageArray imageArray + * @param string $section section + * @param int $section_id section_id + * + * @return string + */ + public function copy_image($imageArray, $section, $section_id) + { + $src = $imageArray['tmp_name']; + $imgname = RedshopHelperMedia::cleanFileName($imageArray['name']); + $property_image = $section_id . '_' . $imgname; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . $section . '/' . $property_image; + copy($src, $dest); + + return $property_image; + } + + /** + * Function copy_image_from_path. + * + * @param string $imagePath imagePath + * @param string $section section + * @param int $section_id section_id + * + * @return string + */ + public function copy_image_from_path($imagePath, $section, $section_id = 0) + { + if (strpos($imagePath, "components/com_redshop/assets/images/") !== -1) + { + $imagePath = str_replace("components/com_redshop/assets/images/", "", $imagePath); + } + + $src = REDSHOP_FRONT_IMAGES_RELPATH . $imagePath; + $imgname = RedshopHelperMedia::cleanFileName($imagePath); + $property_image = $section_id . '_' . basename($imgname); + $dest = REDSHOP_FRONT_IMAGES_RELPATH . $section . '/' . $property_image; + copy($src, $dest); + + return $property_image; + } + + /** + * Function checkVirtualNumber. + * + * @param int $product_id product_id + * @param array $vpnArray vpnArray + * + * @return boolean + */ + public function checkVirtualNumber($product_id = 0, $vpnArray = array()) + { + if (count($vpnArray) > 0) + { + $strVPN = "'" . implode("','", $vpnArray) . "'"; + $query = "SELECT COUNT(product_number) FROM `" . $this->table_prefix . "product` " + . "WHERE product_number IN (" . $strVPN . ") "; + $this->_db->setQuery($query); + $there = $this->_db->loadResult(); + + if ($there > 0) + { + return true; + } + + $query = "SELECT ap.property_number AS number " + . "FROM " . $this->table_prefix . "product_attribute_property AS ap " + . "LEFT JOIN " . $this->table_prefix . "product_attribute AS a ON a.attribute_id=ap.attribute_id " + . "WHERE a.product_id!='" . $product_id . "' " + . "AND ap.property_number IN (" . $strVPN . ") " + . "UNION " + . "SELECT sp.subattribute_color_number AS number FROM " . $this->table_prefix . "product_subattribute_color AS sp " + . "LEFT JOIN " . $this->table_prefix . "product_attribute_property AS ap ON ap.property_id=sp.subattribute_id " + . "LEFT JOIN " . $this->table_prefix . "product_attribute AS a ON a.attribute_id=ap.attribute_id " + . "WHERE a.product_id!='" . $product_id . "' " + . "AND sp.subattribute_color_number IN (" . $strVPN . ") "; + + $this->_db->setQuery($query); + $list = $this->_db->loadObjectList(); + + if (count($list) > 0) + { + return true; + } + + return false; + } + + return true; + } + + /** + * Function getChildProducts. + * + * @return stdClass + */ + public function getChildProducts() + { + $products = $this->getAllChildProductArrayList(0, $this->id); + $product_id = $product_name = array(); + + for ($i = 0, $in = count($products); $i < $in; $i++) + { + $product = $products[$i]; + $product_id[] = $product->product_id; + $product_name[] = $product->product_name; + } + + $prod = new stdClass; + $prod->name = $product_name; + $prod->id = $product_id; + + return $prod; + } + + /** + * Function getAllChildProductArrayList + * + * @param int $childid childid + * @param int $parentid parentid + * + * @return mixed + */ + public function getAllChildProductArrayList($childid = 0, $parentid = 0) + { + $info = RedshopHelperProduct::getChildProduct($parentid); + + if (empty(static::$childproductlist)) + { + for ($i = 0, $in = count($info); $i < $in; $i++) + { + if ($childid != $info[$i]->product_id) + { + static::$childproductlist[] = $info[$i]; + $this->getAllChildProductArrayList($childid, $info[$i]->product_id); + } + } + } + + return static::$childproductlist; + } + + /** + * Function removeaccesory. + * + * @param int $accessory_id accessory_id + * @param int $category_id category_id + * @param int $child_product_id child_product_id + * + * @return boolean + */ + public function removeaccesory($accessory_id, $category_id = 0, $child_product_id = 0) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_product_accessory')); + + if ($category_id != 0) + { + $query->where('category_id = ' . (int) $category_id); + } + else + { + $query->where('accessory_id = ' . (int) $accessory_id); + } + + if ($child_product_id != 0) + { + $query->where('child_product_id = ' . (int) $child_product_id); + } + + if (!$db->setQuery($query)->execute()) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + else + { + return true; + } + } + + /** + * Function ResetPreOrderStockroomQuantity. + * + * @param string $stockroom_type stockroom_type + * @param int $sid section_id + * @param int $pid product_id + * + * @return void + */ + public function ResetPreOrderStockroomQuantity($stockroom_type, $sid, $pid) + { + $product = " AND product_id='" . $pid . "' "; + $section = ""; + $table = "product"; + + if ($stockroom_type != 'product') + { + $product = " AND section_id='" . $pid . "' "; + $section = " AND section = '" . $stockroom_type . "' "; + $table = "product_attribute"; + } + + $query = "UPDATE " . $this->table_prefix . $table . "_stockroom_xref + SET preorder_stock='0' , ordered_preorder= '0' + WHERE stockroom_id='" . $sid . "'" . $product . $section; + + if ($query != "") + { + $this->_db->setQuery($query); + $this->_db->execute(); + } + } + + /** + * Function update_attr_property_image. + * + * @param int $property_id property_id + * @param string $property_image property_image + * @param string $property_main_image property_main_image + * + * @return void + */ + public function update_attr_property_image($property_id, $property_image, $property_main_image) + { + $query = "UPDATE " . $this->table_prefix . "product_attribute_property + SET property_image='" . $property_image . "' , property_main_image= '" . $property_main_image . "' + WHERE property_id='" . $property_id . "'"; + + $this->_db->setQuery($query)->execute(); + } + + /** + * Function update_subattr_image. + * + * @param int $subproperty_id subproperty_id + * @param string $subattribute_color_image subattribute_color_image + * + * @return void + */ + public function update_subattr_image($subproperty_id, $subattribute_color_image, $subattribute_color_main_image) + { + $query = "UPDATE " . $this->table_prefix . "product_subattribute_color + SET subattribute_color_image='" . $subattribute_color_image . "' , subattribute_color_main_image= '" . $subattribute_color_main_image . "' + WHERE subattribute_color_id='" . $subproperty_id . "'"; + + $this->_db->setQuery($query)->execute(); + } + + /** + * Function copyDiscountCalcdata. + * + * @param int $old_product_id old_product_id + * @param int $new_product_id new_product_id + * @param string $discount_calc_method discount_calc_method + * + * @return boolean + * @throws Exception + */ + public function copyDiscountCalcdata($old_product_id, $new_product_id, $discount_calc_method) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_product_discount_calc')) + ->where($db->qn('product_id') . ' = ' . (int) $old_product_id); + + $list = $db->setQuery($query)->loadObjectList(); + + for ($i = 0, $in = count($list); $i < $in; $i++) + { + $discount_calc_unit = $list[$i]->discount_calc_unit; + $area_start = $list[$i]->area_start; + $area_end = $list[$i]->area_end; + $area_price = $list[$i]->area_price; + + $unit = \Redshop\Helper\Utility::getUnitConversation("m", $discount_calc_unit); + + // Replace comma with dot. + $new_area_start = str_replace(",", ".", $area_start); + $new_area_end = str_replace(",", ".", $area_end); + + if ($discount_calc_method == 'volume') + { + $calcunit = pow($unit, 3); + } + elseif ($discount_calc_method == 'area') + { + $calcunit = pow($unit, 2); + } + else + { + $calcunit = $unit; + } + + // Updating value. + + $converted_area_start = $new_area_start * $calcunit; + $converted_area_end = $new_area_end * $calcunit; + + // End + + $calcrow = $this->getTable('product_discount_calc'); + $calcrow->load(); + $calcrow->discount_calc_unit = $discount_calc_unit; + $calcrow->area_start = $new_area_start; + $calcrow->area_end = $new_area_end; + $calcrow->area_price = $area_price; + $calcrow->area_start_converted = $converted_area_start; + $calcrow->area_end_converted = $converted_area_end; + $calcrow->product_id = $new_product_id; + + if (!$calcrow->check()) + { + /** @scrutinizer ignore-deprecated */$this->setError(/** @scrutinizer ignore-deprecated */$this->_db->getErrorMsg()); + + return false; + } + + if (!$calcrow->store()) + { + /** @scrutinizer ignore-deprecated */$this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + // Discount calc extra data + $query_extra = "Select * FROM `" . $this->table_prefix . "product_discount_calc_extra` WHERE product_id='" . $old_product_id . "' "; + $this->_db->setQuery($query_extra); + $list_extra = $this->_db->loadObjectList(); + + for ($i = 0, $in = count($list_extra); $i < $in; $i++) + { + $pdc_option_name = $list_extra[$i]->option_name; + $pdc_price = $list_extra[$i]->price; + $pdc_oprand = $list_extra[$i]->oprand; + + if (trim($pdc_option_name) != "") + { + $pdcextrarow = $this->getTable('product_discount_calc_extra'); + $pdcextrarow->load(); + $pdcextrarow->pdcextra_id = 0; + $pdcextrarow->option_name = $pdc_option_name; + $pdcextrarow->oprand = $pdc_oprand; + $pdcextrarow->price = $pdc_price; + $pdcextrarow->product_id = $new_product_id; + + if (!$pdcextrarow->store()) + { + return false; + } + } + } + + return true; + } + + /** + * Store product from webservice + * + * @param array $data Data from the request + * + * @return boolean|integer + * @throws Exception + */ + public function saveWS($data) + { + $row = $this->store($data); + + if ($row) + { + return $row->product_id; + } + + return false; + } + + /** + * Get product attributes for the getAttribute webservice + * + * @param string $productNumber Product number of the product + * + * @return array|boolean + * + */ + public function getAttributesWS($productNumber) + { + $result = null; + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('product_id') + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_number') . ' = ' . $db->q($productNumber)); + $db->setQuery($query); + + $productId = $db->loadResult(); + + if ($productId) + { + $this->id = $productId; + + $result = $this->getAttributes(); + } + + return $result; + } + + /** + * Method for store media. + * + * @param object $row Product data + * @param string $mediaField Media field name + * + * @return boolean|integer Id of media row if success. False otherwise. + * @throws Exception + * + * @since 2.1.0 + */ + protected function storeMedia($row, $mediaField = 'product_full_image') + { + $input = JFactory::getApplication()->input; + $dropzone = $input->post->get('dropzone', array(), 'array'); + $dropzone = isset($dropzone[$mediaField]) ? $dropzone[$mediaField] : null; + + $dropzoneAlternateText = $input->post->get('dropzone_alternate_text', array(), ''); + $dropzoneAlternateText = isset($dropzoneAlternateText[$mediaField]) ? $dropzoneAlternateText[$mediaField] : null; + + if (null === $dropzone || empty($dropzone)) + { + return false; + } + + $mediaId = false; + + foreach ($dropzone as $key => $value) + { + /** @var RedshopTableMedia $mediaTable */ + $mediaTable = JTable::getInstance('Media', 'RedshopTable'); + + if (strpos($key, 'media-') !== false) + { + $mediaTable->load(str_replace('media-', '', $key)); + + // Delete old image. + $oldMediaFile = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $mediaTable->media_name); + + if (JFile::exists($oldMediaFile)) + { + JFile::delete($oldMediaFile); + } + + if (empty($value)) + { + $mediaTable->delete(); + + continue; + } + } + else + { + if (!$mediaTable->load(array( + 'media_name' => $row->product_full_image, + 'media_section' => 'product', + 'section_id' => $row->product_id, + 'media_type' => 'images' + ))) + { + if (!empty($row->product_id)) + { + $mediaTable->set('section_id', $row->product_id); + } + + $mediaTable->set('media_section', 'product'); + } + } + + if (!JFile::exists(JPATH_ROOT . '/' . $value)) + { + continue; + } + + $alternateText = isset($dropzoneAlternateText[$key]) ? $dropzoneAlternateText[$key] : $row->product_name; + + $mediaTable->set('media_alternate_text', $alternateText); + $mediaTable->set('media_type', 'images'); + $mediaTable->set('published', 1); + + // Copy new image for this media + $fileName = md5(basename($value)) . '.' . JFile::getExt($value); + $file = REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $fileName; + + JFile::move(JPATH_ROOT . '/' . $value, $file); + + $mediaTable->set('media_name', $fileName); + + if (!$mediaTable->store()) + { + continue; + } + + $mediaId = (int) $mediaTable->media_id; + $row->{$mediaField} = $fileName; + + // Optimize image + $factory = new \ImageOptimizer\OptimizerFactory; + $optimizer = $factory->get(); + $optimizer->optimize($file); + } + + return $mediaId; + } +} diff --git a/component/admin/models/producttags.php b/component/admin/models/producttags.php new file mode 100644 index 00000000000..005636d4abd --- /dev/null +++ b/component/admin/models/producttags.php @@ -0,0 +1,100 @@ +_context = 't.tags_id'; + + $this->_table_prefix = '#__redshop_'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + + $query = ' SELECT DISTINCT t.*,count(ptx.product_id) as products,count(ptx.users_id) as users,count(ptx.tags_id) as usag ' + . ' FROM ' . $this->_table_prefix . 'product_tags as t ' + . ' left join ' . $this->_table_prefix . 'product_tags_xref as ptx on ptx.tags_id = t.tags_id ' + . ' GROUP BY t.tags_name ' + . $orderby; + + return $query; + + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 't.tags_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } +} diff --git a/component/admin/models/producttags_detail.php b/component/admin/models/producttags_detail.php new file mode 100644 index 00000000000..e087acf1219 --- /dev/null +++ b/component/admin/models/producttags_detail.php @@ -0,0 +1,157 @@ +_table_prefix = '#__redshop_'; + + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_tags WHERE tags_id = ' . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + + $detail->tags_id = 0; + $detail->tags_name = null; + $detail->tags_counter = 0; + $detail->published = 1; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $row = $this->getTable('product_tags'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_tags WHERE tags_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + else + { + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_tags_xref WHERE tags_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'product_tags' + . ' SET published = ' . intval($publish) + . ' WHERE tags_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/question.php b/component/admin/models/question.php new file mode 100644 index 00000000000..c919402b271 --- /dev/null +++ b/component/admin/models/question.php @@ -0,0 +1,96 @@ +getQuery(true); + + $query ->select( + $db->qn( + [ + 'id', 'parent_id', 'question', 'user_id', + 'user_name', 'user_email', 'published', 'question_date', + 'ordering', 'telephone', 'address' + ] + ) + ) + ->from($db->qn('#__redshop_customer_question')) + ->where($db->qn('parent_id') . ' = ' . $id); + + $db->setQuery($query); + + return $db->loadObjectList(); + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return boolean True on success, False on error. + * + * @since 2.0.0.4 + */ + public function save($data) + { + if (!parent::save($data)) + { + return false; + } + + if (empty($data['answer'])) + { + return true; + } + + if ($data['parent_id']) + { + return true; + } + + $user = JFactory::getUser(); + + // Store Answer + $answerData = $data; + $answerData['id'] = 0; + $answerData['parent_id'] = $data['id'] ? $data['id'] : $this->_db->insertid(); + $answerData['question'] = ''; + $answerData['cdate'] = time(); + $answerData['question'] = $data['answer']; + $answerData['user_email'] = $user->email; + $answerData['user_name'] = $user->name; + + return $this->save($answerData); + } +} diff --git a/component/admin/models/questions.php b/component/admin/models/questions.php new file mode 100644 index 00000000000..4130028a4de --- /dev/null +++ b/component/admin/models/questions.php @@ -0,0 +1,162 @@ +getState('filter.search'); + $id .= ':' . $this->getState('filter.product_id'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'question_date', $direction = 'desc') + { + $filter = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', ''); + $product_id = $this->getUserStateFromRequest($this->context . '.filter.product_id', 'filter_product_id', 0); + + $this->setState('filter.search', $filter); + $this->setState('filter.product_id', $product_id); + + parent::populateState($ordering, $direction); + } + + /** + * Get product with questions + * + * @return mixed + */ + public function getProduct() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn(['p.product_id', 'p.product_name'])) + ->from($db->qn('#__redshop_product', 'p')) + ->leftJoin($db->qn('#__redshop_customer_question', 'q') . ' ON ' . $db->qn('q.product_id') . ' = ' . $db->qn('p.product_id')) + ->where($db->qn('q.id') . ' > 0') + ->group($db->qn('p.product_id')); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select( + $db->qn( + [ + 'q.id', 'q.parent_id', 'q.product_id', + 'q.question', 'q.user_id', 'q.user_name', + 'q.user_email', 'q.published', 'q.question_date', + 'q.ordering', 'q.telephone', 'q.address', + 'p.product_name' + ] + ) + ) + ->from($db->qn('#__redshop_customer_question', 'q')) + ->leftJoin( + $db->qn('#__redshop_product', 'p') + . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('q.product_id') + ) + ->where($db->qn('q.parent_id') . ' = 0'); + + $search = $this->getState('filter.search'); + $productId = $this->getState('filter.product_id'); + + if ($search) + { + $query->where($db->qn('q.question') . ' LIKE ' . $db->q('%' . $search . '%')); + } + + if ($productId != 0) + { + $query->where($db->qn('q.product_id') . ' = ' . $db->q($productId)); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/quotation.php b/component/admin/models/quotation.php new file mode 100644 index 00000000000..39057aabd71 --- /dev/null +++ b/component/admin/models/quotation.php @@ -0,0 +1,224 @@ +getState('filter'); + $id .= ':' . $this->getState('filter_status'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'q.quotation_cdate', $direction = 'desc') + { + $filter_status = $this->getUserStateFromRequest($this->context . 'filter_status', 'filter_status', 0); + $filter = $this->getUserStateFromRequest($this->context . 'filter', 'filter', ''); + + $this->setState('filter', $filter); + $this->setState('filter_status', $filter_status); + + parent::populateState($ordering, $direction); + } + + /** + * Get the columns for the csv file. + * + * @return array An associative array of column names as key and the title as value. + */ + public function getCsvColumns() + { + return array( + 'quotation_id' => JText::_('COM_REDSHOP_QUOTATION_ID'), + 'full_name' => JText::_('COM_REDSHOP_FULLNAME'), + 'user_email' => JText::_('COM_REDSHOP_USEREMAIL'), + 'phone' => JText::_('COM_REDSHOP_PHONE'), + 'quotation_status' => JText::_('COM_REDSHOP_QUOTATION_STATUS'), + 'quotation_note' => JText::_('COM_REDSHOP_QUOTATION_NOTE'), + 'product_name' => JText::_('COM_REDSHOP_PRODUCT_NAME'), + 'product_final_price' => JText::_('COM_REDSHOP_PRODUCT_PRICE'), + 'product_attribute' => JText::_('COM_REDSHOP_PRODUCT_ATTRIBUTE') + ); + } + + /** + * Method to get an array of data items. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getItemsCsv() + { + // Get a storage key. + $store = $this->getStoreId(); + + // Try to load the data from internal storage. + if (isset($this->cache[$store])) + { + return $this->cache[$store]; + } + + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select( + array( + 'q.*', 'uf.*', 'qi.quotation_item_id', 'qi.product_name', 'qi.product_final_price', 'qi.product_id', + '(CONCAT_WS(' . $db->q(' ') . ', uf.firstname, uf.lastname)) AS full_name' + ) + ) + ->from($db->qn('#__redshop_quotation', 'q')) + ->leftjoin($db->qn('#__redshop_users_info', 'uf') . ' ON q.user_id = uf.user_id AND uf.address_type = ' . $db->q('BT')) + ->leftJoin($db->qn('#__redshop_quotation_item', 'qi') . ' ON qi.quotation_id = q.quotation_id'); + + if ($filter = $this->getState('filter')) + { + $query->where('(uf.firstname LIKE ' . $db->q('%' . $filter . '%') . ' OR uf.lastname LIKE ' . $db->q('%' . $filter . '%') . ')'); + } + + if ($filterStatus = $this->getState('filter_status')) + { + $query->where('q.quotation_status = ' . $db->q($filterStatus)); + } + + $filterOrder = $this->getState('list.ordering', 'q.quotation_cdate'); + $filterOrderDir = $this->getState('list.direction', 'desc'); + + $query->order($db->qn($db->escape($filterOrder)) . ' ' . $db->escape($filterOrderDir)); + + $items = $this->_getList($query); + + // Check for a database error. + if ($this->_db->getErrorNum()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if ($items) + { + $productHelper = productHelper::getInstance(); + + foreach ($items as $key => $item) + { + $items[$key]->quotation_status = RedshopHelperQuotation::getQuotationStatusName($item->quotation_status); + $items[$key]->product_final_price = RedshopHelperProductPrice::formattedPrice($item->product_final_price); + $productAttribute = $productHelper->makeAttributeQuotation($item->quotation_item_id, 0, $item->product_id); + $productAttribute = preg_replace('#<[^>]+>#', ' ', $productAttribute); + $items[$key]->product_attribute = $productAttribute; + } + } + + // Add the items to the internal cache. + $this->cache[$store] = $items; + + return $this->cache[$store]; + } + + /** + * Method to get a JDatabaseQuery object for retrieving the data set from a database. + * + * @return JDatabaseQuery A JDatabaseQuery object to retrieve the data set. + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('q.*') + ->from($db->qn('#__redshop_quotation', 'q')) + ->leftJoin($db->qn('#__redshop_users_info', 'uf') . ' ON q.user_id = uf.user_id') + ->where('(uf.address_type = ' . $db->q('BT') . ' OR q.user_id = 0)') + ->group('q.quotation_id'); + + $filter = $this->getState('filter'); + $filter_status = $this->getState('filter_status'); + + if ($filter) + { + $query->where('(uf.firstname LIKE ' . $db->q('%' . $filter . '%') . ' OR uf.lastname LIKE ' . $db->q('%' . $filter . '%') . ')'); + } + + if ($filter_status != 0) + { + $query->where('q.quotation_status = ' . $db->q($filter_status)); + } + + $filterOrder = $this->getState('list.ordering', 'q.quotation_cdate'); + $filterOrderDir = $this->getState('list.direction', 'desc'); + + $query->order($db->qn($db->escape($filterOrder)) . ' ' . $db->escape($filterOrderDir)); + + return $query; + } + + /** + * Method to get an array of data items. + * + * @return mixed An array of data items on success, false on failure. + */ + public function getItems() + { + if ($this->getState('streamOutput', '') == 'csv') + { + return $this->getItemsCsv(); + } + else + { + return parent::getItems(); + } + } +} diff --git a/component/admin/models/quotation_detail.php b/component/admin/models/quotation_detail.php new file mode 100644 index 00000000000..45ee4dce82a --- /dev/null +++ b/component/admin/models/quotation_detail.php @@ -0,0 +1,883 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + $query = "SELECT q.* FROM " . $this->_table_prefix . "quotation AS q " + . "WHERE q.quotation_id='" . $this->_id . "' "; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + public function &getuserdata() + { + $producthelper = productHelper::getInstance(); + + if ($this->_data->user_id) + { + $userdata = $producthelper->getUserInformation($this->_data->user_id); + $this->_data->user_email = $userdata->user_email; + } + else + { + $detail = new stdClass; + $detail->users_info_id = 0; + $detail->user_id = 0; + $detail->id = 0; + $detail->gid = null; + $detail->name = null; + $detail->username = null; + $detail->email = null; + $detail->password = null; + $detail->usertype = null; + $detail->block = null; + $detail->sendEmail = null; + $detail->registerDate = null; + $detail->lastvisitDate = null; + $detail->activation = null; + $detail->is_company = null; + $detail->firstname = null; + $detail->lastname = null; + $detail->contact_info = null; + $detail->address_type = null; + $detail->company_name = null; + $detail->vat_number = null; + $detail->tax_exempt = 0; + $detail->country_code = null; + $detail->state_code = null; + $detail->shopper_group_id = null; + $detail->published = 1; + $detail->address = null; + $detail->city = null; + $detail->zipcode = null; + $detail->phone = null; + $detail->requesting_tax_exempt = 0; + $detail->tax_exempt_approved = 0; + $detail->approved = 1; + $userdata = $detail; + } + + return $userdata; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->quotation_id = 0; + $detail->user_id = 0; + $detail->quotation_number = RedshopHelperQuotation::generateQuotationNumber(); + $detail->user_info_id = null; + $detail->quotation_total = null; + $detail->quotation_subtotal = null; + $detail->quotation_status = null; + $detail->quotation_cdate = null; + $detail->quotation_mdate = null; + $detail->quotation_note = null; + $detail->quotation_ipaddress = $_SERVER ['REMOTE_ADDR']; + $detail->firstname = null; + $detail->lastname = null; + $detail->address = null; + $detail->zipcode = null; + $detail->city = null; + $detail->country_code = null; + $detail->state_code = null; + $detail->phone = null; + $detail->user_email = null; + $detail->is_company = null; + $detail->vat_number = null; + $detail->tax_exempt = null; + $detail->quotation_encrkey = null; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + if ($data['quotation_discount'] > $data['quotation_subtotal']) + { + $data['quotation_discount'] = $data['quotation_subtotal']; + } + + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $quotation_item = $data['quotation_item']; + + for ($i = 0, $in = count($quotation_item); $i < $in; $i++) + { + if (array_key_exists("quotation_item_id", $quotation_item[$i])) + { + $rowitem = $this->getTable('quotation_item_detail'); + $quotation_item[$i]->quotation_id = $row->quotation_id; + + if (!$rowitem->bind($quotation_item[$i])) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$rowitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + + return $row; + } + + public function sendQuotationMail($quotaion_id) + { + return Redshop\Mail\Quotation::sendMail($quotaion_id); + } + + public function delete($cid = array()) + { + if (empty($cid)) + { + return false; + } + + $cids = implode(',', $cid); + $items = RedshopHelperQuotation::getQuotationProduct($cids); + + for ($i = 0, $in = count($items); $i < $in; $i++) + { + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_accessory_item ' + . 'WHERE quotation_item_id = ' . $items[$i]->quotation_item_id . ' '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_attribute_item ' + . 'WHERE quotation_item_id = ' . $items[$i]->quotation_item_id . ' '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_fields_data ' + . 'WHERE quotation_item_id = ' . $items[$i]->quotation_item_id . ' '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_item ' + . 'WHERE quotation_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation WHERE quotation_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + public function deleteitem($cids = 0, $quotation_id = 0) + { + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_fields_data ' + . 'WHERE quotation_item_id IN ( ' . $cids . ' ) '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_accessory_item ' + . 'WHERE quotation_item_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_attribute_item ' + . 'WHERE quotation_item_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'quotation_item ' + . 'WHERE quotation_item_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + // Update Quotation Record + $QuotationData = $this->getTable('quotation_detail'); + $QuotationData->load($quotation_id); + + $QuotationTotal = 0; + $QuotationSubTotal = 0; + $QuotationSpDiscount = 0; + $QuotationDiscount = 0; + $QuotationTotDiscount = 0; + $QuotationTax = 0; + $quotationItems = RedshopHelperQuotation::getQuotationProduct($QuotationData->quotation_id); + + for ($q = 0, $qn = count($quotationItems); $q < $qn; $q++) + { + $QuotationSubTotal += ($quotationItems[$q]->product_excl_price * $quotationItems[$q]->product_quantity); + $QuotationTax += ($quotationItems[$q]->product_final_price - $quotationItems[$q]->product_excl_price) * $quotationItems[$q]->product_quantity; + } + + // Count final Total + $QuotationTotal = $QuotationTotal - $QuotationTotDiscount + $QuotationTax; + + // Deduct normal Discount + $QuotationDiscount = $QuotationData->quotation_discount; + + // Special Discount + $QuotationSpDiscount = ($QuotationData->quotation_special_discount * ($QuotationSubTotal + $QuotationTax)) / 100; + + // Total Discount + $QuotationTotDiscount = $QuotationDiscount + $QuotationSpDiscount; + + // Count final Total + $QuotationTotal = ($QuotationSubTotal + $QuotationTax) - $QuotationTotDiscount; + + $QuotationData->quotation_tax = $QuotationTax; + $QuotationData->quotation_total = $QuotationTotal; + $QuotationData->quotation_subtotal = $QuotationSubTotal; + $QuotationData->quotation_mdate = time(); + + if (!$QuotationData->store()) + { + return false; + } + + // Update Quotation Record + return true; + } + + // Add new Quotation Item + public function newQuotationItem($data) + { + $rsCarthelper = rsCarthelper::getInstance(); + $producthelper = productHelper::getInstance(); + $item = $data['quotation_item']; + + // Get Order Info + $quotationdata = $this->getTable('quotation_detail'); + $quotationdata->load($this->_id); + + $user_id = $quotationdata->user_id; + + // Set Order Item Info + $qitemdata = $this->getTable('quotation_item_detail'); + + for ($i = 0, $in = count($item); $i < $in; $i++) + { + $product_id = $item[$i]->product_id; + $quantity = $item[$i]->quantity; + $product_excl_price = $item[$i]->prdexclprice; + $product_price = $item[$i]->productprice; + + $product = Redshop::product((int) $product_id); + + $generateAttributeCart = Redshop\Cart\Helper::generateAttribute((array) $item[$i], $user_id); + $retAttArr = $producthelper->makeAttributeCart($generateAttributeCart, $product_id, $user_id, 0, $quantity); + $product_attribute = $retAttArr[0]; + + $generateAccessoryCart = $rsCarthelper->generateAccessoryArray((array) $item[$i], $user_id); + $retAccArr = $producthelper->makeAccessoryCart($generateAccessoryCart, $product_id, $user_id); + $product_accessory = $retAccArr[0]; + + $wrapper_price = 0; + $wrapper_vat = 0; + $wrapper = $producthelper->getWrapper($product_id, $item[$i]->wrapper_data); + + if (count($wrapper) > 0) + { + if ($wrapper[0]->wrapper_price > 0) + { + $wrapper_vat = $producthelper->getProducttax($product_id, $wrapper[0]->wrapper_price, $user_id); + } + + $wrapper_price = $wrapper[0]->wrapper_price + $wrapper_vat; + } + + $qitemdata = $this->getTable('quotation_item_detail'); + + $qitemdata->quotation_item_id = 0; + $qitemdata->quotation_id = $this->_id; + $qitemdata->product_id = $product_id; + $qitemdata->is_giftcard = 0; + $qitemdata->product_name = $product->product_name; + $qitemdata->actualitem_price = $product_price; + $qitemdata->product_price = $product_price; + $qitemdata->product_excl_price = $product_excl_price; + $qitemdata->product_final_price = $product_price * $quantity; + $qitemdata->product_attribute = $product_attribute; + $qitemdata->product_accessory = $product_accessory; + $qitemdata->product_wrapperid = $item[$i]->wrapper_data; + $qitemdata->wrapper_price = $wrapper_price; + $qitemdata->product_quantity = $quantity; + + if (!$qitemdata->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + /** my accessory save in table start */ + if (count($generateAccessoryCart) > 0) + { + $attArr = $generateAccessoryCart; + + for ($a = 0, $an = count($attArr); $a < $an; $a++) + { + $accessory_vat_price = 0; + $accessory_attribute = ""; + $accessory_id = $attArr[$a]['accessory_id']; + $accessory_name = $attArr[$a]['accessory_name']; + $accessory_price = $attArr[$a]['accessory_price']; + $accessory_org_price = $accessory_price; + + if ($accessory_price > 0) + { + $accessory_vat_price = $producthelper->getProductTax($qitemdata->product_id, $accessory_price, $user_id); + } + + $attchildArr = $attArr[$a]['accessory_childs']; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $attribute_id = $attchildArr[$j]['attribute_id']; + $accessory_attribute .= urldecode($attchildArr[$j]['attribute_name']) . ":
    "; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $qitemdata->quotation_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $accessory_id; + $rowattitem->section_name = $attchildArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 1; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $propArr = $attchildArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = $producthelper->getProducttax($qitemdata->product_id, $propArr[$k]['property_price'], $user_id); + } + + $property_id = $propArr[$k]['property_id']; + $accessory_attribute .= urldecode($propArr[$k]['property_name']) . " (" . $propArr[$k]['property_oprand'] + . $producthelper->getProductFormattedPrice($propArr[$k]['property_price'] + $section_vat) . ")
    "; + $subpropArr = $propArr[$k]['property_childs']; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $qitemdata->quotation_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = $producthelper->getProducttax($qitemdata->product_id, $subpropArr[$l]['subproperty_price'], $user_id); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + $accessory_attribute .= urldecode($subpropArr[$l]['subproperty_name']) . " (" . $subpropArr[$l]['subproperty_oprand'] + . $producthelper->getProductFormattedPrice($subpropArr[$l]['subproperty_price'] + $section_vat) . ")
    "; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $qitemdata->quotation_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + + $accdata = $this->getTable('accessory_detail'); + + if ($accessory_id > 0) + { + $accdata->load($accessory_id); + } + + $accProductinfo = Redshop::product((int) $accdata->child_product_id); + $rowaccitem = $this->getTable('quotation_accessory_item'); + $rowaccitem->quotation_item_acc_id = 0; + $rowaccitem->quotation_item_id = $qitemdata->quotation_item_id; + $rowaccitem->accessory_id = $accessory_id; + $rowaccitem->accessory_item_sku = $accProductinfo->product_number; + $rowaccitem->accessory_item_name = $accessory_name; + $rowaccitem->accessory_price = $accessory_org_price; + $rowaccitem->accessory_vat = $accessory_vat_price; + $rowaccitem->accessory_quantity = $qitemdata->product_quantity; + $rowaccitem->accessory_item_price = $accessory_price; + $rowaccitem->accessory_final_price = ($accessory_price * $qitemdata->product_quantity); + $rowaccitem->accessory_attribute = $accessory_attribute; + + if ($accessory_id > 0) + { + if (!$rowaccitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + + /** my attribute save in table start */ + if (count($generateAttributeCart) > 0) + { + $attArr = $generateAttributeCart; + + for ($j = 0, $jn = count($attArr); $j < $jn; $j++) + { + $attribute_id = $attArr[$j]['attribute_id']; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $qitemdata->quotation_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $qitemdata->product_id; + $rowattitem->section_name = $attArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 0; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $propArr = $attArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = $producthelper->getProducttax($qitemdata->product_id, $propArr[$k]['property_price'], $user_id); + } + + $property_id = $propArr[$k]['property_id']; + + /** product property STOCKROOM update start */ + RedshopHelperStockroom::updateStockroomQuantity($property_id, $qitemdata->product_quantity, "property"); + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $qitemdata->quotation_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = $producthelper->getProducttax($qitemdata->product_id, $subpropArr[$l]['subproperty_price'], $user_id); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + + /** product subproperty STOCKROOM update start */ + $updatestock = RedshopHelperStockroom::updateStockroomQuantity($subproperty_id, $qitemdata->product_quantity, "subproperty"); + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $qitemdata->quotation_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + } + + $jinput = JFactory::getApplication()->input; + + // Store userfields + $userfields = $jinput->getSring('extrafieldname' . $qitemdata->product_id . 'product1'); + $userfields_id = $jinput->getInt('extrafieldId' . $qitemdata->product_id . 'product1'); + + for ($ui = 0, $countUserField = count($userfields); $ui < $countUserField; $ui++) + { + RedshopHelperQuotation::insertQuotationUserField($userfields_id[$ui], $qitemdata->quotation_item_id, 12, $userfields[$ui]); + } + } + + // Update Quotation Record + $QuotationData = $this->getTable('quotation_detail'); + $QuotationData->load($this->_id); + + $QuotationTotal = 0; + $QuotationSubTotal = 0; + $QuotationSpDiscount = 0; + $QuotationDiscount = 0; + $QuotationTotDiscount = 0; + $QuotationTax = 0; + $quotationItems = RedshopHelperQuotation::getQuotationProduct($QuotationData->quotation_id); + + for ($q = 0, $qn = count($quotationItems); $q < $qn; $q++) + { + $QuotationSubTotal += ($quotationItems[$q]->product_excl_price * $quotationItems[$q]->product_quantity); + $QuotationTax += ($quotationItems[$q]->product_final_price - $quotationItems[$q]->product_excl_price) * $quotationItems[$q]->product_quantity; + } + + // Deduct normal Discount + $QuotationDiscount = $QuotationData->quotation_discount; + + // Special Discount + $QuotationSpDiscount = ($QuotationData->quotation_special_discount * ($QuotationSubTotal + $QuotationTax)) / 100; + + // Total Discount + $QuotationTotDiscount = $QuotationDiscount + $QuotationSpDiscount; + + // Count final Total + $QuotationTotal = ($QuotationSubTotal + $QuotationTax) - $QuotationTotDiscount; + + $QuotationData->quotation_tax = $QuotationTax; + $QuotationData->quotation_total = $QuotationTotal; + $QuotationData->quotation_subtotal = $QuotationSubTotal; + $QuotationData->quotation_mdate = time(); + + if (!$QuotationData->store()) + { + return false; + } + else + { + return true; + } + + // End + return true; + } + + public function storeOrder($data) + { + $producthelper = productHelper::getInstance(); + $db = $this->getDbo(); + $orderNumber = RedshopHelperOrder::generateOrderNumber(); + $encrKey = \Redshop\Crypto\Helper\Encrypt::generateCustomRandomEncryptKey(35); + + $row = $this->getTable('order_detail'); + $row->user_id = (int) $data['user_id']; + $row->order_number = $orderNumber; + $row->user_info_id = (int) $data['user_info_id']; + $row->order_total = $data['quotation_total']; + $row->order_subtotal = $data['quotation_subtotal']; + $row->order_tax = $data['quotation_tax']; + $row->order_discount = $data['quotation_discount']; + $row->special_discount_amount = $data['quotation_special_discount']; + $row->order_status = 'P'; + $row->order_payment_status = 'Unpaid'; + $row->cdate = time(); + $row->mdate = time(); + $row->ip_address = $data['quotation_ipaddress']; + $row->encr_key = $encrKey; + $row->special_discount = $data['quotation_special_discount']; + $row->order_discount_vat = $data['Discountvat']; + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $orderId = $row->order_id; + + $rowOrderStatus = $this->getTable('order_status_log'); + $rowOrderStatus->order_id = $orderId; + $rowOrderStatus->order_status = 'P'; + $rowOrderStatus->date_changed = time(); + $rowOrderStatus->customer_note = ''; + $rowOrderStatus->store(); + + foreach ($data['quotation_item'] as $key => $item) + { + $rowItem = $this->getTable('order_item_detail'); + + if (!empty($item->quotation_item_id)) + { + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_quotation_item')) + ->where($db->qn('quotation_item_id') . ' = ' . $db->q((int) $item->quotation_item_id)); + $quotationItem = $db->setQuery($query)->loadObject(); + + $product = $producthelper->getProductById($quotationItem->product_id); + + $rowItem->order_id = $orderId; + $rowItem->user_info_id = $data['user_info_id']; + $rowItem->supplier_id = $product->supplier_id; + $rowItem->product_id = $quotationItem->product_id; + $rowItem->order_item_sku = $product->product_number; + $rowItem->order_item_name = $product->product_name; + $rowItem->product_quantity = $quotationItem->product_quantity; + $rowItem->product_item_price = $quotationItem->product_price; + $rowItem->product_item_price_excl_vat = $quotationItem->product_excl_price; + $rowItem->product_final_price = $quotationItem->product_final_price; + $rowItem->order_item_currency = Redshop::getConfig()->get('REDCURRENCY_SYMBOL'); + $rowItem->order_status = 'P'; + $rowItem->cdate = time(); + $rowItem->mdate = time(); + $rowItem->product_attribute = $quotationItem->product_attribute; + $rowItem->product_accessory = $quotationItem->product_accessory; + $rowItem->is_giftcard = $quotationItem->is_giftcard; + $rowItem->wrapper_id = $quotationItem->product_wrapperid; + $rowItem->wrapper_price = $quotationItem->wrapper_price; + + if (!$rowItem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + + $userRow = $this->getTable('user_detail'); + $userRow->load($data['user_info_id']); + $orderUser = $this->getTable('order_user_detail'); + + if (!$orderUser->bind($userRow)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $orderUser->order_id = $orderId; + $orderUser->address_type = 'BT'; + + if (!$orderUser->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $fields = array( + $db->qn('order_id') . ' = ' . $db->q((int) $orderId) + ); + + $conditions = array( + $db->qn('quotation_id') . ' = ' . $db->q((int) $data['quotation_id']) + ); + + $query = $db->getQuery(true) + ->clear() + ->update($db->qn('#__redshop_quotation')) + ->set($fields) + ->where($conditions); + + return $db->setQuery($query)->execute(); + } +} diff --git a/component/admin/models/rating.php b/component/admin/models/rating.php new file mode 100644 index 00000000000..58d769f6a67 --- /dev/null +++ b/component/admin/models/rating.php @@ -0,0 +1,73 @@ +getState('comment_filter'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'rating_id', $direction = 'desc') + { + $comment_filter = $this->getUserStateFromRequest($this->context . '.comment_filter', 'comment_filter', ''); + $this->setState('comment_filter', $comment_filter); + + parent::populateState($ordering, $direction); + } + + public function _buildQuery() + { + $comment_filter = $this->getState('comment_filter'); + + $where = ''; + + if ($comment_filter) + { + $where = " WHERE u.username LIKE '%" . $comment_filter . "%' "; + $where .= " OR r.comment LIKE '%" . $comment_filter . "%' "; + $where .= " OR p.product_name LIKE '%" . $comment_filter . "%' "; + } + + $orderby = $this->_buildContentOrderBy(); + + $query = ' SELECT p.product_name,u.username,r.* ' + . ' FROM #__redshop_product_rating r LEFT JOIN #__redshop_product p ON p.product_id = r.product_id LEFT JOIN #__users u ON u.id = r.userid ' . $where . $orderby; + + return $query; + } +} diff --git a/component/admin/models/rating_detail.php b/component/admin/models/rating_detail.php new file mode 100644 index 00000000000..d650b7786aa --- /dev/null +++ b/component/admin/models/rating_detail.php @@ -0,0 +1,240 @@ +_table_prefix = '#__redshop_'; + + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + $query = $this->_db->getQuery(true); + + if (empty($this->_data)) + { + $query->select(array('p.*', 'IFNULL(u.name, p.username) AS username', 'pr.product_name')) + ->from(array($this->_db->qn('#__redshop_product', 'pr'), $this->_db->qn('#__redshop_product_rating', 'p'))) + ->join('LEFT', $this->_db->qn('#__users', 'u') . ' ON (' . $this->_db->qn('u.id') . ' = ' . $this->_db->qn('p.userid') . ')') + ->where($this->_db->qn('p.rating_id') . ' = ' . $this->_db->q($this->_id)) + ->where($this->_db->qn('p.product_id') . ' = ' . $this->_db->qn('pr.product_id')); + + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->rating_id = null; + $detail->product_id = null; + $detail->title = null; + $detail->comment = null; + $detail->userid = null; + $detail->time = null; + $detail->user_rating = null; + $detail->favoured = null; + $detail->published = 1; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + // Set email for existing joomla user + if (isset($data['userid']) && $data['userid'] > 0) + { + $user = JFactory::getUser($data['userid']); + $data['email'] = $user->email; + $data['username'] = $user->username; + } + + $row = $this->getTable(); + + // Check if this rate is rated before + $rtn = $row->load(array('userid' => $data['userid'], 'product_id' => $data['product_id'])); + + // This one is not rated before + if ($rtn === false) + { + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + else + { + return false; + } + + return $row; + } + + /** + * 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 1.6 + */ + public function delete(&$pks) + { + $pks = (array) $pks; + + if (!empty($pks)) + { + $db = $this->_db; + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_product_rating')) + ->where($db->qn('rating_id') . ' IN (' . implode(',', $pks) . ')'); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish(&$pks, $value = 1) + { + if (count($pks)) + { + $cids = implode(',', $pks); + + $query = 'UPDATE ' . $this->_table_prefix . 'product_rating' + . ' SET published = ' . intval($value) + . ' WHERE rating_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function favoured($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'product_rating' + . ' SET favoured = ' . intval($publish) + . ' WHERE rating_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function getuserslist() + { + $query = 'SELECT u.id as value,u.name as text FROM #__users as u,' . $this->_table_prefix . + 'users_info ru WHERE u.id=ru.user_id AND ru.address_type like "BT"'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function getproducts() + { + $product_id = JFactory::getApplication()->input->get('pid'); + + if ($product_id) + { + $query = 'SELECT product_id,product_name FROM ' . $this->_table_prefix . 'product WHERE product_id =' . $product_id; + $this->_db->setQuery($query); + + return $this->_db->loadObject(); + } + } + + public function getuserfullname2($uid) + { + $query = "SELECT firstname,lastname,username FROM " . $this->_table_prefix . "users_info as uf, #__users as u WHERE user_id=" + . $uid . " AND address_type like 'BT' AND uf.user_id=u.id"; + $this->_db->setQuery($query); + $this->_username = $this->_db->loadObject(); + $fullname = $this->_username->firstname . " " . $this->_username->lastname . " (" . $this->_username->username . ")"; + + return $fullname; + } +} diff --git a/component/admin/models/redshop.php b/component/admin/models/redshop.php new file mode 100644 index 00000000000..3229dbae1f8 --- /dev/null +++ b/component/admin/models/redshop.php @@ -0,0 +1,437 @@ +_table_prefix = '#__redshop_'; + $this->_filteroption = 3; + } + + /** + * Method for insert demo content + * + * @return boolean + * + * @since 1.6 + */ + public function demoContentInsert() + { + $db = JFactory::getDbo(); + $categoryTable = RedshopTable::getAdminInstance('Category'); + + // Category insert + $categoryTable->id = null; + $categoryTable->name = 'Events and Forms'; + $categoryTable->template = 5; + $categoryTable->more_template = '5,8'; + $categoryTable->products_per_page = 4; + $categoryTable->published = 1; + $categoryTable->ordering = 1; + $categoryTable->append_to_global_seo = 'append'; + $categoryTable->setLocation(RedshopHelperCategory::getRootId(), 'last-child'); + $categoryTable->store(); + + $firstCatId = $categoryTable->id; + + // Category insert + $categoryTable->reset(); + $categoryTable->id = null; + $categoryTable->name = 'CCK and e-Commerce'; + $categoryTable->template = 5; + $categoryTable->products_per_page = 4; + $categoryTable->published = 1; + $categoryTable->ordering = 2; + $categoryTable->append_to_global_seo = 'append'; + $categoryTable->setLocation(RedshopHelperCategory::getRootId(), 'last-child'); + $categoryTable->store(); + + $secondCatId = $categoryTable->id; + + // Category insert + $categoryTable->reset(); + $categoryTable->id = null; + $categoryTable->name = 'Templates'; + $categoryTable->template = 8; + $categoryTable->products_per_page = 6; + $categoryTable->published = 1; + $categoryTable->ordering = 3; + $categoryTable->append_to_global_seo = 'append'; + $categoryTable->setLocation(RedshopHelperCategory::getRootId(), 'last-child'); + $categoryTable->store(); + + $thirdCatId = $categoryTable->id; + + unset($categoryTable); + + $query = "INSERT IGNORE INTO `#__redshop_fields` + (`id`, `title`, `name`, `type`, `desc`, `class`, `section`, `maxlength`, `cols`, `rows`, `size`, `show_in_front`,`published`, `required`) + VALUES + (1, 'Userfield Test', 'rs_userfield_test', '1', '', '', '12', '20', '0', '0', '20', '1', '1', '0')"; + + $db->setQuery($query)->execute(); + + // Insert demo manufacturers + $this->demoManufacturers(); + + $query = "INSERT IGNORE INTO `#__redshop_media` + (`media_id`, `media_name`, `media_section`, `section_id`, `media_type`, `media_mimetype`, `published`, `media_alternate_text`) + VALUES (16, '1262876429_redEVENT-box.jpg', 'product', 1, 'images', 'image/jpeg', 1, ''), + (20, '1262876675_redVMPRODUCTFINDER-box.jpg', 'product', 5, 'images', 'image/jpeg', 1, ''), + (23, '1262876737_redVMMASSCART-box.jpg', 'product', 8, 'images', 'image/jpeg', 1, ''), + (45, '1421054444_bakery-demo-400-400.jpg', 'product', 10, 'images', 'image/jpeg', 1, ''), + (46, '1421054762_carpenter-demo-400-400.jpg', 'product', 11, 'images', 'image/jpeg', 1, ''), + (47, '1421055027_fashionstore-demo-400-400.jpg', 'product', 8, 'images', 'image/jpeg', 1, ''), + (48, '1421055222_gadgets-demo-400-400.jpg', 'product', 12, 'images', 'image/jpeg', 1, ''), + (49, '1421055392_kidswear-demo-400-400.jpg', 'product', 13, 'images', 'image/jpeg', 1, ''), + (50, '1421055573_shoemaniac-demo-400-400.jpg', 'product', 14, 'images', 'image/jpeg', 1, ''), + (51, '1421055894_valentine-demo-400-400.jpg', 'product', 9, 'images', 'image/jpeg', 1, ''), + (52, '1421064966_appearance-top.png', 'product', 3, 'images', 'image/png', 1, ''), + (53, 'redCOMPONENTS.jpg', 'product', 2, 'images', '', 1, ''), + (54, 'redCOMPONENTS.jpg', 'product', 4, 'images', '', 1, ''), + (55, 'redCOMPONENTS.jpg', 'product', 7, 'images', '', 1, ''), + (56, 'redCOMPONENTS.jpg', 'product', 6, 'images', '', 1, '') + "; + + $db->setQuery($query)->execute(); + + $query = "INSERT IGNORE INTO `#__redshop_product` (`product_id`, `product_parent_id`, `manufacturer_id`, `supplier_id`, `product_on_sale`, `product_special`, `product_download`, `product_template`, `product_name`, `product_price`, `discount_price`, `discount_stratdate`, `discount_enddate`, `product_number`, `product_type`, `product_s_desc`, `product_desc`, `product_volume`, `product_tax_id`, `published`, `product_thumb_image`, `product_full_image`, `publish_date`, `update_date`, `visited`, `metakey`, `metadesc`, `metalanguage_setting`, `metarobot_info`, `pagetitle`, `pageheading`, `sef_url`, `cat_in_sefurl`, `weight`, `expired`, `not_for_sale`, `use_discount_calc`, `discount_calc_method`, `min_order_product_quantity`, `attribute_set_id`, `product_length`, `product_height`, `product_width`, `product_diameter`, `product_availability_date`, `use_range`, `product_tax_group_id`, `product_download_days`, `product_download_limit`, `product_download_clock`, `product_download_clock_min`, `accountgroup_id`, `quantity_selectbox_value`, `checked_out`, `checked_out_time`, `max_order_product_quantity`, `product_download_infinite`, `product_back_full_image`, `product_back_thumb_image`, `product_preview_image`, `product_preview_back_image`, `preorder`, `append_to_global_seo`) VALUES + (1, 0, 2, 0, 0, 0, 0, 9, 'redEVENT', 48, 0, 0, 0, '1', 'product', '

    redEVENT is a Joomla 3 native MVC event component. Build over the popular but yet limited event component eventlist, the redEVENT fork along with its 100% integration to redFORM has taken the ease and flexibility of creating and managing event

    ', '

    redEVENT is a Joomla 3 native MVC event component. Build over the popular but yet limited event component eventlist, the redEVENT fork along with its 100% integration to redFORM has taken the ease and flexibility of creating and managing events and bookings to a whole new level.

    \r\n

    Super dynamical with the simple yet powerful and customizable input forms from redFORM, you can make small simple signup forms or you can go all the way and do full registration formulars for the attendees to your events. Along with the new options of newsletter integration and dynamical waitinglists along with the ability to manually alter and customise the frontend list of attendees on each event, there never has been more flexibility in Event handling in Joomla then now!

    \r\n

    redEVENT takes it basis on the component Eventlist and the work of Christoph Lukes from Schlu.net and as such we here from redCOMPONENT give credits to Christoph for his work - However as we where met with requirements for a much higher level of functionality and flexibility from our customers and with a vision to integrate the event form handling into redFORM we decided to do a full fork of Eventlist and redEVENT was born. redEVENT is developed upon the basis of Eventlist 1.0b however due to the extensive changes made in the component it will not be possible to update the event component along the paths of Eventlist in the future and instead redEVENT will take its own path and live in the wonderful world of Joomla Extensions.

    \r\n

    redEVENT is released and is in a stable state. The list of abilities in redEVENT that makes it unique compared to its predecessor Eventlist, is included in the following:

    \r\n
      \r\n
    • Unlimited amount of events
    • \r\n
    • Allow registration with or without Joomla User creation
    • \r\n
    • Allow registration and cancellation using Joomla User creation
    • \r\n
    • Waitinglist on individual events - Set waitinglist per event!
    • \r\n
    • Individual confirmation- and registration emails
    • \r\n
    • Confirmation trough email confirmation link
    • \r\n
    • Unlimited amount of Forms, Fields and Inputs by integration to redFORM
    • \r\n
    • Dynamical options for input type (Radio, Checkbox, Textfield, Textarea, Email, Username, Fullname)
    • \r\n
    • Dynamical frontend attendee lists using the fields you made in the form (you made in redFORM) used by the event
    • \r\n
    • Admin notification and option to send on formular data to the admin
    • \r\n
    • Integration with the open source mailinglist project PHPlist and the Joomla native components ccNewsletter and Acajoom.
    • \r\n
    • Add custom styles to input fields trough backend and style in template css
    • \r\n
    • and much more...
    • \r\n
    ', 0, 0, 1, '', '1262876429_redEVENT-box.jpg', '2014-12-08 15:26:01', '2015-01-12 12:58:09', 23, '', '', '', '', '', '', '', 2, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (2, 0, 2, 0, 0, 0, 0, 9, 'redFORM', 36, 0, 0, 0, '2', 'product', '

    redFORM for Joomla! 3.

    ', '

    redFORM is an advanced form system for Joomla 2.5 and Joomla 3 This forms extension let you make different kind of forms in minutes. It is easy and fast to customize your own forms and only integrate the specific fields, that you need.

    \r\n

    redFORM integrates with redEVENT allowing you to add payment to your events

    \r\n

    Some of the features include:

    \r\n
      \r\n
    • Unlimited amount of Forms
    • \r\n
    • Payment integrations
    • \r\n
    • Complete statistics over forms
    • \r\n
    • Integration with redEVENT
    • \r\n
    • And much more..
    • \r\n
    ', 0, 0, 1, '', 'redCOMPONENTS.jpg', '2014-12-08 15:26:01', '2015-01-12 13:19:00', 25, '', '', '', '', '', '', '', 2, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (3, 0, 2, 0, 0, 0, 0, 9, 'redCOOKIE', 24, 0, 0, 0, '3', 'product', '

    redCOOKIE is a Joomla 3 plugin that make it easy to add cookie accept to your site.

    ', '

    redCOOKIE is a Joomla 3 plugin that let you easily add cookie accept functionality to your site.

    \r\n

    To meet the requirement of the EU cookie directive website owners can use the plugin to add accept cookie functionality to their site in a matter of minutes.

    The redCOOKIE plugin provide you with 3 different options to show the accept message.

    \r\n
      \r\n
    1. Top bar
    2. \r\n
    3. Side slider
    4. \r\n
    5. Bottom box
    6. \r\n
    \r\n

    Within the plugin configuration you can select the option you prefer, and with a few clicks you can choose your own background and text colours of the accept box. You can read in detail about the settings in our redCOOKIE documentation

    ', 0, 0, 1, '', '1421064966_appearance-top.png', '2014-12-08 15:26:01', '2015-01-12 12:41:05', 9, '', '', '', '', '', '', '', 2, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (4, 0, 2, 0, 0, 0, 0, 9, 'redSLIDER', 24, 0, 0, 0, '4', 'product', '

    redSLIDER is a unique responsive slider extension for Joomla! 3.

    ', '

    redSLIDER is a Joomla 3 component and module that let you manage and show responsive sliders in your site.

    \r\n

    With redSLIDER you can manage galleries of slides in the component, and each slide can use an own template. The associated module will let you show the galleries in multiple ways according to the settings you choose.

    \r\n

    redSLIDER can be extended with extension specific plugins, which will allow you to show a form or a product directly in a slide. Learn much more on how to use redSLIDER, and see how it is easily setup and configured in our documentation wiki

    ', 0, 0, 1, '', 'redCOMPONENTS.jpg', '2014-12-08 15:26:01', '2015-01-12 13:24:35', 7, '', '', '', '', '', '', '', 2, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (5, 0, 1, 0, 0, 0, 0, 9, 'redITEM', 48, 0, 0, 0, '5', 'product', '

    redITEM is a CCK for Joomla that let you create any type of content

    ', '

    redITEM is a CCK component developed by redCOMPONENT.com which allows you to create your own items, fields, categories and groups in Joomla. Based on its predecessor, redITEM, the new redITEM 2 now has new useful features that can help you easily manage your own items, which can be anything from books to airplanes..

    \r\n

     

    \r\n

    redITEM includes the following features:

    \r\n
      \r\n
    • Create types, categories, items and custom fields for items.
    • \r\n
    • Diverse types of custom fields available
    • \r\n
    • Create templates for displaying categories and items
    • \r\n
    • MVC structural build allows users to create overrides
    • \r\n
    • and much more...
    • \r\n
    ', 0, 0, 1, '', '1262876869_redCOMPONENTS.jpg', '2014-12-08 15:26:01', '2015-01-12 13:47:36', 2, '', '', '', '', '', '', '', 3, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (6, 0, 1, 0, 0, 0, 0, 9, 'redSHOP', 48, 0, 0, 0, '6', 'product', '

    redSHOP is the leading webshop solution for Joomla. You get an advanced and fully integrated native webshop, with a built-in template system allowing you to style your shop to your exact needs. A feature rich and powerful shop

    ', '

    redSHOP is the perfect e-Commerce solution to use for your website. It is the most advanced webshop extension, and it is highly flexible in the built-in templating system and the site design can be adjusted without limitations

    \r\n

    redSHOP is the better solution whether you run a small webshop or a large scale webshop with high load.

    \r\n

    redSHOP includes the following features:

    \r\n
      \r\n
    • No limitations to design and templateability
    • \r\n
    • Offer gift certificates and gift wrapping
    • \r\n
    • Multiple currencies
    • \r\n
    • Add pictures in different sizes
    • \r\n
    • Multiple payment and shipping methods
    • \r\n
    • Send out newsletters and catalogues
    • \r\n
    • Statistics and Search Engine Optimization
    • \r\n
    • Create action e-mails
    • \r\n
    • Ready-to-use and easy-to-manage webshop
    • \r\n
    • Supports multiple languages
    • \r\n
    • and much more...
    • \r\n
    \r\n

     

    \r\n

    Extendable:

    \r\n

    redSHOP has +100 extensions, like payment plugins, shipping plugins and redSHOP ready templates.

    ', 0, 0, 1, '', 'redCOMPONENTS.jpg', '2014-12-08 15:26:01', '2015-01-12 14:36:40', 10, '', '', '', '', '', '', '', 3, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (7, 0, 1, 0, 0, 0, 0, 9, 'redCORE', 0, 0, 0, 0, '7', 'product', '

    redCORE is a multifunctional Development Tool and library for Joomla CMS

    ', '

    redCORE is a Rapid Application Development library for redCOMPONENT extensions..

    \r\n

    The main aim of redCORE is to provide a mature and abstracted layer for development that will act as a base model for any future redCOMPONENT extension beeing developed.

    \r\n

    There is no convention over configuration in redCORE, unlike its counterparts, because we need more complex structures and hierachy and to solve more complex problems in redCORE.

    \r\n

    redCORE is a quicker and more uniform way of creating extensions while adding some very interesting libraries and features to Joomla.

    \r\n

    redCORE is not a rapid application development tool based on conventions to automatically create output.

    \r\n

    redCORE based extensions is forward and backward compatible and works for Joomla 2.5 and 3.x.

    \r\n

    Some of the features include:

    \r\n
      \r\n
    • Do More with less code
    • \r\n
    • Your extensions look and behave exactly same on J25 and J33 and all future versions of Joomla!
    • \r\n
    • Download and use redCORE in your extensions and benefit from our already tested and proven code.
    • \r\n
    • redCORE is not replacing Joomla! functionality, it is extending it.
    • \r\n
    • Built-in translation functionality
    • \r\n
    • and much much more...
    • \r\n
    \r\n

     

    \r\n

    Read more in the redCORE public GitHub wiki

    ', 0, 0, 1, '', 'redCOMPONENTS.jpg', '2014-12-08 15:26:01', '2015-01-12 13:37:20', 4, '', '', '', '', '', '', '', 3, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (8, 0, 3, 0, 0, 0, 0, 9, 'redFASHIONSTORE', 50, 0, 0, 0, '8', 'product', '

    redFASHIONSTORE shopping template for redSHOP and joomla

    ', '

    redFASHIONSTORE is a great looking template that can be used for clothing and fashion stores.

    \r\n

    The combination of a template that is already styled for redSHOP, and the easy to use Quickstart packages, you can have a great looking site in minutes. Ready to adjust to your specific needs.

    \r\n

    Try visit the demo of redFASHIONSTORE and see the Quickstart package in action.

    ', 0, 0, 1, '', '1421055027_fashionstore-demo-400-400.jpg', '2014-12-08 15:26:01', '2015-01-12 11:40:26', 7, '', '', '', '', '', '', '', 4, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (9, 0, 3, 0, 0, 0, 0, 9, 'redVALENTINE', 50, 0, 0, 0, '9', 'product', '

    redVALENTINE shopping template for redSHOP and joomla

    ', '

    redVALENTINE is an warm and hearthy shopping template which is perfectly suited for a giftstore or other luxury items.

    \r\n

    The combination of a template that is already styled for redSHOP, and the easy to use Quickstart packages, you can have a great looking site in minutes. Ready to adjust to your specific needs.

    \r\n

    Try visit the demo of redVALENTINE and see the Quickstart package in action.

    ', 0, 0, 1, '', '1421055894_valentine-demo-400-400.jpg', '2014-12-08 15:26:01', '2015-01-12 12:08:39', 4, '', '', '', '', '', '', '', 4, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (10, 0, 3, 0, 0, 0, 0, 9, 'redBAKERY', 50, 0, 0, 0, '10', 'product', '

    redBAKERY is a shopping template for redSHOP and joomla that is perfectly suited for a delicious food webshop.

    ', '

    redBAKERY is a joomla template that include redSHOP styling, and has a tasteful food theme making it suitable for food, coffee, tea or similar shopping sites.

    \r\n

    The combination of a template that is already styled for redSHOP, and the easy to use Quickstart packages, you can have a great looking site in minutes. Ready to adjust to your specific needs.

    \r\n

    Try visit the demo of redBAKERY and see the Quickstart package in action. 

    ', 0, 0, 1, '', '1421054444_bakery-demo-400-400.jpg', '2014-12-08 15:26:01', '2015-01-12 11:25:10', 3, '', '', '', '', '', '', '', 4, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (11, 0, 3, 0, 0, 0, 0, 9, 'redCARPENTER', 50, 0, 0, 0, '11', 'product', '

    redCARPENTER is a shopping template for redSHOP and joomla

    ', '

    redCARPENTER has a stylish construction, DIY or tooling theme, that make it a good fit for a wide range of websites.

    \r\n

    The combination of a template that is already styled for redSHOP, and the easy to use Quickstart packages, you can have a great looking site in minutes. Ready to adjust to your specific needs.

    \r\n

    Try visit the demo of redCARPENTER and see the Quickstart package in action.

    ', 0, 0, 1, '', '1421054762_carpenter-demo-400-400.jpg', '2014-12-08 15:26:01', '2015-01-12 11:32:15', 3, '', '', '', '', '', '', '', 4, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (12, 0, 3, 0, 0, 0, 0, 9, 'redGADGETS', 50, 0, 0, 0, '12', 'product', '

    redGADGETS is a tech styled shopping template for redSHOP and joomla

    ', '

    redGADGETS is a gadgets inspired template that is well suited for your webshops, with its visual tech appearance. Your users will love it.

    \r\n

    The combination of a template that is already styled for redSHOP, and the easy to use Quickstart packages, you can have a great looking site in minutes. Ready to adjust to your specific needs.

    \r\n

    Try visit the demo of redGADGETS and see the Quickstart package in action.

    ', 0, 0, 1, '', '1421055222_gadgets-demo-400-400.jpg', '2014-12-08 15:26:01', '2015-01-12 11:46:44', 5, '', '', '', '', '', '', '', 4, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (13, 0, 3, 0, 0, 0, 0, 9, 'redKIDSWEAR', 50, 0, 0, 0, '13', 'product', '

    redKIDSWEAR is a shopping template for redSHOP and joomla

    ', '

    redKIDSWEAR is a bright and joyful shop template, perfectly suited for a kids clothing shop.

    \r\n

    The combination of a template that is already styled for redSHOP, and the easy to use Quickstart packages, you can have a great looking site in minutes. Ready to adjust to your specific needs.

    \r\n

    Try visit the demo of redKIDSWEAR and see the Quickstart package in action.

    ', 0, 0, 1, '', '1421055392_kidswear-demo-400-400.jpg', '2014-12-08 15:26:01', '2015-01-12 11:57:02', 8, '', '', '', '', '', '', '', 4, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append'), + (14, 0, 3, 0, 0, 0, 0, 9, 'redSHOEMANIAC', 50, 0, 0, 0, '14', 'product', '

    redSHOEMANIAC is a shopping template for redSHOP and joomla

    ', '

    redSHOEMANIAC is an elegant styled shopping template which is perfectly suited for a shoestore or other accessories.

    \r\n

    The combination of a template that is already styled for redSHOP, and the easy to use Quickstart packages, you can have a great looking site in minutes. Ready to adjust to your specific needs.

    \r\n

    Try visit the demo of redSHOEMANIAC and see the Quickstart package in action.

    ', 0, 0, 1, '', '1421055573_shoemaniac-demo-400-400.jpg', '2014-12-08 15:26:01', '2015-01-12 12:01:33', 16, '', '', '', '', '', '', '', 4, 0.000, 0, 0, 0, '0', 0, 0, '0.00', '0.00', '0.00', '0.00', 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00 00:00:00', 0, 0, '', '', '', '', 'global', 'append')"; + + $db->setQuery($query)->execute(); + + $query = "INSERT IGNORE INTO `#__redshop_product_accessory` (`accessory_id`, `product_id`, `child_product_id`, `accessory_price`, `oprand`, `setdefault_selected`, `ordering`, `category_id`) VALUES + (21, 1, 12, 0, '-', 0, 0, 0), + (32, 2, 3, 0, '-', 0, 0, 0), + (33, 1, 2, 0, '-', 0, 0, 0)"; + + $db->setQuery($query)->execute(); + + $query = "INSERT IGNORE INTO `#__redshop_product_attribute` (`attribute_id`, `attribute_name`, `attribute_required`, `allow_multiple_selection`, `hide_attribute_price`, `product_id`, `ordering`, `attribute_set_id`, `display_type`, `attribute_published`) VALUES + (3, 'Subscription', 0, 0, 0, 2, 0, 0, 'dropdown', 1), + (4, 'Subscription', 1, 0, 0, 1, 0, 0, 'dropdown', 1)"; + + $db->setQuery($query)->execute(); + + $query = "INSERT IGNORE INTO `#__redshop_product_attribute_property` (`property_id`, `attribute_id`, `property_name`, `property_price`, `oprand`, `property_image`, `property_main_image`, `ordering`, `setdefault_selected`, `setrequire_selected`, `setmulti_selected`, `setdisplay_type`, `property_number`) VALUES + (3, 3, '1 Year', 100, '+', '3_globus.gif', '', 0, 0, 0, 0, 'dropdown', ''), + (4, 3, '2 Year', 100, '+', '', '', 0, 0, 0, 0, 'dropdown', ''), + (5, 3, '3 Year', 100, '+', '', '', 0, 0, 0, 0, 'dropdown', ''), + (6, 4, '1 Year', 125, '+', '6_11408.jpg', '', 0, 0, 0, 0, 'dropdown', ''), + (8, 4, '2 Year', 175, '+', '', '', 1, 0, 0, 0, 'dropdown', '')"; + + $db->setQuery($query)->execute(); + + // Get the current columns for redshop category_xref + + $q = "SHOW INDEX FROM #__redshop_product_category_xref"; + $cols = $db->setQuery($q)->loadObjectList('Key_name'); + + if (is_array($cols)) + { + // Check if we have the category_parent_id column + + if (!array_key_exists('category_id', $cols)) + { + $q = "ALTER TABLE `#__redshop_product_category_xref` ADD UNIQUE ( + `category_id` , + `product_id` + )"; + + $db->setQuery($q)->execute(); + } + } + + $query = "INSERT IGNORE INTO `#__redshop_product_category_xref` (`category_id`, `product_id`, `ordering`) VALUES + ($firstCatId, 1, 1), + ($firstCatId, 2, 2), + ($firstCatId, 3, 3), + ($firstCatId, 4, 4), + ($secondCatId, 5, 1), + ($secondCatId, 6, 2), + ($secondCatId, 7, 3), + ($thirdCatId, 8, 1), + ($thirdCatId, 9, 2), + ($thirdCatId, 10, 0), + ($thirdCatId, 11, 0), + ($thirdCatId, 12, 0), + ($thirdCatId, 13, 0), + ($thirdCatId, 14, 3)"; + + $db->setQuery($query)->execute(); + + // Get the first user_id from #__redshop_users_info table then insert to userid field of demo rating content in #__redshop_product_rating table + + $query = "SELECT user_id FROM `#__redshop_users_info` LIMIT 1"; + $firstId = $db->setQuery($query)->loadResult(); + + if (!empty($firstId)) + { + $query = "INSERT IGNORE INTO `#__redshop_product_rating` + (`rating_id`, `product_id`, `title`, `comment`, `userid`, `time`, `user_rating`, `favoured`, `published`) + VALUES (1, 1, 'high quality product', 'This product is high quality and well-designed...', " . $firstId . ", 1262695786, 5, 1, 1)"; + + $db->setQuery($query)->execute(); + } + + // Get the current columns for redshop product related + + $q = "SHOW INDEX FROM #__redshop_product_related"; + $cols = $db->setQuery($q)->loadObjectList('Key_name'); + + if (is_array($cols)) + { + // Check if we have the category_parent_id column + + if (!array_key_exists('related_id', $cols)) + { + $q = "ALTER TABLE `#__redshop_product_related` ADD UNIQUE ( + `related_id` , + `product_id` + )"; + + $db->setQuery($q)->execute(); + } + } + + $query = "INSERT IGNORE INTO `#__redshop_product_related` + (`related_id`, `product_id`) VALUES + (0, 3),(0, 4),(0, 5),(0, 6),(0, 7),(0, 8),(0, 9),(0, 10),(0, 11),(0, 12),(0, 13),(0, 14),(1, 2),(2, 1),(3, 1),(3, 2)"; + + $db->setQuery($query)->execute(); + + // Get the current columns for redshop product stockroom + + $q = "SHOW INDEX FROM #__redshop_product_stockroom_xref"; + $cols = $db->setQuery($q)->loadObjectList('Key_name'); + + if (is_array($cols)) + { + // Check if we have the category_parent_id column + + if (!array_key_exists('product_id', $cols)) + { + $q = "ALTER TABLE `#__redshop_product_stockroom_xref` ADD UNIQUE ( + `product_id` , + `stockroom_id` + )"; + + $db->setQuery($q)->execute(); + } + } + + $query = "INSERT IGNORE INTO `#__redshop_product_stockroom_xref` + (`product_id`, `stockroom_id`, `quantity`) VALUES + (2, 1, 100)"; + + $db->setQuery($query)->execute(); + + return true; + } + + /** + * Method for insert demo Manufacturers + * + * @return void + */ + private function demoManufacturers() + { + $db = JFactory::getDbo(); + + // Insert manufacturer data + $query = "INSERT IGNORE INTO `#__redshop_manufacturer` (`id`, `name`, `description`, `email`, `product_per_page`, `template_id`, `metakey`, `metadesc`, `metalanguage_setting`, `metarobot_info`, `pagetitle`, `pageheading`, `sef_url`, `published`, `ordering`, `manufacturer_url`) VALUES + (1, 'redweb.dk', '

    http://redweb.dk

    ', '', 12, 14, '', '', '', '', '', '', '', 1, 1, ''), + (2, 'redhost.dk', '

    http://redhost.dk

    ', '', 12, 14, '', '', '', '', '', '', '', 1, 2, ''), + (3, 'redcomponent.com', '

    http://redcomponent.com

    ', '', 12, 14, '', '', '', '', '', '', '', 1, 3, '')"; + + $db->setQuery($query)->execute(); + + // Insert media + $query = "INSERT IGNORE INTO `#__redshop_media` + (`media_id`, `media_name`, `media_section`, `section_id`, `media_type`, `media_mimetype`, `published`, `media_alternate_text`) + VALUES (33, 'redweb-logo.jpg', 'manufacturer', 1, 'images', 'images/jpg', 1, 'redweb.dk'), + (34, 'redhost-logo.jpg', 'manufacturer', 2, 'ima1ges', 'images/jpg', 1, 'redhost.dk'), + (35, 'redcomponent-logo.jpg', 'manufacturer', 3, 'images', 'images/jpg', 1, 'redcomponent.com')"; + + $db->setQuery($query)->execute(); + + // Copy files + $file = JPath::clean(REDSHOP_MEDIA_IMAGE_RELPATH . 'redweb-logo.jpg'); + + if (JFile::exists($file)) + { + RedshopHelperMedia::createDir(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/1'); + RedshopHelperMedia::createDir(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/1/thumb'); + JFile::copy($file, REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/1/redweb-logo.jpg'); + } + + $file = JPath::clean(REDSHOP_MEDIA_IMAGE_RELPATH . 'redhost-logo.jpg'); + + if (JFile::exists($file)) + { + RedshopHelperMedia::createDir(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/2'); + RedshopHelperMedia::createDir(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/2/thumb'); + JFile::copy($file, REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/2/redhost-logo.jpg'); + } + + $file = JPath::clean(REDSHOP_MEDIA_IMAGE_RELPATH . 'redcomponent-logo.jpg'); + + if (JFile::exists($file)) + { + RedshopHelperMedia::createDir(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/3'); + RedshopHelperMedia::createDir(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/3/thumb'); + JFile::copy($file, REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/3/redcomponent-logo.jpg'); + } + } + + /** + * Get New Customers for Dashboard view + * + * @return array New Customers. + */ + public function getNewcustomers() + { + $query = $this->_db->getQuery(true); + + $query->select('*') + ->from($this->_db->qn('#__redshop_users_info')) + ->order($this->_db->qn('users_info_id') . ' DESC'); + + return $this->_db->setQuery($query, 0, 10)->loadObjectlist(); + } + + /** + * Get New Order for Dashboard view + * + * @return array New Order. + */ + public function getNeworders() + { + $query = $this->_db->getQuery(true); + + $query->select( + array( + $this->_db->qn('o.order_id'), + $this->_db->qn('o.order_total'), + $this->_db->qn('o.order_status'), + $this->_db->qn('o.order_payment_status'), + $this->_db->qn('os.order_status_name'), + 'CONCAT(' . $this->_db->qn('u.firstname') . '," ",' . $this->_db->qn('u.lastname') . ') AS name' + ) + ) + ->from($this->_db->qn('#__redshop_order_users_info', 'u')) + ->innerJoin($this->_db->qn('#__redshop_orders', 'o') . ' ON ' . $this->_db->qn('u.order_id') . '=' . $this->_db->qn('o.order_id') . ' AND ' . $this->_db->qn('u.address_type') . '="BT"') + ->innerJoin($this->_db->qn('#__redshop_order_status', 'os') . ' ON ' . $this->_db->qn('os.order_status_code') . '=' . $this->_db->qn('o.order_status')) + ->order($this->_db->qn('o.order_id') . ' DESC'); + + return $this->_db->setQuery($query, 0, 10)->loadObjectList(); + } + + public function getUser($user_id) + { + $this->_table_prefix = '#__'; + $userquery = "SELECT name FROM " . $this->_table_prefix . "users where id=" . $user_id; + + return $this->_db->setQuery($userquery)->loadObject(); + } + + public function gettotalOrder($id = 0) + { + $this->_table_prefix = '#__redshop_'; + $userquery = "SELECT SUM(order_total) AS order_total, count(*) AS tot_order FROM " . $this->_table_prefix . "orders " + . "WHERE `user_info_id`='" . $id . "' "; + + return $this->_db->setQuery($userquery)->loadObject(); + } + + public function gettotalAmount($user_id) + { + $this->_table_prefix = '#__redshop_'; + $query = 'SELECT SUM(o.order_total) AS order_total ' + . 'FROM ' . $this->_table_prefix . 'orders AS o ' + . 'LEFT JOIN ' . $this->_table_prefix . 'users_info as uf ON o.user_id =uf.user_id' + . ' AND address_type LIKE "BT" ' + . 'WHERE o.user_id = ' . $user_id . ' and (o.order_status = "C" OR o.order_status = "PR" OR o.order_status = "S")'; + + return $this->_db->setQuery($query)->loadObject(); + } + + public function getavgAmount($user_id) + { + $this->_table_prefix = '#__redshop_'; + $query = 'SELECT (SUM(o.order_total)/ COUNT( DISTINCT o.user_id ) ) AS avg_order ' + . 'FROM ' . $this->_table_prefix . 'orders AS o ' + . 'WHERE o.user_id =' . $user_id . ' and (o.order_status = "C" OR o.order_status = "PR" OR o.order_status = "S") '; + + return $this->_db->setQuery($query)->loadObject(); + } + + public function getUserinfo($user_id) + { + $this->_table_prefix = '#__redshop_'; + $userquery = "SELECT CONCAT(firstname,' ',lastname) as name FROM " . $this->_table_prefix . + "users_info where address_type='BT' and user_id=" . $user_id; + + return $this->_db->setQuery($userquery)->loadObject(); + } + + /** + * Get Statistic (Total orders, members, sales) for Dashboard view + * + * @return array Statistics chart. + */ + public function getStatisticDashboard() + { + $db = JFactory::getDbo(); + + // Todo: We didn't use JDatabase because $query->unionAll() is not working, please change to use $query->unionAll() when Joomla fixed it + $query = 'SELECT SUM(' . $db->qn('order_total') . ') AS total + FROM ' . $db->qn('#__redshop_orders') . ' + WHERE (' . $db->qn('order_status') . ' = ' . $db->q('C') + . ' OR ' + . $db->qn('order_status') . ' = ' . $db->q('PR') + . ' OR ' + . $db->qn('order_status') . ' = ' . $db->q('S') . ') + UNION ALL ( + SELECT COUNT(' . $db->qn('order_id') . ') + FROM ' . $db->qn('#__redshop_orders') . ' + ) + UNION ALL ( + SELECT COUNT(' . $db->qn('users_info_id') . ') + FROM ' . $db->qn('#__redshop_users_info') . ' + ) + UNION ALL ( + SELECT COUNT(' . $db->qn('id') . ') + FROM ' . $db->qn('#__redshop_siteviewer') . ')'; + + return $db->setQuery($query)->loadColumn(); + } +} diff --git a/component/admin/models/sample.php b/component/admin/models/sample.php new file mode 100644 index 00000000000..75030963fef --- /dev/null +++ b/component/admin/models/sample.php @@ -0,0 +1,94 @@ +_context = 'sample_id'; + $this->_table_prefix = '#__redshop_'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + $query = "SELECT distinct(c.sample_id),c.* FROM " . $this->_table_prefix . "catalog_sample AS c " + . "WHERE 1=1 " + . $orderby; + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'sample_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } +} diff --git a/component/admin/models/sample_catalog.php b/component/admin/models/sample_catalog.php new file mode 100644 index 00000000000..5999a661643 --- /dev/null +++ b/component/admin/models/sample_catalog.php @@ -0,0 +1,91 @@ +_table_prefix = '#__redshop_'; + + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + + $this->setId((int) $array[0]); + + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function getsample($sample) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'catalog_colour as c left join ' . $this->_table_prefix . + 'catalog_sample as s on s.sample_id=c.sample_id WHERE colour_id in (' . $sample . ')'; + $this->_db->setQuery($query); + $sample_data = $this->_db->loadObjectlist(); + + return $sample_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'sample_request WHERE request_id=' . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->sample_id = null; + $detail->sample_name = null; + $detail->published = 1; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } +} diff --git a/component/admin/models/sample_detail.php b/component/admin/models/sample_detail.php new file mode 100644 index 00000000000..3fd524d04c2 --- /dev/null +++ b/component/admin/models/sample_detail.php @@ -0,0 +1,170 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'catalog_sample WHERE sample_id="' . $this->_id . '" '; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + + $detail->sample_id = null; + $detail->sample_name = null; + $detail->published = 1; + + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + else + { + $total_loop = count($data["colour_id"]); + $sql = "DELETE FROM " . $this->_table_prefix . "catalog_colour " + . "WHERE sample_id='" . $row->sample_id . "' "; + $this->_db->setQuery($sql); + $this->_db->execute(); + + if ($total_loop > 0) + { + for ($h = 0, $nh = count($data["colour_id"]); $h < $nh; $h++) + { + $sql = "INSERT INTO " . $this->_table_prefix . "catalog_colour " + . "(sample_id,code_image,is_image) " + . "VALUE ('" . $row->sample_id . "','" . $data["code_image"][$h] . "','" . $data["is_image"][$h] . "') "; + $this->_db->setQuery($sql); + $this->_db->execute(); + } + } + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'DELETE FROM ' . $this->_table_prefix . 'catalog_sample WHERE sample_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'UPDATE ' . $this->_table_prefix . 'catalog_sample' + . ' SET published = ' . intval($publish) + . ' WHERE sample_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function color_Data($sample_id) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'catalog_colour ' + . 'WHERE sample_id="' . $sample_id . '" '; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } +} diff --git a/component/admin/models/sample_request.php b/component/admin/models/sample_request.php new file mode 100644 index 00000000000..21e1633ba3a --- /dev/null +++ b/component/admin/models/sample_request.php @@ -0,0 +1,140 @@ +_context = 'request_id'; + + $this->_table_prefix = '#__redshop_'; + + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + + $filter = $app->getUserStateFromRequest($this->_context . 'filter', 'filter', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + $this->setState('filter', $filter); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'sample_request ' . $this->_buildContentOrderBy(); + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'request_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'DELETE FROM ' . $this->_table_prefix . 'sample_request WHERE request_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'sample_request' + . ' SET block = ' . intval($publish) + . ' WHERE request_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/search.php b/component/admin/models/search.php new file mode 100644 index 00000000000..ee117acd828 --- /dev/null +++ b/component/admin/models/search.php @@ -0,0 +1,643 @@ +_table_prefix = '#__redshop_'; + + $jinput = JFactory::getApplication()->input; + + $id = $jinput->get('id', 0); + + $product_id = $jinput->get('product_id', ''); + + $related = $jinput->get('related', ''); + + $navigator = $jinput->get('navigator', ''); + + $voucher_id = $jinput->get('voucher_id', ''); + + $stockroom_id = $jinput->get('stockroom_id', ''); + + $media_section = $jinput->get('media_section', ''); + + $user = $jinput->get('user', ''); + + $plgcustomview = $jinput->get('plgcustomview', ''); + + $this->_iscompany = $jinput->getInt('iscompany', -1); + + $addreduser = $jinput->get('addreduser', ''); + + $products = $jinput->get('isproduct', ''); + + $search = $jinput->get('input', ''); + + $parent = $jinput->get('parent', ''); + + $alert = $jinput->get('alert', ''); + + $limit = $jinput->get('limit', ''); + + $this->_parent = $parent; + + $this->_limit = $limit; + + $this->_search = $search; + + $this->_alert = $alert; + + $this->setId((int) $id); + + $this->_stockroom_id = ((int) $stockroom_id); + + $this->_product_id = ((int) $product_id); + + $this->_related = ((int) $related); + + $this->_navigator = ((int) $navigator); + + $this->_voucher_id = ((int) $voucher_id); + + $this->_media_section = $media_section; + + $this->_user = $user; + + $this->_plgcustomview = $plgcustomview; + + $this->_addreduser = $addreduser; + + $this->_products = $products; + } + + /** + * Method select needed values from search input. + * + * @return string A result select items and count items + */ + public function search() + { + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + $jInput = $app->input; + $search = ' LIKE ' . $db->quote('%' . $jInput->getString('input', '') . '%'); + $query = $db->getQuery(true); + + if ($jInput->getCmd('media_section', '') != '') + { + switch ($jInput->getCmd('media_section', '')) + { + case 'category': + $query->select( + array( + $db->qn('id'), + $db->qn('name', 'text') + ) + ) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('name') . $search); + break; + case 'property': + $query->select( + array( + $db->qn('property_id', 'id'), + $db->qn('property_name', 'text') + ) + ) + ->from($db->qn('#__redshop_product_attribute_property')) + ->where($db->qn('property_name') . $search); + break; + case 'subproperty': + $query->select( + array( + $db->qn('subattribute_color_id', 'id'), + $db->qn('subattribute_color_name', 'text') + ) + ) + ->from($db->qn('#__redshop_product_subattribute_color')) + ->where($db->qn('subattribute_color_name') . $search); + break; + case 'manufacturer': + $query->select( + array( + $db->qn('id', 'id'), + $db->qn('name', 'text') + ) + ) + ->from($db->qn('#__redshop_manufacturer')) + ->where($db->qn('name') . $search); + break; + case 'catalog': + $query->select( + array( + $db->qn('catalog_id', 'id'), + $db->qn('catalog_name', 'text') + ) + ) + ->from($db->qn('#__redshop_catalog')) + ->where('catalog_name' . $search); + break; + case 'product': + default: + $query->select( + array( + $db->qn('product_id', 'id'), + 'CONCAT(' . $db->qn('product_name') . ', " (", ' . $db->qn('product_number') . ', ")") as text' + ) + ) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_name') . $search . ' OR ' . $db->qn('product_number') . $search); + break; + } + } + elseif ($jInput->getCmd('alert', '') == 'container') + { + $query->select( + array( + $db->qn('p.product_id', 'id'), + 'CONCAT(' . $db->qn('p.product_name') . ', " (", ' . $db->qn('p.product_number') . ', ")") as text', + $db->qn('p.supplier_id'), + $db->qn('p.product_volume', 'volume') + ) + ) + ->from($db->qn('#__redshop_product', 'p')) + ->leftJoin($db->qn('#__redshop_container_product_xref', 'cp') . ' ON cp.product_id = p.product_id') + ->where($db->qn('p.product_name') . $search) + ->where($db->qn('cp.container_id') . ' != ' . $jInput->getInt('container_id', 0)); + } + elseif ($jInput->getCmd('alert', '') == 'voucher') + { + $subQuery = $db->getQuery(true) + ->select('COUNT(cp.product_id)') + ->from($db->qn('#__redshop_product_voucher_xref', 'cp')) + ->where('cp.product_id = p.product_id') + ->where('cp.voucher_id = ' . $jInput->getInt('voucher_id', 0)); + $query->select( + array( + $db->qn('p.product_id', 'id'), + 'CONCAT(' . $db->qn('p.product_name') . ', " (", ' . $db->qn('p.product_number') . ', ")") as text' + ) + ) + ->from($db->qn('#__redshop_product', 'p')) + ->where($db->qn('p.product_name') . $search) + ->where('(' . $subQuery . ') = 0'); + } + elseif ($jInput->getCmd('alert', '') == 'stoockroom') + { + $query->select( + array( + $db->qn('p.container_id', 'id'), + $db->qn('p.container_name', 'text') + ) + ) + ->from($db->qn('#__redshop_container', 'p')) + ->leftJoin($db->qn('#__redshop_stockroom_container_xref', 'cp') . ' ON cp.container_id = p.container_id') + ->where($db->qn('p.container_name') . $search) + ->where($db->qn('cp.stockroom_id') . ' != ' . $jInput->getInt('stockroom_id', 0)); + } + elseif ($jInput->getCmd('alert', '') == 'termsarticle') + { + $query->select( + array( + $db->qn('a.id'), + $db->qn('a.title', 'text') + ) + ) + ->from($db->qn('#__content', 'a')) + ->leftJoin($db->qn('#__categories', 'cc') . ' ON cc.id = a.catid') + ->where($db->qn('a.title') . $search) + ->where($db->qn('a.state') . ' = 1') + ->where($db->qn('cc.extension' . ' = ' . $db->quote('com_content'))) + ->where($db->qn('cc.published') . ' = 1'); + } + elseif ($jInput->getInt('user', 0) == 1 || $jInput->getInt('addreduser', 0) == 1) + { + if ($jInput->getInt('addreduser', 0) == 1) + { + $emailLabel = 'value_number'; + } + else + { + $emailLabel = 'volume'; + } + + $query->select( + array( + $db->qn('u.id'), + 'CONCAT (' . $db->qn('uf.firstname') . ', ' . $db->quote(' ') . ', ' . $db->qn('uf.lastname') . ', ' . $db->quote(' (') + . ', ' . $db->qn('u.username') . ', ' . $db->quote(')') . ') AS text', + $db->qn('u.email', $emailLabel) + ) + ) + ->from($db->qn('#__users', 'u')) + ->leftJoin($db->qn('#__redshop_users_info', 'uf') . ' ON uf.user_id = u.id') + ->where('(' . $db->qn('u.username') . $search + . ' OR ' . $db->qn('uf.firstname') . $search + . ' OR ' . $db->qn('uf.lastname') . $search . ')' + ) + ->where($db->qn('uf.address_type') . ' = ' . $db->quote('BT')); + } + elseif ($jInput->getInt('plgcustomview', 0) == 1) + { + $iscompany = $jInput->getInt('iscompany', -1); + + if ($iscompany == 0) + { + $query->select( + array( + $db->qn('u.id'), + 'CONCAT (' . $db->qn('uf.firstname') . ', ' . $db->quote(' ') . ', ' . $db->qn('uf.lastname') . ', ' . $db->quote(' (') + . ', ' . $db->qn('u.username') . ', ' . $db->quote(')') . ') AS text', + $db->qn('u.email', 'volume') + ) + ) + ->from($db->qn('#__users', 'u')) + ->leftJoin($db->qn('#__redshop_users_info', 'uf') . ' ON uf.user_id = u.id') + ->where('(' . $db->qn('u.username') . $search + . ' OR ' . $db->qn('uf.firstname') . $search + . ' OR ' . $db->qn('uf.lastname') . $search . ')' + ) + ->where($db->qn('uf.address_type') . ' = ' . $db->quote('BT')) + ->where($db->qn('uf.is_company') . ' = 0'); + } + elseif ($iscompany == 1) + { + $query->select( + array( + $db->qn('u.id'), + 'CONCAT (' . $db->qn('uf.company_name') . ', ' . $db->quote(' (') . ', ' + . $db->qn('u.username') . ', ' . $db->quote(')') . ') AS text', + $db->qn('u.email', 'volume') + ) + ) + ->from($db->qn('#__redshop_users_info', 'uf')) + ->leftJoin($db->qn('#__users', 'u') . ' ON uf.user_id = u.id') + ->where('(' . $db->qn('u.username') . $search + . ' OR ' . $db->qn('uf.company_name') . $search . ')' + ) + ->where($db->qn('uf.address_type') . ' = ' . $db->quote('BT')) + ->where($db->qn('uf.is_company') . ' = 1'); + } + } + elseif ($jInput->getInt('isproduct', 0) == 1) + { + $query->select( + array( + $db->qn('product_id', 'id'), + 'CONCAT(' . $db->qn('product_name') . ', " (", ' . $db->qn('product_number') . ', ")") as text', + $db->qn('product_number', 'value_number') + ) + ) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_name') . $search . ' OR ' . $db->qn('product_number') . $search); + } + elseif ($jInput->getInt('related', 0) == 1) + { + $query->select( + array( + $db->qn('p.product_id', 'id'), + 'CONCAT(' . $db->qn('p.product_name') . ', " (", ' . $db->qn('p.product_number') . ', ")") as text', + $db->qn('p.product_number', 'value_number') + ) + ) + ->from($db->qn('#__redshop_product', 'p')) + ->where($db->qn('p.product_id') . ' != ' . $jInput->getInt('product_id', 0)) + ->where('(' . $db->qn('p.product_name') . $search + . ' OR ' . $db->qn('p.product_number') . $search . ')' + ); + } + elseif ($jInput->getInt('parent', 0) == 1) + { + if ($product_id = $jInput->getInt('product_id', 0)) + { + $query->where($db->qn('p.product_id') . ' != ' . $product_id); + } + + $query->select( + array( + $db->qn('p.product_id', 'id'), + 'CONCAT(' . $db->qn('p.product_name') . ', " (", ' . $db->qn('p.product_number') . ', ")") as text', + ) + ) + ->from($db->qn('#__redshop_product', 'p')) + ->where($db->qn('p.product_name') . $search) + ->where($db->qn('p.product_parent_id') . ' = 0'); + } + elseif ($jInput->getInt('navigator', 0) == 1) + { + $query->select( + array( + $db->qn('p.product_id', 'id'), + 'CONCAT(' . $db->qn('p.product_name') . ', " (", ' . $db->qn('p.product_number') . ', ")") as text', + $db->qn('p.product_number', 'value_number'), + $db->qn('p.product_price', 'price') + ) + ) + ->from($db->qn('#__redshop_product', 'p')) + ->where($db->qn('p.published') . ' = 1') + ->where('(' . $db->qn('p.product_name') . $search + . ' OR ' . $db->qn('p.product_number') . $search . ')' + ); + } + else + { + if ($accessoryList = $jInput->getString('accessoryList', '')) + { + $accessoryList = explode(',', $accessoryList); + $accessoryList = Joomla\Utilities\ArrayHelper::toInteger($accessoryList); + $query->where('p.product_id NOT IN (' . implode(',', $accessoryList) . ')'); + } + + if ($product_id = $jInput->getInt('product_id', 0)) + { + $query->leftJoin($db->qn('#__redshop_product_accessory', 'pa') . ' ON pa.child_product_id = p.product_id AND pa.product_id = ' . $product_id) + ->where('pa.accessory_id IS NULL') + ->where($db->qn('p.product_id') . ' != ' . $product_id); + } + + $query->select( + array( + $db->qn('p.product_id', 'id'), + 'CONCAT(' . $db->qn('p.product_name') . ', " (", ' . $db->qn('p.product_number') . ', ")") as text', + $db->qn('p.product_number', 'value_number'), + $db->qn('p.product_price', 'price') + ) + ) + ->from($db->qn('#__redshop_product', 'p')) + ->where('(' . $db->qn('p.product_name') . $search + . ' OR ' . $db->qn('p.product_number') . $search . ')' + ); + } + + $json = new stdClass; + $db->setQuery($query)->execute(); + $json->total = $db->getNumRows(); + + if ($json->total != 0) + { + $limit = $jInput->getInt('limit', 10); + $limitStart = ($jInput->getInt('page', 1) - 1) * $limit; + $db->setQuery($query, $limitStart, $limit); + $json->result = $db->loadObjectList(); + } + else + { + $json->result = ''; + } + + return json_encode($json); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function getData() + { + if ($this->_alert == 'termsarticle') + { + $this->_data = $this->_buildQuery(); + + return $this->_data; + } + + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query); + + return $this->_data; + } + + public function _buildQuery() + { + if ($this->_media_section) + { + if ($this->_media_section == 'product') + { + $query = "SELECT product_id as id,product_name as value FROM " . $this->_table_prefix . "product WHERE product_name like '%" . + $this->_search . "%'"; + } + elseif ($this->_media_section == 'category') + { + $query = "SELECT id as id,name as value FROM " . $this->_table_prefix . "category WHERE name like '" . + $this->_search . "%'"; + } + else + { + $query = "SELECT catalog_id as id,catalog_name as value FROM " . $this->_table_prefix . "catalog WHERE catalog_name like '" . + $this->_search . "%' AND published = 1"; + } + } + elseif ($this->_alert == 'voucher') + { + $query = "SELECT cp.product_id as value,p.product_name as text FROM " . $this->_table_prefix . "product as p , " + . $this->_table_prefix . "product_voucher_xref as cp WHERE cp.voucher_id=" . $this->_voucher_id + . " and cp.product_id=p.product_id "; + $this->_db->setQuery($query); + $this->_productdata = $this->_db->loadObjectList(); + + if (count($this->_productdata) > 0) + { + foreach ($this->_productdata as $rc) + { + $pid[] = $rc->value; + } + } + + if ($this->_productdata) + { + $pid = @implode(",", $pid); + $where = " and p.product_id not in (" . $pid . ") and p.product_name like '%" . $this->_search . "%'"; + } + else + { + $where = " and p.product_name like '%" . $this->_search . "%'"; + } + + $query = "SELECT distinct p.product_id as id,p.product_name as value FROM " . $this->_table_prefix . "product as p left join " + . $this->_table_prefix . "product_voucher_xref as cp on cp.product_id=p.product_id WHERE 1=1 " . $where; + } + elseif ($this->_alert == 'termsarticle') + { + $query = 'SELECT a.sectionid,a.catid, a.id AS value, a.title AS text ' + . 'FROM #__content AS a ' + . 'WHERE a.state = 1 ' + . 'AND a.title LIKE "' . $this->_search . '%"'; + $this->_db->setQuery($query); + $rows = $this->_db->loadObjectList(); + $article = array(); + + for ($j = 0, $jn = count($rows); $j < $jn; $j++) + { + if ($rows[$j]->sectionid != 0 && $rows[$j]->catid != 0) + { + $query = 'SELECT a.id AS value, a.title AS text ' + . 'FROM #__content AS a ' + . 'LEFT JOIN #__categories AS cc ON cc.id = a.catid ' + . 'LEFT JOIN #__sections AS s ON s.id = cc.section AND s.scope = "content" ' + . 'LEFT JOIN #__groups AS g ON a.access = g.id ' + . 'WHERE (cc.published = 1 AND s.published = 1) ' + . 'AND a.state = 1 ' + . 'AND a.title LIKE "' . $this->_search . '%"'; + $this->_db->setQuery($query); + $r = $this->_db->loadObjectList(); + $i = 0; + + foreach ($r as $value) + { + $article[$i]->value = $value->text; + $article[$i]->id = $value->value; + $i++; + } + } + else + { + $article[$j]->value = $rows[$j]->text; + $article[$j]->id = $rows[$j]->value; + } + } + + return $article; + } + elseif ($this->_user == 1) + { + $query = "SELECT u.id as id,concat(uf.firstname,' ', uf.lastname,' (', u.username,')') as value , u.email as volume "; + $query .= " FROM " . $this->_table_prefix . "users_info as uf , #__users as u "; + $query .= " WHERE (uf.user_id=u.id) and (u.username like '" . $this->_search . "%' or uf.firstname like '" . + $this->_search . "%' or uf.lastname like '" . $this->_search . "%') and (uf.address_type like 'BT') "; + } + elseif ($this->_plgcustomview == 1) + { + if ($this->_iscompany == 0) + { + $query = "SELECT u.id as id,concat(uf.firstname,' ', uf.lastname,' (', u.username,')') as value , u.email as volume "; + $query .= " FROM " . $this->_table_prefix . "users_info as uf , #__users as u "; + $query .= " WHERE (uf.user_id=u.id) and (u.username like '" . $this->_search . "%' or uf.firstname like '" . + $this->_search . "%' or uf.lastname like '" . $this->_search . "%') and (uf.address_type like 'BT') "; + $query .= " AND uf.is_company = " . $this->_iscompany . ""; + } + + if ($this->_iscompany == 1) + { + $query = "SELECT u.id as id,concat(uf.company_name,' (', u.username,')') as value , u.email as volume "; + $query .= " FROM " . $this->_table_prefix . "users_info as uf , #__users as u "; + $query .= " WHERE (uf.user_id=u.id) and (u.username like '" . $this->_search . "%' or uf.company_name like '" . + $this->_search . "%') and (uf.address_type like 'BT') "; + $query .= " AND uf.is_company = " . $this->_iscompany . ""; + } + } + elseif ($this->_addreduser == 1) + { + $query = "SELECT uf.user_id AS id, CONCAT(uf.firstname,' ', uf.lastname, IF(u.username!='', CONCAT( ' (',u.username,')'), '' )) + AS value, uf.user_email AS value_number " + . "FROM " . $this->_table_prefix . "users_info AS uf " + . "LEFT JOIN #__users AS u ON uf.user_id=u.id " + . "WHERE (u.username LIKE '" . $this->_search . "%' " + . "OR uf.firstname LIKE '" . $this->_search . "%' " + . "OR uf.lastname LIKE '" . $this->_search . "%') " + . "AND (uf.address_type LIKE 'BT')"; + } + elseif ($this->_products == 1) + { + $query = "SELECT product_id as id,product_name as value, product_number as value_number FROM " . + $this->_table_prefix . "product WHERE product_name like '%" . $this->_search . "%'"; + } + elseif ($this->_related == 1) + { + $and = ""; + + if ($this->_product_id != 0) + { + $query = "SELECT related_id " + . "FROM " . $this->_table_prefix . "product_related " + . "WHERE product_id='" . $this->_product_id . "' "; + $this->_db->setQuery($query); + $related = $this->_db->loadColumn(); + $related[count($related)] = $this->_product_id; + $relatedid = implode(", ", $related); + + $and = "AND p.product_id NOT IN (" . $relatedid . ") "; + } + + $query = "SELECT p.product_id AS id,p.product_name AS value,p.product_number as value_number " + . "FROM " . $this->_table_prefix . "product as p " + . "WHERE (p.product_name LIKE '" . $this->_search . "%' or p.product_number LIKE '" . $this->_search . "%') " + . $and + . " LIMIT 0,50 "; + } + elseif ($this->_parent == 1) + { + $and = ""; + + if ($this->_product_id != 0) + { + $and = "AND p.product_id NOT IN (" . $this->_product_id . ") "; + } + + $query = "SELECT p.product_id AS id,p.product_name AS value " + . "FROM " . $this->_table_prefix . "product as p " + . "WHERE p.product_name LIKE '" . $this->_search . "%' " + . $and + . " LIMIT 0,50 "; + } + + elseif ($this->_navigator == 1) + { + $where = " and (p.product_name like '%" . $this->_search . "%' or p.product_number LIKE '" . $this->_search . "%')"; + $query = "SELECT distinct p.product_id as id,p.product_name as value ,p.product_number as value_number ,product_price as price FROM " . + $this->_table_prefix . "product as p WHERE 1=1 and p.published = 1 " . $where; + } + else + { + if ($this->_product_id != 0) + { + $where = " and p.product_id not in (select child_product_id from " . $this->_table_prefix . "product_accessory where product_id=" . + $this->_product_id . ") and p.product_id!=" . $this->_product_id . " and (p.product_name like '%" . + $this->_search . "%' or p.product_number LIKE '" . $this->_search . "%')"; + } + else + { + $where = " and (p.product_name like '%" . $this->_search . "%' or p.product_number LIKE '" . $this->_search . "%')"; + } + + $query = "SELECT distinct p.product_id as id,p.product_name as value ,p.product_number as value_number ,product_price as price FROM " . + $this->_table_prefix . "product as p left join " . $this->_table_prefix . "product_accessory as cp on cp.product_id=p.product_id + WHERE 1=1 " . $where; + } + + return $query; + } +} diff --git a/component/admin/models/shipping.php b/component/admin/models/shipping.php new file mode 100644 index 00000000000..557538d86fe --- /dev/null +++ b/component/admin/models/shipping.php @@ -0,0 +1,124 @@ +_context = 'shipping_id'; + $this->_table_prefix = '#__redshop_'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + $query = 'SELECT s.* FROM #__extensions AS s ' + . 'WHERE s.folder="redshop_shipping" ' + . $orderby; + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'ordering'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } + + public function saveOrder(&$cid, $order = array()) + { + $db = JFactory::getDbo(); + $row = $this->getTable('shipping_detail'); + + $total = count($cid); + $order = (empty($order)) ? JFactory::getApplication()->input->post->get('order', array(0), 'array') : $order; + $order = Joomla\Utilities\ArrayHelper::toInteger($order, array(0)); + + // Update ordering values + for ($i = 0; $i < $total; $i++) + { + $row->load((int) $cid[$i]); + + if ($row->ordering != $order[$i]) + { + $row->ordering = $order[$i]; + + if (!$row->store()) + { + throw new Exception($db->getErrorMsg()); + } + } + } + + $row->reorder(); + + return true; + } +} diff --git a/component/admin/models/shipping_box.php b/component/admin/models/shipping_box.php new file mode 100644 index 00000000000..be3446874e1 --- /dev/null +++ b/component/admin/models/shipping_box.php @@ -0,0 +1,20 @@ +getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @since 2.0.0.4 + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'shipping_box_id', $direction = '') + { + $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + parent::populateState($ordering, $direction); + } + + /** + * Method to build query string + * + * @return string + * + * @note Calling getState in this method will result in recursion. + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $search = $this->getState('filter.search'); + + $query->select('*') + ->from($db->qn('#__redshop_shipping_boxes')); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('shipping_box_id') . ' = ' . (int) $search); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('shipping_box_name') . ' LIKE ' . $search); + } + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'shipping_box_id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/shipping_detail.php b/component/admin/models/shipping_detail.php new file mode 100644 index 00000000000..640013edce2 --- /dev/null +++ b/component/admin/models/shipping_detail.php @@ -0,0 +1,180 @@ +_table_prefix = '#__redshop_'; + + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + + $this->setId((int) $array[0]); + $db = JFactory::getDbo(); + $this->sectionCondition = array( + 'folder = ' . $db->q('redshop_shipping'), + 'type = ' . $db->q('plugin') + ); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + $this->_loadData(); + + return $this->_data; + } + + public function _loadData() + { + $query = 'SELECT * FROM #__extensions WHERE folder="redshop_shipping" and extension_id ="' . $this->_id . '" '; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + public function store($data) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->update($db->qn('#__extensions')) + ->set('enabled = ' . (int) $data['published']) + ->where('element = ' . $db->q($data['element'])); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + + JPluginHelper::importPlugin('redshop_shipping'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $dispatcher->trigger('onWriteconfig', array($data)); + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'UPDATE #__extensions' + . ' SET enabled = ' . intval($publish) + . ' WHERE extension_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function saveOrder($cid, $order) + { + $db = JFactory::getDbo(); + $row = $this->getTable(); + $total = count($cid); + + // Update ordering values + for ($i = 0; $i < $total; $i++) + { + $row->load((int) $cid[$i]); + + if ($row->ordering != $order[$i]) + { + $row->ordering = $order[$i]; + + if (!$row->store()) + { + throw new Exception($db->getErrorMsg()); + } + } + } + + $row->reorder($this->sectionCondition); + + return true; + } + + /** + * Method to get max ordering + * + * @access public + * @return boolean + */ + public function MaxOrdering() + { + $query = "SELECT (max(ordering)+1) FROM #__extensions where folder='redshop_shipping'"; + $this->_db->setQuery($query); + + return $this->_db->loadResult(); + } + + /** + * Method to move + * + * @param string $direction Direction + * + * @return boolean True on success + */ + public function move($direction) + { + $row = JTable::getInstance('shipping_detail', 'Table'); + + if (!$row->load($this->_id)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->move($direction, $this->sectionCondition)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $row->reorder($this->sectionCondition); + + return true; + } +} diff --git a/component/admin/models/shipping_rate.php b/component/admin/models/shipping_rate.php new file mode 100644 index 00000000000..205cb7182d0 --- /dev/null +++ b/component/admin/models/shipping_rate.php @@ -0,0 +1,100 @@ +_table_prefix = '#__redshop_'; + $this->_context = 'shipping_rate_id'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + + $id = $app->getUserStateFromRequest($this->_context . 'extension_id', 'extension_id', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + $this->setState('id', $id); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + $id = $this->getState('id'); + + $query = 'SELECT r.*,p.extension_id,p.element,p.folder FROM ' . $this->_table_prefix . 'shipping_rate AS r ' + . 'LEFT JOIN #__extensions AS p ON CONVERT(p.element USING utf8)= CONVERT(r.shipping_class USING utf8) ' + . 'WHERE p.extension_id="' . $id . '" ' + . $orderby; + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'shipping_rate_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } +} diff --git a/component/admin/models/shipping_rate_detail.php b/component/admin/models/shipping_rate_detail.php new file mode 100644 index 00000000000..e1ed1f0f518 --- /dev/null +++ b/component/admin/models/shipping_rate_detail.php @@ -0,0 +1,332 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'shipping_rate WHERE shipping_rate_id="' . $this->_id . '" '; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->shipping_rate_id = 0; + $detail->shipping_rate_name = null; + $detail->shipping_class = null; + $detail->shipping_rate_country = null; + $detail->shipping_rate_state = null; + $detail->shipping_rate_on_product = 0; + $detail->shipping_rate_on_category = null; + $detail->shipping_rate_weight_start = null; + $detail->shipping_rate_weight_end = null; + $detail->shipping_rate_zip_start = null; + $detail->shipping_rate_zip_end = null; + $detail->shipping_rate_volume_start = null; + $detail->shipping_rate_volume_end = null; + $detail->shipping_rate_ordertotal_start = null; + $detail->shipping_rate_ordertotal_end = null; + $detail->shipping_rate_priority = null; + $detail->shipping_rate_value = null; + $detail->shipping_rate_package_fee = null; + $detail->company_only = null; + $detail->shipping_location_info = null; + $detail->apply_vat = 0; + $detail->shipping_rate_length_start = null; + $detail->shipping_rate_length_end = null; + $detail->shipping_rate_width_start = null; + $detail->shipping_rate_width_end = null; + $detail->shipping_rate_height_start = null; + $detail->shipping_rate_height_end = null; + $detail->shipping_tax_group_id = null; + $detail->shipping_rate_on_shopper_group = null; + $detail->economic_displaynumber = null; + $detail->deliver_type = null; + $detail->consignor_carrier_code = null; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + if (($data['shipping_rate_ordertotal_start'] > $data['shipping_rate_ordertotal_end']) + || ($data['shipping_rate_zip_start'] > $data['shipping_rate_zip_end'])) + { + return false; + } + + $data['shipping_rate_country'] = @ implode(',', $data['shipping_rate_country']); + $data['shipping_rate_on_product'] = @ implode(',', $data['shipping_rate_on_product']); + $data['shipping_rate_on_category'] = @ implode(',', $data['shipping_rate_on_category']); + $data['shipping_rate_state'] = @ implode(',', $data['shipping_rate_state']); + $data['shipping_rate_on_shopper_group'] = @ implode(',', $data['shipping_rate_on_shopper_group']); + + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->shipping_rate_on_product) + { + $row->shipping_rate_on_product = ''; + } + + if (!$row->shipping_rate_on_category) + { + $row->shipping_rate_on_category = ''; + } + + if (!$row->shipping_rate_country) + { + $row->shipping_rate_country = ''; + } + + if (!$row->shipping_rate_state) + { + $row->shipping_rate_state = ''; + } + + if (!$row->shipping_rate_on_shopper_group) + { + $row->shipping_rate_on_shopper_group = ''; + } + + if (!$row->company_only) + { + $row->company_only = 0; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'DELETE FROM ' . $this->_table_prefix . 'shipping_rate WHERE shipping_rate_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function GetProductListshippingrate($d) + { + $and = ''; + + $and .= 'AND product_id IN (' . $d . ')'; + + $query = 'SELECT product_name as text,product_id as value FROM ' . $this->_table_prefix . 'product ' + . 'WHERE published=1 ' + . $and; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function GetProductList() + { + $query = 'SELECT product_name as text,product_id as value FROM ' . $this->_table_prefix . 'product WHERE published = 1'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function GetCategoryList() + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('id', 'value')) + ->select($db->qn('name', 'text')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('published') . ' = 1'); + + return $db->setQuery($query)->loadObjectList(); + } + + public function GetStateList($country_codes) + { + $query = 'SELECT s.state_name as text,s.state_2_code as value FROM ' . $this->_table_prefix . 'state AS s ' + . 'LEFT JOIN ' . $this->_table_prefix . 'country AS c ON c.id = s.country_id ' + . 'WHERE find_in_set( c.country_3_code, "' . $country_codes . '" ) ' + . 'ORDER BY s.state_name ASC'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function copy($cid = array()) + { + $copydata = array(); + + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'SELECT * FROM ' . $this->_table_prefix . 'shipping_rate WHERE shipping_rate_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + $copydata = $this->_db->loadObjectList(); + } + + for ($i = 0, $in = count($copydata); $i < $in; $i++) + { + $row = $this->getTable(); + + $pdata = $copydata[$i]; + + $post = array(); + $post['shipping_rate_id'] = 0; + $post['shipping_rate_name'] = $this->renameToUniqueValue('shipping_rate_name', $pdata->shipping_rate_name); + $post['shipping_class'] = $pdata->shipping_class; + $post['shipping_rate_country'] = $pdata->shipping_rate_country; + $post['shipping_rate_state'] = $pdata->shipping_rate_state; + $post['shipping_rate_zip_start'] = $pdata->shipping_rate_zip_start; + $post['shipping_rate_zip_end'] = $pdata->shipping_rate_zip_end; + $post['shipping_rate_volume_start'] = $pdata->shipping_rate_volume_start; + $post['shipping_rate_volume_end'] = $pdata->shipping_rate_volume_end; + $post['shipping_rate_ordertotal_start'] = $pdata->shipping_rate_ordertotal_start; + $post['shipping_rate_ordertotal_end'] = $pdata->shipping_rate_ordertotal_end; + $post['shipping_rate_priority'] = $pdata->shipping_rate_priority; + $post['shipping_rate_value'] = $pdata->shipping_rate_value; + $post['shipping_rate_package_fee'] = $pdata->shipping_rate_package_fee; + $post['shipping_rate_weight_start'] = $pdata->shipping_rate_weight_start; + $post['shipping_rate_weight_end'] = $pdata->shipping_rate_weight_end; + $post['company_only'] = $pdata->company_only; + $post['apply_vat'] = $pdata->apply_vat; + $post['shipping_rate_on_product'] = $pdata->shipping_rate_on_product; + $post['shipping_rate_on_category'] = $pdata->shipping_rate_on_category; + $post['shipping_rate_on_shopper_group'] = $pdata->shipping_rate_on_shopper_group; + $post['shipping_location_info'] = $pdata->shipping_location_info; + + $row->bind($post); + $result = $row->store(); + } + + return $result; + } + + public function getVatGroup() + { + $query = "SELECT tg.name as text, tg.id as value FROM `" . $this->_table_prefix . "tax_group` as tg WHERE + tg.published = 1 ORDER BY tg.id ASC"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + /** + * Get State Dropdown + * + * @param array $data Data + * + * @return mixed + */ + public function GetStateDropdown($data) + { + $countryCode = $data['country_codes']; + $shippingRateId = $data['shipping_rate_id']; + + $shippingRate = $this->getTable('shipping_rate_detail'); + $shippingRate->load($shippingRateId); + $shippingRateState = $this->GetStateList($countryCode); + + JPluginHelper::importPlugin('redshop_shipping'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $dispatcher->trigger('onRenderShippingRateState', array(&$shippingRateState, $countryCode)); + + $shippingRate->shipping_rate_state = explode(',', $shippingRate->shipping_rate_state); + $tmp = array_merge(array(), $shippingRate->shipping_rate_state); + + echo JHTML::_( + 'select.genericlist', + $shippingRateState, + 'shipping_rate_state[]', + 'class="inputbox" multiple="multiple"', + 'value', + 'text', + $shippingRate->shipping_rate_state + ); + } +} diff --git a/component/admin/models/shopper_group.php b/component/admin/models/shopper_group.php new file mode 100644 index 00000000000..f2283c8742d --- /dev/null +++ b/component/admin/models/shopper_group.php @@ -0,0 +1,147 @@ +_context = 'shopper_group_id'; + + $this->_table_prefix = '#__redshop_'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + $limitstart = ($limit != 0) ? (floor($limitstart / $limit) * $limit) : 0; + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since __DEPLOY_VERSION__ + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'o.order_id', $direction = 'desc') + { + $filter = $this->getUserStateFromRequest($this->context . 'filter', 'filter', ''); + $this->setState('filter', $filter); + + parent::populateState($ordering, $direction); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $db = JFactory::getDbo(); + $orderby = $this->_buildContentOrderBy(); + + $query = $db->getQuery(true) + ->select(array('DISTINCT("s.shopper_group_id")', 's.*')) + ->from($db->qn($this->_table_prefix . 'shopper_group', 's')) + ->order($orderby); + + // Filter + $filter = $this->getState('filter'); + + if ($filter) + { + $query->where($db->qn('shopper_group_name') . ' LIKE ' . $db->q('%' . $filter . '%')); + } + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'shopper_group_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } +} diff --git a/component/admin/models/shopper_group_detail.php b/component/admin/models/shopper_group_detail.php new file mode 100644 index 00000000000..596e51ec99e --- /dev/null +++ b/component/admin/models/shopper_group_detail.php @@ -0,0 +1,339 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $shoppergroup_id = Redshop::getConfig()->get('NEW_SHOPPER_GROUP_GET_VALUE_FROM'); + + if ($this->_id) + { + $shoppergroup_id = $this->_id; + } + + if ($shoppergroup_id <= 0) + { + return false; + } + + $query = 'SELECT * FROM ' . $this->_table_prefix . 'shopper_group ' + . 'WHERE shopper_group_id = "' . $shoppergroup_id . '" '; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + $this->_data->shopper_group_id = $this->_id; + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->shopper_group_id = 0; + $detail->shopper_group_name = null; + $detail->shopper_group_customer_type = 0; + $detail->shopper_group_portal = 0; + $detail->shopper_group_categories = null; + $detail->shopper_group_url = null; + $detail->shopper_group_logo = null; + $detail->shopper_group_introtext = null; + $detail->shopper_group_desc = null; + $detail->parent_id = null; + $detail->default_shipping = 0; + $detail->default_shipping_rate = null; + $detail->published = 1; + $detail->shopper_group_cart_checkout_itemid = 0; + $detail->tax_group_id = 0; + $detail->show_price_without_vat = 0; + $detail->shopper_group_cart_itemid = 0; + $detail->shopper_group_quotation_mode = 0; + $detail->use_as_catalog = 0; + $detail->show_price = 0; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $logo = JFactory::getApplication()->input->files->get('shopper_group_logo', ''); + + if ($logo['name'] != "" || $data['shopper_group_logo_tmp'] != null) + { + $logopath = REDSHOP_FRONT_IMAGES_RELPATH . 'shopperlogo/' . $data['shopper_group_logo']; + + if (JFile::exists($logopath)) + { + JFile::delete($logopath); + } + } + + if ($logo['name'] != "") + { + $logoname = RedshopHelperMedia::cleanFileName($logo['name']); + + // Image Upload + $logotype = JFile::getExt($logo['name']); + + $src = $logo['tmp_name']; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'shopperlogo/' . $logoname; + + if ($logotype == 'jpg' || $logotype == 'jpeg' || $logotype == 'gif' || $logotype == 'png') + { + JFile::upload($src, $dest); + $data['shopper_group_logo'] = $logoname; + } + } + else + { + if ($data['shopper_group_logo_tmp'] != null) + { + $image_split = explode('/', $data['shopper_group_logo_tmp']); + $logoname = RedshopHelperMedia::cleanFileName($image_split[count($image_split) - 1]); + $data['shopper_group_logo'] = $logoname; + + // Image copy + $src = JPATH_ROOT . '/' . $data['shopper_group_logo_tmp']; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'shopperlogo/' . $logoname; + + copy($src, $dest); + } + } + + $isNew = false; + + if (!$data['shopper_group_id'] && Redshop::getConfig()->get('NEW_SHOPPER_GROUP_GET_VALUE_FROM')) + { + $isNew = true; + $destname = time() . $data['shopper_group_logo']; + $logopath = REDSHOP_FRONT_IMAGES_RELPATH . 'shopperlogo/' . $data['shopper_group_logo']; + $copylogopath = REDSHOP_FRONT_IMAGES_RELPATH . 'shopperlogo/' . $destname; + + if (JFile::exists($logopath)) + { + JFile::copy($logopath, $copylogopath); + } + + $data['shopper_group_logo'] = $destname; + } + + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if ($isNew && Redshop::getConfig()->get('NEW_SHOPPER_GROUP_GET_VALUE_FROM')) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_price ' + . 'WHERE shopper_group_id="' . Redshop::getConfig()->get('NEW_SHOPPER_GROUP_GET_VALUE_FROM') . '" '; + $this->_db->setQuery($query); + $product_price = $this->_db->loadObjectlist(); + + for ($i = 0, $in = count($product_price); $i < $in; $i++) + { + $product_data = (array) $product_price[$i]; + $product_data['price_id'] = 0; + $product_data['shopper_group_id'] = $row->shopper_group_id; + $product_data['cdate'] = date("Y-m-d"); + + $prdrow = JTable::getInstance('prices_detail', 'Table'); + + if (!$prdrow->bind($product_data)) + { + $this->setError($this->_db->getErrorMsg()); + } + + if (!$prdrow->store()) + { + $this->setError($this->_db->getErrorMsg()); + } + } + + $query = 'SELECT * FROM ' . $this->_table_prefix . 'product_attribute_price ' + . 'WHERE shopper_group_id="' . Redshop::getConfig()->get('NEW_SHOPPER_GROUP_GET_VALUE_FROM') . '" '; + $this->_db->setQuery($query); + $attribute_price = $this->_db->loadObjectlist(); + + for ($i = 0, $in = count($attribute_price); $i < $in; $i++) + { + $attribute_data = (array) $attribute_price[$i]; + $attribute_data['price_id'] = 0; + $attribute_data['shopper_group_id'] = $row->shopper_group_id; + $attribute_data['cdate'] = time(); + + $attrow = JTable::getInstance('attributeprices_detail', 'Table'); + + if (!$attrow->bind($attribute_data)) + { + $this->setError($this->_db->getErrorMsg()); + } + + if (!$attrow->store()) + { + $this->setError($this->_db->getErrorMsg()); + } + } + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'SELECT * FROM ' . $this->_table_prefix . 'shopper_group ' + . 'WHERE shopper_group_id IN (' . $cids . ') '; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + for ($i = 0, $in = count($list); $i < $in; $i++) + { + $logopath = REDSHOP_FRONT_IMAGES_RELPATH . 'shopperlogo/' . $list[$i]->shopper_group_logo; + + if (JFile::exists($logopath)) + { + JFile::delete($logopath); + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_price WHERE shopper_group_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'product_attribute_price WHERE shopper_group_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'shopper_group WHERE shopper_group_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'UPDATE ' . $this->_table_prefix . 'shopper_group ' + . 'SET published = ' . intval($publish) + . ' WHERE shopper_group_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function getVatGroup() + { + $query = "SELECT tg.name as text, tg.id as value FROM `" . $this->_table_prefix . "tax_group` as tg WHERE tg.published = 1 "; + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function getmanufacturers() + { + $query = 'SELECT id as value,name as text FROM ' . $this->_table_prefix . 'manufacturer + WHERE published=1 ORDER BY `name`'; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } +} diff --git a/component/admin/models/state.php b/component/admin/models/state.php new file mode 100644 index 00000000000..f028832fbd2 --- /dev/null +++ b/component/admin/models/state.php @@ -0,0 +1,20 @@ +getState('filter.search'); + $id .= ':' . $this->getState('filter.country_id'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @since 2.0.0.4 + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'state_name', $direction = '') + { + $search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $countryId = $this->getUserStateFromRequest($this->context . '.filter.country_id', 'filter_country_id'); + $this->setState('filter.country_id', $countryId); + + parent::populateState($ordering, $direction); + } + + /** + * Method to build query string + * + * @return string + * + * @note Calling getState in this method will result in recursion. + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $search = $this->getState('filter.search'); + $countryId = $this->getState('filter.country_id'); + + $query->select('s.*') + ->select($db->qn('c.country_name')) + ->from($db->qn('#__redshop_state', 's')) + ->join('LEFT', $db->qn('#__redshop_country', 'c') . ' ON (' . $db->qn('s.country_id') . ' = ' . $db->qn('c.id') . ')'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('s.id') . ' = ' . $db->q((int) substr($search, 3))); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('s.state_name') . ' LIKE ' . $search); + } + } + + if (!empty($countryId)) + { + $query->where($db->qn('s.country_id') . ' = ' . $db->q($countryId)); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } + + /** + * Method to get country name + * + * @param int $countryId An optional ordering field. + * + * @return object + * + * @note Calling getState in this method will result in recursion. + */ + public function getCountryName($countryId) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select($db->qn('country_name')) + ->from($db->qn('#__redshop_country')) + ->where($db->qn('country_id') . ' = ' . $db->q($countryId)); + + $db->setQuery($query); + + return $db->loadResult(); + } +} diff --git a/component/admin/models/statistic.php b/component/admin/models/statistic.php new file mode 100644 index 00000000000..51c6f604b0b --- /dev/null +++ b/component/admin/models/statistic.php @@ -0,0 +1,1054 @@ +input; + $this->_filteroption = $input->getInt('filteroption', 0); + $this->_typeoption = $input->getInt('typeoption', 2); + + if (!$this->_filteroption && $input->getString('view', '') == "") + { + $this->_filteroption = 1; + } + } + + /** + * get most popular product data for statistic + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getMostPopular() + { + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('pv.created_date')) + ->from($db->qn('#__redshop_pageviewer', 'pv')) + ->where($db->qn('pv.section') . ' = ' . $db->q('product')) + ->order($db->qn('pv.created_date') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->select('FROM_UNIXTIME(' . $db->qn('pv.created_date') . ', "' . $formate . '") AS viewdate') + ->select($db->qn('p.product_id')) + ->select($db->qn('p.product_name')) + ->select($db->qn('p.product_price')) + ->select('COUNT(*) AS visited') + ->from($db->qn('#__redshop_pageviewer', 'pv')) + ->leftjoin( + $db->qn('#__redshop_product', 'p') . ' ON ' + . $db->qn('p.product_id') . ' = ' + . $db->qn('pv.section_id') + ) + ->where($db->qn('pv.section') . ' = ' . $db->q('product')) + ->where($db->qn('pv.section_id') . ' != 0') + ->group($db->qn('pv.section_id')) + ->order($db->qn('visited') . ' DESC'); + + $mostPopular = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('pv.created_date') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('pv.created_date') . ' <= ' . $db->q(strtotime($today))); + + $rs = $db->setQuery($query2)->loadObjectList(); + + for ($i = 0, $in = count($rs); $i < $in; $i++) + { + if ($this->_filteroption == 2) + { + $rs[$i]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[$i]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $mostPopular = $result; + } + } + + return $mostPopular; + } + + /** + * get product best seller data for statistic + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getBestSellers() + { + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('cdate')) + ->from($db->qn('#__redshop_order_item')) + ->order($db->qn('cdate') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->select('COUNT(oi.product_id) AS totalproduct'); + + if ($this->_typeoption == 2) + { + $query = $db->getQuery(true) + ->select('SUM(oi.product_quantity) AS totalproduct'); + } + + $query->select('FROM_UNIXTIME(' . $db->qn('oi.cdate') . ', "' . $formate . '") AS viewdate') + ->select($db->qn('p.product_id')) + ->select($db->qn('p.product_name')) + ->select($db->qn('p.product_price')) + ->from($db->qn('#__redshop_order_item', 'oi')) + ->leftjoin($db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('oi.product_id')) + ->group($db->qn('oi.product_id')) + ->order($db->qn('totalproduct') . ' DESC'); + + $bestSallers = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('oi.cdate') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('oi.cdate') . ' <= ' . $db->q(strtotime($today))); + + $rs = $db->setQuery($query2)->loadObjectList(); + + for ($i = 0, $in = count($rs); $i < $in; $i++) + { + if ($this->_filteroption == 2) + { + $rs[$i]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[$i]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $bestSallers = $result; + } + } + + return $bestSallers; + } + + /** + * get new product data for statistic + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getNewProducts() + { + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('publish_date')) + ->from($db->qn('#__redshop_product')) + ->order($db->qn('publish_date') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->clear() + ->select($db->qn('product_id')) + ->select($db->qn('product_name')) + ->select($db->qn('product_price')) + ->select('FROM_UNIXTIME(UNIX_TIMESTAMP(' . $db->qn('publish_date') . '), "' . $formate . '") AS viewdate') + ->from($db->qn('#__redshop_product')) + ->order($db->qn('publish_date') . ' DESC'); + + $newProducts = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + while (strtotime($minDate) < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('publish_date') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('publish_date') . ' <= ' . $db->q(strtotime($today))); + + $rs = $db->setQuery($query2)->loadObjectList(); + + for ($i = 0, $in = count($rs); $i < $in; $i++) + { + if ($this->_filteroption == 2) + { + $rs[$i]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[$i]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $newProducts = $result; + } + } + + return $newProducts; + } + + /** + * get new orders data for statistic + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getNewOrders() + { + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('cdate')) + ->from($db->qn('#__redshop_orders')) + ->order($db->qn('cdate') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->select($db->qn('uf.firstname')) + ->select($db->qn('uf.lastname')) + ->select($db->qn('o.order_id')) + ->select($db->qn('o.order_total')) + ->select('FROM_UNIXTIME(' . $db->qn('o.cdate') . ', "' . $formate . '") AS viewdate') + ->from($db->qn('#__redshop_orders', 'o')) + ->leftjoin($db->qn('#__redshop_users_info', 'uf') . ' ON ' . $db->qn('o.user_id') . ' = ' . $db->qn('uf.user_id')) + ->where($db->qn('uf.address_type') . ' LIKE ' . $db->q('BT')) + ->order($db->qn('o.cdate') . ' DESC'); + + $newOrders = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('o.cdate') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('o.cdate') . ' <= ' . $db->q(strtotime($today))); + + $rs = $db->setQuery($query2)->loadObjectList(); + + for ($i = 0, $in = count($rs); $i < $in; $i++) + { + if ($this->_filteroption == 2) + { + $rs[$i]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[$i]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $newOrders = $result; + } + } + + return $newOrders; + } + + /** + * Get total turnover for cpanel view + * This is an optimized version of original getTotalTurnover() function + * + * @return array Turn over of shop to show statistics chart. + */ + public function getTotalTurnOverCpanel() + { + $formate = $this->getDateFormate(); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('cdate') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_status') . ' = ' . $db->q('C'), 'OR') + ->where($db->qn('order_status') . ' = ' . $db->q('PR'), 'OR') + ->where($db->qn('order_status') . ' = ' . $db->q('S'), 'OR') + ->order($db->qn('cdate') . ' ASC'); + + // Set the query and load the result. + $db->setQuery($query, 0, 1); + $minDate = $db->loadResult(); + + if (!$minDate) + { + return array(); + } + + $query = $db->getQuery(true) + ->clear() + ->from($db->qn('#__redshop_orders', 'o')) + ->where($db->qn('o.order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->order($db->qn('o.cdate') . ' DESC') + ->group('viewdate'); + + if (!empty($minDate)) + { + $query->where($db->qn('cdate') . ' >= ' . $minDate); + } + + if ($this->_filteroption == 2) + { + $query->select('CONCAT("' . JText::_('COM_REDSHOP_WEEKS') . ' - ", WEEKOFYEAR(FROM_UNIXTIME(o.cdate,"%Y-%m-%d"))) AS viewdate'); + + $query->group('FROM_UNIXTIME(o.cdate,"%Y")'); + } + elseif ($this->_filteroption == 4) + { + $query->select('CONCAT("' . JText::_('COM_REDSHOP_YEAR') . ' - ", FROM_UNIXTIME(o.cdate,"' . $formate . '")) AS viewdate'); + } + else + { + $query->select('FROM_UNIXTIME(o.cdate,"' . $formate . '") AS viewdate'); + } + + $query->select('SUM(o.order_total) AS turnover'); + + if ($this->_filteroption != 4) + { + $db->setQuery($query, 0, 10); + } + else + { + $db->setQuery($query); + } + + return $db->loadRowList(); + } + + /** + * Get total sales for cpanel view + * + * @return array Sales of shop to show statistics chart. + */ + public function getTotalSalesCpanel() + { + $db = JFactory::getDbo(); + $defaultQuery = $db->getQuery(true) + ->select('SUM(' . $db->qn('o.order_total') . ') AS total') + ->select('COUNT(' . $db->qn('o.order_total') . ') AS orders') + ->from($db->qn('#__redshop_orders', 'o')) + ->where($db->qn('o.order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')'); + + // 30 days + $query = clone $defaultQuery; + $query->select($db->q(JText::sprintf('COM_REDSHOP_STATISTIC_LAST_DAYS', '30'))); + $query->where('FROM_UNIXTIME(' . $db->qn('cdate') . ') BETWEEN NOW() - INTERVAL 30 DAY AND NOW()'); + + // Today + $union = clone $defaultQuery; + $union->select($db->q(JText::_('COM_REDSHOP_STATISTIC_TODAY'))); + $union->where('DATE(FROM_UNIXTIME(' . $db->qn('cdate') . ')) = CURDATE()'); + $query->union($union); + + // Yesterday + $union = clone $defaultQuery; + $union->select($db->q(JText::_('COM_REDSHOP_STATISTIC_YESTERDAY'))); + $union->where('DATE(FROM_UNIXTIME(' . $db->qn('cdate') . ')) = SUBDATE(CURDATE(),1)'); + $query->union($union); + + // 7 days + $union = clone $defaultQuery; + $union->select($db->q(JText::sprintf('COM_REDSHOP_STATISTIC_LAST_DAYS', '7'))); + $union->where('FROM_UNIXTIME(' . $db->qn('cdate') . ') BETWEEN NOW() - INTERVAL 7 DAY AND NOW()'); + $query->union($union); + + // 90 days + $union = clone $defaultQuery; + $union->select($db->q(JText::sprintf('COM_REDSHOP_STATISTIC_LAST_DAYS', '90'))); + $union->where('FROM_UNIXTIME(' . $db->qn('cdate') . ') BETWEEN NOW() - INTERVAL 90 DAY AND NOW()'); + $query->union($union); + + $db->setQuery($query); + + return $db->loadRowList(); + } + + /** + * get total turnover + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getTotalTurnover() + { + $turnOver = array(); + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('cdate')) + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->order($db->qn('cdate') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->clear() + ->select('FROM_UNIXTIME(o.cdate,"' . $formate . '") AS viewdate') + ->select('SUM(o.order_total) AS turnover') + ->from($db->qn('#__redshop_orders', 'o')) + ->leftjoin($db->qn('#__redshop_users_info', 'uf') . ' ON ' . $db->qn('o.user_id') . ' = ' . $db->qn('uf.user_id')) + ->where($db->qn('uf.address_type') . ' = ' . $db->q('BT')) + ->where($db->qn('o.order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->order($db->qn('o.cdate')); + + $turnOver = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + + $query2 = clone $query; + $query2->where($db->qn('o.cdate') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('o.cdate') . ' <= ' . $db->q(strtotime($today))); + + $rs = $db->setQuery($query2)->loadObjectList(); + + if (count($rs) > 0 && $rs[0]->turnover > 0) + { + if ($this->_filteroption == 2) + { + $rs[0]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[0]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $turnOver = $result; + } + } + + return $turnOver; + } + + /** + * get avarage order amount + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getAvgOrderAmount() + { + $amountPrice = ""; + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('cdate') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->order($db->qn('cdate') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->clear() + ->select('FROM_UNIXTIME(' . $db->qn('o.cdate') . ',' . $db->q($formate) . ') AS viewdate') + ->select('(SUM(o.order_total)/COUNT(DISTINCT o.user_id)) AS avg_order') + ->from($db->qn('#__redshop_orders', 'o')) + ->where($db->qn('o.order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->order($db->qn('viewdate') . ' DESC'); + + if ($this->_filteroption && $minDate != '' && $minDate != 0) + { + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('o.cdate') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('o.cdate') . ' <= ' . $db->q(strtotime($today))); + $rs = $db->setQuery($query2)->loadObjectList(); + + if (count($rs) > 0 && $rs[0]->avg_order > 0) + { + if ($this->_filteroption == 2) + { + $rs[0]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[0]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $amountPrice = $result; + } + } + + if (empty($result)) + { + $amountPrice = $db->setQuery($query)->loadObjectList(); + } + + return $amountPrice; + } + + /** + * get amount price + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getAmountPrice() + { + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('cdate') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->order($db->qn('cdate') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->clear() + ->select('FROM_UNIXTIME(' . $db->qn('o.cdate') . ',' . $db->q($formate) . ') AS viewdate') + ->select($db->qn('uf.firstname')) + ->select($db->qn('uf.lastname')) + ->select('MAX(o.order_total) AS order_total') + ->from($db->qn('#__redshop_orders', 'o')) + ->leftjoin($db->qn('#__redshop_users_info', 'uf') . ' ON ' . $db->qn('o.user_id') . ' = ' . $db->qn('uf.user_id')) + ->where($db->qn('uf.address_type') . ' = ' . $db->q('BT')) + ->where($db->qn('o.order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->group($db->qn('o.user_id')) + ->order($db->qn('order_total') . 'DESC'); + $amountPrice = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('o.cdate') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('o.cdate') . ' <= ' . $db->q(strtotime($today))); + $rs = $db->setQuery($query2)->loadObjectList(); + + for ($i = 0, $in = count($rs); $i < $in; $i++) + { + if ($this->_filteroption == 2) + { + $rs[$i]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[$i]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $amountPrice = $result; + } + } + + return $amountPrice; + } + + /** + * get amount spent in total + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getAmountSpentInTotal() + { + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('cdate') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->order($db->qn('cdate') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->clear() + ->select('FROM_UNIXTIME(' . $db->qn('o.cdate') . ',' . $db->q($formate) . ') AS viewdate') + ->select($db->qn('uf.firstname')) + ->select($db->qn('uf.lastname')) + ->select('SUM(o.order_total) AS order_total') + ->from($db->qn('#__redshop_orders', 'o')) + ->leftjoin($db->qn('#__redshop_users_info', 'uf') . ' ON ' . $db->qn('o.user_id') . ' = ' . $db->qn('uf.user_id')) + ->where($db->qn('uf.address_type') . ' = ' . $db->q('BT')) + ->where($db->qn('o.order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->group($db->qn('o.user_id')) + ->order($db->qn('order_total') . 'DESC'); + $amountPrice = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('o.cdate') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('o.cdate') . ' <= ' . $db->q(strtotime($today))); + $rs = $db->setQuery($query2)->loadObjectList(); + + for ($i = 0, $in = count($rs); $i < $in; $i++) + { + if ($this->_filteroption == 2) + { + $rs[$i]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[$i]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $amountPrice = $result; + } + } + + return $amountPrice; + } + + /** + * get amount order + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getAmountOrder() + { + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('cdate') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->order($db->qn('cdate') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->clear() + ->select('FROM_UNIXTIME(' . $db->qn('o.cdate') . ',' . $db->q($formate) . ') AS viewdate') + ->select($db->qn('uf.firstname')) + ->select($db->qn('uf.lastname')) + ->select('COUNT(o.user_id) AS totalorder') + ->from($db->qn('#__redshop_orders', 'o')) + ->leftjoin($db->qn('#__redshop_users_info', 'uf') . ' ON ' . $db->qn('o.user_id') . ' = ' . $db->qn('uf.user_id')) + ->where($db->qn('uf.address_type') . ' = ' . $db->q('BT')) + ->where($db->qn('o.order_status') . ' IN (' . $db->q('C') . ',' . $db->q('PR') . ',' . $db->q('S') . ')') + ->group($db->qn('o.user_id')) + ->order($db->qn('totalorder') . 'DESC'); + $amountPrice = $this->_getList($query); + + $amountOrder = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('o.cdate') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('o.cdate') . ' <= ' . $db->q(strtotime($today))); + $rs = $db->setQuery($query2)->loadObjectList(); + + for ($i = 0, $in = count($rs); $i < $in; $i++) + { + if ($this->_filteroption == 2) + { + $rs[$i]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[$i]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $amountOrder = $result; + } + } + + return $amountOrder; + } + + /** + * get page viewer + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getPageViewer() + { + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('created_date') + ->from($db->qn('#__redshop_pageviewer')) + ->order($db->qn('created_date') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->clear() + ->select('FROM_UNIXTIME(' . $db->qn('created_date') . ',' . $db->q($formate) . ') AS viewdate') + ->select($db->qn('section')) + ->select($db->qn('section_id')) + ->select('COUNT(*) AS totalpage') + ->from($db->qn('#__redshop_pageviewer')) + ->where($db->qn('section_id') . ' != 0') + ->group($db->qn('section')) + ->group($db->qn('section_id')) + ->order($db->qn('totalpage') . ' DESC'); + + $pageViewer = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('created_date') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('created_date') . ' <= ' . $db->q(strtotime($today))); + $rs = $db->setQuery($query2)->loadObjectList(); + + for ($i = 0, $in = count($rs); $i < $in; $i++) + { + if ($this->_filteroption == 2) + { + $rs[$i]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[$i]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $pageViewer = $result; + } + } + + return $pageViewer; + } + + /** + * get redSHOP viewer + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getRedshopViewer() + { + $siteViewer = array(); + $today = $this->getStartDate(); + $formate = $this->getDateFormate(); + $result = array(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('created_date') + ->from($db->qn('#__redshop_siteviewer')) + ->order($db->qn('created_date') . ' ASC'); + $minDate = $db->setQuery($query)->loadResult(); + + $query = $db->getQuery(true) + ->clear() + ->select('COUNT(*) AS viewer') + ->from($db->qn('#__redshop_siteviewer')); + + $siteViewer = $this->_getList($query); + + if ($this->_filteroption && $minDate != "" && $minDate != 0) + { + $query = $db->getQuery(true) + ->clear() + ->select('FROM_UNIXTIME(' . $db->qn('created_date') . ',' . $db->q($formate) . ') AS viewdate') + ->from($db->qn('#__redshop_siteviewer')); + + while ($minDate < strtotime($today)) + { + $list = $this->getNextInterval($today); + $query2 = clone $query; + $query2->where($db->qn('created_date') . ' > ' . $db->q(strtotime($list->preday))) + ->where($db->qn('created_date') . ' <= ' . $db->q(strtotime($today))); + $rs = $db->setQuery($query2)->loadObjectList(); + + $rs[0]->viewer = count($rs); + + if ($rs[0]->viewer > 0) + { + if ($this->_filteroption == 2) + { + $rs[0]->viewdate = JText::_('COM_REDSHOP_WEEK') . " " . date("W - Y", strtotime($list->preday) + 1); + } + + $result[] = $rs[0]; + } + + $today = $list->preday; + } + + if (!empty($result)) + { + $siteViewer = $result; + } + } + + return $siteViewer; + } + + /** + * get next interval + * + * @param string $today today text + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getNextInterval($today) + { + $list = array(); + $db = $this->getDbo(); + $query = $db->getQuery(true); + + switch ($this->_filteroption) + { + case 1: + $query->select('SUBDATE(' . $db->q($today) . ', INTERVAL 1 DAY) AS preday'); + $list = $db->setQuery($query)->loadObject(); + break; + case 2: + $query->select('SUBDATE(' . $db->q($today) . ', INTERVAL 1 WEEK) AS preday'); + $list = $db->setQuery($query)->loadObject(); + break; + case 3: + $query->select('LAST_DAY(SUBDATE(' . $db->q($today) . ', INTERVAL 1 MONTH)) AS preday'); + $list = $db->setQuery($query)->loadObject(); + $list->preday = $list->preday . " 23:59:59"; + break; + case 4: + $query->select('SUBDATE(' . $db->q($today) . ', INTERVAL 1 YEAR) AS preday'); + $list = $db->setQuery($query)->loadObject(); + break; + } + + return $list; + } + + /** + * get start date + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getStartDate() + { + $return = ""; + $db = $this->getDbo(); + $query = $db->getQuery(true); + + switch ($this->_filteroption) + { + case 1: + $query->select('CURDATE() AS date'); + $list = $db->setQuery($query)->loadObject(); + $return = $list->date . " 23:59:59"; + break; + case 2: + $query->select('ADDDATE(CURDATE(), INTERVAL 6-weekday(CURDATE()) DAY) AS date'); + $list = $db->setQuery($query)->loadObject(); + $return = $list->date . " 23:59:59"; + break; + case 3: + $query->select('LAST_DAY(CURDATE()) AS date'); + $list = $db->setQuery($query)->loadObject(); + $return = $list->date . " 23:59:59"; + break; + case 4: + $query->select('LAST_DAY(' . $db->q(date("Y-12-d")) . ') AS date'); + $list = $db->setQuery($query)->loadObject(); + $return = $list->date . " 23:59:59"; + break; + } + + return $return; + } + + /** + * get date Format + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getDateFormate() + { + $return = ""; + + switch ($this->_filteroption) + { + case 1: + $return = "%d %b %Y"; + break; + case 2: + $return = "%d %b, %Y"; + break; + case 3: + $return = "%b, %Y"; + break; + case 4: + $return = "%Y"; + break; + default: + $return = "%Y"; + break; + } + + return $return; + } + + /** + * get section detail + * + * @param string $section section + * @param int $sectionId section id + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getSectionDetail($section, $sectionId) + { + $return = array(); + $db = $this->getDbo(); + $query = $db->getQuery(true); + + switch ($section) + { + case "product": + $query + ->select($db->qn('product_name', 'sname')) + ->select($db->qn('product_id', 'id')) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_id') . ' = ' . $db->q((int) $sectionId)); + $return = $db->setQuery($query)->loadObject(); + break; + case "category": + $query + ->select($db->qn('name', 'sname')) + ->select($db->qn('id')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('id') . ' = ' . $db->q((int) $sectionId)); + $return = $db->setQuery($query)->loadObject(); + break; + case "manufacturers": + $query + ->select($db->qn('name', 'sname')) + ->select($db->qn('id', 'id')) + ->from($db->qn('#__redshop_manufacturer')) + ->where($db->qn('id') . ' = ' . $db->q((int) $sectionId)); + $return = $db->setQuery($query)->loadObject(); + break; + } + + return $return; + } +} diff --git a/component/admin/models/statistic_customer.php b/component/admin/models/statistic_customer.php new file mode 100644 index 00000000000..bc81fe886d2 --- /dev/null +++ b/component/admin/models/statistic_customer.php @@ -0,0 +1,137 @@ +getState('filter.date_range'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @since 2.0.0.4 + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'ui.users_info_id', $direction = '') + { + $dateRange = $this->getUserStateFromRequest($this->context . '.filter.date_range', 'filter_date_range'); + $this->setState('filter.date_range', $dateRange); + + parent::populateState($ordering, $direction); + } + + /** + * Method to buil query string + * + * @return string + * + * @note Calling getState in this method will result in recursion. + */ + public function getListQuery() + { + $db = $this->getDbo(); + $query = $db->getQuery(true); + + $query->select($db->qn('ui.user_email')) + ->select('COUNT(' . $db->qn('o.order_id') . ') AS ' . $db->qn('count')) + ->select('SUM(' . $db->qn('o.order_total') . ') AS ' . $db->qn('total_sale')) + ->select('CONCAT(' . $db->qn('ui.firstname') . ',' . $db->quote(' ') . ',' . $db->qn('ui.lastname') . ') AS ' . $db->qn('customer_name')) + ->select($db->qn('ui.lastname')) + ->select($db->qn('ui.firstname')) + ->select($db->qn('ui.users_info_id')) + ->select($db->qn('ui.user_id')) + ->from($db->qn('#__redshop_users_info', 'ui')) + ->leftjoin($db->qn('#__users', 'u') . ' ON ' . $db->qn('u.id') . ' = ' . $db->qn('ui.user_id')) + ->where($db->qn('ui.address_type') . ' = ' . $db->q('BT')) + ->leftJoin( + $db->qn('#__redshop_orders', 'o') . ' ON ' . $db->qn('o.user_info_id') . ' = ' . $db->qn('ui.users_info_id') + . ' AND ' . $db->qn('o.order_payment_status') . ' = ' . $db->quote('Paid') + ); + + // Filter: Date Range + $filterDateRange = $this->state->get('filter.date_range', ''); + + if (!empty($filterDateRange)) + { + $filterDateRange = explode('-', $filterDateRange); + + $startDate = (isset($filterDateRange[0])) ? (int) $filterDateRange[0] : ''; + $endDate = (isset($filterDateRange[1])) ? (int) $filterDateRange[1] : ''; + + $query->where($db->qn('o.cdate') . ' >= ' . $startDate) + ->where($db->qn('o.cdate') . ' <= ' . $endDate); + } + + $query->group($db->qn('ui.users_info_id')); + $query->having($db->qn('count') . ' > 0'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'ui.users_info_id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/statistic_order.php b/component/admin/models/statistic_order.php new file mode 100644 index 00000000000..b5e72216021 --- /dev/null +++ b/component/admin/models/statistic_order.php @@ -0,0 +1,269 @@ +getState('filter.date_range'); + $id .= ':' . $this->getState('filter.date_group'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @since 2.0.0.4 + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'cdate', $direction = 'asc') + { + $dateRange = $this->getUserStateFromRequest($this->context . '.filter.date_range', 'filter_date_range'); + $this->setState('filter.date_range', $dateRange); + + $dateGroup = $this->getUserStateFromRequest($this->context . '.filter.date_group', 'filter_date_group'); + $this->setState('filter.date_group', $dateGroup); + + parent::populateState($ordering, $direction); + } + + /** + * Method to buil query string + * + * @return string + * + * @note Calling getState in this method will result in recursion. + */ + public function getListQuery() + { + $format = $this->getDateFormat(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('FROM_UNIXTIME(cdate, "' . $format . '") AS viewdate') + ->select('FROM_UNIXTIME(cdate, "%Y%m%d") AS orderdate') + ->select('SUM(order_total) AS order_total') + ->select('COUNT(*) AS count') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_payment_status') . ' = ' . $db->quote('Paid')) + ->group($db->qn('viewdate')); + + // Filter: Date Range + $filterDateRange = $this->state->get('filter.date_range', ''); + + if (!empty($filterDateRange)) + { + $filterDateRange = explode('-', $filterDateRange); + + $startDate = (isset($filterDateRange[0])) ? (int) $filterDateRange[0] : ''; + $endDate = (isset($filterDateRange[1])) ? (int) $filterDateRange[1] : ''; + + $query->where($db->qn('cdate') . ' >= ' . $startDate) + ->where($db->qn('cdate') . ' <= ' . $endDate); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'cdate'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } + + /** + * get Order data for export + * + * @return array. + * + * @since 2.0.0.3 + */ + public function exportOrder() + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('DISTINCT(o.cdate)') + ->select('o.*') + ->select('ouf.*') + ->from($db->qn('#__redshop_orders', 'o')) + ->leftjoin($db->qn('#__redshop_order_users_info', 'ouf') . ' ON ' . $db->qn('o.order_id') . ' = ' . $db->qn('ouf.order_id')) + ->where($db->qn('ouf.address_type') . ' = ' . $db->q('BT')) + ->where($db->qn('o.order_payment_status') . ' = ' . $db->quote('Paid')) + ->order($db->qn('o.order_id') . ' DESC'); + + // Filter: Date Range + $filterDateRange = JFactory::getApplication()->input->getString('date_range', ""); + + if (!empty($filterDateRange)) + { + $filterDateRange = explode('-', $filterDateRange); + + $startDate = (isset($filterDateRange[0])) ? (int) $filterDateRange[0] : ''; + $endDate = (isset($filterDateRange[1])) ? (int) $filterDateRange[1] : ''; + + $query->where($db->qn('o.cdate') . ' >= ' . $startDate) + ->where($db->qn('o.cdate') . ' <= ' . $endDate); + } + + return $this->_getList($query); + } + + /** + * Count product by order + * + * @return object. + * + * @since 2.0.0.3 + */ + public function countProductByOrder() + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('order_id')) + ->select('COUNT(order_item_id) AS noproduct') + ->from($db->qn('#__redshop_order_item')) + ->group($db->qn('order_id')); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * get date Format for new statistic + * + * @return string. + * + * @since 2.0.0.3 + */ + public function getDateFormat() + { + $startDate = 0; + $endDate = 0; + $filterDateRange = $this->state->get('filter.date_range', ''); + $filterDateGroup = $this->state->get('filter.date_group', ''); + + if (!empty($filterDateRange)) + { + $filterDateRange = explode('-', $filterDateRange); + + $startDate = (isset($filterDateRange[0])) ? (int) $filterDateRange[0] : ''; + $endDate = (isset($filterDateRange[1])) ? (int) $filterDateRange[1] : ''; + } + + if ($filterDateGroup == 3) + { + return '%Y'; + } + elseif ($filterDateGroup == 2) + { + return '%M %Y'; + } + elseif ($filterDateGroup == 1) + { + return JText::_('COM_REDSHOP_WEEK') . ' %v - %x'; + } + else + { + return '%d %M %Y'; + } + + $interval = $endDate - $startDate; + + if ($interval == 86399) + { + $return = "%d %b %Y"; + } + elseif ($interval <= 1209600) + { + $return = "%d %b. %Y"; + } + elseif ($interval <= 7689600) + { + if ($filterDateGroup == 1) + { + $return = "%d %b. %Y"; + } + else + { + $return = "%b. %Y"; + } + } + elseif ($interval <= 31536000) + { + if ($filterDateGroup == 1) + { + $return = "%d %b. %Y"; + } + elseif ($filterDateGroup == 2) + { + $return = "%b. %Y"; + } + else + { + $return = "%Y"; + } + } + else + { + $return = "%d %b %Y"; + } + + return $return; + } +} diff --git a/component/admin/models/statistic_product.php b/component/admin/models/statistic_product.php new file mode 100644 index 00000000000..3df165c8fa3 --- /dev/null +++ b/component/admin/models/statistic_product.php @@ -0,0 +1,157 @@ +getState('filter.date_range'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @since 2.0.0.4 + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'p.product_name', $direction = 'asc') + { + $dateRange = $this->getUserStateFromRequest($this->context . '.filter.date_range', 'filter_date_range'); + $this->setState('filter.date_range', $dateRange); + + parent::populateState($ordering, $direction); + } + + /** + * Method to buil query string + * + * @return string + * + * @note Calling getState in this method will result in recursion. + */ + public function getListQuery() + { + $db = $this->getDbo(); + $db->setQuery("set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'"); + $db->execute(); + $subQuery = $db->getQuery(true) + ->select('SUM(' . $db->qn('oi.product_final_price') . ') AS ' . $db->qn('total_sale')) + ->select('SUM(' . $db->qn('oi.product_quantity') . ') AS ' . $db->qn('unit_sold')) + ->select('COUNT(*) AS ' . $db->qn('order_count')) + ->select($db->qn('oi.product_id') . ' AS ' . $db->qn('product_id')) + ->select($db->qn('oi.cdate', 'order_create_date')) + ->from($db->qn('#__redshop_order_item', 'oi')) + ->leftJoin($db->qn('#__redshop_orders', 'o') . ' ON ' . $db->qn('o.order_id') . ' = ' . $db->qn('oi.order_id')) + ->where($db->qn('o.order_payment_status') . ' = ' . $db->quote('Paid')) + ->group($db->qn('oi.product_id')); + + // Filter: Date Range + $filterDateRange = $this->state->get('filter.date_range', ''); + + if (!empty($filterDateRange)) + { + $filterDateRange = explode('-', $filterDateRange); + + $startDate = (isset($filterDateRange[0])) ? (int) $filterDateRange[0] : ''; + + if ($startDate) + { + $subQuery->having($db->qn('oi.cdate') . ' >= ' . $db->quote(JFactory::getDate($startDate)->toUnix())); + } + + $endDate = (isset($filterDateRange[1])) ? (int) $filterDateRange[1] : ''; + + if ($endDate) + { + $subQuery->having($db->qn('oi.cdate') . ' <= ' . $db->quote(JFactory::getDate($endDate)->toUnix())); + } + } + + $query = $db->getQuery(true) + ->select( + $db->qn( + array( + 'p.product_id', 'p.product_name', 'p.product_number', + 'oi.order_create_date', 'oi.total_sale', 'oi.unit_sold', 'oi.order_count' + ) + ) + ) + ->select($db->qn('m.name', 'manufacturer_name')) + ->select('COUNT(*) AS count') + ->from($db->qn('#__redshop_product', 'p')) + ->leftjoin($db->qn('#__redshop_manufacturer', 'm') . ' ON ' . $db->qn('m.id') . ' = ' . $db->qn('p.manufacturer_id')) + ->leftjoin('(' . $subQuery . ') AS oi ' . ' ON ' . $db->qn('oi.product_id') . ' = ' . $db->qn('p.product_id') + ) + ->group($db->qn('p.product_id')); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'p.product_name'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + $query->having($db->qn('oi.total_sale') . ' > 0'); + + return $query; + } +} diff --git a/component/admin/models/statistic_quotation.php b/component/admin/models/statistic_quotation.php new file mode 100644 index 00000000000..d5b477528ca --- /dev/null +++ b/component/admin/models/statistic_quotation.php @@ -0,0 +1,97 @@ +input; + $this->filterStartDate = $input->getString('filter_start_date', ''); + $this->filterEndDate = $input->getString('filter_end_date', ''); + $this->filterDateLabel = $input->getString('filter_date_label', ''); + } + + /** + * get Quotation data for statistic + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getQuotations() + { + $format = $this->getDateFormat(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('FROM_UNIXTIME(quotation_cdate,"' . $format . '") AS viewdate') + ->select('SUM(quotation_total) AS quotation_total') + ->select('COUNT(*) AS count') + ->from($db->qn('#__redshop_quotation')) + ->where($db->qn('quotation_status') . ' = 5') + ->order($db->qn('quotation_cdate') . ' DESC') + ->group($db->qn('viewdate')); + + if (!empty($this->filterStartDate) && !empty($this->filterEndDate)) + { + $query->where($db->qn('quotation_cdate') . ' > ' . $db->q(strtotime($this->filterStartDate))) + ->where($db->qn('quotation_cdate') . ' <= ' . $db->q(strtotime($this->filterEndDate) + 86400)); + } + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * get date Format for new statistic + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getDateFormat() + { + $return = ""; + $startDate = strtotime($this->filterStartDate); + $endDate = strtotime($this->filterEndDate); + $interval = $endDate - $startDate; + + if ($interval == 0 && ($this->filterDateLabel == 'Today' || $this->filterDateLabel == 'Yesterday')) + { + $return = "%d %b %Y"; + } + elseif ($interval <= 1209600) + { + $return = "%d %b. %Y"; + } + elseif ($interval <= 7689600) + { + $return = "%b. %Y"; + } + elseif ($interval <= 31536000) + { + $return = "%Y"; + } + + return $return; + } +} diff --git a/component/admin/models/statistic_variant.php b/component/admin/models/statistic_variant.php new file mode 100644 index 00000000000..ccb7024c124 --- /dev/null +++ b/component/admin/models/statistic_variant.php @@ -0,0 +1,148 @@ +input; + $this->filterStartDate = $input->getString('filter_start_date', ''); + $this->filterEndDate = $input->getString('filter_end_date', ''); + $this->filterDateLabel = $input->getString('filter_date_label', ''); + } + + /** + * get Product variants data for statistic + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getProductVariants() + { + $format = $this->getDateFormat(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('FROM_UNIXTIME(oi.cdate,"' . $format . '") AS viewdate') + ->select('oai.*') + ->select($db->qn('p.product_name')) + ->select($db->qn('p.product_id')) + ->select($db->qn('pap.property_number')) + ->from($db->qn('#__redshop_order_attribute_item', 'oai')) + ->leftjoin($db->qn('#__redshop_order_item', 'oi') . ' ON ' . $db->qn('oai.order_item_id') . ' = ' . $db->qn('oi.order_item_id')) + ->leftjoin($db->qn('#__redshop_product_attribute_property', 'pap') . ' ON ' . $db->qn('oai.section_id') . ' = ' . $db->qn('property_id')) + ->leftjoin($db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('oi.product_id') . ' = ' . $db->qn('p.product_id')) + ->where($db->qn('oai.section') . ' = ' . $db->q('property')) + ->order($db->qn('oi.order_item_id') . ' DESC,' . $db->qn('oai.parent_section_id') . ' ASC'); + + if (!empty($this->filterStartDate) && !empty($this->filterEndDate)) + { + $query->where($db->qn('p.publish_date') . ' > ' . $db->q(date('Y-m-d H:i:s', strtotime($this->filterStartDate)))) + ->where($db->qn('p.publish_date') . ' <= ' . $db->q(date('Y-m-d H:i:s', strtotime($this->filterEndDate) + 86400))); + } + + $variants = $db->setQuery($query)->loadObjectList(); + $data = array(); + $result = array(); + + foreach ($variants as $key => $variant) + { + $data[$variant->order_item_id]['attribute'][] = $variant->section_name; + $data[$variant->order_item_id]['attribute_sku'][] = $variant->property_number; + $data[$variant->order_item_id]['viewdate'] = $variant->viewdate; + $data[$variant->order_item_id]['product_name'] = $variant->product_name; + $data[$variant->order_item_id]['product_id'] = $variant->product_id; + } + + foreach ($data as $key => $value) + { + $result[$key]['product_attribute'] = implode(' - ', $value['attribute']); + $result[$key]['product_attribute_sku'] = implode(' - ', $value['attribute_sku']); + $result[$key]['viewdate'] = $value['viewdate']; + $result[$key]['product_name'] = $value['product_name']; + $result[$key]['product_id'] = $value['product_id']; + } + + $query = $db->getQuery(true) + ->select('SUM(product_final_price) AS total_sale') + ->select('COUNT(*) AS unit_sold') + ->select($db->qn('order_item_id')) + ->from($db->qn('#__redshop_order_item')) + ->where($db->qn('order_status') . ' = ' . $db->q('S')) + ->group($db->qn('order_item_id')); + + $items = $db->setQuery($query)->loadObjectList(); + + foreach ($result as $itemId => $value) + { + $result[$itemId]['unit_sold'] = 0; + $result[$itemId]['total_sale'] = 0; + + foreach ($items as $item) + { + if ($itemId == $item->order_item_id) + { + $result[$itemId]['unit_sold'] = $item->unit_sold; + $result[$itemId]['total_sale'] = $item->total_sale; + } + } + } + + return $result; + } + + /** + * get date Format for new statistic + * + * @return object. + * + * @since 2.0.0.3 + */ + public function getDateFormat() + { + $return = ""; + $startDate = strtotime($this->filterStartDate); + $endDate = strtotime($this->filterEndDate); + $interval = $endDate - $startDate; + + if ($interval == 0 && ($this->filterDateLabel == 'Today' || $this->filterDateLabel == 'Yesterday')) + { + $return = "%d %b %Y"; + } + elseif ($interval <= 1209600) + { + $return = "%d %b. %Y"; + } + elseif ($interval <= 7689600) + { + $return = "%b. %Y"; + } + elseif ($interval <= 31536000) + { + $return = "%Y"; + } + + return $return; + } +} diff --git a/component/admin/models/stockimage.php b/component/admin/models/stockimage.php new file mode 100644 index 00000000000..7ffdbe06774 --- /dev/null +++ b/component/admin/models/stockimage.php @@ -0,0 +1,124 @@ +_context = 'stock_amount_id'; + $this->_table_prefix = '#__redshop_'; + + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + $filter = $app->getUserStateFromRequest($this->_context . 'filter', 'filter', ''); + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + $this->setState('filter', $filter); + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $filter = $this->getState('filter'); + $orderby = $this->_buildOrderBy(); + + $where = ''; + + if ($filter) + { + $where = " WHERE si.stock_amount_image_tooltip LIKE '%" . $filter . "%' "; + } + + $query = "SELECT * FROM " . $this->_table_prefix . "stockroom_amount_image AS si " + . "LEFT JOIN " . $this->_table_prefix . "stockroom AS s ON s.stockroom_id=si.stockroom_id " + . $where + . $orderby; + + return $query; + } + + public function _buildOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'stock_amount_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } + + public function getStockAmountOption($select = 0) + { + $option = array(); + $option[] = JHTML::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $option[] = JHTML::_('select.option', 1, JText::_('COM_REDSHOP_HIGHER_THAN')); + $option[] = JHTML::_('select.option', 2, JText::_('COM_REDSHOP_EQUAL')); + $option[] = JHTML::_('select.option', 3, JText::_('COM_REDSHOP_LOWER_THAN')); + + if ($select != 0) + { + $option = $option[$select]->text; + } + + return $option; + } +} diff --git a/component/admin/models/stockimage_detail.php b/component/admin/models/stockimage_detail.php new file mode 100644 index 00000000000..f19417980c2 --- /dev/null +++ b/component/admin/models/stockimage_detail.php @@ -0,0 +1,180 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'stockroom_amount_image AS si ' + . 'WHERE stock_amount_id="' . $this->_id . '" '; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->stock_amount_id = 0; + $detail->stockroom_id = 0; + $detail->stock_option = null; + $detail->stock_quantity = 0; + $detail->stock_amount_image = null; + $detail->stock_amount_image_tooltip = null; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $row = $this->getTable('stockimage_detail'); + $file = JFactory::getApplication()->input->files->get('stock_amount_image', '', 'array'); + + if ($_FILES['stock_amount_image']['name'] != "") + { + $ext = explode(".", $file['name']); + $filetmpname = substr($file['name'], 0, strlen($file['name']) - strlen($ext[count($ext) - 1])); + + $filename = RedshopHelperMedia::cleanFileName($filetmpname . 'jpg'); + $row->stock_amount_image = $filename; + + $src = $file['tmp_name']; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . 'stockroom/' . $filename; + JFile::upload($src, $dest); + + if (isset($data['stock_image']) != "" && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'stockroom/' . $data['stock_image'])) + { + JFile::delete(REDSHOP_FRONT_IMAGES_RELPATH . 'stockroom/' . $data['stock_image']); + } + } + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + $query = 'SELECT stock_amount_image FROM ' . $this->_table_prefix . 'stockroom_amount_image AS si ' + . 'WHERE stock_amount_id="' . $cid[$i] . '" '; + $this->_db->setQuery($query); + $stock_amount_image = $this->_db->loadResult(); + + if ($stock_amount_image != "" && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'stockroom/' . $stock_amount_image)) + { + JFile::delete(REDSHOP_FRONT_IMAGES_RELPATH . 'stockroom/' . $stock_amount_image); + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'stockroom_amount_image ' + . 'WHERE stock_amount_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function getStockAmountOption($select = 0) + { + $option = array(); + $option[] = JHTML::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $option[] = JHTML::_('select.option', 1, JText::_('COM_REDSHOP_HIGHER_THAN')); + $option[] = JHTML::_('select.option', 2, JText::_('COM_REDSHOP_EQUAL')); + $option[] = JHTML::_('select.option', 3, JText::_('COM_REDSHOP_LOWER_THAN')); + + if ($select != 0) + { + $option = $option[$select]->text; + } + + return $option; + } + + public function getStockRoomList() + { + $query = 'SELECT s.stockroom_id AS value, s.stockroom_name AS text,s.* FROM ' . $this->_table_prefix . 'stockroom AS s '; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } +} diff --git a/component/admin/models/stockroom.php b/component/admin/models/stockroom.php new file mode 100644 index 00000000000..f1caa15e65a --- /dev/null +++ b/component/admin/models/stockroom.php @@ -0,0 +1,68 @@ +getState('filter'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'stockroom_id', $direction = '') + { + $filter = $this->getUserStateFromRequest($this->context . '.filter', 'filter', ''); + $this->setState('filter', $filter); + + parent::populateState($ordering, $direction); + } + + public function _buildQuery() + { + $filter = $this->getState('filter'); + $orderby = $this->_buildContentOrderBy(); + $where = ''; + + if ($filter) + { + $where = " WHERE stockroom_name like '%" . $filter . "%' "; + } + + $query = "SELECT distinct(s.stockroom_id),s.* FROM #__redshop_stockroom s" . $where . $orderby; + + return $query; + } +} diff --git a/component/admin/models/stockroom_detail.php b/component/admin/models/stockroom_detail.php new file mode 100644 index 00000000000..5dcc660c14c --- /dev/null +++ b/component/admin/models/stockroom_detail.php @@ -0,0 +1,235 @@ +_table_prefix = '#__redshop_'; + + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'stockroom WHERE stockroom_id = ' . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->stockroom_id = 0; + $detail->stockroom_name = null; + $detail->stockroom_desc = null; + $detail->creation_date = null; + $detail->min_del_time = 0; + $detail->max_del_time = 0; + $detail->min_stock_amount = 0; + $detail->show_in_front = 0; + $detail->delivery_time = 'Days'; + $detail->published = 1; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function store($data) + { + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $stockroom_id = $row->stockroom_id; + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query_product = 'DELETE FROM ' . $this->_table_prefix . 'product_stockroom_xref WHERE stockroom_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query_product); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + // Delete stock of products attribute stock + $query_product_attr = 'DELETE FROM ' . $this->_table_prefix . 'product_attribute_stockroom_xref WHERE stockroom_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query_product_attr); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + // Delete stockroom + $query = 'DELETE FROM ' . $this->_table_prefix . 'stockroom WHERE stockroom_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'stockroom' + . ' SET published = ' . intval($publish) + . ' WHERE stockroom_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function frontpublish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'stockroom' + . ' SET `show_in_front` = ' . intval($publish) + . ' WHERE stockroom_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function copy($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'SELECT * FROM ' . $this->_table_prefix . 'stockroom WHERE stockroom_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + $this->_copydata = $this->_db->loadObjectList(); + } + + foreach ($this->_copydata as $cdata) + { + $post['stockroom_id'] = 0; + $post['stockroom_name'] = $this->renameToUniqueValue('stockroom_name', $cdata->stockroom_name); + $post['stockroom_desc'] = $cdata->stockroom_desc; + $post['min_del_time'] = $cdata->min_del_time; + $post['max_del_time'] = $cdata->max_del_time; + $post['delivery_time'] = $cdata->delivery_time; + $post['show_in_front'] = $cdata->show_in_front; + $post['creation_date'] = time(); + $post['published'] = $cdata->published; + $this->store($post); + } + + return true; + } + + public function getStockRoomList() + { + $query = 'SELECT s.stockroom_id AS value, s.stockroom_name AS text,s.* FROM ' . $this->_table_prefix . 'stockroom AS s '; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } +} diff --git a/component/admin/models/stockroom_listing.php b/component/admin/models/stockroom_listing.php new file mode 100644 index 00000000000..175b6d968c0 --- /dev/null +++ b/component/admin/models/stockroom_listing.php @@ -0,0 +1,387 @@ +getState('stockroom_type'); + $id .= ':' . $this->getState('search_field'); + $id .= ':' . $this->getState('keyword'); + $id .= ':' . $this->getState('category_id'); + + return parent::getStoreId($id); + } + + /** + * Get the columns for the csv file. + * + * @return array An associative array of column names as key and the title as value. + */ + public function getCsvColumns() + { + return array( + 'stockroom_id' => JText::_('COM_REDSGOP_STOCKROOM_ID'), + 'stockroom_name' => JText::_('COM_REDSHOP_STOCKROOM_NAME'), + 'quantity' => JText::_('COM_REDSHOP_PRODUCT_QTY'), + 'preorder_stock' => JText::_('COM_REDSHOP_PREORDER_STOCKROOM_QTY'), + 'section_id' => JText::_('COM_REDSHOP_SECTION_ID'), + 'stockroom_type' => JText::_('COM_REDSHOP_SECTION_TYPE'), + 'product_id' => JText::_('COM_REDSHOP_PRODUCT_ID'), + 'product_number' => JText::_('COM_REDSHOP_PRODUCT_SKU'), + 'product_name' => JText::_('COM_REDSHOP_PRODUCT_NAME'), + ); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'p.product_id', $direction = '') + { + $stockroom_type = $this->getUserStateFromRequest($this->context . '.stockroom_type', 'stockroom_type', 'product'); + $search_field = $this->getUserStateFromRequest($this->context . '.search_field', 'search_field', 'product_name'); + $keyword = $this->getUserStateFromRequest($this->context . '.keyword', 'keyword', ''); + $category_id = $this->getUserStateFromRequest($this->context . '.category_id', 'category_id', 0); + + $this->setState('stockroom_type', $stockroom_type); + $this->setState('search_field', $search_field); + $this->setState('keyword', $keyword); + $this->setState('category_id', $category_id); + + parent::populateState($ordering, $direction); + } + + /** + * Method to get a JDatabaseQuery object for retrieving the data set from a database. + * + * @return JDatabaseQuery A JDatabaseQuery object to retrieve the data set. + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + + // Initialize query + $query = $db->getQuery(true) + ->select('p.product_number, p.product_name, p.product_id, p.product_price'); + + $keyword = $this->getState('keyword'); + + if (trim($keyword) != '') + { + $query->where($db->qn('p.' . $this->getState('search_field')) . ' LIKE ' . $db->q($keyword . '%')); + } + + $categoryId = $this->getState('category_id'); + + if ($categoryId > 0) + { + $query->where($db->qn('pcx.category_id') . ' = ' . (int) $categoryId); + } + + $stockroomType = $this->getState('stockroom_type'); + + if ($stockroomType == 'subproperty') + { + $query->select('asp.*, subattribute_color_id AS section_id') + ->from($db->qn('#__redshop_product_subattribute_color', 'asp')) + ->innerJoin( + $db->qn('#__redshop_product_attribute_property', 'ap') + . ' ON ' . $db->qn('asp.subattribute_id') . ' = ' . $db->qn('ap.property_id') + ) + ->innerJoin( + $db->qn('#__redshop_product_attribute', 'a') + . ' ON ' . $db->qn('a.attribute_id') . ' = ' . $db->qn('ap.attribute_id') + ) + ->innerJoin( + $db->qn('#__redshop_product', 'p') + . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('a.product_id') + ) + ->group($db->qn('asp.subattribute_color_id')); + } + elseif ($stockroomType == 'property') + { + $query->select('ap.*, property_id AS section_id') + ->from($db->qn('#__redshop_product_attribute_property', 'ap')) + ->innerJoin( + $db->qn('#__redshop_product_attribute', 'a') + . ' ON ' . $db->qn('a.attribute_id') . ' = ' . $db->qn('ap.attribute_id') + ) + ->innerJoin( + $db->qn('#__redshop_product', 'p') + . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('a.product_id') + ) + ->group($db->qn('ap.property_id')); + } + else + { + $query->from($db->qn('#__redshop_product', 'p')) + ->group($db->qn('p.product_id')); + } + + $query->leftjoin( + $db->qn('#__redshop_product_category_xref', 'pcx') + . ' ON ' . $db->qn('pcx.product_id') . '=' . $db->qn('p.product_id') + ); + + // Build ordering query + $filterOrder = $this->getState('list.ordering'); + + if ($stockroomType == 'subproperty') + { + $filterOrder = 'p.product_id, a.attribute_id, ap.property_id, asp.ordering'; + } + elseif ($stockroomType == 'property') + { + $filterOrder = 'p.product_id, a.attribute_id, ap.ordering'; + } + + $query->order($db->escape($filterOrder . ' ' . $this->getState('list.direction'))); + + return $query; + } + + /** + * Get stockrooms + * + * @return mixed + */ + public function getStockroom() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from('#__redshop_stockroom') + ->where('published = 1'); + + return $db->setQuery($query)->loadObjectlist(); + } + + /** + * Get quantity + * + * @param string $stockroom_type Stockroom type + * @param array $pids Sections ids + * + * @return mixed + */ + public function getQuantity($stockroom_type, $sid = '', $pids = array()) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*'); + + if ($stockroom_type != 'product') + { + $query->select('CONCAT_WS(' . $db->q('.') . ', sx.section_id, sx.stockroom_id) AS concat_id') + ->from($db->qn('#__redshop_product_attribute_stockroom_xref', 'sx')) + ->where('sx.section = ' . $db->q($stockroom_type)); + + if ($pids) + { + $query->where('sx.section_id IN (' . implode(',', (array) $pids) . ')'); + } + } + else + { + $query->select('CONCAT_WS(' . $db->q('.') . ', sx.product_id, sx.stockroom_id) AS concat_id') + ->from($db->qn('#__redshop_product_stockroom_xref', 'sx')); + + if ($pids) + { + $query->where('sx.product_id IN (' . implode(',', (array) $pids) . ')'); + } + } + + $query->leftJoin($db->qn('#__redshop_stockroom', 's') . ' ON s.stockroom_id = sx.stockroom_id') + ->where('s.published = 1'); + + if ($sid) + { + $query->where('s.stockroom_id = ' . $db->q($sid)); + } + + return $db->setQuery($query)->loadObjectlist('concat_id'); + } + + public function storeStockroomQuantity($stockroom_type, $sid, $pid, $quantity = "", $preorder_stock = 0, $ordered_preorder = 0) + { + $product = " AND product_id='" . $pid . "' "; + $section = ""; + $table = "product"; + + if ($stockroom_type != 'product') + { + $product = " AND section_id='" . $pid . "' "; + $section = " AND section = '" . $stockroom_type . "' "; + $table = "product_attribute"; + } + + $list = $this->getQuantity($stockroom_type, $sid, $pid); + $query = ""; + + if (count($list) > 0) + { + if ($quantity == "" && Redshop::getConfig()->get('USE_BLANK_AS_INFINITE')) + { + $query = "DELETE FROM #__redshop_" . $table . "_stockroom_xref " + . " WHERE stockroom_id='" . $sid . "' " . $product . $section; + } + else + { + if (($preorder_stock < $ordered_preorder) && $preorder_stock != "" && $ordered_preorder != "") + { + $msg = JText::_('COM_REDSHOP_PREORDER_STOCK_NOT_ALLOWED'); + JError::raiseWarning('', $msg); + + return false; + } + else + { + $query = "UPDATE #__redshop_" . $table . "_stockroom_xref " + . "SET quantity='" . $quantity . "' , preorder_stock= '" . $preorder_stock . "'" + . " WHERE stockroom_id='" . $sid . "'" + . $product . $section; + } + } + } + else + { + if ($preorder_stock < $ordered_preorder && $preorder_stock != "" && $ordered_preorder != "") + { + $msg = JText::_('COM_REDSHOP_PREORDER_STOCK_NOT_ALLOWED') . "for Stockroom "; + JError::raiseWarning('', $msg); + + return false; + } + else + { + if ($preorder_stock != "" || $quantity != "") + { + if ($quantity == "" && Redshop::getConfig()->get('USE_BLANK_AS_INFINITE')) + { + $query = ""; + } + else + { + if ($quantity == "") + { + $quantity = 0; + } + + if ($stockroom_type != 'product') + { + $query = "INSERT INTO #__redshop_" . $table . "_stockroom_xref " + . "(section_id, stockroom_id, quantity, section , preorder_stock, ordered_preorder) " + . "VALUES ('" . $pid . "', '" . $sid . "', '" . $quantity . "', '" . $stockroom_type . "', '" + . $preorder_stock . "','0') "; + } + else + { + $query = "INSERT INTO #__redshop_" . $table . "_stockroom_xref " + . "(product_id, stockroom_id, quantity, preorder_stock, ordered_preorder ) " + . "VALUES ('" . $pid . "', '" . $sid . "', '" . $quantity . "', '" . $preorder_stock . "','0' ) "; + } + } + } + } + } + + if ($query != "") + { + $this->_db->setQuery($query); + $this->_db->execute(); + + // For stockroom Notify Email + + $stockroom_data = array(); + $stockroom_data['section'] = $stockroom_type; + $stockroom_data['section_id'] = $pid; + $stockroom_data['regular_stock'] = $quantity; + $stockroom_data['preorder_stock'] = $preorder_stock; + JPluginHelper::importPlugin('redshop_product'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $dispatcher->trigger('onAfterUpdateStock', array($stockroom_data)); + } + } + + public function ResetPreOrderStockroomQuantity($stockroom_type, $sid, $pid) + { + $product = " AND product_id='" . $pid . "' "; + $section = ""; + $table = "product"; + + if ($stockroom_type != 'product') + { + $product = " AND section_id='" . $pid . "' "; + $section = " AND section = '" . $stockroom_type . "' "; + $table = "product_attribute"; + } + + $query = "UPDATE #__redshop_" . $table . "_stockroom_xref " + . "SET preorder_stock='0' , ordered_preorder= '0' " + . "WHERE stockroom_id='" . $sid . "'" + . $product . $section; + + if ($query != "") + { + $this->_db->setQuery($query); + $this->_db->execute(); + } + } +} diff --git a/component/admin/models/supplier.php b/component/admin/models/supplier.php new file mode 100644 index 00000000000..15a611a5d2d --- /dev/null +++ b/component/admin/models/supplier.php @@ -0,0 +1,50 @@ +getUserState('com_redshop.edit.supplier.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.supplier', $data); + + return $data; + } +} diff --git a/component/admin/models/suppliers.php b/component/admin/models/suppliers.php new file mode 100644 index 00000000000..9fb4f363f94 --- /dev/null +++ b/component/admin/models/suppliers.php @@ -0,0 +1,123 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('*') + ->from($db->qn('#__redshop_supplier')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('id') . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('name') . ' LIKE ' . $search); + } + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/tax_group.php b/component/admin/models/tax_group.php new file mode 100644 index 00000000000..dc331719988 --- /dev/null +++ b/component/admin/models/tax_group.php @@ -0,0 +1,21 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('tg.*') + ->from($db->qn('#__redshop_tax_group', 'tg')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('tg.id') . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('tg.name') . ' LIKE ' . $search); + } + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'tg.id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/tax_rate.php b/component/admin/models/tax_rate.php new file mode 100644 index 00000000000..338e48a567d --- /dev/null +++ b/component/admin/models/tax_rate.php @@ -0,0 +1,21 @@ +getState('filter.search'); + $id .= ':' . $this->getState('filter.country'); + $id .= ':' . $this->getState('filter.tax_group'); + $id .= ':' . $this->getState('filter.eu'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('t.*') + ->select($db->qn('c.country_name', 'country_name')) + ->select($db->qn('s.state_name', 'state_name')) + ->select($db->qn('g.name', 'tax_group_name')) + ->from($db->qn('#__redshop_tax_rate', 't')) + ->leftJoin($db->qn('#__redshop_country', 'c') . ' ON ' . $db->qn('t.tax_country') . ' = ' . $db->qn('c.country_3_code')) + ->leftJoin($db->qn('#__redshop_state', 's') . ' ON ' . $db->qn('t.tax_state') . ' = ' . $db->qn('s.state_3_code')) + ->leftJoin($db->qn('#__redshop_tax_group', 'g') . ' ON ' . $db->qn('t.tax_group_id') . ' = ' . $db->qn('g.id')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('t.id') . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('t.name') . ' LIKE ' . $search); + } + } + + // Filter: Country + $filterCountry = $this->getState('filter.country', ''); + + if ($filterCountry) + { + $query->where($db->qn('t.tax_country') . ' = ' . $db->quote($filterCountry)); + } + + // Filter: Country + $filterRaxGroup = (int) $this->getState('filter.tax_group', 0); + + if ($filterRaxGroup) + { + $query->where($db->qn('t.tax_group_id') . ' = ' . $filterRaxGroup); + } + + // Filter: EU + $filterEU = $this->getState('filter.eu', null); + + if (is_numeric($filterEU)) + { + $query->where($db->qn('t.is_eu_country') . ' = ' . (int) $filterEU); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 't.id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + $query->group($db->qn('t.id')); + + return $query; + } +} diff --git a/component/admin/models/template.php b/component/admin/models/template.php new file mode 100644 index 00000000000..eecbb420e63 --- /dev/null +++ b/component/admin/models/template.php @@ -0,0 +1,89 @@ +getValue('id'); + + if ($id) + { + $form->setFieldAttribute('section', 'readonly', true); + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + * + * @throws Exception + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $app = JFactory::getApplication(); + $data = $app->getUserState('com_redshop.edit.template.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.template', $data); + + return $data; + } +} diff --git a/component/admin/models/templates.php b/component/admin/models/templates.php new file mode 100644 index 00000000000..456f4cf715a --- /dev/null +++ b/component/admin/models/templates.php @@ -0,0 +1,127 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $section = $this->getUserStateFromRequest($this->context . '.filter.section', 'filter_section'); + $this->setState('filter.section', $section); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirementt. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.section'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('t.*') + ->from($db->qn('#__redshop_template', 't')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('t.name') . ' LIKE ' . $search); + } + + // Filter by search in name. + $filterSection = $this->getState('filter.section'); + + if (!empty($filterSection)) + { + $query->where($db->qn('t.section') . ' = ' . $db->q($filterSection)); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/text.php b/component/admin/models/text.php new file mode 100644 index 00000000000..8b0b7f622c5 --- /dev/null +++ b/component/admin/models/text.php @@ -0,0 +1,51 @@ +getUserState('com_redshop.edit.text.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.text', $data); + + return $data; + } +} diff --git a/component/admin/models/texts.php b/component/admin/models/texts.php new file mode 100644 index 00000000000..d0aaedb0a94 --- /dev/null +++ b/component/admin/models/texts.php @@ -0,0 +1,136 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $filterSection = $this->getUserStateFromRequest($this->context . '.filter.section', 'filter_section'); + $this->setState('filter.section', $filterSection); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 2.1.0 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + * + * @since 2.1.0 + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('*') + ->from($db->qn('#__redshop_textlibrary')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('id') . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('name') . ' LIKE ' . $search); + } + } + + // Filter by section + $filterSection = $this->getState('filter.section', null); + + if (!empty($filterSection)) + { + $query->where($db->qn('section') . ' = ' . $db->quote($filterSection)); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/tool_update.php b/component/admin/models/tool_update.php new file mode 100644 index 00000000000..0b2c4fcad8c --- /dev/null +++ b/component/admin/models/tool_update.php @@ -0,0 +1,32 @@ +input->get('user_id', 0, 'array'); + + $this->setId((int) $array[0]); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.5 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter'); + $id .= ':' . $this->getState('spgrp_filter'); + $id .= ':' . $this->getState('tax_exempt_request_filter'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = 'users_info_id', $direction = '') + { + $filter = $this->getUserStateFromRequest($this->context . '.filter', 'filter', ''); + $spgrp_filter = $this->getUserStateFromRequest($this->context . '.spgrp_filter', 'spgrp_filter', 0); + $tax_exempt_request_filter = $this->getUserStateFromRequest($this->context . '.tax_exempt_request_filter', 'tax_exempt_request_filter', 'select'); + + $this->setState('filter', $filter); + $this->setState('spgrp_filter', $spgrp_filter); + $this->setState('tax_exempt_request_filter', $tax_exempt_request_filter); + + parent::populateState($ordering, $direction); + } + + public function setId($id) + { + $this->_id = $id; + } + + public function _buildQuery() + { + $filter = $this->getState('filter'); + $spgrp_filter = $this->getState('spgrp_filter'); + $tax_exempt_request_filter = $this->getState('tax_exempt_request_filter'); + + $where = ''; + + if ($filter) + { + $filter = str_replace(' ', '', $filter); + $where .= " AND (u.username LIKE '%" . $filter . "%' "; + $where .= " OR (REPLACE(CONCAT(uf.firstname, uf.lastname), ' ', '') like '%" . $filter . "%'))"; + } + + if ($spgrp_filter) + { + $where .= " AND sp.shopper_group_id = '" . $spgrp_filter . "' "; + } + + if ($tax_exempt_request_filter != 'select') + { + $where .= " AND uf.tax_exempt='" . $tax_exempt_request_filter . "' " + . "AND tax_exempt_approved=0 "; + } + + $orderby = $this->_buildContentOrderBy(); + + if ($this->_id != 0) + { + $query = ' SELECT * FROM #__users AS u ' + . 'LEFT JOIN #__redshop_users_info AS uf ON u.id=uf.user_id ' + . 'LEFT JOIN #__redshop_shopper_group AS sp ON uf.shopper_group_id=sp.shopper_group_id ' + . 'WHERE uf.address_type="ST" ' + . 'AND uf.user_id="' . $this->_id . '" ' + . $where + . $orderby; + } + else + { + $query = ' SELECT uf.user_id, uf.*,u.username,u.name,sp.shopper_group_name ' + . 'FROM #__redshop_users_info AS uf ' + . 'LEFT JOIN #__users AS u ON u.id = uf.user_id ' + . 'LEFT JOIN #__redshop_shopper_group AS sp ON sp.shopper_group_id = uf.shopper_group_id ' + . 'WHERE uf.address_type="BT" ' + . $where + . $orderby; + } + + return $query; + } + + /** + * Customer Total sales + * + * @param integer $uid User Information id + * + * @deprecated 1.6 Use RedshopHelperUser::totalSales($uid) instead. + * @return float Total Sales of customer + */ + public function customertotalsales($uid) + { + return RedshopHelperUser::totalSales($uid); + } +} diff --git a/component/admin/models/user_detail.php b/component/admin/models/user_detail.php new file mode 100644 index 00000000000..8a2b190d357 --- /dev/null +++ b/component/admin/models/user_detail.php @@ -0,0 +1,400 @@ +_table_prefix = '#__redshop_'; + $this->_context = 'order_id'; + + $array = $app->input->get('cid', 0, 'array'); + $this->_uid = $app->input->get('user_id', 0); + + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $this->_uid = 0; + $query = 'SELECT * FROM ' . $this->_table_prefix . 'users_info AS uf ' + . 'LEFT JOIN #__users as u on u.id = uf.user_id ' + . 'WHERE users_info_id="' . $this->_id . '" '; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + if (isset($this->_data->user_id)) + { + $this->_uid = $this->_data->user_id; + } + + if (!empty($this->_data) && !$this->_data->email) + { + $this->_data->email = $this->_data->user_email; + } + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + $data = JFactory::getApplication()->getUserState('com_redshop.user_detail.data'); + + if (!empty($data)) + { + $this->_data = (object) $data; + + return (boolean) $this->_data; + } + elseif (empty($this->_data)) + { + $detail = new stdClass; + + $detail->users_info_id = 0; + $detail->user_id = 0; + $detail->id = 0; + $detail->gid = null; + $detail->name = null; + $detail->username = null; + $detail->email = null; + $detail->password = null; + $detail->usertype = null; + $detail->block = null; + $detail->sendEmail = null; + $detail->registerDate = null; + $detail->lastvisitDate = null; + $detail->activation = null; + $detail->is_company = null; + $detail->firstname = null; + $detail->lastname = null; + $detail->contact_info = null; + $detail->address_type = null; + $detail->company_name = null; + $detail->vat_number = null; + $detail->tax_exempt = 0; + $detail->country_code = null; + $detail->state_code = null; + $detail->shopper_group_id = null; + $detail->published = 1; + $detail->address = null; + $detail->city = null; + $detail->zipcode = null; + $detail->phone = null; + $detail->requesting_tax_exempt = 0; + $detail->tax_exempt_approved = 0; + $detail->approved = 1; + $detail->ean_number = null; + $detail->state_code_ST = null; + + $jinput = JFactory::getApplication()->input; + $info_id = $jinput->get('info_id', 0); + $shipping = $jinput->get('shipping', 0); + + if ($shipping) + { + $query = 'SELECT * FROM ' . $this->_table_prefix . 'users_info AS uf ' + . 'LEFT JOIN #__users as u on u.id = uf.user_id ' + . 'WHERE users_info_id="' . $info_id . '" '; + $this->_db->setQuery($query); + $bill_data = $this->_db->loadObject(); + + $detail->id = $detail->user_id = $this->_uid = $bill_data->user_id; + $detail->email = $bill_data->user_email; + $detail->is_company = $bill_data->is_company; + $detail->company_name = $bill_data->company_name; + $detail->vat_number = $bill_data->vat_number; + $detail->tax_exempt = $bill_data->tax_exempt; + $detail->shopper_group_id = $bill_data->shopper_group_id; + $detail->requesting_tax_exempt = $bill_data->requesting_tax_exempt; + $detail->tax_exempt_approved = $bill_data->tax_exempt_approved; + $detail->ean_number = $bill_data->ean_number; + } + + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function storeUser($post) + { + $post['createaccount'] = (isset($post['username']) && $post['username'] != "") ? 1 : 0; + $post['user_email'] = $post['email1'] = $post['email']; + + JFactory::getApplication()->input->post->set('password1', $post['password']); + + $post['billisship'] = 1; + + if ($post['createaccount']) + { + $joomlauser = RedshopHelperJoomla::createJoomlaUser($post); + } + else + { + $joomlauser = RedshopHelperJoomla::updateJoomlaUser($post); + } + + if (!$joomlauser) + { + return false; + } + + $reduser = RedshopHelperUser::storeRedshopUser($post, $joomlauser->id, 1); + + return $reduser; + } + + public function store($post) + { + $shipping = isset($post["shipping"]) ? true : false; + $post['createaccount'] = (isset($post['username']) && $post['username'] != "") ? 1 : 0; + $post['user_email'] = $post['email1'] = $post['email']; + + if ($post['user_id'] == 0 && ($post['password'] == '' || $post['password2'] == '')) + { + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', JText::_('COM_REDSHOP_PLEASE_ENTER_PASSWORD')); + + return false; + } + + if ($shipping) + { + $post['country_code_ST'] = $post['country_code']; + $post['state_code_ST'] = $post['state_code']; + $post['firstname_ST'] = $post['firstname']; + $post['lastname_ST'] = $post['lastname']; + $post['address_ST'] = $post['address']; + $post['city_ST'] = $post['city']; + $post['zipcode_ST'] = $post['zipcode']; + $post['phone_ST'] = $post['phone']; + + $reduser = RedshopHelperUser::storeRedshopUserShipping($post); + } + else + { + $post['billisship'] = 1; + $joomlauser = RedshopHelperJoomla::updateJoomlaUser($post); + + if (!$joomlauser) + { + return false; + } + + $reduser = RedshopHelperUser::storeRedshopUser($post, $joomlauser->id, 1); + } + + return $reduser; + } + + /** + * Delete redSHOP and Joomla! users + * + * @param array $cid Array of user ids + * @param bool $deleteJoomlaUsers Delete Joomla! users + * + * @return boolean + * + * @since version + */ + public function delete($cid = array(), $deleteJoomlaUsers = false) + { + if (count($cid)) + { + $db = JFactory::getDbo(); + $cids = implode(',', $cid); + + $queryDefault = $db->getQuery(true) + ->delete($db->qn('#__redshop_users_info')) + ->where($db->qn('users_info_id') . ' IN (' . $cids . ' )'); + + if ($deleteJoomlaUsers) + { + $queryAllUserIds = $db->getQuery(true) + ->select($db->qn('id')) + ->from($db->qn('#__users')); + $allUserIds = $db->setQuery($queryAllUserIds)->loadColumn(); + + $queryCustom = $db->getQuery(true) + ->select($db->qn('user_id')) + ->from($db->qn('#__redshop_users_info')) + ->where($db->qn('users_info_id') . ' IN (' . $cids . ' )') + ->where($db->qn('user_id') . ' IN (' . implode(',', $allUserIds) . ' )') + ->group($db->qn('user_id')); + + $joomlaUserIds = $db->setQuery($queryCustom)->loadColumn(); + + foreach ($joomlaUserIds as $joomlaUserId) + { + $joomlaUser = JFactory::getUser($joomlaUserId); + + // Skip this user whom in Super Administrator group. + if ($joomlaUser->authorise('core.admin')) + { + continue; + } + + $user = JFactory::getUser($joomlaUserId); + + if ($user->guest) + { + continue; + } + + if (!$user->delete()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $user->getError()); + + return false; + } + } + } + + $db->setQuery($queryDefault); + + if (!$db->execute()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'users_info ' + . 'SET approved=' . intval($publish) . ' ' + . 'WHERE user_id IN ( ' . $cids . ' ) '; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function validate_user($user, $uid) + { + $query = "SELECT username FROM #__users WHERE username='" . $user . "' AND id !=" . $uid; + $this->_db->setQuery($query); + $users = $this->_db->loadObjectList(); + + return count($users); + } + + public function validate_email($email, $uid) + { + $query = "SELECT email FROM #__users WHERE email = '" . $email . "' AND id !=" . $uid; + $this->_db->setQuery($query); + $emails = $this->_db->loadObjectList(); + + return count($emails); + } + + public function userOrders() + { + $query = $this->_buildUserorderQuery(); + $list = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + + return $list; + } + + public function _buildUserorderQuery() + { + $query = "SELECT * FROM `" . $this->_table_prefix . "orders` " + . "WHERE `user_id`='" . $this->_uid . "' " + . "ORDER BY order_id DESC "; + + return $query; + } + + public function getTotal() + { + if ($this->_id) + { + $query = $this->_buildUserorderQuery(); + $this->_total = $this->_getListCount($query); + + return $this->_total; + } + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } +} diff --git a/component/admin/models/voucher.php b/component/admin/models/voucher.php new file mode 100644 index 00000000000..03f8c05dccf --- /dev/null +++ b/component/admin/models/voucher.php @@ -0,0 +1,105 @@ +handleDateTimeRange($data['start_date'], $data['end_date']); + + if ($data['start_date'] > $data['end_date']) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_START_DATE_MUST_BE_SOONER_OR_EQUAL_TO_END_DATE')); + + return false; + } + + if (!empty($data['start_date'])) + { + $data['start_date'] = \JFactory::getDate($data['start_date'])->toSql(); + } + + if (!empty($data['end_date'])) + { + $data['end_date'] = \JFactory::getDate($data['end_date'])->toSql(); + } + + return parent::save($data); + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + * + * @throws Exception + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $app = JFactory::getApplication(); + $data = $app->getUserState('com_redshop.edit.voucher.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_redshop.voucher', $data); + + return $data; + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return JObject|boolean Object on success, false on failure. + * + * @since 2.1.0 + */ + public function getItem($pk = null) + { + $item = parent::getItem(); + + if (false === $item) + { + return false; + } + + $item->voucher_products = RedshopEntityVoucher::getInstance($item->id)->getProducts()->ids(); + $item->start_date = $item->start_date != JFactory::getDbo()->getNullDate() ? JFactory::getDate($item->start_date)->toUnix() : null; + $item->end_date = $item->end_date != JFactory::getDbo()->getNullDate() ? JFactory::getDate($item->end_date)->toUnix() : null; + + return $item; + } +} diff --git a/component/admin/models/vouchers.php b/component/admin/models/vouchers.php new file mode 100644 index 00000000000..4a690cee25d --- /dev/null +++ b/component/admin/models/vouchers.php @@ -0,0 +1,154 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $type = $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type'); + $this->setState('filter.type', $type); + + $freeShip = $this->getUserStateFromRequest($this->context . '.filter.free_ship', 'filter_free_ship'); + $this->setState('filter.free_ship', trim($freeShip)); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= $this->getState('filter.type'); + $id .= $this->getState('filter.free_ship'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + public function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('v.*') + ->from($db->qn('#__redshop_voucher', 'v')); + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn('v.id') . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->q('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where($db->qn('v.code') . ' LIKE ' . $search); + } + } + + // Filter: type + $filterType = $this->getState('filter.type', null); + + if (!empty($filterType)) + { + $query->where($db->qn('v.type') . ' = ' . $db->quote($filterType)); + } + + // Filter: type + $filterFreeShip = $this->getState('filter.free_ship'); + + if (is_numeric($filterFreeShip)) + { + $query->where($db->qn('v.free_ship') . ' = ' . (int) $filterFreeShip); + } + elseif ($filterFreeShip === '') + { + $query->where($db->qn('v.free_ship') . ' IN (0,1)'); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'v.id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/component/admin/models/wizard.php b/component/admin/models/wizard.php new file mode 100644 index 00000000000..84b48a9057a --- /dev/null +++ b/component/admin/models/wizard.php @@ -0,0 +1,68 @@ +getQuery(true); + $query->select( + $db->quoteName(array( + 'tax_group_id', + 'id', + 'tax_country', + 'tax_rate' + ) + ) + ); + $query->from($db->quoteName('#__redshop_tax_rate')); + $query->where($db->quoteName('tax_group_id') . '=' . 1); + + return $this->_getList($query); + } + + /* + * Get Shop Currency Support + * + * @params: string $currency comma separated countries + * @return: array stdClass Array for Shop country + * + * currency_code as value + * currency_name as text + */ + public function getCurrency($currency = "") + { + $db = JFactory::getDbo(); + + $where = ""; + + if ($currency) + { + $where = " WHERE code IN ('" . $currency . "')"; + } + + $query = 'SELECT code as value, name as text FROM #__redshop_currency' . $where . ' ORDER BY name ASC'; + $db->setQuery($query); + + return $db->loadObjectlist(); + } +} diff --git a/component/admin/models/wrapper.php b/component/admin/models/wrapper.php new file mode 100644 index 00000000000..1936bfd3878 --- /dev/null +++ b/component/admin/models/wrapper.php @@ -0,0 +1,124 @@ +_context = 'wrapper_id'; + + $this->_table_prefix = '#__redshop_'; + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + $filter = $app->getUserStateFromRequest($this->_context . 'filter', 'filter', ''); + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + $this->setState('filter', $filter); + + $product_id = JFactory::getApplication()->input->get('product_id'); + $this->setProductId((int) $product_id); + } + + public function setProductId($id) + { + $this->_productid = $id; + $this->_data = null; + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + $showall = $app->input->get('showall', '0'); + $and = ''; + + if ($showall && $this->_productid != 0) + { + $and = 'AND FIND_IN_SET(' . $this->_productid . ',w.product_id) OR wrapper_use_to_all = 1 '; + + $query = "SELECT * FROM " . $this->_table_prefix . "product_category_xref " + . "WHERE product_id = " . $this->_productid; + $cat = $this->_getList($query); + + for ($i = 0, $in = count($cat); $i < $in; $i++) + { + $and .= " OR FIND_IN_SET(" . $cat[$i]->category_id . ",category_id) "; + } + } + + $filter = $this->getState('filter'); + + if ($filter) + { + $and .= " AND w.wrapper_name LIKE '%" . $filter . "%' "; + } + + $query = 'SELECT distinct(w.wrapper_id), w.* FROM ' . $this->_table_prefix . 'wrapper AS w WHERE 1=1 ' + . $and; + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'wrapper_id'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $query .= ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $query; + } +} diff --git a/component/admin/models/wrapper_detail.php b/component/admin/models/wrapper_detail.php new file mode 100644 index 00000000000..0fd7fed5a1a --- /dev/null +++ b/component/admin/models/wrapper_detail.php @@ -0,0 +1,357 @@ +_table_prefix = '#__redshop_'; + + /** + * Only setup ID from cid if not add task + * TODO Refactor this form into right Joomla! standard + */ + $jinput = JFactory::getApplication()->input; + + if ($jinput->getCmd('task') != 'add') + { + $array = $jinput->getInt('cid', 0); + + // Set record Id from cid + $this->setId((is_array($array)) ? (int) $array[0] : $array); + } + else + { + $this->setId(0); + } + + $this->_sectionid = JRequest::getVar('product_id', 0, '', 'int'); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + if (empty($this->_data)) + { + $query = 'SELECT p.*, w.* ' + . 'FROM ' . $this->_table_prefix . 'wrapper as w ' + . 'LEFT JOIN ' . $this->_table_prefix . 'product as p ON p.product_id = w.product_id ' + . 'WHERE w.wrapper_id = ' . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + return true; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->wrapper_id = 0; + $detail->product_id = $this->_productid; + $detail->category_id = 0; + $detail->wrapper_price = 0.00; + $detail->wrapper_name = null; + $detail->wrapper_image = null; + $detail->published = 1; + $detail->wrapper_use_to_all = 0; + + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + public function getProductName($productid) + { + $q = 'SELECT product_name ' + . 'FROM ' . $this->_table_prefix . 'product ' + . 'WHERE product_id = ' . $productid; + $this->_db->setQuery($q); + $pname = $this->_db->loadResult(); + + return $pname; + } + + public function getProductInfo($productid = 0) + { + $query = 'SELECT product_name as text,product_id as value FROM ' . $this->_table_prefix . + 'product WHERE published = 1 and product_id in (' . $productid . ')'; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectList(); + + return $list; + } + + public function getCategoryName($categoryId) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('name')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('id') . ' = ' . $db->q((int) $categoryId)); + + return $db->setQuery($query)->loadResult(); + } + + public function getCategoryInfo($categoryId = 0) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_category')) + ->where($db->qn('level') . ' > 0'); + + if ($categoryId > 0) + { + $query->where($db->qn('id') . ' = ' . $db->q((int) $categoryId)); + } + + return $db->setQuery($query)->loadObjectList(); + } + + public function getProductInfowrapper($productid = 0) + { + if ($productid) + { + $query = 'SELECT product_name as text,product_id as value FROM ' . $this->_table_prefix + . 'product WHERE published = 1 and product_id in (' . $productid . ')'; + } + else + { + $query = 'SELECT product_name as text,product_id as value FROM ' . $this->_table_prefix . + 'product WHERE published = 1 and product_id =""'; + } + + $this->_db->setQuery($query); + $list = $this->_db->loadObjectList(); + + return $list; + } + + public function getMultiselectBox($name, $list, $sellist, $displayid, $displayname, $multiple = false) + { + $multiple = $multiple ? "multiple='multiple'" : ""; + $id = str_replace('[]', '', $name); + $html = ""; + + return $html; + } + + public function store($data) + { + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $jinput = JFactory::getApplication()->input; + $wrapperfile = $jinput->files->get('wrapper_image', '', 'array'); + $wrapperimg = ""; + + if ($wrapperfile['name'] != "") + { + $wrapperimg = RedshopHelperMedia::cleanFileName($wrapperfile['name']); + + $src = $wrapperfile['tmp_name']; + $dest = REDSHOP_FRONT_IMAGES_RELPATH . '/wrapper/' . $wrapperimg; + + if ($data['wrapper_name'] == "") + { + $data['wrapper_name'] = $wrapperimg; + } + + $row->wrapper_image = $wrapperimg; + JFile::upload($src, $dest); + } + + if ($row->wrapper_id) + { + $productobj = productHelper::getInstance(); + $wrapper = $productobj->getWrapper($row->product_id, $row->wrapper_id); + + if (count($wrapper) > 0 && $wrapperimg != "") + { + $unlink_path = REDSHOP_FRONT_IMAGES_RELPATH . 'wrapper/thumb/' . $wrapper[0]->wrapper_image; + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + + $unlink_path = REDSHOP_FRONT_IMAGES_RELPATH . 'wrapper/' . $wrapper[0]->wrapper_image; + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + } + } + + $categoryid = 0; + + if (count($jinput->get('categoryid')) > 0) + { + $categoryid = implode(",", $_POST['categoryid']); + } + + $row->category_id = $categoryid; + + $row->product_id = $data['container_product']; + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (isset($data['thumb_image_delete'])) + { + $row->product_thumb_image = ""; + $unlink_path = JPath::clean(REDSHOP_FRONT_IMAGES_RELPATH . 'wrapper/' . $data['old_thumb_image']); + + if (JFile::exists($unlink_path)) + { + JFile::delete($unlink_path); + } + } + + return $row; + } + + public function delete($cid = array()) + { + if (count($cid)) + { + $cids = implode(',', $cid); + $query = 'DELETE FROM ' . $this->_table_prefix . 'wrapper ' + . 'WHERE wrapper_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + /** + * Method to publish the records + * + * @access public + * @return boolean + */ + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = ' UPDATE ' . $this->_table_prefix . 'wrapper ' + . ' SET published = ' . intval($publish) + . ' WHERE wrapper_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function enable_defaultpublish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = ' UPDATE ' . $this->_table_prefix . 'wrapper ' + . ' SET wrapper_use_to_all = ' . intval($publish) + . ' WHERE wrapper_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/xmlexport.php b/component/admin/models/xmlexport.php new file mode 100644 index 00000000000..a77df11cad9 --- /dev/null +++ b/component/admin/models/xmlexport.php @@ -0,0 +1,105 @@ +_context = 'xmlexport_id'; + + $this->_table_prefix = '#__redshop_'; + + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function getProduct() + { + $query = "SELECT * FROM " . $this->_table_prefix . "xml_export "; + $list = $this->_data = $this->_getList($query); + + return $list; + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + + $query = "SELECT x.* FROM " . $this->_table_prefix . "xml_export AS x " + . "WHERE 1=1 " + . $orderby; + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'xmlexport_date'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', 'DESC'); + + $orderby = " ORDER BY " . $db->escape($filter_order . " " . $filter_order_Dir); + + return $orderby; + } +} diff --git a/component/admin/models/xmlexport_detail.php b/component/admin/models/xmlexport_detail.php new file mode 100644 index 00000000000..757c9e73c91 --- /dev/null +++ b/component/admin/models/xmlexport_detail.php @@ -0,0 +1,328 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + $query = "SELECT x.* FROM " . $this->_table_prefix . "xml_export AS x " + . "WHERE x.xmlexport_id=" . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->xmlexport_id = 0; + $detail->filename = null; + $detail->display_filename = null; + $detail->parent_name = null; + $detail->element_name = null; + $detail->section_type = null; + $detail->auto_sync = 0; + $detail->sync_on_request = 0; + $detail->auto_sync_interval = null; + $detail->xmlexport_filetag = null; + $detail->stock_element_name = null; + $detail->xmlexport_stocktag = null; + $detail->xmlexport_billingtag = null; + $detail->billing_element_name = null; + $detail->xmlexport_shippingtag = null; + $detail->shipping_element_name = null; + $detail->xmlexport_orderitemtag = null; + $detail->orderitem_element_name = null; + $detail->xmlexport_prdextrafieldtag = null; + $detail->prdextrafield_element_name = null; + $detail->published = 0; + $detail->use_to_all_users = 1; + $detail->xmlexport_on_category = null; + + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + /** + * Method to store the information + * + * @access public + * @return boolean + */ + public function store($data, $export = 0) + { + $xmlhelper = new xmlHelper; + + $data['xmlexport_on_category'] = @ implode(',', $data['xmlexport_on_category']); + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->xmlexport_on_category) + { + $row->xmlexport_on_category = ''; + } + + $row->published = $data['xmlpublished']; + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $xmlexport_ip_id = $data['xmlexport_ip_id']; + $access_ipaddress = $data['access_ipaddress']; + + for ($i = 0, $in = count($xmlexport_ip_id); $i < $in; $i++) + { + if ($access_ipaddress[$i] != "") + { + if ($xmlexport_ip_id[$i] != 0) + { + $query = "UPDATE " . $this->_table_prefix . "xml_export_ipaddress " + . "SET access_ipaddress='" . $access_ipaddress[$i] . "' " + . "WHERE xmlexport_ip_id='" . $xmlexport_ip_id[$i] . "' "; + } + else + { + $query = "INSERT INTO " . $this->_table_prefix . "xml_export_ipaddress " + . "(xmlexport_id, access_ipaddress) " + . "VALUES " + . "('" . $row->xmlexport_id . "', '" . $access_ipaddress[$i] . "') "; + } + + $this->_db->setQuery($query); + $this->_db->execute(); + } + } + + if ($export == 1) + { + $xmlhelper->writeXMLExportFile($row->xmlexport_id); + } + + return $row; + } + + /** + * Method to delete the records + * + * @access public + * @return boolean + */ + public function delete($cid = array()) + { + $xmlhelper = new xmlHelper; + + if (count($cid)) + { + $cids = implode(',', $cid); + + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + $result = $xmlhelper->getXMLExportInfo($cid[$i]); + $rootpath = JPATH_COMPONENT_SITE . "/assets/xmlfile/export/" . $result->filename; + + if (JFile::exists($rootpath)) + { + JFile::delete($rootpath); + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'xml_export_log ' + . 'WHERE xmlexport_id IN (' . $cids . ')'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'xml_export_ipaddress ' + . 'WHERE xmlexport_id IN (' . $cids . ')'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'xml_export ' + . 'WHERE xmlexport_id IN (' . $cids . ')'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function deleteIpAddress($xmlexport_ip_id = 0) + { + $query = 'DELETE FROM ' . $this->_table_prefix . 'xml_export_ipaddress ' + . 'WHERE xmlexport_ip_id IN (' . $xmlexport_ip_id . ')'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + public function auto_syncpublish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'xml_export ' + . ' SET auto_sync = ' . intval($publish) + . ' WHERE xmlexport_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function usetoallpublish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'xml_export ' + . ' SET use_to_all_users = ' . intval($publish) + . ' WHERE xmlexport_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + /** + * Method to publish the records + * + * @access public + * @return boolean + */ + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = ' UPDATE ' . $this->_table_prefix . 'xml_export ' + . ' SET published = ' . intval($publish) + . ' WHERE xmlexport_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + /** + * @return mixed + */ + public function getCategoryList() + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('id', 'value')) + ->select($db->qn('name', 'text')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('parent_id') . ' <> 0'); + + return $db->setQuery($query)->loadObjectList(); + } +} diff --git a/component/admin/models/xmlimport.php b/component/admin/models/xmlimport.php new file mode 100644 index 00000000000..3a27c70757a --- /dev/null +++ b/component/admin/models/xmlimport.php @@ -0,0 +1,105 @@ +_context = 'xmlimport_id'; + + $this->_table_prefix = '#__redshop_'; + + $limit = $app->getUserStateFromRequest($this->_context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($this->_context . 'limitstart', 'limitstart', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function getProduct() + { + $query = "SELECT * FROM " . $this->_table_prefix . "xml_import "; + $list = $this->_data = $this->_getList($query); + + return $list; + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + + $query = "SELECT x.* FROM " . $this->_table_prefix . "xml_import AS x " + . "WHERE 1=1 " + . $orderby; + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + + $filter_order = $app->getUserStateFromRequest($this->_context . 'filter_order', 'filter_order', 'xmlimport_date'); + $filter_order_Dir = $app->getUserStateFromRequest($this->_context . 'filter_order_Dir', 'filter_order_Dir', 'DESC'); + + $orderby = " ORDER BY " . $db->escape($filter_order . " " . $filter_order_Dir); + + return $orderby; + } +} diff --git a/component/admin/models/xmlimport_detail.php b/component/admin/models/xmlimport_detail.php new file mode 100644 index 00000000000..73fa9ed73db --- /dev/null +++ b/component/admin/models/xmlimport_detail.php @@ -0,0 +1,445 @@ +_table_prefix = '#__redshop_'; + $array = JFactory::getApplication()->input->get('cid', 0, 'array'); + $this->setId((int) $array[0]); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function &getData() + { + $post = JFactory::getApplication()->input->post->getArray(); + + if ($this->_loadData()) + { + } + else + { + $this->_initData(); + } + + if (isset($post['display_filename'])) + { + $this->_data->display_filename = $post['display_filename']; + } + + if (isset($post['auto_sync'])) + { + $this->_data->auto_sync = $post['auto_sync']; + } + + if (isset($post['sync_on_request'])) + { + $this->_data->sync_on_request = $post['sync_on_request']; + } + + if (isset($post['auto_sync_interval'])) + { + $this->_data->auto_sync_interval = $post['auto_sync_interval']; + } + + if (isset($post['xmlpublished'])) + { + $this->_data->published = $post['xmlpublished']; + } + + if (isset($post['override_existing'])) + { + $this->_data->override_existing = $post['override_existing']; + } + + if (isset($post['add_prefix_for_existing'])) + { + $this->_data->add_prefix_for_existing = $post['add_prefix_for_existing']; + } + + if (isset($post['element_name'])) + { + $this->_data->element_name = $post['element_name']; + } + + if (isset($post['billing_element_name'])) + { + $this->_data->billing_element_name = $post['billing_element_name']; + } + + if (isset($post['shipping_element_name'])) + { + $this->_data->shipping_element_name = $post['shipping_element_name']; + } + + if (isset($post['orderitem_element_name'])) + { + $this->_data->orderitem_element_name = $post['orderitem_element_name']; + } + + if (isset($post['stock_element_name'])) + { + $this->_data->stock_element_name = $post['stock_element_name']; + } + + if (isset($post['prdextrafield_element_name'])) + { + $this->_data->prdextrafield_element_name = $post['prdextrafield_element_name']; + } + + return $this->_data; + } + + public function _loadData() + { + $query = "SELECT x.* FROM " . $this->_table_prefix . "xml_import AS x " + . "WHERE x.xmlimport_id=" . $this->_id; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObject(); + + return (boolean) $this->_data; + } + + public function getXMLImporturl() + { + return $this->_data->xmlimport_url; + } + + public function updateFile() + { + $jinput = JFactory::getApplication()->input; + $post = $jinput->post->getArray(); + + $xmlimport_url = $this->_data->xmlimport_url; + $file = $jinput->files->get('filename_url', '', 'array'); + + if (array_key_exists("xmlimport_url", $post) && $post["xmlimport_url"] != "") + { + $xmlimport_url = $post['xmlimport_url']; + $this->_data->xmlimport_url = $post['xmlimport_url']; + } + elseif (array_key_exists("name", $file) && $file['name'] != "" && $file['type'] == "text/xml") + { + $src = $file['tmp_name']; + $destpath = JPATH_COMPONENT_SITE . "/assets/xmlfile/import"; + + $filename = JPath::clean($file['name']); + $dest = $destpath . '/' . $filename; + + JFile::upload($src, $dest); + $xmlimport_url = $dest; + } + + elseif ($this->_data->filename != "" && JFile::exists(JPATH_COMPONENT_SITE . '/assets/xmlfile/import/' . $this->_data->filename)) + { + $xmlimport_url = JPATH_COMPONENT_SITE . '/assets/xmlfile/import/' . $this->_data->filename; + } + + return $xmlimport_url; + } + + public function _initData() + { + if (empty($this->_data)) + { + $detail = new stdClass; + $detail->xmlimport_id = 0; + $detail->filename = null; + $detail->display_filename = null; + $detail->xmlimport_url = null; + $detail->section_type = null; + $detail->auto_sync = 0; + $detail->sync_on_request = 0; + $detail->element_name = null; + $detail->billing_element_name = null; + $detail->shipping_element_name = null; + $detail->orderitem_element_name = null; + $detail->stock_element_name = null; + $detail->prdextrafield_element_name = null; + $detail->auto_sync_interval = null; + $detail->override_existing = 0; + $detail->add_prefix_for_existing = null; + $detail->xmlimport_filetag = null; + $detail->xmlimport_billingtag = null; + $detail->xmlimport_shippingtag = null; + $detail->xmlimport_orderitemtag = null; + $detail->xmlimport_stocktag = null; + $detail->xmlimport_prdextrafieldtag = null; + $detail->published = 0; + $this->_data = $detail; + + return (boolean) $this->_data; + } + + return true; + } + + /** + * Method to store the information + * + * @access public + * @return boolean + */ + public function store($data, $import = 0) + { + $xmlhelper = new xmlHelper; + $resarray = array(); + + if (array_key_exists("xmlfiletag", $data)) + { + $xmlfiletag = $data['xmlfiletag']; + $updatefiletag = (isset($data['updatefiletag'])) ? $data['updatefiletag'] : array(); + + for ($i = 0, $in = count($xmlfiletag); $i < $in; $i++) + { + $xmltag = trim($data[$xmlfiletag[$i]]); + $updatetag = (isset($updatefiletag[$i]) && $updatefiletag[$i] == 1) ? 1 : 0; + $resarray[] = $xmlfiletag[$i] . "=" . $xmltag . "=" . $updatetag; + } + } + + $data['xmlimport_filetag'] = implode(";", $resarray); + + $resarray = array(); + + if (array_key_exists("xmlbillingtag", $data)) + { + $xmlfiletag = $data['xmlbillingtag']; + $updatefiletag = (isset($data['updatebillingtag'])) ? $data['updatebillingtag'] : array(); + + for ($i = 0, $in = count($xmlfiletag); $i < $in; $i++) + { + $xmltag = trim($data["bill_" . $xmlfiletag[$i]]); + $updatetag = (isset($updatefiletag[$i]) && $updatefiletag[$i] == 1) ? 1 : 0; + $resarray[] = $xmlfiletag[$i] . "=" . $xmltag . "=" . $updatetag; + } + } + + $data['xmlimport_billingtag'] = implode(";", $resarray); + + $resarray = array(); + + if (array_key_exists("xmlshippingtag", $data)) + { + $xmlfiletag = $data['xmlshippingtag']; + $updatefiletag = (isset($data['updateshippingtag'])) ? $data['updateshippingtag'] : array(); + + for ($i = 0, $in = count($xmlfiletag); $i < $in; $i++) + { + $xmltag = trim($data["shipp_" . $xmlfiletag[$i]]); + $updatetag = (isset($updatefiletag[$i]) && $updatefiletag[$i] == 1) ? 1 : 0; + $resarray[] = $xmlfiletag[$i] . "=" . $xmltag . "=" . $updatetag; + } + } + + $data['xmlimport_shippingtag'] = implode(";", $resarray); + + $resarray = array(); + + if (array_key_exists("xmlitemtag", $data)) + { + $xmlfiletag = $data['xmlitemtag']; + $updatefiletag = (isset($data['updateitemtag'])) ? $data['updateitemtag'] : array(); + + for ($i = 0, $in = count($xmlfiletag); $i < $in; $i++) + { + $xmltag = trim($data["item_" . $xmlfiletag[$i]]); + $updatetag = (isset($updatefiletag[$i]) && $updatefiletag[$i] == 1) ? 1 : 0; + $resarray[] = $xmlfiletag[$i] . "=" . $xmltag . "=" . $updatetag; + } + } + + $data['xmlimport_orderitemtag'] = implode(";", $resarray); + + $resarray = array(); + + if (array_key_exists("xmlstocktag", $data)) + { + $xmlfiletag = $data['xmlstocktag']; + $updatefiletag = (isset($data['updatestocktag'])) ? $data['updatestocktag'] : array(); + + for ($i = 0, $in = count($xmlfiletag); $i < $in; $i++) + { + $xmltag = trim($data["stock_" . $xmlfiletag[$i]]); + $updatetag = (isset($updatefiletag[$i]) && $updatefiletag[$i] == 1) ? 1 : 0; + $resarray[] = $xmlfiletag[$i] . "=" . $xmltag . "=" . $updatetag; + } + } + + $data['xmlimport_stocktag'] = implode(";", $resarray); + + $resarray = array(); + + if (array_key_exists("xmlprdextrafieldtag", $data)) + { + $xmlfiletag = $data['xmlprdextrafieldtag']; + $updatefiletag = (isset($data['updateprdexttag'])) ? $data['updateprdexttag'] : array(); + + for ($i = 0, $in = count($xmlfiletag); $i < $in; $i++) + { + $xmltag = trim($data["prdext_" . $xmlfiletag[$i]]); + $updatetag = (isset($updatefiletag[$i]) && $updatefiletag[$i] == 1) ? 1 : 0; + $resarray[] = $xmlfiletag[$i] . "=" . $xmltag . "=" . $updatetag; + } + } + + $data['xmlimport_prdextrafieldtag'] = implode(";", $resarray); + + if ($data['override_existing'] == 0 && trim($data['add_prefix_for_existing']) == "") + { + $data['add_prefix_for_existing'] = "xml_"; + } + + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $row->published = $data['xmlpublished']; + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $xmlhelper->writeXMLImportFile($row->xmlimport_id, $data['tmpxmlimport_url']); + + if ($import == 1) + { + $xmlhelper->importXMLFile($row->xmlimport_id); + } + + return $row; + } + + /** + * Method to delete the records + * + * @access public + * @return boolean + */ + public function delete($cid = array()) + { + $xmlhelper = new xmlHelper; + + if (count($cid)) + { + $cids = implode(',', $cid); + + for ($i = 0, $in = count($cid); $i < $in; $i++) + { + $result = $xmlhelper->getXMLImportInfo($cid[$i]); + $rootpath = JPATH_COMPONENT_SITE . "/assets/xmlfile/import/" . $result->filename; + + if (JFile::exists($rootpath)) + { + JFile::delete($rootpath); + } + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'xml_import_log ' + . 'WHERE xmlimport_id IN (' . $cids . ')'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $query = 'DELETE FROM ' . $this->_table_prefix . 'xml_import ' + . 'WHERE xmlimport_id IN (' . $cids . ')'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + public function auto_syncpublish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = 'UPDATE ' . $this->_table_prefix . 'xml_import ' + . ' SET auto_sync = ' . intval($publish) + . ' WHERE xmlimport_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } + + /** + * Method to publish the records + * + * @access public + * @return boolean + */ + public function publish($cid = array(), $publish = 1) + { + if (count($cid)) + { + $cids = implode(',', $cid); + + $query = ' UPDATE ' . $this->_table_prefix . 'xml_import ' + . ' SET published = ' . intval($publish) + . ' WHERE xmlimport_id IN ( ' . $cids . ' )'; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/models/zip_import.php b/component/admin/models/zip_import.php new file mode 100644 index 00000000000..8b37877964b --- /dev/null +++ b/component/admin/models/zip_import.php @@ -0,0 +1,249 @@ +getzipfilenames(); + + $this->install(); + session_unregister("filename"); + session_unregister("zipno"); + $msg = JText::_('COM_REDSHOP_REDSHOP_REMOTLY_UPDATED'); + $app->redirect(JURI::base() . 'index.php?option=com_redshop', $msg); + } + + public function getzipfilescount() + { + $url = Redshop::getConfig()->get('REMOTE_UPDATE_DOMAIN_URL') . "index.php?option=com_reviews&domainname=" . JUri::getInstance()->toString(array('host')); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1"); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_ENCODING, ""); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_AUTOREFERER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + $content = curl_exec($ch); + preg_match_all("#(.*?)#is", $content, $out); + $content = trim($out[0][0]); + $response = curl_getinfo($ch); + print_r($response); + JFactory::getApplication()->close(); + curl_close($ch); + $x = count(explode(",", $content)); + + return $x; + } + + public function getzipfilenames() + { + $user = JFactory::getUser(); + $url = Redshop::getConfig()->get('REMOTE_UPDATE_DOMAIN_URL') . "index.php?option=com_remoteupdate&view=getcomponent&redusername=" . + $user->username . "&reddomain=" . JURI::base() . ""; + + $ch = curl_init(); + + // Set curl to return the data instead of printing it to the browser. + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + + // Set the URL + curl_setopt($ch, CURLOPT_URL, $url); + + // Execute the fetch + $data = curl_exec($ch); + + // Close the connection + curl_close($ch); + ob_clean(); + $fp = fopen(JPATH_ROOT . '/tmp/com_jcomments_new.zip', 'w'); + fwrite($fp, $data); + fclose($fp); + + $filename = JURI::base() . '/tmp/com_jcomments_new.zip'; + $_SESSION['filename'][0] = $filename; + } + + // Related product sync + public function install() + { + $app = JFactory::getApplication(); + $fileType = "url"; + + switch ($fileType) + { + case 'url': + $package = $this->_getPackageFromUrl(); + break; + + default: + $this->setState('message', 'No Install Type Found'); + + return false; + break; + } + + // Was the package unpacked? + if (!$package) + { + $this->setState('message', 'Unable to find install package'); + $msg = JText::_('COM_REDSHOP_REDSHOP_REMOTELY_UPDATED'); + $app->redirect(JURI::base() . "index.php?option=com_redshop", $msg); + } + + // Get an installer instance + $installer = JInstaller::getInstance(); + + // Install the package + if (!$installer->install($package['dir'])) + { + ?> + + redirect(JURI::base() . "index.php?option=com_redshop", $msg); + } + + // Set some model state values + $app->enqueueMessage($msg); + $this->setState('name', $installer->get('name')); + $this->setState('result', $result); + $this->setState('message', $installer->message); + $this->setState('extension.message', $installer->get('extension.message')); + + // Cleanup the install files + if (!JFile::exists($package['packagefile'])) + { + $config = JFactory::getConfig(); + $package['packagefile'] = $config->get('tmp_path') . '/' . $package['packagefile']; + } + + JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']); + ?> + + + + + + get('tmp_path'); + + // Unpack the downloaded package file + $package = JInstallerHelper::unpack($tmp_dest . '/' . $p_file); + + ?> + + input->getString('install_directory'); + $p_dir = JPath::clean($p_dir); + + // Did you give us a valid directory? + if (!is_dir($p_dir)) + { + JError::raiseWarning('SOME_ERROR_CODE', JText::_('COM_REDSHOP_PLEASE_ENTER_A_PACKAGE_DIRECTORY')); + + return false; + } + + // Detect the package type + $type = JInstallerHelper::detectType($p_dir); + + // Did you give us a valid package? + if (!$type) + { + JError::raiseWarning('SOME_ERROR_CODE', JText::_('COM_REDSHOP_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE')); + + return false; + } + + $package['packagefile'] = null; + $package['extractdir'] = null; + $package['dir'] = $p_dir; + $package['type'] = $type; + + return $package; + } +} diff --git a/component/admin/models/zipcode.php b/component/admin/models/zipcode.php new file mode 100644 index 00000000000..4fbebf67d5c --- /dev/null +++ b/component/admin/models/zipcode.php @@ -0,0 +1,62 @@ +getTable('Zipcode'); + + if ($data['zipcodeto'] && ($data['zipcode'] > $data['zipcodeto'])) + { + return false; + } + + if (!$data['zipcodeto']) + { + $data['zipcodeto'] = $data['zipcode']; + } + + for ($i = $data['zipcode']; $i <= $data['zipcodeto']; $i++) + { + $data['zipcode'] = is_numeric($data['zipcode']) ? $i : $data['zipcode']; + + if (!$table->bind($data) || !$table->docheck()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_ZIPCODE_ALREADY_EXISTS') . ": " . $data['zipcode']); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', /** @scrutinizer ignore-deprecated */ $this->getError()); + + continue; + } + + parent::save($data); + } + + return true; + } +} diff --git a/component/admin/models/zipcodes.php b/component/admin/models/zipcodes.php new file mode 100644 index 00000000000..02e86cf573d --- /dev/null +++ b/component/admin/models/zipcodes.php @@ -0,0 +1,155 @@ +getUserStateFromRequest($this->context . '.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $countryId = $this->getUserStateFromRequest($this->context . '.filter.country_id', 'filter_country_id'); + $this->setState('filter.country_id', $countryId); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since __DEPLOY_VERSION__ + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.country_id'); + + return parent::getStoreId($id); + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + */ + protected function getListQuery() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select( + $db->qn( + [ + 'z.id', + 'z.country_code', + 'z.state_code', + 'z.city_name', + 'z.zipcode', + 'z.zipcodeto', + 'c.country_name', + 's.state_name', + ] + ) + ) + ->from($db->qn('#__redshop_zipcode', 'z')) + ->leftJoin($db->qn('#__redshop_country', 'c') . ' ON ' . $db->qn('z.country_code') . ' = ' . $db->qn('c.country_3_code')) + ->leftJoin( + $db->qn('#__redshop_state', 's') + . ' ON ' . $db->qn('z.state_code') . ' = ' . $db->qn('s.state_2_code') + . ' AND ' . $db->qn('c.id') . ' = ' . $db->qn('s.country_id') + ); + + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + $query->where( + '(' . $db->qn('z.zipcode') . ' LIKE ' . $db->q($search) . + ' OR ' . $db->qn('z.city_name') . ' LIKE ' . $db->q('%' . $search . '%') . + ' OR ' . $db->qn('c.country_name') . 'LIKE' . $db->q('%' . $search . '%') + . ')' + ); + } + + $countryId = $this->getState('filter.country_id'); + + if (!empty($countryId)) + { + $query->where($db->qn('s.country_id') . ' = ' . $db->q($countryId)); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'z.id'); + $orderDirn = $this->state->get('list.direction', 'asc'); + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} \ No newline at end of file diff --git a/component/admin/redshop.php b/component/admin/redshop.php new file mode 100644 index 00000000000..71efb08a7eb --- /dev/null +++ b/component/admin/redshop.php @@ -0,0 +1,126 @@ +isExists() && $app->input->getCmd('view') != 'install') +{ + $controller = 'redshop'; + JFactory::getApplication()->input->set('view', 'redshop'); + JFactory::getApplication()->input->set('layout', 'noconfig'); +} + +$redHelper = redhelper::getInstance(); +Redshop\Shipping\Rate::removeShippingRate(); +$json = JFactory::getApplication()->input->get('json'); + +$view = JFactory::getApplication()->input->getCmd('view', ''); +$user = JFactory::getUser(); +$userType = array_keys($user->groups); +$user->usertype = $userType[0]; +$user->gid = $user->groups[$user->usertype]; + +if (!$user->authorise('core.manage', 'com_redshop') && !$json) +{ + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + + return false; +} + +$isWizard = JFactory::getApplication()->input->getInt('wizard', 0); +$step = JFactory::getApplication()->input->get('step', ''); + +// Initialize wizard +if ($isWizard || $step != '') +{ + if ($user->gid != 8 && !$user->authorise('core.manage', 'com_redshop')) + { + throw new Exception('COM_REDSHOP_DONT_HAVE_PERMISSION'); + } + + JFactory::getApplication()->input->set('view', 'wizard'); + + require_once JPATH_COMPONENT . '/helpers/wizard/wizard.php'; + $redSHOPWizard = new redSHOPWizard; + $redSHOPWizard->initialize(); + + return true; +} + +$view = $app->input->get('view', 'redshop'); + +$user = JFactory::getUser(); +$task = JFactory::getApplication()->input->getCmd('task', ''); +$layout = JFactory::getApplication()->input->getCmd('layout', ''); +$showButtons = JFactory::getApplication()->input->getInt('showbuttons', 0); +$showAll = JFactory::getApplication()->input->getInt('showall', 0); + +// Check for array format. +$filter = JFilterInput::getInstance(); + +if (is_array($task)) +{ + $command = $filter->clean(array_pop(array_keys($task)), 'cmd'); +} +else +{ + $command = $filter->clean($task, 'cmd'); +} + +// Check for a not controller.task command. +if ($command != '' && strpos($command, '.') === false) +{ + JFactory::getApplication()->input->set('task', $view . '.' . $command); + $task = $command; +} +elseif ($command != '' && strpos($command, '.') !== false) +{ + $commands = explode('.', $command); + $view = $commands[0]; + $task = $commands[1]; +} + +// Set the controller page +if (!file_exists(JPATH_COMPONENT . '/controllers/' . $view . '.php')) +{ + $view = 'redshop'; + JFactory::getApplication()->input->set('view', $view); +} + +RedshopHelperConfig::script('SITE_URL', JURI::root()); +RedshopHelperConfig::script('REDCURRENCY_SYMBOL', Redshop::getConfig()->get('REDCURRENCY_SYMBOL')); +RedshopHelperConfig::script('PRICE_SEPERATOR', Redshop::getConfig()->get('PRICE_SEPERATOR')); +RedshopHelperConfig::script('CURRENCY_SYMBOL_POSITION', Redshop::getConfig()->get('CURRENCY_SYMBOL_POSITION')); +RedshopHelperConfig::script('PRICE_DECIMAL', Redshop::getConfig()->get('PRICE_DECIMAL')); +RedshopHelperConfig::script('THOUSAND_SEPERATOR', Redshop::getConfig()->get('THOUSAND_SEPERATOR')); +RedshopHelperConfig::script('VAT_RATE_AFTER_DISCOUNT', Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')); +JText::script('COM_REDSHOP_IS_REQUIRED'); + +// Execute the task. +$controller = JControllerLegacy::getInstance('Redshop'); + +$task = JFactory::getApplication()->input->getCmd('task', ''); + +$controller->execute($task); +$controller->redirect(); diff --git a/component/admin/sql/index.html b/component/admin/sql/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/sql/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/sql/install/index.html b/component/admin/sql/install/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/sql/install/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/sql/install/mysql/data.sql b/component/admin/sql/install/mysql/data.sql new file mode 100644 index 00000000000..caeef9285c0 --- /dev/null +++ b/component/admin/sql/install/mysql/data.sql @@ -0,0 +1,970 @@ +INSERT IGNORE INTO `#__redshop_country` (`id`, `country_name`, `country_3_code`, `country_2_code`) VALUES + (1, 'Afghanistan', 'AFG', 'AF'), + (2, 'Albania', 'ALB', 'AL'), + (3, 'Algeria', 'DZA', 'DZ'), + (4, 'American Samoa', 'ASM', 'AS'), + (5, 'Andorra', 'AND', 'AD'), + (6, 'Angola', 'AGO', 'AO'), + (7, 'Anguilla', 'AIA', 'AI'), + (8, 'Antarctica', 'ATA', 'AQ'), + (9, 'Antigua and Barbuda', 'ATG', 'AG'), + (10, 'Argentina', 'ARG', 'AR'), + (11, 'Armenia', 'ARM', 'AM'), + (12, 'Aruba', 'ABW', 'AW'), + (13, 'Australia', 'AUS', 'AU'), + (14, 'Austria', 'AUT', 'AT'), + (15, 'Azerbaijan', 'AZE', 'AZ'), + (16, 'Bahamas', 'BHS', 'BS'), + (17, 'Bahrain', 'BHR', 'BH'), + (18, 'Bangladesh', 'BGD', 'BD'), + (19, 'Barbados', 'BRB', 'BB'), + (20, 'Belarus', 'BLR', 'BY'), + (21, 'Belgium', 'BEL', 'BE'), + (22, 'Belize', 'BLZ', 'BZ'), + (23, 'Benin', 'BEN', 'BJ'), + (24, 'Bermuda', 'BMU', 'BM'), + (25, 'Bhutan', 'BTN', 'BT'), + (26, 'Bolivia', 'BOL', 'BO'), + (27, 'Bosnia and Herzegowina', 'BIH', 'BA'), + (28, 'Botswana', 'BWA', 'BW'), + (29, 'Bouvet Island', 'BVT', 'BV'), + (30, 'Brazil', 'BRA', 'BR'), + (31, 'British Indian Ocean Territory', 'IOT', 'IO'), + (32, 'Brunei Darussalam', 'BRN', 'BN'), + (33, 'Bulgaria', 'BGR', 'BG'), + (34, 'Burkina Faso', 'BFA', 'BF'), + (35, 'Burundi', 'BDI', 'BI'), + (36, 'Cambodia', 'KHM', 'KH'), + (37, 'Cameroon', 'CMR', 'CM'), + (38, 'Canada', 'CAN', 'CA'), + (39, 'Cape Verde', 'CPV', 'CV'), + (40, 'Cayman Islands', 'CYM', 'KY'), + (41, 'Central African Republic', 'CAF', 'CF'), + (42, 'Chad', 'TCD', 'TD'), + (43, 'Chile', 'CHL', 'CL'), + (44, 'China', 'CHN', 'CN'), + (45, 'Christmas Island', 'CXR', 'CX'), + (46, 'Cocos (Keeling) Islands', 'CCK', 'CC'), + (47, 'Colombia', 'COL', 'CO'), + (48, 'Comoros', 'COM', 'KM'), + (49, 'Congo', 'COG', 'CG'), + (50, 'Cook Islands', 'COK', 'CK'), + (51, 'Costa Rica', 'CRI', 'CR'), + (52, 'Cote D''Ivoire', 'CIV', 'CI'), + (53, 'Croatia', 'HRV', 'HR'), + (54, 'Cuba', 'CUB', 'CU'), + (55, 'Cyprus', 'CYP', 'CY'), + (56, 'Czech Republic', 'CZE', 'CZ'), + (57, 'Denmark', 'DNK', 'DK'), + (58, 'Djibouti', 'DJI', 'DJ'), + (59, 'Dominica', 'DMA', 'DM'), + (60, 'Dominican Republic', 'DOM', 'DO'), + (62, 'Ecuador', 'ECU', 'EC'), + (63, 'Egypt', 'EGY', 'EG'), + (64, 'El Salvador', 'SLV', 'SV'), + (65, 'Equatorial Guinea', 'GNQ', 'GQ'), + (66, 'Eritrea', 'ERI', 'ER'), + (67, 'Estonia', 'EST', 'EE'), + (68, 'Ethiopia', 'ETH', 'ET'), + (69, 'Falkland Islands (Malvinas)', 'FLK', 'FK'), + (70, 'Faroe Islands', 'FRO', 'FO'), + (71, 'Fiji', 'FJI', 'FJ'), + (72, 'Finland', 'FIN', 'FI'), + (73, 'France', 'FRA', 'FR'), + (75, 'French Guiana', 'GUF', 'GF'), + (76, 'French Polynesia', 'PYF', 'PF'), + (77, 'French Southern Territories', 'ATF', 'TF'), + (78, 'Gabon', 'GAB', 'GA'), + (79, 'Gambia', 'GMB', 'GM'), + (80, 'Georgia', 'GEO', 'GE'), + (81, 'Germany', 'DEU', 'DE'), + (82, 'Ghana', 'GHA', 'GH'), + (83, 'Gibraltar', 'GIB', 'GI'), + (84, 'Greece', 'GRC', 'GR'), + (85, 'Greenland', 'GRL', 'GL'), + (86, 'Grenada', 'GRD', 'GD'), + (87, 'Guadeloupe', 'GLP', 'GP'), + (88, 'Guam', 'GUM', 'GU'), + (89, 'Guatemala', 'GTM', 'GT'), + (90, 'Guinea', 'GIN', 'GN'), + (91, 'Guinea-bissau', 'GNB', 'GW'), + (92, 'Guyana', 'GUY', 'GY'), + (93, 'Haiti', 'HTI', 'HT'), + (94, 'Heard and Mc Donald Islands', 'HMD', 'HM'), + (95, 'Honduras', 'HND', 'HN'), + (96, 'Hong Kong', 'HKG', 'HK'), + (97, 'Hungary', 'HUN', 'HU'), + (98, 'Iceland', 'ISL', 'IS'), + (99, 'India', 'IND', 'IN'), + (100, 'Indonesia', 'IDN', 'ID'), + (101, 'Iran (Islamic Republic of)', 'IRN', 'IR'), + (102, 'Iraq', 'IRQ', 'IQ'), + (103, 'Ireland', 'IRL', 'IE'), + (104, 'Israel', 'ISR', 'IL'), + (105, 'Italy', 'ITA', 'IT'), + (106, 'Jamaica', 'JAM', 'JM'), + (107, 'Japan', 'JPN', 'JP'), + (108, 'Jordan', 'JOR', 'JO'), + (109, 'Kazakhstan', 'KAZ', 'KZ'), + (110, 'Kenya', 'KEN', 'KE'), + (111, 'Kiribati', 'KIR', 'KI'), + (112, 'Korea, Democratic People''s Republic of', 'PRK', 'KP'), + (113, 'Korea, Republic of', 'KOR', 'KR'), + (114, 'Kuwait', 'KWT', 'KW'), + (115, 'Kyrgyzstan', 'KGZ', 'KG'), + (116, 'Lao People''s Democratic Republic', 'LAO', 'LA'), + (117, 'Latvia', 'LVA', 'LV'), + (118, 'Lebanon', 'LBN', 'LB'), + (119, 'Lesotho', 'LSO', 'LS'), + (120, 'Liberia', 'LBR', 'LR'), + (121, 'Libyan Arab Jamahiriya', 'LBY', 'LY'), + (122, 'Liechtenstein', 'LIE', 'LI'), + (123, 'Lithuania', 'LTU', 'LT'), + (124, 'Luxembourg', 'LUX', 'LU'), + (125, 'Macau', 'MAC', 'MO'), + (126, 'Macedonia, The Former Yugoslav Republic of', 'MKD', 'MK'), + (127, 'Madagascar', 'MDG', 'MG'), + (128, 'Malawi', 'MWI', 'MW'), + (129, 'Malaysia', 'MYS', 'MY'), + (130, 'Maldives', 'MDV', 'MV'), + (131, 'Mali', 'MLI', 'ML'), + (132, 'Malta', 'MLT', 'MT'), + (133, 'Marshall Islands', 'MHL', 'MH'), + (134, 'Martinique', 'MTQ', 'MQ'), + (135, 'Mauritania', 'MRT', 'MR'), + (136, 'Mauritius', 'MUS', 'MU'), + (137, 'Mayotte', 'MYT', 'YT'), + (138, 'Mexico', 'MEX', 'MX'), + (139, 'Micronesia, Federated States of', 'FSM', 'FM'), + (140, 'Moldova, Republic of', 'MDA', 'MD'), + (141, 'Monaco', 'MCO', 'MC'), + (142, 'Mongolia', 'MNG', 'MN'), + (143, 'Montserrat', 'MSR', 'MS'), + (144, 'Morocco', 'MAR', 'MA'), + (145, 'Mozambique', 'MOZ', 'MZ'), + (146, 'Myanmar', 'MMR', 'MM'), + (147, 'Namibia', 'NAM', 'NA'), + (148, 'Nauru', 'NRU', 'NR'), + (149, 'Nepal', 'NPL', 'NP'), + (150, 'Netherlands', 'NLD', 'NL'), + (151, 'Netherlands Antilles', 'ANT', 'AN'), + (152, 'New Caledonia', 'NCL', 'NC'), + (153, 'New Zealand', 'NZL', 'NZ'), + (154, 'Nicaragua', 'NIC', 'NI'), + (155, 'Niger', 'NER', 'NE'), + (156, 'Nigeria', 'NGA', 'NG'), + (157, 'Niue', 'NIU', 'NU'), + (158, 'Norfolk Island', 'NFK', 'NF'), + (159, 'Northern Mariana Islands', 'MNP', 'MP'), + (160, 'Norway', 'NOR', 'NO'), + (161, 'Oman', 'OMN', 'OM'), + (162, 'Pakistan', 'PAK', 'PK'), + (163, 'Palau', 'PLW', 'PW'), + (164, 'Panama', 'PAN', 'PA'), + (165, 'Papua New Guinea', 'PNG', 'PG'), + (166, 'Paraguay', 'PRY', 'PY'), + (167, 'Peru', 'PER', 'PE'), + (168, 'Philippines', 'PHL', 'PH'), + (169, 'Pitcairn', 'PCN', 'PN'), + (170, 'Poland', 'POL', 'PL'), + (171, 'Portugal', 'PRT', 'PT'), + (172, 'Puerto Rico', 'PRI', 'PR'), + (173, 'Qatar', 'QAT', 'QA'), + (174, 'Reunion', 'REU', 'RE'), + (175, 'Romania', 'ROM', 'RO'), + (176, 'Russian Federation', 'RUS', 'RU'), + (177, 'Rwanda', 'RWA', 'RW'), + (178, 'Saint Kitts and Nevis', 'KNA', 'KN'), + (179, 'Saint Lucia', 'LCA', 'LC'), + (180, 'Saint Vincent and the Grenadines', 'VCT', 'VC'), + (181, 'Samoa', 'WSM', 'WS'), + (182, 'San Marino', 'SMR', 'SM'), + (183, 'Sao Tome and Principe', 'STP', 'ST'), + (184, 'Saudi Arabia', 'SAU', 'SA'), + (185, 'Senegal', 'SEN', 'SN'), + (186, 'Seychelles', 'SYC', 'SC'), + (187, 'Sierra Leone', 'SLE', 'SL'), + (188, 'Singapore', 'SGP', 'SG'), + (189, 'Slovakia (Slovak Republic)', 'SVK', 'SK'), + (190, 'Slovenia', 'SVN', 'SI'), + (191, 'Solomon Islands', 'SLB', 'SB'), + (192, 'Somalia', 'SOM', 'SO'), + (193, 'South Africa', 'ZAF', 'ZA'), + (194, 'South Georgia and the South Sandwich Islands', 'SGS', 'GS'), + (195, 'Spain', 'ESP', 'ES'), + (196, 'Sri Lanka', 'LKA', 'LK'), + (197, 'St. Helena', 'SHN', 'SH'), + (198, 'St. Pierre and Miquelon', 'SPM', 'PM'), + (199, 'Sudan', 'SDN', 'SD'), + (200, 'Suriname', 'SUR', 'SR'), + (201, 'Svalbard and Jan Mayen Islands', 'SJM', 'SJ'), + (202, 'Swaziland', 'SWZ', 'SZ'), + (203, 'Sweden', 'SWE', 'SE'), + (204, 'Switzerland', 'CHE', 'CH'), + (205, 'Syrian Arab Republic', 'SYR', 'SY'), + (206, 'Taiwan', 'TWN', 'TW'), + (207, 'Tajikistan', 'TJK', 'TJ'), + (208, 'Tanzania, United Republic of', 'TZA', 'TZ'), + (209, 'Thailand', 'THA', 'TH'), + (210, 'Togo', 'TGO', 'TG'), + (211, 'Tokelau', 'TKL', 'TK'), + (212, 'Tonga', 'TON', 'TO'), + (213, 'Trinidad and Tobago', 'TTO', 'TT'), + (214, 'Tunisia', 'TUN', 'TN'), + (215, 'Turkey', 'TUR', 'TR'), + (216, 'Turkmenistan', 'TKM', 'TM'), + (217, 'Turks and Caicos Islands', 'TCA', 'TC'), + (218, 'Tuvalu', 'TUV', 'TV'), + (219, 'Uganda', 'UGA', 'UG'), + (220, 'Ukraine', 'UKR', 'UA'), + (221, 'United Arab Emirates', 'ARE', 'AE'), + (222, 'United Kingdom', 'GBR', 'GB'), + (223, 'United States', 'USA', 'US'), + (224, 'United States Minor Outlying Islands', 'UMI', 'UM'), + (225, 'Uruguay', 'URY', 'UY'), + (226, 'Uzbekistan', 'UZB', 'UZ'), + (227, 'Vanuatu', 'VUT', 'VU'), + (228, 'Vatican City State (Holy See)', 'VAT', 'VA'), + (229, 'Venezuela', 'VEN', 'VE'), + (230, 'Viet Nam', 'VNM', 'VN'), + (231, 'Virgin Islands (British)', 'VGB', 'VG'), + (232, 'Virgin Islands (U.S.)', 'VIR', 'VI'), + (233, 'Wallis and Futuna Islands', 'WLF', 'WF'), + (234, 'Western Sahara', 'ESH', 'EH'), + (235, 'Yemen', 'YEM', 'YE'), + (237, 'The Democratic Republic of Congo', 'DRC', 'DC'), + (238, 'Zambia', 'ZMB', 'ZM'), + (239, 'Zimbabwe', 'ZWE', 'ZW'), + (241, 'Jersey', 'XJE', 'XJ'), + (242, 'St. Barthelemy', 'XSB', 'XB'), + (245, 'Aland Islands', 'ALA', 'AX'), + (246, 'Guernsey', 'GGY', 'GG'), + (247, 'Saint Martin (French part)', 'MAF', 'MF'), + (248, 'Timor-Leste', 'TLS', 'TL'), + (249, 'Serbia', 'SRB', 'RS'), + (250, 'Isle of Man', 'IMN', 'IM'), + (251, 'Montenegro', 'MNE', 'ME'), + (252, 'Palestinian Territory, Occupied', 'PSE', 'PS'); + +INSERT IGNORE INTO `#__redshop_cron` (`id`, `date`, `published`) VALUES + (1, '2009-08-12', 1); + +INSERT IGNORE INTO `#__redshop_currency` (`id`, `name`, `code`) VALUES + (1, 'Andorran Peseta', 'ADP'), + (2, 'United Arab Emirates Dirham', 'AED'), + (3, 'Afghanistan Afghani', 'AFA'), + (4, 'Albanian Lek', 'ALL'), + (5, 'Netherlands Antillian Guilder', 'ANG'), + (6, 'Angolan Kwanza', 'AOK'), + (7, 'Argentine Peso', 'ARS'), + (9, 'Australian Dollar', 'AUD'), + (10, 'Aruban Florin', 'AWG'), + (11, 'Barbados Dollar', 'BBD'), + (12, 'Bangladeshi Taka', 'BDT'), + (14, 'Bulgarian Lev', 'BGL'), + (15, 'Bahraini Dinar', 'BHD'), + (16, 'Burundi Franc', 'BIF'), + (17, 'Bermudian Dollar', 'BMD'), + (18, 'Brunei Dollar', 'BND'), + (19, 'Bolivian Boliviano', 'BOB'), + (20, 'Brazilian Real', 'BRL'), + (21, 'Bahamian Dollar', 'BSD'), + (22, 'Bhutan Ngultrum', 'BTN'), + (23, 'Burma Kyat', 'BUK'), + (24, 'Botswanian Pula', 'BWP'), + (25, 'Belize Dollar', 'BZD'), + (26, 'Canadian Dollar', 'CAD'), + (27, 'Swiss Franc', 'CHF'), + (28, 'Chilean Unidades de Fomento', 'CLF'), + (29, 'Chilean Peso', 'CLP'), + (30, 'Yuan (Chinese) Renminbi', 'CNY'), + (31, 'Colombian Peso', 'COP'), + (32, 'Costa Rican Colon', 'CRC'), + (33, 'Czech Koruna', 'CZK'), + (34, 'Cuban Peso', 'CUP'), + (35, 'Cape Verde Escudo', 'CVE'), + (36, 'Cyprus Pound', 'CYP'), + (40, 'Danish Krone', 'DKK'), + (41, 'Dominican Peso', 'DOP'), + (42, 'Algerian Dinar', 'DZD'), + (43, 'Ecuador Sucre', 'ECS'), + (44, 'Egyptian Pound', 'EGP'), + (46, 'Ethiopian Birr', 'ETB'), + (47, 'Euro', 'EUR'), + (49, 'Fiji Dollar', 'FJD'), + (50, 'Falkland Islands Pound', 'FKP'), + (52, 'British Pound', 'GBP'), + (53, 'Ghanaian Cedi', 'GHC'), + (54, 'Gibraltar Pound', 'GIP'), + (55, 'Gambian Dalasi', 'GMD'), + (56, 'Guinea Franc', 'GNF'), + (58, 'Guatemalan Quetzal', 'GTQ'), + (59, 'Guinea-Bissau Peso', 'GWP'), + (60, 'Guyanan Dollar', 'GYD'), + (61, 'Hong Kong Dollar', 'HKD'), + (62, 'Honduran Lempira', 'HNL'), + (63, 'Haitian Gourde', 'HTG'), + (64, 'Hungarian Forint', 'HUF'), + (65, 'Indonesian Rupiah', 'IDR'), + (66, 'Irish Punt', 'IEP'), + (67, 'Israeli Shekel', 'ILS'), + (68, 'Indian Rupee', 'INR'), + (69, 'Iraqi Dinar', 'IQD'), + (70, 'Iranian Rial', 'IRR'), + (73, 'Jamaican Dollar', 'JMD'), + (74, 'Jordanian Dinar', 'JOD'), + (75, 'Japanese Yen', 'JPY'), + (76, 'Kenyan Schilling', 'KES'), + (77, 'Kampuchean (Cambodian) Riel', 'KHR'), + (78, 'Comoros Franc', 'KMF'), + (79, 'North Korean Won', 'KPW'), + (80, '(South) Korean Won', 'KRW'), + (81, 'Kuwaiti Dinar', 'KWD'), + (82, 'Cayman Islands Dollar', 'KYD'), + (83, 'Lao Kip', 'LAK'), + (84, 'Lebanese Pound', 'LBP'), + (85, 'Sri Lanka Rupee', 'LKR'), + (86, 'Liberian Dollar', 'LRD'), + (87, 'Lesotho Loti', 'LSL'), + (89, 'Libyan Dinar', 'LYD'), + (90, 'Moroccan Dirham', 'MAD'), + (91, 'Malagasy Franc', 'MGF'), + (92, 'Mongolian Tugrik', 'MNT'), + (93, 'Macau Pataca', 'MOP'), + (94, 'Mauritanian Ouguiya', 'MRO'), + (95, 'Maltese Lira', 'MTL'), + (96, 'Mauritius Rupee', 'MUR'), + (97, 'Maldive Rufiyaa', 'MVR'), + (98, 'Malawi Kwacha', 'MWK'), + (99, 'Mexican Peso', 'MXN'), + (100, 'Malaysian Ringgit', 'MYR'), + (101, 'Mozambique Metical', 'MZM'), + (102, 'Nigerian Naira', 'NGN'), + (103, 'Nicaraguan Cordoba', 'NIC'), + (105, 'Norwegian Kroner', 'NOK'), + (106, 'Nepalese Rupee', 'NPR'), + (107, 'New Zealand Dollar', 'NZD'), + (108, 'Omani Rial', 'OMR'), + (109, 'Panamanian Balboa', 'PAB'), + (110, 'Peruvian Nuevo Sol', 'PEN'), + (111, 'Papua New Guinea Kina', 'PGK'), + (112, 'Philippine Peso', 'PHP'), + (113, 'Pakistan Rupee', 'PKR'), + (114, 'Polish Złoty', 'PLN'), + (116, 'Paraguay Guarani', 'PYG'), + (117, 'Qatari Rial', 'QAR'), + (118, 'Romanian Leu', 'RON'), + (119, 'Rwanda Franc', 'RWF'), + (120, 'Saudi Arabian Riyal', 'SAR'), + (121, 'Solomon Islands Dollar', 'SBD'), + (122, 'Seychelles Rupee', 'SCR'), + (123, 'Sudanese Pound', 'SDP'), + (124, 'Swedish Krona', 'SEK'), + (125, 'Singapore Dollar', 'SGD'), + (126, 'St. Helena Pound', 'SHP'), + (127, 'Sierra Leone Leone', 'SLL'), + (128, 'Somali Schilling', 'SOS'), + (129, 'Suriname Guilder', 'SRG'), + (130, 'Sao Tome and Principe Dobra', 'STD'), + (131, 'Russian Ruble', 'RUB'), + (132, 'El Salvador Colon', 'SVC'), + (133, 'Syrian Potmd', 'SYP'), + (134, 'Swaziland Lilangeni', 'SZL'), + (135, 'Thai Bath', 'THB'), + (136, 'Tunisian Dinar', 'TND'), + (137, 'Tongan Pa''anga', 'TOP'), + (138, 'East Timor Escudo', 'TPE'), + (139, 'Turkish Lira', 'TRY'), + (140, 'Trinidad and Tobago Dollar', 'TTD'), + (141, 'Taiwan Dollar', 'TWD'), + (142, 'Tanzanian Schilling', 'TZS'), + (143, 'Uganda Shilling', 'UGS'), + (144, 'US Dollar', 'USD'), + (145, 'Uruguayan Peso', 'UYP'), + (146, 'Venezualan Bolivar', 'VEB'), + (147, 'Vietnamese Dong', 'VND'), + (148, 'Vanuatu Vatu', 'VUV'), + (149, 'Samoan Tala', 'WST'), + (150, 'Democratic Yemeni Dinar', 'YDD'), + (151, 'Yemeni Rial', 'YER'), + (152, 'New Yugoslavia Dinar', 'YUD'), + (153, 'South African Rand', 'ZAR'), + (154, 'Zambian Kwacha', 'ZMK'), + (155, 'Zaire Zaire', 'ZRZ'), + (156, 'Zimbabwe Dollar', 'ZWD'), + (157, 'Slovak Koruna', 'SKK'), + (158, 'Armenian Dram', 'AMD'); + +INSERT IGNORE INTO `#__redshop_fields` (`id`, `title`, `name`, `type`, `desc`, `class`, `section`, `maxlength`, `cols`, `rows`, `size`, `show_in_front`, `required`, `published`, `publish_up`, `publish_down`, `display_in_product`, `ordering`, `display_in_checkout`, `checked_out`, `checked_out_time`, `created_date`, `created_by`, `modified_date`, `modified_by`) +VALUES + (2, 'PNO', 'rs_pno', '1', '', '', '18', 30, 10, 10, 20, 1, 1, 1, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 2, 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', NULL, '0000-00-00 00:00:00', NULL), + (3, 'Birthdate', 'rs_birthdate', '12', '', '', '18', 30, 10, 10, 20, 1, 1, 1, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 3, 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', NULL, '0000-00-00 00:00:00', NULL), + (4, 'Gender', 'rs_gender', '4', '', '', '18', 30, 10, 10, 20, 1, 1, 1, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 4, 0, NULL, '0000-00-00 00:00:00', '0000-00-00 00:00:00', NULL, '0000-00-00 00:00:00', NULL), + (5, 'House Number', 'rs_house_number', '1', '', '', '18', 30, 10, 10, 20, 1, 1, 1, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 5, 0, NULL, '0000-00-00 00:00:00', '0000-00-00 00:00:00', NULL, '0000-00-00 00:00:00', NULL), + (6, 'House Extension', 'rs_house_extension', '1', '', '', '18', 30, 10, 10, 20, 1, 1, 1, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 0, 6, 0, NULL, '0000-00-00 00:00:00', '0000-00-00 00:00:00', NULL, '0000-00-00 00:00:00', NULL); + +INSERT IGNORE INTO `#__redshop_order_status` (`order_status_id`, `order_status_code`, `order_status_name`, `published`) +VALUES + (1, 'P', 'Pending', 1), + (2, 'C', 'Confirmed', 1), + (3, 'X', 'Cancelled', 1), + (4, 'R', 'Refunded', 1), + (5, 'S', 'Shipped', 1), + (6, 'RD', 'Ready for delivery', 1), + (7, 'RD1', 'Ready for 1st delivery', 1), + (8, 'RD2', 'Ready for 2nd delivery', 1), + (9, 'ACCP', 'Awaiting credit card payment', 1), + (10, 'APP', 'Awaiting paypal payment', 1), + (11, 'ABT', 'Awaiting bank transfer', 1), + (12, 'PR', 'Payment received', 1), + (13, 'RC', 'Reclamation', 1), + (14, 'PS', 'Partially shipped', 1), + (15, 'RT', 'Returned', 1), + (16, 'PRT', 'Partially Returned', 1), + (17, 'PRC', 'Partially Reclamation', 1); + +INSERT IGNORE INTO `#__redshop_state` (`id`, `country_id`, `state_name`, `state_3_code`, `state_2_code`) VALUES + (1, 223, 'Alabama', 'ALA', 'AL'), + (2, 223, 'Alaska', 'ALK', 'AK'), + (3, 223, 'Arizona', 'ARZ', 'AZ'), + (4, 223, 'Arkansas', 'ARK', 'AR'), + (5, 223, 'California', 'CAL', 'CA'), + (6, 223, 'Colorado', 'COL', 'CO'), + (7, 223, 'Connecticut', 'CCT', 'CT'), + (8, 223, 'Delaware', 'DEL', 'DE'), + (9, 223, 'District Of Columbia', 'DOC', 'DC'), + (10, 223, 'Florida', 'FLO', 'FL'), + (11, 223, 'Georgia', 'GEA', 'GA'), + (12, 223, 'Hawaii', 'HWI', 'HI'), + (13, 223, 'Idaho', 'IDA', 'ID'), + (14, 223, 'Illinois', 'ILL', 'IL'), + (15, 223, 'Indiana', 'IND', 'IN'), + (16, 223, 'Iowa', 'IOA', 'IA'), + (17, 223, 'Kansas', 'KAS', 'KS'), + (18, 223, 'Kentucky', 'KTY', 'KY'), + (19, 223, 'Louisiana', 'LOA', 'LA'), + (20, 223, 'Maine', 'MAI', 'ME'), + (21, 223, 'Maryland', 'MLD', 'MD'), + (22, 223, 'Massachusetts', 'MSA', 'MA'), + (23, 223, 'Michigan', 'MIC', 'MI'), + (24, 223, 'Minnesota', 'MIN', 'MN'), + (25, 223, 'Mississippi', 'MIS', 'MS'), + (26, 223, 'Missouri', 'MIO', 'MO'), + (27, 223, 'Montana', 'MOT', 'MT'), + (28, 223, 'Nebraska', 'NEB', 'NE'), + (29, 223, 'Nevada', 'NEV', 'NV'), + (30, 223, 'New Hampshire', 'NEH', 'NH'), + (31, 223, 'New Jersey', 'NEJ', 'NJ'), + (32, 223, 'New Mexico', 'NEM', 'NM'), + (33, 223, 'New York', 'NEY', 'NY'), + (34, 223, 'North Carolina', 'NOC', 'NC'), + (35, 223, 'North Dakota', 'NOD', 'ND'), + (36, 223, 'Ohio', 'OHI', 'OH'), + (37, 223, 'Oklahoma', 'OKL', 'OK'), + (38, 223, 'Oregon', 'ORN', 'OR'), + (39, 223, 'Pennsylvania', 'PEA', 'PA'), + (40, 223, 'Rhode Island', 'RHI', 'RI'), + (41, 223, 'South Carolina', 'SOC', 'SC'), + (42, 223, 'South Dakota', 'SOD', 'SD'), + (43, 223, 'Tennessee', 'TEN', 'TN'), + (44, 223, 'Texas', 'TXS', 'TX'), + (45, 223, 'Utah', 'UTA', 'UT'), + (46, 223, 'Vermont', 'VMT', 'VT'), + (47, 223, 'Virginia', 'VIA', 'VA'), + (48, 223, 'Washington', 'WAS', 'WA'), + (49, 223, 'West Virginia', 'WEV', 'WV'), + (50, 223, 'Wisconsin', 'WIS', 'WI'), + (51, 223, 'Wyoming', 'WYO', 'WY'), + (52, 38, 'Alberta', 'ALB', 'AB'), + (53, 38, 'British Columbia', 'BRC', 'BC'), + (54, 38, 'Manitoba', 'MAB', 'MB'), + (55, 38, 'New Brunswick', 'NEB', 'NB'), + (56, 38, 'Newfoundland and Labrador', 'NFL', 'NL'), + (57, 38, 'Northwest Territories', 'NWT', 'NT'), + (58, 38, 'Nova Scotia', 'NOS', 'NS'), + (59, 38, 'Nunavut', 'NUT', 'NU'), + (60, 38, 'Ontario', 'ONT', 'ON'), + (61, 38, 'Prince Edward Island', 'PEI', 'PE'), + (62, 38, 'Quebec', 'QEC', 'QC'), + (63, 38, 'Saskatchewan', 'SAK', 'SK'), + (64, 38, 'Yukon', 'YUT', 'YT'), + (65, 222, 'England', 'ENG', 'EN'), + (66, 222, 'Northern Ireland', 'NOI', 'NI'), + (67, 222, 'Scotland', 'SCO', 'SD'), + (68, 222, 'Wales', 'WLS', 'WS'), + (69, 13, 'Australian Capital Territory', 'ACT', 'AT'), + (70, 13, 'New South Wales', 'NSW', 'NW'), + (71, 13, 'Northern Territory', 'NOT', 'NT'), + (72, 13, 'Queensland', 'QLD', 'QL'), + (73, 13, 'South Australia', 'SOA', 'SA'), + (74, 13, 'Tasmania', 'TAS', 'TA'), + (75, 13, 'Victoria', 'VIC', 'VI'), + (76, 13, 'Western Australia', 'WEA', 'WA'), + (77, 138, 'Aguascalientes', 'AGS', 'AG'), + (78, 138, 'Baja California Norte', 'BCN', 'BN'), + (79, 138, 'Baja California Sur', 'BCS', 'BS'), + (80, 138, 'Campeche', 'CAM', 'CA'), + (81, 138, 'Chiapas', 'CHI', 'CS'), + (82, 138, 'Chihuahua', 'CHA', 'CH'), + (83, 138, 'Coahuila', 'COA', 'CO'), + (84, 138, 'Colima', 'COL', 'CM'), + (85, 138, 'Distrito Federal', 'DFM', 'DF'), + (86, 138, 'Durango', 'DGO', 'DO'), + (87, 138, 'Guanajuato', 'GTO', 'GO'), + (88, 138, 'Guerrero', 'GRO', 'GU'), + (89, 138, 'Hidalgo', 'HGO', 'HI'), + (90, 138, 'Jalisco', 'JAL', 'JA'), + (91, 138, 'México (Estado de)', 'EDM', 'EM'), + (92, 138, 'Michoacán', 'MCN', 'MI'), + (93, 138, 'Morelos', 'MOR', 'MO'), + (94, 138, 'Nayarit', 'NAY', 'NY'), + (95, 138, 'Nuevo León', 'NUL', 'NL'), + (96, 138, 'Oaxaca', 'OAX', 'OA'), + (97, 138, 'Puebla', 'PUE', 'PU'), + (98, 138, 'Querétaro', 'QRO', 'QU'), + (99, 138, 'Quintana Roo', 'QUR', 'QR'), + (100, 138, 'San Luis Potosí', 'SLP', 'SP'), + (101, 138, 'Sinaloa', 'SIN', 'SI'), + (102, 138, 'Sonora', 'SON', 'SO'), + (103, 138, 'Tabasco', 'TAB', 'TA'), + (104, 138, 'Tamaulipas', 'TAM', 'TM'), + (105, 138, 'Tlaxcala', 'TLX', 'TX'), + (106, 138, 'Veracruz', 'VER', 'VZ'), + (107, 138, 'Yucatán', 'YUC', 'YU'), + (108, 138, 'Zacatecas', 'ZAC', 'ZA'), + (109, 30, 'Acre', 'ACR', 'AC'), + (110, 30, 'Alagoas', 'ALG', 'AL'), + (111, 30, 'Amapá', 'AMP', 'AP'), + (112, 30, 'Amazonas', 'AMZ', 'AM'), + (113, 30, 'Bahía', 'BAH', 'BA'), + (114, 30, 'Ceará', 'CEA', 'CE'), + (115, 30, 'Distrito Federal', 'DFB', 'DF'), + (116, 30, 'Espirito Santo', 'ESS', 'ES'), + (117, 30, 'Goiás', 'GOI', 'GO'), + (118, 30, 'Maranhão', 'MAR', 'MA'), + (119, 30, 'Mato Grosso', 'MAT', 'MT'), + (120, 30, 'Mato Grosso do Sul', 'MGS', 'MS'), + (121, 30, 'Minas Geraís', 'MIG', 'MG'), + (122, 30, 'Paraná', 'PAR', 'PR'), + (123, 30, 'Paraíba', 'PRB', 'PB'), + (124, 30, 'Pará', 'PAB', 'PA'), + (125, 30, 'Pernambuco', 'PER', 'PE'), + (126, 30, 'Piauí', 'PIA', 'PI'), + (127, 30, 'Rio Grande do Norte', 'RGN', 'RN'), + (128, 30, 'Rio Grande do Sul', 'RGS', 'RS'), + (129, 30, 'Rio de Janeiro', 'RDJ', 'RJ'), + (130, 30, 'Rondônia', 'RON', 'RO'), + (131, 30, 'Roraima', 'ROR', 'RR'), + (132, 30, 'Santa Catarina', 'SAC', 'SC'), + (133, 30, 'Sergipe', 'SER', 'SE'), + (134, 30, 'São Paulo', 'SAP', 'SP'), + (135, 30, 'Tocantins', 'TOC', 'TO'), + (136, 44, 'Anhui', 'ANH', '34'), + (137, 44, 'Beijing', 'BEI', '11'), + (138, 44, 'Chongqing', 'CHO', '50'), + (139, 44, 'Fujian', 'FUJ', '35'), + (140, 44, 'Gansu', 'GAN', '62'), + (141, 44, 'Guangdong', 'GUA', '44'), + (142, 44, 'Guangxi Zhuang', 'GUZ', '45'), + (143, 44, 'Guizhou', 'GUI', '52'), + (144, 44, 'Hainan', 'HAI', '46'), + (145, 44, 'Hebei', 'HEB', '13'), + (146, 44, 'Heilongjiang', 'HEI', '23'), + (147, 44, 'Henan', 'HEN', '41'), + (148, 44, 'Hubei', 'HUB', '42'), + (149, 44, 'Hunan', 'HUN', '43'), + (150, 44, 'Jiangsu', 'JIA', '32'), + (151, 44, 'Jiangxi', 'JIX', '36'), + (152, 44, 'Jilin', 'JIL', '22'), + (153, 44, 'Liaoning', 'LIA', '21'), + (154, 44, 'Nei Mongol', 'NML', '15'), + (155, 44, 'Ningxia Hui', 'NIH', '64'), + (156, 44, 'Qinghai', 'QIN', '63'), + (157, 44, 'Shandong', 'SNG', '37'), + (158, 44, 'Shanghai', 'SHH', '31'), + (159, 44, 'Shaanxi', 'SHX', '61'), + (160, 44, 'Sichuan', 'SIC', '51'), + (161, 44, 'Tianjin', 'TIA', '12'), + (162, 44, 'Xinjiang Uygur', 'XIU', '65'), + (163, 44, 'Xizang', 'XIZ', '54'), + (164, 44, 'Yunnan', 'YUN', '53'), + (165, 44, 'Zhejiang', 'ZHE', '33'), + (166, 104, 'Gaza Strip', 'GZS', 'GZ'), + (167, 104, 'West Bank', 'WBK', 'WB'), + (168, 104, 'Other', 'OTH', 'OT'), + (169, 151, 'St. Maarten', 'STM', 'SM'), + (170, 151, 'Bonaire', 'BNR', 'BN'), + (171, 151, 'Curacao', 'CUR', 'CR'), + (172, 175, 'Alba', 'ABA', 'AB'), + (173, 175, 'Arad', 'ARD', 'AR'), + (174, 175, 'Arges', 'ARG', 'AG'), + (175, 175, 'Bacau', 'BAC', 'BC'), + (176, 175, 'Bihor', 'BIH', 'BH'), + (177, 175, 'Bistrita-Nasaud', 'BIS', 'BN'), + (178, 175, 'Botosani', 'BOT', 'BT'), + (179, 175, 'Braila', 'BRL', 'BR'), + (180, 175, 'Brasov', 'BRA', 'BV'), + (181, 175, 'Bucuresti', 'BUC', 'B'), + (182, 175, 'Buzau', 'BUZ', 'BZ'), + (183, 175, 'Calarasi', 'CAL', 'CL'), + (184, 175, 'Caras Severin', 'CRS', 'CS'), + (185, 175, 'Cluj', 'CLJ', 'CJ'), + (186, 175, 'Constanta', 'CST', 'CT'), + (187, 175, 'Covasna', 'COV', 'CV'), + (188, 175, 'Dambovita', 'DAM', 'DB'), + (189, 175, 'Dolj', 'DLJ', 'DJ'), + (190, 175, 'Galati', 'GAL', 'GL'), + (191, 175, 'Giurgiu', 'GIU', 'GR'), + (192, 175, 'Gorj', 'GOR', 'GJ'), + (193, 175, 'Hargita', 'HRG', 'HR'), + (194, 175, 'Hunedoara', 'HUN', 'HD'), + (195, 175, 'Ialomita', 'IAL', 'IL'), + (196, 175, 'Iasi', 'IAS', 'IS'), + (197, 175, 'Ilfov', 'ILF', 'IF'), + (198, 175, 'Maramures', 'MAR', 'MM'), + (199, 175, 'Mehedinti', 'MEH', 'MH'), + (200, 175, 'Mures', 'MUR', 'MS'), + (201, 175, 'Neamt', 'NEM', 'NT'), + (202, 175, 'Olt', 'OLT', 'OT'), + (203, 175, 'Prahova', 'PRA', 'PH'), + (204, 175, 'Salaj', 'SAL', 'SJ'), + (205, 175, 'Satu Mare', 'SAT', 'SM'), + (206, 175, 'Sibiu', 'SIB', 'SB'), + (207, 175, 'Suceava', 'SUC', 'SV'), + (208, 175, 'Teleorman', 'TEL', 'TR'), + (209, 175, 'Timis', 'TIM', 'TM'), + (210, 175, 'Tulcea', 'TUL', 'TL'), + (211, 175, 'Valcea', 'VAL', 'VL'), + (212, 175, 'Vaslui', 'VAS', 'VS'), + (213, 175, 'Vrancea', 'VRA', 'VN'), + (214, 105, 'Agrigento', 'AGR', 'AG'), + (215, 105, 'Alessandria', 'ALE', 'AL'), + (216, 105, 'Ancona', 'ANC', 'AN'), + (217, 105, 'Aosta', 'AOS', 'AO'), + (218, 105, 'Arezzo', 'ARE', 'AR'), + (219, 105, 'Ascoli Piceno', 'API', 'AP'), + (220, 105, 'Asti', 'AST', 'AT'), + (221, 105, 'Avellino', 'AVE', 'AV'), + (222, 105, 'Bari', 'BAR', 'BA'), + (223, 105, 'Belluno', 'BEL', 'BL'), + (224, 105, 'Benevento', 'BEN', 'BN'), + (225, 105, 'Bergamo', 'BEG', 'BG'), + (226, 105, 'Biella', 'BIE', 'BI'), + (227, 105, 'Bologna', 'BOL', 'BO'), + (228, 105, 'Bolzano', 'BOZ', 'BZ'), + (229, 105, 'Brescia', 'BRE', 'BS'), + (230, 105, 'Brindisi', 'BRI', 'BR'), + (231, 105, 'Cagliari', 'CAG', 'CA'), + (232, 105, 'Caltanissetta', 'CAL', 'CL'), + (233, 105, 'Campobasso', 'CBO', 'CB'), + (234, 105, 'Carbonia-Iglesias', 'CAR', 'CI'), + (235, 105, 'Caserta', 'CAS', 'CE'), + (236, 105, 'Catania', 'CAT', 'CT'), + (237, 105, 'Catanzaro', 'CTZ', 'CZ'), + (238, 105, 'Chieti', 'CHI', 'CH'), + (239, 105, 'Como', 'COM', 'CO'), + (240, 105, 'Cosenza', 'COS', 'CS'), + (241, 105, 'Cremona', 'CRE', 'CR'), + (242, 105, 'Crotone', 'CRO', 'KR'), + (243, 105, 'Cuneo', 'CUN', 'CN'), + (244, 105, 'Enna', 'ENN', 'EN'), + (245, 105, 'Ferrara', 'FER', 'FE'), + (246, 105, 'Firenze', 'FIR', 'FI'), + (247, 105, 'Foggia', 'FOG', 'FG'), + (248, 105, 'Forli-Cesena', 'FOC', 'FC'), + (249, 105, 'Frosinone', 'FRO', 'FR'), + (250, 105, 'Genova', 'GEN', 'GE'), + (251, 105, 'Gorizia', 'GOR', 'GO'), + (252, 105, 'Grosseto', 'GRO', 'GR'), + (253, 105, 'Imperia', 'IMP', 'IM'), + (254, 105, 'Isernia', 'ISE', 'IS'), + (255, 105, 'L''Aquila', 'AQU', 'AQ'), + (256, 105, 'La Spezia', 'LAS', 'SP'), + (257, 105, 'Latina', 'LAT', 'LT'), + (258, 105, 'Lecce', 'LEC', 'LE'), + (259, 105, 'Lecco', 'LCC', 'LC'), + (260, 105, 'Livorno', 'LIV', 'LI'), + (261, 105, 'Lodi', 'LOD', 'LO'), + (262, 105, 'Lucca', 'LUC', 'LU'), + (263, 105, 'Macerata', 'MAC', 'MC'), + (264, 105, 'Mantova', 'MAN', 'MN'), + (265, 105, 'Massa-Carrara', 'MAS', 'MS'), + (266, 105, 'Matera', 'MAA', 'MT'), + (267, 105, 'Medio Campidano', 'MED', 'VS'), + (268, 105, 'Messina', 'MES', 'ME'), + (269, 105, 'Milano', 'MIL', 'MI'), + (270, 105, 'Modena', 'MOD', 'MO'), + (271, 105, 'Napoli', 'NAP', 'NA'), + (272, 105, 'Novara', 'NOV', 'NO'), + (273, 105, 'Nuoro', 'NUR', 'NU'), + (274, 105, 'Ogliastra', 'OGL', 'OG'), + (275, 105, 'Olbia-Tempio', 'OLB', 'OT'), + (276, 105, 'Oristano', 'ORI', 'OR'), + (277, 105, 'Padova', 'PDA', 'PD'), + (278, 105, 'Palermo', 'PAL', 'PA'), + (279, 105, 'Parma', 'PAA', 'PR'), + (280, 105, 'Pavia', 'PAV', 'PV'), + (281, 105, 'Perugia', 'PER', 'PG'), + (282, 105, 'Pesaro e Urbino', 'PES', 'PU'), + (283, 105, 'Pescara', 'PSC', 'PE'), + (284, 105, 'Piacenza', 'PIA', 'PC'), + (285, 105, 'Pisa', 'PIS', 'PI'), + (286, 105, 'Pistoia', 'PIT', 'PT'), + (287, 105, 'Pordenone', 'POR', 'PN'), + (288, 105, 'Potenza', 'PTZ', 'PZ'), + (289, 105, 'Prato', 'PRA', 'PO'), + (290, 105, 'Ragusa', 'RAG', 'RG'), + (291, 105, 'Ravenna', 'RAV', 'RA'), + (292, 105, 'Reggio Calabria', 'REG', 'RC'), + (293, 105, 'Reggio Emilia', 'REE', 'RE'), + (294, 105, 'Rieti', 'RIE', 'RI'), + (295, 105, 'Rimini', 'RIM', 'RN'), + (296, 105, 'Roma', 'ROM', 'RM'), + (297, 105, 'Rovigo', 'ROV', 'RO'), + (298, 105, 'Salerno', 'SAL', 'SA'), + (299, 105, 'Sassari', 'SAS', 'SS'), + (300, 105, 'Savona', 'SAV', 'SV'), + (301, 105, 'Siena', 'SIE', 'SI'), + (302, 105, 'Siracusa', 'SIR', 'SR'), + (303, 105, 'Sondrio', 'SOO', 'SO'), + (304, 105, 'Taranto', 'TAR', 'TA'), + (305, 105, 'Teramo', 'TER', 'TE'), + (306, 105, 'Terni', 'TRN', 'TR'), + (307, 105, 'Torino', 'TOR', 'TO'), + (308, 105, 'Trapani', 'TRA', 'TP'), + (309, 105, 'Trento', 'TRE', 'TN'), + (310, 105, 'Treviso', 'TRV', 'TV'), + (311, 105, 'Trieste', 'TRI', 'TS'), + (312, 105, 'Udine', 'UDI', 'UD'), + (313, 105, 'Varese', 'VAR', 'VA'), + (314, 105, 'Venezia', 'VEN', 'VE'), + (315, 105, 'Verbano Cusio Ossola', 'VCO', 'VB'), + (316, 105, 'Vercelli', 'VER', 'VC'), + (317, 105, 'Verona', 'VRN', 'VR'), + (318, 105, 'Vibo Valenzia', 'VIV', 'VV'), + (319, 105, 'Vicenza', 'VII', 'VI'), + (320, 105, 'Viterbo', 'VIT', 'VT'), + (321, 195, 'A Coruña', 'ACO', '15'), + (322, 195, 'Alava', 'ALA', '01'), + (323, 195, 'Albacete', 'ALB', '02'), + (324, 195, 'Alicante', 'ALI', '03'), + (325, 195, 'Almeria', 'ALM', '04'), + (326, 195, 'Asturias', 'AST', '33'), + (327, 195, 'Avila', 'AVI', '05'), + (328, 195, 'Badajoz', 'BAD', '06'), + (329, 195, 'Baleares', 'BAL', '07'), + (330, 195, 'Barcelona', 'BAR', '08'), + (331, 195, 'Burgos', 'BUR', '09'), + (332, 195, 'Caceres', 'CAC', '10'), + (333, 195, 'Cadiz', 'CAD', '11'), + (334, 195, 'Cantabria', 'CAN', '39'), + (335, 195, 'Castellon', 'CAS', '12'), + (336, 195, 'Ceuta', 'CEU', '51'), + (337, 195, 'Ciudad Real', 'CIU', '13'), + (338, 195, 'Cordoba', 'COR', '14'), + (339, 195, 'Cuenca', 'CUE', '16'), + (340, 195, 'Girona', 'GIR', '17'), + (341, 195, 'Granada', 'GRA', '18'), + (342, 195, 'Guadalajara', 'GUA', '19'), + (343, 195, 'Guipuzcoa', 'GUI', '20'), + (344, 195, 'Huelva', 'HUL', '21'), + (345, 195, 'Huesca', 'HUS', '22'), + (346, 195, 'Jaen', 'JAE', '23'), + (347, 195, 'La Rioja', 'LRI', '26'), + (348, 195, 'Las Palmas', 'LPA', '35'), + (349, 195, 'Leon', 'LEO', '24'), + (350, 195, 'Lleida', 'LLE', '25'), + (351, 195, 'Lugo', 'LUG', '27'), + (352, 195, 'Madrid', 'MAD', '28'), + (353, 195, 'Malaga', 'MAL', '29'), + (354, 195, 'Melilla', 'MEL', '52'), + (355, 195, 'Murcia', 'MUR', '30'), + (356, 195, 'Navarra', 'NAV', '31'), + (357, 195, 'Ourense', 'OUR', '32'), + (358, 195, 'Palencia', 'PAL', '34'), + (359, 195, 'Pontevedra', 'PON', '36'), + (360, 195, 'Salamanca', 'SAL', '37'), + (361, 195, 'Santa Cruz de Tenerife', 'SCT', '38'), + (362, 195, 'Segovia', 'SEG', '40'), + (363, 195, 'Sevilla', 'SEV', '41'), + (364, 195, 'Soria', 'SOR', '42'), + (365, 195, 'Tarragona', 'TAR', '43'), + (366, 195, 'Teruel', 'TER', '44'), + (367, 195, 'Toledo', 'TOL', '45'), + (368, 195, 'Valencia', 'VAL', '46'), + (369, 195, 'Valladolid', 'VLL', '47'), + (370, 195, 'Vizcaya', 'VIZ', '48'), + (371, 195, 'Zamora', 'ZAM', '49'), + (372, 195, 'Zaragoza', 'ZAR', '50'), + (373, 11, 'Aragatsotn', 'ARG', 'AG'), + (374, 11, 'Ararat', 'ARR', 'AR'), + (375, 11, 'Armavir', 'ARM', 'AV'), + (376, 11, 'Gegharkunik', 'GEG', 'GR'), + (377, 11, 'Kotayk', 'KOT', 'KT'), + (378, 11, 'Lori', 'LOR', 'LO'), + (379, 11, 'Shirak', 'SHI', 'SH'), + (380, 11, 'Syunik', 'SYU', 'SU'), + (381, 11, 'Tavush', 'TAV', 'TV'), + (382, 11, 'Vayots-Dzor', 'VAD', 'VD'), + (383, 11, 'Yerevan', 'YER', 'ER'), + (384, 99, 'Andaman & Nicobar Islands', 'ANI', 'AI'), + (385, 99, 'Andhra Pradesh', 'AND', 'AN'), + (386, 99, 'Arunachal Pradesh', 'ARU', 'AR'), + (387, 99, 'Assam', 'ASS', 'AS'), + (388, 99, 'Bihar', 'BIH', 'BI'), + (389, 99, 'Chandigarh', 'CHA', 'CA'), + (390, 99, 'Chhatisgarh', 'CHH', 'CH'), + (391, 99, 'Dadra & Nagar Haveli', 'DAD', 'DD'), + (392, 99, 'Daman & Diu', 'DAM', 'DA'), + (393, 99, 'Delhi', 'DEL', 'DE'), + (394, 99, 'Goa', 'GOA', 'GO'), + (395, 99, 'Gujarat', 'GUJ', 'GU'), + (396, 99, 'Haryana', 'HAR', 'HA'), + (397, 99, 'Himachal Pradesh', 'HIM', 'HI'), + (398, 99, 'Jammu & Kashmir', 'JAM', 'JA'), + (399, 99, 'Jharkhand', 'JHA', 'JH'), + (400, 99, 'Karnataka', 'KAR', 'KA'), + (401, 99, 'Kerala', 'KER', 'KE'), + (402, 99, 'Lakshadweep', 'LAK', 'LA'), + (403, 99, 'Madhya Pradesh', 'MAD', 'MD'), + (404, 99, 'Maharashtra', 'MAH', 'MH'), + (405, 99, 'Manipur', 'MAN', 'MN'), + (406, 99, 'Meghalaya', 'MEG', 'ME'), + (407, 99, 'Mizoram', 'MIZ', 'MI'), + (408, 99, 'Nagaland', 'NAG', 'NA'), + (409, 99, 'Orissa', 'ORI', 'OR'), + (410, 99, 'Pondicherry', 'PON', 'PO'), + (411, 99, 'Punjab', 'PUN', 'PU'), + (412, 99, 'Rajasthan', 'RAJ', 'RA'), + (413, 99, 'Sikkim', 'SIK', 'SI'), + (414, 99, 'Tamil Nadu', 'TAM', 'TA'), + (415, 99, 'Tripura', 'TRI', 'TR'), + (416, 99, 'Uttaranchal', 'UAR', 'UA'), + (417, 99, 'Uttar Pradesh', 'UTT', 'UT'), + (418, 99, 'West Bengal', 'WES', 'WE'), + (419, 101, 'Ahmadi va Kohkiluyeh', 'BOK', 'BO'), + (420, 101, 'Ardabil', 'ARD', 'AR'), + (421, 101, 'Azarbayjan-e Gharbi', 'AZG', 'AG'), + (422, 101, 'Azarbayjan-e Sharqi', 'AZS', 'AS'), + (423, 101, 'Bushehr', 'BUS', 'BU'), + (424, 101, 'Chaharmahal va Bakhtiari', 'CMB', 'CM'), + (425, 101, 'Esfahan', 'ESF', 'ES'), + (426, 101, 'Fars', 'FAR', 'FA'), + (427, 101, 'Gilan', 'GIL', 'GI'), + (428, 101, 'Gorgan', 'GOR', 'GO'), + (429, 101, 'Hamadan', 'HAM', 'HA'), + (430, 101, 'Hormozgan', 'HOR', 'HO'), + (431, 101, 'Ilam', 'ILA', 'IL'), + (432, 101, 'Kerman', 'KER', 'KE'), + (433, 101, 'Kermanshah', 'BAK', 'BA'), + (434, 101, 'Khorasan-e Junoubi', 'KHJ', 'KJ'), + (435, 101, 'Khorasan-e Razavi', 'KHR', 'KR'), + (436, 101, 'Khorasan-e Shomali', 'KHS', 'KS'), + (437, 101, 'Khuzestan', 'KHU', 'KH'), + (438, 101, 'Kordestan', 'KOR', 'KO'), + (439, 101, 'Lorestan', 'LOR', 'LO'), + (440, 101, 'Markazi', 'MAR', 'MR'), + (441, 101, 'Mazandaran', 'MAZ', 'MZ'), + (442, 101, 'Qazvin', 'QAS', 'QA'), + (443, 101, 'Qom', 'QOM', 'QO'), + (444, 101, 'Semnan', 'SEM', 'SE'), + (445, 101, 'Sistan va Baluchestan', 'SBA', 'SB'), + (446, 101, 'Tehran', 'TEH', 'TE'), + (447, 101, 'Yazd', 'YAZ', 'YA'), + (448, 101, 'Zanjan', 'ZAN', 'ZA'), + (449, 170, 'Dolnośląskie', 'DOL', 'DO'), + (450, 170, 'Kujawsko-Pomorskie', 'KUJ', 'KU'), + (451, 170, 'Lubelskie', 'LUB', 'LU'), + (452, 170, 'Lubuskie', 'LBU', 'LB'), + (453, 170, 'Łódzkie', 'LOD', 'LO'), + (454, 170, 'Małopolskie', 'MAL', 'MP'), + (455, 170, 'Mazowieckie', 'MAZ', 'MZ'), + (456, 170, 'Opolskie', 'OPO', 'OP'), + (457, 170, 'Podkarpackie', 'PDK', 'PK'), + (458, 170, 'Podlaskie', 'PDL', 'PL'), + (459, 170, 'Pomorskie', 'POM', 'PO'), + (460, 170, 'Śląskie', 'SLA', 'SL'), + (461, 170, 'Świętokrzyskie', 'SWI', 'SW'), + (462, 170, 'Warmińsko-Mazurskie', 'WAR', 'WA'), + (463, 170, 'Wielkopolskie', 'WIE', 'WI'), + (464, 170, 'Zachodniopomorskie', 'ZAC', 'ZA'); + +INSERT IGNORE INTO `#__redshop_stockroom` (`stockroom_id`, `stockroom_name`, `stockroom_desc`, `published`) VALUES + (1, 'default', 'This is redshop default stockroom', '1'); + +INSERT IGNORE INTO `#__redshop_mail` (`mail_id`, `mail_name`, `mail_subject`, `mail_section`, `mail_order_status`, `mail_body`, `published`, `mail_bcc`) VALUES + (1, 'Ask Question', 'Ask Question About Product', 'ask_question_mail', '0', '

    To Admin,

    \r\n

    Product : {product_name}

    \r\n

    Please check this link : {product_link}

    \r\n

    \r\n

    {user_question}

    \r\n

    {answer}

    \r\n

    ', 1, ''), + (11, 'Send to friend', 'Send to friend', 'product', '0', '

    Hi {friend_name} ,

    \r\n

    New Product : {product_name}

    \r\n

    {product_desc} Please check this link : {product_url}

    \r\n

    \r\n

    ', 1, ''), + (12, 'Tax exempt approval mail', 'Tax exempt approval mail subject', 'tax_exempt_approval_mail', '0', '

    Hello,

    \r\n

    Tax exempt has been approved

    ', 1, ''), + (13, 'Tax exempt disapproval mail', 'Tax exempt disapproval mail subject', 'tax_exempt_disapproval_mail', '0', '

    Hello,

    \r\n

    Tax exempt has been disapproved.

    ', 1, ''), + (14, 'Tax exempt waiting approval mail', 'Tax exempt waiting approval mail subject', 'tax_exempt_waiting_approval_mail', '0', '

    Tax exempt waiting approval mail contents...

    \r\n

    Thanks.

    ', 1, ''), + (15, 'Registration mail', 'Registration mail', 'register', '0', '\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n

    Thank you for your registration!

    \r\n

    You are now a registered user at redCOMPONENT.

    \r\n

    To go to your account where you can make all necessary adjustments, such as change your address book, view old orders, download your purchased products, or sign up for our newsletter please click {account_link}.

    \r\n

    \r\n

    User information:

    \r\n

    Username: {username}

    \r\n

    Password: {password}

    \r\n

    \r\n

    Regards,
    {shopname}

    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n
    ', 1, ''), + (16, 'Catlog First Reminder', 'Catlog First Reminder', 'catalog_first_reminder', '0', '\r\n

    Dear {name}.

    \r\n

    My name is xyz, in charge of customer support here at abc. We sent you our catalogue the other day, and I would just like to know if you had a chance to look at it...? In any case, I am ready by the phone / e-mail if you need any assistance whatsoever.

    \r\n

    Kind regards,

    \r\n

    Name

    \r\n

    ', 1, ''), + (17, 'Catlog Second Reminder', 'Catlog Second Reminder', 'catalog_second_reminder', '0', '

    Dear {name},

    \r\n

    I just wish to inform you that we are currently running a campaign for all the clients who received our catalogue earlier. This means that in the next 4 days, you get 5% off everything you buy, and since our products are already competitively priced, it is a really good offer. You can use the code: XXX when you order to get the discount, but remember you have 4 days from now to decide!

    \r\n

    \r\n

    Regards,

    \r\n

    xyz.

    ', 1, ''), + (18, 'Catlog Sample First Reminder', 'Catlog Sample First Reminder', 'colour_sample_first_reminder', '0', '\r\n

    Dear {name}. My name is xyz, in charge of customer support here at xyz. You have requested some colour samples, and I will send them to you as soon as possible. If you have any questions, please do not hesitate to contact me. Kind regards, xyz

    ', 1, ''), + (19, 'Catlog Sample Second Reminder', 'Catlog Sample Second Reminder', 'colour_sample_second_reminder', '0', '\r\n

    Dear {name}. I sent you some sample colour material the other day, and I would just like to know if you had a chance to look at it...? In any case, I am ready by the phone / e-mail if you need any assistance whatsoever. Kind regards, xyz

    ', 1, ''), + (20, 'Catlog Sample Third Reminder', 'Catlog Sample Third Reminder', 'colour_sample_third_reminder', '0', '\r\n

    Dear {name}. I just wish to inform you that we are currently running a campaign for all the clients who received sample colour material from us earlier. This means that in the next 4 days, you get 5% off everything you buy, and since our products are already competitively priced, it is a really good offer. You can use the code: XXX when you order to get the discount, but remember you have 4 days from now to decide!

    ', 1, ''), + (21, 'Order Mail', 'Order Mail for {order_id}', 'order', '0', '
    {order_date}

    Thank you for your order!

    Thank you for ordering from redCOMPONENT!

    Products ordered:

    {product_quantity} x
    {product_name}{without_vat} {product_accessory}
    {product_attribute}
    {product_total_price}
    Discount{discount_excl_vat}
    VAT{sub_total_vat}
    Total{order_total}

    Billing information:

    {billing_address}

    Shipping information:

    {shipping_address}

    Additional information:

    {customer_note}

    Order details:

    To see the details of your order please {order_detail_link}.

    Regards,
    redCOMPONENT

    ', 1, ''), + (22, 'Order Status Change Shipped', 'Order Status Change Shipped', 'order_status', 'S', '\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n {order_date}\r\n
    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n\r\n
    \r\n

    Order status

    \r\n

    Your order status has changed.

    \r\n

    \r\n

    \r\n

    \r\n

    Regards,
    redCOMPONENT

    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n
    ', 1, ''), + (23, 'Order Status Change Refunded', 'Order Status Change Refunded', 'order_status', 'R', '\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n {order_date}\r\n
    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n\r\n
    \r\n

    Order status

    \r\n

    Your order status has changed.

    \r\n

    \r\n

    \r\n

    \r\n

    Regards,
    redCOMPONENT

    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n
    ', 1, ''), + (24, 'Order Status Change Pending', 'Order Status Change Pending', 'order_status', 'P', '\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n {order_date}\r\n
    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n\r\n
    \r\n

    Order status

    \r\n

    Your order status has changed.

    \r\n

    \r\n

    \r\n

    \r\n

    Regards,
    redCOMPONENT

    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n
    ', 1, ''), + (25, 'Order Status Change Confirmed', 'Order Status Change Confirmed', 'order_status', 'C', '\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n {order_date}\r\n
    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n\r\n
    \r\n

    Order status

    \r\n

    Your order status has changed.

    \r\n

    \r\n

    \r\n

    \r\n

    Regards,
    redCOMPONENT

    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n
    ', 1, ''), + (26, 'Order Status Change Cancelled', 'Order Status Change Cancelled', 'order_status', 'X', '\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n {order_date}\r\n
    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n\r\n
    \r\n

    Order status

    \r\n

    Your order status has changed.

    \r\n

    \r\n

    \r\n

    \r\n

    Regards,
    redCOMPONENT

    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n
    \r\n
    ', 1, ''), + (27, 'catalog coupon reminder', 'catalog coupon reminder', 'catalog_coupon_reminder', '0', '\r\n

    Dear {name}. I just wish to inform you that we are currently running a campaign for all the clients who received our catalogue earlier. This means that in the next 4 days, you get {discount} off everything you buy, and since our products are already competitively priced, it is a really good offer. You can use the code: {coupon_code} when you order to get the discount, but remember you have 4 days from now to decide!

    ', 1, ''), + (30, 'First Mail After Order Purchased', 'Mail After Order Purchased', 'first_mail_after_order_purchased', '0', '

    Hi {name},
    You made an order with us 7 days ago and to show our appreciation of you as a customer we send you discount code to use the next time you visit our store

    \r\n

    {url}

    \r\n

    discount amount : {coupon_amount}

    \r\n

    discount coupon code : {coupon_code}

    \r\n

    valid upto : {coupon_duration}

    \r\n

    Thank you.

    ', 1, ''), + (32, 'Second Mail After Order Purchased', 'Second Mail After Order Purchased', 'second_mail_after_order_purchased', '0', '

    Hi {name},
    You made an order with us 10 days ago and to show our appreciation of you as a customer we send you discount code to use the next time you visit our store

    \r\n

    {url}

    \r\n

    discount amount : {coupon_amount}

    \r\n

    discount coupon code : {coupon_code}

    \r\n

    valid upto : {coupon_duration}

    \r\n

    Thank you.

    ', 1, ''), + (33, 'Third Mail After Order Purchased', 'Third Mail After Order Purchased', 'third_mail_after_order_purchased', '0', '

    Hi {name},
    You made an order with us 21 days ago and to show our appreciation of you as a customer we send you discount code to use the next time you visit our store

    \r\n

    {url}

    \r\n

    discount amount : {coupon_amount}

    \r\n

    discount coupon code : {coupon_code}

    \r\n

    valid upto : {coupon_duration}

    \r\n

    Thank you.

    ', 1, ''), + (34, 'Catalog Send Mail', 'Catalog Request', 'catalog', '0', '

    Dear, {name}

    \r\n

    We get your request for catalog. Here, you can found attached catalogs.

    \r\n

    \r\n

    Thank you.

    ', 1, ''), + (50, 'Economic Invoice', 'Invoice', 'economic_inoice', '0', '\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {order_date}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n

    Hi {name}

    Attached is your invoice.

    Regards,
    redCOMPONENT

    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n
    ', 1, ''), + (54, 'My wishlist mail', 'My wishlist', 'mywishlist_mail', '0', 'hi,{name}
    {product_thumb_image}
    {product_name}
    {product_price}
    Regards,{from_name}', 1, ''), + (64, 'Order Special Discount Mail', 'Admin applied discount (special offer)', 'order_special_discount', '0', 'You got {special_discount} that is {special_discount_amount}.

    ABC Company -- abc.com
    abccompany.com
    Street Address
    Address line 2
    County
    Country
    Telephone Number : 11325-3251
    E-mail : abccompany@abc.om
    Some Title
    Some Intro text...Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries...
    Order Information
    Order id : {order_id}
    Order Number : {order_number}
    Order Date : {order_date}
    Order Status : {order_status}
    Billing Address Information
    {billing_address}
    Shipping Address Information
    {shipping_address}
    Order Details
    Product NameNotePriceQuantityTotal Price
    {product_name} {product_sku}{product_wrapper}{product_price}{product_quantity}{product_total_price}
    Order Subtotal : {product_subtotal}
    TAX : {order_tax}
    Discount : {order_discount}
    {special_discount_lbl} {special_discount_amount}
    Shipping : {order_shipping}

    Total :{order_total}

    ', 1, ''), + (74, 'News letter ', 'News Letter confirmation', 'newsletter_confirmation', '0', '

    hi {name},

    \r\n

    Confirm your News letter {link}.

    ', 1, ''), + (84, 'NewsLetter cancellation ', 'NewsLetter cancellation ', 'newsletter_cancellation', '0', 'NewsLetter cancellationNewsLetter cancellation NewsLetter cancellation NewsLetter cancellationNewsLetter cancellation NewsLetter cancellation', 1, ''), + (85, 'Invoice Mail', 'Invoice Mail', 'invoice_mail', '0', '\r\n\r\n\r\n\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n {order_date}\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n

    Thank you for your order!

    \r\n

    Thank you for ordering from redCOMPONENT!
    To download your purchased products please follow the link in the bottom of this mail.

    \r\n

    \r\n

    Products ordered:

    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    {product_name}{without_vat}{product_price}{product_quantity}{product_total_price}
    VAT{sub_total_vat}
    Total{order_total}
    \r\n

    \r\n

    Billing information:

    \r\n
    {billing_address}
    \r\n

    \r\n

    Additional information:

    \r\n

    {customer_note}

    \r\n

    \r\n

    Order details:

    \r\n

    To see the details of your order and to download the products please click {order_detail_link}

    \r\n

    \r\n

    Regards,
    redCOMPONENT

    \r\n
    \r\n\r\n \r\n \r\n \r\n
    \r\n
    ', 1, ''), + (86, 'Product Subscription Mail', 'Mail for product Subscription ', 'subscription_renewal_mail', '0', '

    Product Subscription Renew

    \r\n

    Dear,

    \r\n

    {firstname} {lastname}

    \r\n

    Your Subscription for {product_name} is going to expired on {subsciption_enddate}

    \r\n

    Your Subscription Detail is as below

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    Subscribe Product :{product_name}
    Subscription Period :{subscription_period}
    Subscription Price : {subscription_price}
    \r\n

    Click here {product_link} and renew it

    ', 1, ''), + (94, 'Giftcard Mail', 'Giftcard Mail', 'giftcard_mail', '0', '
    {giftcard_price_lbl}{giftcard_price}
    {giftcard_reciver_name_lbl}{giftcard_reciver_name}
    {giftcard_reciver_email_lbl}{giftcard_reciver_email}
    {giftcard_code_lbl}{giftcard_code}
    {giftcard_desc}
    {giftcard_price}
    {giftcard_validity_from}{giftcard_validity_to}
    {giftcard_image}
    {giftcard_validity}
    ', 1, ''), + (105, 'Quotation Mail', 'Quotation Mail for {quotation_id} - {quotation_status} - {quotation_total}', 'quotation_mail', '0', '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {quotation_information_lbl}
    {quotation_id_lbl} : {quotation_id}
    {quotation_number_lbl} : {quotation_number}
    {quotation_date_lbl} : {quotation_date}
    {quotation_status_lbl} : {quotation_status}
    {quotation_note_lbl} : {quotation_note}
    {quotation_detail_link}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {billing_address_information_lbl}
    {billing_address}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {quotation_detail_lbl}
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {product_name_lbl}{note_lbl}{price_lbl}{quantity_lbl}{total_price_lbl}
    {product_name}{product_s_desc}({product_number})
    {product_userfields}
    {product_attribute}
    {product_accessory}
    {product_wrapper}
    {product_thumb_image}
    {product_price}{product_quantity}{product_total_price}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {quotation_subtotal_lbl} : {quotation_subtotal}
    \r\n
    \r\n
    {total_lbl} :{quotation_total}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    ', 1, ''), + (150, 'Catalogue Order Mail', 'Catalogue Order Mail:', 'catalogue_order', '0', '

    ABC Company -- abc.com
    abccompany.com
    Street Address
    Address line 2
    County
    Country
    Telephone Number : 11325-3251
    E-mail : abccompany@abc.om
    Some Title
    Some Intro text...Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry''s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries...
    {order_information_lbl}
    {order_id_lbl} : {order_id}
    {order_number_lbl} : {order_number}
    {order_date_lbl} : {order_date}
    {order_status_lbl} : {order_status}
    {billing_address_information_lbl}
    {billing_address}
    {shipping_address_information_lbl}
    {shipping_address}
    {order_detail_lbl}
    {product_name_lbl}{note_lbl}{quantity_lbl}
    {pro_name}
    {product_userfields}
    {pro_note}{pro_quantity}
    Payment Status
    {order_payment_status}{shipping_method_lbl}{shipping_method}
    Order url
    {order_detail_link}
    ', 1, ''), + (160, 'Quotation User Register Mail', 'Quotation User Register Mail:', 'quotation_user_register', '0', '
    Username : {username}
    Password : {password}
    Click here : {link}
    ', 1, ''), + (175, 'RequestTaxExemptMail', 'RequestTaxExemptMail:', 'request_tax_exempt_mail', '0', '
    Vat Number{vat_number}
    User Name{username}
    Company Name{company_name}
    Country{country}
    State{state}
    Phone{phone}
    Zipcode{zipcode}
    Address{address}
    City{city}
    ', 1, ''); + +INSERT IGNORE INTO `#__redshop_mail` (`mail_id`, `mail_name`, `mail_subject`, `mail_section`, `mail_order_status`, `mail_body`, `published`, `mail_bcc`) VALUES + (185, 'Downloadable Email', 'Link to download your newly purchased product(s)', 'downloadable_product_mail', '0', '\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {order_date}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n

    Dear {fullname}

    \r\n

    Thanks for your recent purchase at our store. Here are the link(s) where you can download file/product that you have purchased.

    \r\n

    Order Date : {order_date}
    Order # : {order_number}
    Download Links :

    \r\n

    {product_serial_loop_start} {product_name} - {token}
    {product_serial_loop_end}

    \r\n

    Once again, thank you for shopping!

    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n
    ', 1, ''), + (186, 'Review', 'Review About Product', 'review_mail', '0', '

    To Admin,

    Username: {username}

    Product : {product_name}

    Please check this link : {product_link}

    Title : {title}

    Comment : {comment}

    ', 1, ''), + (187, 'Notify Stock', 'Stock Update Notification for {product_name}', 'notify_stock_mail', '0', '
    {stocknotify_intro_text}
    {product_detail}
    ', 1, ''), + (188, 'Invoice Mail', 'Invoice Mail', 'invoicefile_mail', '0', '
    redCOMPONENT

    {order_number_lbl} {order_number}

    Invoice No: {invoice_number}

    Date:{order_date}

    Thank you for your order!

    Thank you for ordering from redCOMPONENT!
    To download your purchased products please follow the link in the bottom of this mail.

    Products ordered:

    {product_name}{without_vat}{product_price}{product_quantity}{product_total_price}
     VAT{sub_total_vat}
     Total{order_total}

    Billing information:

    {billing_address}

    To see the details of your order and to download the products please click {order_detail_link}

    Regards,
    redCOMPONENT

    ', 1, ''); + +INSERT IGNORE INTO `#__redshop_shopper_group` ( `shopper_group_id` ,`shopper_group_name` ,`shopper_group_customer_type` ,`shopper_group_portal` ,`shopper_group_categories` ,`shopper_group_url` ,`shopper_group_logo` ,`shopper_group_introtext` ,`shopper_group_desc` ,`parent_id` ,`published`) +VALUES (1 , 'Default Private', '1', '0', '', '', '', 'This is the default private shopper group.', 'This is the default private shopper group.', '0', '1'); + +INSERT IGNORE INTO `#__redshop_shopper_group` ( `shopper_group_id` ,`shopper_group_name` ,`shopper_group_customer_type` ,`shopper_group_portal` ,`shopper_group_categories` ,`shopper_group_url` ,`shopper_group_logo` ,`shopper_group_introtext` ,`shopper_group_desc` ,`parent_id` ,`published`) +VALUES (2 , 'Default Company', '0', '0', '', '', '', 'This is the default Company shopper group.', 'This is the default Company shopper group.', '0', '1'); + +INSERT IGNORE INTO `#__redshop_shopper_group` ( `shopper_group_id` ,`shopper_group_name` ,`shopper_group_customer_type` ,`shopper_group_portal` ,`shopper_group_categories` ,`shopper_group_url` ,`shopper_group_logo` ,`shopper_group_introtext` ,`shopper_group_desc` ,`parent_id`, `published`) +VALUES (3 , 'Default Tax Exempt', '0', '0', '', '', '', 'This is the Default Tax Exempt shopper group.', 'This is the Default Tax Exempt shopper group.', '0', '1'); + +INSERT IGNORE INTO `#__redshop_tax_group` (`id` ,`name` ,`published`) +VALUES (1, 'Default','1'); + +INSERT IGNORE INTO `#__redshop_economic_accountgroup` (`accountgroup_id`, `accountgroup_name`, `economic_vat_account`, `economic_nonvat_account`, `economic_discount_nonvat_account`, `economic_shipping_vat_account`, `economic_shipping_nonvat_account`, `economic_discount_product_number`, `published`, `economic_service_nonvat_account`, `economic_discount_vat_account`) VALUES + (1, 'default account group', '4001', '4000', '4000', '4001', '4000', '191919', 1, '', '4001'); + +INSERT IGNORE INTO `#__redshop_newsletter` (`newsletter_id` , `name` , `subject` , `body` , `template_id` , `published`) +VALUES ('1', 'News Letter Demo', 'News Letter Demo', 'User Name : {username} Email : {email}', '29', '1'); + +INSERT IGNORE INTO `#__redshop_shipping_rate` (`shipping_rate_id`, `shipping_rate_name`, `shipping_class`, `shipping_rate_country`, `shipping_rate_zip_start`, `shipping_rate_zip_end`, `shipping_rate_weight_start`, `company_only`, `apply_vat`, `shipping_rate_weight_end`, `shipping_rate_volume_start`, `shipping_rate_volume_end`, `shipping_rate_ordertotal_start`, `shipping_rate_ordertotal_end`, `shipping_rate_priority`, `shipping_rate_value`, `shipping_rate_package_fee`, `shipping_location_info`, `shipping_rate_length_start`, `shipping_rate_length_end`, `shipping_rate_width_start`, `shipping_rate_width_end`, `shipping_rate_height_start`, `shipping_rate_height_end`, `shipping_rate_on_product`, `shipping_rate_on_category`, `shipping_tax_group_id`, `shipping_rate_state`) VALUES + (1, 'Demo Rate', 'default_shipping', '', '', '', 0.00, 0, 0, 0.00, 0.00, 0.00, 0.000, 0.000, 0, 0.00, 0.00, '', 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, '', '', 0, ''); + +INSERT IGNORE INTO `#__redshop_shipping_boxes` (`shipping_box_id`, `shipping_box_name`, `shipping_box_length`, `shipping_box_width`, `shipping_box_height`, `shipping_box_priority`, `published`) VALUES + (1, 'Box1', 1.00, 1.00, 1.00, 1, 1); + +LOCK TABLES `#__redshop_category` WRITE; +ALTER TABLE `#__redshop_category` DISABLE KEYS; +INSERT INTO `#__redshop_category` VALUES (NULL, 'ROOT', '', '', 0, '', 0, '', '', '', '', '', '', '', '', '', 1, '0000-00-00 00:00:00', 0, '', '', 0, 'append', 'root', '', 0, 0, 0, 0, 1, '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '0000-00-00 00:00:00', ''); +ALTER TABLE `#__redshop_category` ENABLE KEYS; +UNLOCK TABLES; + +INSERT IGNORE INTO `#__content_types` +(`type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) +VALUES +('redSHOP', 'com_redshop.product', '{"special":{"dbtable":"#__redshop_product","key":"product_id"}}', '', '{"common":{"core_content_item_id":"product_id","core_title":"product_name","core_state":"published","core_catid":"cat_in_sefurl"}}', 'RedshopHelperRoute::getProductRoute', ''); diff --git a/component/admin/sql/install/mysql/index.html b/component/admin/sql/install/mysql/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/sql/install/mysql/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/sql/install/mysql/install.sql b/component/admin/sql/install/mysql/install.sql new file mode 100644 index 00000000000..6e2b5951150 --- /dev/null +++ b/component/admin/sql/install/mysql/install.sql @@ -0,0 +1,2657 @@ +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; + +-- ----------------------------------------------------- +-- Table `#__redshop_attribute_set` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_attribute_set` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_attribute_set` ( + `attribute_set_id` INT(11) NOT NULL AUTO_INCREMENT, + `attribute_set_name` VARCHAR(255) NOT NULL, + `published` TINYINT(4) NOT NULL, + PRIMARY KEY (`attribute_set_id`), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Attribute set detail'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_cart` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_cart` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_cart` ( + `session_id` VARCHAR(255) NOT NULL, + `product_id` INT(11) NOT NULL, + `section` VARCHAR(250) NOT NULL, + `qty` INT(11) NOT NULL, + `time` DOUBLE NOT NULL, + INDEX `idx_session_id` (`session_id` ASC), + INDEX `idx_product_id` (`product_id` ASC), + INDEX `idx_section` (`section` ASC), + INDEX `idx_time` (`time` ASC), + PRIMARY KEY (`session_id`, `product_id`, `section`)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Cart'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_catalog` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_catalog` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_catalog` ( + `catalog_id` INT(11) NOT NULL AUTO_INCREMENT, + `catalog_name` VARCHAR(250) NOT NULL, + `published` TINYINT(4) NOT NULL, + PRIMARY KEY (`catalog_id`), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Catalog'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_catalog_colour` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_catalog_colour` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_catalog_colour` ( + `colour_id` INT(11) NOT NULL AUTO_INCREMENT, + `sample_id` INT(11) NOT NULL, + `code_image` VARCHAR(250) NOT NULL, + `is_image` TINYINT(4) NOT NULL, + PRIMARY KEY (`colour_id`), + INDEX `idx_sample_id` (`sample_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Catalog Colour'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_catalog_request` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_catalog_request` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_catalog_request` ( + `catalog_user_id` INT(11) NOT NULL AUTO_INCREMENT, + `catalog_id` INT(11) NOT NULL, + `name` VARCHAR(250) NOT NULL, + `email` VARCHAR(250) NOT NULL, + `registerDate` INT(11) NOT NULL, + `block` TINYINT(4) NOT NULL, + `reminder_1` TINYINT(4) NOT NULL, + `reminder_2` TINYINT(4) NOT NULL, + `reminder_3` TINYINT(4) NOT NULL, + PRIMARY KEY (`catalog_user_id`), + INDEX `idx_block` (`block` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Catalog Request'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_catalog_sample` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_catalog_sample` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_catalog_sample` ( + `sample_id` INT(11) NOT NULL AUTO_INCREMENT, + `sample_name` VARCHAR(100) NOT NULL, + `published` TINYINT(4) NOT NULL, + PRIMARY KEY (`sample_id`), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Catalog Sample'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_category` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_category` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_category` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(250) NOT NULL, + `short_description` LONGTEXT NOT NULL, + `description` LONGTEXT NOT NULL, + `template` INT(11) NOT NULL, + `more_template` VARCHAR(255) NOT NULL, + `products_per_page` INT(11) NOT NULL, + `category_thumb_image` VARCHAR(250) NOT NULL, + `category_full_image` VARCHAR(250) NOT NULL, + `metakey` VARCHAR(250) NOT NULL, + `metadesc` LONGTEXT NOT NULL, + `metalanguage_setting` TEXT NOT NULL, + `metarobot_info` TEXT NOT NULL, + `pagetitle` TEXT NOT NULL, + `pageheading` LONGTEXT NOT NULL, + `sef_url` TEXT NOT NULL, + `published` TINYINT(4) NOT NULL, + `category_pdate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `ordering` INT(11) NOT NULL, + `canonical_url` TEXT NOT NULL, + `category_back_full_image` VARCHAR(250) NOT NULL, + `compare_template_id` VARCHAR(255) NOT NULL, + `append_to_global_seo` ENUM('append', 'prepend', 'replace') NOT NULL DEFAULT 'append', + `alias` VARCHAR(255) NOT NULL, + `path` VARCHAR(255) NOT NULL, + `asset_id` INT(11) UNSIGNED NULL COMMENT 'FK to the #__assets table.', + `parent_id` INT(11) NULL DEFAULT 0, + `level` INT(11) UNSIGNED NOT NULL DEFAULT 0, + `lft` INT(11) NOT NULL DEFAULT 0, + `rgt` INT(11) NOT NULL DEFAULT 0, + `checked_out` INT(11) NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `publish_up` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `publish_down` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `product_filter_params` MEDIUMTEXT NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + INDEX `#__rs_idx_category_published` (`published` ASC), + INDEX `#__rs_idx_left_right` (`lft` ASC, `rgt` ASC), + INDEX `#__rs_idx_alias` (`alias` ASC), + INDEX `#__rs_idx_path` (`path` ASC), + INDEX `#__rs_idx_category_parent` (`parent_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Category'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_country` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_country` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_country` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `country_name` VARCHAR(64) NOT NULL DEFAULT '', + `country_3_code` CHAR(3) NOT NULL, + `country_2_code` CHAR(2) NOT NULL, + `country_jtext` VARCHAR(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `#__rs_idx_country_3_code` (`country_3_code` ASC), + UNIQUE INDEX `#__rs_idx_country_2_code` (`country_2_code` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'Country records'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_coupons` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_coupons` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_coupons` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `code` VARCHAR(32) NOT NULL DEFAULT '', + `type` TINYINT(4) NOT NULL DEFAULT 0, + `value` DECIMAL(12,2) NOT NULL DEFAULT '0.00', + `start_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `end_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `effect` TINYINT(4) NOT NULL DEFAULT 0 COMMENT '0 - Global, 1 - User Specific', + `userid` INT(11) NOT NULL, + `amount_left` INT(11) NOT NULL, + `published` TINYINT(4) NOT NULL, + `subtotal` INT(11) NOT NULL, + `order_id` INT(11) NOT NULL, + `free_shipping` TINYINT(4) NOT NULL, + `checked_out` INT(11) NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL, + `modified_by` INT(11) NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `#__rs_coupon_code` (`code` ASC), + INDEX `#__rs_coupon_type` (`type` ASC), + INDEX `#__rs_coupon_start_date` (`start_date` ASC), + INDEX `#__rs_coupon_end_date` (`end_date` ASC), + INDEX `#__rs_coupon_effect` (`effect` ASC), + INDEX `#__rs_coupon_user_id` (`userid` ASC), + INDEX `#__rs_coupon_left` (`amount_left` ASC), + INDEX `#__rs_coupon_published` (`published` ASC), + INDEX `#__rs_coupon_subtotal` (`subtotal` ASC), + INDEX `#__rs_coupon_order_id` (`order_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Coupons'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_coupons_transaction` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_coupons_transaction` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_coupons_transaction` ( + `transaction_coupon_id` INT(11) NOT NULL AUTO_INCREMENT, + `coupon_id` INT(11) NOT NULL, + `coupon_code` VARCHAR(255) NOT NULL, + `coupon_value` DECIMAL(10,3) NOT NULL, + `userid` INT(11) NOT NULL, + `trancation_date` INT(11) NOT NULL, + `published` INT(11) NOT NULL, + PRIMARY KEY (`transaction_coupon_id`), + INDEX `idx_coupon_id` (`coupon_id` ASC), + INDEX `idx_coupon_code` (`coupon_code` ASC), + INDEX `idx_coupon_value` (`coupon_value` ASC), + INDEX `idx_userid` (`userid` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Coupons Transaction'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_cron` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_cron` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_cron` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `date` DATE NOT NULL, + `published` TINYINT(4) NOT NULL, + PRIMARY KEY (`id`), + INDEX `idx_date` (`date` ASC), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Cron Job'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_currency` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_currency` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_currency` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(64) NULL DEFAULT NULL, + `code` CHAR(3) NULL DEFAULT NULL, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + UNIQUE INDEX `#__rs_cur_code` (`code` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Currency Detail'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product` ( + `product_id` INT(11) NOT NULL AUTO_INCREMENT, + `product_parent_id` INT(11) NOT NULL, + `manufacturer_id` INT(11) NOT NULL, + `supplier_id` INT(11) NOT NULL, + `product_on_sale` TINYINT(4) NOT NULL, + `product_special` TINYINT(4) NOT NULL, + `product_download` TINYINT(4) NOT NULL, + `product_template` INT(11) NOT NULL, + `product_name` VARCHAR(250) NOT NULL, + `product_price` DOUBLE NOT NULL, + `discount_price` DOUBLE NOT NULL, + `discount_stratdate` INT(11) NOT NULL, + `discount_enddate` INT(11) NOT NULL, + `product_number` VARCHAR(250) NOT NULL, + `product_type` VARCHAR(20) NOT NULL, + `product_s_desc` LONGTEXT NOT NULL, + `product_desc` LONGTEXT NOT NULL, + `product_volume` DOUBLE NOT NULL, + `product_tax_id` INT(11) NOT NULL, + `published` TINYINT(4) NOT NULL, + `product_thumb_image` VARCHAR(250) NOT NULL, + `product_full_image` VARCHAR(250) NOT NULL, + `publish_date` DATETIME NOT NULL, + `update_date` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP, + `visited` INT(11) NOT NULL, + `metakey` TEXT NOT NULL, + `metadesc` TEXT NOT NULL, + `metalanguage_setting` TEXT NOT NULL, + `metarobot_info` TEXT NOT NULL, + `pagetitle` TEXT NOT NULL, + `pageheading` TEXT NOT NULL, + `sef_url` TEXT NOT NULL, + `cat_in_sefurl` INT(11) NOT NULL, + `weight` FLOAT(10,3) NOT NULL, + `expired` TINYINT(4) NOT NULL, + `not_for_sale` TINYINT(4) NOT NULL, + `use_discount_calc` TINYINT(4) NOT NULL, + `discount_calc_method` VARCHAR(255) NOT NULL, + `min_order_product_quantity` INT(11) NOT NULL, + `attribute_set_id` INT(11) NOT NULL, + `product_length` DECIMAL(10,2) NOT NULL, + `product_height` DECIMAL(10,2) NOT NULL, + `product_width` DECIMAL(10,2) NOT NULL, + `product_diameter` DECIMAL(10,2) NOT NULL, + `product_availability_date` INT(11) NOT NULL, + `use_range` TINYINT(4) NOT NULL, + `product_tax_group_id` INT(11) NOT NULL, + `product_download_days` INT(11) NOT NULL, + `product_download_limit` INT(11) NOT NULL, + `product_download_clock` INT(11) NOT NULL, + `product_download_clock_min` INT(11) NOT NULL, + `accountgroup_id` INT(11) NOT NULL, + `canonical_url` TEXT NOT NULL, + `minimum_per_product_total` INT(11) NOT NULL, + `allow_decimal_piece` INT(4) NOT NULL, + `quantity_selectbox_value` VARCHAR(255) NOT NULL, + `checked_out` INT(11) NOT NULL, + `checked_out_time` DATETIME NOT NULL, + `max_order_product_quantity` INT(11) NOT NULL, + `product_download_infinite` TINYINT(4) NOT NULL, + `product_back_full_image` VARCHAR(250) NOT NULL, + `product_back_thumb_image` VARCHAR(250) NOT NULL, + `product_preview_image` VARCHAR(250) NOT NULL, + `product_preview_back_image` VARCHAR(250) NOT NULL, + `preorder` VARCHAR(255) NOT NULL, + `append_to_global_seo` ENUM('append', 'prepend', 'replace') NOT NULL DEFAULT 'append', + `use_individual_payment_method` TINYINT(4) NOT NULL DEFAULT 0, + PRIMARY KEY (`product_id`), + UNIQUE INDEX `idx_product_number` (`product_number` ASC), + INDEX `idx_manufacturer_id` (`manufacturer_id` ASC), + INDEX `idx_product_on_sale` (`product_on_sale` ASC), + INDEX `idx_product_special` (`product_special` ASC), + INDEX `idx_product_parent_id` (`product_parent_id` ASC), + INDEX `idx_common` (`published` ASC, `expired` ASC, `product_parent_id` ASC), + INDEX `#__rs_product_supplier_fk1` (`supplier_id` ASC), + INDEX `#__rs_prod_publish_parent` (`product_parent_id` ASC, `published` ASC), + INDEX `#__rs_prod_publish_parent_special` (`product_parent_id` ASC, `published` ASC, `product_special` ASC), + INDEX `#__prod_pub_exp_parent` (`product_parent_id` ASC, `published` ASC, `expired` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Products'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_customer_question` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_customer_question` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_customer_question` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `parent_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `question` LONGTEXT NOT NULL, + `user_id` INT(11) NOT NULL, + `user_name` VARCHAR(255) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + `published` TINYINT(4) NOT NULL, + `question_date` INT(11) NOT NULL, + `ordering` INT(11) NOT NULL, + `telephone` VARCHAR(50) NOT NULL, + `address` VARCHAR(250) NOT NULL, + PRIMARY KEY (`id`), + INDEX `#__rs_idx_published` (`published` ASC), + INDEX `#__rs_idx_product_id` (`product_id` ASC), + INDEX `#__rs_idx_parent_id` (`parent_id` ASC), + CONSTRAINT `#__rs_customer_question_fk1` + FOREIGN KEY (`product_id`) + REFERENCES `#__redshop_product` (`product_id`) + ON DELETE CASCADE + ON UPDATE CASCADE) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Customer Question'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_discount` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_discount` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_discount` ( + `discount_id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(250) NOT NULL, + `amount` INT(11) NOT NULL, + `condition` TINYINT(1) NOT NULL DEFAULT '1', + `discount_amount` DECIMAL(10,4) NOT NULL, + `discount_type` TINYINT(4) NOT NULL, + `start_date` DOUBLE NOT NULL, + `end_date` DOUBLE NOT NULL, + `published` TINYINT(4) NOT NULL, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + PRIMARY KEY (`discount_id`), + INDEX `idx_start_date` (`start_date` ASC), + INDEX `idx_end_date` (`end_date` ASC), + INDEX `idx_published` (`published` ASC), + INDEX `idx_discount_name` (`name` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Discount'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_discount_product` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_discount_product` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_discount_product` ( + `discount_product_id` INT(11) NOT NULL AUTO_INCREMENT, + `amount` INT(11) NOT NULL, + `condition` TINYINT(1) NOT NULL DEFAULT '1', + `discount_amount` DECIMAL(10,2) NOT NULL, + `discount_type` TINYINT(4) NOT NULL, + `start_date` DOUBLE NOT NULL, + `end_date` DOUBLE NOT NULL, + `published` TINYINT(4) NOT NULL, + `category_ids` TEXT NOT NULL, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + PRIMARY KEY (`discount_product_id`), + INDEX `idx_published` (`published` ASC), + INDEX `idx_start_date` (`start_date` ASC), + INDEX `idx_end_date` (`end_date` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8; + + +-- ----------------------------------------------------- +-- Table `#__redshop_discount_product_shoppers` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_discount_product_shoppers` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_discount_product_shoppers` ( + `discount_product_id` INT(11) NOT NULL, + `shopper_group_id` INT(11) NOT NULL, + INDEX `idx_discount_product_id` (`discount_product_id` ASC), + INDEX `idx_shopper_group_id` (`shopper_group_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8; + + +-- ----------------------------------------------------- +-- Table `#__redshop_discount_shoppers` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_discount_shoppers` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_discount_shoppers` ( + `discount_id` INT(11) NOT NULL, + `shopper_group_id` INT(11) NOT NULL, + INDEX `idx_discount_id` (`discount_id` ASC), + INDEX `idx_shopper_group_id` (`shopper_group_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8; + + +-- ----------------------------------------------------- +-- Table `#__redshop_economic_accountgroup` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_economic_accountgroup` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_economic_accountgroup` ( + `accountgroup_id` INT(11) NOT NULL AUTO_INCREMENT, + `accountgroup_name` VARCHAR(255) NOT NULL, + `economic_vat_account` VARCHAR(255) NOT NULL, + `economic_nonvat_account` VARCHAR(255) NOT NULL, + `economic_discount_nonvat_account` VARCHAR(255) NOT NULL, + `economic_shipping_vat_account` VARCHAR(255) NOT NULL, + `economic_shipping_nonvat_account` VARCHAR(255) NOT NULL, + `economic_discount_product_number` VARCHAR(255) NOT NULL, + `published` TINYINT(4) NOT NULL, + `economic_service_nonvat_account` VARCHAR(255) NOT NULL, + `economic_discount_vat_account` VARCHAR(255) NOT NULL, + PRIMARY KEY (`accountgroup_id`), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Economic Account Group'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_fields_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_fields_group` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_fields_group` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(125) NOT NULL, + `description` VARCHAR(1024) NOT NULL DEFAULT '', + `section` VARCHAR(20) NOT NULL, + `ordering` INT(11) NOT NULL DEFAULT 0, + `published` TINYINT(4) NOT NULL DEFAULT 0, + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `#__rs_feld_group_idx1` (`section` ASC), + INDEX `#__rs_feld_group_idx2` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'Custom fields groups'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_fields` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_fields` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_fields` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `title` VARCHAR(250) NOT NULL, + `name` VARCHAR(250) NOT NULL, + `type` VARCHAR(20) NOT NULL, + `desc` LONGTEXT NOT NULL, + `class` VARCHAR(20) NOT NULL, + `section` VARCHAR(20) NOT NULL, + `groupId` INT NULL DEFAULT NULL, + `maxlength` INT(11) NOT NULL, + `cols` INT(11) NOT NULL, + `rows` INT(11) NOT NULL, + `size` TINYINT(4) NOT NULL, + `show_in_front` TINYINT(4) NOT NULL, + `required` TINYINT(4) NOT NULL, + `published` TINYINT(4) NOT NULL, + `publish_up` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `publish_down` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `display_in_product` TINYINT(4) NOT NULL, + `ordering` INT(11) NOT NULL, + `display_in_checkout` TINYINT(4) NOT NULL, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name` (`name` ASC), + INDEX `#__rs_idx_field_published` (`published` ASC), + INDEX `#__rs_idx_field_section` (`section` ASC), + INDEX `#__rs_idx_field_type` (`type` ASC), + INDEX `#__rs_idx_field_required` (`required` ASC), + INDEX `#__rs_idx_field_name` (`name` ASC), + INDEX `#__rs_idx_field_show_in_front` (`show_in_front` ASC), + INDEX `#__rs_idx_field_display_in_product` (`display_in_product` ASC), + INDEX `#__rs_idx_field_common` (`id` ASC, `name` ASC, `published` ASC, `section` ASC), + INDEX `#__rs_field_fk1` (`groupId` ASC), + CONSTRAINT `#__rs_field_fk1` + FOREIGN KEY (`groupId`) + REFERENCES `#__redshop_fields_group` (`id`) + ON DELETE SET NULL + ON UPDATE CASCADE) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Fields'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_fields_data` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_fields_data` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_fields_data` ( + `data_id` INT(11) NOT NULL AUTO_INCREMENT, + `fieldid` INT(11) NULL DEFAULT NULL, + `data_txt` LONGTEXT NULL DEFAULT NULL, + `itemid` INT(11) NULL DEFAULT NULL, + `section` VARCHAR(20) NULL DEFAULT NULL, + `alt_text` VARCHAR(255) NOT NULL, + `image_link` VARCHAR(255) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + PRIMARY KEY (`data_id`), + INDEX `idx_fieldid` (`fieldid` ASC), + INDEX `idx_itemid` (`itemid` ASC), + INDEX `idx_section` (`section` ASC), + INDEX `#__field_data_common` (`itemid` ASC, `section` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Fields Data'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_fields_value` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_fields_value` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_fields_value` ( + `value_id` INT(11) NOT NULL AUTO_INCREMENT, + `field_id` INT(11) NOT NULL, + `field_value` VARCHAR(250) NOT NULL, + `field_name` VARCHAR(250) NOT NULL, + `alt_text` VARCHAR(255) NOT NULL, + `image_link` TEXT NOT NULL, + PRIMARY KEY (`value_id`), + INDEX `idx_field_id` (`field_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Fields Value'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_giftcard` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_giftcard` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_giftcard` ( + `giftcard_id` INT(11) NOT NULL AUTO_INCREMENT, + `giftcard_name` VARCHAR(255) NOT NULL, + `giftcard_price` DECIMAL(10,3) NOT NULL, + `giftcard_value` DECIMAL(10,3) NOT NULL, + `giftcard_validity` INT(11) NOT NULL, + `giftcard_date` INT(11) NOT NULL, + `giftcard_bgimage` VARCHAR(255) NOT NULL, + `giftcard_image` VARCHAR(255) NOT NULL, + `published` INT(11) NOT NULL, + `giftcard_desc` LONGTEXT NOT NULL, + `customer_amount` INT(11) NOT NULL, + `accountgroup_id` INT(11) NOT NULL, + `free_shipping` TINYINT NOT NULL, + PRIMARY KEY (`giftcard_id`), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Giftcard'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_mail` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_mail` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_mail` ( + `mail_id` INT(11) NOT NULL AUTO_INCREMENT, + `mail_name` VARCHAR(255) NOT NULL, + `mail_subject` VARCHAR(255) NOT NULL, + `mail_section` VARCHAR(255) NOT NULL, + `mail_order_status` VARCHAR(11) NOT NULL, + `mail_body` LONGTEXT NOT NULL, + `published` TINYINT(4) NOT NULL, + `mail_bcc` VARCHAR(255) NOT NULL, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + PRIMARY KEY (`mail_id`), + INDEX `idx_mail_section` (`mail_section` ASC), + INDEX `idx_mail_order_status` (`mail_order_status` ASC), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Mail Center'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_manufacturer` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_manufacturer` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_manufacturer` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(250) NOT NULL DEFAULT '', + `description` TEXT NOT NULL DEFAULT '', + `email` VARCHAR(250) NOT NULL DEFAULT '', + `product_per_page` INT(11) NOT NULL DEFAULT 0, + `template_id` INT(11) NOT NULL, + `metakey` TEXT NOT NULL DEFAULT '', + `metadesc` TEXT NOT NULL DEFAULT '', + `metalanguage_setting` TEXT NOT NULL DEFAULT '', + `metarobot_info` TEXT NOT NULL DEFAULT '', + `pagetitle` TEXT NOT NULL DEFAULT '', + `pageheading` TEXT NOT NULL DEFAULT '', + `sef_url` TEXT NOT NULL DEFAULT '', + `published` TINYINT(4) NOT NULL DEFAULT 1, + `ordering` INT(11) NOT NULL DEFAULT 0, + `manufacturer_url` VARCHAR(255) NOT NULL DEFAULT '', + `excluding_category_list` TEXT NOT NULL DEFAULT '', + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` VARCHAR(45) NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` VARCHAR(45) NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `#__manufacturer_published` (`published` ASC), + INDEX `#__manufacturer_common_idx` (`id` ASC, `name` ASC, `published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Manufacturer'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_mass_discount` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_mass_discount` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_mass_discount` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `discount_product` LONGTEXT NOT NULL DEFAULT '', + `category_id` LONGTEXT NOT NULL DEFAULT '', + `manufacturer_id` LONGTEXT NOT NULL DEFAULT '', + `type` TINYINT(4) NOT NULL, + `amount` DOUBLE(10,2) NOT NULL, + `start_date` INT(11) NOT NULL, + `end_date` INT(11) NOT NULL, + `name` VARCHAR(255) NOT NULL, + `checked_out` INT(11) NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Mass Discount.'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_media` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_media` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_media` ( + `media_id` INT(11) NOT NULL AUTO_INCREMENT, + `media_name` VARCHAR(250) NOT NULL, + `media_alternate_text` VARCHAR(255) NOT NULL, + `media_section` VARCHAR(20) NOT NULL, + `section_id` INT(11) NOT NULL, + `media_type` VARCHAR(250) NOT NULL, + `media_mimetype` VARCHAR(20) NOT NULL, + `published` TINYINT(4) NOT NULL, + `ordering` INT(11) NOT NULL, + `scope` VARCHAR(100) NOT NULL DEFAULT '', + PRIMARY KEY (`media_id`), + INDEX `idx_section_id` (`section_id` ASC), + INDEX `idx_media_section` (`media_section` ASC), + INDEX `idx_media_type` (`media_type` ASC), + INDEX `idx_media_name` (`media_name` ASC), + INDEX `idx_published` (`published` ASC), + INDEX `#__rs_idx_media_common` USING BTREE (`section_id` ASC, `media_section` ASC, `media_type` ASC, `published` ASC, `ordering` ASC), + INDEX `#__rs_idx_media_scope` (`scope` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Media'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_media_download` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_media_download` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_media_download` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `media_id` INT(11) NOT NULL, + PRIMARY KEY (`id`), + INDEX `idx_media_id` (`media_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Media Additional Downloadable Files'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_newsletter` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_newsletter` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_newsletter` ( + `newsletter_id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `subject` VARCHAR(255) NOT NULL, + `body` LONGTEXT NOT NULL, + `template_id` INT(11) NOT NULL, + `published` TINYINT(4) NOT NULL, + PRIMARY KEY (`newsletter_id`), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Newsletter'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_newsletter_subscription` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_newsletter_subscription` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_newsletter_subscription` ( + `subscription_id` INT(11) NOT NULL AUTO_INCREMENT, + `user_id` INT(11) NOT NULL, + `date` INT(11) NOT NULL, + `newsletter_id` INT(11) NOT NULL, + `name` VARCHAR(255) NOT NULL, + `email` VARCHAR(255) NOT NULL, + `checkout` TINYINT(4) NOT NULL, + `published` INT(11) NOT NULL, + PRIMARY KEY (`subscription_id`), + INDEX `idx_user_id` (`user_id` ASC), + INDEX `idx_newsletter_id` (`newsletter_id` ASC), + INDEX `idx_email` (`email` ASC), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Newsletter subscribers'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_newsletter_tracker` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_newsletter_tracker` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_newsletter_tracker` ( + `tracker_id` INT(11) NOT NULL AUTO_INCREMENT, + `newsletter_id` INT(11) NOT NULL, + `subscription_id` INT(11) NOT NULL, + `subscriber_name` VARCHAR(255) NOT NULL, + `user_id` INT(11) NOT NULL, + `read` TINYINT(4) NOT NULL, + `date` DOUBLE NOT NULL, + PRIMARY KEY (`tracker_id`), + INDEX `idx_newsletter_id` (`newsletter_id` ASC), + INDEX `idx_read` (`read` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Newsletter Tracker'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_notifystock_users` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_notifystock_users` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_notifystock_users` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL, + `property_id` INT(11) NOT NULL, + `subproperty_id` INT(11) NOT NULL, + `user_id` INT(11) NOT NULL, + `notification_status` INT(11) NOT NULL DEFAULT '0', + `email_not_login` VARCHAR(255) NULL, + PRIMARY KEY (`id`), + INDEX `idx_common` (`product_id` ASC, `property_id` ASC, `subproperty_id` ASC, `notification_status` ASC, `user_id` ASC), + INDEX `idx_user_id` (`user_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8; + + +-- ----------------------------------------------------- +-- Table `#__redshop_orderbarcode_log` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_orderbarcode_log` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_orderbarcode_log` ( + `log_id` INT(11) NOT NULL AUTO_INCREMENT, + `order_id` INT(11) NOT NULL, + `barcode` VARCHAR(255) NOT NULL, + `user_id` INT(11) NOT NULL, + `search_date` DATETIME NOT NULL, + PRIMARY KEY (`log_id`), + INDEX `idx_order_id` (`order_id` ASC)) +ENGINE = MyISAM +DEFAULT CHARACTER SET = utf8; + + +-- ----------------------------------------------------- +-- Table `#__redshop_ordernumber_track` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_ordernumber_track` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_ordernumber_track` ( + `trackdatetime` DATETIME NOT NULL) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Order number track'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_orders` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_orders` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_orders` ( + `order_id` INT(11) NOT NULL AUTO_INCREMENT, + `user_id` INT(11) NOT NULL DEFAULT '0', + `order_number` VARCHAR(32) NULL DEFAULT NULL, + `invoice_number_chrono` INT(11) NOT NULL COMMENT 'Order invoice number in chronological order', + `invoice_number` VARCHAR(255) NOT NULL COMMENT 'Formatted Order Invoice for final use', + `barcode` VARCHAR(13) NOT NULL, + `user_info_id` VARCHAR(32) NULL DEFAULT NULL, + `order_total` DECIMAL(15,2) NOT NULL DEFAULT '0.00', + `order_subtotal` DECIMAL(15,5) NULL DEFAULT NULL, + `order_tax` DECIMAL(10,2) NULL DEFAULT NULL, + `order_tax_details` TEXT NOT NULL, + `order_shipping` DECIMAL(10,2) NULL DEFAULT NULL, + `order_shipping_tax` DECIMAL(10,2) NULL DEFAULT NULL, + `coupon_discount` DECIMAL(12,2) NOT NULL DEFAULT '0.00', + `order_discount` DECIMAL(12,2) NOT NULL DEFAULT '0.00', + `special_discount_amount` DECIMAL(12,2) NOT NULL, + `payment_dicount` DECIMAL(12,2) NOT NULL, + `order_status` VARCHAR(5) NULL DEFAULT NULL, + `order_payment_status` VARCHAR(25) NOT NULL, + `cdate` INT(11) NULL DEFAULT NULL, + `mdate` INT(11) NULL DEFAULT NULL, + `ship_method_id` VARCHAR(255) NULL DEFAULT NULL, + `customer_note` TEXT NOT NULL, + `ip_address` VARCHAR(15) NOT NULL DEFAULT '', + `encr_key` VARCHAR(255) NOT NULL, + `invoice_no` VARCHAR(255) NOT NULL, + `mail1_status` TINYINT(1) NOT NULL, + `mail2_status` TINYINT(1) NOT NULL, + `mail3_status` TINYINT(1) NOT NULL, + `special_discount` DECIMAL(10,2) NOT NULL, + `payment_discount` DECIMAL(10,2) NOT NULL, + `is_booked` TINYINT(1) NOT NULL, + `order_label_create` TINYINT(1) NOT NULL, + `vm_order_number` VARCHAR(32) NOT NULL, + `requisition_number` VARCHAR(255) NOT NULL, + `bookinvoice_number` INT(11) NOT NULL, + `bookinvoice_date` INT(11) NOT NULL, + `referral_code` VARCHAR(50) NOT NULL, + `customer_message` VARCHAR(255) NOT NULL, + `shop_id` VARCHAR(255) NOT NULL, + `order_discount_vat` DECIMAL(10,3) NOT NULL, + `track_no` VARCHAR(250) NOT NULL, + `payment_oprand` VARCHAR(50) NOT NULL, + `discount_type` VARCHAR(255) NOT NULL, + `analytics_status` INT(1) NOT NULL, + `tax_after_discount` DECIMAL(10,3) NOT NULL, + `recuuring_subcription_id` VARCHAR(500) NOT NULL, + PRIMARY KEY (`order_id`), + INDEX `idx_orders_user_id` (`user_id` ASC), + INDEX `idx_orders_order_number` (`order_number` ASC), + INDEX `idx_orders_user_info_id` (`user_info_id` ASC), + INDEX `idx_orders_ship_method_id` (`ship_method_id` ASC), + INDEX `idx_barcode` (`barcode` ASC), + INDEX `idx_order_payment_status` (`order_payment_status` ASC), + INDEX `idx_order_status` (`order_status` ASC), + INDEX `vm_order_number` (`vm_order_number` ASC), + INDEX `idx_orders_invoice_number` (`invoice_number` ASC), + INDEX `idx_orders_invoice_number_chrono` (`invoice_number_chrono` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Order Detail'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_order_acc_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_order_acc_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_order_acc_item` ( + `order_item_acc_id` INT(11) NOT NULL AUTO_INCREMENT, + `order_item_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `order_acc_item_sku` VARCHAR(255) NOT NULL, + `order_acc_item_name` VARCHAR(255) NOT NULL, + `order_acc_price` DECIMAL(15,4) NOT NULL, + `order_acc_vat` DECIMAL(15,4) NOT NULL, + `product_quantity` INT(11) NOT NULL, + `product_acc_item_price` DECIMAL(15,4) NOT NULL, + `product_acc_final_price` DECIMAL(15,4) NOT NULL, + `product_attribute` TEXT NOT NULL, + PRIMARY KEY (`order_item_acc_id`)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Order Accessory Item Detail'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_order_attribute_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_order_attribute_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_order_attribute_item` ( + `order_att_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `order_item_id` INT(11) NOT NULL, + `section_id` INT(11) NOT NULL, + `section` VARCHAR(250) NOT NULL, + `parent_section_id` INT(11) NOT NULL, + `section_name` VARCHAR(250) NOT NULL, + `section_price` DECIMAL(15,4) NOT NULL, + `section_vat` DECIMAL(15,4) NOT NULL, + `section_oprand` CHAR(1) NOT NULL, + `is_accessory_att` TINYINT(4) NOT NULL, + `stockroom_id` VARCHAR(255) NOT NULL, + `stockroom_quantity` VARCHAR(255) NOT NULL, + PRIMARY KEY (`order_att_item_id`), + INDEX `idx_order_item_id` (`order_item_id` ASC), + INDEX `idx_section` (`section` ASC), + INDEX `idx_parent_section_id` (`parent_section_id` ASC), + INDEX `idx_is_accessory_att` (`is_accessory_att` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP order Attribute item'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_order_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_order_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_order_item` ( + `order_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `order_id` INT(11) NULL DEFAULT NULL, + `user_info_id` VARCHAR(32) NULL DEFAULT NULL, + `supplier_id` INT(11) NULL DEFAULT NULL, + `product_id` INT(11) NULL DEFAULT NULL, + `order_item_sku` VARCHAR(64) NOT NULL DEFAULT '', + `order_item_name` VARCHAR(255) NOT NULL, + `product_quantity` INT(11) NULL DEFAULT NULL, + `product_item_price` DECIMAL(15,4) NULL DEFAULT NULL, + `product_item_price_excl_vat` DECIMAL(15,4) NULL DEFAULT NULL, + `product_final_price` DECIMAL(12,4) NOT NULL DEFAULT '0.0000', + `order_item_currency` VARCHAR(16) NULL DEFAULT NULL, + `order_status` VARCHAR(250) NULL DEFAULT NULL, + `customer_note` TEXT NOT NULL, + `cdate` INT(11) NULL DEFAULT NULL, + `mdate` INT(11) NULL DEFAULT NULL, + `product_attribute` TEXT NULL DEFAULT NULL, + `product_accessory` TEXT NOT NULL, + `delivery_time` INT(11) NOT NULL, + `stockroom_id` VARCHAR(255) NOT NULL, + `stockroom_quantity` VARCHAR(255) NOT NULL, + `is_split` TINYINT(1) NOT NULL, + `attribute_image` TEXT NOT NULL, + `is_giftcard` TINYINT(4) NOT NULL, + `wrapper_id` INT(11) NOT NULL, + `wrapper_price` DECIMAL(10,2) NOT NULL, + `giftcard_user_name` VARCHAR(255) NOT NULL, + `giftcard_user_email` VARCHAR(255) NOT NULL, + `product_item_old_price` DECIMAL(10,4) NOT NULL, + `product_purchase_price` DECIMAL(10,4) NOT NULL, + `discount_calc_data` TEXT NOT NULL, + PRIMARY KEY (`order_item_id`), + INDEX `idx_order_id` (`order_id` ASC), + INDEX `idx_user_info_id` (`user_info_id` ASC), + INDEX `idx_product_id` (`product_id` ASC), + INDEX `idx_order_status` (`order_status` ASC), + INDEX `idx_cdate` (`cdate` ASC), + INDEX `idx_is_giftcard` (`is_giftcard` ASC), + INDEX `idx_product_quantity` USING BTREE (`product_id` ASC, `product_quantity` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Order Item Detail'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_order_payment` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_order_payment` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_order_payment` ( + `payment_order_id` BIGINT(20) NOT NULL AUTO_INCREMENT, + `order_id` INT(11) NOT NULL DEFAULT '0', + `payment_method_id` INT(11) NULL DEFAULT NULL, + `order_payment_code` VARCHAR(30) NOT NULL DEFAULT '', + `order_payment_cardname` BLOB NOT NULL, + `order_payment_number` BLOB NULL DEFAULT NULL, + `order_payment_ccv` BLOB NOT NULL, + `order_payment_amount` DOUBLE(10,2) NOT NULL, + `order_payment_expire` INT(11) NULL DEFAULT NULL, + `order_payment_name` VARCHAR(255) NULL DEFAULT NULL, + `payment_method_class` VARCHAR(256) NULL DEFAULT NULL, + `order_payment_trans_id` TEXT NOT NULL, + `authorize_status` VARCHAR(255) NULL DEFAULT NULL, + `order_transfee` DOUBLE(10,2) NOT NULL, + PRIMARY KEY (`payment_order_id`), + INDEX `idx_order_id` (`order_id` ASC), + INDEX `idx_payment_method_id` (`payment_method_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Order Payment Detail'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_order_status` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_order_status` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_order_status` ( + `order_status_id` INT(11) NOT NULL AUTO_INCREMENT, + `order_status_code` VARCHAR(64) NOT NULL, + `order_status_name` VARCHAR(64) NULL DEFAULT NULL, + `published` TINYINT(4) NOT NULL DEFAULT 0, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`order_status_id`), + UNIQUE INDEX `#__rs_idx_order_status_code` (`order_status_code` ASC), + INDEX `#__rs_idx_order_status_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Orders Status'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_order_status_log` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_order_status_log` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_order_status_log` ( + `order_status_log_id` INT(11) NOT NULL AUTO_INCREMENT, + `order_id` INT(11) NOT NULL, + `order_status` VARCHAR(5) NOT NULL, + `order_payment_status` VARCHAR(25) NOT NULL, + `date_changed` INT(11) NOT NULL, + `customer_note` TEXT NOT NULL, + PRIMARY KEY (`order_status_log_id`), + INDEX `idx_order_id` (`order_id` ASC), + INDEX `idx_order_status` (`order_status` ASC)) +ENGINE = MyISAM +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Orders Status history'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_order_users_info` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_order_users_info` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_order_users_info` ( + `order_info_id` INT(11) NOT NULL AUTO_INCREMENT, + `users_info_id` INT(11) NOT NULL, + `order_id` INT(11) NOT NULL, + `user_id` INT(11) NOT NULL, + `firstname` VARCHAR(250) NOT NULL, + `lastname` VARCHAR(250) NOT NULL, + `address_type` VARCHAR(255) NOT NULL, + `vat_number` VARCHAR(250) NOT NULL, + `tax_exempt` TINYINT(4) NOT NULL, + `shopper_group_id` INT(11) NOT NULL, + `address` VARCHAR(255) NOT NULL, + `city` VARCHAR(255) NOT NULL, + `country_code` VARCHAR(11) NOT NULL, + `state_code` VARCHAR(11) NOT NULL, + `zipcode` VARCHAR(255) NOT NULL, + `phone` VARCHAR(50) NOT NULL, + `tax_exempt_approved` TINYINT(1) NOT NULL, + `approved` TINYINT(1) NOT NULL, + `is_company` TINYINT(4) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + `company_name` VARCHAR(255) NOT NULL, + `ean_number` VARCHAR(250) NOT NULL, + `requesting_tax_exempt` TINYINT(4) NOT NULL, + `thirdparty_email` VARCHAR(255) NOT NULL, + PRIMARY KEY (`order_info_id`), + INDEX `idx_order_id` (`order_id` ASC), + INDEX `idx_address_type` (`address_type` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Order User Information'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_pageviewer` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_pageviewer` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_pageviewer` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `user_id` INT(11) NOT NULL, + `session_id` VARCHAR(250) NOT NULL, + `section` VARCHAR(250) NOT NULL, + `section_id` INT(11) NOT NULL, + `hit` INT(11) NOT NULL, + `created_date` INT(11) NOT NULL, + PRIMARY KEY (`id`), + INDEX `idx_session_id` (`session_id` ASC), + INDEX `idx_section` (`section` ASC), + INDEX `idx_section_id` (`section_id` ASC), + INDEX `idx_created_date` (`created_date` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Page Viewer'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_accessory` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_accessory` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_accessory` ( + `accessory_id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL, + `child_product_id` INT(11) NOT NULL, + `accessory_price` DOUBLE NOT NULL, + `oprand` CHAR(1) NOT NULL, + `setdefault_selected` TINYINT(4) NOT NULL, + `ordering` INT(11) NOT NULL, + `category_id` INT(11) NOT NULL, + PRIMARY KEY (`accessory_id`), + INDEX `idx_common` (`product_id` ASC, `child_product_id` ASC), + INDEX `idx_child_product_id` (`child_product_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Products Accessory'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_attribute` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_attribute` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_attribute` ( + `attribute_id` INT(11) NOT NULL AUTO_INCREMENT, + `attribute_name` VARCHAR(250) NOT NULL, + `attribute_required` TINYINT(4) NOT NULL, + `allow_multiple_selection` TINYINT(1) NOT NULL, + `hide_attribute_price` TINYINT(1) NOT NULL, + `product_id` INT(11) NOT NULL, + `ordering` INT(11) NOT NULL, + `attribute_set_id` INT(11) NOT NULL, + `display_type` VARCHAR(255) NOT NULL, + `attribute_published` INT(11) NOT NULL DEFAULT '1', + `attribute_description` VARCHAR(255) NOT NULL, + PRIMARY KEY (`attribute_id`), + INDEX `idx_product_id` (`product_id` ASC), + INDEX `idx_attribute_name` (`attribute_name` ASC), + INDEX `idx_attribute_set_id` (`attribute_set_id` ASC), + INDEX `idx_attribute_published` (`attribute_published` ASC), + INDEX `idx_attribute_required` (`attribute_required` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Products Attribute'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_attribute_price` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_attribute_price` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_attribute_price` ( + `price_id` INT(11) NOT NULL AUTO_INCREMENT, + `section_id` INT(11) NOT NULL, + `section` VARCHAR(255) NOT NULL, + `product_price` DOUBLE NOT NULL, + `product_currency` VARCHAR(10) NOT NULL, + `cdate` INT(11) NOT NULL, + `shopper_group_id` INT(11) NOT NULL, + `price_quantity_start` INT(11) NOT NULL, + `price_quantity_end` BIGINT(20) NOT NULL, + `discount_price` DOUBLE NOT NULL, + `discount_start_date` INT(11) NOT NULL, + `discount_end_date` INT(11) NOT NULL, + PRIMARY KEY (`price_id`), + INDEX `idx_shopper_group_id` (`shopper_group_id` ASC), + INDEX `idx_common` (`section_id` ASC, `section` ASC, `price_quantity_start` ASC, `price_quantity_end` ASC, `shopper_group_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Product Attribute Price'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_attribute_property` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_attribute_property` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_attribute_property` ( + `property_id` INT(11) NOT NULL AUTO_INCREMENT, + `attribute_id` INT(11) NOT NULL, + `property_name` VARCHAR(255) NOT NULL, + `property_price` DOUBLE NOT NULL, + `oprand` CHAR(1) NOT NULL DEFAULT '+', + `property_image` VARCHAR(255) NOT NULL, + `property_main_image` VARCHAR(255) NOT NULL, + `ordering` INT(11) NOT NULL, + `setdefault_selected` TINYINT(4) NOT NULL, + `setrequire_selected` TINYINT(3) NOT NULL, + `setmulti_selected` TINYINT(4) NOT NULL, + `setdisplay_type` VARCHAR(255) NOT NULL, + `extra_field` VARCHAR(250) NOT NULL, + `property_published` INT(11) NOT NULL DEFAULT '1', + `property_number` VARCHAR(255) NOT NULL, + PRIMARY KEY (`property_id`), + INDEX `idx_attribute_id` (`attribute_id` ASC), + INDEX `idx_setrequire_selected` (`setrequire_selected` ASC), + INDEX `idx_property_published` (`property_published` ASC), + INDEX `idx_property_number` (`property_number` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Products Attribute Property'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_attribute_stockroom_xref` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_attribute_stockroom_xref` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_attribute_stockroom_xref` ( + `section_id` INT(11) NOT NULL, + `section` VARCHAR(255) NOT NULL, + `stockroom_id` INT(11) NOT NULL, + `quantity` INT(11) NOT NULL, + `preorder_stock` INT(11) NOT NULL, + `ordered_preorder` INT(11) NOT NULL, + INDEX `idx_stockroom_id` (`stockroom_id` ASC), + INDEX `idx_common` (`section_id` ASC, `section` ASC, `stockroom_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Product Attribute Stockroom relation'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_category_xref` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_category_xref` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_category_xref` ( + `category_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `ordering` INT(11) NOT NULL, + INDEX `ref_category` (`product_id` ASC), + INDEX `#__prod_cat_idx1` (`category_id` ASC, `product_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Product Category Relation'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_compare` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_compare` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_compare` ( + `compare_id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL, + `user_id` INT(11) NOT NULL, + PRIMARY KEY (`compare_id`), + INDEX `idx_common` (`user_id` ASC, `product_id` ASC), + INDEX `idx_product_id` (`product_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Product Comparision'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_discount_calc` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_discount_calc` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_discount_calc` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL, + `area_start` FLOAT(10,2) NOT NULL, + `area_end` FLOAT(10,2) NOT NULL, + `area_price` DOUBLE NOT NULL, + `discount_calc_unit` VARCHAR(255) NOT NULL, + `area_start_converted` FLOAT(20,8) NOT NULL, + `area_end_converted` FLOAT(20,8) NOT NULL, + PRIMARY KEY (`id`), + INDEX `idx_product_id` (`product_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Product Discount Calculator'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_discount_calc_extra` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_discount_calc_extra` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_discount_calc_extra` ( + `pdcextra_id` INT(11) NOT NULL AUTO_INCREMENT, + `option_name` VARCHAR(255) NOT NULL, + `oprand` CHAR(1) NOT NULL, + `price` FLOAT(10,2) NOT NULL, + `product_id` INT(11) NOT NULL, + PRIMARY KEY (`pdcextra_id`), + INDEX `idx_product_id` (`product_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Product Discount Calculator Extra Value'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_download` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_download` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_download` ( + `product_id` INT(11) NOT NULL DEFAULT '0', + `user_id` INT(11) NOT NULL DEFAULT '0', + `order_id` INT(11) NOT NULL DEFAULT '0', + `end_date` INT(11) NOT NULL DEFAULT '0', + `download_max` INT(11) NOT NULL DEFAULT '0', + `download_id` VARCHAR(255) NOT NULL DEFAULT '', + `file_name` VARCHAR(255) NOT NULL DEFAULT '', + `product_serial_number` VARCHAR(255) NOT NULL DEFAULT '', + PRIMARY KEY (`download_id`), + INDEX `idx_product_id` (`product_id` ASC), + INDEX `idx_user_id` (`user_id` ASC), + INDEX `idx_order_id` (`order_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Downloadable Products'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_download_log` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_download_log` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_download_log` ( + `user_id` INT(11) NOT NULL, + `download_id` VARCHAR(32) NOT NULL, + `download_time` INT(11) NOT NULL, + `ip` VARCHAR(255) NOT NULL, + INDEX `idx_download_id` (`download_id` ASC)) +ENGINE = MyISAM +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Downloadable Products Logs'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_price` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_price` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_price` ( + `price_id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL, + `product_price` DECIMAL(12,4) NOT NULL, + `product_currency` VARCHAR(10) NOT NULL, + `cdate` DATE NOT NULL, + `shopper_group_id` INT(11) NOT NULL, + `price_quantity_start` INT(11) NOT NULL, + `price_quantity_end` BIGINT(20) NOT NULL, + `discount_price` DECIMAL(12,4) NOT NULL, + `discount_start_date` INT(11) NOT NULL, + `discount_end_date` INT(11) NOT NULL, + PRIMARY KEY (`price_id`), + INDEX `idx_product_id` (`product_id` ASC), + INDEX `idx_shopper_group_id` (`shopper_group_id` ASC), + INDEX `idx_price_quantity_start` (`price_quantity_start` ASC), + INDEX `idx_price_quantity_end` (`price_quantity_end` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Product Price'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_rating` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_rating` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_rating` ( + `rating_id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL DEFAULT '0', + `title` VARCHAR(255) NOT NULL, + `comment` TEXT NOT NULL, + `userid` INT(11) NOT NULL DEFAULT '0', + `time` INT(11) NOT NULL DEFAULT '0', + `user_rating` TINYINT(1) NOT NULL DEFAULT '0', + `favoured` TINYINT(4) NOT NULL, + `published` TINYINT(4) NOT NULL, + `email` VARCHAR(200) NOT NULL, + `username` VARCHAR(255) NOT NULL, + `company_name` VARCHAR(255) NOT NULL, + PRIMARY KEY (`rating_id`), + UNIQUE INDEX `product_id` (`product_id` ASC, `userid` ASC, `email` ASC), + INDEX `idx_published` (`published` ASC), + INDEX `idx_email` (`email` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_related` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_related` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_related` ( + `related_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `ordering` INT(11) NOT NULL, + INDEX `idx_product_id` (`product_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Related Products'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_serial_number` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_serial_number` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_serial_number` ( + `serial_id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL, + `serial_number` VARCHAR(255) NOT NULL, + `is_used` TINYINT(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`serial_id`), + INDEX `idx_common` (`product_id` ASC, `is_used` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP downloadable product serial numbers'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_stockroom_xref` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_stockroom_xref` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_stockroom_xref` ( + `product_id` INT(11) NOT NULL, + `stockroom_id` INT(11) NOT NULL, + `quantity` INT(11) NOT NULL, + `preorder_stock` INT(11) NOT NULL, + `ordered_preorder` INT(11) NOT NULL, + INDEX `idx_stockroom_id` (`stockroom_id` ASC), + INDEX `idx_product_id` (`product_id` ASC), + INDEX `idx_quantity` (`quantity` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Products Stockroom Relation'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_subattribute_color` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_subattribute_color` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_subattribute_color` ( + `subattribute_color_id` INT(11) NOT NULL AUTO_INCREMENT, + `subattribute_color_name` VARCHAR(255) NOT NULL, + `subattribute_color_price` DOUBLE NOT NULL, + `oprand` CHAR(1) NOT NULL, + `subattribute_color_image` VARCHAR(255) NOT NULL, + `subattribute_id` INT(11) NOT NULL, + `ordering` INT(11) NOT NULL, + `setdefault_selected` TINYINT(4) NOT NULL, + `extra_field` VARCHAR(250) NOT NULL, + `subattribute_published` INT(11) NOT NULL DEFAULT '1', + `subattribute_color_number` VARCHAR(255) NOT NULL, + `subattribute_color_title` VARCHAR(255) NOT NULL, + `subattribute_color_main_image` VARCHAR(255) NOT NULL, + PRIMARY KEY (`subattribute_color_id`), + INDEX `idx_subattribute_id` (`subattribute_id` ASC), + INDEX `idx_subattribute_published` (`subattribute_published` ASC), + INDEX `#__rs_sub_prop_common` (`subattribute_id` ASC, `subattribute_published` ASC, `ordering` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'Product Subattribute Color'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_subscribe_detail` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_subscribe_detail` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_subscribe_detail` ( + `product_subscribe_id` INT(11) NOT NULL AUTO_INCREMENT, + `order_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `subscription_id` INT(11) NOT NULL, + `user_id` INT(11) NOT NULL, + `start_date` INT(11) NOT NULL, + `end_date` INT(11) NOT NULL, + `order_item_id` INT(11) NOT NULL, + `renewal_reminder` TINYINT(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`product_subscribe_id`), + INDEX `idx_common` (`product_id` ASC, `end_date` ASC), + INDEX `idx_order_item_id` (`order_item_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP User product Subscribe detail'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_subscription` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_subscription` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_subscription` ( + `subscription_id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL, + `subscription_period` INT(11) NOT NULL, + `period_type` VARCHAR(10) NOT NULL, + `subscription_price` DOUBLE NOT NULL, + PRIMARY KEY (`subscription_id`), + INDEX `idx_product_id` (`product_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Product Subscription'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_tags` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_tags` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_tags` ( + `tags_id` INT(11) NOT NULL AUTO_INCREMENT, + `tags_name` VARCHAR(255) NOT NULL, + `tags_counter` INT(11) NOT NULL, + `published` TINYINT(4) NOT NULL, + PRIMARY KEY (`tags_id`), + INDEX `idx_published` (`published` ASC), + INDEX `idx_tags_name` (`tags_name` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'Product Tags'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_tags_xref` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_tags_xref` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_tags_xref` ( + `tags_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `users_id` INT(11) NOT NULL, + INDEX `idx_product_id` (`product_id` ASC), + INDEX `idx_users_id` (`users_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'Product Tags Relation With product and user'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_voucher_transaction` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_voucher_transaction` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_voucher_transaction` ( + `transaction_voucher_id` INT(11) NOT NULL AUTO_INCREMENT, + `voucher_id` INT(11) NOT NULL, + `voucher_code` VARCHAR(255) NOT NULL, + `amount` DECIMAL(10,3) NOT NULL, + `user_id` INT(11) NOT NULL, + `order_id` INT(11) NOT NULL, + `trancation_date` INT(11) NOT NULL, + `published` TINYINT(4) NOT NULL, + `product_id` VARCHAR(50) NOT NULL, + PRIMARY KEY (`transaction_voucher_id`), + INDEX `idx_voucher_id` (`voucher_id` ASC), + INDEX `idx_voucher_code` (`voucher_code` ASC), + INDEX `idx_amount` (`amount` ASC), + INDEX `idx_user_id` (`user_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Product Voucher Transaction'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_voucher_xref` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_voucher_xref` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_voucher_xref` ( + `voucher_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + INDEX `idx_common` (`voucher_id` ASC, `product_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Products Voucher Relation'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_quotation` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_quotation` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_quotation` ( + `quotation_id` INT(11) NOT NULL AUTO_INCREMENT, + `quotation_number` VARCHAR(50) NOT NULL, + `user_id` INT(11) NOT NULL, + `user_info_id` INT(11) NOT NULL, + `order_id` INT(11) NOT NULL, + `quotation_total` DECIMAL(15,2) NOT NULL, + `quotation_subtotal` DECIMAL(15,2) NOT NULL, + `quotation_tax` DECIMAL(15,2) NOT NULL, + `quotation_discount` DECIMAL(15,4) NOT NULL, + `quotation_status` INT(11) NOT NULL, + `quotation_cdate` INT(11) NOT NULL, + `quotation_mdate` INT(11) NOT NULL, + `quotation_note` TEXT NOT NULL, + `quotation_customer_note` TEXT NOT NULL, + `quotation_ipaddress` VARCHAR(20) NOT NULL, + `quotation_encrkey` VARCHAR(255) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + `quotation_special_discount` DECIMAL(15,4) NOT NULL, + PRIMARY KEY (`quotation_id`), + INDEX `idx_user_id` (`user_id` ASC), + INDEX `idx_order_id` (`order_id` ASC), + INDEX `idx_quotation_status` (`quotation_status` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Quotation'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_quotation_accessory_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_quotation_accessory_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_quotation_accessory_item` ( + `quotation_item_acc_id` INT(11) NOT NULL AUTO_INCREMENT, + `quotation_item_id` INT(11) NOT NULL, + `accessory_id` INT(11) NOT NULL, + `accessory_item_sku` VARCHAR(255) NOT NULL, + `accessory_item_name` VARCHAR(255) NOT NULL, + `accessory_price` DECIMAL(15,4) NOT NULL, + `accessory_vat` DECIMAL(15,4) NOT NULL, + `accessory_quantity` INT(11) NOT NULL, + `accessory_item_price` DECIMAL(15,2) NOT NULL, + `accessory_final_price` DECIMAL(15,2) NOT NULL, + `accessory_attribute` TEXT NOT NULL, + PRIMARY KEY (`quotation_item_acc_id`), + INDEX `idx_quotation_item_id` (`quotation_item_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Quotation Accessory item'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_quotation_attribute_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_quotation_attribute_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_quotation_attribute_item` ( + `quotation_att_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `quotation_item_id` INT(11) NOT NULL, + `section_id` INT(11) NOT NULL, + `section` VARCHAR(250) NOT NULL, + `parent_section_id` INT(11) NOT NULL, + `section_name` VARCHAR(250) NOT NULL, + `section_price` DECIMAL(15,4) NOT NULL, + `section_vat` DECIMAL(15,4) NOT NULL, + `section_oprand` CHAR(1) NOT NULL, + `is_accessory_att` TINYINT(4) NOT NULL, + PRIMARY KEY (`quotation_att_item_id`), + INDEX `idx_quotation_item_id` (`quotation_item_id` ASC), + INDEX `idx_section` (`section` ASC), + INDEX `idx_parent_section_id` (`parent_section_id` ASC), + INDEX `idx_is_accessory_att` (`is_accessory_att` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Quotation Attribute item'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_quotation_fields_data` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_quotation_fields_data` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_quotation_fields_data` ( + `data_id` INT(11) NOT NULL AUTO_INCREMENT, + `fieldid` INT(11) NULL DEFAULT NULL, + `data_txt` LONGTEXT NULL DEFAULT NULL, + `quotation_item_id` INT(11) NULL DEFAULT NULL, + `section` VARCHAR(20) NULL DEFAULT NULL, + PRIMARY KEY (`data_id`), + INDEX `quotation_item_id` (`quotation_item_id` ASC), + INDEX `idx_fieldid` (`fieldid` ASC), + INDEX `idx_quotation_item_id` (`quotation_item_id` ASC), + INDEX `idx_section` (`section` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Quotation USer field'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_quotation_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_quotation_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_quotation_item` ( + `quotation_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `quotation_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `product_name` VARCHAR(255) NOT NULL, + `product_price` DECIMAL(15,4) NOT NULL, + `product_excl_price` DECIMAL(15,4) NOT NULL, + `product_final_price` DECIMAL(15,4) NOT NULL, + `actualitem_price` DECIMAL(15,4) NOT NULL, + `product_quantity` INT(11) NOT NULL, + `product_attribute` TEXT NOT NULL, + `product_accessory` TEXT NOT NULL, + `mycart_accessory` TEXT NOT NULL, + `product_wrapperid` INT(11) NOT NULL, + `wrapper_price` DECIMAL(15,2) NOT NULL, + `is_giftcard` TINYINT(4) NOT NULL, + PRIMARY KEY (`quotation_item_id`), + INDEX `quotation_id` (`quotation_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Quotation Item'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_sample_request` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_sample_request` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_sample_request` ( + `request_id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(250) NOT NULL, + `email` VARCHAR(250) NOT NULL, + `colour_id` VARCHAR(250) NOT NULL, + `block` TINYINT(4) NOT NULL, + `reminder_1` TINYINT(1) NOT NULL, + `reminder_2` TINYINT(1) NOT NULL, + `reminder_3` TINYINT(1) NOT NULL, + `reminder_coupon` TINYINT(1) NOT NULL, + `registerdate` INT(11) NOT NULL, + PRIMARY KEY (`request_id`), + INDEX `idx_block` (`block` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Sample Request'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_shipping_boxes` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_shipping_boxes` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_shipping_boxes` ( + `shipping_box_id` INT(11) NOT NULL AUTO_INCREMENT, + `shipping_box_name` VARCHAR(255) NOT NULL, + `shipping_box_length` DECIMAL(10,2) NOT NULL, + `shipping_box_width` DECIMAL(10,2) NOT NULL, + `shipping_box_height` DECIMAL(10,2) NOT NULL, + `shipping_box_priority` INT(11) NOT NULL, + `published` TINYINT(4) NOT NULL, + PRIMARY KEY (`shipping_box_id`), + INDEX `idx_published` (`published` ASC), + INDEX `idx_common` (`shipping_box_length` ASC, `shipping_box_width` ASC, `shipping_box_height` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Shipping Boxes'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_shipping_rate` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_shipping_rate` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_shipping_rate` ( + `shipping_rate_id` INT(11) NOT NULL AUTO_INCREMENT, + `shipping_rate_name` VARCHAR(255) NOT NULL DEFAULT '', + `shipping_class` VARCHAR(255) NOT NULL DEFAULT '', + `shipping_rate_country` LONGTEXT NOT NULL, + `shipping_rate_zip_start` VARCHAR(20) NOT NULL, + `shipping_rate_zip_end` VARCHAR(20) NOT NULL, + `shipping_rate_weight_start` DECIMAL(10,2) NOT NULL, + `company_only` TINYINT(4) NOT NULL, + `apply_vat` TINYINT(4) NOT NULL, + `shipping_rate_weight_end` DECIMAL(10,2) NOT NULL, + `shipping_rate_volume_start` DECIMAL(10,2) NOT NULL, + `shipping_rate_volume_end` DECIMAL(10,2) NOT NULL, + `shipping_rate_ordertotal_start` DECIMAL(10,3) NOT NULL DEFAULT '0.000', + `shipping_rate_ordertotal_end` DECIMAL(10,3) NOT NULL, + `shipping_rate_priority` TINYINT(4) NOT NULL DEFAULT '0', + `shipping_rate_value` DECIMAL(10,2) NOT NULL DEFAULT '0.00', + `shipping_rate_package_fee` DECIMAL(10,2) NOT NULL DEFAULT '0.00', + `shipping_location_info` LONGTEXT NOT NULL, + `shipping_rate_length_start` DECIMAL(10,2) NOT NULL, + `shipping_rate_length_end` DECIMAL(10,2) NOT NULL, + `shipping_rate_width_start` DECIMAL(10,2) NOT NULL, + `shipping_rate_width_end` DECIMAL(10,2) NOT NULL, + `shipping_rate_height_start` DECIMAL(10,2) NOT NULL, + `shipping_rate_height_end` DECIMAL(10,2) NOT NULL, + `shipping_rate_on_shopper_group` LONGTEXT NOT NULL, + `consignor_carrier_code` VARCHAR(255) NOT NULL, + `shipping_tax_group_id` INT(11) NOT NULL, + `deliver_type` INT(11) NOT NULL, + `economic_displaynumber` VARCHAR(255) NOT NULL, + `shipping_rate_on_product` LONGTEXT NOT NULL, + `shipping_rate_on_category` LONGTEXT NOT NULL, + `shipping_rate_state` LONGTEXT NOT NULL, + PRIMARY KEY (`shipping_rate_id`), + INDEX `shipping_rate_name` (`shipping_rate_name` ASC), + INDEX `shipping_class` (`shipping_class` ASC), + INDEX `shipping_rate_zip_start` (`shipping_rate_zip_start` ASC), + INDEX `shipping_rate_zip_end` (`shipping_rate_zip_end` ASC), + INDEX `company_only` (`company_only` ASC), + INDEX `shipping_rate_value` (`shipping_rate_value` ASC), + INDEX `shipping_tax_group_id` (`shipping_tax_group_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Shipping Rates'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_shopper_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_shopper_group` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_shopper_group` ( + `shopper_group_id` INT(11) NOT NULL AUTO_INCREMENT, + `shopper_group_name` VARCHAR(32) NULL DEFAULT NULL, + `shopper_group_customer_type` TINYINT(4) NOT NULL, + `shopper_group_portal` TINYINT(4) NOT NULL, + `shopper_group_categories` LONGTEXT NOT NULL, + `shopper_group_url` VARCHAR(255) NOT NULL, + `shopper_group_logo` VARCHAR(255) NOT NULL, + `shopper_group_introtext` LONGTEXT NOT NULL, + `shopper_group_desc` TEXT NULL DEFAULT NULL, + `parent_id` INT(11) NOT NULL, + `default_shipping` TINYINT(4) NOT NULL, + `default_shipping_rate` FLOAT(10,2) NOT NULL, + `published` TINYINT(4) NOT NULL, + `shopper_group_cart_checkout_itemid` INT(11) NOT NULL, + `shopper_group_cart_itemid` INT(11) NOT NULL, + `shopper_group_quotation_mode` TINYINT(4) NOT NULL, + `show_price_without_vat` TINYINT(4) NOT NULL, + `tax_group_id` INT(11) NOT NULL, + `apply_product_price_vat` INT(11) NOT NULL, + `show_price` VARCHAR(255) NOT NULL DEFAULT 'global', + `use_as_catalog` VARCHAR(255) NOT NULL DEFAULT 'global', + `is_logged_in` INT(11) NOT NULL DEFAULT '1', + `shopper_group_manufactures` TEXT NOT NULL, + PRIMARY KEY (`shopper_group_id`), + INDEX `idx_shopper_group_name` (`shopper_group_name` ASC), + INDEX `idx_published` (`published` ASC), + INDEX `idx_parent_id` (`parent_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'Shopper Groups that users can be assigned to'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_siteviewer` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_siteviewer` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_siteviewer` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `user_id` INT(11) NOT NULL, + `session_id` VARCHAR(250) NOT NULL, + `created_date` INT(11) NOT NULL, + PRIMARY KEY (`id`), + INDEX `idx_session_id` (`session_id` ASC), + INDEX `idx_created_date` (`created_date` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Site Viewer'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_state` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_state` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_state` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `country_id` INT(11) NULL DEFAULT NULL, + `state_name` VARCHAR(64) NULL DEFAULT NULL, + `state_3_code` CHAR(3) NULL DEFAULT NULL, + `state_2_code` CHAR(2) NULL DEFAULT NULL, + `checked_out` INT(11) NOT NULL, + `checked_out_time` DATETIME NOT NULL, + `show_state` INT(11) NOT NULL DEFAULT '2', + PRIMARY KEY (`id`), + UNIQUE INDEX `#__rs_idx_state_3_code` (`country_id` ASC, `state_3_code` ASC), + UNIQUE INDEX `#__rs_idx_state_2_code` (`country_id` ASC, `state_2_code` ASC), + INDEX `#__rs_state_country_fk1` (`country_id` ASC), + CONSTRAINT `#__rs_state_country_fk1` + FOREIGN KEY (`country_id`) + REFERENCES `#__redshop_country` (`id`) + ON DELETE SET NULL + ON UPDATE CASCADE) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'States that are assigned to a country'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_stockroom` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_stockroom` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_stockroom` ( + `stockroom_id` INT(11) NOT NULL AUTO_INCREMENT, + `stockroom_name` VARCHAR(250) NOT NULL, + `min_stock_amount` INT(11) NOT NULL, + `stockroom_desc` LONGTEXT NOT NULL, + `creation_date` DOUBLE NOT NULL, + `min_del_time` INT(11) NOT NULL, + `max_del_time` INT(11) NOT NULL, + `show_in_front` TINYINT(1) NOT NULL, + `delivery_time` VARCHAR(255) NOT NULL, + `published` TINYINT(4) NOT NULL, + PRIMARY KEY (`stockroom_id`), + INDEX `idx_published` (`published` ASC), + INDEX `idx_min_del_time` (`min_del_time` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Stockroom'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_stockroom_amount_image` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_stockroom_amount_image` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_stockroom_amount_image` ( + `stock_amount_id` INT(11) NOT NULL AUTO_INCREMENT, + `stockroom_id` INT(11) NOT NULL, + `stock_option` TINYINT(4) NOT NULL, + `stock_quantity` INT(11) NOT NULL, + `stock_amount_image` VARCHAR(255) NOT NULL, + `stock_amount_image_tooltip` TEXT NOT NULL, + PRIMARY KEY (`stock_amount_id`), + INDEX `idx_stockroom_id` (`stockroom_id` ASC), + INDEX `idx_stock_option` (`stock_option` ASC), + INDEX `idx_stock_quantity` (`stock_quantity` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP stockroom amount image'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_subscription_renewal` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_subscription_renewal` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_subscription_renewal` ( + `renewal_id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL, + `before_no_days` INT(11) NOT NULL, + PRIMARY KEY (`renewal_id`), + INDEX `idx_common` (`product_id` ASC, `before_no_days` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Subscription Renewal'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_supplier` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_supplier` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_supplier` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL DEFAULT '', + `description` TEXT NOT NULL DEFAULT '', + `email` VARCHAR(255) NOT NULL DEFAULT '', + `published` TINYINT(4) NOT NULL DEFAULT 0, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` VARCHAR(45) NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `#__rs_idx_supplier_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Supplier'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_tax_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_tax_group` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_tax_group` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL, + `published` TINYINT(4) NOT NULL, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Tax Group'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_tax_rate` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_tax_rate` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_tax_rate` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL DEFAULT '', + `tax_state` VARCHAR(64) NULL DEFAULT NULL, + `tax_country` VARCHAR(64) NULL DEFAULT NULL, + `mdate` INT(11) NULL DEFAULT NULL, + `tax_rate` DECIMAL(10,4) NULL DEFAULT NULL, + `tax_group_id` INT(11) NOT NULL, + `is_eu_country` TINYINT(4) NOT NULL, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `idx_tax_group_id` (`tax_group_id` ASC), + INDEX `idx_tax_country` (`tax_country` ASC), + INDEX `idx_tax_state` (`tax_state` ASC), + INDEX `idx_is_eu_country` (`is_eu_country` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Tax Rates'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_template` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_template` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_template` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(250) NOT NULL DEFAULT '', + `section` VARCHAR(250) NOT NULL DEFAULT '', + `file_name` VARCHAR(255) NOT NULL DEFAULT '', + `order_status` VARCHAR(250) NOT NULL DEFAULT '', + `payment_methods` VARCHAR(250) NOT NULL DEFAULT '', + `published` TINYINT(4) NOT NULL DEFAULT 0, + `shipping_methods` VARCHAR(255) NOT NULL DEFAULT '', + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `#__rs_tmpl_section` (`section` ASC), + INDEX `#__rs_tmpl_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Templates Detail'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_textlibrary` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_textlibrary` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_textlibrary` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(255) NOT NULL DEFAULT '', + `desc` VARCHAR(255) NOT NULL DEFAULT '', + `content` TEXT NOT NULL DEFAULT '', + `section` VARCHAR(255) NOT NULL, + `published` TINYINT(4) NOT NULL DEFAULT 1, + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `#__rs_text_tag_section` (`section` ASC), + INDEX `#__rs_text_tag_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP TextLibrary'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_usercart` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_usercart` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_usercart` ( + `cart_id` INT(11) NOT NULL AUTO_INCREMENT, + `user_id` INT(11) NOT NULL, + `cdate` INT(11) NOT NULL, + `mdate` INT(11) NOT NULL, + PRIMARY KEY (`cart_id`), + INDEX `idx_user_id` (`user_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP User Cart Item'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_usercart_accessory_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_usercart_accessory_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_usercart_accessory_item` ( + `cart_acc_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `cart_item_id` INT(11) NOT NULL, + `accessory_id` INT(11) NOT NULL, + `accessory_quantity` INT(11) NOT NULL, + PRIMARY KEY (`cart_acc_item_id`), + INDEX `idx_cart_item_id` (`cart_item_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP User Cart Accessory Item'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_usercart_attribute_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_usercart_attribute_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_usercart_attribute_item` ( + `cart_att_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `cart_item_id` INT(11) NOT NULL, + `section_id` INT(11) NOT NULL, + `section` VARCHAR(25) NOT NULL, + `parent_section_id` INT(11) NOT NULL, + `is_accessory_att` TINYINT(4) NOT NULL, + PRIMARY KEY (`cart_att_item_id`), + INDEX `idx_common` (`is_accessory_att` ASC, `section` ASC, `parent_section_id` ASC, `cart_item_id` ASC), + INDEX `idx_cart_item_id` (`cart_item_id` ASC), + INDEX `idx_parent_section_id` (`parent_section_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP User cart Attribute Item'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_usercart_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_usercart_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_usercart_item` ( + `cart_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `cart_idx` INT(11) NOT NULL, + `cart_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `product_quantity` INT(11) NOT NULL, + `product_wrapper_id` INT(11) NOT NULL, + `product_subscription_id` INT(11) NOT NULL, + `giftcard_id` INT(11) NOT NULL, + `attribs` VARCHAR(5120) NOT NULL COMMENT 'Specified user attributes related with current item', + PRIMARY KEY (`cart_item_id`), + INDEX `idx_cart_id` (`cart_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP User Cart Item'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_users_info` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_users_info` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_users_info` ( + `users_info_id` INT(11) NOT NULL AUTO_INCREMENT, + `user_id` INT(11) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + `address_type` VARCHAR(11) NOT NULL, + `firstname` VARCHAR(250) NOT NULL, + `lastname` VARCHAR(250) NOT NULL, + `vat_number` VARCHAR(250) NOT NULL, + `tax_exempt` TINYINT(4) NOT NULL, + `shopper_group_id` INT(11) NOT NULL, + `country_code` VARCHAR(11) NOT NULL, + `address` VARCHAR(255) NOT NULL, + `city` VARCHAR(50) NOT NULL, + `state_code` VARCHAR(11) NOT NULL, + `zipcode` VARCHAR(255) NOT NULL, + `phone` VARCHAR(50) NOT NULL, + `tax_exempt_approved` TINYINT(1) NOT NULL, + `approved` TINYINT(1) NOT NULL, + `is_company` TINYINT(4) NOT NULL, + `ean_number` VARCHAR(250) NOT NULL, + `braintree_vault_number` VARCHAR(255) NOT NULL, + `veis_vat_number` VARCHAR(255) NOT NULL, + `veis_status` VARCHAR(255) NOT NULL, + `company_name` VARCHAR(255) NOT NULL, + `requesting_tax_exempt` TINYINT(4) NOT NULL, + `accept_terms_conditions` TINYINT(4) NOT NULL, + PRIMARY KEY (`users_info_id`), + INDEX `idx_common` (`address_type` ASC, `user_id` ASC), + INDEX `user_id` (`user_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Users Information'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_wishlist` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_wishlist` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_wishlist` ( + `wishlist_id` INT(11) NOT NULL AUTO_INCREMENT, + `wishlist_name` VARCHAR(100) NOT NULL, + `user_id` INT(11) NOT NULL, + `comment` MEDIUMTEXT NOT NULL, + `cdate` DOUBLE NOT NULL, + PRIMARY KEY (`wishlist_id`), + INDEX `idx_user_id` (`user_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP wishlist'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_wishlist_product` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_wishlist_product` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_wishlist_product` ( + `wishlist_product_id` INT(11) NOT NULL AUTO_INCREMENT, + `wishlist_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `cdate` INT(11) NOT NULL, + PRIMARY KEY (`wishlist_product_id`), + INDEX `idx_wishlist_id` (`wishlist_id` ASC), + INDEX `idx_common` (`product_id` ASC, `wishlist_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Wishlist Product'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_wishlist_userfielddata` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_wishlist_userfielddata` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_wishlist_userfielddata` ( + `fieldid` INT(11) NOT NULL AUTO_INCREMENT, + `wishlist_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `userfielddata` TEXT NOT NULL, + PRIMARY KEY (`fieldid`), + INDEX `idx_common` (`wishlist_id` ASC, `product_id` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Wishlist Product userfielddata'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_wrapper` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_wrapper` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_wrapper` ( + `wrapper_id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` VARCHAR(255) NOT NULL, + `category_id` VARCHAR(250) NOT NULL, + `wrapper_name` VARCHAR(255) NOT NULL, + `wrapper_price` DOUBLE NOT NULL, + `wrapper_image` VARCHAR(255) NOT NULL, + `createdate` INT(11) NOT NULL, + `wrapper_use_to_all` TINYINT(4) NOT NULL, + `published` TINYINT(4) NOT NULL, + PRIMARY KEY (`wrapper_id`), + INDEX `idx_wrapper_use_to_all` (`wrapper_use_to_all` ASC), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Wrapper'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_xml_export` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_xml_export` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_xml_export` ( + `xmlexport_id` INT(11) NOT NULL AUTO_INCREMENT, + `filename` VARCHAR(255) NOT NULL, + `display_filename` VARCHAR(255) NOT NULL, + `parent_name` VARCHAR(255) NOT NULL, + `section_type` VARCHAR(255) NOT NULL, + `auto_sync` TINYINT(4) NOT NULL, + `sync_on_request` TINYINT(4) NOT NULL, + `auto_sync_interval` INT(11) NOT NULL, + `xmlexport_date` INT(11) NOT NULL, + `xmlexport_filetag` TEXT NOT NULL, + `element_name` VARCHAR(255) NULL DEFAULT NULL, + `published` TINYINT(4) NOT NULL, + `use_to_all_users` TINYINT(4) NOT NULL, + `xmlexport_billingtag` TEXT NOT NULL, + `billing_element_name` VARCHAR(255) NOT NULL, + `xmlexport_shippingtag` TEXT NOT NULL, + `shipping_element_name` VARCHAR(255) NOT NULL, + `xmlexport_orderitemtag` TEXT NOT NULL, + `orderitem_element_name` VARCHAR(255) NOT NULL, + `xmlexport_stocktag` TEXT NOT NULL, + `stock_element_name` VARCHAR(255) NOT NULL, + `xmlexport_prdextrafieldtag` TEXT NOT NULL, + `prdextrafield_element_name` VARCHAR(255) NOT NULL, + `xmlexport_on_category` TEXT NOT NULL, + PRIMARY KEY (`xmlexport_id`), + INDEX `idx_filename` (`filename` ASC), + INDEX `idx_auto_sync` (`auto_sync` ASC), + INDEX `idx_sync_on_request` (`sync_on_request` ASC), + INDEX `idx_auto_sync_interval` (`auto_sync_interval` ASC), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP XML Export'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_xml_export_ipaddress` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_xml_export_ipaddress` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_xml_export_ipaddress` ( + `xmlexport_ip_id` INT(11) NOT NULL AUTO_INCREMENT, + `xmlexport_id` INT(11) NOT NULL, + `access_ipaddress` VARCHAR(255) NOT NULL, + PRIMARY KEY (`xmlexport_ip_id`), + INDEX `idx_xmlexport_id` (`xmlexport_id` ASC), + INDEX `idx_access_ipaddress` (`access_ipaddress` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP XML Export Ip Address'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_xml_export_log` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_xml_export_log` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_xml_export_log` ( + `xmlexport_log_id` INT(11) NOT NULL AUTO_INCREMENT, + `xmlexport_id` INT(11) NOT NULL, + `xmlexport_filename` VARCHAR(255) NOT NULL, + `xmlexport_date` INT(11) NOT NULL, + PRIMARY KEY (`xmlexport_log_id`), + INDEX `idx_xmlexport_id` (`xmlexport_id` ASC), + INDEX `idx_xmlexport_filename` (`xmlexport_filename` ASC)) +ENGINE = MyISAM +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP XML Export log'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_xml_import` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_xml_import` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_xml_import` ( + `xmlimport_id` INT(11) NOT NULL AUTO_INCREMENT, + `filename` VARCHAR(255) NOT NULL, + `display_filename` VARCHAR(255) NOT NULL, + `xmlimport_url` VARCHAR(255) NOT NULL, + `section_type` VARCHAR(255) NOT NULL, + `auto_sync` TINYINT(4) NOT NULL, + `sync_on_request` TINYINT(4) NOT NULL, + `auto_sync_interval` INT(11) NOT NULL, + `override_existing` TINYINT(4) NOT NULL, + `add_prefix_for_existing` VARCHAR(50) NOT NULL, + `xmlimport_date` INT(11) NOT NULL, + `xmlimport_filetag` TEXT NOT NULL, + `xmlimport_billingtag` TEXT NOT NULL, + `xmlimport_shippingtag` TEXT NOT NULL, + `xmlimport_orderitemtag` TEXT NOT NULL, + `xmlimport_stocktag` TEXT NOT NULL, + `xmlimport_prdextrafieldtag` TEXT NOT NULL, + `published` TINYINT(4) NOT NULL, + `element_name` VARCHAR(255) NOT NULL, + `billing_element_name` VARCHAR(255) NOT NULL, + `shipping_element_name` VARCHAR(255) NOT NULL, + `orderitem_element_name` VARCHAR(255) NOT NULL, + `stock_element_name` VARCHAR(255) NOT NULL, + `prdextrafield_element_name` VARCHAR(255) NOT NULL, + `xmlexport_billingtag` TEXT NOT NULL, + `xmlexport_shippingtag` TEXT NOT NULL, + `xmlexport_orderitemtag` TEXT NOT NULL, + PRIMARY KEY (`xmlimport_id`), + INDEX `idx_auto_sync` (`auto_sync` ASC), + INDEX `idx_sync_on_request` (`sync_on_request` ASC), + INDEX `idx_auto_sync_interval` (`auto_sync_interval` ASC), + INDEX `idx_published` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP XML Import'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_xml_import_log` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_xml_import_log` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_xml_import_log` ( + `xmlimport_log_id` INT(11) NOT NULL AUTO_INCREMENT, + `xmlimport_id` INT(11) NOT NULL, + `xmlimport_filename` VARCHAR(255) NOT NULL, + `xmlimport_date` INT(11) NOT NULL, + PRIMARY KEY (`xmlimport_log_id`), + INDEX `idx_xmlimport_id` (`xmlimport_id` ASC)) +ENGINE = MyISAM +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP XML Import log'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_zipcode` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_zipcode` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_zipcode` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `country_code` VARCHAR(10) NOT NULL DEFAULT '', + `state_code` VARCHAR(10) NOT NULL DEFAULT '', + `city_name` VARCHAR(64) NULL DEFAULT NULL, + `zipcode` VARCHAR(255) NULL DEFAULT NULL, + `zipcodeto` VARCHAR(255) NULL DEFAULT NULL, + PRIMARY KEY (`id`), + INDEX `zipcode` (`zipcode` ASC), + INDEX `idx_country_code` (`country_code` ASC), + INDEX `idx_state_code` (`state_code` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8; + + +-- ----------------------------------------------------- +-- Table `#__redshop_alerts` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_alerts` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_alerts` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `message` VARCHAR(255) NOT NULL, + `sent_date` DATETIME NOT NULL, + `read` TINYINT(4) NOT NULL, + PRIMARY KEY (`id`)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'redSHOP Notification Alert'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_wishlist_product_item` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_wishlist_product_item` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_wishlist_product_item` ( + `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key', + `ref_id` INT(11) NOT NULL COMMENT 'Wishlist Reference ID', + `attribute_id` INT(11) NULL DEFAULT NULL COMMENT 'Product Attribute ID', + `property_id` INT(11) NULL DEFAULT NULL COMMENT 'Product Attribute Property ID', + `subattribute_id` INT(11) NULL DEFAULT NULL COMMENT 'Product Sub-Attribute ID', + PRIMARY KEY (`id`), + UNIQUE INDEX `#__idx_wishlist_prod_item_unique` (`ref_id` ASC, `attribute_id` ASC, `property_id` ASC, `subattribute_id` ASC), + INDEX `#__wishlist_prod_item_fk2` (`attribute_id` ASC), + INDEX `#__wishlist_prod_item_fk3` (`property_id` ASC), + INDEX `#__wishlist_prod_item_fk4` (`subattribute_id` ASC), + INDEX `#__wishlist_prod_item_fk1` (`ref_id` ASC), + CONSTRAINT `#__wishlist_prod_item_fk1` + FOREIGN KEY (`ref_id`) + REFERENCES `#__redshop_wishlist_product` (`wishlist_product_id`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `#__wishlist_prod_item_fk2` + FOREIGN KEY (`attribute_id`) + REFERENCES `#__redshop_product_attribute` (`attribute_id`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `#__wishlist_prod_item_fk3` + FOREIGN KEY (`property_id`) + REFERENCES `#__redshop_product_attribute_property` (`property_id`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `#__wishlist_prod_item_fk4` + FOREIGN KEY (`subattribute_id`) + REFERENCES `#__redshop_product_subattribute_color` (`subattribute_color_id`) + ON DELETE CASCADE + ON UPDATE CASCADE) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'Wishlist product item'; + + +-- ----------------------------------------------------- +-- Table `#__redshop_voucher` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_voucher` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_voucher` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `code` VARCHAR(255) NOT NULL DEFAULT '', + `amount` DECIMAL(12,2) NOT NULL DEFAULT '0.00', + `type` VARCHAR(250) NOT NULL, + `start_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `end_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `free_ship` TINYINT(4) NOT NULL, + `voucher_left` INT(11) NOT NULL, + `published` TINYINT(4) NOT NULL DEFAULT '0', + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + UNIQUE INDEX `#__rs_voucher_code` (`code` ASC), + INDEX `#__rs_voucher_common` (`code` ASC, `published` ASC, `start_date` ASC, `end_date` ASC), + INDEX `#__rs_voucher_left` (`voucher_left` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `#__redshop_product_payment_xref` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_payment_xref` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_payment_xref` ( + `payment_id` VARCHAR(255) NOT NULL DEFAULT '', + `product_id` TINYINT(11) NOT NULL, + PRIMARY KEY (`product_id`, `payment_id`), + INDEX `#__rs_pro_pay_ref_fk1` (`product_id` ASC)) +ENGINE = InnoDB +COMMENT = 'redSHOP Product Individual payment reference.'; + + +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/component/admin/sql/install/mysql/uninstall.sql b/component/admin/sql/install/mysql/uninstall.sql new file mode 100644 index 00000000000..0bbfe4b727a --- /dev/null +++ b/component/admin/sql/install/mysql/uninstall.sql @@ -0,0 +1,126 @@ +SET FOREIGN_KEY_CHECKS=0; + +DROP TABLE IF EXISTS `#__redshop_attribute_set`; +DROP TABLE IF EXISTS `#__redshop_cart`; +DROP TABLE IF EXISTS `#__redshop_catalog`; +DROP TABLE IF EXISTS `#__redshop_catalog_colour`; +DROP TABLE IF EXISTS `#__redshop_catalog_request`; +DROP TABLE IF EXISTS `#__redshop_catalog_sample`; +DROP TABLE IF EXISTS `#__redshop_category`; +DROP TABLE IF EXISTS `#__redshop_container`; +DROP TABLE IF EXISTS `#__redshop_container_product_xref`; +DROP TABLE IF EXISTS `#__redshop_country`; +DROP TABLE IF EXISTS `#__redshop_coupons`; +DROP TABLE IF EXISTS `#__redshop_coupons_transaction`; +DROP TABLE IF EXISTS `#__redshop_cron`; +DROP TABLE IF EXISTS `#__redshop_currency`; +DROP TABLE IF EXISTS `#__redshop_customer_question`; +DROP TABLE IF EXISTS `#__redshop_discount`; +DROP TABLE IF EXISTS `#__redshop_discount_product`; +DROP TABLE IF EXISTS `#__redshop_discount_product_shoppers`; +DROP TABLE IF EXISTS `#__redshop_discount_shoppers`; +DROP TABLE IF EXISTS `#__redshop_economic_accountgroup`; +DROP TABLE IF EXISTS `#__redshop_fields`; +DROP TABLE IF EXISTS `#__redshop_fields_data`; +DROP TABLE IF EXISTS `#__redshop_fields_value`; +DROP TABLE IF EXISTS `#__redshop_giftcard`; +DROP TABLE IF EXISTS `#__redshop_mail`; +DROP TABLE IF EXISTS `#__redshop_manufacturer`; +DROP TABLE IF EXISTS `#__redshop_mass_discount`; +DROP TABLE IF EXISTS `#__redshop_media`; +DROP TABLE IF EXISTS `#__redshop_media_download`; +DROP TABLE IF EXISTS `#__redshop_newsletter`; +DROP TABLE IF EXISTS `#__redshop_newsletter_subscription`; +DROP TABLE IF EXISTS `#__redshop_newsletter_tracker`; +DROP TABLE IF EXISTS `#__redshop_orderbarcode_log`; +DROP TABLE IF EXISTS `#__redshop_ordernumber_track`; +DROP TABLE IF EXISTS `#__redshop_orders`; +DROP TABLE IF EXISTS `#__redshop_order_acc_item`; +DROP TABLE IF EXISTS `#__redshop_order_attribute_item`; +DROP TABLE IF EXISTS `#__redshop_order_item`; +DROP TABLE IF EXISTS `#__redshop_order_payment`; +DROP TABLE IF EXISTS `#__redshop_order_status`; +DROP TABLE IF EXISTS `#__redshop_order_status_log`; +DROP TABLE IF EXISTS `#__redshop_order_users_info`; +DROP TABLE IF EXISTS `#__redshop_pageviewer`; +DROP TABLE IF EXISTS `#__redshop_payment_method`; +DROP TABLE IF EXISTS `#__redshop_product`; +DROP TABLE IF EXISTS `#__redshop_product_accessory`; +DROP TABLE IF EXISTS `#__redshop_product_attribute`; +DROP TABLE IF EXISTS `#__redshop_product_attribute_price`; +DROP TABLE IF EXISTS `#__redshop_product_attribute_property`; +DROP TABLE IF EXISTS `#__redshop_product_attribute_stockroom_xref`; +DROP TABLE IF EXISTS `#__redshop_product_category_xref`; +DROP TABLE IF EXISTS `#__redshop_product_payment_xref`; +DROP TABLE IF EXISTS `#__redshop_product_compare`; +DROP TABLE IF EXISTS `#__redshop_product_discount_calc`; +DROP TABLE IF EXISTS `#__redshop_product_discount_calc_extra`; +DROP TABLE IF EXISTS `#__redshop_product_download`; +DROP TABLE IF EXISTS `#__redshop_product_download_log`; +DROP TABLE IF EXISTS `#__redshop_product_price`; +DROP TABLE IF EXISTS `#__redshop_product_rating`; +DROP TABLE IF EXISTS `#__redshop_product_related`; +DROP TABLE IF EXISTS `#__redshop_product_serial_number`; +DROP TABLE IF EXISTS `#__redshop_product_stockroom_xref`; +DROP TABLE IF EXISTS `#__redshop_product_subattribute_color`; +DROP TABLE IF EXISTS `#__redshop_product_subscribe_detail`; +DROP TABLE IF EXISTS `#__redshop_product_subscription`; +DROP TABLE IF EXISTS `#__redshop_product_tags`; +DROP TABLE IF EXISTS `#__redshop_product_tags_xref`; +DROP TABLE IF EXISTS `#__redshop_product_voucher_transaction`; +DROP TABLE IF EXISTS `#__redshop_product_voucher_xref`; +DROP TABLE IF EXISTS `#__redshop_quotation`; +DROP TABLE IF EXISTS `#__redshop_quotation_accessory_item`; +DROP TABLE IF EXISTS `#__redshop_quotation_attribute_item`; +DROP TABLE IF EXISTS `#__redshop_quotation_fields_data`; +DROP TABLE IF EXISTS `#__redshop_quotation_item`; +DROP TABLE IF EXISTS `#__redshop_sample_request`; +DROP TABLE IF EXISTS `#__redshop_shipping_boxes`; +DROP TABLE IF EXISTS `#__redshop_shipping_rate`; +DROP TABLE IF EXISTS `#__redshop_shopper_group`; +DROP TABLE IF EXISTS `#__redshop_siteviewer`; +DROP TABLE IF EXISTS `#__redshop_state`; +DROP TABLE IF EXISTS `#__redshop_stockroom`; +DROP TABLE IF EXISTS `#__redshop_stockroom_amount_image`; +DROP TABLE IF EXISTS `#__redshop_stockroom_container_xref`; +DROP TABLE IF EXISTS `#__redshop_subscription_renewal`; +DROP TABLE IF EXISTS `#__redshop_supplier`; +DROP TABLE IF EXISTS `#__redshop_tax_group`; +DROP TABLE IF EXISTS `#__redshop_tax_rate`; +DROP TABLE IF EXISTS `#__redshop_template`; +DROP TABLE IF EXISTS `#__redshop_textlibrary`; +DROP TABLE IF EXISTS `#__redshop_usercart`; +DROP TABLE IF EXISTS `#__redshop_usercart_accessory_item`; +DROP TABLE IF EXISTS `#__redshop_usercart_attribute_item`; +DROP TABLE IF EXISTS `#__redshop_usercart_item`; +DROP TABLE IF EXISTS `#__redshop_users_info`; +DROP TABLE IF EXISTS `#__redshop_wishlist`; +DROP TABLE IF EXISTS `#__redshop_wishlist_product`; +DROP TABLE IF EXISTS `#__redshop_wishlist_userfielddata`; +DROP TABLE IF EXISTS `#__redshop_wrapper`; +DROP TABLE IF EXISTS `#__redshop_xml_export`; +DROP TABLE IF EXISTS `#__redshop_xml_export_ipaddress`; +DROP TABLE IF EXISTS `#__redshop_xml_export_log`; +DROP TABLE IF EXISTS `#__redshop_xml_import`; +DROP TABLE IF EXISTS `#__redshop_xml_import_log`; +DROP TABLE IF EXISTS `#__redshop_zipcode`; +DROP TABLE IF EXISTS `#__redshop_notifystock_users`; +DROP TABLE IF EXISTS `#__redshop_alerts`; +DROP TABLE IF EXISTS `#__redshop_wishlist_product_item`; +DROP TABLE IF EXISTS `#__redshop_voucher`; +DROP TABLE IF EXISTS `#__redshop_fields_group`; + +DELETE FROM `#__content_types` WHERE `type_alias` = 'com_redshop.product'; +DELETE FROM `#__contentitem_tag_map` WHERE `type_alias` = 'com_redshop.product'; +DELETE FROM `#__ucm_content` WHERE `core_type_alias` = 'com_redshop.product'; + +DROP PROCEDURE IF EXISTS `redSHOP_Column_Update`; +DROP PROCEDURE IF EXISTS `redSHOP_Column_Remove`; +DROP PROCEDURE IF EXISTS `redSHOP_Index_Fulltext_Add`; +DROP PROCEDURE IF EXISTS `redSHOP_Index_Add`; +DROP PROCEDURE IF EXISTS `redSHOP_Index_Unique_Add`; +DROP PROCEDURE IF EXISTS `redSHOP_Index_Remove`; +DROP PROCEDURE IF EXISTS `redSHOP_Constraint_Update`; +DROP PROCEDURE IF EXISTS `redSHOP_Constraint_Remove`; + +SET FOREIGN_KEY_CHECKS=1; diff --git a/component/admin/sql/updates/index.html b/component/admin/sql/updates/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/sql/updates/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/sql/updates/mysql/1.1.10.sql b/component/admin/sql/updates/mysql/1.1.10.sql new file mode 100644 index 00000000000..d4a30eb7e74 --- /dev/null +++ b/component/admin/sql/updates/mysql/1.1.10.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS `#__redshop_product_navigator` ( + `navigator_id` int(11) NOT NULL AUTO_INCREMENT, + `product_id` int(11) NOT NULL, + `child_product_id` int(11) NOT NULL, + `navigator_name` varchar(255) NOT NULL, + `ordering` int(11) NOT NULL, + PRIMARY KEY (`navigator_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='redSHOP Products Navigator'; + +CREATE TABLE IF NOT EXISTS `#__redshop_notifystock_users` ( +`id` INT(11) NOT NULL AUTO_INCREMENT, +`product_id` INT NOT NULL , +`property_id` INT NOT NULL , +`subproperty_id` INT NOT NULL , +`user_id` INT NOT NULL , +`notification_status` INT NOT NULL DEFAULT '0', +PRIMARY KEY (`id`) +) ENGINE = MYISAM ; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/1.1.11.sql b/component/admin/sql/updates/mysql/1.1.11.sql new file mode 100644 index 00000000000..d105ba40e88 --- /dev/null +++ b/component/admin/sql/updates/mysql/1.1.11.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS `#__redshop_product_navigator` ( + `navigator_id` int(11) NOT NULL AUTO_INCREMENT, + `product_id` int(11) NOT NULL, + `child_product_id` int(11) NOT NULL, + `navigator_name` varchar(255) NOT NULL, + `ordering` int(11) NOT NULL, + PRIMARY KEY (`navigator_id`) +) ENGINE=MyISAM ; + +CREATE TABLE IF NOT EXISTS `#__redshop_notifystock_users` ( +`id` INT(11) NOT NULL AUTO_INCREMENT, +`product_id` INT NOT NULL , +`property_id` INT NOT NULL , +`subproperty_id` INT NOT NULL , +`user_id` INT NOT NULL , +`notification_status` INT NOT NULL DEFAULT '0', +PRIMARY KEY (`id`) +) ENGINE = MYISAM; diff --git a/component/admin/sql/updates/mysql/1.1.20.sql b/component/admin/sql/updates/mysql/1.1.20.sql new file mode 100644 index 00000000000..d105ba40e88 --- /dev/null +++ b/component/admin/sql/updates/mysql/1.1.20.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS `#__redshop_product_navigator` ( + `navigator_id` int(11) NOT NULL AUTO_INCREMENT, + `product_id` int(11) NOT NULL, + `child_product_id` int(11) NOT NULL, + `navigator_name` varchar(255) NOT NULL, + `ordering` int(11) NOT NULL, + PRIMARY KEY (`navigator_id`) +) ENGINE=MyISAM ; + +CREATE TABLE IF NOT EXISTS `#__redshop_notifystock_users` ( +`id` INT(11) NOT NULL AUTO_INCREMENT, +`product_id` INT NOT NULL , +`property_id` INT NOT NULL , +`subproperty_id` INT NOT NULL , +`user_id` INT NOT NULL , +`notification_status` INT NOT NULL DEFAULT '0', +PRIMARY KEY (`id`) +) ENGINE = MYISAM; diff --git a/component/admin/sql/updates/mysql/1.2.sql b/component/admin/sql/updates/mysql/1.2.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.3.1.1.sql b/component/admin/sql/updates/mysql/1.3.1.1.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.3.1.2.sql b/component/admin/sql/updates/mysql/1.3.1.2.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.3.1.3.sql b/component/admin/sql/updates/mysql/1.3.1.3.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.3.1.sql b/component/admin/sql/updates/mysql/1.3.1.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.3.2.sql b/component/admin/sql/updates/mysql/1.3.2.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.3.3.1.sql b/component/admin/sql/updates/mysql/1.3.3.1.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.3.3.sql b/component/admin/sql/updates/mysql/1.3.3.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.3.sql b/component/admin/sql/updates/mysql/1.3.sql new file mode 100644 index 00000000000..48c1b291518 --- /dev/null +++ b/component/admin/sql/updates/mysql/1.3.sql @@ -0,0 +1,9 @@ +ALTER TABLE `#__redshop_product_subattribute_color` + MODIFY `subattribute_color_name` VARCHAR(255) CHARACTER SET utf8 + COLLATE utf8_general_ci; +ALTER TABLE `#__redshop_product_attribute_property` + ADD `extra_field` VARCHAR( 250 ) NOT NULL; +ALTER TABLE `#__redshop_product_subattribute_color` + ADD `extra_field` VARCHAR( 250 ) NOT NULL; +ALTER TABLE `#__redshop_product` + ADD `minimum_per_product_total` INT( 11 ) NOT NULL; diff --git a/component/admin/sql/updates/mysql/1.4.sql b/component/admin/sql/updates/mysql/1.4.sql new file mode 100644 index 00000000000..d0d4f7a3d73 --- /dev/null +++ b/component/admin/sql/updates/mysql/1.4.sql @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS `#__redshop_payment_method`; +DROP TABLE IF EXISTS `#__redshop_container`; +DROP TABLE IF EXISTS `#__redshop_container_product_xref`; +DROP TABLE IF EXISTS `#__redshop_stockroom_container_xref`; +INSERT INTO `#__redshop_mail` (`mail_name`, `mail_subject`, `mail_section`, `mail_order_status`, `mail_body`, `published`, `mail_bcc`) VALUES('Invoice Mail', 'Invoice Mail', 'invoicefile_mail', '0', '\r\n\r\n\r\n\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n {order_date}\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n

    Thank you for your order!

    \r\n

    Thank you for ordering from redCOMPONENT!
    To download your purchased products please follow the link in the bottom of this mail.

    \r\n

    \r\n

    Products ordered:

    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    {product_name}{without_vat}{product_price}{product_quantity}{product_total_price}
    VAT{sub_total_vat}
    Total{order_total}
    \r\n

    \r\n

    Billing information:

    \r\n
    {billing_address}
    \r\n

    \r\n

    Additional information:

    \r\n

    {customer_note}

    \r\n

    \r\n

    Order details:

    \r\n

    To see the details of your order and to download the products please click {order_detail_link}

    \r\n

    \r\n

    Regards,
    redCOMPONENT

    \r\n
    \r\n\r\n \r\n \r\n \r\n
    \r\n
    ', 1, ''); +DELETE FROM `#__redshop_mail` WHERE `mail_id` = 10; diff --git a/component/admin/sql/updates/mysql/1.5.0.3.sql b/component/admin/sql/updates/mysql/1.5.0.3.sql new file mode 100644 index 00000000000..ad655603ee7 --- /dev/null +++ b/component/admin/sql/updates/mysql/1.5.0.3.sql @@ -0,0 +1,6 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL redSHOP_Index_Remove('#__redshop_product_rating', 'product_id'); +CALL redSHOP_Index_Unique_Add('#__redshop_product_rating', 'product_id', "(`product_id`, `userid`, `email`)"); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/1.5.0.4.1.sql b/component/admin/sql/updates/mysql/1.5.0.4.1.sql new file mode 100644 index 00000000000..408ac6f9340 --- /dev/null +++ b/component/admin/sql/updates/mysql/1.5.0.4.1.sql @@ -0,0 +1,16 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CREATE TABLE IF NOT EXISTS `#__redshop_usercart_item` ( + `cart_item_id` int(11) NOT NULL AUTO_INCREMENT, + `cart_idx` int(11) NOT NULL, + `cart_id` int(11) NOT NULL, + `product_id` int(11) NOT NULL, + `product_quantity` int(11) NOT NULL, + `product_wrapper_id` int(11) NOT NULL, + `product_subscription_id` int(11) NOT NULL, + `giftcard_id` int(11) NOT NULL, + PRIMARY KEY (`cart_item_id`), + KEY `idx_cart_id` (`cart_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='redSHOP User Cart Item'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/component/admin/sql/updates/mysql/1.5.0.4.3.sql b/component/admin/sql/updates/mysql/1.5.0.4.3.sql new file mode 100644 index 00000000000..66f76b4e245 --- /dev/null +++ b/component/admin/sql/updates/mysql/1.5.0.4.3.sql @@ -0,0 +1,5 @@ +SET FOREIGN_KEY_CHECKS = 0; + +DROP TABLE IF EXISTS `#__redshop_product_navigator`; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/component/admin/sql/updates/mysql/1.5.0.5.1.sql b/component/admin/sql/updates/mysql/1.5.0.5.1.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.5.0.5.2.sql b/component/admin/sql/updates/mysql/1.5.0.5.2.sql new file mode 100644 index 00000000000..a608f270f34 --- /dev/null +++ b/component/admin/sql/updates/mysql/1.5.0.5.2.sql @@ -0,0 +1,154 @@ +DELETE FROM `#__redshop_template` WHERE `template_section` = 'shippment_invoice_template'; + +CREATE TABLE IF NOT EXISTS `#__redshop_accessmanager` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `section_name` VARCHAR(256) NOT NULL, + `gid` INT(11) NOT NULL, + `view` ENUM('1', '0') DEFAULT NULL, + `add` ENUM('1', '0') DEFAULT NULL, + `edit` ENUM('1', '0') DEFAULT NULL, + `delete` ENUM('1', '0') DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_section_name` (`section_name`(255)), + KEY `idx_gid` (`gid`), + KEY `idx_view` (`view`), + KEY `idx_add` (`add`), + KEY `idx_edit` (`edit`), + KEY `idx_delete` (`delete`) +) + ENGINE =InnoDB + DEFAULT CHARSET =utf8 + COMMENT ='redSHOP Access Manager'; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_discount_calc_extra` ( + `pdcextra_id` INT(11) NOT NULL AUTO_INCREMENT, + `option_name` VARCHAR(255) NOT NULL, + `oprand` CHAR(1) NOT NULL, + `price` FLOAT(10, 2) NOT NULL, + `product_id` INT(11) NOT NULL, + PRIMARY KEY (`pdcextra_id`), + KEY `idx_product_id` (`product_id`) +) + ENGINE =InnoDB + DEFAULT CHARSET =utf8 + COMMENT ='redSHOP Product Discount Calculator Extra Value'; + +CREATE TABLE IF NOT EXISTS `#__redshop_wishlist_userfielddata` ( + `fieldid` INT(11) NOT NULL AUTO_INCREMENT, + `wishlist_id` INT(11) NOT NULL, + `product_id` INT(11) NOT NULL, + `userfielddata` TEXT NOT NULL, + PRIMARY KEY (`fieldid`), + KEY `idx_common` (`wishlist_id`, `product_id`) +) + ENGINE =InnoDB + DEFAULT CHARSET =utf8 + COMMENT ='redSHOP Wishlist Product userfielddata'; + +CREATE TABLE IF NOT EXISTS `#__redshop_usercart` ( + `cart_id` INT(11) NOT NULL AUTO_INCREMENT, + `user_id` INT(11) NOT NULL, + `cdate` INT(11) NOT NULL, + `mdate` INT(11) NOT NULL, + PRIMARY KEY (`cart_id`), + KEY `idx_user_id` (`user_id`) +) + ENGINE =InnoDB + DEFAULT CHARSET =utf8 + COMMENT ='redSHOP User Cart Item'; + +CREATE TABLE IF NOT EXISTS `#__redshop_usercart_accessory_item` ( + `cart_acc_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `cart_item_id` INT(11) NOT NULL, + `accessory_id` INT(11) NOT NULL, + `accessory_quantity` INT(11) NOT NULL, + PRIMARY KEY (`cart_acc_item_id`), + KEY `idx_cart_item_id` (`cart_item_id`) +) + ENGINE =InnoDB + DEFAULT CHARSET =utf8 + COMMENT ='redSHOP User Cart Accessory Item'; + +CREATE TABLE IF NOT EXISTS `#__redshop_usercart_attribute_item` ( + `cart_att_item_id` INT(11) NOT NULL AUTO_INCREMENT, + `cart_item_id` INT(11) NOT NULL, + `section_id` INT(11) NOT NULL, + `section` VARCHAR(25) NOT NULL, + `parent_section_id` INT(11) NOT NULL, + `is_accessory_att` TINYINT(4) NOT NULL, + PRIMARY KEY (`cart_att_item_id`), + KEY `idx_common` (`is_accessory_att`, `section`, `parent_section_id`, `cart_item_id`), + KEY `idx_cart_item_id` (`cart_item_id`), + KEY `idx_parent_section_id` (`parent_section_id`) +) + ENGINE =InnoDB + DEFAULT CHARSET =utf8 + COMMENT ='redSHOP User cart Attribute Item'; + +CREATE TABLE IF NOT EXISTS `#__redshop_usercart_item` ( + `cart_item_id` int(11) NOT NULL AUTO_INCREMENT, + `cart_idx` int(11) NOT NULL, + `cart_id` int(11) NOT NULL, + `product_id` int(11) NOT NULL, + `product_quantity` int(11) NOT NULL, + `product_wrapper_id` int(11) NOT NULL, + `product_subscription_id` int(11) NOT NULL, + `giftcard_id` int(11) NOT NULL, + `attribs` varchar(5020) NOT NULL COMMENT 'Specified user attributes related with current item', + PRIMARY KEY (`cart_item_id`), + KEY `idx_cart_id` (`cart_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='redSHOP User Cart Item'; + +CREATE TABLE IF NOT EXISTS `#__redshop_orderbarcode_log` ( + `log_id` INT(11) NOT NULL AUTO_INCREMENT, + `order_id` INT(11) NOT NULL, + `barcode` VARCHAR(255) NOT NULL, + `user_id` INT(11) NOT NULL, + `search_date` DATETIME NOT NULL, + PRIMARY KEY (`log_id`), + KEY `idx_order_id` (`order_id`) +) + ENGINE =MyISAM + DEFAULT CHARSET =utf8; + +CREATE TABLE IF NOT EXISTS `#__redshop_zipcode` ( + `zipcode_id` INT(11) NOT NULL AUTO_INCREMENT, + `country_code` VARCHAR(10) NOT NULL DEFAULT '', + `state_code` VARCHAR(10) NOT NULL DEFAULT '', + `city_name` VARCHAR(64) DEFAULT NULL, + `zipcode` VARCHAR(255) DEFAULT NULL, + `zipcodeto` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`zipcode_id`), + KEY `zipcode` (`zipcode`), + KEY `idx_country_code` (`country_code`), + KEY `idx_state_code` (`state_code`) +) + ENGINE =InnoDB + DEFAULT CHARSET =utf8; + +CREATE TABLE IF NOT EXISTS `#__redshop_ordernumber_track` ( + `trackdatetime` datetime NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='redSHOP Order number track'; + +CREATE TABLE IF NOT EXISTS `#__redshop_notifystock_users` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `product_id` INT(11) NOT NULL, + `property_id` INT(11) NOT NULL, + `subproperty_id` INT(11) NOT NULL, + `user_id` INT(11) NOT NULL, + `notification_status` INT(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_common` (`product_id`, `property_id`, `subproperty_id`, `notification_status`, `user_id`), + KEY `idx_user_id` (`user_id`) +) + ENGINE =InnoDB + DEFAULT CHARSET =utf8; + +ALTER TABLE `#__redshop_product_price` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; + +ALTER TABLE `#__redshop_product_subattribute_color` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; + +CALL redSHOP_Column_Update('#__redshop_product_voucher', 'voucher_type', 'voucher_type', "VARCHAR(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_stockroom', 'stockroom_desc', 'stockroom_desc', "LONGTEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL"); + +DROP TABLE IF EXISTS `#__redshop_shipping_method`; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/1.5.0.5.3.sql b/component/admin/sql/updates/mysql/1.5.0.5.3.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.5.0.sql b/component/admin/sql/updates/mysql/1.5.0.sql new file mode 100644 index 00000000000..146f4de08dc --- /dev/null +++ b/component/admin/sql/updates/mysql/1.5.0.sql @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL redSHOP_Column_Update('#__redshop_product_download', 'download_id', 'download_id', "VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''"); + +UPDATE `#__redshop_currency` + SET `currency_name` = 'Mexican Peso', `currency_code` = 'MXN' + WHERE `currency_id` = 99; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/1.6.0.sql b/component/admin/sql/updates/mysql/1.6.0.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/1.6.1.sql b/component/admin/sql/updates/mysql/1.6.1.sql new file mode 100644 index 00000000000..6fc43eec49d --- /dev/null +++ b/component/admin/sql/updates/mysql/1.6.1.sql @@ -0,0 +1,5 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL redSHOP_Column_Update('#__redshop_fields', 'field_section', 'field_section', "INT NOT NULL"); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/1.6.2.sql b/component/admin/sql/updates/mysql/1.6.2.sql new file mode 100644 index 00000000000..6b890bd229f --- /dev/null +++ b/component/admin/sql/updates/mysql/1.6.2.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS `#__redshop_alerts` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `message` VARCHAR(255) NOT NULL, + `sent_date` DATETIME NOT NULL, + `read` TINYINT(4) NOT NULL, + PRIMARY KEY (`id`) +) + ENGINE =InnoDB + DEFAULT CHARSET =utf8 + COMMENT ='redSHOP Notification Alert'; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/1.6.3.sql b/component/admin/sql/updates/mysql/1.6.3.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/2.0.0.2.sql b/component/admin/sql/updates/mysql/2.0.0.2.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/2.0.0.3.sql b/component/admin/sql/updates/mysql/2.0.0.3.sql new file mode 100644 index 00000000000..daa7370d57f --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.0.3.sql @@ -0,0 +1,22 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL redSHOP_Index_Remove('#__redshop_country', 'idx_country_2_code'); +CALL redSHOP_Index_Remove('#__redshop_country', 'idx_country_3_code'); +CALL redSHOP_Column_Update('#__redshop_country', 'country_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); +CALL redSHOP_Column_Update('#__redshop_country', 'country_name', 'country_name', "VARCHAR(64) CHARACTER SET utf8 NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_country', 'country_3_code', 'country_3_code', "CHAR(3) CHARACTER SET utf8 NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_country', 'country_2_code', 'country_2_code', "CHAR(2) CHARACTER SET utf8 NOT NULL"); +CALL redSHOP_Index_Unique_Add('#__redshop_country', '#__rs_idx_country_3_code', "(`country_3_code` ASC)"); +CALL redSHOP_Index_Unique_Add('#__redshop_country', '#__rs_idx_country_2_code', "(`country_2_code` ASC)"); + +CALL redSHOP_Column_Update('#__redshop_state', 'country_id', 'country_id', "INT(11) NOT NULL"); +CALL redSHOP_Index_Remove('#__redshop_state', 'state_3_code'); +CALL redSHOP_Index_Remove('#__redshop_state', 'state_2_code'); +CALL redSHOP_Index_Unique_Add('#__redshop_state', '#__rs_idx_state_3_code', "(`country_id` ASC, `state_3_code` ASC)"); +CALL redSHOP_Index_Unique_Add('#__redshop_state', '#__rs_idx_state_2_code', "(`country_id` ASC, `state_2_code` ASC)"); +CALL redSHOP_Index_Add('#__redshop_state', 'country_id', "(`country_id` ASC)"); + +ALTER TABLE + `#__redshop_state` ADD CONSTRAINT `#__rs_state_country_fk1` FOREIGN KEY(`country_id`) REFERENCES `#__redshop_country`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/component/admin/sql/updates/mysql/2.0.0.4.sql b/component/admin/sql/updates/mysql/2.0.0.4.sql new file mode 100644 index 00000000000..a0bd027f9fb --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.0.4.sql @@ -0,0 +1,5 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL redSHOP_Column_Update('#__redshop_state', 'state_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.0.5.sql b/component/admin/sql/updates/mysql/2.0.0.5.sql new file mode 100644 index 00000000000..db1ad6f5271 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.0.5.sql @@ -0,0 +1,23 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL redSHOP_Column_Update('#__redshop_customer_question', 'question_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); + +CALL redSHOP_Index_Remove('#__redshop_customer_question', 'idx_published'); +CALL redSHOP_Index_Remove('#__redshop_customer_question', 'idx_parent_id'); +CALL redSHOP_Index_Remove('#__redshop_customer_question', 'idx_product_id'); + +CALL redSHOP_Index_Add('#__redshop_customer_question', '#__rs_idx_published', "(`published` ASC)"); + +CALL redSHOP_Constraint_Remove('#__redshop_customer_question', '#__rs_customer_question_fk1'); +CALL redSHOP_Index_Add('#__redshop_customer_question', '#__rs_idx_product_id', "(`product_id` ASC)"); +CALL redSHOP_Constraint_Update('#__redshop_customer_question', '#__rs_customer_question_fk1', 'product_id', '#__redshop_product', 'product_id', 'CASCADE', 'CASCADE'); + +CALL redSHOP_Index_Add('#__redshop_customer_question', '#__rs_idx_parent_id', "(`parent_id` ASC)"); + +ALTER TABLE `#__redshop_siteviewer` ENGINE = InnoDB; + +ALTER TABLE `#__redshop_pageviewer` ENGINE = InnoDB; + +CALL redSHOP_Primary_Add('#__redshop_cart', "`session_id`, `product_id`, `section`"); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.0.6.sql b/component/admin/sql/updates/mysql/2.0.0.6.sql new file mode 100644 index 00000000000..bf641b58ba4 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.0.6.sql @@ -0,0 +1,96 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CREATE TABLE IF NOT EXISTS `#__redshop_wishlist_product_item` ( + `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key', + `ref_id` INT(11) NOT NULL COMMENT 'Wishlist Reference ID', + `attribute_id` INT(11) NULL DEFAULT NULL COMMENT 'Product Attribute ID', + `property_id` INT(11) NULL DEFAULT NULL COMMENT 'Product Attribute Property ID', + `subattribute_id` INT(11) NULL DEFAULT NULL COMMENT 'Product Sub-Attribute ID', + PRIMARY KEY (`id`), + UNIQUE INDEX `#__idx_wishlist_prod_item_unique` (`ref_id` ASC, `attribute_id` ASC, `property_id` ASC, `subattribute_id` ASC), + INDEX `#__wishlist_prod_item_fk2` (`attribute_id` ASC), + INDEX `#__wishlist_prod_item_fk3` (`property_id` ASC), + INDEX `#__wishlist_prod_item_fk4` (`subattribute_id` ASC), + INDEX `#__wishlist_prod_item_fk1` (`ref_id` ASC), + CONSTRAINT `#__wishlist_prod_item_fk1` + FOREIGN KEY (`ref_id`) + REFERENCES `#__redshop_wishlist_product` (`wishlist_product_id`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `#__wishlist_prod_item_fk2` + FOREIGN KEY (`attribute_id`) + REFERENCES `#__redshop_product_attribute` (`attribute_id`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `#__wishlist_prod_item_fk3` + FOREIGN KEY (`property_id`) + REFERENCES `#__redshop_product_attribute_property` (`property_id`) + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT `#__wishlist_prod_item_fk4` + FOREIGN KEY (`subattribute_id`) + REFERENCES `#__redshop_product_subattribute_color` (`subattribute_color_id`) + ON DELETE CASCADE + ON UPDATE CASCADE) + ROW_FORMAT=DYNAMIC + ENGINE = InnoDB + DEFAULT CHARACTER SET = utf8 + COMMENT = 'Wishlist product item'; + +CALL redSHOP_Column_Update('#__redshop_supplier', 'supplier_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'supplier_name', 'name', "VARCHAR(255) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'supplier_desc', 'description', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'supplier_email', 'email', "VARCHAR(255) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'published', 'published', "TINYINT(4) NOT NULL DEFAULT 0"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL AFTER `published`"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out`"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL AFTER `checked_out_time`"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `created_by`"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL AFTER `created_date`"); +CALL redSHOP_Column_Update('#__redshop_supplier', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `modified_by`"); + +CALL redSHOP_Index_Add('#__redshop_supplier', '#__rs_idx_supplier_published', "(`published` ASC)"); + +CALL redSHOP_Index_Add('#__redshop_product', '#__rs_product_supplier_fk1', "(`supplier_id` ASC)"); + +CALL redSHOP_Column_Update('#__redshop_tax_rate', 'tax_rate_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); +CALL redSHOP_Column_Update('#__redshop_tax_rate', 'name', 'name', "VARCHAR(255) NOT NULL DEFAULT '' AFTER `id`"); +CALL redSHOP_Column_Update('#__redshop_tax_rate', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_tax_rate', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_tax_rate', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_tax_rate', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); + +CALL redSHOP_Index_Remove('#__redshop_order_status', 'order_status_code'); +CALL redSHOP_Index_Remove('#__redshop_order_status', 'idx_published'); + +CALL redSHOP_Column_Update('#__redshop_order_status', 'published', 'published', "TINYINT(4) NOT NULL DEFAULT 0"); + +CALL redSHOP_Index_Add('#__redshop_order_status', '#__rs_idx_order_status_published', "(`published` ASC)"); + +CALL redSHOP_Index_Unique_Add('#__redshop_order_status', '#__rs_idx_order_status_code', "(`order_status_code` ASC)"); + +CALL redSHOP_Column_Update('#__redshop_order_status', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_order_status', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_order_status', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_order_status', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_order_status', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_order_status', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); + +CALL redSHOP_Index_Add('#__redshop_media', '#__rs_idx_media_common', "(`section_id` ASC, `media_section` ASC, `media_type` ASC, `published` ASC, `ordering` ASC) + USING BTREE"); + +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'mass_discount_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'discount_type', 'type', "TINYINT(4) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'discount_amount', 'amount', "DOUBLE(10,2) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'discount_startdate', 'start_date', "INT(11) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'discount_enddate', 'end_date', "INT(11) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'discount_name', 'name', "VARCHAR(255) NOT NULL"); + +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_mass_discount', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.10.sql b/component/admin/sql/updates/mysql/2.0.10.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/2.0.11.sql b/component/admin/sql/updates/mysql/2.0.11.sql new file mode 100644 index 00000000000..1f67174b7d5 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.11.sql @@ -0,0 +1,20 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ------------------------------------------------------ +-- Table `#__redshop_currency` +-- ------------------------------------------------------ +CALL redSHOP_Index_Remove('#__redshop_currency', 'idx_currency_code'); + +CALL redSHOP_Column_Update('#__redshop_currency', 'currency_id', 'id', 'INT(11) NOT NULL AUTO_INCREMENT'); +CALL redSHOP_Column_Update('#__redshop_currency', 'currency_name', 'name', "VARCHAR(64) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_currency', 'currency_code', 'code', "CHAR(3) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_currency', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_currency', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_currency', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_currency', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_currency', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_currency', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); + +CALL redSHOP_Index_Unique_Add('#__redshop_currency', '#__rs_cur_code', '(`code` ASC)'); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.12.sql b/component/admin/sql/updates/mysql/2.0.12.sql new file mode 100644 index 00000000000..216c233028f --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.12.sql @@ -0,0 +1,24 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ------------------------------------------------------ +-- Table `#__redshop_textlibrary` +-- ------------------------------------------------------ +CALL redSHOP_Index_Remove('#__redshop_textlibrary', 'idx_section'); +CALL redSHOP_Index_Remove('#__redshop_textlibrary', 'idx_published'); + +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'textlibrary_id', 'id', 'INT(11) NOT NULL AUTO_INCREMENT'); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'text_name', 'name', "VARCHAR(255) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'text_desc', 'desc', "VARCHAR(255) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'text_field', 'content', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'published', 'published', "TINYINT(4) NOT NULL DEFAULT 1"); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_textlibrary', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); + +CALL redSHOP_Index_Add('#__redshop_textlibrary', '#__rs_text_tag_section', '(`section` ASC)'); +CALL redSHOP_Index_Add('#__redshop_textlibrary', '#__rs_text_tag_published', '(`published` ASC)'); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.13.sql b/component/admin/sql/updates/mysql/2.0.13.sql new file mode 100644 index 00000000000..1666dbca0bb --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.13.sql @@ -0,0 +1,9 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ------------------------------------------------------ +-- Table `#__redshop_media` +-- ------------------------------------------------------ +CALL redSHOP_Column_Update('#__redshop_media', 'scope', 'scope', 'VARCHAR(100) NOT NULL DEFAULT ""'); +CALL redSHOP_Index_Add('#__redshop_media', '#__rs_idx_media_scope', '(`scope` ASC)'); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.14.sql b/component/admin/sql/updates/mysql/2.0.14.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/2.0.15.sql b/component/admin/sql/updates/mysql/2.0.15.sql new file mode 100644 index 00000000000..988bda93df1 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.15.sql @@ -0,0 +1,33 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ------------------------------------------------------ +-- Table `#__redshop_manufacturer` +-- ------------------------------------------------------ +CALL redSHOP_Index_Remove('#__redshop_manufacturer', 'idx_published'); + +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'manufacturer_id', 'id', 'INT(11) NOT NULL AUTO_INCREMENT'); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'manufacturer_name', 'name', "VARCHAR(250) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'manufacturer_desc', 'description', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'manufacturer_email', 'email', "VARCHAR(250) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'product_per_page', 'product_per_page', "INT(11) NOT NULL DEFAULT 0"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'metakey', 'metakey', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'metadesc', 'metadesc', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'metalanguage_setting', 'metalanguage_setting', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'metarobot_info', 'metarobot_info', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'pagetitle', 'pagetitle', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'pageheading', 'pageheading', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'sef_url', 'sef_url', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'ordering', 'ordering', "INT(11) NOT NULL DEFAULT 0"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'manufacturer_url', 'manufacturer_url', "VARCHAR(255) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'excluding_category_list', 'excluding_category_list', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'published', 'published', "TINYINT(4) NOT NULL DEFAULT 1"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_manufacturer', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); + +CALL redSHOP_Index_Add('#__redshop_manufacturer', '#__manufacturer_published', '(`published` ASC)'); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.3.sql b/component/admin/sql/updates/mysql/2.0.3.sql new file mode 100644 index 00000000000..1c1dea41bef --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.3.sql @@ -0,0 +1,17 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL redSHOP_Index_Add('#__redshop_order_item', 'idx_product_quantity', "USING BTREE (`product_id` ASC, `product_quantity` ASC)"); +CALL redSHOP_Index_Add('#__redshop_product', '#__rs_prod_publish_parent', "(`product_parent_id` ASC, `published` ASC)"); +CALL redSHOP_Index_Add('#__redshop_product', '#__rs_prod_publish_parent_special', "(`product_parent_id` ASC, `published` ASC, `product_special` ASC)"); +CALL redSHOP_Index_Add('#__redshop_product_subattribute_color', '#__rs_sub_prop_common', "(`subattribute_id` ASC, `subattribute_published` ASC, `ordering` ASC)"); + +CALL redSHOP_Column_Update('#__redshop_tax_group', 'tax_group_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); +CALL redSHOP_Column_Update('#__redshop_tax_group', 'tax_group_name', 'name', "VARCHAR(255) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_tax_group', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_tax_group', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_tax_group', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_tax_group', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_tax_group', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_tax_group', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.4.sql b/component/admin/sql/updates/mysql/2.0.4.sql new file mode 100644 index 00000000000..73af3dc8850 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.4.sql @@ -0,0 +1,33 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL redSHOP_Column_Update('#__redshop_quotation', 'quotation_customer_note', 'quotation_customer_note', "TEXT NOT NULL AFTER `quotation_note`"); + +CALL redSHOP_Column_Update('#__redshop_product', 'allow_decimal_piece', 'allow_decimal_piece', "INT(4) NOT NULL"); +CALL redSHOP_Index_Remove('#__redshop_product', 'product_number'); + +CALL redSHOP_Index_Remove('#__redshop_country', 'idx_country_name'); + +CALL redSHOP_Index_Remove('#__redshop_currency', 'idx_currency_name'); + +CALL redSHOP_Column_Remove('#__redshop_order_item', 'container_id'); + +CALL redSHOP_Column_Update('#__redshop_usercart_item', 'attribs', 'attribs', "VARCHAR(5120) NOT NULL COMMENT 'Specified user attributes related with current item'"); + +CALL redSHOP_Column_Update('#__redshop_orders', 'invoice_number', 'invoice_number', "VARCHAR( 255 ) NOT NULL COMMENT 'Formatted Order Invoice for final use' AFTER `order_number`"); +CALL redSHOP_Column_Update('#__redshop_orders', 'invoice_number_chrono', 'invoice_number_chrono', " INT NOT NULL COMMENT 'Order invoice number in chronological order' AFTER `order_number`"); +CALL redSHOP_Index_Add('#__redshop_orders', 'idx_orders_invoice_number', '(`invoice_number` ASC)'); +CALL redSHOP_Index_Add('#__redshop_orders', 'idx_orders_invoice_number_chrono', '(`invoice_number_chrono` ASC)'); + +CALL redSHOP_Index_Unique_Add('#__redshop_order_payment', 'order_id', "(`order_id` ASC)"); +CALL redSHOP_Index_Remove('#__redshop_order_payment', 'idx_order_id'); + +CALL redSHOP_Column_Update('#__redshop_discount', 'name', 'name', "VARCHAR(250) NOT NULL"); +CALL redSHOP_Index_Add('#__redshop_discount', 'idx_discount_name', '(`name` ASC)'); + +CALL redSHOP_Column_Update('#__redshop_giftcard', 'free_shipping', 'free_shipping', "TINYINT NOT NULL"); + +CALL redSHOP_Index_Add('#__redshop_product_stockroom_xref', 'idx_product_id', '(`product_id` ASC)'); +CALL redSHOP_Index_Add('#__redshop_product_stockroom_xref', 'idx_quantity', '(`quantity` ASC)'); + + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.5.sql b/component/admin/sql/updates/mysql/2.0.5.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/sql/updates/mysql/2.0.6.sql b/component/admin/sql/updates/mysql/2.0.6.sql new file mode 100644 index 00000000000..f38b39a23dd --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.6.sql @@ -0,0 +1,73 @@ +SET FOREIGN_KEY_CHECKS = 0; + +DROP TABLE IF EXISTS `#__redshop_accessmanager`; + +CALL redSHOP_Column_Update('#__redshop_category', 'category_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); +CALL redSHOP_Column_Update('#__redshop_category', 'category_name', 'name', "VARCHAR(255) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_category', 'category_short_description', 'short_description', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_category', 'category_description', 'description', "TEXT NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_category', 'published', 'published', "TINYINT(4) NOT NULL DEFAULT 0"); +CALL redSHOP_Column_Update('#__redshop_category', 'category_template', 'template', "INT(11) NOT NULL DEFAULT 0"); +CALL redSHOP_Column_Update('#__redshop_category', 'category_more_template', 'more_template', "VARCHAR(255) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_category', 'category_pdate', 'category_pdate', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_category', 'alias', 'alias', "VARCHAR(255) NOT NULL DEFAULT '' AFTER `append_to_global_seo`"); +CALL redSHOP_Column_Update('#__redshop_category', 'path', 'path', "VARCHAR(255) NOT NULL DEFAULT '' AFTER `alias`"); +CALL redSHOP_Column_Update('#__redshop_category', 'asset_id', 'asset_id', "INT(11) NULL DEFAULT '0' COMMENT 'FK to the #__assets table.' AFTER `path`"); +CALL redSHOP_Column_Update('#__redshop_category', 'parent_id', 'parent_id', "INT(11) NULL DEFAULT '0' AFTER `asset_id`"); +CALL redSHOP_Column_Update('#__redshop_category', 'level', 'level', "INT(11) NOT NULL DEFAULT '0' AFTER `parent_id`"); +CALL redSHOP_Column_Update('#__redshop_category', 'lft', 'lft', "INT(11) NOT NULL DEFAULT '0' AFTER `level`"); +CALL redSHOP_Column_Update('#__redshop_category', 'rgt', 'rgt', "INT(11) NOT NULL DEFAULT '0' AFTER `lft`"); +CALL redSHOP_Column_Update('#__redshop_category', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL AFTER `rgt`"); +CALL redSHOP_Column_Update('#__redshop_category', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out`"); +CALL redSHOP_Column_Update('#__redshop_category', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out_time`"); +CALL redSHOP_Column_Update('#__redshop_category', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL AFTER `created_date`"); +CALL redSHOP_Column_Update('#__redshop_category', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL AFTER `created_by`"); +CALL redSHOP_Column_Update('#__redshop_category', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `modified_by`"); +CALL redSHOP_Column_Update('#__redshop_category', 'publish_up', 'publish_up', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `modified_date`"); +CALL redSHOP_Column_Update('#__redshop_category', 'publish_down', 'publish_down', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `publish_up`"); + +CALL redSHOP_Index_Add('#__redshop_category', '#__rs_idx_category_published', "(`published` ASC)"); +CALL redSHOP_Index_Add('#__redshop_category', '#__rs_idx_left_right', "(`lft` ASC, `rgt` ASC)"); +CALL redSHOP_Index_Add('#__redshop_category', '#__rs_idx_alias', "(`alias` ASC)"); +CALL redSHOP_Index_Add('#__redshop_category', '#__rs_idx_path', "(`path` ASC)"); + +CALL redSHOP_Column_Update('#__redshop_fields', 'field_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_title', 'title', "VARCHAR(250) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_name', 'name', "VARCHAR(250) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_type', 'type', "VARCHAR(20) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_desc', 'desc', "LONGTEXT NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_class', 'class', "VARCHAR(20) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_section', 'section', "VARCHAR(20) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_maxlength', 'maxlength', "INT(11) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_cols', 'cols', "INT(11) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_rows', 'rows', "INT(11) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_size', 'size', "TINYINT(4) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'field_show_in_front', 'show_in_front', "TINYINT(4) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'publish_up', 'publish_up', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `published`"); +CALL redSHOP_Column_Update('#__redshop_fields', 'publish_down', 'publish_down', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `publish_up`"); +CALL redSHOP_Column_Update('#__redshop_fields', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_fields', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_fields', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_fields', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_fields', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL"); + +CALL redSHOP_Index_Remove('#__redshop_fields', 'idx_published'); +CALL redSHOP_Index_Remove('#__redshop_fields', 'idx_field_section'); +CALL redSHOP_Index_Remove('#__redshop_fields', 'idx_field_type'); +CALL redSHOP_Index_Remove('#__redshop_fields', 'idx_required'); +CALL redSHOP_Index_Remove('#__redshop_fields', 'idx_field_name'); +CALL redSHOP_Index_Remove('#__redshop_fields', 'idx_field_show_in_front'); +CALL redSHOP_Index_Remove('#__redshop_fields', 'idx_display_in_product'); + +CALL redSHOP_Index_Add('#__redshop_fields', '#__rs_idx_field_published', "(`published` ASC)"); +CALL redSHOP_Index_Add('#__redshop_fields', '#__rs_idx_field_section', "(`section` ASC)"); +CALL redSHOP_Index_Add('#__redshop_fields', '#__rs_idx_field_type', "(`type` ASC)"); +CALL redSHOP_Index_Add('#__redshop_fields', '#__rs_idx_field_required', "(`required` ASC)"); +CALL redSHOP_Index_Add('#__redshop_fields', '#__rs_idx_field_name', "(`name` ASC)"); +CALL redSHOP_Index_Add('#__redshop_fields', '#__rs_idx_field_show_in_front', "(`show_in_front` ASC)"); +CALL redSHOP_Index_Add('#__redshop_fields', '#__rs_idx_field_display_in_product', "(`display_in_product` ASC)"); + +CALL redSHOP_Column_Update('#__redshop_product_attribute', 'attribute_description', 'attribute_description', "VARCHAR(255) NOT NULL DEFAULT '' AFTER `attribute_name`"); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.7.sql b/component/admin/sql/updates/mysql/2.0.7.sql new file mode 100644 index 00000000000..f0e238b9e05 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.7.sql @@ -0,0 +1,40 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ----------------------------------------------------- +-- Table `#__redshop_voucher` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_voucher`; + +CREATE TABLE IF NOT EXISTS `#__redshop_voucher` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `code` VARCHAR(255) NOT NULL DEFAULT '', + `amount` DECIMAL(12,2) NOT NULL DEFAULT '0.00', + `type` VARCHAR(250) NOT NULL, + `start_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `end_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `free_ship` TINYINT(4) NOT NULL, + `voucher_left` INT(11) NOT NULL, + `published` TINYINT(4) NOT NULL DEFAULT '0', + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + UNIQUE INDEX `#__rs_voucher_code` (`code` ASC), + INDEX `#__rs_voucher_common` (`code` ASC, `published` ASC, `start_date` ASC, `end_date` ASC), + INDEX `#__rs_voucher_left` (`voucher_left` ASC)) +ROW_FORMAT=DYNAMIC +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Tags +-- ----------------------------------------------------- +INSERT IGNORE INTO `#__content_types` +(`type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) +VALUES +('redSHOP', 'com_redshop.product', '{"special":{"dbtable":"#__redshop_product","key":"product_id"}}', '', '{"common":{"core_content_item_id":"product_id","core_title":"product_name","core_state":"published","core_catid":"cat_in_sefurl"}}', 'RedshopHelperRoute::getProductRoute', ''); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.8.sql b/component/admin/sql/updates/mysql/2.0.8.sql new file mode 100644 index 00000000000..b6d691b34ca --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.8.sql @@ -0,0 +1,19 @@ +SET FOREIGN_KEY_CHECKS = 0; + +CALL redSHOP_Column_Update('#__redshop_product', 'use_individual_payment_method', 'use_individual_payment_method', 'INT(4) NOT NULL DEFAULT 0'); + +-- ----------------------------------------------------- +-- Table `#__redshop_product_payment_xref` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_product_payment_xref` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_product_payment_xref` ( + `payment_id` VARCHAR(255) NOT NULL DEFAULT '', + `product_id` TINYINT(11) NOT NULL, + PRIMARY KEY (`product_id`, `payment_id`), + INDEX `#__rs_pro_pay_ref_fk1` (`product_id` ASC)) +ROW_FORMAT=DYNAMIC +ENGINE = InnoDB +COMMENT = 'redSHOP Product Individual payment reference.'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.0.9.sql b/component/admin/sql/updates/mysql/2.0.9.sql new file mode 100644 index 00000000000..6fa85b61379 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.0.9.sql @@ -0,0 +1,25 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ------------------------------------------------------ +-- Table `#__redshop_template` +-- ------------------------------------------------------ +CALL redSHOP_Index_Remove('#__redshop_template', 'idx_template_section'); +CALL redSHOP_Index_Remove('#__redshop_template', 'idx_published'); + +CALL redSHOP_Column_Update('#__redshop_template', 'template_id', 'id', 'INT(11) NOT NULL AUTO_INCREMENT'); +CALL redSHOP_Column_Update('#__redshop_template', 'template_name', 'name', "VARCHAR(250) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_template', 'template_section', 'section', "VARCHAR(250) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_template', 'file_name', 'file_name', "VARCHAR(255) NOT NULL DEFAULT '' AFTER `section`"); +CALL redSHOP_Column_Update('#__redshop_template', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_template', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out`"); +CALL redSHOP_Column_Update('#__redshop_template', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out_time`"); +CALL redSHOP_Column_Update('#__redshop_template', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL AFTER `created_date`"); +CALL redSHOP_Column_Update('#__redshop_template', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL AFTER `created_by`"); +CALL redSHOP_Column_Update('#__redshop_template', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `modified_by`"); + +CALL redSHOP_Column_Remove('#__redshop_template', 'template_desc'); + +CALL redSHOP_Index_Add('#__redshop_template', '#__rs_tmpl_section', '(`section` ASC)'); +CALL redSHOP_Index_Add('#__redshop_template', '#__rs_tmpl_published', '(`published` ASC)'); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.1.0.sql b/component/admin/sql/updates/mysql/2.1.0.sql new file mode 100644 index 00000000000..6f27cdc6821 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.1.0.sql @@ -0,0 +1,84 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ------------------------------------------------------ +-- Table `#__redshop_coupons` +-- ------------------------------------------------------ +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_coupon_code'); +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_percent_or_total'); +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_start_date'); +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_end_date'); +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_coupon_type'); +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_userid'); +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_coupon_left'); +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_published'); +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_subtotal'); +CALL redSHOP_Index_Remove('#__redshop_coupons', 'idx_order_id'); + +CALL redSHOP_Column_Update('#__redshop_coupons', 'coupon_id', 'id', "INT(11) NOT NULL AUTO_INCREMENT"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'coupon_code', 'code', "VARCHAR(32) NOT NULL DEFAULT ''"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'percent_or_total', 'type', "TINYINT(4) NOT NULL DEFAULT 0"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'coupon_value', 'value', "DECIMAL(12,2) NOT NULL DEFAULT '0.00'"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'coupon_type', 'effect', "TINYINT(4) NOT NULL DEFAULT 0 COMMENT '0 - Global, 1 - User Specific'"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'coupon_left', 'amount_left', "INT(11) NOT NULL"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'free_shipping', 'free_shipping', "TINYINT(4) NOT NULL DEFAULT 0"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'start_date', 'start_date_old', "DOUBLE NOT NULL DEFAULT 0"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'end_date', 'end_date_old', "DOUBLE NOT NULL DEFAULT 0"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'start_date', 'start_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'end_date', 'end_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out`"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out_time`"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL AFTER `created_date`"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL AFTER `created_by`"); +CALL redSHOP_Column_Update('#__redshop_coupons', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `modified_by`"); + +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_code', "(`code` ASC)"); +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_type', "(`type` ASC)"); +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_start_date', "(`start_date` ASC)"); +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_end_date', "(`end_date` ASC)"); +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_effect', "(`effect` ASC)"); +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_user_id', "(`userid` ASC)"); +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_left', "(`amount_left` ASC)"); +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_published', "(`published` ASC)"); +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_subtotal', "(`subtotal` ASC)"); +CALL redSHOP_Index_Add('#__redshop_coupons', '#__rs_coupon_order_id', "(`order_id` ASC)"); + +CALL redSHOP_Index_Add('#__redshop_category', '#__rs_idx_category_parent', '(`parent_id` ASC)'); +CALL redSHOP_Index_Add('#__redshop_product', '#__prod_pub_exp_parent', '(`product_parent_id` ASC, `published` ASC, `expired` ASC)'); +CALL redSHOP_Index_Add('#__redshop_fields_data', '#__field_data_common', '(`itemid` ASC, `section` ASC)'); +CALL redSHOP_Index_Add('#__redshop_manufacturer', '#__manufacturer_common_idx', '(`id` ASC, `name` ASC, `published` ASC)'); +CALL redSHOP_Index_Add('#__redshop_product_category_xref', '#__prod_cat_idx1', '(`category_id` ASC, `product_id` ASC)'); +CALL redSHOP_Index_Add('#__redshop_fields', '#__rs_idx_field_common', '(`id` ASC, `name` ASC, `published` ASC, `section` ASC)'); +CALL redSHOP_Index_Remove('#__redshop_fields_data', 'itemid'); + +-- ----------------------------------------------------- +-- Table `#__redshop_fields_group` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `#__redshop_fields_group` ; + +CREATE TABLE IF NOT EXISTS `#__redshop_fields_group` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(125) NOT NULL, + `description` VARCHAR(1024) NOT NULL DEFAULT '', + `section` VARCHAR(20) NOT NULL, + `ordering` INT(11) NOT NULL DEFAULT 0, + `published` TINYINT(4) NOT NULL DEFAULT 0, + `created_by` INT(11) NULL DEFAULT NULL, + `created_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `checked_out` INT(11) NULL DEFAULT NULL, + `checked_out_time` DATETIME NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` INT(11) NULL DEFAULT NULL, + `modified_date` DATETIME NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + INDEX `#__rs_feld_group_idx1` (`section` ASC), + INDEX `#__rs_feld_group_idx2` (`published` ASC)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 +COMMENT = 'Custom fields groups'; + +CALL redSHOP_Column_Update('#__redshop_fields', 'groupId', 'groupId', "INT(11) NULL DEFAULT NULL AFTER `section`"); +CALL redSHOP_Constraint_Remove('#__redshop_fields', '#__rs_field_fk1'); +CALL redSHOP_Index_Add('#__redshop_fields', '#__rs_field_fk1', "(`groupId` ASC)"); +CALL redSHOP_Constraint_Update('#__redshop_fields', '#__rs_field_fk1', 'groupId', '#__redshop_fields_group', 'id', 'CASCADE', 'SET NULL'); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.1.1.sql b/component/admin/sql/updates/mysql/2.1.1.sql new file mode 100644 index 00000000000..06e53303d9a --- /dev/null +++ b/component/admin/sql/updates/mysql/2.1.1.sql @@ -0,0 +1,31 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ----------------------------------------------------- +-- Table `#__redshop_discount` +-- ----------------------------------------------------- +CALL redSHOP_Column_Update('#__redshop_discount', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_discount', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out`"); +CALL redSHOP_Column_Update('#__redshop_discount', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out_time`"); +CALL redSHOP_Column_Update('#__redshop_discount', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL AFTER `created_date`"); +CALL redSHOP_Column_Update('#__redshop_discount', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL AFTER `created_by`"); +CALL redSHOP_Column_Update('#__redshop_discount', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `modified_by`"); + -- ----------------------------------------------------- +-- Table `#__redshop_discount_product` +-- ----------------------------------------------------- +CALL redSHOP_Column_Update('#__redshop_discount_product', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_discount_product', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out`"); +CALL redSHOP_Column_Update('#__redshop_discount_product', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out_time`"); +CALL redSHOP_Column_Update('#__redshop_discount_product', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL AFTER `created_date`"); +CALL redSHOP_Column_Update('#__redshop_discount_product', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL AFTER `created_by`"); +CALL redSHOP_Column_Update('#__redshop_discount_product', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `modified_by`"); + -- ----------------------------------------------------- +-- Table `#__redshop_mail` +-- ----------------------------------------------------- +CALL redSHOP_Column_Update('#__redshop_mail', 'checked_out', 'checked_out', "INT(11) NULL DEFAULT NULL"); +CALL redSHOP_Column_Update('#__redshop_mail', 'checked_out_time', 'checked_out_time', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out`"); +CALL redSHOP_Column_Update('#__redshop_mail', 'created_date', 'created_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `checked_out_time`"); +CALL redSHOP_Column_Update('#__redshop_mail', 'created_by', 'created_by', "INT(11) NULL DEFAULT NULL AFTER `created_date`"); +CALL redSHOP_Column_Update('#__redshop_mail', 'modified_by', 'modified_by', "INT(11) NULL DEFAULT NULL AFTER `created_by`"); +CALL redSHOP_Column_Update('#__redshop_mail', 'modified_date', 'modified_date', "DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `modified_by`"); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.1.2.1.sql b/component/admin/sql/updates/mysql/2.1.2.1.sql new file mode 100644 index 00000000000..60f2eb26c17 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.1.2.1.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ----------------------------------------------------- +-- Table `#__redshop_zipcode` +-- ----------------------------------------------------- +CALL redSHOP_Column_Update('#__redshop_zipcode', 'zipcode_id', 'id', 'INT(11) NOT NULL AUTO_INCREMENT'); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.1.2.2.sql b/component/admin/sql/updates/mysql/2.1.2.2.sql new file mode 100644 index 00000000000..4d564fde026 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.1.2.2.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ----------------------------------------------------- +-- Table `#__redshop_notifystock_users` +-- ----------------------------------------------------- +CALL redSHOP_Column_Update('#__redshop_notifystock_users', 'email_not_login', 'email_not_login', 'VARCHAR(150) NULL'); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/2.1.2.sql b/component/admin/sql/updates/mysql/2.1.2.sql new file mode 100644 index 00000000000..3bcdeaae177 --- /dev/null +++ b/component/admin/sql/updates/mysql/2.1.2.sql @@ -0,0 +1,8 @@ +SET FOREIGN_KEY_CHECKS = 0; + +-- ----------------------------------------------------- +-- Table `#__redshop_category` +-- ----------------------------------------------------- +CALL redSHOP_Column_Update('#__redshop_category', 'product_filter_params', 'product_filter_params', "MEDIUMTEXT NOT NULL DEFAULT '' AFTER `publish_down`"); + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/component/admin/sql/updates/mysql/index.html b/component/admin/sql/updates/mysql/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/sql/updates/mysql/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/tables/access.php b/component/admin/tables/access.php new file mode 100644 index 00000000000..67875b61ace --- /dev/null +++ b/component/admin/tables/access.php @@ -0,0 +1,21 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_accessory', 'accessory_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/accountgroup_detail.php b/component/admin/tables/accountgroup_detail.php new file mode 100644 index 00000000000..55dfd41bc96 --- /dev/null +++ b/component/admin/tables/accountgroup_detail.php @@ -0,0 +1,53 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'economic_accountgroup', 'accountgroup_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} + diff --git a/component/admin/tables/alert_detail.php b/component/admin/tables/alert_detail.php new file mode 100644 index 00000000000..83f4cca23ef --- /dev/null +++ b/component/admin/tables/alert_detail.php @@ -0,0 +1,28 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'alert', 'id', $db); + } +} diff --git a/component/admin/tables/associations.php b/component/admin/tables/associations.php new file mode 100644 index 00000000000..99dea764235 --- /dev/null +++ b/component/admin/tables/associations.php @@ -0,0 +1,41 @@ +_tbl_key; + + // Sanitize input. + $pks = ArrayHelper::toInteger($pks); + $userId = (int) $userId; + $state = (int) $state; + + // If there are no primary keys set check to see if the instance key is set. + if (empty($pks)) + { + if ($this->$k) + { + $pks = array($this->$k); + } + // Nothing to set publishing state on, return false. + else + { + $this->setError(JText::_('JLIB_DATABASE_ERROR_NO_ROWS_SELECTED')); + + return false; + } + } + + // Build the WHERE clause for the primary keys. + $where = $k . '=' . implode(' OR ' . $k . '=', $pks); + + // Determine if there is checkin support for the table. + if (!property_exists($this, 'checked_out') || !property_exists($this, 'checked_out_time')) + { + $checkin = ''; + } + else + { + $checkin = ' AND (checked_out = 0 OR checked_out = ' . (int) $userId . ')'; + } + + // Update the publishing state for rows with the given primary keys. + $this->_db->setQuery( + 'UPDATE ' . $this->_db->quoteName($this->_tbl) + . ' SET ' . $this->_db->quoteName('attribute_published') . ' = ' . (int) $state + . ' WHERE (' . $where . ')' + . $checkin + ); + + try + { + $this->_db->execute(); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + // If checkin is supported and all rows were adjusted, check them in. + if ($checkin && (count($pks) == $this->_db->getAffectedRows())) + { + // Checkin the rows. + foreach ($pks as $pk) + { + $this->checkin($pk); + } + } + + // If the JTable instance value is in the list of primary keys that were set, set the instance. + if (in_array($this->$k, $pks)) + { + $this->state = $state; + } + + $this->setError(''); + + return true; + } +} diff --git a/component/admin/tables/attribute_property.php b/component/admin/tables/attribute_property.php new file mode 100644 index 00000000000..3be4c2e9055 --- /dev/null +++ b/component/admin/tables/attribute_property.php @@ -0,0 +1,60 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_attribute_property', 'property_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/attribute_set_detail.php b/component/admin/tables/attribute_set_detail.php new file mode 100644 index 00000000000..3bd4ee0a4d9 --- /dev/null +++ b/component/admin/tables/attribute_set_detail.php @@ -0,0 +1,38 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'attribute_set', 'attribute_set_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/attributeprices_detail.php b/component/admin/tables/attributeprices_detail.php new file mode 100644 index 00000000000..abbc517eeb6 --- /dev/null +++ b/component/admin/tables/attributeprices_detail.php @@ -0,0 +1,93 @@ +_table_prefix = '#__redshop_'; + parent::__construct($this->_table_prefix . 'product_attribute_price', 'price_id', $db); + } + + /** + * Method to check user entered valid quantity start and end for shopper group based price. + * + * @return boolean True on success. + */ + public function check() + { + $query = 'SELECT price_id FROM ' . $this->_table_prefix . 'product_attribute_price WHERE shopper_group_id = "' + . $this->shopper_group_id . '" AND section_id = ' . (int) $this->section_id + . ' AND price_quantity_start <= ' . (int) $this->price_quantity_start + . ' AND price_quantity_end >= ' . (int) $this->price_quantity_start; + + $this->_db->setQuery($query); + $xid = intval($this->_db->loadResult()); + + $query_end = 'SELECT price_id FROM ' . $this->_table_prefix . 'product_attribute_price WHERE shopper_group_id = "' + . $this->shopper_group_id . '" AND section_id = ' . (int) $this->section_id + . ' AND price_quantity_start <= ' . (int) $this->price_quantity_end + . ' AND price_quantity_end >= ' . (int) $this->price_quantity_end; + + $this->_db->setQuery($query_end); + $xid_end = intval($this->_db->loadResult()); + + if (($xid || $xid_end) + && ( ($xid != intval($this->price_id) + && $xid != 0) + || ( $xid_end != intval($this->price_id) + && $xid_end != 0 )) + ) + { + $this->_error = JText::sprintf('WARNNAMETRYAGAIN', JText::_('COM_REDSHOP_PRICE_ALREADY_EXISTS')); + + return false; + } + + return true; + } +} diff --git a/component/admin/tables/barcode.php b/component/admin/tables/barcode.php new file mode 100644 index 00000000000..c2f36309fcb --- /dev/null +++ b/component/admin/tables/barcode.php @@ -0,0 +1,49 @@ +_table_prefix = '#__redshop_'; + parent::__construct($this->_table_prefix . 'orderbarcode_log', 'log_id', $db); + } +} diff --git a/component/admin/tables/catalog.php b/component/admin/tables/catalog.php new file mode 100644 index 00000000000..95ff80e23e5 --- /dev/null +++ b/component/admin/tables/catalog.php @@ -0,0 +1,34 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'catalog_request', 'catalog_user_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/category.php b/component/admin/tables/category.php new file mode 100644 index 00000000000..25a019c93a6 --- /dev/null +++ b/component/admin/tables/category.php @@ -0,0 +1,215 @@ +getDbo(); + + // Check child category + $query = $db->getQuery(true) + ->select('COUNT(*) AS ctotal') + ->select($db->qn('name')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('parent_id') . ' = ' . (int) $this->id); + + $childCount = $db->setQuery($query)->loadResult(); + + if ($childCount > 0) + { + $this->setError(JText::sprintf('COM_REDSHOP_CATEGORY_PARENT_ERROR_MSG', $this->name, $this->id)); + + return false; + } + + // Check products + $productCount = RedshopEntityCategory::getInstance($this->id)->productCount(); + + if ($productCount > 0) + { + $this->setError(JText::sprintf('COM_REDSHOP_CATEGORY_EXIST_PRODUCT', $this->name, $this->id)); + + return false; + } + + // Remove thumb images. + if (!empty($this->category_thumb_image)) + { + $thumbPath = REDSHOP_FRONT_IMAGES_RELPATH . 'category/thumb/' . $this->category_thumb_image; + + if (JFile::exists($thumbPath)) + { + JFile::delete($thumbPath); + } + } + + // Remove full images. + if (!empty($this->category_full_image)) + { + $fullImagePath = REDSHOP_FRONT_IMAGES_RELPATH . 'category/thumb/' . $this->category_full_image; + + if (JFile::exists($fullImagePath)) + { + JFile::delete($fullImagePath); + } + } + + // Remove reference with products + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_product_category_xref')) + ->where($db->qn('category_id') . ' = ' . $this->id); + $db->setQuery($query)->execute(); + + // Force do not delete child categories + return parent::doDelete($pk, false); + } + + /** + * Do the database store. + * + * @param boolean $updateNulls True to update null values as well. + * + * @return boolean + * @since 2.1.0 + */ + protected function doStore($updateNulls = false) + { + if (!parent::doStore($updateNulls)) + { + return false; + } + + // Prepare target folder. + \Redshop\Helper\Media::createFolder(REDSHOP_MEDIA_IMAGE_RELPATH . 'category/' . $this->id); + + // Prepare target folder. + \Redshop\Helper\Media::createFolder(REDSHOP_MEDIA_IMAGE_RELPATH . 'category/' . $this->id . '/thumb'); + + /** @var RedshopModelCategory $model */ + $model = RedshopModel::getInstance('Category', 'RedshopModel'); + $media = $this->getOption('media', array()); + + if (!empty($media['category_full_image'])) + { + $model->storeMedia($this, $media['category_full_image'], 'full'); + } + + if (!empty($media['category_back_full_image'])) + { + $model->storeMedia($this, $media['category_back_full_image'], 'back'); + } + + return true; + } + + /** + * Called check(). + * + * @return boolean True on success. + * @throws Exception + * + * @since 2.1.0 + */ + protected function doCheck() + { + if (empty(trim($this->name))) + { + $this->setError(JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_NAME')); + + return false; + } + + return parent::doCheck(); + } +} diff --git a/component/admin/tables/country.php b/component/admin/tables/country.php new file mode 100644 index 00000000000..696f6d33a44 --- /dev/null +++ b/component/admin/tables/country.php @@ -0,0 +1,91 @@ +country_name)) + { + return false; + } + + if (empty($this->country_3_code)) + { + return false; + } + + if (empty($this->country_2_code)) + { + return false; + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select($db->qn(array('id', 'country_3_code'))) + ->from($db->qn('#__redshop_country')) + ->where($db->qn('country_3_code') . ' = ' . $db->quote($this->country_3_code) . ' AND ' . $db->qn('id') . ' != ' . $db->q($this->id)); + + $xid = $db->setQuery($query)->loadResult(); + + if ($xid) + { + $this->setError(JText::_('COM_REDSHOP_COUNTRY_CODE_3_ALREADY_EXISTS')); + + return false; + } + else + { + $query = $db->getQuery(true); + $query->select($db->qn(array('id', 'country_3_code', 'country_2_code'))) + ->from($db->qn('#__redshop_country')) + ->where($db->qn('country_2_code') . ' = ' . $db->q($this->country_2_code) . ' AND ' . $db->qn('id') . ' != ' . $db->q($this->id)); + + $xid = $db->setQuery($query)->loadResult(); + + if ($xid) + { + $this->setError(JText::_('COM_REDSHOP_COUNTRY_CODE_2_ALREADY_EXISTS')); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/tables/coupon.php b/component/admin/tables/coupon.php new file mode 100644 index 00000000000..3060d7d0f7a --- /dev/null +++ b/component/admin/tables/coupon.php @@ -0,0 +1,182 @@ +code)) + { + return false; + } + + if (empty($this->value)) + { + return false; + } + + $db = $this->getDbo(); + + // Check duplicate. + $code = $this->get('code'); + + $voucherQuery = $db->getQuery(true) + ->select($db->qn('code')) + ->from($db->qn('#__redshop_voucher')); + + $couponQuery = $db->getQuery(true) + ->select($db->qn('code')) + ->from($db->qn('#__redshop_coupons')); + + if ($this->hasPrimaryKey()) + { + $couponQuery->where($db->qn('id') . ' <> ' . $this->id); + } + + $couponQuery->union($voucherQuery); + + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from('(' . $couponQuery . ') AS ' . $db->qn('data')) + ->where($db->qn('data.code') . ' = ' . $db->quote($code)); + + if ($db->setQuery($query)->loadResult()) + { + $this->setError(JText::_('COM_REDSHOP_COUPON_ERROR_CODE_ALREADY_EXIST')); + + return false; + } + + return true; + } +} diff --git a/component/admin/tables/currency.php b/component/admin/tables/currency.php new file mode 100644 index 00000000000..c89dcbb71e6 --- /dev/null +++ b/component/admin/tables/currency.php @@ -0,0 +1,143 @@ +name)) + { + return false; + } + + if (empty($this->code)) + { + return false; + } + + $db = $this->getDbo(); + + // Check duplicate. + $code = $this->get('code'); + + $codeQuery = $db->getQuery(true) + ->select($db->qn('code')) + ->from($db->qn('#__' . $this->_tableName)); + + if ($this->hasPrimaryKey()) + { + $codeQuery->where($db->qn('id') . ' <> ' . $this->id); + } + + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from('(' . $codeQuery . ') AS ' . $db->qn('data')) + ->where($db->qn('data.code') . ' = ' . $db->q($code)); + + if ($db->setQuery($query)->loadResult()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_CURRENCY_CODE_ALREADY_EXISTS')); + + return false; + } + + return true; + } + + /** + * Delete one or more registers + * + * @param mixed $pk Array of ids or ids comma separated + * + * @return boolean Deleted successfully? + */ + protected function doDelete($pk = null) + { + if (Redshop::getConfig()->get('CURRENCY_CODE') == $this->code) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_CURRENCY_ERROR_DELETE_CURRENCY_SET_IN_CONFIG')); + + return false; + } + + return parent::doDelete(); + } +} diff --git a/component/admin/tables/discount.php b/component/admin/tables/discount.php new file mode 100644 index 00000000000..50597b3b649 --- /dev/null +++ b/component/admin/tables/discount.php @@ -0,0 +1,250 @@ +getOption('inlineMode', false) === true) + { + return true; + } + + return $this->updateShopperGroups(); + } + + /** + * Method for update shopper group xref. + * + * @return boolean + */ + protected function updateShopperGroups() + { + $db = $this->getDbo(); + + // Clear current reference products. + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_discount_shoppers')) + ->where($db->qn('discount_id') . ' = ' . $this->discount_id); + $db->setQuery($query)->execute(); + + $shopperGroupIds = $this->getOption('shopperGroups', null); + + if (empty($shopperGroupIds) || empty(array_filter($shopperGroupIds))) + { + return true; + } + + $query->clear() + ->insert($db->qn('#__redshop_discount_shoppers')) + ->columns($db->qn(array('discount_id', 'shopper_group_id'))); + + foreach ($shopperGroupIds as $shopperGroupId) + { + $query->values((int) $this->discount_id . ',' . (int) $shopperGroupId); + } + + return $db->setQuery($query)->execute(); + } + + /** + * Method to bind an associative array or object to the JTable instance.This + * method only binds properties that are publicly accessible and optionally + * takes an array of properties to ignore when binding. + * + * @param mixed $src An associative array or object to bind to the JTable instance. + * @param mixed $ignore An optional array or space separated list of properties to ignore while binding. + * + * @return boolean True on success. + * + * @throws Exception + */ + protected function doBind(&$src, $ignore = array()) + { + if (isset($src['shopper_group']) && !empty($src['shopper_group'])) + { + $shopperGroups = is_string($src['shopper_group']) ? explode(',', $src['shopper_group']) : $src['shopper_group']; + $this->setOption('shopperGroups', array_filter($shopperGroups)); + unset($src['shopper_group']); + } + + return parent::doBind($src, $ignore); + } + + /** + * Checks that the object is valid and able to be stored. + * + * This method checks that the parent_id is non-zero and exists in the database. + * Note that the root node (parent_id = 0) cannot be manipulated with this class. + * + * @return boolean True if all checks pass. + */ + protected function doCheck() + { + if (empty($this->name)) + { + return false; + } + + // Check amount + if ((float) $this->amount <= 0.0) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_ERROR_AMOUNT_ZERO')); + + return false; + } + + // Check discount amount + if ((float) $this->discount_amount <= 0.0) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_ERROR_DISCOUNT_AMOUNT_ZERO')); + + return false; + } + + // Check amount and discount amount + if (((float) $this->amount) < (float) $this->discount_amount) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(JText::_('COM_REDSHOP_DISCOUNT_ERROR_AMOUNT_HIGHT_DISCOUNT_AMOUNT')); + + return false; + } + + // If discount type is percent. Make sure discount amount not higher than 100. + if ($this->discount_type == 1 && $this->discount_amount > 100) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_ERROR_DISCOUNT_PERCENTAGE')); + + return false; + } + + // If discount type is percent. Make sure discount amount not higher than 100. + if (!empty($this->start_date) && !empty($this->end_date) && $this->start_date >= $this->end_date) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_ERROR_START_DATE_SAME_HIGH_END_DATE')); + + return false; + } + + // Check shopper groups + if (empty($this->getOption('shopperGroups', array()))) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_ERROR_MISSING_SHOPPER_GROUPS')); + + return false; + } + + return parent::doCheck(); + } + + /** + * Delete one or more registers + * + * @param mixed $pk Array of ids or ids comma separated + * + * @return boolean Deleted successfully? + */ + public function doDelete($pk = null) + { + $discountId = $this->discount_id; + + if (!parent::doDelete($pk)) + { + return false; + } + + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_discount_shoppers')) + ->where($db->qn('discount_id') . ' = ' . $discountId); + + return $db->setQuery($query)->execute(); + } +} diff --git a/component/admin/tables/discount_product.php b/component/admin/tables/discount_product.php new file mode 100644 index 00000000000..93f433df48b --- /dev/null +++ b/component/admin/tables/discount_product.php @@ -0,0 +1,245 @@ +getOption('inlineMode', false) === true) + { + return true; + } + + return $this->updateShopperGroups(); + } + + /** + * Method for update shopper group xref. + * + * @return boolean + */ + protected function updateShopperGroups() + { + $db = $this->getDbo(); + + // Clear current reference products. + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_discount_product_shoppers')) + ->where($db->qn('discount_product_id') . ' = ' . $this->discount_product_id); + $db->setQuery($query)->execute(); + + $shopperGroupIds = $this->getOption('shopperGroups', null); + + if (empty($shopperGroupIds) || empty(array_filter($shopperGroupIds))) + { + return true; + } + + $query->clear() + ->insert($db->qn('#__redshop_discount_product_shoppers')) + ->columns($db->qn(array('discount_product_id', 'shopper_group_id'))); + + foreach ($shopperGroupIds as $shopperGroupId) + { + $query->values((int) $this->discount_product_id . ',' . (int) $shopperGroupId); + } + + return $db->setQuery($query)->execute(); + } + + /** + * Method to bind an associative array or object to the JTable instance.This + * method only binds properties that are publicly accessible and optionally + * takes an array of properties to ignore when binding. + * + * @param mixed $src An associative array or object to bind to the JTable instance. + * @param mixed $ignore An optional array or space separated list of properties to ignore while binding. + * + * @return boolean True on success. + * + * @throws Exception + */ + protected function doBind(&$src, $ignore = array()) + { + if (isset($src['shopper_group']) && !empty($src['shopper_group'])) + { + $shopperGroups = is_string($src['shopper_group']) ? explode(',', $src['shopper_group']) : $src['shopper_group']; + $this->setOption('shopperGroups', array_values(array_filter($shopperGroups))); + unset($src['shopper_group']); + } + + return parent::doBind($src, $ignore); + } + + /** + * Checks that the object is valid and able to be stored. + * + * This method checks that the parent_id is non-zero and exists in the database. + * Note that the root node (parent_id = 0) cannot be manipulated with this class. + * + * @return boolean True if all checks pass. + */ + protected function doCheck() + { + // Check amount + if ((float) $this->amount <= 0.0) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_AMOUNT_ZERO')); + + return false; + } + + // Check discount amount + if ((float) $this->discount_amount <= 0.0) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_DISCOUNT_AMOUNT_ZERO')); + + return false; + } + + // Check amount and discount amount + if (((float) $this->amount) < (float) $this->discount_amount) + { + /** @scrutinizer ignore-deprecated */ + $this->setError(JText::_('COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_AMOUNT_HIGHT_DISCOUNT_AMOUNT')); + + return false; + } + + // If discount type is percent. Make sure discount amount not higher than 100. + if ($this->discount_type == 1 && $this->discount_amount > 100) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_DISCOUNT_PERCENTAGE')); + + return false; + } + + // Make sure start date always lower than end date. + if (!empty($this->start_date) && !empty($this->end_date) && $this->start_date > $this->end_date) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_START_DATE_SAME_HIGH_END_DATE')); + + return false; + } + + // Check shopper groups + if (empty($this->getOption('shopperGroups', array()))) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_DISCOUNT_PRODUCT_ERROR_MISSING_SHOPPER_GROUPS')); + + return false; + } + + return parent::doCheck(); + } + + /** + * Delete one or more registers + * + * @param mixed $pk Array of ids or ids comma separated + * + * @return boolean Deleted successfully? + */ + public function doDelete($pk = null) + { + $discountProductId = $this->discount_product_id; + + if (!parent::doDelete($pk)) + { + return false; + } + + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_discount_product_shoppers')) + ->where($db->qn('discount_product_id') . ' = ' . $discountProductId); + + return $db->setQuery($query)->execute(); + } +} diff --git a/component/admin/tables/field.php b/component/admin/tables/field.php new file mode 100755 index 00000000000..f0d97e2eaaf --- /dev/null +++ b/component/admin/tables/field.php @@ -0,0 +1,328 @@ +name)) + { + return false; + } + + if (empty($this->title)) + { + return false; + } + + if (!parent::doCheck()) + { + return false; + } + + $this->name = str_replace(" ", "_", $this->name); + + // Set 'rs' prefix to field name + list($prefix) = explode("_", $this->name); + + if ($prefix != 'rs') + { + $this->name = "rs_" . $this->name; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('COUNT(*) AS cnt') + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('name') . ' = ' . $db->quote($this->name)) + ->where($db->qn('id') . ' != ' . (int) $this->id); + + $db->setQuery($query); + $result = $db->loadResult(); + + if ((boolean) $result) + { + $this->setError(JText::_('COM_REDSHOP_FIELDS_ALLREADY_EXIST')); + + return false; + } + + if (!$this->id) + { + $query = $db->getQuery(true) + ->select('COUNT(*) + 1') + ->from($db->qn('#__redshop_fields')); + + $this->ordering = (int) $db->setQuery($query)->loadResult(); + } + + return true; + } + + /** + * Do the database store. + * + * @param boolean $updateNulls True to update null values as well. + * + * @return boolean + * @throws Exception + */ + protected function doStore($updateNulls = false) + { + if (!$this->groupId) + { + $this->groupId = null; + } + + if (!parent::doStore($updateNulls)) + { + return false; + } + + if ($this->type == 0 || $this->type == RedshopHelperExtrafields::TYPE_TEXT || $this->type == RedshopHelperExtrafields::TYPE_TEXT_AREA) + { + $id[] = (int) $this->id; + $this->deleteFieldValues($id, 'field_id'); + } + else + { + $this->saveFieldValues($this->id); + } + + return true; + } + + /** + * Delete one or more registers + * + * @param mixed $pk Array of ids or ids comma separated + * + * @return boolean Deleted successfully? + */ + protected function doDelete($pk = null) + { + $db = $this->getDbo(); + + if (!parent::doDelete($pk)) + { + return false; + } + + if (is_array($pk)) + { + $pk = implode(',', $pk); + } + + // Remove fields_data + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_fields_data')) + ->where($db->qn('fieldid') . ' IN (' . $pk . ')'); + + $db->setQuery($query); + + if (!$db->execute()) + { + $this->setError($db->getErrorMsg()); + } + + return true; + } + + /** + * Method to delete all values related to a field or array of fields + * + * @param array $ids An array of field ids. + * @param string $field The field column to check for deleting. + * + * @return boolean True if successful, false if an error occurs. + * + * @since 2.0.6 + */ + protected function deleteFieldValues($ids, $field) + { + $db = $this->getDbo(); + $ids = implode(',', $ids); + + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_fields_value')) + ->where($db->qn($field) . ' IN (' . $ids . ')'); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + + return true; + } + + /** + * Method to save all values related to a field + * + * @param int $id Id of field. + * + * @return boolean True if successful, false if an error occurs. + * @throws Exception + * + * @since 2.0.6 + */ + protected function saveFieldValues($id) + { + $db = JFactory::getDbo(); + $valueIds = array(); + $extraNames = array(); + $extraValues = array(); + + // Get input + $app = JFactory::getApplication(); + $post = $app->input->post; + $total = 0; + + if (is_array($post->get('value_id'))) + { + $extraValues = $post->getString('extra_value', ''); + $valueIds = $post->get('value_id', array(), 'array'); + + if ($this->type == RedshopHelperExtrafields::TYPE_IMAGE_SELECT || $this->type == RedshopHelperExtrafields::TYPE_IMAGE_WITH_LINK) + { + $extraNames = JFactory::getApplication()->input->files->get('extra_name_file', array(), 'array'); + $total = count((array)$extraNames); + } + else + { + $extraNames = $post->get('extra_name', '', 'raw'); + $total = count((array) $extraNames); + } + } + + // Do not reset values if we are ordering + $task = $app->input->get('task'); + + if ($task != 'fields.saveOrderAjax' && $task != 'saveOrderAjax') + { + $fieldDataIds = RedshopEntityField::getInstance($id)->getFieldValues(); + + if (count($fieldDataIds) > 0) + { + $fid = array(); + + foreach ($fieldDataIds as $fieldDataId) + { + $fid[] = $fieldDataId->value_id; + } + + $delFieldIds = array_diff($fid, $valueIds); + + if (count($delFieldIds) > 0) + { + $this->deleteFieldValues($delFieldIds, 'value_id'); + } + } + } + + for ($j = 0; $j < $total; $j++) + { + $filename = $extraNames[$j]; + + if ($this->type == RedshopHelperExtrafields::TYPE_IMAGE_SELECT || $this->type == RedshopHelperExtrafields::TYPE_IMAGE_WITH_LINK) + { + if ($extraValues[$j] != "" && $extraNames[$j]['name'] != "" && $extraNames[$j]['error'] == 0) + { + $filename = RedshopHelperMedia::cleanFileName($extraNames[$j]['name']); + + $source = $extraNames[$j]['tmp_name']; + $destination = REDSHOP_FRONT_IMAGES_RELPATH . 'extrafield/' . $filename; + + JFile::upload($source, $destination); + } + } + + if ($extraNames[$j]['error'] == 0 || !isset($extraNames[$j]['error'])) + { + if (empty($valueIds[$j])) + { + $obj = new stdClass; + $obj->field_id = (int)$id; + $obj->field_name = $filename; + $obj->field_value = $extraValues[$j]; + $db->insertObject('#__redshop_fields_value', $obj); + } + else + { + $obj = new stdClass; + $obj->value_id = $valueIds[$j]; + $obj->field_value = $extraValues[$j]; + $obj->field_name = $filename; + $db->updateObject('#__redshop_fields_value', $obj, array('value_id')); + } + } + else + { + $obj = new stdClass; + $obj->value_id = $valueIds[$j]; + $obj->field_value = $extraValues[$j]; + $obj->field_name = $filename; + $db->updateObject('#__redshop_fields_value', $obj,array('value_id')); + } + } + + return true; + } +} diff --git a/component/admin/tables/field_data.php b/component/admin/tables/field_data.php new file mode 100644 index 00000000000..668d3653b78 --- /dev/null +++ b/component/admin/tables/field_data.php @@ -0,0 +1,34 @@ +name)) + { + /** @scrutinizer ignore-deprecated */ $this->setError('COM_REDSHOP_FIELD_GROUP_ERROR_MISSING_NAME'); + + return false; + } + + if (empty($this->section)) + { + /** @scrutinizer ignore-deprecated */ $this->setError('COM_REDSHOP_FIELD_GROUP_ERROR_MISSING_SECTION'); + + return false; + } + + return true; + } +} diff --git a/component/admin/tables/fields_value.php b/component/admin/tables/fields_value.php new file mode 100644 index 00000000000..ec4b7086202 --- /dev/null +++ b/component/admin/tables/fields_value.php @@ -0,0 +1,40 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'fields_value', 'value_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/giftcard.php b/component/admin/tables/giftcard.php new file mode 100644 index 00000000000..26feccb2e2d --- /dev/null +++ b/component/admin/tables/giftcard.php @@ -0,0 +1,162 @@ +giftcard_image != '' && file(REDSHOP_FRONT_IMAGES_RELPATH . 'giftcard/' . $this->giftcard_image)) + { + JFile::delete(REDSHOP_FRONT_IMAGES_RELPATH . 'giftcard/' . $this->giftcard_image); + } + + if ($this->giftcard_bgimage != '' && file(REDSHOP_FRONT_IMAGES_RELPATH . 'giftcard/' . $this->giftcard_bgimage)) + { + JFile::delete(REDSHOP_FRONT_IMAGES_RELPATH . 'giftcard/' . $this->giftcard_bgimage); + } + + return parent::doDelete($pk); + } + + /** + * Do the database store. + * + * @param boolean $updateNulls True to update null values as well. + * + * @return boolean + */ + protected function doStore($updateNulls = false) + { + $productHelper = productHelper::getInstance(); + + // Get input + $app = JFactory::getApplication(); + $input = $app->input; + + $giftCardFile = $input->files->get('jform'); + $image = $giftCardFile['giftcard_image_file']; + + if ($image['name'] != '' && $this->giftcard_image != '') + { + JFile::delete(REDSHOP_FRONT_IMAGES_RELPATH . 'giftcard/' . $this->giftcard_image); + $this->giftcard_image = ''; + } + + if ($image['name'] != '') + { + $image['name'] = RedshopHelperMedia::cleanFileName($image['name']); + $this->giftcard_image = $image['name']; + JFile::upload($image['tmp_name'], REDSHOP_FRONT_IMAGES_RELPATH . 'giftcard/' . $image['name']); + } + + // Get background image file + $bgImage = $giftCardFile['giftcard_bgimage_file']; + + if (($bgImage['name'] != '' && $this->giftcard_bgimage != '')) + { + JFile::delete(REDSHOP_FRONT_IMAGES_RELPATH . 'giftcard/' . $this->giftcard_bgimage); + $this->giftcard_bgimage = ''; + } + + if ($bgImage['name'] != '') + { + $bgImage['name'] = RedshopHelperMedia::cleanFileName($bgImage['name']); + $this->giftcard_bgimage = $bgImage['name']; + JFile::upload($bgImage['tmp_name'], REDSHOP_FRONT_IMAGES_RELPATH . 'giftcard/' . $bgImage['name']); + } + + $this->giftcard_price = $productHelper->redpriceDecimal($this->giftcard_price); + $this->giftcard_value = $productHelper->redpriceDecimal($this->giftcard_value); + + if (!parent::doStore($updateNulls)) + { + return false; + } + + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + $giftData = new stdClass; + $giftData->product_id = $this->giftcard_id; + $giftData->product_number = "gift_" . $this->giftcard_id . "_" . $this->giftcard_name; + $giftData->product_name = $this->giftcard_name; + $giftData->product_price = $this->giftcard_price; + $giftData->accountgroup_id = $this->accountgroup_id; + $giftData->product_volume = 0; + + RedshopEconomic::createProductInEconomic($giftData); + } + + return true; + } + + /** + * Checks that the object is valid and able to be stored. + * + * This method checks that the parent_id is non-zero and exists in the database. + * Note that the root node (parent_id = 0) cannot be manipulated with this class. + * + * @return boolean True if all checks pass. + */ + protected function doCheck() + { + if (empty($this->giftcard_name)) + { + return false; + } + + if (empty($this->giftcard_price)) + { + return false; + } + + if (empty($this->giftcard_value)) + { + return false; + } + + if (empty($this->giftcard_validity)) + { + return false; + } + + return parent::doCheck(); + } +} diff --git a/component/admin/tables/index.html b/component/admin/tables/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/tables/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/tables/mail.php b/component/admin/tables/mail.php new file mode 100644 index 00000000000..b22564a9c88 --- /dev/null +++ b/component/admin/tables/mail.php @@ -0,0 +1,62 @@ +mail_name)) + { + return false; + } + + if (empty($this->mail_section)) + { + return false; + } + + if (empty($this->mail_subject)) + { + return false; + } + + return parent::doCheck(); + } +} diff --git a/component/admin/tables/manufacturer.php b/component/admin/tables/manufacturer.php new file mode 100644 index 00000000000..8f95bb02c95 --- /dev/null +++ b/component/admin/tables/manufacturer.php @@ -0,0 +1,254 @@ +id; + $media = RedshopEntityManufacturer::getInstance($manufacturerId)->getMedia(); + + if (!parent::doDelete($pk)) + { + return false; + } + + // B/C for old plugin + JPluginHelper::importPlugin('redshop_product'); + RedshopHelperUtility::getDispatcher()->trigger('onAfterManufacturerDelete', array($manufacturerId)); + + // Delete associated media + if ($media->isValid()) + { + /** @var RedshopTableMedia $mediaTable */ + $mediaTable = RedshopTable::getInstance('Media', 'RedshopTable'); + + if ($mediaTable->load($media->get('media_id'))) + { + $mediaTable->delete(); + } + } + + // Delete media folder + JFolder::delete(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $manufacturerId); + + return true; + } + + /** + * Do the database store. + * + * @param boolean $updateNulls True to update null values as well. + * + * @return boolean + * @throws Exception + * @since 2.1.0 + */ + protected function doStore($updateNulls = false) + { + JPluginHelper::importPlugin('redshop_product'); + + // B/C for old plugin + $isNew = $this->id > 0 ? false : true; + RedshopHelperUtility::getDispatcher()->trigger('onBeforeManufacturerSave', array(&$this, $isNew)); + + if (!parent::doStore($updateNulls)) + { + return false; + } + + // Store fields data. + $this->storeFields(); + + // Store media + $this->storeMedia(); + + // B/C for old plugin + RedshopHelperUtility::getDispatcher()->trigger('onAfterManufacturerSave', array(&$this, $isNew)); + + return true; + } + + /** + * Checks that the object is valid and able to be stored. + * + * This method checks that the parent_id is non-zero and exists in the database. + * Note that the root node (parent_id = 0) cannot be manipulated with this class. + * + * @return boolean True if all checks pass. + */ + protected function doCheck() + { + if (!parent::doCheck()) + { + return false; + } + + // Check product per page + if (!$this->product_per_page) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_MANUFACTURER_ERROR_PRODUCT_PER_PAGE')); + + return false; + } + + return true; + } + + /** + * Method for store fields data. + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + protected function storeFields() + { + RedshopHelperExtrafields::extraFieldSave( + JFactory::getApplication()->input->post->getArray(), RedshopHelperExtrafields::SECTION_MANUFACTURER, $this->id + ); + } + + /** + * Method for store fields data. + * + * @return void + * @throws Exception + * + * @since 2.1.0 + */ + protected function storeMedia() + { + $mediaField = 'manufacturer_image'; + + // Prepare target folder. + \Redshop\Helper\Media::createFolder(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $this->id); + + // Prepare target folder. + \Redshop\Helper\Media::createFolder(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $this->id . '/thumb'); + + $input = JFactory::getApplication()->input; + + $dropzone = $input->post->get('dropzone', array(), ''); + $dropzone = isset($dropzone[$mediaField]) ? $dropzone[$mediaField] : null; + + $dropzoneAlternateText = $input->post->get('dropzone_alternate_text', array(), ''); + $dropzoneAlternateText = isset($dropzoneAlternateText[$mediaField]) ? $dropzoneAlternateText[$mediaField] : null; + + if (null === $dropzone) + { + return; + } + + foreach ($dropzone as $key => $value) + { + /** @var RedshopTableMedia $mediaTable */ + $mediaTable = JTable::getInstance('Media', 'RedshopTable'); + + if (strpos($key, 'media-') !== false) + { + $mediaTable->load(str_replace('media-', '', $key)); + + // Delete old image. + $oldMediaFile = JPath::clean(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' + . $this->id . '/' . $mediaTable->media_name + ); + + if (JFile::exists($oldMediaFile)) + { + JFile::delete($oldMediaFile); + } + + if (empty($value)) + { + $mediaTable->delete(); + + continue; + } + } + else + { + $mediaTable->set('section_id', $this->id); + $mediaTable->set('media_section', 'manufacturer'); + } + + if (!JFile::exists(JPATH_ROOT . '/' . $value)) + { + continue; + } + + $alternateText = isset($dropzoneAlternateText[$key]) ? $dropzoneAlternateText[$key] : $this->name; + + $mediaTable->set('media_alternate_text', $alternateText); + $mediaTable->set('media_type', 'images'); + $mediaTable->set('published', 1); + + // Copy new image for this media + $fileName = md5($this->name) . '.' . JFile::getExt($value); + $file = REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $this->id . '/' . $fileName; + + JFile::move(JPATH_ROOT . '/' . $value, $file); + + $mediaTable->set('media_name', $fileName); + $mediaTable->store(); + + // Optimize image + $factory = new \ImageOptimizer\OptimizerFactory; + $optimizer = $factory->get(); + $optimizer->optimize($file); + } + + // Clear thumbnail folder + \Redshop\Helper\Media::createFolder(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $this->id . '/thumb', true); + } +} diff --git a/component/admin/tables/mass_discount.php b/component/admin/tables/mass_discount.php new file mode 100644 index 00000000000..7dc363176fb --- /dev/null +++ b/component/admin/tables/mass_discount.php @@ -0,0 +1,652 @@ +toUnix(); + } + + // Bind: End Date unix + if (isset($src['end_date']) && !empty($src['end_date']) && !is_numeric($src['end_date'])) + { + $date = JFactory::getDate($src['end_date']); + $src['end_date'] = $date->toUnix(); + } + + // Bind: Discount products + if (isset($src['discount_product']) && !empty($src['discount_product']) && is_array($src['discount_product'])) + { + $src['discount_product'] = ArrayHelper::toInteger($src['discount_product']); + $src['discount_product'] = array_unique(array_filter($src['discount_product'])); + $src['discount_product'] = implode(',', $src['discount_product']); + } + + // Bind: Categories + if (isset($src['category_id']) && !empty($src['category_id']) && is_array($src['category_id'])) + { + $src['category_id'] = ArrayHelper::toInteger($src['category_id']); + $src['category_id'] = array_unique(array_filter($src['category_id'])); + $src['category_id'] = implode(',', $src['category_id']); + } + + // Bind: Manufacturers + if (isset($src['manufacturer_id']) && !empty($src['manufacturer_id']) && is_array($src['manufacturer_id'])) + { + $src['manufacturer_id'] = ArrayHelper::toInteger($src['manufacturer_id']); + $src['manufacturer_id'] = array_unique(array_filter($src['manufacturer_id'])); + $src['manufacturer_id'] = implode(',', $src['manufacturer_id']); + } + + return parent::beforeBind($src, $ignore); + } + + /** + * Method to bind an associative array or object to the JTable instance.This + * method only binds properties that are publicly accessible and optionally + * takes an array of properties to ignore when binding. + * + * @param mixed $src An associative array or object to bind to the JTable instance. + * @param mixed $ignore An optional array or space separated list of properties to ignore while binding. + * + * @return boolean True on success. + * + * @throws \InvalidArgumentException + */ + protected function doBind(&$src, $ignore = array()) + { + if (empty($src['discount_product']) && empty($this->discount_product)) + { + $this->discount_product = null; + unset($src['discount_product']); + } + + if (empty($src['category_id']) && empty($this->category_id)) + { + $this->category_id = null; + unset($src['category_id']); + } + + return parent::doBind($src, $ignore); + } + + /** + * Delete one or more registers + * + * @param string/array $pk Array of ids or ids comma separated + * + * @return boolean Deleted successfuly? + */ + protected function doDelete($pk = null) + { + $massDiscountIds = $pk; + + if (!is_array($massDiscountIds)) + { + $massDiscountIds = array($massDiscountIds); + } + + $massDiscountIds = ArrayHelper::toInteger($massDiscountIds); + $productIds = array(); + + $table = clone $this; + + foreach ($massDiscountIds as $massDiscountId) + { + if (!$table->load($massDiscountId)) + { + continue; + } + + if (!empty($table->get('discount_product'))) + { + $this->updateProduct($table->get('discount_product')); + } + + $categories = explode(',', $table->category_id); + $categories = array_filter(ArrayHelper::toInteger($categories)); + + foreach ($categories as $category) + { + $products = productHelper::getInstance()->getProductCategory($category); + + if (empty($products)) + { + continue; + } + + foreach ($products as $product) + { + $productIds[] = $product->product_id; + } + } + + $manufacturers = explode(',', $table->manufacturer_id); + $manufacturers = array_filter(ArrayHelper::toInteger($manufacturers)); + + foreach ($manufacturers as $manufacturer) + { + $products = $this->getProductsFromManufacturer($manufacturer); + + if (empty($products)) + { + continue; + } + + foreach ($products as $product) + { + $productIds[] = $product->product_id; + } + } + } + + if (!empty($productIds)) + { + $this->updateProduct($productIds); + } + + return parent::doDelete($pk); + } + + /** + * Checks that the object is valid and able to be stored. + * + * This method checks that the parent_id is non-zero and exists in the database. + * Note that the root node (parent_id = 0) cannot be manipulated with this class. + * + * @return boolean True if all checks pass + * @throws Exception + */ + protected function doCheck() + { + if (!parent::doCheck()) + { + return false; + } + + if (empty($this->name)) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_MASS_DISCOUNT_MISSING_DISCOUNT_NAME'), 'error'); + + return false; + } + + if (empty($this->amount)) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_MASS_DISCOUNT_DISCOUNT_AMOUNT_MUST_BE_LARGER_THAN_ZERO'), 'error'); + + return false; + } + + if (is_null($this->type)) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_MASS_DISCOUNT_DISCOUNT_TYPE_IS_REQUIRED'), 'error'); + + return false; + } + + if (empty($this->discount_product) && empty($this->category_id) && empty($this->manufacturer_id)) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_MASS_DISCOUNT_DETAIL_NO_PRODUCTS_SELECTED'), 'error'); + + return false; + } + + if ($this->start_date > $this->end_date) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_MASS_DISCOUNT_ENDDATE_LOWER_STARTDATE'), 'error'); + + return false; + } + + return true; + } + + /** + * Called before store(). Overriden to send isNew to plugins. + * + * @param boolean $updateNulls True to update null values as well. + * @param boolean $isNew True if we are adding a new item. + * @param mixed $oldItem null for new items | JTable otherwise + * + * @return boolean True on success. + * @throws Exception + */ + protected function beforeStore($updateNulls = false, $isNew = false, $oldItem = null) + { + if (!parent::beforeStore($updateNulls, $isNew, $oldItem)) + { + return false; + } + + $db = $this->_db; + $query = $db->getQuery(true); + $productHelper = productHelper::getInstance(); + + $this->updateProductsBaseDiscountProduct($this, $isNew, $oldItem); + + /* + * Update products for "category_id" + */ + $categories = $isNew ? array() : explode(',', $oldItem->category_id); + $newCategories = explode(',', $this->category_id); + $isChangeCategory = false; + $isNewChangeCategory = false; + + $diffCategories = array_diff($categories, $newCategories); + + if (count($diffCategories)) + { + sort($diffCategories); + } + else + { + $isChangeCategory = true; + } + + $diffCategories = array_filter(array_values($diffCategories)); + + foreach ($diffCategories as $diffCategory) + { + $products = $productHelper->getProductCategory($diffCategory); + $productIds = array(); + + foreach ($products as $product) + { + $productIds[] = $product->product_id; + } + + if (empty($productIds)) + { + continue; + } + + $query->clear() + ->update($db->qn('#__redshop_product')) + ->set($db->qn('product_on_sale') . ' = 0') + ->where($db->qn('product_id') . ' IN (' . implode(',', $productIds) . ')'); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + } + + $newDiffCategories = array_diff($newCategories, $categories); + + if (count($newDiffCategories)) + { + sort($newDiffCategories); + } + else + { + $isNewChangeCategory = true; + } + + if ($isChangeCategory && $isNewChangeCategory) + { + $newDiffCategories = $categories; + } + + foreach ($newDiffCategories as $newDiffCategory) + { + $products = $productHelper->getProductCategory($newDiffCategory); + + foreach ($products as $product) + { + $productData = Redshop::product((int) $product->product_id); + + if ($this->type == 1) + { + $price = $productData->product_price - ($productData->product_price * $this->amount / 100); + } + else + { + $price = $productData->product_price - $this->amount; + } + + $price = $productHelper->productPriceRound($price); + + $query->clear() + ->update($db->qn('#__redshop_product')) + ->set($db->qn('product_on_sale') . ' = 1') + ->set($db->qn('discount_price') . ' = ' . $price) + ->set($db->qn('discount_stratdate') . ' = ' . $this->start_date) + ->set($db->qn('discount_enddate') . ' = ' . $this->end_date) + ->where($db->qn('product_id') . ' = ' . $product->product_id); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + } + } + + /* + * Update products for "manufacturer_id" + */ + $isChangeManufacturer = false; + $isNewChangeManufacturer = false; + $manufacturers = $isNew ? array() : explode(',', $oldItem->manufacturer_id); + $newManufacturers = explode(',', $this->manufacturer_id); + + $diffManufacturers = array_diff($manufacturers, $newManufacturers); + + if (count($diffManufacturers)) + { + sort($diffManufacturers); + } + else + { + $isChangeManufacturer = true; + } + + $diffManufacturers = array_filter(array_values($diffManufacturers)); + + if (!empty($diffManufacturers)) + { + $query->clear() + ->update($db->qn('#__redshop_product')) + ->set($db->qn('product_on_sale') . ' = 0') + ->where($db->qn('manufacturer_id') . ' IN (' . implode(',', $diffManufacturers) . ')'); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + } + + $newDiffManufacturers = array_diff($newManufacturers, $manufacturers); + + if (count($newDiffManufacturers)) + { + sort($newDiffManufacturers); + } + else + { + $isNewChangeManufacturer = true; + } + + if ($isNewChangeManufacturer && $isChangeManufacturer) + { + $newDiffManufacturers = $manufacturers; + } + + $newDiffManufacturers = array_filter(array_values($newDiffManufacturers)); + + if (!empty($newDiffManufacturers)) + { + $query->clear() + ->select($db->qn('product_id')) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('manufacturer_id') . ' IN (' . implode(',', $newDiffManufacturers) . ')'); + $productIds = $db->setQuery($query)->loadColumn(); + + foreach ($productIds as $productId) + { + $productData = Redshop::product((int) $productId); + + if ($this->type == 1) + { + $price = $productData->product_price - ($productData->product_price * $this->amount / 100); + } + else + { + $price = $productData->product_price - $this->amount; + } + + $price = $productHelper->productPriceRound($price); + + $query->clear() + ->update($db->qn('#__redshop_product')) + ->set($db->qn('product_on_sale') . ' = 1') + ->set($db->qn('discount_price') . ' = ' . $price) + ->set($db->qn('discount_stratdate') . ' = ' . $this->start_date) + ->set($db->qn('discount_enddate') . ' = ' . $this->end_date) + ->where($db->qn('product_id') . ' = ' . $productData->product_id); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + } + } + + return true; + } + + /** + * Update Product On Sale status + * + * @param array $productIds List of products. + * + * @return boolean + */ + public function updateProduct($productIds) + { + if (empty($productIds)) + { + return true; + } + + if (!is_array($productIds)) + { + $productIds = explode(',', $productIds); + } + + $productIds = ArrayHelper::toInteger($productIds); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_product')) + ->set($db->qn('product_on_sale') . ' = 0') + ->set($db->qn('discount_stratdate') . ' = 0') + ->set($db->qn('discount_enddate') . ' = 0') + ->set($db->qn('discount_price') . ' = 0') + ->where($db->qn('product_id') . ' IN (' . implode(',', $productIds) . ')'); + + return $db->setQuery($query)->execute(); + } + + /** + * Method for get product of manufacturer. + * + * @param int $id ID of manufacturer + * + * @return mixed + * + * @since 2.0.3 + */ + public function getProductsFromManufacturer($id) + { + if (!$id) + { + return array(); + } + + $db = $this->_db; + + $query = $db->getQuery(true) + ->select($db->qn('product_id')) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('manufacturer_id') . ' = ' . (int) $id); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Method for update product base on "discount_product" + * + * @param self $data New data + * @param boolean $isNew Is new or not. + * @param mixed $oldItem Old data + * + * @return boolean + * @throws Exception + * + * @since 2.0.3 + */ + protected function updateProductsBaseDiscountProduct($data, $isNew = false, $oldItem = null) + { + $db = $this->_db; + $query = $db->getQuery(true); + $isChangeProduct = false; + $isNewChangeProduct = false; + $productHelper = productHelper::getInstance(); + + $discountProducts = $isNew ? array() : explode(',', $oldItem->discount_product); + $newDiscountProducts = explode(',', $this->discount_product); + + $diffProducts = array_filter(array_diff($discountProducts, $newDiscountProducts)); + + if (count($diffProducts)) + { + sort($diffProducts); + } + else + { + $isChangeProduct = true; + } + + if (!empty($diffProducts)) + { + $query->clear() + ->update($db->qn('#__redshop_product')) + ->set($db->qn('product_on_sale') . ' = 0') + ->where($db->qn('product_id') . ' IN (' . implode(',', $diffProducts) . ')'); + + if (!$db->setQuery($query)->execute()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + } + + $newDiffProducts = array_diff($newDiscountProducts, $discountProducts); + + if (count($newDiffProducts)) + { + sort($newDiffProducts); + } + else + { + $isNewChangeProduct = true; + } + + if ($isChangeProduct && $isNewChangeProduct) + { + $newDiffProducts = $discountProducts; + } + + $newDiffProducts = array_filter(array_values($newDiffProducts)); + + if (empty($newDiffProducts)) + { + return true; + } + + foreach ($newDiffProducts as $newDiffProduct) + { + try + { + $productData = Redshop::product($newDiffProduct); + + // Ticket ONKELP-161: Temporary comment these code to by pass product_on_sale check before apply another mass discount + if ($this->type == 1) + { + $price = $productData->product_price - ($productData->product_price * $this->amount / 100); + } + else + { + $price = $productData->product_price - $this->amount; + } + + $price = $productHelper->productPriceRound($price); + $query->clear(); + + // Update fields + $update = array( + $db->qn('product_on_sale') . ' = 1', + $db->qn('discount_price') . ' = ' . (float) $price, + $db->qn('discount_stratdate') . ' = ' . (int) $this->start_date, + $db->qn('discount_enddate') . ' = ' . (int) $this->end_date + ); + + // By condition + $conditions = array ( + $db->qn('product_id') . ' = ' . (int) $newDiffProduct + ); + $query->update($db->qn('#__redshop_product'))->set($update)->where($conditions); + $db->setQuery($query); + + if (!$db->execute()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + catch (Exception $e) + { + JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); + } + } + + return true; + } +} diff --git a/component/admin/tables/media.php b/component/admin/tables/media.php new file mode 100644 index 00000000000..89664bcd89b --- /dev/null +++ b/component/admin/tables/media.php @@ -0,0 +1,115 @@ +media_section == 'images' + && ($this->media_section == 'manufacturer' || $this->media_section == 'category')) + { + // New folder structure + $folder = JPath::clean(REDSHOP_MEDIA_IMAGE_RELPATH . $this->media_section . '/' . $this->section_id . '/thumb'); + + if (JFolder::exists($folder)) + { + JFolder::delete($folder); + } + + $file = JPath::clean(REDSHOP_MEDIA_IMAGE_RELPATH . $this->media_section . '/' . $this->section_id . '/' . $this->media_name); + + if (JFile::exists($file)) + { + JFile::delete($file); + } + } + + return parent::doDelete($pk); + } +} diff --git a/component/admin/tables/media_detail.php b/component/admin/tables/media_detail.php new file mode 100644 index 00000000000..138d771b3a1 --- /dev/null +++ b/component/admin/tables/media_detail.php @@ -0,0 +1,50 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'media', 'media_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/media_download.php b/component/admin/tables/media_download.php new file mode 100644 index 00000000000..7ecc5317b0e --- /dev/null +++ b/component/admin/tables/media_download.php @@ -0,0 +1,38 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'media_download', 'id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/newsletter_detail.php b/component/admin/tables/newsletter_detail.php new file mode 100644 index 00000000000..0468e5042d0 --- /dev/null +++ b/component/admin/tables/newsletter_detail.php @@ -0,0 +1,44 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'newsletter', 'newsletter_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/newslettersubscr_detail.php b/component/admin/tables/newslettersubscr_detail.php new file mode 100644 index 00000000000..69a12f5ffcd --- /dev/null +++ b/component/admin/tables/newslettersubscr_detail.php @@ -0,0 +1,98 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'newsletter_subscription', 'subscription_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } + + /** + * Method to store a row in the database from the JTable instance properties. + * + * If a primary key value is set the row with that primary key value will be updated with the instance property values. + * If no primary key value is set a new row will be inserted into the database with the properties from the JTable instance. + * + * @param boolean $updateNulls True to update fields even if they are null. + * + * @return boolean True on success. + * + * @since 11.1 + */ + public function store($updateNulls = false) + { + $isNew = empty($this->subscription_id) ? true : false; + + if (!parent::store($updateNulls)) + { + return false; + } + + JPluginHelper::importPlugin('redshop_user'); + RedshopHelperUtility::getDispatcher()->trigger('addNewsLetterSubscription', array($isNew, $this->getProperties())); + + return true; + } + + /** + * Method to delete a row from the database table by primary key value. + * + * @param mixed $pk An optional primary key value to delete. If not set the instance property value is used. + * + * @return boolean True on success. + * + * @since 11.1 + * @throws UnexpectedValueException + */ + public function delete($pk = null) + { + $data = $this->getProperties(); + + if (!parent::delete($pk)) + { + return false; + } + + JPluginHelper::importPlugin('redshop_user'); + RedshopHelperUtility::getDispatcher()->trigger('removeNewsLetterSubscription', array($data)); + + return true; + } +} diff --git a/component/admin/tables/notifystock_user.php b/component/admin/tables/notifystock_user.php new file mode 100644 index 00000000000..79840e6d663 --- /dev/null +++ b/component/admin/tables/notifystock_user.php @@ -0,0 +1,43 @@ +_table_prefix = '#__redshop_'; + parent::__construct($this->_table_prefix . 'notifystock_users', 'id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/order_acc_item.php b/component/admin/tables/order_acc_item.php new file mode 100644 index 00000000000..e0d3f268efc --- /dev/null +++ b/component/admin/tables/order_acc_item.php @@ -0,0 +1,54 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'order_acc_item', 'order_item_acc_id', $db); + } + + function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/order_attribute_item.php b/component/admin/tables/order_attribute_item.php new file mode 100644 index 00000000000..beca556ff4e --- /dev/null +++ b/component/admin/tables/order_attribute_item.php @@ -0,0 +1,56 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'order_attribute_item', 'order_att_item_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/order_detail.php b/component/admin/tables/order_detail.php new file mode 100644 index 00000000000..5850e52b50b --- /dev/null +++ b/component/admin/tables/order_detail.php @@ -0,0 +1,129 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'orders', 'order_id', $db); + } + + /** + * Validate all table fields before saving + * + * @return boolean + * + * @since 2.0.0.4 + */ + public function check() + { + if (empty($this->order_status) || $this->order_status === 0) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_TABLE_ORDER_REDSHOP_INVALID_ORDER_STATUS'), 'warning'); + + return false; + } + + return parent::check(); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/order_item_detail.php b/component/admin/tables/order_item_detail.php new file mode 100644 index 00000000000..efd661101fb --- /dev/null +++ b/component/admin/tables/order_item_detail.php @@ -0,0 +1,92 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'order_item', 'order_item_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/order_payment.php b/component/admin/tables/order_payment.php new file mode 100644 index 00000000000..3671a8180a8 --- /dev/null +++ b/component/admin/tables/order_payment.php @@ -0,0 +1,58 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'order_payment', 'payment_order_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/order_status.php b/component/admin/tables/order_status.php new file mode 100644 index 00000000000..8b9ea3cab98 --- /dev/null +++ b/component/admin/tables/order_status.php @@ -0,0 +1,132 @@ +order_status_name)) + { + return false; + } + + if (empty($this->order_status_code)) + { + return false; + } + + if (!parent::doCheck()) + { + return false; + } + + // Check status code. + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('COUNT(' . $db->qn('order_status_code') . ') AS ' . $db->qn('count')) + ->from($db->qn('#__' . $this->_tableName)) + ->where($db->qn('order_status_code') . ' = ' . $db->quote($this->order_status_code)); + + if ($this->order_status_id) + { + $query->where($db->qn('order_status_id') . ' != ' . $this->order_status_id); + } + + if ($db->setQuery($query)->loadResult()) + { + $this->setError(JText::_('COM_REDSHOP_ORDER_STATUS_ERROR_STATUS_EXIST')); + + return false; + } + + return true; + } + + /** + * Delete one or more registers + * + * @param string/array $pk Array of ids or ids comma separated + * + * @return boolean Deleted successfuly? + */ + protected function doDelete($pk = null) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select($db->qn(['s.order_status_id', 's.order_status_code'])) + ->from($db->qn('#__redshop_order_status', 's')) + ->innerJoin($db->qn('#__redshop_orders', 'o') . ' ON ' . $db->qn('s.order_status_code') . ' = ' . $db->qn('o.order_status')) + ->where($db->qn('order_status_id') . ' = ' . $db->q($pk)); + $db->setQuery($query); + + $check = $db->loadObjectList(); + + if (count($check) > 0) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_ORDER_STAUS_FAIL_DELETE'), 'error'); + + return false; + } + + return parent::doDelete($pk); + } +} diff --git a/component/admin/tables/order_status_log.php b/component/admin/tables/order_status_log.php new file mode 100644 index 00000000000..12d55970a99 --- /dev/null +++ b/component/admin/tables/order_status_log.php @@ -0,0 +1,44 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'order_status_log', 'order_status_log_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/order_user_detail.php b/component/admin/tables/order_user_detail.php new file mode 100644 index 00000000000..01b3da80cd2 --- /dev/null +++ b/component/admin/tables/order_user_detail.php @@ -0,0 +1,82 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'order_users_info', 'order_info_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/page_viewer.php b/component/admin/tables/page_viewer.php new file mode 100644 index 00000000000..e73efee3c6e --- /dev/null +++ b/component/admin/tables/page_viewer.php @@ -0,0 +1,34 @@ +_table_prefix = '#__redshop_'; + parent::__construct($this->_table_prefix . 'product_price', 'price_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } + + public function check() + { + // Check for valid name + + $query = 'SELECT price_id FROM ' . $this->_table_prefix . 'product_price WHERE shopper_group_id = "' + . $this->shopper_group_id . '" AND product_id = ' . (int) $this->product_id + . ' AND price_quantity_start <= ' . $this->_db->quote($this->price_quantity_start) + . ' AND price_quantity_end >= ' . $this->_db->quote($this->price_quantity_start) . ''; + + $this->_db->setQuery($query); + $xid = intval($this->_db->loadResult()); + + $query_end = 'SELECT price_id FROM ' . $this->_table_prefix . 'product_price WHERE shopper_group_id = "' + . $this->shopper_group_id . '" AND product_id = ' . (int) $this->product_id + . ' AND price_quantity_start <= ' . $this->_db->quote($this->price_quantity_end) + . ' AND price_quantity_end >= ' . $this->_db->quote($this->price_quantity_end) . ''; + + $this->_db->setQuery($query_end); + $xid_end = intval($this->_db->loadResult()); + + if (($xid || $xid_end) && (($xid != intval($this->price_id) && $xid != 0) || ($xid_end != intval($this->price_id) && $xid_end != 0))) + { + $this->_error = JText::sprintf('WARNNAMETRYAGAIN', JText::_('COM_REDSHOP_PRICE_ALREADY_EXISTS')); + + return false; + } + + return true; + } +} diff --git a/component/admin/tables/product_attribute.php b/component/admin/tables/product_attribute.php new file mode 100755 index 00000000000..eb4d3a91406 --- /dev/null +++ b/component/admin/tables/product_attribute.php @@ -0,0 +1,56 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_attribute', 'attribute_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/product_attribute_price_detail.php b/component/admin/tables/product_attribute_price_detail.php new file mode 100644 index 00000000000..fd1545f7bee --- /dev/null +++ b/component/admin/tables/product_attribute_price_detail.php @@ -0,0 +1,56 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_attribute_price', 'price_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/product_compare.php b/component/admin/tables/product_compare.php new file mode 100644 index 00000000000..4470e8b32a2 --- /dev/null +++ b/component/admin/tables/product_compare.php @@ -0,0 +1,38 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_compare', 'compare_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/product_detail.php b/component/admin/tables/product_detail.php new file mode 100644 index 00000000000..16260e8574f --- /dev/null +++ b/component/admin/tables/product_detail.php @@ -0,0 +1,227 @@ +getQuery(true) + ->select('product_id') + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_number') . ' = ' . $db->q($this->product_number)); + + // Set the query and load the result. + $db->setQuery($query); + + $duplicateProductId = intval($db->loadResult()); + + // Make sure we are not checking it's own product number + if ($duplicateProductId && $duplicateProductId != intval($this->product_id)) + { + $this->setError(JText::_('COM_REDSHOP_PRODUCT_NUMBER_ALREADY_EXISTS')); + + return false; + } + + return true; + } +} diff --git a/component/admin/tables/product_discount_calc.php b/component/admin/tables/product_discount_calc.php new file mode 100644 index 00000000000..33090c03b2d --- /dev/null +++ b/component/admin/tables/product_discount_calc.php @@ -0,0 +1,85 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_discount_calc', 'id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } + + /** + * Check for the product ID + * + * @return boolean + */ + public function check() + { + $unit = \Redshop\Helper\Utility::getUnitConversation("m", $this->discount_calc_unit); + + $convertedAreaStart = $this->area_start * $unit * $unit; + $convertedAreaEnd = $this->area_end * $unit * $unit; + + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_product_discount_calc')) + ->where($db->qn('product_id') . ' = ' . (int) $this->product_id) + ->where( + '(' + . $convertedAreaStart . ' BETWEEN ' . $db->qn('area_start_converted') . ' AND ' . $db->qn('area_end_converted') + . ' || ' . $convertedAreaEnd . ' BETWEEN ' . $db->qn('area_start_converted') . ' AND ' . $db->qn('area_end_converted') + . ')' + ); + + $xid = $db->setQuery($query)->loadResult(); + + if ($xid) + { + $this->_error = JText::_('COM_REDSHOP_SAME_RANGE'); + + return false; + } + + return true; + } +} diff --git a/component/admin/tables/product_discount_calc_extra.php b/component/admin/tables/product_discount_calc_extra.php new file mode 100644 index 00000000000..408b9d4e8be --- /dev/null +++ b/component/admin/tables/product_discount_calc_extra.php @@ -0,0 +1,42 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_discount_calc_extra', 'pdcextra_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/product_download.php b/component/admin/tables/product_download.php new file mode 100644 index 00000000000..49e413cb2d5 --- /dev/null +++ b/component/admin/tables/product_download.php @@ -0,0 +1,48 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_download', '', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/product_serial_number.php b/component/admin/tables/product_serial_number.php new file mode 100644 index 00000000000..5383bbcd329 --- /dev/null +++ b/component/admin/tables/product_serial_number.php @@ -0,0 +1,40 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_serial_number', 'serial_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/product_subscribe_detail.php b/component/admin/tables/product_subscribe_detail.php new file mode 100644 index 00000000000..3dc3393da38 --- /dev/null +++ b/component/admin/tables/product_subscribe_detail.php @@ -0,0 +1,48 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_subscribe_detail', 'product_subscribe_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/product_subscription.php b/component/admin/tables/product_subscription.php new file mode 100644 index 00000000000..85f3c9b0426 --- /dev/null +++ b/component/admin/tables/product_subscription.php @@ -0,0 +1,42 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_subscription', 'subscription_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/product_subscription_renewal.php b/component/admin/tables/product_subscription_renewal.php new file mode 100644 index 00000000000..93070a79c58 --- /dev/null +++ b/component/admin/tables/product_subscription_renewal.php @@ -0,0 +1,38 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'subscription_renewal', 'renewal_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/product_tags.php b/component/admin/tables/product_tags.php new file mode 100644 index 00000000000..54536b0a23b --- /dev/null +++ b/component/admin/tables/product_tags.php @@ -0,0 +1,40 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_tags', 'tags_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/question.php b/component/admin/tables/question.php new file mode 100644 index 00000000000..c6002c95e36 --- /dev/null +++ b/component/admin/tables/question.php @@ -0,0 +1,50 @@ +question_date) || empty($this->question_date)) + { + $this->question_date = time(); + } + + return true; + } +} diff --git a/component/admin/tables/quotation_accessory_item.php b/component/admin/tables/quotation_accessory_item.php new file mode 100644 index 00000000000..c08dd44c8b6 --- /dev/null +++ b/component/admin/tables/quotation_accessory_item.php @@ -0,0 +1,54 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'quotation_accessory_item', 'quotation_item_acc_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/quotation_attribute_item.php b/component/admin/tables/quotation_attribute_item.php new file mode 100644 index 00000000000..afbeced6e0a --- /dev/null +++ b/component/admin/tables/quotation_attribute_item.php @@ -0,0 +1,52 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'quotation_attribute_item', 'quotation_att_item_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/quotation_detail.php b/component/admin/tables/quotation_detail.php new file mode 100644 index 00000000000..94b2bd233ce --- /dev/null +++ b/component/admin/tables/quotation_detail.php @@ -0,0 +1,68 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'quotation', 'quotation_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/quotation_item_detail.php b/component/admin/tables/quotation_item_detail.php new file mode 100644 index 00000000000..6f1af3c0b0b --- /dev/null +++ b/component/admin/tables/quotation_item_detail.php @@ -0,0 +1,61 @@ +_table_prefix = '#__redshop_'; + parent::__construct($this->_table_prefix . 'quotation_item', 'quotation_item_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/rating_detail.php b/component/admin/tables/rating_detail.php new file mode 100644 index 00000000000..e8f9a5bb8df --- /dev/null +++ b/component/admin/tables/rating_detail.php @@ -0,0 +1,37 @@ +loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/related_product.php b/component/admin/tables/related_product.php new file mode 100644 index 00000000000..e36e0e06fd2 --- /dev/null +++ b/component/admin/tables/related_product.php @@ -0,0 +1,36 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_related', 'related_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/sample_detail.php b/component/admin/tables/sample_detail.php new file mode 100644 index 00000000000..818826d873e --- /dev/null +++ b/component/admin/tables/sample_detail.php @@ -0,0 +1,38 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'catalog_sample', 'sample_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/sample_request.php b/component/admin/tables/sample_request.php new file mode 100644 index 00000000000..86b80df3933 --- /dev/null +++ b/component/admin/tables/sample_request.php @@ -0,0 +1,44 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'sample_request', 'request_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/shipping_box.php b/component/admin/tables/shipping_box.php new file mode 100644 index 00000000000..7d3c8d0db1e --- /dev/null +++ b/component/admin/tables/shipping_box.php @@ -0,0 +1,107 @@ +shipping_box_length = floatval($this->shipping_box_length); + $this->shipping_box_width = floatval($this->shipping_box_width); + $this->shipping_box_height = floatval($this->shipping_box_height); + + if ($this->shipping_box_length <= 0.0) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_SHIPPING_BOX_ERROR_LENGTH_INVALID')); + + return false; + } + + if ($this->shipping_box_width <= 0.0) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_SHIPPING_BOX_ERROR_WIDTH_INVALID')); + + return false; + } + + if ($this->shipping_box_height <= 0.0) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('COM_REDSHOP_SHIPPING_BOX_ERROR_HEIGHT_INVALID')); + + return false; + } + + return parent::doCheck(); + } +} diff --git a/component/admin/tables/shipping_detail.php b/component/admin/tables/shipping_detail.php new file mode 100644 index 00000000000..7df83de60be --- /dev/null +++ b/component/admin/tables/shipping_detail.php @@ -0,0 +1,50 @@ +_table_prefix = '#__extensions'; + + parent::__construct($this->_table_prefix, 'extension_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/shipping_rate_detail.php b/component/admin/tables/shipping_rate_detail.php new file mode 100644 index 00000000000..c2f1c3b3954 --- /dev/null +++ b/component/admin/tables/shipping_rate_detail.php @@ -0,0 +1,96 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'shipping_rate', 'shipping_rate_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/shopper_group_detail.php b/component/admin/tables/shopper_group_detail.php new file mode 100644 index 00000000000..b32dca26d58 --- /dev/null +++ b/component/admin/tables/shopper_group_detail.php @@ -0,0 +1,76 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'shopper_group', 'shopper_group_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/site_viewer.php b/component/admin/tables/site_viewer.php new file mode 100644 index 00000000000..f773fafab01 --- /dev/null +++ b/component/admin/tables/site_viewer.php @@ -0,0 +1,34 @@ +country_id)) + { + return false; + } + + if (empty($this->state_name)) + { + return false; + } + + if (empty($this->state_3_code)) + { + return false; + } + + if (empty($this->state_2_code)) + { + return false; + } + + if (!parent::doCheck()) + { + return false; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true); + $query->select([$db->qn('id'), $db->qn('state_3_code')]) + ->from($db->qn('#__redshop_state')) + ->where( + $db->qn('state_3_code') . ' = ' . $db->q($this->state_3_code) + . ' AND ' . $db->qn('id') . ' != ' . $db->q($this->id) + . ' AND ' . $db->qn('country_id') . ' = ' . $db->q($this->country_id) + ); + + $db->setQuery($query); + + $xid = intval($db->loadResult()); + + if ($xid) + { + $this->_error = JText::_('COM_REDSHOP_STATE_CODE3_ALREADY_EXISTS'); + JError::raiseWarning('', $this->_error); + + return false; + } + else + { + $query = $db->getQuery(true); + + $query->select([$db->qn('id'), $db->qn('state_3_code'), $db->qn('state_2_code')]) + ->from($db->qn('#__redshop_state')) + ->where( + $db->qn('state_2_code') . ' = ' . $db->q($this->state_2_code) + . ' AND ' . $db->qn('id') . ' != ' . $db->q($this->id) + . ' AND ' . $db->qn('country_id') . ' = ' . $db->q($this->country_id) + ); + + $db->setQuery($query); + $xid = intval($db->loadResult()); + + if ($xid) + { + $this->_error = JText::_('COM_REDSHOP_STATE_CODE2_ALREADY_EXISTS'); + JError::raiseWarning('', $this->_error); + + return false; + } + } + + return true; + } +} diff --git a/component/admin/tables/stockimage_detail.php b/component/admin/tables/stockimage_detail.php new file mode 100644 index 00000000000..f3eea020802 --- /dev/null +++ b/component/admin/tables/stockimage_detail.php @@ -0,0 +1,43 @@ +_table_prefix = '#__redshop_'; + parent::__construct($this->_table_prefix . 'stockroom_amount_image', 'stock_amount_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/stockroom_detail.php b/component/admin/tables/stockroom_detail.php new file mode 100644 index 00000000000..86afe88ad3a --- /dev/null +++ b/component/admin/tables/stockroom_detail.php @@ -0,0 +1,52 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'stockroom', 'stockroom_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/subattribute_property.php b/component/admin/tables/subattribute_property.php new file mode 100755 index 00000000000..4367e268335 --- /dev/null +++ b/component/admin/tables/subattribute_property.php @@ -0,0 +1,58 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_subattribute_color', 'subattribute_color_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/supplier.php b/component/admin/tables/supplier.php new file mode 100644 index 00000000000..437f0df1e77 --- /dev/null +++ b/component/admin/tables/supplier.php @@ -0,0 +1,45 @@ +name)) + { + return false; + } + + return parent::doCheck(); + } +} diff --git a/component/admin/tables/tax_group.php b/component/admin/tables/tax_group.php new file mode 100644 index 00000000000..7d01b511c30 --- /dev/null +++ b/component/admin/tables/tax_group.php @@ -0,0 +1,65 @@ +id)->getTaxRates()->count() > 0) + { + $this->setError(JText::sprintf('COM_REDSHOP_TAX_GROUP_ERROR_DELETE_HAVE_TAX_RATE', $this->name)); + + return false; + } + + return parent::doDelete($pk); + } + + /** + * Checks that the object is valid and able to be stored. + * + * This method checks that the parent_id is non-zero and exists in the database. + * Note that the root node (parent_id = 0) cannot be manipulated with this class. + * + * @return boolean True if all checks pass. + */ + protected function doCheck() + { + if (empty($this->name)) + { + return false; + } + + return parent::doCheck(); + } +} diff --git a/component/admin/tables/tax_rate.php b/component/admin/tables/tax_rate.php new file mode 100644 index 00000000000..494066f1bed --- /dev/null +++ b/component/admin/tables/tax_rate.php @@ -0,0 +1,62 @@ +name)) + { + return false; + } + + if (empty($this->tax_group_id)) + { + return false; + } + + if (!parent::doCheck()) + { + return false; + } + + if ($this->tax_rate < 0) + { + $this->setError(JText::_('COM_REDSHOP_TAX_RATE_INVALID_INPUT_MSG')); + + return false; + } + + return true; + } +} diff --git a/component/admin/tables/template.php b/component/admin/tables/template.php new file mode 100644 index 00000000000..18958797d57 --- /dev/null +++ b/component/admin/tables/template.php @@ -0,0 +1,254 @@ +id && !empty($this->file_name)) + { + $file = JPath::clean(JPATH_REDSHOP_TEMPLATE . '/' . $this->section . '/' . $this->file_name . '.php'); + + if (JFile::exists($file)) + { + $this->templateDesc = (string) file_get_contents($file); + } + } + + return true; + } + + /** + * Method to bind an associative array or object to the JTable instance.This + * method only binds properties that are publicly accessible and optionally + * takes an array of properties to ignore when binding. + * + * @param mixed $src An associative array or object to bind to the JTable instance. + * @param mixed $ignore An optional array or space separated list of properties to ignore while binding. + * + * @return boolean True on success. + * + * @throws InvalidArgumentException + */ + protected function doBind(&$src, $ignore = array()) + { + if (!empty($src['order_status']) && !is_array($src['order_status'])) + { + $src['order_status'] = explode(',', $src['order_status']); + } + else + { + unset($src['order_status']); + $this->order_status = ''; + } + + if (!empty($src['payment_methods']) && !is_array($src['payment_methods'])) + { + $src['payment_methods'] = explode(',', $src['payment_methods']); + } + else + { + unset($src['payment_methods']); + $this->payment_methods = ''; + } + + if (!empty($src['shipping_methods']) && !is_array($src['shipping_methods'])) + { + $src['shipping_methods'] = explode(',', $src['shipping_methods']); + } + else + { + unset($src['shipping_methods']); + $this->shipping_methods = ''; + } + + return parent::doBind($src, $ignore); + } + + /** + * Do the database store. + * + * @param boolean $updateNulls True to update null values as well. + * + * @return boolean + * + * @throws Exception + */ + protected function doStore($updateNulls = false) + { + if (!empty($this->payment_methods) && is_array($this->payment_methods)) + { + $this->payment_methods = implode(',', $this->payment_methods); + } + + if (!empty($this->shipping_methods) && is_array($this->shipping_methods)) + { + $this->shipping_methods = implode(',', $this->shipping_methods); + } + + if (!empty($this->order_status) && is_array($this->order_status)) + { + $this->order_status = implode(',', $this->order_status); + } + + $isNew = !$this->id; + + $this->setOption('content', $this->templateDesc); + unset($this->templateDesc); + + if (!parent::doStore($updateNulls)) + { + return false; + } + + if ($isNew || empty($this->file_name)) + { + $fileName = $this->generateTemplateFileName($this->id, $this->name); + + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_template')) + ->where($db->qn('id') . ' = ' . $this->id) + ->set($db->qn('file_name') . ' = ' . $db->quote($fileName)); + $db->setQuery($query)->execute(); + } + else + { + $fileName = $this->file_name; + } + + // Write template file + JFile::write( + JPath::clean(JPATH_REDSHOP_TEMPLATE . '/' . $this->section . '/' . $fileName . '.php'), + $this->getOption('content', '') + ); + + return true; + } + + /** + * Delete one or more registers + * + * @param string /array $pk Array of ids or ids comma separated + * + * @return boolean Deleted successfully? + */ + protected function doDelete($pk = null) + { + if (!parent::doDelete($pk)) + { + return false; + } + + $templatePath = JPath::clean(JPATH_REDSHOP_TEMPLATE . '/' . $this->section . '/' . $this->file_name . '.php'); + + if (JFile::exists($templatePath)) + { + return JFile::delete($templatePath); + } + + return true; + } + + /** + * Method for make template name safe + * + * @param integer $id Template ID + * @param string $name Template name + * + * @return string + * + * @since 2.0.7 + */ + public function generateTemplateFileName($id = 0, $name = '') + { + return str_replace('-', '_', JFilterOutput::stringURLSafe($id . ' - ' . strtolower($name))); + } + + /** + * Checks that the object is valid and able to be stored. + * + * This method checks that the parent_id is non-zero and exists in the database. + * Note that the root node (parent_id = 0) cannot be manipulated with this class. + * + * @return boolean True if all checks pass. + */ + protected function doCheck() + { + if (empty($this->name)) + { + return false; + } + + if (empty($this->section)) + { + return false; + } + + return parent::doCheck(); + } +} diff --git a/component/admin/tables/text.php b/component/admin/tables/text.php new file mode 100644 index 00000000000..7b8086cc14b --- /dev/null +++ b/component/admin/tables/text.php @@ -0,0 +1,68 @@ +name)) + { + return false; + } + + return parent::doCheck(); + } +} diff --git a/component/admin/tables/transaction_coupon_detail.php b/component/admin/tables/transaction_coupon_detail.php new file mode 100644 index 00000000000..0c2eda0369f --- /dev/null +++ b/component/admin/tables/transaction_coupon_detail.php @@ -0,0 +1,46 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'coupons_transaction', 'transaction_coupon_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/transaction_voucher_detail.php b/component/admin/tables/transaction_voucher_detail.php new file mode 100644 index 00000000000..9d9633b167b --- /dev/null +++ b/component/admin/tables/transaction_voucher_detail.php @@ -0,0 +1,50 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'product_voucher_transaction', 'transaction_voucher_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/user_detail.php b/component/admin/tables/user_detail.php new file mode 100644 index 00000000000..6952d28ae9e --- /dev/null +++ b/component/admin/tables/user_detail.php @@ -0,0 +1,80 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'users_info', 'users_info_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/usercart.php b/component/admin/tables/usercart.php new file mode 100644 index 00000000000..3e67da4032a --- /dev/null +++ b/component/admin/tables/usercart.php @@ -0,0 +1,54 @@ +getDbo(); + + // Check duplicate. + $code = $this->get('code'); + + $voucherQuery = $db->getQuery(true) + ->select($db->qn('code')) + ->from($db->qn('#__redshop_voucher')); + + if ($this->hasPrimaryKey()) + { + $voucherQuery->where($db->qn('id') . ' <> ' . $this->id); + } + + $couponQuery = $db->getQuery(true) + ->select($db->qn('code')) + ->from($db->qn('#__redshop_coupons')); + $couponQuery->union($voucherQuery); + + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from('(' . $couponQuery . ') AS ' . $db->qn('data')) + ->where($db->qn('data.code') . ' = ' . $db->quote($code)); + + if ($db->setQuery($query)->loadResult()) + { + $this->setError(JText::_('COM_REDSHOP_VOUCHER_ERROR_CODE_ALREADY_EXIST')); + + return false; + } + + return true; + } + + /** + * Method to bind an associative array or object to the JTable instance.This + * method only binds properties that are publicly accessible and optionally + * takes an array of properties to ignore when binding. + * + * @param mixed $src An associative array or object to bind to the JTable instance. + * @param mixed $ignore An optional array or space separated list of properties to ignore while binding. + * + * @return boolean True on success. + * + * @throws Exception + */ + protected function doBind(&$src, $ignore = array()) + { + if (isset($src['voucher_products']) && !empty($src['voucher_products'])) + { + $products = is_string($src['voucher_products']) ? explode(',', $src['voucher_products']) : $src['voucher_products']; + $this->setOption('products', $products); + unset($src['shopper_group']); + } + + return parent::doBind($src, $ignore); + } + + /** + * Do the database store. + * + * @param boolean $updateNulls True to update null values as well. + * + * @return boolean + */ + protected function doStore($updateNulls = false) + { + if (!parent::doStore($updateNulls)) + { + return false; + } + + if ($this->getOption('skip.updateProducts', false) === true || $this->getOption('inlineMode', false) === true) + { + return true; + } + + return $this->updateProduct(); + } + + /** + * Method for update product xref. + * + * @return boolean + */ + protected function updateProduct() + { + $db = $this->getDbo(); + + // Clear current reference products. + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_product_voucher_xref')) + ->where($db->qn('voucher_id') . ' = ' . $this->id); + $db->setQuery($query)->execute(); + + $products = $this->getOption('products', null); + + if (empty(array_filter($products))) + { + return true; + } + + $query->clear() + ->insert($db->qn('#__redshop_product_voucher_xref')) + ->columns($db->qn(array('voucher_id', 'product_id'))); + + foreach ($products as $productId) + { + $query->values((int) $this->id . ',' . (int) $productId); + } + + return $db->setQuery($query)->execute(); + } +} diff --git a/component/admin/tables/wishlist.php b/component/admin/tables/wishlist.php new file mode 100644 index 00000000000..32e30f3750c --- /dev/null +++ b/component/admin/tables/wishlist.php @@ -0,0 +1,42 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'wishlist', 'wishlist_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/wishlist_product.php b/component/admin/tables/wishlist_product.php new file mode 100644 index 00000000000..77dad61c9f5 --- /dev/null +++ b/component/admin/tables/wishlist_product.php @@ -0,0 +1,34 @@ +_table_prefix = '#__redshop_'; + parent::__construct($this->_table_prefix . 'wrapper', 'wrapper_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/xmlexport_detail.php b/component/admin/tables/xmlexport_detail.php new file mode 100644 index 00000000000..5155608226d --- /dev/null +++ b/component/admin/tables/xmlexport_detail.php @@ -0,0 +1,80 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'xml_export', 'xmlexport_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/xmlimport_detail.php b/component/admin/tables/xmlimport_detail.php new file mode 100644 index 00000000000..121346bc0bc --- /dev/null +++ b/component/admin/tables/xmlimport_detail.php @@ -0,0 +1,80 @@ +_table_prefix = '#__redshop_'; + + parent::__construct($this->_table_prefix . 'xml_import', 'xmlimport_id', $db); + } + + public function bind($array, $ignore = '') + { + if (array_key_exists('params', $array) && is_array($array['params'])) + { + $registry = new JRegistry; + $registry->loadArray($array['params']); + $array['params'] = $registry->toString(); + } + + return parent::bind($array, $ignore); + } +} diff --git a/component/admin/tables/zipcode.php b/component/admin/tables/zipcode.php new file mode 100644 index 00000000000..ff7245f906f --- /dev/null +++ b/component/admin/tables/zipcode.php @@ -0,0 +1,70 @@ +getQuery(true) + ->select('id') + ->from($db->qn("#__redshop_zipcode")) + ->where($db->qn('zipcode') . ' = ' . $db->q((int) $this->zipcode)) + ->where($db->qn('id') . ' != ' . $db->q((int) $this->id)) + ->where($db->qn('country_code') . ' = ' . $db->q((string) $this->country_code)); + + $xid = intval($db->setQuery($query)->loadResult()); + + if ($xid) + { + return false; + } + + return parent::doCheck(); + } +} diff --git a/component/admin/updates/1.3.3.1.php b/component/admin/updates/1.3.3.1.php new file mode 100644 index 00000000000..fa9fbd54951 --- /dev/null +++ b/component/admin/updates/1.3.3.1.php @@ -0,0 +1,63 @@ +getQuery(true) + ->select($db->qn('extension_id')) + ->from($db->qn('#__extensions')) + ->where($db->qn('element') . ' = ' . $db->quote('com_redshop')) + ->where($db->qn('type') . ' = ' . $db->quote('component')); + $componentId = $db->setQuery($query)->loadResult(); + + // Skip if there are no redshop install + if (!$componentId) + { + return; + } + + $query->clear() + ->select($db->qn('version_id')) + ->from($db->qn('#__schemas')) + ->where($db->qn('extension_id') . ' = ' . $componentId); + $result = $db->setQuery($query)->loadResult(); + + // Skip if there are already schema + if ($result) + { + return; + } + + $query->clear() + ->insert($db->qn('#__schemas')) + ->columns($db->qn(array('extension_id', 'version_id'))) + ->values($componentId . ',' . $db->quote('1.1.10')); + + $db->setQuery($query)->execute(); + } +} diff --git a/component/admin/updates/1.6.0.php b/component/admin/updates/1.6.0.php new file mode 100644 index 00000000000..02478d5f119 --- /dev/null +++ b/component/admin/updates/1.6.0.php @@ -0,0 +1,105 @@ +getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_media')) + ->where($db->qn('media_section') . ' = ' . $db->quote('manufacturer')) + ->order($db->qn('section_id')); + + $medias = $db->setQuery($query)->loadObjectList(); + + if (empty($medias)) + { + return; + } + + $newBasePath = REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer'; + $oldBasePath = REDSHOP_FRONT_IMAGES_RELPATH . 'manufacturer'; + + foreach ($medias as $media) + { + /** @var RedshopTableMedia $table */ + $table = RedshopTable::getAdminInstance('Media', array('ignore_request' => true), 'com_redshop'); + + $table->bind((array) $media); + + // In case this media don't have media file. Delete this. + if (empty($table->media_name)) + { + $table->delete(); + + continue; + } + + // Prepare target folder. + $path = $newBasePath . '/' . $table->section_id; + + if (!JFolder::exists($path)) + { + JFolder::create($path); + } + + // Copy index.html to this folder. + if (!JFile::exists($path . '/index.html')) + { + JFile::copy(REDSHOP_MEDIA_IMAGE_RELPATH . 'index.html', $path . '/index.html'); + } + + // Check old image exist. + $oldImagePath = $oldBasePath . '/' . $table->media_name; + + if (!JFile::exists($oldImagePath)) + { + continue; + } + + // Generate new image using MD5 + $newFileName = md5(basename($table->media_name)) . '.' . JFile::getExt($table->media_name); + + if (!JFile::copy($oldImagePath, $path . '/' . $newFileName)) + { + continue; + } + + // Update media data with new file name. + $table->media_name = $newFileName; + $table->store(); + } + + // Remove old folders + JFolder::delete($oldBasePath); + } +} diff --git a/component/admin/updates/2.0.14.php b/component/admin/updates/2.0.14.php new file mode 100644 index 00000000000..5543cb248b6 --- /dev/null +++ b/component/admin/updates/2.0.14.php @@ -0,0 +1,142 @@ +getQuery(true) + ->select($db->qn(array('id', 'name', 'category_full_image', 'category_back_full_image'))) + ->from($db->qn('#__redshop_category')) + ->where( + '(' + . $db->qn('category_full_image') . ' IS NOT NULL OR ' . $db->qn('category_full_image') . ' <> ' . $db->quote('') + . ') OR (' + . $db->qn('category_back_full_image') . ' IS NOT NULL OR ' . $db->qn('category_back_full_image') . ' <> ' . $db->quote('') + . ')' + ) + ->order($db->qn('lft')); + + $medias = $db->setQuery($query)->loadObjectList(); + + if (empty($medias)) + { + return; + } + + $newBasePath = REDSHOP_MEDIA_IMAGE_RELPATH . 'category'; + $oldBasePath = REDSHOP_FRONT_IMAGES_RELPATH . 'category'; + + foreach ($medias as $media) + { + // Prepare target folder. + $path = $newBasePath . '/' . $media->id; + + if (!JFolder::exists($path)) + { + JFolder::create($path); + } + + // Copy index.html to this folder. + if (!JFile::exists($path . '/index.html')) + { + JFile::copy(REDSHOP_MEDIA_IMAGE_RELPATH . 'index.html', $path . '/index.html'); + } + + if (!empty($media->category_full_image)) + { + $this->storeMedia($media, $media->category_full_image, 'full', $oldBasePath, $newBasePath); + } + + if (!empty($media->category_full_image)) + { + $this->storeMedia($media, $media->category_back_full_image, 'back', $oldBasePath, $newBasePath); + } + } + + // Remove old folders + JFolder::delete($oldBasePath); + } + + /** + * Method for store media + * + * @param object $category Category data + * @param string $fileName File name + * @param string $scope Scope of media. + * @param string $oldBasePath Scope of media. + * @param string $newBasePath Scope of media. + * + * @return void + * + * @since 2.0.14 + */ + private function storeMedia($category, $fileName, $scope, $oldBasePath, $newBasePath) + { + /** @var RedshopTableMedia $table */ + $table = RedshopTable::getAdminInstance('Media', array('ignore_request' => true), 'com_redshop'); + + // Generate new image using MD5 + $newFileName = md5(basename($fileName)) . '.' . JFile::getExt($fileName); + + if (!$table->load( + array( + 'media_name' => $fileName, + 'media_section' => 'category', + 'section_id' => $category->id, + 'media_type' => 'images' + ) + )) + { + $table->section_id = $category->id; + $table->media_section = 'category'; + $table->media_type = 'images'; + } + + $table->media_alternate_text = $category->name; + $table->published = 1; + $table->ordering = 0; + $table->scope = $scope; + + // Check old image exist. + $oldImagePath = $oldBasePath . '/' . $fileName; + + if (!JFile::exists($oldImagePath)) + { + return; + } + + if (!JFile::copy($oldImagePath, $newBasePath . '/' . $category->id . '/' . $newFileName)) + { + return; + } + + // Update media data with new file name. + $table->media_name = $newFileName; + $table->store(); + } +} diff --git a/component/admin/updates/2.0.15.php b/component/admin/updates/2.0.15.php new file mode 100644 index 00000000000..4b1f2e1a154 --- /dev/null +++ b/component/admin/updates/2.0.15.php @@ -0,0 +1,51 @@ + $value) + { + if (JFolder::exists($codeDir . 'administrator/components')) + { + $templates[$codeDir . 'administrator/components'] = JFolder::folders($codeDir . 'administrator/components'); + } + + if (JFolder::exists($codeDir . 'administrator')) + { + $templates[$codeDir . 'administrator'] = JFolder::folders($codeDir . 'administrator'); + } + + if (JFolder::exists($codeDir . 'components')) + { + $templates[$codeDir . 'components'] = JFolder::folders($codeDir . 'components'); + } + + if (JFolder::exists($codeDir)) + { + $templates[$codeDir] = JFolder::folders($codeDir); + } + + if (JFolder::exists($codeDir . 'com_redshop/helpers')) + { + $adminHelpers[$codeDir . 'com_redshop/helpers'] = JFolder::files($codeDir . 'com_redshop/helpers'); + } + } + } + + foreach ($files as $key => $value) + { + if (!JFile::exists($dir . $value)) + { + $templates[$dir . $value] = JFolder::folders($dir . $value); + } + } + + $override = array(); + $jsOverride = array(); + + self::getOverrideFromTemplates($templates, $override, $jsOverride, $adminTemplateHelpers); + + $overrideFiles = self::getOverrideFiles($override); + + $app = JFactory::getApplication(); + $data = Redshop::getConfig()->toArray(); + $temp = $app->getUserState('com_redshop.config.global.data'); + + if (!empty($temp)) + { + $data = array_merge($data, $temp); + } + + $data['BACKWARD_COMPATIBLE_PHP'] = 0; + $data['BACKWARD_COMPATIBLE_JS'] = 0; + $config = Redshop::getConfig(); + + if (!empty($overrideFiles)) + { + self::replaceCode($overrideFiles); + + // Check site used MVC && Templates Override + $data['BACKWARD_COMPATIBLE_PHP'] = 1; + } + + if (!empty($jsOverride)) + { + // Check site used JS Override + $data['BACKWARD_COMPATIBLE_JS'] = 1; + } + + $app->setUserState('com_redshop.config.global.data', $data); + $data = new Registry($data); + $config->save($data); + + self::moveAdminHelper($adminHelpers, $codeDir); + self::moveAdminTemplateHelper($adminTemplateHelpers); + } + + /** + * Method for get override files + * + * @param array $override Override + * + * @return array + * + * @since 2.0.3 + */ + private static function getOverrideFiles($override) + { + if (empty($override)) + { + return array(); + } + + $overrideFolders = array(); + $overrideLayoutFolders = array(); + $overrideLayoutFiles = array(); + $overrideFiles = array(); + + foreach ($override as $key => $value) + { + foreach ($value as $name) + { + if ($name === 'layouts') + { + $overrideLayoutFolders[$key . '/' . $name] = JFolder::folders($key . '/' . $name); + } + elseif (!JFile::exists($key . '/' . $name) && ($name === 'com_redshop' || strpos($name, 'mod_redshop') !== false)) + { + // Read all files and folders in parent folder + $overrideFolders[$key . '/' . $name] = array_diff(scandir($key . '/' . $name), array('.', '..')); + } + } + } + + foreach ($overrideFolders as $key => $value) + { + foreach ($value as $name) + { + $target = !JFile::exists($key . '/' . $name) ? $key . '/' . $name : $key; + $overrideFiles[$target] = JFolder::files($target); + } + } + + foreach ($overrideLayoutFolders as $key => $value) + { + foreach ($value as $name) + { + if ($name !== 'com_redshop' || JFile::exists($key . '/' . $name)) + { + continue; + } + + $overrideLayoutFiles[$key . '/' . $name] = JFolder::files($key . '/' . $name); + } + } + + if (!empty($overrideLayoutFiles)) + { + foreach ($overrideLayoutFiles as $key => $value) + { + foreach ($value as $name) + { + if (JFile::exists($key . '/' . $name)) + { + continue; + } + + $overrideFiles[$key . '/' . $name] = JFolder::files($key . '/' . $name); + } + } + } + + return $overrideFiles; + } + + /** + * Method for replace helper override. + * + * @param array $overrideFiles Override Files + * + * @return void + * @since 2.0.3 + */ + private static function replaceCode($overrideFiles) + { + if (empty($overrideFiles)) + { + return; + } + + $replaceString = array( + 'new quotationHelper()' => 'quotationHelper::getInstance()', + 'new order_functions()' => 'order_functions::getInstance()', + 'new Redconfiguration()' => 'Redconfiguration::getInstance()', + 'new Redconfiguration' => 'Redconfiguration::getInstance()', + 'new Redtemplate()' => 'Redtemplate::getInstance()', + 'new Redtemplate' => 'Redtemplate::getInstance()', + 'new extra_field()' => 'extra_field::getInstance()', + 'new rsstockroomhelper()' => 'rsstockroomhelper::getInstance()', + 'new rsstockroomhelper' => 'rsstockroomhelper::getInstance()', + 'new shipping()' => 'shipping::getInstance()', + 'new CurrencyHelper()' => 'CurrencyHelper::getInstance()', + 'new economic()' => 'economic::getInstance()', + 'new rsUserhelper()' => 'rsUserHelper::getInstance()', + 'new rsUserhelper' => 'rsUserHelper::getInstance()', + 'GoogleAnalytics' => 'RedshopHelperGoogleanalytics', + 'new quotationHelper' => 'quotationHelper::getInstance()', + 'new order_functions' => 'order_functions::getInstance()', + 'new extra_field' => 'extra_field::getInstance()', + 'new shipping' => 'shipping::getInstance()', + 'new CurrencyHelper' => 'CurrencyHelper::getInstance()', + 'new economic' => 'economic::getInstance()', + 'RedshopConfig::scriptDeclaration();' => '', + '$redConfiguration' => '$Redconfiguration', + 'require_once JPATH_SITE . \'/components/com_redshop/helpers/redshop.js.php\'' => '', + ); + + foreach ($overrideFiles as $path => $files) + { + foreach ($files as $file) + { + $content = file_get_contents($path . '/' . $file); + + foreach ($replaceString as $old => $new) + { + if (strpos($content, $old) === false) + { + continue; + } + + $content = str_replace($old, $new, $content); + JFile::write($path . '/' . $file, $content); + } + } + } + } + + /** + * Method for replace helper override. + * + * @param array $adminHelpers Admin helpers + * @param string $codeDir Code directory + * + * @return void + * @since 2.0.3 + */ + private static function moveAdminHelper($adminHelpers, $codeDir) + { + if (empty($adminHelpers)) + { + return; + } + + $replaceAdminHelper = array( + 'adminorder.php' => 'order_functions.php', + 'admincategory.php' => 'product_category.php', + 'adminquotation.php' => 'quotationhelper.php', + 'adminaccess_level.php' => 'redaccesslevel.php', + 'adminconfiguration.php' => 'redconfiguration.php', + 'adminmedia.php' => 'redmediahelper.php', + 'adminimages.php' => 'redshophelperimages.php', + 'adminmail.php' => 'redshopmail.php', + 'adminupdate.php' => 'redshopupdate.php', + 'admintemplate.php' => 'redtemplate.php', + 'adminstockroom.php' => 'rsstockroom.php', + 'adminshopper.php' => 'shoppergroup.php' + ); + + $replaceSiteHelper = array( + 'currency.php' => 'currencyhelper.php', + 'extra_field.php' => 'extrafield.php', + 'google_analytics.php' => 'googleanalytics.php', + 'product.php' => 'producthelper.php', + 'helper.php' => 'redhelper.php', + 'cart.php' => 'rscarthelper.php', + 'user.php' => 'rsuserhelper.php' + ); + + foreach ($adminHelpers as $path => $files) + { + foreach ($replaceAdminHelper as $old => $new) + { + if (!JFile::exists($path . '/' . $old)) + { + continue; + } + + if (!JFolder::exists($codeDir . 'administrator/components/com_redshop/helpers')) + { + JFolder::create($codeDir . 'administrator/components/com_redshop/helpers'); + } + + JFile::move($codeDir . 'com_redshop/helpers/' . $old, $codeDir . 'administrator/components/com_redshop/helpers/' . $new); + } + + foreach ($replaceSiteHelper as $old => $new) + { + if (!JFile::exists($path . '/' . $old)) + { + continue; + } + + if (!JFolder::exists($codeDir . 'components/com_redshop/helpers')) + { + JFolder::create($codeDir . 'components/com_redshop/helpers'); + } + + JFile::move($codeDir . 'com_redshop/helpers/' . $old, $codeDir . 'components/com_redshop/helpers/' . $new); + } + } + } + + /** + * Method for replace helper override. + * + * @param array $adminTemplateHelpers Admin template helpers + * + * @return void + * @since 2.0.3 + */ + private static function moveAdminTemplateHelper($adminTemplateHelpers) + { + if (empty($adminTemplateHelpers)) + { + return; + } + + $replaceAdminHelper = array( + 'adminorder.php' => 'order_functions.php', + 'admincategory.php' => 'product_category.php', + 'adminquotation.php' => 'quotationhelper.php', + 'adminaccess_level.php' => 'redaccesslevel.php', + 'adminconfiguration.php' => 'redconfiguration.php', + 'adminmedia.php' => 'redmediahelper.php', + 'adminimages.php' => 'redshophelperimages.php', + 'adminmail.php' => 'redshopmail.php', + 'adminupdate.php' => 'redshopupdate.php', + 'admintemplate.php' => 'redtemplate.php', + 'adminstockroom.php' => 'rsstockroom.php', + 'adminshopper.php' => 'shoppergroup.php' + ); + + $replaceSiteHelper = array( + 'currency.php' => 'currencyhelper.php', + 'extra_field.php' => 'extrafield.php', + 'google_analytics.php' => 'googleanalytics.php', + 'product.php' => 'producthelper.php', + 'helper.php' => 'redhelper.php', + 'cart.php' => 'rscarthelper.php', + 'user.php' => 'rsuserhelper.php' + ); + + foreach ($adminTemplateHelpers as $path => $files) + { + foreach ($replaceAdminHelper as $old => $new) + { + if (!JFile::exists($path . '/code/com_redshop/helpers/' . $old)) + { + continue; + } + + if (!JFolder::exists($path . '/code/administrator/components/com_redshop/helpers')) + { + JFolder::create($path . '/code/administrator/components/com_redshop/helpers'); + } + + JFile::move($path . '/code/com_redshop/helpers/' . $old, $path . '/code/administrator/components/com_redshop/helpers/' . $new); + } + + foreach ($replaceSiteHelper as $old => $new) + { + if (!JFile::exists($path . '/code/com_redshop/helpers/' . $old)) + { + continue; + } + + if (!JFolder::exists($path . '/code/components/com_redshop/helpers')) + { + JFolder::create($path . '/code/components/com_redshop/helpers'); + } + + JFile::move($path . '/code/com_redshop/helpers/' . $old, $path . '/code/components/com_redshop/helpers/' . $new); + } + } + } + + /** + * Get override template from templates. + * + * @param array $templates Templates + * @param array $override Overrides + * @param array $jsOverride Javascript overrides + * @param array $adminTemplateHelpers Admin template overrides. + * + * + * @return void + * @since 2.0.3 + */ + private static function getOverrideFromTemplates($templates, &$override, &$jsOverride, &$adminTemplateHelpers) + { + if (empty($templates)) + { + return; + } + + foreach ($templates as $key => $value) + { + foreach ($value as $name) + { + if (JFile::exists($key . '/' . $name)) + { + continue; + } + + if (JFolder::exists($key . '/com_redshop')) + { + $override[$key . '/com_redshop'] = JFolder::folders($key . '/com_redshop'); + } + + if (JFolder::exists($key . '/html')) + { + $override[$key . '/html'] = JFolder::folders($key . '/html'); + } + + if (JFolder::exists($key . '/js/com_redshop')) + { + $jsOverride[$key . '/js/com_redshop'] = JFolder::files($key . '/js/com_redshop'); + } + + if (JFolder::exists($key . '/code/com_redshop')) + { + $override[$key . '/code/com_redshop'] = JFolder::folders($key . '/code/com_redshop'); + } + + if (JFolder::exists($key . '/code/components/com_redshop')) + { + $override[$key . '/code/components/com_redshop'] = JFolder::folders($key . '/code/components/com_redshop'); + } + + if (JFolder::exists($key . '/code/com_redshop/helpers')) + { + $adminTemplateHelpers[$key] = JFolder::files($key . '/code/com_redshop/helpers'); + } + } + } + } +} diff --git a/component/admin/updates/2.0.4.php b/component/admin/updates/2.0.4.php new file mode 100644 index 00000000000..d0f7b664e82 --- /dev/null +++ b/component/admin/updates/2.0.4.php @@ -0,0 +1,164 @@ +qn('product_full_image') . ' = REPLACE(' . $db->qn('product_full_image') . ", '%20', '-')", + $db->qn('product_full_image') . ' = REPLACE(' . $db->qn('product_full_image') . ", ' ', '-')", + $db->qn('product_thumb_image') . ' = REPLACE(' . $db->qn('product_thumb_image') . ", '%20', '-')", + $db->qn('product_thumb_image') . ' = REPLACE(' . $db->qn('product_thumb_image') . ", ' ', '-')" + ); + + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_product')) + ->set($fields); + $db->setQuery($query)->execute(); + + /** Update Image Name */ + $files = JFolder::files(JPATH_SITE . '/components/com_redshop/assets/images/product/'); + $this->changeImageFileName($files, $path); + + $files = JFolder::files(JPATH_SITE . '/components/com_redshop/assets/images/product/thumb/'); + $this->changeImageFileName($files, $path); + } + + /** + * Method for update menu item id if necessary. + * + * @return void + * + * @since 2.0.4 + */ + public function updateMenuItem() + { + $db = JFactory::getDbo(); + + // For Blank component id in menu table-admin menu error solution - Get redSHOP extension id from the table + $query = $db->getQuery(true) + ->select('extension_id') + ->from($db->qn('#__extensions')) + ->where($db->qn('name') . ' LIKE ' . $db->quote('%redshop')) + ->where($db->qn('element') . ' = ' . $db->quote('com_redshop')) + ->where($db->qn('type') . ' = ' . $db->quote('component')); + + $extensionId = $db->setQuery($query)->loadResult(); + + // Check for component menu item entry + $query->clear() + ->select('id,component_id') + ->from($db->qn('#__menu')) + ->where($db->qn('menutype') . ' = ' . $db->quote('main')) + ->where($db->qn('path') . ' LIKE ' . $db->quote('%redshop')) + ->where($db->qn('type') . ' = ' . $db->quote('component')); + + $menuItem = $db->setQuery($query)->loadObject(); + + // If component Entry found and component_id is same as extension id - no need to update menu item + $isUpdate = ($menuItem && $menuItem->component_id == $extensionId) ? false : true; + + if (!$isUpdate) + { + return; + } + + $query->clear() + ->update($db->qn('#__menu')) + ->set($db->qn('component_id') . ' = ' . (int) $extensionId) + ->where($db->qn('menutype') . ' = ' . $db->quote('main')) + ->where($db->qn('path') . ' LIKE ' . $db->quote('%redshop')) + ->where($db->qn('type') . ' = ' . $db->quote('component')); + + // Set the query and execute the update. + $db->setQuery($query)->execute(); + } +} diff --git a/component/admin/updates/2.0.6.php b/component/admin/updates/2.0.6.php new file mode 100644 index 00000000000..a1662f5124d --- /dev/null +++ b/component/admin/updates/2.0.6.php @@ -0,0 +1,164 @@ +name = 'ROOT'; + $root->parent_id = 0; + $root->level = 0; + $root->lft = 0; + $root->rgt = 1; + $root->published = 1; + $db->insertObject('#__redshop_category', $root); + + $rootId = $db->insertid(); + + $query = $db->getQuery(true) + ->select('c.*') + ->select($db->qn('cx.category_parent_id', 'parent_id')) + ->from($db->qn('#__redshop_category', 'c')) + ->leftJoin($db->qn('#__redshop_category_xref', 'cx') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('cx.category_child_id')); + $categories = $db->setQuery($query)->loadObjectList(); + + foreach ($categories as $key => $category) + { + if ($category->name == 'ROOT') + { + continue; + } + + $parentId = ($category->parent_id == 0) ? $rootId : $category->parent_id; + $alias = JFilterOutput::stringUrlUnicodeSlug($category->name); + + $fields = array( + $db->qn('parent_id') . ' = ' . $db->q((int) $parentId), + $db->qn('alias') . ' = ' . $db->q($alias) + ); + + $conditions = array( + $db->qn('id') . ' = ' . $db->q((int) $category->id) + ); + + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_category')) + ->set($fields) + ->where($conditions); + + $db->setQuery($query)->execute(); + } + + if ($this->processRebuildCategory($rootId)) + { + $this->processDeleteCategoryXrefTable(); + } + } + + /** + * Method to update new structure for Category + * + * @param int $rootId Root ID + * + * @return mixed + * + * @since 2.0.6 + */ + protected function processRebuildCategory($rootId) + { + /** @var RedshopTableCategory $table */ + $table = RedshopTable::getInstance('Category', 'RedshopTable'); + + return $table->rebuild($rootId); + } + + /** + * Method to update new structure for Category + * + * @return mixed + * + * @since 2.0.6 + */ + protected function processDeleteCategoryXrefTable() + { + $db = JFactory::getDbo(); + + return $db->setQuery('DROP TABLE IF EXISTS ' . $db->qn('#__redshop_category_xref')) + ->execute(); + } +} diff --git a/component/admin/updates/2.0.7.php b/component/admin/updates/2.0.7.php new file mode 100644 index 00000000000..4bee460afc6 --- /dev/null +++ b/component/admin/updates/2.0.7.php @@ -0,0 +1,139 @@ +setQuery("SHOW TABLES LIKE " . $db->quote('#__redshop_product_voucher'))->loadResult(); + + if (empty($result)) + { + return; + } + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_product_voucher')) + ->order($db->qn('voucher_id')); + + $vouchers = $db->setQuery($query)->loadObjectList(); + + if (empty($vouchers)) + { + $this->dropOldTable(); + + return; + } + + $table = RedshopTable::getAdminInstance('Voucher'); + $table->setOption('skip.checkPrimary', true); + $table->setOption('skip.updateProducts', true); + + foreach ($vouchers as $voucher) + { + $data = (array) $voucher; + + $data['id'] = $data['voucher_id']; + $data['code'] = $data['voucher_code']; + $data['type'] = $data['voucher_type']; + $data['free_ship'] = $data['free_shipping']; + $data['start_date'] = !$data['start_date'] ? '0000-00-00 00:00:00' : JFactory::getDate($data['start_date'])->format('Y-m-d H:i:s'); + $data['end_date'] = !$data['end_date'] ? '0000-00-00 00:00:00' : JFactory::getDate($data['end_date'])->format('Y-m-d H:i:s'); + + unset($data['voucher_id']); + unset($data['voucher_code']); + unset($data['voucher_type']); + unset($data['free_shipping']); + + if (!$table->save($data)) + { + JFactory::getApplication()->enqueueMessage($table->getError(), 'error'); + } + } + + $this->dropOldTable(); + } + + /** + * Method for drop old `#__redshop_product_voucher` table. + * + * @return void + * + * @since 2.0.7 + */ + protected function dropOldTable() + { + $db = JFactory::getDbo(); + + $db->setQuery('DROP TABLE IF EXISTS ' . $db->qn('#__redshop_product_voucher'))->execute(); + } +} diff --git a/component/admin/updates/2.0.9.php b/component/admin/updates/2.0.9.php new file mode 100644 index 00000000000..209cfb79eec --- /dev/null +++ b/component/admin/updates/2.0.9.php @@ -0,0 +1,320 @@ +getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_template')) + ->order($db->qn('section')); + + $templates = $db->setQuery($query)->loadObjectList(); + + if (empty($templates)) + { + return; + } + + $templates = $this->migrateOldTemplate($templates); + + if (empty($templates)) + { + return; + } + + $this->migrateOverrideTemplate($templates); + } + + /** + * Template View selector + * + * @param array $templates Templates + * + * @return array List of template table which already migrate correct data. + * + * @since 2.0.9 + */ + protected function migrateOldTemplate($templates = array()) + { + $oldPaths = array(); + $tables = array(); + + // Copy old template files to new structure. + foreach ($templates as $template) + { + /** @var RedshopTableTemplate $table */ + $table = RedshopTable::getAdminInstance('Template', array('ignore_request' => true), 'com_redshop'); + $table->bind((array) $template); + + // Skip if template already migrate + if (!empty($template->file_name)) + { + $tables[] = $table; + + continue; + } + + $table->file_name = $table->generateTemplateFileName($table->id, $table->name); + + if (!$table->store()) + { + continue; + } + + $view = $this->getTemplateView($template->section); + $oldPaths[] = JPath::clean(JPATH_SITE . '/components/com_redshop/views/' . $view . '/tmpl/' . $template->section); + $sourceFile = JPATH_SITE . '/components/com_redshop/views/' . $view . '/tmpl/' . $template->section . '/' . $template->name . '.php'; + $sourceFile = JPath::clean($sourceFile); + + if (!JFile::exists($sourceFile)) + { + $sourceFile = JPath::clean(JPATH_REDSHOP_TEMPLATE . '/' . $table->section . '/default.php'); + } + + $targetFile = JPath::clean(JPATH_REDSHOP_TEMPLATE . '/' . $table->section . '/' . $table->file_name . '.php'); + + if (JFile::exists($sourceFile)) + { + if (JFile::exists($targetFile)) + { + JFile::delete($targetFile); + } + + JFile::copy($sourceFile, $targetFile); + } + + $tables[] = $table; + } + + // Delete old folders. + $oldPaths = array_unique($oldPaths); + + foreach ($oldPaths as $path) + { + if (JFolder::exists($path)) + { + JFolder::delete($path); + } + } + + return $tables; + } + + /** + * Template View selector + * + * @param array $templates Templates + * + * @return void + * @throws Exception + * + * @since 2.0.9 + */ + protected function migrateOverrideTemplate($templates = array()) + { + $joomlaTemplate = $this->getActiveSiteTemplate(); + + foreach ($templates as $template) + { + /** @var RedshopTableTemplate $template */ + $view = $this->getTemplateView($template->section); + $overrideFile = JPATH_SITE . '/templates/' . $joomlaTemplate . '/html/com_redshop/'; + + if ($template->section != 'categoryproduct') + { + $overrideFile .= $view . '/' . $template->section . '/' . $template->name . '.php'; + } + else + { + $overrideFile .= $template->section . '/' . $template->name . '.php'; + } + + $overrideFile = JPath::clean($overrideFile); + + if (!JFile::exists($overrideFile)) + { + continue; + } + + $target = JPath::clean(JPATH_REDSHOP_TEMPLATE . '/' . $template->section . '/' . $template->file_name . '.php'); + + if (JFile::exists($target)) + { + JFile::delete($target); + } + + JFile::move($overrideFile, $target); + } + } + + /** + * Template View selector + * + * @param string $section Template section + * + * @return string Template Joomla view name + * + * @since 2.0.9 + */ + protected function getTemplateView($section) + { + $section = strtolower($section); + + switch ($section) + { + case 'product': + case 'related_product': + case 'product_sample': + case 'accessory_template': + case 'attribute_template': + case 'attributewithcart_template': + case 'review': + case 'wrapper_template': + case 'compare_product': + $view = "product"; + break; + + case 'categoryproduct': + case 'category': + case 'frontpage_category': + $view = "category"; + break; + + case 'catalog': + case 'catalog_sample': + $view = "catalog"; + break; + + case 'manufacturer': + case 'manufacturer_detail': + case 'manufacturer_products': + + $view = "manufacturers"; + break; + case 'cart': + case 'add_to_cart': + case 'ajax_cart_detail_box': + case 'ajax_cart_box': + case 'empty_cart': + $view = "cart"; + break; + + case 'account_template': + $view = "account"; + break; + + case 'private_billing_template': + case 'company_billing_template': + case 'billing_template': + case 'shipping_template': + $view = "registration"; + break; + + case 'wishlist_template': + case 'wishlist_mail_template': + $view = "wishlist"; + break; + + case 'newsletter': + case 'newsletter_product': + $view = "newsletter"; + break; + + case 'order_list': + case 'order_detail': + case 'order_receipt': + $view = "orders"; + break; + + case 'giftcard': + $view = "giftcard"; + break; + + case 'checkout': + case 'onestep_checkout': + $view = "checkout"; + break; + + case 'ask_question_template': + $view = "ask_question"; + break; + + default: + return ''; + } + + return $view; + } + + /** + * Method for get "default" template use on Front-end + * + * @return string + * + * @since 2.0.9 + */ + protected function getActiveSiteTemplate() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('template')) + ->from($db->qn('#__template_styles')) + ->where($db->qn('client_id') . ' = 0') + ->where($db->qn('home') . ' = 1'); + + return $db->setQuery($query)->loadResult(); + } +} diff --git a/component/admin/updates/2.1.0.php b/component/admin/updates/2.1.0.php new file mode 100644 index 00000000000..f9c6ed15ec7 --- /dev/null +++ b/component/admin/updates/2.1.0.php @@ -0,0 +1,134 @@ +getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_coupons')) + ->order($db->qn('id')); + + $coupons = $db->setQuery($query)->loadObjectList(); + + if (empty($coupons)) + { + return; + } + + $nullDate = $db->getNullDate(); + + foreach ($coupons as $coupon) + { + /** @var RedshopTableCoupon $table */ + $table = RedshopTable::getAdminInstance('Coupon'); + + if (!$table->load($coupon->id)) + { + continue; + } + + $needUpdate = false; + + if ($table->start_date == $nullDate && !empty($coupon->start_date_old)) + { + $table->start_date = JFactory::getDate($coupon->start_date_old)->toSql(); + $needUpdate = true; + } + + if ($table->end_date == $nullDate && !empty($coupon->end_date_old)) + { + $table->end_date = JFactory::getDate($coupon->end_date_old)->toSql(); + $needUpdate = true; + } + + if (!$needUpdate) + { + continue; + } + + if (!$table->store()) + { + JFactory::getApplication()->enqueueMessage($table->getError(), 'error'); + } + } + + $query = 'CALL redSHOP_Column_Remove(' . $db->quote('#__redshop_coupons') . ',' . $db->quote('start_date_old') . ');'; + $db->setQuery($query)->execute(); + $query = 'CALL redSHOP_Column_Remove(' . $db->quote('#__redshop_coupons') . ',' . $db->quote('end_date_old') . ');'; + $db->setQuery($query)->execute(); + } +} diff --git a/component/admin/updates/2.1.1.php b/component/admin/updates/2.1.1.php new file mode 100644 index 00000000000..dfa10c4f12d --- /dev/null +++ b/component/admin/updates/2.1.1.php @@ -0,0 +1,53 @@ +toArray(); + + $temp = $app->getUserState('com_redshop.config.global.data'); + + if (!empty($temp)) + { + $currentConfig = array_merge($currentConfig, $temp); + } + + if ($currentConfig['DEFAULT_DATEFORMAT'] === '0') + { + $currentConfig['DEFAULT_DATEFORMAT'] = 'Y-m-d'; + } + + $config = Redshop::getConfig(); + $app->setUserState('com_redshop.config.global.data', $currentConfig); + $data = new Registry($currentConfig); + $config->save($data); + } +} diff --git a/component/admin/updates/index.html b/component/admin/updates/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/updates/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/views/access/index.html b/component/admin/views/access/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/access/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/access/tmpl/default.php b/component/admin/views/access/tmpl/default.php new file mode 100644 index 00000000000..ec0e920f422 --- /dev/null +++ b/component/admin/views/access/tmpl/default.php @@ -0,0 +1,55 @@ + +
    +

    +

    +
    +
    + form->getInput('rules') ?> + + + form->getInput('title') ?> + form->getInput('id') ?> + +
    + \ No newline at end of file diff --git a/component/admin/views/access/tmpl/index.html b/component/admin/views/access/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/access/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/access/view.html.php b/component/admin/views/access/view.html.php new file mode 100644 index 00000000000..caaa21bd1cc --- /dev/null +++ b/component/admin/views/access/view.html.php @@ -0,0 +1,78 @@ +getModel(); + + $this->item = $model->getItem(); + $this->form = $model->getForm(); + $this->state = $model->getState(); + + $this->addToolBar(); + + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 2.0.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + + // Prepare text for title + JToolBarHelper::title(JText::_('COM_REDSHOP_ACCESS_MANAGER')); + JToolBarHelper::apply('access.save'); + } +} diff --git a/component/admin/views/accountgroup/index.html b/component/admin/views/accountgroup/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/accountgroup/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/accountgroup/tmpl/default.php b/component/admin/views/accountgroup/tmpl/default.php new file mode 100644 index 00000000000..a30ec6bd546 --- /dev/null +++ b/component/admin/views/accountgroup/tmpl/default.php @@ -0,0 +1,93 @@ + + + +
    + + + + + + + + + + + + + + + + + + detail); $i < $n; $i++) + { + $row = $this->detail[$i]; + $row->id = $row->accountgroup_id; + $link = JRoute::_('index.php?option=com_redshop&view=accountgroup_detail&task=edit&cid[]=' . $row->id); + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); ?> + "> + + + + + + + + + + + + + + + + + +
    + + lists['order_Dir'], $this->lists['order']);?>lists['order_Dir'], $this->lists['order']);?>lists['order_Dir'], $this->lists['order']);?>lists['order_Dir'], $this->lists['order']);?>lists['order_Dir'], $this->lists['order']);?>lists['order_Dir'], $this->lists['order']);?>lists['order_Dir'], $this->lists['order']);?>lists['order_Dir'], $this->lists['order']);?>lists['order_Dir'], $this->lists['order']);?>lists['order_Dir'], $this->lists['order']); ?>
    pagination->getRowOffset($i); ?>id); ?>accountgroup_name; ?> + economic_vat_account;?>economic_nonvat_account;?>economic_discount_product_number;?>economic_discount_vat_account;?>economic_discount_nonvat_account;?>economic_shipping_vat_account;?>economic_shipping_nonvat_account;?>id;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    + + + + + +
    diff --git a/component/admin/views/accountgroup/tmpl/index.html b/component/admin/views/accountgroup/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/accountgroup/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/accountgroup/view.html.php b/component/admin/views/accountgroup/view.html.php new file mode 100644 index 00000000000..267aba1d2ed --- /dev/null +++ b/component/admin/views/accountgroup/view.html.php @@ -0,0 +1,49 @@ +setTitle(JText::_('COM_REDSHOP_ECONOMIC_ACCOUNT_GROUP')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_ECONOMIC_ACCOUNT_GROUP'), 'redshop_accountgroup48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolbarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $uri = JFactory::getURI(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'accountgroup_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + + $detail = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->pagination = $pagination; + $this->detail = $detail; + $this->lists = $lists; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/accountgroup_detail/index.html b/component/admin/views/accountgroup_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/accountgroup_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/accountgroup_detail/tmpl/default.php b/component/admin/views/accountgroup_detail/tmpl/default.php new file mode 100644 index 00000000000..0baef6be960 --- /dev/null +++ b/component/admin/views/accountgroup_detail/tmpl/default.php @@ -0,0 +1,131 @@ + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    : +
    : +
    : +
    : +
    : +
    : +
    : +
    :lists['published']; ?>
    +
    +
    + + + +
    diff --git a/component/admin/views/accountgroup_detail/tmpl/index.html b/component/admin/views/accountgroup_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/accountgroup_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/accountgroup_detail/view.html.php b/component/admin/views/accountgroup_detail/view.html.php new file mode 100644 index 00000000000..be1f778d91f --- /dev/null +++ b/component/admin/views/accountgroup_detail/view.html.php @@ -0,0 +1,54 @@ +get('data'); + $isNew = ($detail->accountgroup_id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + JToolBarHelper::title(JText::_('COM_REDSHOP_ECONOMIC_ACCOUNT_GROUP') . ': [ ' . $text . ' ]', 'redshop_accountgroup48'); + + $lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + + $this->detail = $detail; + $this->lists = $lists; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/addorder_detail/index.html b/component/admin/views/addorder_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/addorder_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/addorder_detail/tmpl/default.php b/component/admin/views/addorder_detail/tmpl/default.php new file mode 100644 index 00000000000..8fba12eb1a8 --- /dev/null +++ b/component/admin/views/addorder_detail/tmpl/default.php @@ -0,0 +1,844 @@ +getModel('addorder_detail'); +$redhelper = redhelper::getInstance(); + +$billing = $this->billing; +$shipping = $this->shipping; +$is_company = $billing->is_company; + +if (!empty ($_SERVER['REMOTE_ADDR'])) +{ + $ip = $_SERVER['REMOTE_ADDR']; +} +else +{ + $ip = 'unknown'; +} +$session = JFactory::getSession(); +$session->set('ordertotal', 0); +$billisshipcheck = ($this->shipping->billisship) ? "checked" : ""; +$shippingblock = ($this->shipping->billisship) ? "none" : ""; + +if ($this->detail->user_id < 0) +{ + $style = "none"; + $create_account = 0; +} +else +{ + $style = "block"; + $create_account = 1; +} +$allowCustomer = ''; +$allowCompany = ''; +if ($is_company == 1) +{ + $allowCustomer = 'style="display:none;"'; +} +else +{ + $allowCompany = 'style="display:none;"'; +} +$err = JFactory::getApplication()->input->get('err', ''); + +$DEFAULT_QUANTITY = Redshop::getConfig()->get('DEFAULT_QUANTITY'); + +$username = $app->getUserState('com_redshop.addorder_detail.guestuser.username', null); + +// Clear state +$app->setUserState('com_redshop.addorder_detail.guestuser.username', null); +?> + + +input->getCmd('ajaxtask', '')): ?> +
    +
    +
    + : +
    +
    + value = $this->detail->user_id; + $userDetail->text = $billing->firstname . ' ' . $billing->lastname; + echo JHTML::_('redshopselect.search', $userDetail, 'user_id', + array( + 'select2.ajaxOptions' => array('typeField' => ', addreduser:1'), + 'select2.options' => array( + 'events' => array('select2-selecting' => 'function(e) { + document.getElementById(\'user_id\').value = e.object.id; + showUserDetail(); + if (e.object.id){ + document.getElementById(\'trCreateAccount\').style.display = \'none\'; + }}') + ) + ) + ); + ?> +
    +
    +
    +
    +
    +
    + : +
    +
    + +
    +
    +
    + + + + + + users_info_id): ?> + + + + + + + + +
    + + + + + + + + + + + + +
    + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + > + + + + get('USE_TAX_EXEMPT') == 1) + { + ?> + > + + + + > + + + + > + + + + + + + + +
    :lists['is_company'];?>
    :
    + : +
    :
    :
    :
    :
    :lists['country_code'];?>
    :lists['state_code']; ?>
    :
    :detail->user_id <= 0 && $style == "block") + { ?>onblur="validate(2);" /> +
    :
    :
    :tax_exempt); ?>
    : + requesting_tax_exempt); ?>
    + : + tax_exempt_approved); ?> +
    +
    >lists['customer_field'];?>
    +
    >lists['company_field'];?>
    +
    +
    + + + + + + + + + +
    + : + + + onclick="javascript:getShippinginfo('users_info_id ?>')" /> +
    :lists['shippinginfo_list'] ?>
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    :
    :
    :
    :
    :
    :lists['country_code_ST']; ?>
    :lists['state_code_ST']; ?>
    :
    +
    >lists['shipping_customer_field'];?>
    +
    >lists['shipping_company_field'];?>
    +
    +
    +
    + + detail->user_id <= 0): ?> + + + + + +
    + + + + + + + + + + + + + +
    :
    :
    :
    +
    + + + input->getCmd('ajaxtask') == "getuser"): ?> + + +
    + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + +
    + + + + + + +
    array('typeField' => ', isproduct:1'), + 'select2.options' => array( + 'events' => array('select2-selecting' => 'function(e) { + document.getElementById(\'product1\').value = e.object.id; + displayProductDetailInfo(\'product1\', 0);}' + ) + ) + ) + ); + ?> +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + : +
    +
    + : +
    +
    + : +
    + +
    + : +
    + % +
    + : +
    +
    +
    +
    + : +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    convertDateFormat(time());?>
    +
    +
    +
    +
    + input->getCmd('ajaxtask')): ?> + + + + + + + + + +
    +
    + + + diff --git a/component/admin/views/addorder_detail/tmpl/index.html b/component/admin/views/addorder_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/addorder_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/addorder_detail/tmpl/productorderinfo.php b/component/admin/views/addorder_detail/tmpl/productorderinfo.php new file mode 100644 index 00000000000..85bc4a57079 --- /dev/null +++ b/component/admin/views/addorder_detail/tmpl/productorderinfo.php @@ -0,0 +1,48 @@ +input->get->getArray(); + +$ordertotal = $post['ordertotal']; +$ordersubtotal = $post['ordersubtotal']; +$productarr = $post['productarr']; +$qntarr = $post['qntarr']; +$user_id = $post['order_user_id']; +$shipp_users_info_id = $post['shipp_users_info_id']; +$userinfo = $producthelper->getUserInformation($user_id, "BT"); + +if ($shipp_users_info_id == 0 && count($userinfo) > 0) +{ + $shipp_users_info_id = $userinfo->users_info_id; +} +$productItem = explode(",", $productarr); +$qntItem = explode(",", $qntarr); + +$cart = array(); + +for ($pi = 0; $pi < count($productItem); $pi++) +{ + $cart[$pi]['product_id'] = $productItem[$pi]; + $cart[$pi]['quantity'] = $qntItem[$pi]; +} + +$cart['idx'] = count($cart); +$this->billing = $userinfo; +$session->set('order_user_id', $user_id); +$session->set('shipp_users_info_id', $shipp_users_info_id); +$session->set('ordertotal', $ordertotal); +$session->set('ordersubtotal', $ordersubtotal); +RedshopHelperCartSession::setCart($cart); + +echo "
    " . $this->loadTemplate('payment') . "
    "; +echo "
    " . $this->loadTemplate('shipping') . "
    "; diff --git a/component/admin/views/addorder_detail/tmpl/productorderinfo_payment.php b/component/admin/views/addorder_detail/tmpl/productorderinfo_payment.php new file mode 100644 index 00000000000..e643df6a0c1 --- /dev/null +++ b/component/admin/views/addorder_detail/tmpl/productorderinfo_payment.php @@ -0,0 +1,85 @@ +billing->is_company; + +$payment_method_id = 0; + +if (count($paymentMethods) == 1) +{ + $payment_method_id = $paymentMethods[0]->element; +} ?> +
    + 0): ?> + params); + + $checked = ""; + if ($payment_method_id == $paymentMethods[$p]->element) + { + $checked = "checked"; + } + $private_person = $paymentparams->get('private_person', ''); + $isCreditCard = $paymentparams->get('is_creditcard', ''); + $business = $paymentparams->get('business', ''); + + // Check for bank transfer payment type plugin - `rs_payment_banktransfer` suffixed + $isBankTransferPaymentType = RedshopHelperPayment::isPaymentType($paymentMethods[$p]->element); + + if ($paymentMethods[$p]->element == 'rs_payment_eantransfer' || $isBankTransferPaymentType) + { + if ($is_company == 0 && $private_person == 1) + { + ?> +
    + +
    + +
    + + + + +
    diff --git a/component/admin/views/addorder_detail/tmpl/productorderinfo_shipping.php b/component/admin/views/addorder_detail/tmpl/productorderinfo_shipping.php new file mode 100644 index 00000000000..fc5ac663bda --- /dev/null +++ b/component/admin/views/addorder_detail/tmpl/productorderinfo_shipping.php @@ -0,0 +1,28 @@ +get('ordertotal'); +$ordersubtotal = $session->get('ordersubtotal'); +$user_id = $session->get('order_user_id'); +$shipp_users_info_id = $session->get('shipp_users_info_id'); + +$d['user_id'] = $user_id; +$d['users_info_id'] = $shipp_users_info_id; +$d['ordertotal'] = $ordertotal; +$d['order_subtotal'] = $ordersubtotal; + +$responce = RedshopHelperProduct::replaceShippingMethod($d, $shipp_users_info_id, 0); + +echo $responce; + +?> diff --git a/component/admin/views/addorder_detail/view.html.php b/component/admin/views/addorder_detail/view.html.php new file mode 100644 index 00000000000..6a150be5a7d --- /dev/null +++ b/component/admin/views/addorder_detail/view.html.php @@ -0,0 +1,176 @@ +input; + + $document = JFactory::getDocument(); + $document->setTitle(JText::_('COM_REDSHOP_ORDER')); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/json.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.validation.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.order.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.admin.common.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/ajaxupload.min.js', false, true); + + $uri = JUri::getInstance(); + $lists = array(); + $billing = array(); + $shippinginfo = array(); + $model = $this->getModel(); + $detail = $this->get('data'); + + // Load payment languages + RedshopHelperPayment::loadLanguages(); + + $err = $input->get('err', ''); + $shipping_rate_id = $input->getInt('shipping_rate_id', 0); + $user_id = $input->getInt('user_id', 0); + + if ($user_id != 0) + { + $billing = RedshopHelperOrder::getBillingAddress($user_id); + $shippinginfo = RedshopHelperOrder::getShippingAddress($user_id); + } + else + { + $billing = $model->setBilling(); + } + + $shipping_country = 0; + $shipping_state = 0; + $key = 0; + $shippingop = array(); + $shippingop[0] = new stdClass; + $shippingop[0]->users_info_id = 0; + $shippingop[0]->text = JText::_('COM_REDSHOP_SELECT'); + + if (count($shippinginfo) > 0) + { + $shipping_users_info_id = $input->getInt('shipping_users_info_id', 0); + + if ($shipping_users_info_id != 0) + { + for ($o = 0, $on = count($shippinginfo); $o < $on; $o++) + { + if ($shippinginfo[$o]->users_info_id == $shipping_users_info_id) + { + $key = $o; + break; + } + } + + $shipping_country = $shippinginfo[$key]->country_code; + $shipping_state = $shippinginfo[$key]->state_code; + } + + $shippingop = array_merge($shippingop, $shippinginfo); + $billisship = $shippinginfo[$key]->billisship = ($shipping_users_info_id) ? 0 : 1; + } + else + { + $shippinginfo[0] = $model->setShipping(); + $shipping_users_info_id = $shippinginfo[0]->users_info_id = 0; + $billisship = $shippinginfo[0]->billisship; + } + + $shdisable = ($billisship) ? "disabled" : ""; + + $detail->user_id = $user_id; + $lists['shippinginfo_list'] = JHTML::_('select.genericlist', $shippingop, 'shipp_users_info_id', + 'class="inputbox" ' . $shdisable . ' onchange="getShippinginfo(this.value, ' . $billing->is_company . ');" ', + 'users_info_id', 'text', $shipping_users_info_id + ); + + $payment_detail = $this->get('payment'); + JToolBarHelper::title(JText::_('COM_REDSHOP_ORDER') . ': [ ' . JText::_('COM_REDSHOP_NEW') . ' ]', 'pencil-2 redshop_order48'); + + if ($err == "" && array_key_exists("users_info_id", $billing) && $billing->users_info_id) + { + JToolBarHelper::custom('savepay', 'save.png', 'save_f2.png', 'Save + Pay', false); + JToolBarHelper::custom('save_without_sendmail', 'save.png', 'save_f2.png', JText::_('COM_REDSHOP_SAVE_WITHOUT_SEND_ORDERMAIL_LBL'), false); + JToolBarHelper::save(); + } + + JToolBarHelper::custom('validateUserDetail', 'apply.png', 'apply_f2.png', JText::_('COM_REDSHOP_SAVE_USER_INFORMATION'), false); + JToolBarHelper::cancel(); + + $countryarray = RedshopHelperWorld::getCountryList((array) $billing); + $billing->country_code = $countryarray['country_code']; + $lists['country_code'] = $countryarray['country_dropdown']; + + $statearray = RedshopHelperWorld::getStateList((array) $billing, "state_code", "country_code", "BT"); + $lists['state_code'] = $statearray['state_dropdown']; + + $shipping['country_code_ST'] = $shippinginfo[$key]->country_code; + $countryarray = RedshopHelperWorld::getCountryList((array) $shipping, "country_code_ST", "ST", '', 'state_code_ST'); + $shipping['country_code_ST'] = $shippinginfo[$key]->country_code = $countryarray['country_code_ST']; + + $shipping['state_code_ST'] = $shippinginfo[$key]->state_code; + $lists['country_code_ST'] = $countryarray['country_dropdown']; + + $statearray = RedshopHelperWorld::getStateList((array) $shipping, "state_code_ST", "ST"); + $lists['state_code_ST'] = $statearray['state_dropdown']; + + $lists['is_company'] = JHTML::_('select.booleanlist', 'is_company', + 'class="inputbox" onchange="showOfflineCompanyOrCustomer(this.value);" ', + $billing->is_company, JText::_('COM_REDSHOP_USER_COMPANY'), + JText::_('COM_REDSHOP_USER_CUSTOMER') + ); + + $lists['customer_field'] = RedshopHelperExtrafields::listAllField(7, $billing->users_info_id); + $lists['company_field'] = RedshopHelperExtrafields::listAllField(8, $billing->users_info_id); + $lists['shipping_customer_field'] = RedshopHelperExtrafields::listAllField(14, $shippinginfo[0]->users_info_id); + $lists['shipping_company_field'] = RedshopHelperExtrafields::listAllField(15, $shippinginfo[0]->users_info_id); + + $this->lists = $lists; + $this->detail = $detail; + $this->billing = $billing; + $this->shipping = $shippinginfo[$key]; + $this->shipping_users_info_id = $shipping_users_info_id; + $this->payment_detail = $payment_detail; + $this->shipping_rate_id = $shipping_rate_id; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/addquotation_detail/index.html b/component/admin/views/addquotation_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/addquotation_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/addquotation_detail/tmpl/default.php b/component/admin/views/addquotation_detail/tmpl/default.php new file mode 100644 index 00000000000..8c953366b7f --- /dev/null +++ b/component/admin/views/addquotation_detail/tmpl/default.php @@ -0,0 +1,534 @@ +billing; + +if ($this->detail->user_id < 0) +{ + $style = "none"; +} +else +{ + $style = "block"; +} + +$DEFAULT_QUANTITY = Redshop::getConfig()->get('DEFAULT_QUANTITY'); +?> + + +input; + +if (!$jinput->get('ajaxtask')) +{ +?> +
    + + + + + + + + + + + + +
    + + + + + + + +
    : + array('typeField' => ', addreduser:1'), + 'select2.options' => array( + 'events' => array('select2-selecting' => 'function(e) {document.getElementById(\'user_id\').value = e.object.id;showquotationUserDetail()}') + ) + ) + ); + ?> +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    :
    : +
    : +
    : +
    :
    :lists['country_code']; ?>
    :lists['state_code']; ?>
    :
    :
    lists['quotation_extrafield'];?>
    + detail->user_id <= 0) + { + ?> + + + + + + + + + + + + + +
    : + +
    :
    + : +
    + get('ajaxtask') == "getuser") + { + die(); + } + + if (!$jinput->get('ajaxtask')) + { + ?> +
    + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    + array('typeField' => ', isproduct:1'), + 'select2.options' => array( + 'events' => array('select2-selecting' => 'function(e) {document.getElementById(\'product1\').value = e.object.id;displayProductDetailInfo(\'product1\', 0);}') + ) + ) + ); + ?> +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + : +
    +
    + : +
    +
    +
    +
    + : +
    +
    +
    +
    +
    +
    + + + +
    +
    + + diff --git a/component/admin/views/addquotation_detail/tmpl/index.html b/component/admin/views/addquotation_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/addquotation_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/addquotation_detail/view.html.php b/component/admin/views/addquotation_detail/view.html.php new file mode 100644 index 00000000000..847285bd613 --- /dev/null +++ b/component/admin/views/addquotation_detail/view.html.php @@ -0,0 +1,87 @@ +setTitle(JText::_('COM_REDSHOP_QUOTATION_MANAGEMENT')); + + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/json.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.validation.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.order.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.admin.common.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/ajaxupload.min.js', false, true); + $session = JFactory::getSession(); + $uri = JUri::getInstance(); + + $lists = array(); + $model = $this->getModel(); + $user_id = JFactory::getApplication()->input->getInt('user_id', 0); + + if ($user_id != 0) + { + $billing = RedshopHelperOrder::getBillingAddress($user_id); + } + else + { + $billing = $model->setBilling(); + } + + $detail = new stdClass; + $detail->user_id = $user_id; + + $session->set('offlineuser_id', $user_id); + + JToolBarHelper::title( + JText::_('COM_REDSHOP_QUOTATION_MANAGEMENT') . ': [ ' + . JText::_('COM_REDSHOP_NEW') . ' ]', 'redshop_order48' + ); + + JToolBarHelper::apply(); + JToolBarHelper::save(); + JToolBarHelper::custom('send', 'send.png', 'send.png', JText::_('COM_REDSHOP_SEND'), false); + JToolBarHelper::cancel(); + + $countryarray = RedshopHelperWorld::getCountryList((array) $billing); + $billing->country_code = $countryarray['country_code']; + $lists['country_code'] = $countryarray['country_dropdown']; + + $statearray = RedshopHelperWorld::getStateList((array) $billing); + $lists['state_code'] = $statearray['state_dropdown']; + $lists['quotation_extrafield'] = RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_QUOTATION, $billing->users_info_id); + + $this->lists = $lists; + $this->detail = $detail; + $this->billing = $billing; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/alert/tmpl/default.php b/component/admin/views/alert/tmpl/default.php new file mode 100644 index 00000000000..8a9d0d31508 --- /dev/null +++ b/component/admin/views/alert/tmpl/default.php @@ -0,0 +1,109 @@ + + +
    +
    +
    +
    +
    + + "> + +
    +
    +
    + : + lists['read_filter']; ?> +
    +
    + + + + + + + + + + + + + alerts); $i < $n; $i++) + { + $row = $this->alerts[$i]; + $row->id = $row->id; + + $read = JHtml::_('jgrid.published', $row->read, $i, '', 1); + ?> + "> + + + + + + + + + + + + +
    + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($i); ?> + + id); ?> + message; ?>sent_date; ?>id; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + + + +
    diff --git a/component/admin/views/alert/view.html.php b/component/admin/views/alert/view.html.php new file mode 100644 index 00000000000..c1c57c8dbb7 --- /dev/null +++ b/component/admin/views/alert/view.html.php @@ -0,0 +1,65 @@ +setTitle(JText::_('COM_REDSHOP_ALERT')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_ALERT_MANAGEMENT'), 'redshop_mailcenter48'); + JToolBarHelper::deleteList(); + JToolBarHelper::custom('publish', 'publish.png', 'publish.png', JText::_('COM_REDSHOP_ALERT_READ'), true); + JToolBarHelper::custom('unpublish', 'unpublish.png', 'unpublish.png', JText::_('COM_REDSHOP_ALERT_UNREAD'), true); + + $uri = JFactory::getURI(); + $this->state = $this->get('State'); + + $optiontype = array(); + $optiontype[] = JHTML::_('select.option', 'select', JText::_('COM_REDSHOP_SELECT')); + $optiontype[] = JHTML::_('select.option', '1', JText::_('COM_REDSHOP_ALERT_READ')); + $optiontype[] = JHTML::_('select.option', '0', JText::_('COM_REDSHOP_ALERT_UNREAD')); + + $lists['read_filter'] = JHTML::_('select.genericlist', $optiontype, 'read_filter', + 'class="inputbox" size="1" onchange="document.adminForm.submit();" ', 'value', 'text', $this->state->get('read_filter') + ); + + $lists['order'] = $this->state->get('list.ordering'); + $lists['order_Dir'] = $this->state->get('list.direction'); + $alerts = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->alerts = $alerts; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/attribute/index.html b/component/admin/views/attribute/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attribute/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attribute/tmpl/edit.php b/component/admin/views/attribute/tmpl/edit.php new file mode 100644 index 00000000000..d1cf904833a --- /dev/null +++ b/component/admin/views/attribute/tmpl/edit.php @@ -0,0 +1,46 @@ + +
    +
    +
    +
    +
    + + form->getFieldset('details') as $field): ?> + hidden) : ?> + input;?> + +
    +
    + label; ?> +
    +
    + input; ?> +
    +
    + +
    +
    +
    +
    + + + +
    diff --git a/component/admin/views/attribute/tmpl/index.html b/component/admin/views/attribute/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attribute/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attribute/view.html.php b/component/admin/views/attribute/view.html.php new file mode 100644 index 00000000000..79cb37d93fe --- /dev/null +++ b/component/admin/views/attribute/view.html.php @@ -0,0 +1,82 @@ +form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->state = $this->get('State'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors)); + + return false; + } + + $this->addToolbar(); + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + + $isNew = ($this->item->attribute_id < 1); + + // Prepare text for title + $title = JText::_('COM_REDSHOP_ATTRIBUTE_MANAGEMENT') . ': [ ' . JText::_('COM_REDSHOP_EDIT') . ' ]'; + + JToolBarHelper::title($title, 'redshop_giftcard_48'); + JToolBarHelper::apply('attribute.apply'); + JToolBarHelper::save('attribute.save'); + + if ($isNew) + { + JToolBarHelper::cancel('attribute.cancel'); + } + else + { + JToolBarHelper::cancel('attribute.cancel', JText::_('JTOOLBAR_CLOSE')); + } + } +} diff --git a/component/admin/views/attribute_set/index.html b/component/admin/views/attribute_set/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attribute_set/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attribute_set/tmpl/default.php b/component/admin/views/attribute_set/tmpl/default.php new file mode 100644 index 00000000000..5099f41c535 --- /dev/null +++ b/component/admin/views/attribute_set/tmpl/default.php @@ -0,0 +1,88 @@ + + +
    +
    + + + + + + + + + + + products); $i < $n; $i++) + { + $row = $this->products[$i]; + $row->id = $row->attribute_set_id; + $link = JRoute::_('index.php?option=com_redshop&view=attribute_set_detail&task=edit&cid[]=' . $row->id); + + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1);?> + "> + + + + + + + + + +
    + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    pagination->getRowOffset($i); ?>id); ?>attribute_set_name; ?> + id; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + + + +
    diff --git a/component/admin/views/attribute_set/tmpl/index.html b/component/admin/views/attribute_set/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attribute_set/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attribute_set/view.html.php b/component/admin/views/attribute_set/view.html.php new file mode 100644 index 00000000000..df16768a6f5 --- /dev/null +++ b/component/admin/views/attribute_set/view.html.php @@ -0,0 +1,52 @@ +setTitle(JText::_('COM_REDSHOP_ATTRIBUTE_SET')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_ATTRIBUTE_SET'), 'redshop_attribute_bank48'); + + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::custom('copy', 'copy.png', 'copy_f2.png', JText::_('COM_REDSHOP_TOOLBAR_COPY'), true); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $uri = JFactory::getURI(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'attribute_set_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $lists = array(); + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + + $products = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->lists = $lists; + $this->products = $products; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/attribute_set_detail/index.html b/component/admin/views/attribute_set_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attribute_set_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attribute_set_detail/tmpl/default.php b/component/admin/views/attribute_set_detail/tmpl/default.php new file mode 100644 index 00000000000..5f7c79d1ceb --- /dev/null +++ b/component/admin/views/attribute_set_detail/tmpl/default.php @@ -0,0 +1,170 @@ +root(); +?> + +
    +
    +
    + + + + + +
    + + + + + + + + + +
    + + + +
    + : + + lists ['published'];?> +
    +
    +
    +
    + +
    + + + + + + + + + + + +
    +
    +
    + +
    +
    + $this)); ?> + + + + + +
    + diff --git a/component/admin/views/attribute_set_detail/tmpl/index.html b/component/admin/views/attribute_set_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attribute_set_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attribute_set_detail/view.html.php b/component/admin/views/attribute_set_detail/view.html.php new file mode 100644 index 00000000000..6dd7cd4c280 --- /dev/null +++ b/component/admin/views/attribute_set_detail/view.html.php @@ -0,0 +1,80 @@ +getModel('attribute_set_detail'); + + $attributes = $model->getattributes(); + + JToolBarHelper::title(JText::_('COM_REDSHOP_ATTRIBUTE_SET_DETAIL'), 'redshop_attribute_bank48'); + $document = JFactory::getDocument(); + + $document->addScriptDeclaration(" + var WANT_TO_DELETE = '" . JText::_('COM_REDSHOP_DO_WANT_TO_DELETE') . "'; + " + ); + + if (version_compare(JVERSION, '3.0', '<')) + { + /** @scrutinizer ignore-deprecated */ JHtml::stylesheet('com_redshop/redshop.update.min.css', array(), true); + } + + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.attribute-manipulation.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.fields.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.validation.min.js', false, true); + + $uri = JUri::getInstance(); + + $detail = $this->get('data'); + + $isNew = ($detail->attribute_set_id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_ATTRIBUTE_SET') . ': [ ' . $text . ' ]', 'redshop_attribute_bank48'); + + JToolBarHelper::apply(); + + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + $lists['attributes'] = $attributes; + + $this->model = $model; + $this->lists = $lists; + $this->detail = $detail; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/attributeprices/index.html b/component/admin/views/attributeprices/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attributeprices/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attributeprices/tmpl/default.php b/component/admin/views/attributeprices/tmpl/default.php new file mode 100644 index 00000000000..70d4cfbd78f --- /dev/null +++ b/component/admin/views/attributeprices/tmpl/default.php @@ -0,0 +1,100 @@ + + +
    +
    + + + + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + data); $i++) + { + $row = $this->data[$i]; + $row->id = $row->price_id; + $link = JRoute::_('index.php?tmpl=component&option=com_redshop&view=attributeprices_detail&task=edit§ion=' . $this->section . '§ion_id=' . $row->section_id . '&cid[]=' . $row->price_id);?> + "> + + + + + + + + + + + + + +
    pagination->getRowOffset($i); ?>id); ?>property_name;?> + shopper_group_name;?>price_quantity_start;?>price_quantity_end;?>getProductFormattedPrice($row->product_price); ?>getProductFormattedPrice($row->discount_price); ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + + + +
    diff --git a/component/admin/views/attributeprices/tmpl/index.html b/component/admin/views/attributeprices/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attributeprices/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attributeprices/view.html.php b/component/admin/views/attributeprices/view.html.php new file mode 100644 index 00000000000..4ec8cb09651 --- /dev/null +++ b/component/admin/views/attributeprices/view.html.php @@ -0,0 +1,51 @@ +input->get('section_id'); + $section = $app->input->get('section'); + + $document = JFactory::getDocument(); + $document->setTitle(JText::_('COM_REDSHOP_ATTRIBUTE_PRICE')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_ATTRIBUTE_PRICE'), 'redshop_vatrates48'); + + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + $uri = JFactory::getURI(); + + $limitstart = $app->getUserStateFromRequest($context . 'limitstart', 'limitstart', '0'); + $limit = $app->getUserStateFromRequest($context . 'limit', 'limit', '10'); + + $total = $this->get('Total'); + $data = $this->get('Data'); + $pagination = new JPagination($total, $limitstart, $limit); + + $this->user = JFactory::getUser(); + $this->data = $data; + $this->section_id = $section_id; + $this->section = $section; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/attributeprices_detail/index.html b/component/admin/views/attributeprices_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attributeprices_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attributeprices_detail/tmpl/default.php b/component/admin/views/attributeprices_detail/tmpl/default.php new file mode 100644 index 00000000000..570eabe27ea --- /dev/null +++ b/component/admin/views/attributeprices_detail/tmpl/default.php @@ -0,0 +1,153 @@ +input->get('section'); +$producthelper = productHelper::getInstance(); +?> +
    +
    + + +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    :property->property_name;?>
    + : + lists['shopper_group_name'];?>
    + : + +
    + : + +
    : +
    : + +
    + : + + detail->discount_start_date) : + $sdate = date(Redshop::getConfig()->getString('DEFAULT_DATEFORMAT', 'Y-m-d'), $this->detail->discount_start_date); + endif; + + echo JHtml::_( + 'redshopcalendar.calendar', + $sdate, + 'discount_start_date', + 'discount_start_date', + null, + array('class' => 'form-control', 'size' => '15', 'maxlength' => '19') + ); + + ?> +
    + : + + detail->discount_end_date) : + $sdate = date(Redshop::getConfig()->getString('DEFAULT_DATEFORMAT', 'Y-m-d'), $this->detail->discount_end_date); + endif; + + echo JHtml::_( + 'redshopcalendar.calendar', + $sdate, + 'discount_end_date', + 'discount_end_date', + null, + array('class' => 'form-control', 'size' => '15', 'maxlength' => '19') + ); + + ?> +
    +
    +
    +
    + + + + + +
    diff --git a/component/admin/views/attributeprices_detail/tmpl/index.html b/component/admin/views/attributeprices_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/attributeprices_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/attributeprices_detail/view.html.php b/component/admin/views/attributeprices_detail/view.html.php new file mode 100644 index 00000000000..c7cef9a9777 --- /dev/null +++ b/component/admin/views/attributeprices_detail/view.html.php @@ -0,0 +1,41 @@ +lists = array(); + $this->detail = $this->get('data'); + $model = $this->getModel('attributeprices_detail'); + $this->property = $model->getPropertyName(); + $this->request_url = JFactory::getURI()->toString(); + + $this->lists['shopper_group_name'] = RedshopHelperShopper_Group::listAll( + "shopper_group_id", + 0, + array($this->detail->shopper_group_id), + 1, + true, + false + ); + + parent::display($tpl); + } +} diff --git a/component/admin/views/attributes/index.html b/component/admin/views/attributes/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/views/attributes/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/views/attributes/tmpl/default.php b/component/admin/views/attributes/tmpl/default.php new file mode 100644 index 00000000000..02b883ea377 --- /dev/null +++ b/component/admin/views/attributes/tmpl/default.php @@ -0,0 +1,120 @@ +escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +?> +
    + +
    + $this, + 'options' => array( + 'searchField' => 'search', + 'filtersHidden' => false, + 'searchFieldSelector' => '#filter_search', + 'limitFieldSelector' => '#list_users_limit', + 'activeOrder' => $listOrder, + 'activeDirection' => $listDirn, + ) + ) + ); + ?> +
    + + items)) : ?> +
    + +
    + + + + + + + + + + + + + + items as $i => $item) : ?> + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    + attribute_id); ?> + +
    + attribute_published, $i, 'attributes.', true, 'cb'); ?> +
    +
    + + + product_name;?> + + display_type;?> + + attribute_id; ?> +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    + + + + +
    diff --git a/component/admin/views/attributes/tmpl/index.html b/component/admin/views/attributes/tmpl/index.html new file mode 100644 index 00000000000..94906bce29b --- /dev/null +++ b/component/admin/views/attributes/tmpl/index.html @@ -0,0 +1 @@ + diff --git a/component/admin/views/attributes/view.html.php b/component/admin/views/attributes/view.html.php new file mode 100644 index 00000000000..6b1b9f07b8a --- /dev/null +++ b/component/admin/views/attributes/view.html.php @@ -0,0 +1,77 @@ +getModel(); + + // Get data from the model + $this->items = $model->getItems(); + $this->pagination = $model->getPagination(); + $this->state = $model->getState(); + $this->activeFilters = $model->getActiveFilters(); + $this->filterForm = $model->getForm(); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode('
    ', $errors)); + + return false; + } + + // Set the tool-bar and number of found items + $this->addToolBar(); + + // Display the template + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolBar() + { + $title = JText::_('COM_REDSHOP_ATTRIBUTE_MANAGEMENT'); + + if ($this->pagination->total) + { + $title .= "(" . $this->pagination->total . ")"; + } + + JToolBarHelper::title($title, 'redshop_giftcard_48'); + JToolBarHelper::addNew('attribute.add'); + JToolBarHelper::editList('attribute.edit'); + JToolBarHelper::deleteList('', 'attributes.delete'); + JToolbarHelper::publish('attributes.publish', 'JTOOLBAR_PUBLISH', true); + JToolbarHelper::unpublish('attributes.unpublish', 'JTOOLBAR_UNPUBLISH', true); + } +} diff --git a/component/admin/views/catalog/index.html b/component/admin/views/catalog/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/catalog/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/catalog/tmpl/edit.php b/component/admin/views/catalog/tmpl/edit.php new file mode 100644 index 00000000000..4c5b3166d2a --- /dev/null +++ b/component/admin/views/catalog/tmpl/edit.php @@ -0,0 +1,11 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/catalog/tmpl/index.html b/component/admin/views/catalog/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/catalog/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/catalog/view.html.php b/component/admin/views/catalog/view.html.php new file mode 100644 index 00000000000..ddf8bd841ff --- /dev/null +++ b/component/admin/views/catalog/view.html.php @@ -0,0 +1,39 @@ +getAttribute('name') == 'media') + { + return false; + } + + return parent::/** @scrutinizer ignore-call */ prepareField($field); + } +} diff --git a/component/admin/views/catalog_request/index.html b/component/admin/views/catalog_request/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/catalog_request/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/catalog_request/tmpl/default.php b/component/admin/views/catalog_request/tmpl/default.php new file mode 100644 index 00000000000..d6948f4bef0 --- /dev/null +++ b/component/admin/views/catalog_request/tmpl/default.php @@ -0,0 +1,115 @@ + + +
    +
    + + + + + + + + + + + + + + + catalog); $i < $n; $i++) + { + $row = $this->catalog[$i]; + $row->id = $row->catalog_user_id; + $row->published = $row->block; + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); + + $reminder1 = JHtml::_('jgrid.published', $row->reminder_1, $i, '', 1); + $reminder2 = JHtml::_('jgrid.published', $row->reminder_2, $i, '', 1); + $reminder3 = JHtml::_('jgrid.published', $row->reminder_3, $i, '', 1);?> + "> + + + + + + + + + + + + + +
    + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    pagination->getRowOffset($i); ?>id); ?>name; ?>email; ?>convertDateFormat($row->registerDate); ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + + +
    diff --git a/component/admin/views/catalog_request/tmpl/index.html b/component/admin/views/catalog_request/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/catalog_request/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/catalog_request/view.html.php b/component/admin/views/catalog_request/view.html.php new file mode 100644 index 00000000000..19aa3a7dc11 --- /dev/null +++ b/component/admin/views/catalog_request/view.html.php @@ -0,0 +1,47 @@ +setTitle(JText::_('COM_REDSHOP_CATALOG_REQUEST')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_CATALOG_REQUEST_MANAGEMENT'), 'redshop_catalogmanagement48'); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $uri = JFactory::getURI(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'catalog_user_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + $catalog = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->catalog = $catalog; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/catalogs/index.html b/component/admin/views/catalogs/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/catalogs/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/catalogs/tmpl/default.php b/component/admin/views/catalogs/tmpl/default.php new file mode 100644 index 00000000000..ad7c091f89e --- /dev/null +++ b/component/admin/views/catalogs/tmpl/default.php @@ -0,0 +1,13 @@ + $this)); diff --git a/component/admin/views/catalogs/tmpl/index.html b/component/admin/views/catalogs/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/catalogs/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/catalogs/view.html.php b/component/admin/views/catalogs/view.html.php new file mode 100644 index 00000000000..04bdbba355a --- /dev/null +++ b/component/admin/views/catalogs/view.html.php @@ -0,0 +1,48 @@ +getModel('catalogs'); + $mediaDetail = $model->mediaDetail($row->catalog_id); + echo ' + media(' . count($mediaDetail) . ')'; + } + + return parent::onRenderColumn($config, $index, $row); + } +} diff --git a/component/admin/views/categories/index.html b/component/admin/views/categories/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/categories/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/categories/tmpl/default.php b/component/admin/views/categories/tmpl/default.php new file mode 100644 index 00000000000..7414258b981 --- /dev/null +++ b/component/admin/views/categories/tmpl/default.php @@ -0,0 +1,33 @@ + $this)); +?> + diff --git a/component/admin/views/categories/tmpl/index.html b/component/admin/views/categories/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/categories/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/categories/view.html.php b/component/admin/views/categories/view.html.php new file mode 100644 index 00000000000..0dce5be63d0 --- /dev/null +++ b/component/admin/views/categories/view.html.php @@ -0,0 +1,147 @@ +canCreate) + { + JToolbarHelper::addNew($this->getInstanceName() . '.add'); + JToolbarHelper::custom('category.copy', 'copy.png', 'copy_f2.png', JText::_('COM_REDSHOP_TOOLBAR_COPY'), true); + } + + if ($this->canDelete) + { + JToolbarHelper::deleteList('', $this->getInstancesName() . '.delete'); + } + + if ($this->canEdit) + { + JToolbarHelper::publish($this->getInstancesName() . '.publish', 'JTOOLBAR_PUBLISH', true); + JToolbarHelper::unpublish($this->getInstancesName() . '.unpublish', 'JTOOLBAR_UNPUBLISH', true); + JToolbarHelper::checkin($this->getInstancesName() . '.checkin', 'JTOOLBAR_CHECKIN', true); + } + } + + /** + * Method for prepare table. + * + * @return void + * + * @since 2.0.6 + */ + protected function prepareTable() + { + parent::prepareTable(); + + $this->columns[] = array( + // This column is sortable? + 'sortable' => false, + // Text for column + 'text' => JText::_('COM_REDSHOP_PRODUCTS'), + // Name of property for get data. + 'dataCol' => 'product', + // Width of column + 'width' => 'auto', + // Enable edit inline? + 'inline' => false, + // Display with edit link or not? + 'edit_link' => false, + // Type of column + 'type' => 'text', + ); + } + + /** + * Method for render 'Published' column + * + * @param array $config Row config. + * @param int $index Row index. + * @param object $row Row data. + * + * @return string + * + * @since 2.0.6 + */ + public function onRenderColumn($config, $index, $row) + { + $isCheckedOut = $row->checked_out && JFactory::getUser()->id != $row->checked_out; + $inlineEditEnable = Redshop::getConfig()->getBool('INLINE_EDITING'); + + if ($config['dataCol'] == 'name') + { + if ($config['inline'] === true && !$isCheckedOut && $inlineEditEnable && $this->canEdit) + { + $value = $row->{$config['dataCol']}; + $display = $value; + + if ($config['edit_link']) + { + $display = str_repeat('| — ', $row->level - 1) + . '' . $value . ''; + } + + return JHtml::_('redshopgrid.inline', $config['dataCol'], $value, $display, $row->id, $config['type']); + } + else + { + if ($this->canEdit) + { + return str_repeat('| — ', $row->level - 1) + . '' + . $row->{$config['dataCol']} . ''; + } + else + { + return str_repeat('| — ', $row->level - 1) . $row->{$config['dataCol']}; + } + } + } + elseif ($config['dataCol'] == 'description') + { + return JHtml::_('redshopgrid.slidetext', strip_tags($row->description)); + } + + $row->product = RedshopEntityCategory::getInstance($row->id)->productCount(); + + return parent::onRenderColumn($config, $index, $row); + } +} diff --git a/component/admin/views/category/index.html b/component/admin/views/category/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/category/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/category/tmpl/edit.php b/component/admin/views/category/tmpl/edit.php new file mode 100644 index 00000000000..89e08228e37 --- /dev/null +++ b/component/admin/views/category/tmpl/edit.php @@ -0,0 +1,48 @@ + + +
    + $this, + 'tabMenu' => $this->tabmenu->getData('tab')->items, + ) + ); + ?> + form->getInput('id'); ?> + + + +
    diff --git a/component/admin/views/category/tmpl/edit_accessory.php b/component/admin/views/category/tmpl/edit_accessory.php new file mode 100644 index 00000000000..7f053e2d904 --- /dev/null +++ b/component/admin/views/category/tmpl/edit_accessory.php @@ -0,0 +1,130 @@ + +
    +
    +
    +
    +

    +
    +
    + array( + 'info' => array( + JText::_('COM_REDSHOP_CATEGORY_ACCESSORY_PRODUCT_INFO') + ) + ), + 'showHeading' => false, + 'allowClose' => false + ) + ); + ?> + + + + + + + + +

    +
    + array( + 'events' => array( + 'select2-selecting' => 'function(e) {create_table_accessory(e.object.text, e.object.id, e.object.price)}', + 'select2-close' => 'function(e) {$(this).select2("val", "")}' + ) + ), + 'select2.ajaxOptions' => array('typeField' => ', accessoryList: function(){ + var listAcc = []; + jQuery(\'input.childProductAccessory\').each(function(){ + listAcc[listAcc.length] = jQuery(this).val(); + }); + return listAcc.join(","); + }'), + ) + ); + ?> +
    + + + + + + + + + + + + + lists['categroy_accessory_product']; + + for ($f = 0, $fn = count($accessoryProduct); $f < $fn; $f++) : + $accessoryMainPrice = 0; + + if ($accessoryProduct[$f]->product_id && $accessoryProduct[$f]->accessory_id) : + $accessoryMainPrice = \Redshop\Product\Accessory::getPrice($accessoryProduct[$f]->product_id, $accessoryProduct[$f]->newaccessory_price, $accessoryProduct[$f]->accessory_main_price, 1); + endif; + + //$checked = ($accessoryProduct[$f]->setdefault_selected) ? "checked" : ""; + ?> + + + + + + + + + + + +
    + product_name; ?> + + + + + + + + + + +
    + +
    +
    +
    +
    +
    diff --git a/component/admin/views/category/tmpl/edit_extrafield.php b/component/admin/views/category/tmpl/edit_extrafield.php new file mode 100644 index 00000000000..6d7e5015c6c --- /dev/null +++ b/component/admin/views/category/tmpl/edit_extrafield.php @@ -0,0 +1,32 @@ +trigger('onRenderCategoryExtraFields', array($this->item->id)); +?> +
    +
    +
    +
    +

    +
    +
    + + + + +
    + extraFields) : ?> + extraFields; ?> + +
    +
    +
    +
    +
    diff --git a/component/admin/views/category/tmpl/edit_information.php b/component/admin/views/category/tmpl/edit_information.php new file mode 100644 index 00000000000..ae14d1dfe62 --- /dev/null +++ b/component/admin/views/category/tmpl/edit_information.php @@ -0,0 +1,111 @@ +item->id)->getMedia(); + +foreach ($media->getAll() as $mediaItem) +{ + if ($mediaItem->get('scope') == 'full') + { + $fullImage = $mediaItem->get('media_name'); + $fullMediaId = $mediaItem->getId(); + } + elseif ($mediaItem->get('scope') == 'back') + { + $backImage = $mediaItem->get('media_name'); + $backMediaId = $mediaItem->getId(); + } +} +?> + +
    +
    +
    +
    +

    +
    +
    + form->renderField('name') ?> + form->renderField('parent_id') ?> + form->renderField('published') ?> + form->renderField('products_per_page') ?> + form->renderField('template') ?> + form->renderField('more_template') ?> + form->renderField('compare_template_id') ?> + form->renderField('short_description') ?> + form->renderField('description') ?> +
    +
    +
    +
    +
    +
    +

    +
    +
    +
    + item->id, + 'category', + $fullImage, + false, + true, + $fullMediaId + ); + ?> +
    +
    +
    + +
    +
    +

    +
    +
    +
    + item->id, + 'category', + $backImage, + false, + true, + $backMediaId + ); + ?> +
    +
    +
    +
    +
    + form->renderField('created_by') ?> + form->renderField('created_date') ?> + form->renderField('modified_by') ?> + form->renderField('modified_date') ?> +
    +
    +
    + form->getInput('checked_out'); ?> + form->getInput('checked_out_time'); ?> + form->getInput('level'); ?> + form->getInput('lft'); ?> + form->getInput('rgt'); ?> +
    + diff --git a/component/admin/views/category/tmpl/edit_product_filter.php b/component/admin/views/category/tmpl/edit_product_filter.php new file mode 100644 index 00000000000..139ff6edba5 --- /dev/null +++ b/component/admin/views/category/tmpl/edit_product_filter.php @@ -0,0 +1,59 @@ +item->id)->getProducts(true); + +if (!empty($productList)) +{ + foreach ($productList as $product) + { + $productsFilter[] = $product->product_id; + } +} + +$registry = new JRegistry; +$filterParams = $registry->loadString($this->item->product_filter_params); +?> + +
    +
    +
    +
    +

    +
    +
    +

    + form->getFieldset('filters') as $field) : ?> +
    + fieldname == 'product_attributes') + { + $options['product_ids'] = $productsFilter; + } + + $value = $filterParams->get($field->fieldname); + + if ($field->type === 'Radio' && empty($value)) + { + $value = 0; + } + + $field->setValue($value, true); + ?> + renderField($options); ?> +
    + +
    +
    +
    +
    diff --git a/component/admin/views/category/tmpl/edit_seo.php b/component/admin/views/category/tmpl/edit_seo.php new file mode 100644 index 00000000000..5fdff9a5dab --- /dev/null +++ b/component/admin/views/category/tmpl/edit_seo.php @@ -0,0 +1,30 @@ + +
    +
    +
    +
    +

    +
    +
    + form->getFieldset('seo') as $field) : ?> + hidden) : ?> + input ?> + +
    + form->renderField($field->fieldname) ?> +
    + +
    +
    +
    +
    diff --git a/component/admin/views/category/tmpl/index.html b/component/admin/views/category/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/category/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/category/view.html.php b/component/admin/views/category/view.html.php new file mode 100644 index 00000000000..7a581d97db0 --- /dev/null +++ b/component/admin/views/category/view.html.php @@ -0,0 +1,173 @@ +getModel('category'); + + // Initialise variables. + $this->item = $this->get('Item'); + $this->state = $this->get('State'); + + // Accessory of Category + $categoryAccessoryProduct = array(); + + if ($this->item->id) + { + $categoryAccessoryProduct = $producthelper->getProductAccessory(0, 0, 0, $this->item->id); + } + else + { + $this->is_new = 1; + } + + $this->lists['categroy_accessory_product'] = $categoryAccessoryProduct; + $this->extraFields = $model->getExtraFields($this->item); + $this->tabmenu = $this->getTabMenu(); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors)); + } + + parent::display($tpl); + } + + /** + * Tab Menu + * + * @return object Tab menu + * + * @since 1.7 + * @throws Exception + */ + private function getTabMenu() + { + $tabMenu = new RedshopMenu(); + + $tabMenu->section('tab') + ->title('COM_REDSHOP_CATEGORY_INFORMATION') + ->addItem( + '#information', + 'COM_REDSHOP_CATEGORY_INFORMATION', + true, + 'information' + )->addItem( + '#seo', + 'COM_REDSHOP_META_DATA_TAB', + false, + 'seo' + )->addItem( + '#extrafield', + 'COM_REDSHOP_FIELDS', + false, + 'extrafield' + )->addItem( + '#accessory', + 'COM_REDSHOP_ACCESSORY_PRODUCT', + false, + 'accessory' + )->addItem( + '#product_filter', + 'COM_REDSHOP_PRODUCT_FILTERS', + false, + 'product_filter' + ); + + return $tabMenu; + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + * @throws Exception + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + $user = JFactory::getUser(); + + if ($this->is_new && (!empty($user->authorise('com_redshop', 'core.create')))) + { + JToolbarHelper::apply('category.apply'); + JToolbarHelper::save('category.save'); + JToolbarHelper::save2new('category.save2new'); + JToolbarHelper::cancel('category.cancel'); + } + else + { + // Since it's an existing record, check the edit permission, or fall back to edit own if the owner. + if ((!empty($user->authorise('com_redshop', 'core.edit')))) + { + JToolbarHelper::apply('category.apply'); + JToolbarHelper::save('category.save'); + + // We can save this record, but check the create permission to see if we can return to make a new one. + if ((!empty($user->authorise('com_redshop', 'core.create')))) + { + JToolbarHelper::save2new('category.save2new'); + } + } + + JToolbarHelper::cancel('category.cancel', JText::_('JTOOLBAR_CLOSE')); + + $itemId = (int) RedshopHelperRouter::getCategoryItemid($this->item->id); + + $link = JURI::root() . 'index.php?option=com_redshop' + . '&view=&view=category&layout=detail' + . '&cid=' . $this->item->id + . '&Itemid=' . $itemId; + + RedshopToolbarHelper::link($link, 'preview', 'JGLOBAL_PREVIEW', '_blank'); + } + } +} diff --git a/component/admin/views/configuration/index.html b/component/admin/views/configuration/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/configuration/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/configuration/tmpl/default.php b/component/admin/views/configuration/tmpl/default.php new file mode 100644 index 00000000000..0eb5690a948 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default.php @@ -0,0 +1,203 @@ +getUserState('com_redshop.configuration.selectedTabPosition', 'general'); + +if ($app->input->getInt('dashboard', 0)) +{ + $selectedTabPosition = 'dashboard'; +} + +?> + + +
    + $this, + 'tabMenu' => $this->tabmenu->getData('tab')->items, + ) + ); + ?> + + + + + + + +
    + diff --git a/component/admin/views/configuration/tmpl/default_accessory_product.php b/component/admin/views/configuration/tmpl/default_accessory_product.php new file mode 100644 index 00000000000..301d08e6dcf --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_accessory_product.php @@ -0,0 +1,148 @@ + +
    +
    +
    +
    +

    +
    +
    + JText::_('COM_REDSHOP_ACCESSORY_AS_PRODUCT_IN_CART_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ACCESSORY_AS_PRODUCT_IN_CART_ENABLE_LBL'), + 'field' => $this->lists['accessory_as_product_in_cart_enable'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ACCESSORY_PRODUCT_IN_LIGHTBOX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_IN_LIGHTBOX_LBL'), + 'field' => $this->lists['accessory_product_in_lightbox'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ACCESSORY_PRODUCT_ORDERING_METHOD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_ORDERING_METHOD_LBL'), + 'field' => $this->lists['default_accessory_ordering_method'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ACCESSORY_PRODUCT_DESC_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_DESC_MAX_CHARS_LBL'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ACCESSORY_PRODUCT_DESC_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_DESC_END_SUFFIX_LBL'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ACCESSORY_PRODUCT_TITLE_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_TITLE_MAX_CHARS_LBL'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ACCESSORY_PRODUCT_TITLE_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ACCESSORY_PRODUCT_TITLE_END_SUFFIX_LBL'), + 'line' => false, + 'field' => '' + ) + ); + ?> +
    +
    +
    + +
    +
    +
    +

    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_cart_settings.php b/component/admin/views/configuration/tmpl/default_cart_settings.php new file mode 100644 index 00000000000..c9264ec1c7d --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_cart_settings.php @@ -0,0 +1,250 @@ + + + JText::_('COM_REDSHOP_INDIVIDUAL_ADD_TO_CART_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_INDIVIDUAL_ADD_TO_CART_ENABLE_LBL'), + 'field' => $this->lists['individual_add_to_cart_enable'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ALLOW_PRE_ORDER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ALLOW_PRE_ORDER'), + 'field' => $this->lists['allow_pre_order'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ALLOW_PRE_ORDER_MESSAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ALLOW_PRE_ORDER_MESSAGE'), + 'field' => '', + 'id' => 'allow_pre_order_message', + 'showOn' => 'allow_pre_order:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_QUOTATION_MODE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_QUOTATION_MODE'), + 'field' => $this->lists['quotation_mode'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOW_QUOTATION_PRICE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOW_QUOTATION_PRICE'), + 'field' => $this->lists['show_quotation_price'], + 'id' => 'show_quotation_price', + 'showOn' => 'default_quotation_mode:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CART_TIMEOUT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CART_TIMEOUT'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_AJAX_CART_BOX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_AJAX_CART_BOX'), + 'field' => $this->lists['ajax_cart_box'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_AJAX_CART_BOX_TEMPLATE'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_AJAX_CART_BOX_TEMPLATE'), + 'field' => $this->lists['ajax_detail_template'], + 'id' => 'ajax_detail_template', + 'showOn' => 'ajax_cart_box:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_AJAX_CART_DISPLAY_TIME_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_AJAX_CARTDISPLAY_TIME'), + 'field' => '', + 'id' => 'ajax_cart_display_time', + 'showOn' => 'ajax_cart_box:1' + ) +); +?> + +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +getMenu(); + +// Get menu items - array filtered by access level of current user. +$menuItems = $menu->getItems(null, null); + +// Build please select option for no itemid +$selectOption = array(); +$selectOption[] = JHTML::_('select.option', '', JText::_('COM_REDSHOP_PLEASE_SELECT'), 'id', 'title'); + +// Merge items to build select list. +$items = array_merge($selectOption, $menuItems); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_CART_CHECKOUT_ITEMID_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_CART_CHECKOUT_ITEMID'), + 'field' => JHTML::_( + 'select.genericlist', + $items, + 'default_cart_checkout_itemid', + '', + 'id', + 'title', + $this->config->get('DEFAULT_CART_CHECKOUT_ITEMID') + ) + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ADDTOCART_BUTTON_BEHAVE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ADDTOCART_BUTTON_BEHAVE'), + 'field' => $this->lists['addtocart_behaviour'] + ) +); +?> + + JText::_('COM_REDSHOP_ONESTEP_CHECKOUT_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ONESTEP_CHECKOUT_ENABLE_LBL'), + 'field' => $this->lists['onestep_checkout_enable'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOW_SHIPPING_IN_CART_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOW_SHIPPING_IN_CART_LBL'), + 'field' => $this->lists['show_shipping_in_cart'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WANT_TO_SHOW_ATTRIBUTE_IMAGE_INCART_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WANT_TO_SHOW_ATTRIBUTE_IMAGE_INCART_LBL'), + 'field' => $this->lists['wanttoshowattributeimage'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_QUANTITY_TEXT_DISPLAY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_QUANTITY_TEXT_DISPLAY_LBL'), + 'field' => $this->lists['quantity_text_display'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_QUANTITY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_QUANTITY_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_QUANTITY_SELECTBOX_VALUE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_QUANTITY_SELECTBOX_VALUE_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CONTINUE_REDIRECT_LINK_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CONTINUE_REDIRECT_LINK'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_MINIMUM_ORDER_TOTAL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_MINIMUM_ORDER_TOTAL'), + 'field' => '', + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_cart_template_image_setting.php b/component/admin/views/configuration/tmpl/default_cart_template_image_setting.php new file mode 100644 index 00000000000..df26c4a0694 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_cart_template_image_setting.php @@ -0,0 +1,158 @@ + +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + JText::_('COM_REDSHOP_WATERMARK_CART_THUMB_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_CART_THUMB_IMAGE'), + 'field' => $this->lists['watermark_cart_thumb_image'] + ) +); +?> + +
    + +
    + + + config->get('ADDTOCART_IMAGE'))): ?> + + +
    +
    + JText::_('COM_REDSHOP_ADDTOCART_BACKGROUND_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ADDTOCART_BACKGROUND'), + 'field' => '' + ) +); +?> +
    + +
    + config->get('REQUESTQUOTE_IMAGE'); ?> + + + + + +
    +
    + JText::_('COM_REDSHOP_REQUESTQUOTE_BACKGROUND_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_REQUESTQUOTE_BACKGROUND_LBL'), + 'field' => '' + ) +); +?> +
    + +
    + config->get('ADDTOCART_UPDATE'); ?> + + + + + +
    +
    +
    + +
    + config->get('ADDTOCART_DELETE'); ?> + + + + + +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_carttab.php b/component/admin/views/configuration/tmpl/default_carttab.php new file mode 100644 index 00000000000..804922c13a9 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_carttab.php @@ -0,0 +1,44 @@ + + +
    +
    + JText::_('COM_REDSHOP_CART_SETTINGS'), + 'content' => $this->loadTemplate('cart_settings') + ) + ); + ?> +
    + +
    + JText::_('COM_REDSHOP_OTHER_INFORMATION'), + 'content' => $this->loadTemplate('payment_ship_secure') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_CART_IMAGE_SETTINGS'), + 'content' => $this->loadTemplate('cart_template_image_setting') + ) + ); + ?> +
    +
    + diff --git a/component/admin/views/configuration/tmpl/default_catalog.php b/component/admin/views/configuration/tmpl/default_catalog.php new file mode 100644 index 00000000000..5952defd2bf --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_catalog.php @@ -0,0 +1,64 @@ + JText::_('COM_REDSHOP_CATALOG_REMAINDER_1_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATALOG_REMAINDER_1'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATALOG_REMAINDER_2_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATALOG_REMAINDER_2'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DISCOUNT_DURATION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DISCOUNT_DURATION'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DISCOUNT_PERCENTAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DISCOUNT_PERCENTAGE'), + 'field' => '' + ) +); +echo ''; +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEND_CATALOG_REMINDER_MAIL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEND_CATALOG_REMINDER_MAI_LBL'), + 'line' => false, + 'field' => $this->lists['send_catalog_reminder_mail'] + ) +); diff --git a/component/admin/views/configuration/tmpl/default_category.php b/component/admin/views/configuration/tmpl/default_category.php new file mode 100644 index 00000000000..4ca7ad12ec0 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_category.php @@ -0,0 +1,48 @@ + JText::_('COM_REDSHOP_DEFAULT_CATEGORY_ORDERING_METHOD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_CATEGORY_ORDERING_METHOD_LBL'), + 'field' => $this->lists['default_category_ordering_method'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_MAXCATEGORY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_MAXCATEGORY_LBL'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRODUCT_EXPIRE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_EXPIRE'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_FRONTPAGE_CATEGORY_PAGE_INTROTEXT'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_FRONTPAGE_CATEGORY_PAGE_INTROTEXT'), + 'field' => '' + ) +); + diff --git a/component/admin/views/configuration/tmpl/default_category_suffix.php b/component/admin/views/configuration/tmpl/default_category_suffix.php new file mode 100644 index 00000000000..7e4fee43b24 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_category_suffix.php @@ -0,0 +1,119 @@ + JText::_('COM_REDSHOP_CATEGORY_DESC_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_DESC_MAX_CHARS_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_DESC_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_DESC_END_SUFFIX_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_SHORT_DESC_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_SHORT_DESC_MAX_CHARS'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_SHORT_DESC_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_SHORT_DESC_END_SUFFIX_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_TITLE_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_TITLE_MAX_CHARS_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_TITLE_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_TITLE_END_SUFFIX_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_PRODUCT_TITLE_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_TITLE_MAX_CHARS_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_PRODUCT_TITLE_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_TITLE_END_SUFFIX_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_PRODUCT_DESC_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_DESC_MAX_CHARS_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_PRODUCT_DESC_MAX_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_DESC_MAX_SUFFIX_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_PRODUCT_SHORT_DESC_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_SHORT_DESC_MAX_CHARS_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_PRODUCT_SHORT_DESC_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_PRODUCT_SHORT_DESC_END_SUFFIX_LBL'), + 'line' => false, + 'field' => '' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_category_template.php b/component/admin/views/configuration/tmpl/default_category_template.php new file mode 100644 index 00000000000..2f0260f0ac4 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_category_template.php @@ -0,0 +1,28 @@ + JText::_('COM_REDSHOP_DEFAULT_CATEGORY_TEMPLATE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_CATEGORY_TEMPLATE_FOR_VM_LBL'), + 'field' => $this->lists['category_template'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_CATEGORYLIST_TEMPLATE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_CATEGORY_TEMPLATELIST_LBL'), + 'field' => $this->lists['default_categorylist_template'], + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_cattab.php b/component/admin/views/configuration/tmpl/default_cattab.php new file mode 100644 index 00000000000..4a6d98f6135 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_cattab.php @@ -0,0 +1,67 @@ + + +
    +
    +
    + JText::_('COM_REDSHOP_MAIN_CATEGORY_SETTINGS'), + 'content' => $this->loadTemplate('category') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_NEXT_PREVIOUS'), + 'content' => $this->loadTemplate('cattab_nplinks') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_SUFFIXES'), + 'content' => $this->loadTemplate('category_suffix') + ) + ); + ?> +
    + +
    + JText::_('COM_REDSHOP_CATEGORY_TEMPLATE_TAB'), + 'content' => $this->loadTemplate('category_template') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_IMAGE_SETTINGS'), + 'content' => $this->loadTemplate('image_setting') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_IMAGES'), + 'content' => $this->loadTemplate('procat_images') + ) + ); + ?> +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_cattab_nplinks.php b/component/admin/views/configuration/tmpl/default_cattab_nplinks.php new file mode 100644 index 00000000000..16d32d49e20 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_cattab_nplinks.php @@ -0,0 +1,126 @@ + JText::_('COM_REDSHOP_RETURN_TO_CATEGORY_PREFIX'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RETURN_TO_CATEGORY_PREFIX'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_NP_LINK_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_NP_LINK'), + 'field' => $this->lists['next_previous_link'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DAFULT_PREVIOUS_PREFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DAFULT_PREVIOUS'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DAFULT_NEXT_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DAFULT_NEXT_SUFFIX'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CUSTOM_PREVIOUS_LINK'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CUSTOM_PREVIOUS_LINK'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CUSTOM_NEXT_LINK'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CUSTOM_NEXT_LINK'), + 'field' => '' + ) +); +?> +
    + +
    + config->get('IMAGE_PREVIOUS_LINK_FIND'); ?> +
    +
    + + + +
    + +
    + + <?php echo $imagePreviousLinkFind; ?> + +
    + +
    +
    +
    +
    + +
    + config->get('IMAGE_NEXT_LINK_FIND'); ?> +
    +
    + + + +
    + +
    + + <?php echo $imageNextLinkFind; ?> + +
    + +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_clicktell.php b/component/admin/views/configuration/tmpl/default_clicktell.php new file mode 100644 index 00000000000..a584b5645f8 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_clicktell.php @@ -0,0 +1,65 @@ + JText::_('COM_REDSHOP_CLICKTELL_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CLICKTELL_ENABLE_LBL'), + 'field' => $this->lists['clickatell_enable'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CLICKATELL_USERNAME_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CLICKATELL_USERNAME_LBL'), + 'id' => 'clickatell_username', + 'showOn' => 'clickatell_enable:1', + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CLICKATELL_PASSWORD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CLICKATELL_PASSWORD_LBL'), + 'id' => 'clickatell_password', + 'showOn' => 'clickatell_enable:1', + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CLICKATELL_API_ID_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CLICKATELL_API_ID_LBL'), + 'id' => 'clickatell_api_id', + 'showOn' => 'clickatell_enable:1', + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CLICKTELL_ORDER_STATUS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CLICKTELL_ORDER_STATUS_LBL'), + 'id' => 'clickatell_order_status', + 'showOn' => 'clickatell_enable:1', + 'field' => $this->lists['clickatell_order_status'] + ) +); diff --git a/component/admin/views/configuration/tmpl/default_color_sample.php b/component/admin/views/configuration/tmpl/default_color_sample.php new file mode 100644 index 00000000000..b76b878c0f8 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_color_sample.php @@ -0,0 +1,71 @@ + JText::_('COM_REDSHOP_COLOUR_SAMPLE_REMAINDER_1_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COLOUR_SAMPLE_REMAINDER_1_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_COLOUR_SAMPLE_REMAINDER_2_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COLOUR_SAMPLE_REMAINDER_2_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_COLOUR_SAMPLE_REMAINDER_3_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COLOUR_SAMPLE_REMAINDER_3_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_COLOUR_COUPON_DURATION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COLOUR_COUPON_DURATION_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_COLOUR_DISCOUNT_PERCENTAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COLOUR_DISCOUNT_PERCENTAGE_LBL'), + 'line' => false, + 'field' => '' + ) +); +?> + + JText::_('COM_REDSHOP_COMPARE_PRODUCTS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COMPARE_PRODUCTS'), + 'field' => $this->lists['compare_products'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRODUCT_COMPARE_LIMIT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_COMPARE_LIMIT_LBL'), + 'field' => '', + 'id' => 'product_compare_limit', + 'showOn' => 'compare_products:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRODUCT_COMPARISON_TYPE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_COMPARISON_TYPE_LBL'), + 'field' => $this->lists['product_comparison_type'], + 'id' => 'product_comparison_type', + 'showOn' => 'compare_products:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_COMPARE_PRODUCT_TEMPLATE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COMPARE_PRODUCT_TEMPLATE'), + 'field' => $this->lists['compare_template_id'], + 'id' => 'compare_template_id', + 'showOn' => 'compare_products:1' + ) +); +?> + +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_dashboard.php b/component/admin/views/configuration/tmpl/default_dashboard.php new file mode 100644 index 00000000000..86582461aa7 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_dashboard.php @@ -0,0 +1,28 @@ + + +
    +
    +
    + JText::_('COM_REDSHOP_MENUHIDE'), + 'content' => $this->loadTemplate('menuhide') + ) + ); + ?> +
    +
    +
    + diff --git a/component/admin/views/configuration/tmpl/default_discount.php b/component/admin/views/configuration/tmpl/default_discount.php new file mode 100644 index 00000000000..3eb7ad3d3af --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_discount.php @@ -0,0 +1,110 @@ + JText::_('COM_REDSHOP_DISCOUNT_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DISCOUNT_ENABLE_LBL'), + 'field' => $this->lists['discount_enable'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DISCOUNT_TYPE_LBL'), + 'desc' => JText::_('COM_REDSHOP_DISCOUNT_TYPE_LBL'), + 'field' => $this->lists['discount_type'], + 'id' => 'discount_type', + 'showOn' => 'discount_enable:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_COUPONS_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COUPONS_ENABLE_LBL'), + 'field' => $this->lists['coupons_enable'], + 'id' => 'coupons_enable', + 'showOn' => 'discount_enable:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_COUPON_INFO_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COUPON_INFO_LBL'), + 'field' => $this->lists['couponinfo'], + 'id' => 'couponinfo', + 'showOn' => 'discount_enable:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_VOUCHERS_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_VOUCHERS_ENABLE_LBL'), + 'field' => $this->lists['vouchers_enable'], + 'id' => 'vouchers_enable', + 'showOn' => 'discount_enable:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SPECIAL_DISCOUNT_MAIL_SEND_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SPECIAL_DISCOUNT_MAIL_SEND_LBL'), + 'field' => $this->lists['special_discount_mail_send'], + 'id' => 'special_discount_mail_send', + 'showOn' => 'discount_enable:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT_LBL'), + 'field' => $this->lists['apply_voucher_coupon_already_discount'], + 'id' => 'apply_voucher_coupon_already_discount', + 'showOn' => 'discount_enable:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHIPPING_AFTER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHIPPING_AFTER'), + 'field' => $this->lists['shipping_after'], + 'id' => 'shipping_after', + 'showOn' => 'discount_enable:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DISCOUNT_PERCENT_OR_TOTAL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DISCOUNT_PERCENT_OR_TOTAL'), + 'field' => $this->lists['discoupon_percent_or_total'], + 'id' => 'discoupon_percent_or_total', + 'showOn' => 'discount_enable:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DISCOUNT_COUPON_VALUE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DISCOUNT_COUPON_VALUE_LBL'), + 'line' => false, + 'field' => '', + 'id' => 'discoupon_value', + 'showOn' => 'discount_enable:1' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_discount_mail.php b/component/admin/views/configuration/tmpl/default_discount_mail.php new file mode 100644 index 00000000000..6804873818f --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_discount_mail.php @@ -0,0 +1,59 @@ + JText::_('COM_REDSHOP_DISCOUNT_MAIL_SEND_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DISCOUNT_MAIL_SEND_LBL'), + 'field' => $this->lists['discount_mail_send'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_MAIL1_AFTER_ORDER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_MAIL1_AFTER_ORDER_LBL'), + 'field' => '', + 'id' => 'days_mail1', + 'showOn' => 'discount_mail_send:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_MAIL2_AFTER_ORDER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_MAIL2_AFTER_ORDER_LBL'), + 'field' => '', + 'id' => 'days_mail2', + 'showOn' => 'discount_mail_send:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_MAIL3_AFTER_ORDER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_MAIL3_AFTER_ORDER_LBL'), + 'field' => '', + 'id' => 'days_mail3', + 'showOn' => 'discount_mail_send:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DISCOUNT_COUPON_DURATION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DISCOUNT_COUPON_DURATION'), + 'field' => '', + 'id' => 'discoupon_duration', + 'showOn' => 'discount_mail_send:1' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_download.php b/component/admin/views/configuration/tmpl/default_download.php new file mode 100644 index 00000000000..d82daba1eb3 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_download.php @@ -0,0 +1,53 @@ + JText::_('COM_REDSHOP_PRODUCT_DOWNLOAD_LIMIT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_DOWNLOAD_LIMIT_LBL'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRODUCT_DOWNLOAD_DAYS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_DOWNLOAD_DAYS_LBL'), + 'field' => '' + ) +); +?> + +config->get('PRODUCT_DOWNLOAD_ROOT'); + +if (!is_dir($product_download_root)) +{ + $product_download_root = JPATH_ROOT . '/components/com_redshop/assets/download/product'; +} + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRODUCT_DOWNLOAD_ROOT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_DOWNLOAD_ROOT_LBL'), + 'line' => false, + 'field' => '' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_economic.php b/component/admin/views/configuration/tmpl/default_economic.php new file mode 100644 index 00000000000..805598d4ab6 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_economic.php @@ -0,0 +1,120 @@ + +
    +
    + +
    +
    + + JText::_('COM_REDSHOP_ECONOMIC_INTEGRATION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ECONOMIC_INTEGRATION_LBL'), + 'field' => $this->lists['economic_integration'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ECONOMIC_CHOICE_OF_BOOK_INVOICE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ECONOMIC_CHOICE_OF_BOOK_INVOICE_LBL'), + 'id' => 'economic_invoice_draft', + 'showOn' => 'economic_integration:1', + 'field' => $this->lists['economic_invoice_draft'] + . '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ECONOMIC_BOOK_INVOICE_NUMBER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ECONOMIC_BOOK_INVOICE_NUMBER_LBL'), + 'id' => 'economic_book_invoice_number', + 'showOn' => 'economic_integration:1', + 'field' => $this->lists['economic_book_invoice_number'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_ECONMOMIC_ACCOUNT_GROUP_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_ECONMOMIC_ACCOUNT_GROUP_LBL'), + 'id' => 'default_economic_account_group', + 'showOn' => 'economic_integration:1', + 'field' => $this->lists['default_economic_account_group'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC_LBL'), + 'id' => 'attribute_as_product_in_economic', + 'showOn' => 'economic_integration:1', + 'field' => $this->lists['attribute_as_product_in_economic'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DETAIL_ERROR_MESSAGE_ON_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DETAIL_ERROR_MESSAGE_ON'), + 'id' => 'detail_error_message_on', + 'showOn' => 'economic_integration:1', + 'field' => $this->lists['detail_error_message_on'] + ) +); +?> +
    +
    +

    + e-conomic', + JText::_('COM_REDSHOP_CONFIG_ECONOMIC_DESCRIPTION') + ) + ?> +
    +
    + + diff --git a/component/admin/views/configuration/tmpl/default_feature_import_export.php b/component/admin/views/configuration/tmpl/default_feature_import_export.php new file mode 100644 index 00000000000..a9155a27baf --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_feature_import_export.php @@ -0,0 +1,57 @@ + JText::_('COM_REDSHOP_IMPORT_SETTINGS_MIN_FILE_SIZE'), + 'desc' => JText::_('COM_REDSHOP_IMPORT_SETTINGS_MIN_FILE_SIZE_DESC'), + 'field' => '
    bytes
    ' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_IMPORT_SETTINGS_MAX_FILE_SIZE'), + 'desc' => JText::_('COM_REDSHOP_IMPORT_SETTINGS_MAX_FILE_SIZE_DESC'), + 'field' => '
    bytes
    ' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_IMPORT_SETTINGS_FILE_MIME'), + 'desc' => JText::_('COM_REDSHOP_IMPORT_SETTINGS_FILE_MIME_DESC'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_IMPORT_SETTINGS_FILE_EXTENSION'), + 'desc' => JText::_('COM_REDSHOP_IMPORT_SETTINGS_FILE_EXTENSION_DESC'), + 'field' => '', + 'line' => false + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_IMPORT_SETTINGS_MAX_LINE'), + 'desc' => JText::_('COM_REDSHOP_IMPORT_SETTINGS_MAX_LINE_DESC'), + 'field' => '', + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_feature_inline_edit.php b/component/admin/views/configuration/tmpl/default_feature_inline_edit.php new file mode 100644 index 00000000000..02e696a9776 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_feature_inline_edit.php @@ -0,0 +1,18 @@ + JText::_('COM_REDSHOP_FEATURE_INLINE_EDIT_LBL'), + 'desc' => JText::_('COM_REDSHOP_FEATURE_INLINE_EDIT_DESC'), + 'field' => $this->lists['inline_editing'] + ) +); diff --git a/component/admin/views/configuration/tmpl/default_featuretab.php b/component/admin/views/configuration/tmpl/default_featuretab.php new file mode 100644 index 00000000000..363a13f73d8 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_featuretab.php @@ -0,0 +1,71 @@ + +
    +
    + JText::_('COM_REDSHOP_RATING'), + 'content' => $this->loadTemplate('rating_settings') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_IMPORT_EXPORT_TAB'), + 'content' => $this->loadTemplate('feature_import_export') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_INLINE_EDIT_TAB'), + 'content' => $this->loadTemplate('feature_inline_edit') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_COMPARISON_PRODUCT_TAB'), + 'content' => $this->loadTemplate('comparison_settings') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_STOCKROOM_TAB'), + 'content' => $this->loadTemplate('stockroom_settings') + ) + ); + ?> +
    + +
    + JText::_('COM_REDSHOP_WISHLIST_TAB'), + 'content' => $this->loadTemplate('wishlist_settings') + ) + ); + ?> +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_general.php b/component/admin/views/configuration/tmpl/default_general.php new file mode 100644 index 00000000000..82583266ccb --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_general.php @@ -0,0 +1,46 @@ + +
    +
    +
    + JText::_('COM_REDSHOP_STORE_SETTINGS'), + 'content' => $this->loadTemplate('settings') + ) + ); + ?> +
    + +
    + JText::_('COM_REDSHOP_GENERAL_LAYOUT_SETTING'), + 'content' => $this->loadTemplate('general_layout_settings') + ) + ); + + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_MODULES_AND_FEATURES'), + 'content' => $this->loadTemplate('modules') + ) + ); + ?> +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_general_layout_settings.php b/component/admin/views/configuration/tmpl/default_general_layout_settings.php new file mode 100644 index 00000000000..22ce01c19a6 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_general_layout_settings.php @@ -0,0 +1,78 @@ + JText::_('COM_REDSHOP_CONFIG_LOAD_REDSHOP_STYLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_CONFIG_LOAD_REDSHOP_STYLE_DESC'), + 'field' => $this->lists['load_redshop_style'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_ALLOWED_EXTENSION_TYPE_LBL'), + 'desc' => JText::_('COM_REDSHOP_DEFAULT_ALLOWED_EXTENSION_TYPE_TOOLTIP'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_IMAGE_QUALITY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_IMAGE_QUALITY_LBL'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CONFIG_IMAGE_MAX_WIDTH_LBL'), + 'desc' => JText::_('COM_REDSHOP_CONFIG_IMAGE_MAX_WIDTH_DESC'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CONFIG_IMAGE_MAX_HEIGHT_LBL'), + 'desc' => JText::_('COM_REDSHOP_CONFIG_IMAGE_MAX_HEIGHT_DESC'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CONFIG_IMAGE_PROCESSING_METHOD_LBL'), + 'desc' => JText::_('COM_REDSHOP_CONFIG_IMAGE_PROCESSING_METHOD_DESC'), + 'field' => $this->lists ['use_image_size_swapping'], + 'line' => false + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CONFIG_IMAGE_MAX_FILE_SIZE_UPLOAD'), + 'desc' => JText::_('COM_REDSHOP_CONFIG_IMAGE_MAX_FILE_SIZE_UPLOAD_DESC'), + 'field' => '' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_gls.php b/component/admin/views/configuration/tmpl/default_gls.php new file mode 100644 index 00000000000..bce3f965243 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_gls.php @@ -0,0 +1,19 @@ + JText::_('COM_REDSHOP_GLS_CUSTOMER_ID_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_GLS_CUSTOMER_ID_LBL'), + 'field' => '' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_image_setting.php b/component/admin/views/configuration/tmpl/default_image_setting.php new file mode 100644 index 00000000000..f2646e2937f --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_image_setting.php @@ -0,0 +1,137 @@ + JText::_('COM_REDSHOP_CAT_IS_LIGHTBOX'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CAT_IS_LIGHTBOX'), + 'field' => $this->lists['cat_is_lightbox'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_CATEGORY_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_CATEGORY_IMAGE'), + 'field' => $this->lists['watermark_category_image'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_CATEGORY_THUMB_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_CATEGORY_THUMB_IMAGE'), + 'field' => $this->lists['watermark_category_thumb_image'] + ) +); +?> +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_images_giftcard.php b/component/admin/views/configuration/tmpl/default_images_giftcard.php new file mode 100644 index 00000000000..abaa5f13df6 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_images_giftcard.php @@ -0,0 +1,64 @@ + JText::_('COM_REDSHOP_WATERMARK_GIFTCARD_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_GIFTCARD_IMAGE_LBL'), + 'field' => $this->lists['watermark_giftcart_image'] + ) +); +?> +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + JText::_('COM_REDSHOP_WATERMARK_GIFTCARD_THUMB_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_GIFTCARD_THUMB_IMAGE_LBL'), + 'line' => false, + 'field' => $this->lists['watermark_giftcart_thumb_image'] + ) +); +?> +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_integration.php b/component/admin/views/configuration/tmpl/default_integration.php new file mode 100644 index 00000000000..1cf17dccf96 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_integration.php @@ -0,0 +1,58 @@ + + +
    +
    +
    + JText::_('COM_REDSHOP_CONFIG_GLS'), + 'content' => $this->loadTemplate('gls') + ) + ); + ?> + JText::_('COM_REDSHOP_CLICKATELL'), + 'content' => $this->loadTemplate('clicktell') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_POST_DENMART'), + 'content' => $this->loadTemplate('postdk') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_ECONOMIC'), + 'content' => $this->loadTemplate('economic') + ) + ); + ?> +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_manufacturer_image_setting.php b/component/admin/views/configuration/tmpl/default_manufacturer_image_setting.php new file mode 100644 index 00000000000..2be7750ff6a --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_manufacturer_image_setting.php @@ -0,0 +1,95 @@ + JText::_('COM_REDSHOP_WATERMARK_MANUFACTURER_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_MANUFACTURER_IMAGE'), + 'field' => $this->lists['watermark_manufacturer_image'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WATERMARK_MANUFACTURER_THUMB_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_MANUFACTURER_THUMB_IMAGE'), + 'field' => $this->lists['watermark_manufacturer_thumb_image'] + ) +); +?> +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_manufacturer_setting.php b/component/admin/views/configuration/tmpl/default_manufacturer_setting.php new file mode 100644 index 00000000000..0844a900ae5 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_manufacturer_setting.php @@ -0,0 +1,69 @@ + JText::_('COM_REDSHOP_DEFAULT_MANUFACTURER_TEMPLATE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_MANUFACTURER_TEMPLATE_FOR_VM_LBL'), + 'field' => $this->lists['manufacturer_template'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_MANUFACTURER_ORDERING_METHOD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_MANUFACTURER_ORDERING_METHOD_LBL'), + 'field' => $this->lists['default_manufacturer_ordering_method'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_MANUFACTURER_PRODUCT_ORDERING_METHOD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_MANUFACTURER_PRODUCT_ORDERING_METHOD_LBL'), + 'field' => $this->lists['default_manufacturer_product_ordering_method'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_MANUFACTURER_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_MANUFACTURER_TITLE_MAX_CHARS_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_MANUFACTURER_TITLE_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_MANUFACTURER_TITLE_END_SUFFIX_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ENABLE_MANUFACTURER_EMAIL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ENABLE_MANUFACTURER_EMAIL_LBL'), + 'field' => $this->lists['manufacturer_mail_enable'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ENABLE_SUPPLIER_EMAIL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ENABLE_SUPPLIER_EMAIL_LBL'), + 'field' => $this->lists['supplier_mail_enable'], + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_manufacturertab.php b/component/admin/views/configuration/tmpl/default_manufacturertab.php new file mode 100644 index 00000000000..4593131f282 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_manufacturertab.php @@ -0,0 +1,38 @@ + + +
    +
    +
    + JText::_('COM_REDSHOP_MANUFACTURER_SETTINGS'), + 'content' => $this->loadTemplate('manufacturer_setting') + ) + ); + ?> +
    + +
    + JText::_('COM_REDSHOP_MANUFACTURER_IMAGE_SETTINGS'), + 'content' => $this->loadTemplate('manufacturer_image_setting') + ) + ); + ?> +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_menuhide.php b/component/admin/views/configuration/tmpl/default_menuhide.php new file mode 100644 index 00000000000..c315aea9998 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_menuhide.php @@ -0,0 +1,94 @@ +config->get('MENUHIDE')); + +$items = array_chunk($items, 3); +?> + + + + + + + diff --git a/component/admin/views/configuration/tmpl/default_modules.php b/component/admin/views/configuration/tmpl/default_modules.php new file mode 100644 index 00000000000..e7140bfb4aa --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_modules.php @@ -0,0 +1,57 @@ + JText::_('COM_REDSHOP_STATISTICS_ENABLE_TEXT'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_STATISTICS_ENABLE'), + 'field' => $this->lists['statistics_enable'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_MY_TAGS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_MY_TAGS'), + 'field' => $this->lists['my_tags'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ENABLE_ADDRESS_DETAIL_IN_SHIPPING_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ENABLE_ADDRESS_DETAIL_IN_SHIPPING'), + 'field' => $this->lists['enable_address_detail_in_shipping'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_USE_PRODUCT_RESERVE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_USE_PRODUCT_RESERVE_LBL'), + 'field' => $this->lists['is_product_reserve'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CART_RESERVATION_MESSAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CART_RESERVATION_MESSAGE'), + 'line' => false, + 'field' => '' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_newslettertab.php b/component/admin/views/configuration/tmpl/default_newslettertab.php new file mode 100644 index 00000000000..e259cc9166d --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_newslettertab.php @@ -0,0 +1,130 @@ +root(); +$ord_path = "/components/com_redshop/assets/images/"; +?> + +
    +
    +
    +
    +

    +
    +
    + JText::_('COM_REDSHOP_NEWSLETTER_ENABLE_TEXT'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NEWSLETTER_ENABLE'), + 'field' => $this->lists['newsletter_enable'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_NEWSLETTER_CONFIRMATION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NEWSLETTER_CONFIRMATION_LBL'), + 'id' => 'newsletter_confirmation', + 'showOn' => 'newsletter_enable:1', + 'field' => $this->lists['newsletter_confirmation'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_NEWS_FROM_NAME'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NEWS_FROM_NAME'), + 'id' => 'news_from_name', + 'showOn' => 'newsletter_enable:1', + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_NEWS_MAIL_FROM'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NEWS_MAIL_FROM'), + 'id' => 'news_mail_from', + 'showOn' => 'newsletter_enable:1', + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_NEWSLETTER'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_NEWSLETTER'), + 'id' => 'newsletters', + 'showOn' => 'newsletter_enable:1', + 'field' => $this->lists['newsletters'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_NEWSLETTER_MAIL_BATCHES_SENT_AT_ONE_TIME_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NEWSLETTER_MAIL_BATCHES_SENT_AT_ONE_TIME_LBL'), + 'id' => 'newsletter_mail_chunk', + 'showOn' => 'newsletter_enable:1', + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PAUSE_SECONDS_EVERY_AMOUNT_OF_EMAILS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PAUSE_SECONDS_EVERY_AMOUNT_OF_EMAILS_LBL'), + 'id' => 'newsletter_mail_pause_time', + 'showOn' => 'newsletter_enable:1', + 'field' => '' + ) + ); + ?> +
    +
    +
    +
    +
    +
    +

    +
    +
    + JText::_('COM_REDSHOP_NEWSLETTER_TESTING_EMAIL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NEWSLETTER_TESTING_EMAIL_LBL'), + 'field' => '', + 'line' => false + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_NEWSLETTER_TEST_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NEWSLETTER_TEST_LBL'), + 'field' => '', + 'line' => false + ) + ); + ?> +
    +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_ordertab.php b/component/admin/views/configuration/tmpl/default_ordertab.php new file mode 100644 index 00000000000..c77d6fceed3 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_ordertab.php @@ -0,0 +1,159 @@ + + +
    +
    +
    +
    +

    +
    +
    + JText::_('COM_REDSHOP_ORDER_ID_RESET_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ORDER_ID_RESET_LBL'), + 'field' => '' . JText::_('COM_REDSHOP_ORDER_ID_RESET') . '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ORDER_MAIL_AFTER_LBL'), + 'desc' => JText::_('COM_REDSHOP_ORDER_MAIL_AFTER_LBL'), + 'field' => $this->lists['order_mail_after'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_INVOICE_MAIL_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_INVOICE_MAIL_ENABLE'), + 'field' => $this->lists['invoice_mail_enable'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_INVOICE_MAIL_SEND_OPTION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_INVOICE_MAIL_SEND_OPTION'), + 'field' => $this->lists['invoice_mail_send_option'], + 'id' => 'invoice_mail_send_option', + 'showOn' => 'invoice_mail_enable:1' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_TOOLTIP_SEND_MAIL_TO_CUSTOMER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEND_MAIL_TO_CUSTOMER'), + 'field' => $this->lists['send_mail_to_customer'], + 'line' => false + ) + ); + ?> +
    +
    +
    + +
    +
    +
    +

    +
    +
    + JText::_('COM_REDSHOP_FIRST_INVOICE_NUMBER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_FIRST_INVOICE_NUMBER_LBL'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ORDER_NUMBER_TEMPLATE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ORDER_NUMBER_TEMPLATE'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_INVOICE_NUMBER_TEMPLATE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_INVOICE_NUMBER_TEMPLATE'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_INVOICE_NUMBER_FOR_FREE_ORDER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_INVOICE_NUMBER_FOR_FREE_ORDER_LBL'), + 'field' => JHtml::_( + 'redshopselect.booleanlist', + 'invoice_number_for_free_order', + '', + $this->config->get('INVOICE_NUMBER_FOR_FREE_ORDER') + ), + 'line' => false + ) + ); + ?> +
    +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_payment_ship_secure.php b/component/admin/views/configuration/tmpl/default_payment_ship_secure.php new file mode 100644 index 00000000000..4d497beb4de --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_payment_ship_secure.php @@ -0,0 +1,87 @@ + + + JText::_('COM_REDSHOP_PAYMENT_CALCULATION_ON_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PAYMENT_CALCULATION_ON'), + 'field' => $this->lists['payment_calculation_on'] + ) +); +?> + + JText::_('COM_REDSHOP_OPTIONAL_SHIPPING_ADDRESS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_OPTIONAL_SHIPPING_ADDRESS'), + 'field' => $this->lists['optional_shipping_address'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHIPPING_METHOD_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHIPPING_METHOD_ENABLE'), + 'field' => $this->lists['shipping_method_enable'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SPLIT_DELIVERY_COST'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SPLIT_DELIVERY_COST'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_TIME_DIFF_SPILT_CALCULATION'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_TIME_DIFF_SPILT_CALCULATION'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DELIVERY_RULE'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DELIVERY_RULE'), + 'field' => '' + ) +); +?> + + JText::_('COM_REDSHOP_SSL_ENABLE_IN_CHECKOUT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SSL_ENABLE_IN_CHECKOUT_LBL'), + 'field' => $this->lists['ssl_enable_in_checkout'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SSL_ENABLE_IN_BACKEND_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SSL_ENABLE_IN_BACKEND'), + 'field' => $this->lists['ssl_enable_in_backend'], + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_postdk.php b/component/admin/views/configuration/tmpl/default_postdk.php new file mode 100644 index 00000000000..3687bf6abb9 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_postdk.php @@ -0,0 +1,148 @@ + JText::_('COM_REDSHOP_POST_DK_INTEGRATION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_POST_DK_INTEGRATION_LBL'), + 'field' => $this->lists['postdk_integration'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_POST_DK_CUSTOMER_ID_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_POST_DK_CUSTOMER_ID_LBL'), + 'id' => 'postdk_customer_no', + 'showOn' => 'postdk_integration:1', + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_POST_DK_PASSWORD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_POST_DK_PASSWORD_LBL'), + 'id' => 'postdk_customer_password', + 'showOn' => 'postdk_integration:1', + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_POSTDANMARK_ADDRESS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_POSTDANMARK_ADDRESS_LBL'), + 'id' => 'postdk_address', + 'showOn' => 'postdk_integration:1', + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_POSTDANMARK_POSTALCODE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_POSTDANMARK_POSTALCODE_LBL'), + 'id' => 'postdk_postalcode', + 'showOn' => 'postdk_integration:1', + 'field' => '' + ) +); + +$options = array(); +$options[] = JHTML::_('select.option', 0, JText::_('COM_REDSHOP_POSTDANMARK_GENERATE_LABEL_MANUALLY')); +$options[] = JHTML::_('select.option', 1, JText::_('COM_REDSHOP_POSTDANMARK_AUTO_GENERATE_LABEL')); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_POSTDANMARK_AUTO_GENERATE_LABEL_LBL'), + 'desc' => JText::_('COM_REDSHOP_POSTDANMARK_AUTO_GENERATE_LABEL_TOOLTIP_DESC'), + 'id' => 'auto_generate_label', + 'showOn' => 'postdk_integration:1', + 'field' => Jhtml::_( + 'select.genericlist', + $options, + 'auto_generate_label', + ' class="disableBoostrapChosen form-control"', + 'value', + 'text', + $this->config->get('AUTO_GENERATE_LABEL') + ) + . '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOW_PRODUCT_DETAIL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOW_PRODUCT_DETAIL_LBL'), + 'id' => 'show_product_detail', + 'showOn' => 'postdk_integration:1', + 'field' => $this->lists['show_product_detail'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ENABLE_TRACK_AND_TRACE_EMAIL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ENABLE_TRACK_AND_TRACE_EMAIL'), + 'id' => 'webpack_enable_email_track', + 'showOn' => 'postdk_integration:1', + 'field' => $this->lists['webpack_enable_email_track'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ENABLE_SMS_FROM_WEBPACK_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ENABLE_SMS_FROM_WEBPACK_LBL'), + 'id' => 'webpack_enable_sms', + 'showOn' => 'postdk_integration:1', + 'field' => $this->lists['webpack_enable_sms'] + ) +); +?> + + diff --git a/component/admin/views/configuration/tmpl/default_price.php b/component/admin/views/configuration/tmpl/default_price.php new file mode 100644 index 00000000000..60ee70cccda --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_price.php @@ -0,0 +1,151 @@ + JText::_('COM_REDSHOP_SHOW_PRICE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOW_PRICE_LBL'), + 'field' => $this->lists['show_price'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CURRENCY_NAME'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CURRENCY_NAME'), + 'id' => 'currency_data', + 'showOn' => 'show_price:1', + 'field' => $this->lists['currency_data'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CURRENCY_SYMBOL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CURRENCY_SYMBOL'), + 'id' => 'currency_symbol', + 'showOn' => 'show_price:1', + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CURRENCY_SYMBOL_POSITION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CURRENCY_SYMBOL_POSITION'), + 'id' => 'currency_symbol_position', + 'showOn' => 'show_price:1', + 'field' => $this->lists['currency_symbol_position'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRICE_SEPERATOR_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRICE_SEPERATOR_LBL'), + 'id' => 'price_seperator', + 'showOn' => 'show_price:1', + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_THOUSAND_SEPERATOR_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_THOUSAND_SEPERATOR_LBL'), + 'id' => 'thousand_seperator', + 'showOn' => 'show_price:1', + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRICE_DECIMAL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRICE_DECIMAL_LBL'), + 'id' => 'price_decimal', + 'showOn' => 'show_price:1', + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CALCULATION_PRICE_DECIMAL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CALCULATION_PRICE_DECIMAL'), + 'id' => 'calculation_price_decimal', + 'showOn' => 'show_price:1', + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ZERO_PRICE_REPLACEMENT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ZERO_PRICE_REPLACEMENT_LBL'), + 'id' => 'zero_price_replacement', + 'showOn' => 'show_price:1', + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_USE_TAX_EXEMPT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_USE_TAX_EXEMPT_LBL'), + 'field' => $this->lists['use_tax_exempt'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOW_TAX_EXEMPT_INFRONT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOW_TAX_EXEMPT_INFRONT_LBL'), + 'id' => 'show_tax_exempt_infront', + 'showOn' => 'use_tax_exempt:1', + 'field' => $this->lists['show_tax_exempt_infront'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_TAX_EXEMPT_APPLY_VAT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_TAX_EXEMPT_APPLY_VAT_LBL'), + 'id' => 'tax_exempt_apply_vat', + 'showOn' => 'use_tax_exempt:1', + 'field' => $this->lists['tax_exempt_apply_vat'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_USE_AS_CATALOG_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_USE_AS_CATALOG_LBL'), + 'line' => false, + 'field' => $this->lists['use_as_catalog'] + ) +); +?> + diff --git a/component/admin/views/configuration/tmpl/default_pricetab.php b/component/admin/views/configuration/tmpl/default_pricetab.php new file mode 100644 index 00000000000..a6b17f0a5c2 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_pricetab.php @@ -0,0 +1,60 @@ + +
    +
    + JText::_('COM_REDSHOP_MAIN_PRICE'), + 'content' => $this->loadTemplate('price') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_GIFTCARD_IMAGE_SETTING_TAB'), + 'content' => $this->loadTemplate('images_giftcard') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_TAX_TAB'), + 'content' => $this->loadTemplate('vat') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_DISCOUNT_SETTING_TAB'), + 'content' => $this->loadTemplate('discount') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_DISCOUNT_MAIL'), + 'content' => $this->loadTemplate('discount_mail') + ) + ); + ?> +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_procat_images.php b/component/admin/views/configuration/tmpl/default_procat_images.php new file mode 100644 index 00000000000..06ac91c6503 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_procat_images.php @@ -0,0 +1,137 @@ +root(); +$cat_path = "/components/com_redshop/assets/images/category/"; +$prod_path = "/components/com_redshop/assets/images/product/"; +$slimbox_img_path = "/components/com_redshop/assets/images/slimbox/"; +?> +
    + +
    + config->get('CATEGORY_DEFAULT_IMAGE'); ?> + + + + + +
    +
    +
    + +
    + config->get('PRODUCT_DEFAULT_IMAGE'); ?> + + + + + +
    +
    +
    + +
    + config->get('WATERMARK_IMAGE'); ?> + + + + + +
    +
    +
    + +
    + config->get('PRODUCT_OUTOFSTOCK_IMAGE'); ?> + + + + + +
    +
    +
    + +
    + config->get('PRODUCT_DETAIL_LIGHTBOX_CLOSE_BUTTON_IMAGE'); ?> + + + + + +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_product_general.php b/component/admin/views/configuration/tmpl/default_product_general.php new file mode 100644 index 00000000000..24fdcb519c6 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_product_general.php @@ -0,0 +1,18 @@ + JText::_('COM_REDSHOP_DEFAULT_CATEGORY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_CATEGORY_LBL'), + 'field' => $this->lists['product_default_category'] + ) +); diff --git a/component/admin/views/configuration/tmpl/default_product_template_image_settings.php b/component/admin/views/configuration/tmpl/default_product_template_image_settings.php new file mode 100644 index 00000000000..0f1ada848f1 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_product_template_image_settings.php @@ -0,0 +1,341 @@ + JText::_('COM_REDSHOP_DEFAULT_PRODUCT_TEMPLATE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_PRODUCT_TEMPLATE_FOR_VM_LBL'), + 'field' => $this->lists['product_template'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_PRODUCT_ORDERING_METHOD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_PRODUCT_ORDERING_METHOD_LBL'), + 'field' => $this->lists['default_product_ordering_method'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DISPLAY_OUT_OF_STOCK_ATTRIBUTE_DATA'), + 'desc' => JText::_('COM_REDSHOP_DISPLAY_OUT_OF_STOCK_ATTRIBUTE_DATA'), + 'field' => $this->lists['display_out_of_stock_attribute_data'] + ) +); +?> +
    + +
    + JText::_('COM_REDSHOP_PRODUCT_IS_LIGHTBOX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_IS_LIGHTBOX'), + 'field' => $this->lists['product_is_lightbox'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRODUCT_DETAIL_IS_LIGHTBOX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_DETAIL_IS_LIGHTBOX'), + 'field' => $this->lists['product_detail_is_lightbox'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRODUCT_ADDIMG_IS_LIGHTBOX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_ADDIMG_IS_LIGHTBOX_LBL'), + 'field' => $this->lists['product_addimg_is_lightbox'] + ) +); +?> +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + JText::_('COM_REDSHOP_WATERMARK_PRODUCT_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_PRODUCT_IMAGE'), + 'field' => $this->lists['watermark_product_image'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WATERMARK_PRODUCT_THUMB_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_PRODUCT_THUMB_IMAGE'), + 'field' => $this->lists['watermark_product_thumb_image'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WATERMARK_PRODUCT_ADDITIONAL_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WATERMARK_PRODUCT_ADDITIONAL_IMAGE'), + 'field' => $this->lists['watermark_product_additional_image'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PRODUCT_HOVER_IMAGE_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_HOVER_IMAGE_ENABLE'), + 'field' => $this->lists['product_hover_image_enable'], + 'line' => false + ) +); +?> +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + JText::_('COM_REDSHOP_ADDITIONAL_HOVER_IMAGE_ENABLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ADDITIONAL_HOVER_IMAGE_ENABLE_LBL'), + 'field' => $this->lists['additional_hover_image_enable'] + ) +); +?> +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + JText::_('COM_REDSHOP_NOOF_THUMB_FOR_SCROLLER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NOOF_THUMB_FOR_SCROLLER_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_NOOF_SUBATTRIB_THUMB_FOR_SCROLLER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NOOF_SUBATTRIB_THUMB_FOR_SCROLLER'), + 'field' => '' + ) +); +?> +
    + +
    + config->get('PRE_ORDER_IMAGE'); ?> + + + + + + +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_product_unit.php b/component/admin/views/configuration/tmpl/default_product_unit.php new file mode 100644 index 00000000000..d726f1678e7 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_product_unit.php @@ -0,0 +1,35 @@ + JText::_('COM_REDSHOP_DEFAULT_VOLUME_UNIT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_VOLUME_UNIT_LBL'), + 'field' => $this->lists['default_volume_unit'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_WEIGHT_UNIT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_WEIGHT_UNIT_LBL'), + 'field' => $this->lists['default_weight_unit'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_UNIT_DECIMAL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_UNIT_DECIMAL_LBL'), + 'field' => '' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_producttab.php b/component/admin/views/configuration/tmpl/default_producttab.php new file mode 100644 index 00000000000..5b6b60d38cb --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_producttab.php @@ -0,0 +1,86 @@ + + + 'product')); +echo JHtml::_('bootstrap.addTab', 'product-pane', 'product', JText::_('COM_REDSHOP_PRODUCT', true)); +?> +
    +
    + JText::_('COM_REDSHOP_PRODUCT_GENERAL'), + 'content' => $this->loadTemplate('product_general') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_PRODUCT_UNIT'), + 'content' => $this->loadTemplate('product_unit') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_DOWNLOAD'), + 'content' => $this->loadTemplate('download') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_WRAPPING_MANAGEMENT'), + 'content' => $this->loadTemplate('wrapping') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_CATALOG_MANAGEMENT'), + 'content' => $this->loadTemplate('catalog') + ) + ); + echo RedshopLayoutHelper::render( + 'config.group', + array( + 'title' => JText::_('COM_REDSHOP_COLOR_SAMPLE_MANAGEMENT'), + 'content' => $this->loadTemplate('color_sample') + ) + ); + ?> +
    + +
    + JText::_('COM_REDSHOP_PRODUCT_TEMPLATE'), + 'content' => $this->loadTemplate('product_template_image_settings') + ) + ); + ?> +
    +
    + + +loadTemplate('accessory_product'); +echo JHtml::_('bootstrap.endTab'); +echo JHtml::_('bootstrap.addTab', 'product-pane', 'related', JText::_('COM_REDSHOP_RELATED_PRODUCTS', true)); +echo $this->loadTemplate('related_product'); +echo JHtml::_('bootstrap.endTab'); +echo JHtml::_('bootstrap.endTabSet'); +?> \ No newline at end of file diff --git a/component/admin/views/configuration/tmpl/default_rating_settings.php b/component/admin/views/configuration/tmpl/default_rating_settings.php new file mode 100644 index 00000000000..74ea37c1365 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_rating_settings.php @@ -0,0 +1,37 @@ + JText::_('COM_REDSHOP_RATING_DONE_MSG'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RATING_DONE_MSG'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_FAVOURED_REVIEWS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_FAVOURED_REVIEWS_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_RATING_REVIEW_LOGIN_REQUIRED_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RATING_REVIEW_LOGIN_REQUIRED_LBL'), + 'line' => false, + 'field' => $this->lists['rating_review_login_required'] + ) +); diff --git a/component/admin/views/configuration/tmpl/default_redshop_modules.php b/component/admin/views/configuration/tmpl/default_redshop_modules.php new file mode 100644 index 00000000000..2efb53454f1 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_redshop_modules.php @@ -0,0 +1,46 @@ + +getinstalledmodule)): ?> + + + + + + + + + + + getinstalledmodule as $module): ?> + + + + + + +
    element)) ?> + state == -1): ?> + + + + + + enabled): ?> + + + + +
    + diff --git a/component/admin/views/configuration/tmpl/default_redshop_plugins.php b/component/admin/views/configuration/tmpl/default_redshop_plugins.php new file mode 100644 index 00000000000..43366a61533 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_redshop_plugins.php @@ -0,0 +1,47 @@ + +getinstalledplugins)): ?> + + + + + + + + + + + getinstalledplugins as $plugin): ?> + + + + + + + +
    name); ?> + state == -1): ?> + + + + + + state != -1 && $plugin->enabled == 1): ?> + + + + +
    + diff --git a/component/admin/views/configuration/tmpl/default_redshop_shipping.php b/component/admin/views/configuration/tmpl/default_redshop_shipping.php new file mode 100644 index 00000000000..07891d1f73c --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_redshop_shipping.php @@ -0,0 +1,48 @@ + +getinstalledshipping)): ?> + + + + + + + + + + + getinstalledshipping as $plugin): ?> + + + + + + + +
    name); ?> + state == -1): ?> + + + + + + state != -1 && $plugin->enabled == 1): ?> + + + + +
    + diff --git a/component/admin/views/configuration/tmpl/default_redshopabout.php b/component/admin/views/configuration/tmpl/default_redshopabout.php new file mode 100644 index 00000000000..9ed3df65dab --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_redshopabout.php @@ -0,0 +1,62 @@ + + +
    +
    +
    + JText::_('COM_REDSHOP_SYSTEM_INFORMATION'), + 'content' => $this->loadTemplate('system_information') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_REDSHOP_MODULES'), + 'content' => $this->loadTemplate('redshop_modules') + ) + ); + ?> +
    +
    +
    +
    + JText::_('COM_REDSHOP_REDSHOP_SHIPPING_PLUGINS'), + 'content' => $this->loadTemplate('redshop_shipping') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_REDSHOP_PAYMENT_PLUGINS'), + 'content' => $this->loadTemplate('redshop_plugins') + ) + ); + ?> +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_registration.php b/component/admin/views/configuration/tmpl/default_registration.php new file mode 100644 index 00000000000..c818e0ac455 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_registration.php @@ -0,0 +1,152 @@ + JText::_('COM_REDSHOP_REGISTER_METHOD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_REGISTER_METHOD_LBL'), + 'field' => $this->lists['register_method'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CREATE_ACCOUNT_CHECKBOX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CREATE_ACCOUNT_CHECKBOX'), + 'field' => $this->lists['create_account_checkbox'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOW_REGISTER_EMAIL_VERIFICATION'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOW_REGISTER_EMAIL_VERIFICATION'), + 'field' => $this->lists['show_email_verification'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_NEW_CUSTOMER_SELECTION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NEW_CUSTOMER_SELECTION_LBL'), + 'field' => $this->lists['new_customer_selection'] + ) +); + +$doc = JFactory::getDocument(); +$article = JTable::getInstance('content'); +$article_id = $this->config->get('TERMS_ARTICLE_ID'); + +if ($article_id) +{ + $article->load($article_id); +} +else +{ + $article->title = JText::_('COM_REDSHOP_SELECT_AN_ARTICLE'); +} + +$js = "function jSelectArticle_terms_article_id(id, title, catid) { + document.getElementById('terms_article_id_id').value = id; + document.getElementById('terms_article_id_name').value = title; + SqueezeBox.close(); +}"; +$doc->addScriptDeclaration($js); +$link = 'index.php?option=com_content&view=articles&layout=modal&tmpl=component&function=jSelectArticle_terms_article_id'; +$html = '
    ' + . '' + . '' + . '' . JText::_('COM_REDSHOP_Select') . '' + . '
    '; + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_TERMS_AND_CONDITIONS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_TERMS_AND_CONDITIONS_LBL'), + 'field' => $html + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOW_TERMS_AND_CONDITIONS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOW_TERMS_AND_CONDITIONS_LBL'), + 'field' => $this->lists['show_terms_and_conditions'] . '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ALLOW_CUSTOMER_REGISTRATION_TYPE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ALLOW_CUSTOMER_REGISTRATION_TYPE_LBL'), + 'field' => $this->lists['allow_customer_register_type'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_CUSTOMER_REGISTRATION_TYPE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_CUSTOMER_REGISTRATION_TYPE_LBL'), + 'field' => $this->lists['default_customer_register_type'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CONFIG_CHECKOUT_LOGIN_REGISTER_SWITCHER_LBL'), + 'desc' => JText::_('COM_REDSHOP_CONFIG_CHECKOUT_LOGIN_REGISTER_SWITCHER_DESC'), + 'field' => $this->lists['checkout_login_register_switcher'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WELCOMEPAGE_INTROTEXT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WELCOMEPAGE_INTROTEXT_LBL'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_REGISTRATION_PAGE_INTRO_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_REGISTRATION_PAGE_INTRO_LBL'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_REGISTRATION_PAGE_COMP_INTRO_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_REGISTRATION_PAGE_COMP_INTRO_LBL'), + 'field' => '', + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_related_product.php b/component/admin/views/configuration/tmpl/default_related_product.php new file mode 100644 index 00000000000..39e6dc16f2a --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_related_product.php @@ -0,0 +1,175 @@ + + +
    +
    +
    +
    +

    +
    +
    + JText::_('COM_REDSHOP_TWOWAY_RELATED_PRODUCT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_TWOWAY_RELATED_PRODUCT_LBL'), + 'field' => $this->lists['twoway_related_product'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CHILDPRODUCT_DROPDOWN_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CHILDPRODUCT_DROPDOWN_LBL'), + 'field' => $this->lists['childproduct_dropdown'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PURCHASE_PARENT_WITH_CHILD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PURCHASE_PARENT_WITH_CHILD_LBL'), + 'field' => $this->lists['purchase_parent_with_child'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_RELATED_PRODUCT_ORDERING_METHOD_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_ORDERING_METHOD_LBL'), + 'field' => $this->lists['default_related_ordering_method'] + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_RELATED_PRODUCT_DESC_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_DESC_MAX_CHARS_LBL'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_RELATED_PRODUCT_DESC_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_DESC_END_SUFFIX_LBL'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_RELATED_PRODUCT_SHORT_DESC_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_SHORT_DESC_MAX_CHARS_LBL'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_RELATED_PRODUCT_SHORT_DESC_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_SHORT_DESC_END_SUFFIX_LBL'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_RELATED_PRODUCT_TITLE_MAX_CHARS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_TITLE_MAX_CHARS_LBL'), + 'field' => '' + ) + ); + echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_RELATED_PRODUCT_TITLE_END_SUFFIX_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_RELATED_PRODUCT_TITLE_END_SUFFIX_LBL'), + 'field' => '' + ) + ); + ?> +
    +
    +
    +
    +
    +
    +

    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_resettemplate.php b/component/admin/views/configuration/tmpl/default_resettemplate.php new file mode 100644 index 00000000000..892a982ab7d --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_resettemplate.php @@ -0,0 +1,22 @@ + + +
    + " + onclick="return confirm('')" /> + + + +
    diff --git a/component/admin/views/configuration/tmpl/default_seo.php b/component/admin/views/configuration/tmpl/default_seo.php new file mode 100644 index 00000000000..3dd79de46a7 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_seo.php @@ -0,0 +1,377 @@ + +
    +
    +
    + JText::_('COM_REDSHOP_SEO_GENERAL_TAB'), + 'content' => $this->loadTemplate('seo_general') + ) + ); + ?> +
    +
    +
    +
    +

    +
    +
    + 'tags')); + echo JHtml::_('bootstrap.addTab', 'seo-pane', 'tags', JText::_('COM_REDSHOP_TITLE_AVAILABLE_SEO_TAGS', true)); + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {productname} + + +
    + {manufacturer} + + +
    + {parentcategoryloop} + + +
    + {categoryname} + + +
    + {saleprice} + + +
    + {saving} + + +
    + {shopname} + + +
    + {productsku} + + +
    + {categoryshortdesc} + + +
    + {productshortdesc} + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {productname} + + +
    + {manufacturer} + + +
    + {categoryname} + + +
    + {productsku} + + +
    + {categoryshortdesc} + + +
    + {productshortdesc} + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {productname} + + +
    + {manufacturer} + + +
    + {categoryname} + + +
    + {saleprice} + + +
    + {saving} + + +
    + {shopname} + + +
    + {productsku} + + +
    + {categoryshortdesc} + + +
    + {productshortdesc} + + +
    + {categorydesc} + + +
    + {productdesc} + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {productname} + + +
    + {manufacturer} + + +
    + {categoryname} + + +
    + {saleprice} + + +
    + {saving} + + +
    + {shopname} + + +
    + {productsku} + + +
    + {categoryshortdesc} + + +
    + {productshortdesc} + + +
    + + +
    +
    +
    +
    +
    +
    + JText::_('COM_REDSHOP_SEO_CATEGORY_TAB'), + 'content' => $this->loadTemplate('seo_category') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_SEO_PRODUCT_TAB'), + 'content' => $this->loadTemplate('seo_product') + ) + ); + ?> +
    +
    + JText::_('COM_REDSHOP_SEO_MANUFACTURER_TAB'), + 'content' => $this->loadTemplate('seo_manufacturer') + ) + ); + ?> +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_seo_category.php b/component/admin/views/configuration/tmpl/default_seo_category.php new file mode 100644 index 00000000000..e25d4b39e7c --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_seo_category.php @@ -0,0 +1,47 @@ + JText::_('COM_REDSHOP_SEO_PAGE_TITLE_CATEGORY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_TITLE_CATEGORY_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_HEADING_CATEGORY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_HEADING_CATEGORY_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_DESCRIPTION_CATEGORY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_DESCRIPTION_CATEGORY_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_KEYWORDS_CATEGORY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_KEYWORDS_CATEGORY_LBL'), + 'line' => false, + 'field' => '' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_seo_general.php b/component/admin/views/configuration/tmpl/default_seo_general.php new file mode 100644 index 00000000000..851a3fb8286 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_seo_general.php @@ -0,0 +1,60 @@ + JText::_('COM_REDSHOP_ENABLE_SEF_PRODUCT_NUMBER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ENABLE_SEF_PRODUCT_NUMBER_LBL'), + 'field' => $this->lists['enable_sef_product_number'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ENABLE_SEF_NUMBER_NAME_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ENABLE_SEF_NUMBER_NAME_LBL'), + 'field' => $this->lists['enable_sef_number_name'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_IN_SEF_URL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_IN_SEF_URL_LBL'), + 'field' => $this->lists['category_in_sef_url'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CATEGORY_TREE_IN_SEF_URL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CATEGORY_TREE_IN_SEF_URL_LBL'), + 'field' => $this->lists['category_tree_in_sef_url'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_AUTOGENERATED_SEO_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_AUTOGENERATED_SEO_LBL'), + 'field' => $this->lists['autogenerated_seo'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_LANGAUGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_LANGAUGE'), + 'field' => '', + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_seo_manufacturer.php b/component/admin/views/configuration/tmpl/default_seo_manufacturer.php new file mode 100644 index 00000000000..5ced3fa7969 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_seo_manufacturer.php @@ -0,0 +1,56 @@ + JText::_('COM_REDSHOP_SEO_PAGE_TITLE_MANUFACTUR_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_TITLE_MANUFACTUR_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_HEADING_MANUFACTUR_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_HEADING_MANUFACTUR'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_DESCRIPTION_MANUFACTUR_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_DESCRIPTION_MANUFACTUR_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_KEYWORDS_MANUFACTUR_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_KEYWORDS_MANUFACTUR_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_CANONICAL_MANUFACTUR_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_CANONICAL_MANUFACTUR_LBL'), + 'field' => '', + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_seo_product.php b/component/admin/views/configuration/tmpl/default_seo_product.php new file mode 100644 index 00000000000..cebee75d8d7 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_seo_product.php @@ -0,0 +1,47 @@ + JText::_('COM_REDSHOP_SEO_PAGE_TITLE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_TITLE'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_HEADING_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_HEADING_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_DESCRIPTION_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_DESCRIPTION'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SEO_PAGE_KEYWORDS_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SEO_PAGE_KEYWORDS'), + 'field' => '', + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_settings.php b/component/admin/views/configuration/tmpl/default_settings.php new file mode 100644 index 00000000000..60281bca39b --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_settings.php @@ -0,0 +1,102 @@ + JText::_('COM_REDSHOP_SHOP_NAME_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOP_NAME_LBL'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOP_COUNTRY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOP_COUNTRY'), + 'field' => $this->lists['shop_country'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_SHIPPING_COUNTRY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_SHIPPING_COUNTRY_LBL'), + 'field' => $this->lists['default_shipping_country'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_DATEFORMAT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_DATEFORMAT_LBL'), + 'field' => $this->lists['default_dateformat'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WELCOME_MESSAGE'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WELCOME_MESSAGE'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ADMINISTRATOR_EMAIL_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_ADMINISTRATOR_EMAIL_LBL'), + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_USE_ENCODING_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_USE_ENCODING'), + 'field' => $this->lists['use_encoding'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CURRENCY_LIBRARIES_LBL'), + 'desc' => JText::_('COM_REDSHOP_CURRENCY_LIBRARIES_DESC'), + 'field' => $this->lists['currency_libraries'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CURRENCY_LAYER_ACCESS_KEY_LBL'), + 'desc' => JText::_('COM_REDSHOP_CURRENCY_LAYER_ACCESS_KEY_DESC'), + 'showOn' => 'currency_libraries:1', + 'id' => 'currency_layer_access_key', + 'field' => '' + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_COUNTRY_LIST_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_COUNTRY_LIST_LBL'), + 'field' => $this->lists['country_list'], + 'line' => false + ) +); diff --git a/component/admin/views/configuration/tmpl/default_shopper_group.php b/component/admin/views/configuration/tmpl/default_shopper_group.php new file mode 100644 index 00000000000..d5333505112 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_shopper_group.php @@ -0,0 +1,122 @@ +root(); +$shopperlogo_path = "components/com_redshop/assets/images/shopperlogo"; + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_PORTAL_SHOP_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_PORTAL_SHOP_LBL'), + 'field' => $this->lists['portalshop'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_URL_AFTER_PORTAL_LOGIN'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_URL_AFTER_PORTAL_LOGIN'), + 'showOn' => 'portal_shop:1', + 'id' => 'url_after_portal_login', + 'field' => $this->lists['url_after_portal_login'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_URL_AFTER_PORTAL_LOGOUT'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_URL_AFTER_PORTAL_LOGOUT'), + 'showOn' => 'portal_shop:1', + 'id' => 'url_after_portal_logout', + 'field' => $this->lists['url_after_portal_logout'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_PORTAL_NAME_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_PORTAL_NAME'), + 'showOn' => 'portal_shop:1', + 'id' => 'default_portal_name', + 'field' => '' + ) +); + +$defaultPortalLogo = $this->config->get('DEFAULT_PORTAL_LOGO'); +$html = '' + . ''; + +if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'shopperlogo/' . $defaultPortalLogo)) +{ + $html .= ''; +} + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_PORTAL_LOGO_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_PORTAL_LOGO_LBL'), + 'showOn' => 'portal_shop:1', + 'id' => 'default_portal_logo', + 'field' => $html + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOPPER_GROUP_DEFAULT_PRIVATE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_DEFAULT_PRIVATE_LBL'), + 'field' => $this->lists['shopper_group_default_private'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOPPER_GROUP_DEFAULT_COMPANY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_DEFAULT_COMPANY_LBL'), + 'field' => $this->lists['shopper_group_default_company'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_SHOPPER_GROUP_DEFAULT_UNREGISTERED_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_SHOPPER_GROUP_DEFAULT_UNREGISTERED_LBL'), + 'field' => $this->lists['shopper_group_default_unregistered'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_NEW_SHOPPER_GROUP_GET_VALUE_FROM_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_NEW_SHOPPER_GROUP_GET_VALUE_FROM_LBL'), + 'field' => $this->lists['new_shopper_group_get_value_from'], + 'line' => false + ) +); +?> diff --git a/component/admin/views/configuration/tmpl/default_stockroom_settings.php b/component/admin/views/configuration/tmpl/default_stockroom_settings.php new file mode 100644 index 00000000000..e21ac000c6f --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_stockroom_settings.php @@ -0,0 +1,96 @@ + JText::_('COM_REDSHOP_USE_STOCKROOM_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_USE_STOCKROOM_LBL'), + 'field' => $this->lists['use_stockroom'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_USE_BLANK_AS_INFINITE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_USE_BLANK_AS_INFINITE_LBL'), + 'field' => $this->lists['use_blank_as_infinite'], + 'id' => 'use_blank_as_infinite', + 'showOn' => 'use_stockroom:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEDAULT_STOCKROOM_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEDAULT_STOCKROOM'), + 'field' => $this->lists['default_stockroom'], + 'id' => 'default_stockroom', + 'showOn' => 'use_stockroom:1' + ) +); +?> + +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + JText::_('COM_REDSHOP_USE_PRODUCT_OUTOFSTOCK_IMAGE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_USE_PRODUCT_OUTOFSTOCK_IMAGE'), + 'field' => $this->lists['use_product_outofstock_image'], + 'id' => 'use_product_outofstock_image', + 'showOn' => 'use_stockroom:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_ENABLE_STOCKROOM_NOTIFICATION'), + 'desc' => JText::_('COM_REDSHOP_ENABLE_STOCKROOM_NOTIFICATION'), + 'field' => $this->lists['enable_stockroom_notification'], + 'id' => 'enable_stockroom_notification', + 'showOn' => 'use_stockroom:1' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_STOCKROOM_BELOW_AMOUNT_NUMBER_LBL'), + 'desc' => JText::_('COM_REDSHOP_DEFAULT_STOCKROOM_BELOW_AMOUNT_NUMBER_LBL'), + 'field' => '', + 'id' => 'default_stockroom_below_amount_number', + 'showOn' => 'use_stockroom:1' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_system_information.php b/component/admin/views/configuration/tmpl/default_system_information.php new file mode 100644 index 00000000000..44c92a7b3ab --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_system_information.php @@ -0,0 +1,65 @@ + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    server; ?>
    php_version; ?>
    db_version; ?>
    gd_check) + { + $gdinfo = gd_info(); + echo $gdinfo["GD Version"]; + } + else echo JText::_('COM_REDSHOP_Disabled'); ?>
    mb_check) echo JText::_('COM_REDSHOP_Enabled'); + else echo JText::_('COM_REDSHOP_Disabled'); ?>
    +
    diff --git a/component/admin/views/configuration/tmpl/default_user.php b/component/admin/views/configuration/tmpl/default_user.php new file mode 100644 index 00000000000..396b3f52d6c --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_user.php @@ -0,0 +1,39 @@ + + +
    +
    +
    + JText::_('COM_REDSHOP_REGISTRATION'), + 'content' => $this->loadTemplate('registration') + ) + ); + ?> +
    + +
    + JText::_('COM_REDSHOP_SHOPPER_GROUP_TAB'), + 'content' => $this->loadTemplate('shopper_group') + ) + ); + ?> +
    +
    +
    diff --git a/component/admin/views/configuration/tmpl/default_vat.php b/component/admin/views/configuration/tmpl/default_vat.php new file mode 100644 index 00000000000..ca2afac32e0 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_vat.php @@ -0,0 +1,104 @@ + JText::_('COM_REDSHOP_DEFAULT_VAT_COUNTRY_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_VAT_COUNTRY'), + 'field' => $this->lists['default_vat_country'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'id' => 'default-vat-state', + 'title' => JText::_('COM_REDSHOP_DEFAULT_VAT_STATE_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_VAT_STATE'), + 'field' => $this->lists['default_vat_state'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_VAT_GROUP_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_VAT_GROUP'), + 'field' => $this->lists['default_vat_group'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_DEFAULT_VAT_CALCULATION_BASED_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_DEFAULT_VAT_CALCULATION_BASED'), + 'field' => $this->lists['vat_based_on'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_APPLY_VAT_ON_DISCOUNT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_APPLY_VAT_ON_DISCOUNT'), + 'field' => $this->lists['apply_vat_on_discount'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_VAT_RATE_AFTER_DISCOUNT_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_VAT_RATE_AFTER_DISCOUNT_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_CALCULATE_VAT_BASED_ON_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_CALCULATE_VAT_BASED_ON_LBL'), + 'field' => $this->lists['calculate_vat_on'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_REQUIRED_VAT_NUMBER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_REQUIRED_VAT_NUMBER_LBL'), + 'field' => $this->lists['required_vat_number'] + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_VAT_INTRO_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_VAT_INTRO_LBL'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WITH_VAT_TEXT_INFO_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WITH_VAT_TEXT_INFO'), + 'field' => '' + ) +); +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WITHOUT_VAT_TEXT_INFO_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WITHOUT_VAT_TEXT_INFO'), + 'line' => false, + 'field' => '' + ) +); diff --git a/component/admin/views/configuration/tmpl/default_wishlist_settings.php b/component/admin/views/configuration/tmpl/default_wishlist_settings.php new file mode 100644 index 00000000000..94f0007d6aa --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_wishlist_settings.php @@ -0,0 +1,41 @@ + JText::_('COM_REDSHOP_MY_WISHLIST_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_MY_WISHLIST'), + 'field' => $this->lists['my_wishlist'] + ) +); + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WISHLIST_LOGIN_REQUIRED_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WISHLIST_LOGIN_REQUIRED'), + 'field' => $this->lists['wishlist_login_required'] + ) +); + + +echo RedshopLayoutHelper::render( + 'config.config', + array( + 'title' => JText::_('COM_REDSHOP_WISHLIST_LIST_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_WISHLIST_LIST'), + 'field' => $this->lists['wishlist_list'] + ) +); + + +?> + diff --git a/component/admin/views/configuration/tmpl/default_wrapping.php b/component/admin/views/configuration/tmpl/default_wrapping.php new file mode 100644 index 00000000000..72afd9da465 --- /dev/null +++ b/component/admin/views/configuration/tmpl/default_wrapping.php @@ -0,0 +1,36 @@ + +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + JText::_('COM_REDSHOP_AUTO_SCROLL_FOR_WRAPPER_LBL'), + 'desc' => JText::_('COM_REDSHOP_TOOLTIP_AUTO_SCROLL_FOR_WRAPPER_LBL'), + 'field' => $this->lists['auto_scroll_wrapper'] + ) +); diff --git a/component/admin/views/configuration/tmpl/index.html b/component/admin/views/configuration/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/configuration/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/configuration/view.html.php b/component/admin/views/configuration/view.html.php new file mode 100644 index 00000000000..7f614e3de7b --- /dev/null +++ b/component/admin/views/configuration/view.html.php @@ -0,0 +1,986 @@ +load('com_content', JPATH_ADMINISTRATOR, $lang->getTag(), true); + $db = JFactory::getDbo(); + + $document = JFactory::getDocument(); + $layout = JFactory::getApplication()->input->getCmd('layout', ''); + + if ($layout == "resettemplate") + { + $tpl = "resettemplate"; + } + + $document->setTitle(JText::_('COM_REDSHOP_CONFIG')); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.validation.min.js', false, true); + + /** @var RedshopModelConfiguration $model */ + $model = $this->getModel('configuration'); + $currency_data = $model->getCurrencies(); + + $this->config = $model->getData(); + $lists = array(); + + // Load payment languages + RedshopHelperPayment::loadLanguages(true); + RedshopHelperShipping::loadLanguages(true); + RedshopHelperModule::loadLanguages(); + + JToolbarHelper::title(JText::_('COM_REDSHOP_CONFIG'), 'equalizer redshop_icon-48-settings'); + JToolbarHelper::save(); + JToolbarHelper::apply(); + JToolbarHelper::cancel(); + + $this->setLayout('default'); + + $newsletters = $model->getnewsletters(); + + $templates = array(); + $templates[0] = new stdClass; + $templates[0]->id = 0; + $templates[0]->name = JText::_('COM_REDSHOP_SELECT'); + + $product_template = RedshopHelperTemplate::getTemplate("product"); + $compare_template = RedshopHelperTemplate::getTemplate("compare_product"); + $category_template = RedshopHelperTemplate::getTemplate("category"); + $categorylist_template = RedshopHelperTemplate::getTemplate("frontpage_category"); + $manufacturer_template = RedshopHelperTemplate::getTemplate("manufacturer_products"); + $ajax_detail_template = RedshopHelperTemplate::getTemplate("ajax_cart_detail_box"); + + $product_template = array_merge($templates, $product_template); + $compare_template = array_merge($templates, $compare_template); + $category_template = array_merge($templates, $category_template); + $categorylist_template = array_merge($templates, $categorylist_template); + $manufacturer_template = array_merge($templates, $manufacturer_template); + $ajax_detail_template = array_merge($templates, $ajax_detail_template); + + $shopper_groups = Redshop\Helper\ShopperGroup::generateList(); + + if (count($shopper_groups) <= 0) + { + $shopper_groups = array(); + } + + $tmp = array(); + $tmp[] = JHtml::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $new_shopper_group_get_value_from = array_merge($tmp, $shopper_groups); + + $lists['new_shopper_group_get_value_from'] = JHtml::_('select.genericlist', $new_shopper_group_get_value_from, + 'new_shopper_group_get_value_from', 'class="form-control" ', 'value', + 'text', $this->config->get('NEW_SHOPPER_GROUP_GET_VALUE_FROM') + ); + $lists['accessory_product_in_lightbox'] = JHtml::_('redshopselect.booleanlist', 'accessory_product_in_lightbox', + 'class="form-control" ', $this->config->get('ACCESSORY_PRODUCT_IN_LIGHTBOX') + ); + + $lists['webpack_enable_sms'] = JHtml::_('redshopselect.booleanlist', 'webpack_enable_sms', 'class="form-control" size="1"', $this->config->get('WEBPACK_ENABLE_SMS')); + $lists['webpack_enable_email_track'] = JHtml::_('redshopselect.booleanlist', 'webpack_enable_email_track', + 'class="form-control" size="1"', $this->config->get('WEBPACK_ENABLE_EMAIL_TRACK') + ); + + $q = "SELECT country_3_code AS value,country_name AS text,country_jtext FROM #__redshop_country ORDER BY country_name ASC"; + $db->setQuery($q); + $countries = $db->loadObjectList(); + $countries = RedshopHelperUtility::convertLanguageString($countries); + + $q = "SELECT stockroom_id AS value,stockroom_name AS text FROM #__redshop_stockroom ORDER BY stockroom_name ASC"; + $db->setQuery($q); + $stockroom = $db->loadObjectList(); + + $country_list = explode(',', $this->config->get('COUNTRY_LIST')); + + $tmp = array(); + $tmp[] = JHtml::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $economic_accountgroup = RedshopHelperUtility::getEconomicAccountGroup(); + $economic_accountgroup = array_merge($tmp, $economic_accountgroup); + $lists['default_economic_account_group'] = JHtml::_('select.genericlist', $economic_accountgroup, + 'default_economic_account_group', 'class="form-control" size="1" ', + 'value', 'text', $this->config->get('DEFAULT_ECONOMIC_ACCOUNT_GROUP') + ); + $tmpoption = array(); + $tmpoption[] = JHtml::_('select.option', 0, JText::_('COM_REDSHOP_NO')); + $tmpoption[] = JHtml::_('select.option', 1, JText::_('COM_REDSHOP_ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC_LBL')); + $tmpoption[] = JHtml::_('select.option', 2, JText::_('COM_REDSHOP_ATTRIBUTE_PLUS_PRODUCT_IN_ECONOMIC_LBL')); + $lists['attribute_as_product_in_economic'] = JHtml::_('select.genericlist', $tmpoption, + 'attribute_as_product_in_economic', 'class="form-control" size="1" ', + 'value', 'text', $this->config->get('ATTRIBUTE_AS_PRODUCT_IN_ECONOMIC') + ); + + $lists['detail_error_message_on'] = JHtml::_('redshopselect.booleanlist', 'detail_error_message_on', 'class="form-control" ', $this->config->get('DETAIL_ERROR_MESSAGE_ON')); + + $lists['newsletters'] = JHtml::_('select.genericlist', $newsletters, 'default_newsletter', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('DEFAULT_NEWSLETTER') + ); + $lists['currency_data'] = JHtml::_('select.genericlist', $currency_data, 'currency_code', + 'class="form-control" size="1" onchange="changeRedshopCurrencyList(this);"', 'value', 'text', $this->config->get('CURRENCY_CODE') + ); + + $lists['use_encoding'] = JHtml::_('redshopselect.booleanlist', 'use_encoding', 'class="form-control" ', $this->config->get('USE_ENCODING')); + $lists['required_vat_number'] = JHtml::_('redshopselect.booleanlist', 'required_vat_number', 'class="form-control" ', $this->config->get('REQUIRED_VAT_NUMBER')); + + $lists['coupons_enable'] = JHtml::_('redshopselect.booleanlist', 'coupons_enable', 'class="form-control" ', $this->config->get('COUPONS_ENABLE')); + $lists['vouchers_enable'] = JHtml::_('redshopselect.booleanlist', 'vouchers_enable', 'class="form-control" ', $this->config->get('VOUCHERS_ENABLE')); + $lists['manufacturer_mail_enable'] = JHtml::_('redshopselect.booleanlist', 'manufacturer_mail_enable', 'class="form-control" ', $this->config->get('MANUFACTURER_MAIL_ENABLE')); + + $lists['apply_voucher_coupon_already_discount'] = JHtml::_('redshopselect.booleanlist', 'apply_voucher_coupon_already_discount', 'class="form-control" ', $this->config->get('APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT')); + + $lists['supplier_mail_enable'] = JHtml::_('redshopselect.booleanlist', 'supplier_mail_enable', 'class="form-control" ', $this->config->get('SUPPLIER_MAIL_ENABLE')); + + $lists['create_account_checkbox'] = JHtml::_('redshopselect.booleanlist', 'create_account_checkbox', 'class="form-control"', $this->config->get('CREATE_ACCOUNT_CHECKBOX')); + $lists['show_email_verification'] = JHtml::_('redshopselect.booleanlist', 'show_email_verification', 'class="form-control"', $this->config->get('SHOW_EMAIL_VERIFICATION')); + $lists['quantity_text_display'] = JHtml::_('redshopselect.booleanlist', 'quantity_text_display', 'class="form-control"', $this->config->get('QUANTITY_TEXT_DISPLAY')); + $lists['enable_sef_product_number'] = JHtml::_('redshopselect.booleanlist', 'enable_sef_product_number', 'class="form-control"', $this->config->get('ENABLE_SEF_PRODUCT_NUMBER')); + + $lists['enable_sef_number_name'] = JHtml::_('redshopselect.booleanlist', 'enable_sef_number_name', 'class="form-control"', $this->config->get('ENABLE_SEF_NUMBER_NAME'), 'COM_REDSHOP_NAME', 'COM_REDSHOP_ID'); + $lists['category_in_sef_url'] = JHtml::_('redshopselect.booleanlist', 'category_in_sef_url', 'class="form-control"', $this->config->get('CATEGORY_IN_SEF_URL')); + + $lists['autogenerated_seo'] = JHtml::_('redshopselect.booleanlist', 'autogenerated_seo', 'class="form-control"', $this->config->get('AUTOGENERATED_SEO')); + $lists['shop_country'] = JHtml::_('select.genericlist', $countries, 'shop_country', 'class="form-control" size="1" ', 'value', 'text', $this->config->get('SHOP_COUNTRY')); + $lists['default_shipping_country'] = JHtml::_('select.genericlist', $countries, 'default_shipping_country', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('DEFAULT_SHIPPING_COUNTRY') + ); + + // Default_shipping_country + $lists['show_shipping_in_cart'] = JHtml::_('redshopselect.booleanlist', 'show_shipping_in_cart', 'class="form-control"', $this->config->get('SHOW_SHIPPING_IN_CART')); + $lists['discount_mail_send'] = JHtml::_('redshopselect.booleanlist', 'discount_mail_send', 'class="form-control"', $this->config->get('DISCOUNT_MAIL_SEND')); + $lists['special_discount_mail_send'] = JHtml::_('redshopselect.booleanlist', 'special_discount_mail_send', 'class="form-control"', $this->config->get('SPECIAL_DISCOUNT_MAIL_SEND')); + $lists['economic_integration'] = JHtml::_('redshopselect.booleanlist', 'economic_integration', 'class="form-control"', $this->config->get('ECONOMIC_INTEGRATION')); + $discoupon_percent_or_total = array(JHtml::_('select.option', 0, JText::_('COM_REDSHOP_TOTAL')), + JHtml::_('select.option', 1, JText::_('COM_REDSHOP_PERCENTAGE')) + ); + $lists['discoupon_percent_or_total'] = JHtml::_('select.genericlist', $discoupon_percent_or_total, + 'discoupon_percent_or_total', 'class="form-control" size="1"', + 'value', 'text', $this->config->get('DISCOUPON_PERCENT_OR_TOTAL') + ); + $lists['use_stockroom'] = JHtml::_('redshopselect.booleanlist', 'use_stockroom', 'class="form-control" size="1"', $this->config->get('USE_STOCKROOM')); + $lists['use_blank_as_infinite'] = JHtml::_('redshopselect.booleanlist', 'use_blank_as_infinite', 'class="form-control" size="1"', $this->config->get('USE_BLANK_AS_INFINITE')); + + $lists['allow_pre_order'] = JHtml::_('redshopselect.booleanlist', 'allow_pre_order', 'class="form-control" size="1"', $this->config->get('ALLOW_PRE_ORDER')); + $lists['onestep_checkout_enable'] = JHtml::_('redshopselect.booleanlist', 'onestep_checkout_enable', 'class="form-control" size="1"', $this->config->get('ONESTEP_CHECKOUT_ENABLE')); + $lists['ssl_enable_in_checkout'] = JHtml::_('redshopselect.booleanlist', 'ssl_enable_in_checkout', 'class="form-control" size="1"', $this->config->get('SSL_ENABLE_IN_CHECKOUT')); + $lists['twoway_related_product'] = JHtml::_('redshopselect.booleanlist', 'twoway_related_product', 'class="form-control" size="1"', $this->config->get('TWOWAY_RELATED_PRODUCT')); + + // For child product opttion + $chilproduct_data = RedshopHelperUtility::getChildProductOption(); + $lists['childproduct_dropdown'] = JHtml::_('select.genericlist', $chilproduct_data, 'childproduct_dropdown', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('CHILDPRODUCT_DROPDOWN') + ); + $lists['purchase_parent_with_child'] = JHtml::_('redshopselect.booleanlist', 'purchase_parent_with_child', + 'class="form-control" size="1"', $this->config->get('PURCHASE_PARENT_WITH_CHILD') + ); + $lists['product_hover_image_enable'] = JHtml::_('redshopselect.booleanlist', 'product_hover_image_enable', + 'class="form-control" size="1"', $this->config->get('PRODUCT_HOVER_IMAGE_ENABLE') + ); + $lists['additional_hover_image_enable'] = JHtml::_('redshopselect.booleanlist', 'additional_hover_image_enable', + 'class="form-control" size="1"', $this->config->get('ADDITIONAL_HOVER_IMAGE_ENABLE') + ); + $lists['ssl_enable_in_backend'] = JHtml::_('redshopselect.booleanlist', 'ssl_enable_in_backend', 'class="form-control" size="1"', $this->config->get('SSL_ENABLE_IN_BACKEND')); + $lists['use_tax_exempt'] = JHtml::_('redshopselect.booleanlist', 'use_tax_exempt', 'class="form-control" size="1"', $this->config->get('USE_TAX_EXEMPT')); + $lists['tax_exempt_apply_vat'] = JHtml::_('redshopselect.booleanlist', 'tax_exempt_apply_vat', 'class="form-control" size="1"', $this->config->get('TAX_EXEMPT_APPLY_VAT')); + $lists['couponinfo'] = JHtml::_('redshopselect.booleanlist', 'couponinfo', 'class="form-control" size="1"', $this->config->get('COUPONINFO')); + $lists['my_tags'] = JHtml::_('redshopselect.booleanlist', 'my_tags', 'class="form-control" size="1"', $this->config->get('MY_TAGS')); + $lists['my_wishlist'] = JHtml::_('redshopselect.booleanlist', 'my_wishlist', 'class="form-control" size="1"', $this->config->get('MY_WISHLIST')); + $lists['compare_products'] = JHtml::_('redshopselect.booleanlist', 'compare_products', 'class="form-control" size="1"', $this->config->get('COMPARE_PRODUCTS')); + $lists['country_list'] = JHtml::_('select.genericlist', $countries, 'country_list[]', 'class="form-control" multiple="multiple" size="5"', + 'value', 'text', $country_list + ); + $lists['product_detail_is_lightbox'] = JHtml::_('redshopselect.booleanlist', 'product_detail_is_lightbox', + 'class="form-control" size="1"', $this->config->get('PRODUCT_DETAIL_IS_LIGHTBOX') + ); + $lists['new_customer_selection'] = JHtml::_('redshopselect.booleanlist', 'new_customer_selection', 'class="form-control" size="1"', $this->config->get('NEW_CUSTOMER_SELECTION')); + $lists['ajax_cart_box'] = JHtml::_('redshopselect.booleanlist', 'ajax_cart_box', 'class="form-control" size="1"', $this->config->get('AJAX_CART_BOX')); + $lists['is_product_reserve'] = JHtml::_('redshopselect.booleanlist', 'is_product_reserve', 'class="form-control" size="1"', $this->config->get('IS_PRODUCT_RESERVE')); + $lists['product_is_lightbox'] = JHtml::_('redshopselect.booleanlist', 'product_is_lightbox', 'class="form-control" size="1"', $this->config->get('PRODUCT_IS_LIGHTBOX')); + $lists['product_addimg_is_lightbox'] = JHtml::_('redshopselect.booleanlist', 'product_addimg_is_lightbox', + 'class="form-control" size="1"', $this->config->get('PRODUCT_ADDIMG_IS_LIGHTBOX') + ); + $lists['cat_is_lightbox'] = JHtml::_('redshopselect.booleanlist', 'cat_is_lightbox', 'class="form-control" size="1"', $this->config->get('CAT_IS_LIGHTBOX')); + $lists['default_stockroom'] = JHtml::_('select.genericlist', $stockroom, 'default_stockroom', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('DEFAULT_STOCKROOM') + ); + $lists['portalshop'] = JHtml::_('redshopselect.booleanlist', 'portal_shop', 'class="form-control" size="1"', $this->config->get('PORTAL_SHOP')); + + $imageSizeSwapping = array(); + $imageSizeSwapping[] = JHtml::_('select.option', 0, JText::_('COM_REDSHOP_CONFIG_NO_PROPORTIONAL_RESIZED')); + $imageSizeSwapping[] = JHtml::_('select.option', 1, JText::_('COM_REDSHOP_CONFIG_PROPORTIONAL_RESIZED')); + $imageSizeSwapping[] = JHtml::_('select.option', 2, JText::_('COM_REDSHOP_CONFIG_PROPORTIONAL_RESIZED_AND_CROP')); + $lists['use_image_size_swapping'] = JHtml::_('select.genericlist', $imageSizeSwapping, + 'use_image_size_swapping', 'class="form-control" size="1" ', + 'value', 'text', $this->config->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $lists['apply_vat_on_discount'] = JHtml::_('redshopselect.booleanlist', 'apply_vat_on_discount', 'class="form-control" size="1"', $this->config->get('APPLY_VAT_ON_DISCOUNT'), $yes = JText::_('COM_REDSHOP_BEFORE_DISCOUNT'), $no = JText::_('COM_REDSHOP_AFTER_DISCOUNT')); + $lists['auto_scroll_wrapper'] = JHtml::_('redshopselect.booleanlist', 'auto_scroll_wrapper', 'class="form-control" size="1"', $this->config->get('AUTO_SCROLL_WRAPPER')); + $lists['allow_multiple_discount'] = JHtml::_('redshopselect.booleanlist', 'allow_multiple_discount', 'class="form-control" size="1"', $this->config->get('ALLOW_MULTIPLE_DISCOUNT')); + $lists['show_product_detail'] = JHtml::_('redshopselect.booleanlist', 'show_product_detail', 'class="form-control" size="1"', $this->config->get('SHOW_PRODUCT_DETAIL')); + $lists['compare_template_id'] = JHtml::_('select.genericlist', $compare_template, 'compare_template_id', + 'class="form-control" size="1" ', 'id', 'name', $this->config->get('COMPARE_TEMPLATE_ID') + ); + + $lists['show_terms_and_conditions'] = JHtml::_('redshopselect.booleanlist', 'show_terms_and_conditions', + 'class="form-control" size="1"', $this->config->get('SHOW_TERMS_AND_CONDITIONS'), $yes = JText::_('COM_REDSHOP_SHOW_PER_USER'), + $no = JText::_('COM_REDSHOP_SHOW_PER_ORDER') + ); + + $lists['rating_review_login_required'] = JHtml::_('redshopselect.booleanlist', 'rating_review_login_required', + 'class="form-control" size="1"', $this->config->get('RATING_REVIEW_LOGIN_REQUIRED') + ); + + $product_comparison = array(); + $product_comparison[] = JHtml::_('select.option', '', JText::_('COM_REDSHOP_SELECT')); + $product_comparison[] = JHtml::_('select.option', 'category', JText::_('COM_REDSHOP_CATEGORY')); + $product_comparison[] = JHtml::_('select.option', 'global', JText::_('COM_REDSHOP_GLOBAL')); + + $lists['product_comparison_type'] = JHtml::_('select.genericlist', $product_comparison, 'product_comparison_type', + 'class="form-control" size="1"', 'value', 'text', $this->config->get('PRODUCT_COMPARISON_TYPE') + ); + $lists['newsletter_enable'] = JHtml::_('redshopselect.booleanlist', 'newsletter_enable', 'class="form-control" size="1"', $this->config->get('NEWSLETTER_ENABLE')); + $lists['newsletter_confirmation'] = JHtml::_('redshopselect.booleanlist', 'newsletter_confirmation', 'class="form-control" size="1"', $this->config->get('NEWSLETTER_CONFIRMATION')); + + $lists['watermark_category_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_category_image', + 'class="form-control" size="1"', $this->config->get('WATERMARK_CATEGORY_IMAGE') + ); + $lists['watermark_category_thumb_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_category_thumb_image', + 'class="form-control" size="1"', $this->config->get('WATERMARK_CATEGORY_THUMB_IMAGE') + ); + $lists['watermark_product_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_product_image', 'class="form-control" size="1"', $this->config->get('WATERMARK_PRODUCT_IMAGE')); + $lists['watermark_product_thumb_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_product_thumb_image', + 'class="form-control" size="1"', $this->config->get('WATERMARK_PRODUCT_THUMB_IMAGE') + ); + $lists['watermark_product_additional_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_product_additional_image', + 'class="form-control" size="1"', $this->config->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE') + ); + $lists['watermark_cart_thumb_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_cart_thumb_image', + 'class="form-control" size="1"', $this->config->get('WATERMARK_CART_THUMB_IMAGE') + ); + $lists['watermark_giftcart_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_giftcart_image', + 'class="form-control" size="1"', $this->config->get('WATERMARK_GIFTCART_IMAGE') + ); + $lists['watermark_giftcart_thumb_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_giftcart_thumb_image', + 'class="form-control" size="1"', $this->config->get('WATERMARK_GIFTCART_THUMB_IMAGE') + ); + $lists['watermark_manufacturer_thumb_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_manufacturer_thumb_image', + 'class="form-control" size="1"', $this->config->get('WATERMARK_MANUFACTURER_THUMB_IMAGE') + ); + $lists['watermark_manufacturer_image'] = JHtml::_('redshopselect.booleanlist', 'watermark_manufacturer_image', + 'class="form-control" size="1"', $this->config->get('WATERMARK_MANUFACTURER_IMAGE') + ); + $lists['clickatell_enable'] = JHtml::_('redshopselect.booleanlist', 'clickatell_enable', 'class="form-control" size="1"', $this->config->get('CLICKATELL_ENABLE')); + $lists['quotation_mode'] = JHtml::_('redshopselect.booleanlist', 'default_quotation_mode', 'class="form-control" size="1"', + $this->config->get('DEFAULT_QUOTATION_MODE_PRE'), $yes = JText::_('COM_REDSHOP_ON'), + $no = JText::_('COM_REDSHOP_OFF') + ); + $lists['wanttoshowattributeimage'] = JHtml::_('redshopselect.booleanlist', 'wanttoshowattributeimage', + 'class="form-control" size="1"', $this->config->get('WANT_TO_SHOW_ATTRIBUTE_IMAGE_INCART') + ); + $lists['show_quotation_price'] = JHtml::_('redshopselect.booleanlist', 'show_quotation_price', + 'class="form-control" size="1"', $this->config->get('SHOW_QUOTATION_PRICE') + ); + $lists['display_out_of_stock_attribute_data'] = JHtml::_('redshopselect.booleanlist', 'display_out_of_stock_attribute_data', + 'class="form-control"', $this->config->get('DISPLAY_OUT_OF_STOCK_ATTRIBUTE_DATA') + ); + + $lists['category_tree_in_sef_url'] = JHtml::_('redshopselect.booleanlist', 'category_tree_in_sef_url', 'class="form-control"', $this->config->get('CATEGORY_TREE_IN_SEF_URL')); + $lists['statistics_enable'] = JHtml::_('redshopselect.booleanlist', 'statistics_enable', 'class="form-control" size="1"', $this->config->get('STATISTICS_ENABLE')); + $orderstatus = $model->getOrderstatus(); + $tmp = array(); + $tmp[] = JHtml::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $orderstatus = array_merge($tmp, $orderstatus); + $lists['clickatell_order_status'] = JHtml::_('select.genericlist', $orderstatus, 'clickatell_order_status', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('CLICKATELL_ORDER_STATUS') + ); + + $menuitem = array(); + $menuitem[0] = new stdClass; + $menuitem[0]->value = 0; + $menuitem[0]->text = JText::_('COM_REDSHOP_SELECT'); + $q = "SELECT m.id,m.title AS name,mt.title FROM #__menu AS m " + . "LEFT JOIN #__menu_types AS mt ON mt.menutype=m.menutype " + . "WHERE m.published=1 " + . "ORDER BY m.menutype"; + $db->setQuery($q); + $menuitemlist = $db->loadObjectList(); + + for ($i = 0, $in = count($menuitemlist); $i < $in; $i++) + { + $menuitem[$i + 1] = new stdClass; + $menuitem[$i + 1]->value = $menuitemlist[$i]->id; + $menuitem[$i + 1]->text = $menuitemlist[$i]->name; + } + + $lists['url_after_portal_login'] = JHtml::_('select.genericlist', $menuitem, 'portal_login_itemid', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('PORTAL_LOGIN_ITEMID') + ); + $lists['url_after_portal_logout'] = JHtml::_('select.genericlist', $menuitem, 'portal_logout_itemid', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('PORTAL_LOGOUT_ITEMID') + ); + + $default_vat_group = $model->getVatGroup(); + $tmp = array(); + $tmp[] = JHtml::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $default_vat_group = array_merge($tmp, $default_vat_group); + + $tmp = array(); + $tmp[] = JHtml::_('select.option', '', JText::_('COM_REDSHOP_SELECT')); + $default_vat_country = array_merge($tmp, $countries); + + $default_customer_register_type = array(); + $default_customer_register_type[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_SELECT')); + $default_customer_register_type[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_PRIVATE')); + $default_customer_register_type[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_COMPANY')); + $lists['default_customer_register_type'] = JHtml::_('select.genericlist', $default_customer_register_type, + 'default_customer_register_type', 'class="form-control" ', 'value', 'text', $this->config->get('DEFAULT_CUSTOMER_REGISTER_TYPE') + ); + + $checkoutLoginRegisterSwitcher = array(); + $checkoutLoginRegisterSwitcher[] = JHtml::_('select.option', 'tabs', JText::_('COM_REDSHOP_CONFIG_TABS')); + $checkoutLoginRegisterSwitcher[] = JHtml::_('select.option', 'sliders', JText::_('COM_REDSHOP_CONFIG_SLIDERS')); + $lists['checkout_login_register_switcher'] = JHtml::_('select.genericlist', $checkoutLoginRegisterSwitcher, + 'checkout_login_register_switcher', 'class="form-control" ', 'value', 'text', $this->config->get('CHECKOUT_LOGIN_REGISTER_SWITCHER') + ); + + $addtocart_behaviour = array(); + $addtocart_behaviour[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_SELECT')); + $addtocart_behaviour[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_DIRECT_TO_CART')); + $addtocart_behaviour[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_STAY_ON_CURRENT_VIEW')); + $lists['addtocart_behaviour'] = JHtml::_('select.genericlist', $addtocart_behaviour, 'addtocart_behaviour', + 'class="form-control" ', 'value', 'text', $this->config->get('ADDTOCART_BEHAVIOUR') + ); + + $allow_customer_register_type = array(); + $allow_customer_register_type[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_BOTH')); + $allow_customer_register_type[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_PRIVATE')); + $allow_customer_register_type[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_COMPANY')); + $lists['allow_customer_register_type'] = JHtml::_('select.genericlist', $allow_customer_register_type, + 'allow_customer_register_type', 'class="form-control" ', 'value', 'text', + $this->config->get('ALLOW_CUSTOMER_REGISTER_TYPE') + ); + + // Optional shipping address select box + $lists['optional_shipping_address'] = JHtml::_('redshopselect.booleanlist', 'optional_shipping_address', 'class="form-control" ', $this->config->get('OPTIONAL_SHIPPING_ADDRESS')); + $lists['shipping_method_enable'] = JHtml::_('redshopselect.booleanlist', 'shipping_method_enable', 'class="form-control" ', $this->config->get('SHIPPING_METHOD_ENABLE')); + + $lists['default_vat_group'] = JHtml::_('select.genericlist', $default_vat_group, 'default_vat_group', + 'class="form-control" ', 'value', 'text', $this->config->get('DEFAULT_VAT_GROUP') + ); + + $vat_based_on = array(); + $vat_based_on[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_WEBSHOP_MODE')); + $vat_based_on[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_CUSTOMER_MODE')); + $vat_based_on[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_EU_MODE')); + $lists['vat_based_on'] = JHtml::_('select.genericlist', $vat_based_on, 'vat_based_on', 'class="form-control" ', 'value', 'text', $this->config->get('VAT_BASED_ON')); + + $lists['default_vat_country'] = JHtml::_('select.genericlist', $default_vat_country, 'default_vat_country', + 'class="form-control" onchange="changeStateList();"', 'value', 'text', $this->config->get('DEFAULT_VAT_COUNTRY') + ); + + $country_list_name = 'default_vat_country'; + $state_list_name = 'default_vat_state'; + $selected_country_code = $this->config->get('DEFAULT_VAT_COUNTRY'); + $selected_state_code = $this->config->get('DEFAULT_VAT_STATE'); + + if (empty($selected_state_code)) + { + $selected_state_code = "originalPos"; + } + else + { + $selected_state_code = "'" . $selected_state_code . "'"; + } + + $db->setQuery("SELECT c.id, c.country_3_code, s.state_name, s.state_2_code + FROM #__redshop_country c + LEFT JOIN #__redshop_state s + ON c.id=s.country_id OR s.country_id IS NULL + ORDER BY c.id, s.state_name" + ); + $states = $db->loadObjectList(); + + // Build the State lists for each Country + $script = ""; + $lists['default_vat_state'] = $script; + + $shopper_Group_private = $model->getShopperGroupPrivate(); + + $tmp = array(); + $tmp[] = JHtml::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $tmp = array_merge($tmp, $shopper_Group_private); + + $lists['shopper_group_default_private'] = JHtml::_('select.genericlist', $tmp, 'shopper_group_default_private', + 'class="form-control" ', 'value', 'text', $this->config->get('SHOPPER_GROUP_DEFAULT_PRIVATE') + ); + + $shopper_Group_company = $model->getShopperGroupCompany(); + $tmp = array(); + $tmp[] = JHtml::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $tmp = array_merge($tmp, $shopper_Group_company); + $lists['shopper_group_default_company'] = JHtml::_('select.genericlist', $tmp, 'shopper_group_default_company', + 'class="form-control" ', 'value', 'text', $this->config->get('SHOPPER_GROUP_DEFAULT_COMPANY') + ); + + $tmp = array(); + $tmp[] = JHtml::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $tmp = array_merge($tmp, $shopper_Group_private, $shopper_Group_company); + $lists['shopper_group_default_unregistered'] = JHtml::_('select.genericlist', $tmp, 'shopper_group_default_unregistered', + 'class="form-control" ', 'value', 'text', $this->config->get('SHOPPER_GROUP_DEFAULT_UNREGISTERED') + ); + + $register_methods = array(); + $register_methods[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_REGISTER_WITH_ACCOUNT_CREATION')); + $register_methods[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_REGISTER_WITHOUT_ACCOUNT_CREATION')); + $register_methods[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_REGISTER_ACCOUNT_OPTIONAL')); + $register_methods[] = JHtml::_('select.option', '3', JText::_('COM_REDSHOP_REGISTER_ACCOUNT_SILENT')); + $lists['register_method'] = JHtml::_('select.genericlist', $register_methods, 'register_method', + 'class="form-control" id="register_method"', 'value', 'text', $this->config->get('REGISTER_METHOD') + ); + + $lists['product_template'] = JHtml::_('select.genericlist', $product_template, 'default_product_template', + 'class="form-control" size="1" ', 'id', 'name', $this->config->get('PRODUCT_TEMPLATE') + ); + $lists['ajax_detail_template'] = JHtml::_('select.genericlist', $ajax_detail_template, 'default_ajax_detailbox_template', + 'class="form-control" size="1" ', 'id', 'name', $this->config->get('DEFAULT_AJAX_DETAILBOX_TEMPLATE') + ); + $lists['category_template'] = JHtml::_('select.genericlist', $category_template, 'default_category_template', + 'class="form-control" size="1" ', 'id', 'name', $this->config->get('CATEGORY_TEMPLATE') + ); + $lists['default_categorylist_template'] = JHtml::_('select.genericlist', $categorylist_template, 'default_categorylist_template', + 'class="form-control" size="1" ', 'id', 'name', $this->config->get('DEFAULT_CATEGORYLIST_TEMPLATE') + ); + $lists['manufacturer_template'] = JHtml::_('select.genericlist', $manufacturer_template, 'default_manufacturer_template', + 'class="form-control" size="1" ', 'id', 'name', $this->config->get('MANUFACTURER_TEMPLATE') + ); + $lists['show_price'] = JHtml::_('redshopselect.booleanlist', 'show_price', 'class="form-control" size="1"', $this->config->get('SHOW_PRICE_PRE')); + + $lists['use_as_catalog'] = JHtml::_('redshopselect.booleanlist', 'use_as_catalog', 'class="form-control" size="1"', $this->config->get('PRE_USE_AS_CATALOG', 0)); + $lists['show_tax_exempt_infront'] = JHtml::_('redshopselect.booleanlist', 'show_tax_exempt_infront', + 'class="form-control" size="1"', $this->config->get('SHOW_TAX_EXEMPT_INFRONT') + ); + $lists['individual_add_to_cart_enable'] = JHtml::_('redshopselect.booleanlist', 'individual_add_to_cart_enable', + 'class="form-control" size="1"', $this->config->get('INDIVIDUAL_ADD_TO_CART_ENABLE'), + JText::_('COM_REDSHOP_INDIVIDUAL_ADD_TO_CART_PER_PROPERTY'), + JText::_('COM_REDSHOP_ADD_TO_CART_PER_PRODUCT') + ); + $lists['accessory_as_product_in_cart_enable'] = JHtml::_('redshopselect.booleanlist', 'accessory_as_product_in_cart_enable', + 'class="form-control" size="1"', $this->config->get('ACCESSORY_AS_PRODUCT_IN_CART_ENABLE') + ); + $lists['use_product_outofstock_image'] = JHtml::_('redshopselect.booleanlist', 'use_product_outofstock_image', + 'class="form-control" size="1"', $this->config->get('USE_PRODUCT_OUTOFSTOCK_IMAGE') + ); + $lists['enable_address_detail_in_shipping'] = JHtml::_('redshopselect.booleanlist', 'enable_address_detail_in_shipping', + 'class="form-control" size="1"', $this->config->get('ENABLE_ADDRESS_DETAIL_IN_SHIPPING') + ); + + $lists['send_mail_to_customer'] = JHtml::_('redshopselect.booleanlist', 'send_mail_to_customer', 'class="form-control" size="1"', $this->config->get('SEND_MAIL_TO_CUSTOMER')); + + $bookinvoice = array(); + $bookinvoice[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_DIRECTLY_BOOK')); + $bookinvoice[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_MANUALLY_BOOK')); + $bookinvoice[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_BOOK_ON_ORDER_STATUS')); + $lists['economic_invoice_draft'] = JHtml::_('select.genericlist', $bookinvoice, 'economic_invoice_draft', + 'class="form-control"', 'value', 'text', + $this->config->get('ECONOMIC_INVOICE_DRAFT') + ); + + $bookInvoiceNumbers = array( + JHtml::_('select.option', '0', JText::_('COM_REDSHOP_SAME_AS_ORDER_NUMBER')), + JHtml::_('select.option', '1', JText::_('COM_REDSHOP_SEQUENTIALLY_IN_ECONOMIC_NO_MATCH_UP_WITH_ORDER_NUMBER')) + ); + $lists['economic_book_invoice_number'] = JHtml::_('select.genericlist', $bookInvoiceNumbers, 'economic_book_invoice_number', + 'class="form-control"', 'value', 'text', + $this->config->get('ECONOMIC_BOOK_INVOICE_NUMBER') + ); + + // NEXT-PREVIOUS LINK + $link_type = array(); + $link_type[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_DEFAULT_LINK')); + $link_type[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_CUSTOM_LINK')); + $link_type[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_IMAGE_LINK')); + $lists['next_previous_link'] = JHtml::_('select.genericlist', $link_type, 'next_previous_link', + 'class="form-control" ', 'value', 'text', $this->config->get('DEFAULT_LINK_FIND') + ); + + $order_data = RedshopHelperUtility::getOrderByList(); + $lists['default_product_ordering_method'] = JHtml::_('select.genericlist', $order_data, 'default_product_ordering_method', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('DEFAULT_PRODUCT_ORDERING_METHOD') + ); + $lists['default_manufacturer_product_ordering_method'] = JHtml::_('select.genericlist', $order_data, + 'default_manufacturer_product_ordering_method', 'class="form-control" size="1" ', 'value', + 'text', $this->config->get('DEFAULT_MANUFACTURER_PRODUCT_ORDERING_METHOD') + ); + + $order_data = RedshopHelperUtility::getRelatedOrderByList(); + $lists['default_related_ordering_method'] = JHtml::_('select.genericlist', $order_data, 'default_related_ordering_method', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('DEFAULT_RELATED_ORDERING_METHOD') + ); + $order_data = RedshopHelperUtility::getAccessoryOrderByList(); + $lists['default_accessory_ordering_method'] = JHtml::_('select.genericlist', $order_data, 'default_accessory_ordering_method', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('DEFAULT_ACCESSORY_ORDERING_METHOD') + ); + + $lists['shipping_after'] = RedshopHelperExtrafields::rsBooleanList( + 'shipping_after', + 'class="form-control"', + $this->config->get('SHIPPING_AFTER', 'total'), + JText::_('COM_REDSHOP_TOTAL'), + JText::_('COM_REDSHOP_SUBTOTAL_LBL'), + false, + 'total', + 'subtotal' + ); + + $lists['payment_calculation_on'] = RedshopHelperExtrafields::rsBooleanList( + 'payment_calculation_on', + 'class="form-control"', + $this->config->get('PAYMENT_CALCULATION_ON', 'total'), + JText::_('COM_REDSHOP_TOTAL'), + JText::_('COM_REDSHOP_SUBTOTAL_LBL'), + false, + 'total', + 'subtotal' + ); + + $lists['calculate_vat_on'] = RedshopHelperExtrafields::rsBooleanList( + 'calculate_vat_on', + 'class="form-control"', + $this->config->get('CALCULATE_VAT_ON', 'BT'), + JText::_('COM_REDSHOP_BILLING_ADDRESS_LBL'), + JText::_('COM_REDSHOP_SHIPPING_ADDRESS_LBL'), + false, + 'BT', + 'ST' + ); + + $order_data = array(); + $order_data[0] = new stdClass; + $order_data[0]->value = "c.name ASC"; + $order_data[0]->text = JText::_('COM_REDSHOP_CATEGORY_NAME'); + + $order_data[1] = new stdClass; + $order_data[1]->value = "c.id DESC"; + $order_data[1]->text = JText::_('COM_REDSHOP_NEWEST'); + + $order_data[2] = new stdClass; + $order_data[2]->value = "c.ordering ASC"; + $order_data[2]->text = JText::_('COM_REDSHOP_ORDERING'); + + $lists['default_category_ordering_method'] = JHtml::_('select.genericlist', $order_data, 'default_category_ordering_method', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('DEFAULT_CATEGORY_ORDERING_METHOD') + ); + + $order_data = RedshopHelperUtility::getManufacturerOrderByList(); + $lists['default_manufacturer_ordering_method'] = JHtml::_('select.genericlist', $order_data, 'default_manufacturer_ordering_method', + 'class="form-control" size="1" ', 'value', 'text', $this->config->get('DEFAULT_MANUFACTURER_ORDERING_METHOD') + ); + + $symbol_position = array(); + $symbol_position[0] = new stdClass; + $symbol_position[0]->value = " "; + $symbol_position[0]->text = JText::_('COM_REDSHOP_SELECT'); + + $symbol_position[1] = new stdClass; + $symbol_position[1]->value = "front"; + $symbol_position[1]->text = JText::_('COM_REDSHOP_FRONT'); + + $symbol_position[2] = new stdClass; + $symbol_position[2]->value = "behind"; + $symbol_position[2]->text = JText::_('COM_REDSHOP_BEHIND'); + + $symbol_position[3] = new stdClass; + $symbol_position[3]->value = "none"; + $symbol_position[3]->text = JText::_('COM_REDSHOP_NONE'); + + $lists['currency_symbol_position'] = JHtml::_('select.genericlist', $symbol_position, 'currency_symbol_position', + 'class="form-control" ', 'value', 'text', $this->config->get('CURRENCY_SYMBOL_POSITION') + ); + + $optionsDateformat = RedshopHelperDatetime::getDateFormat(); + $selectedDateformat = $this->config->get('DEFAULT_DATEFORMAT'); + + if ((string) $selectedDateformat === '0') + { + $selectedDateformat = 'Y-m-d'; + } + + $lists['default_dateformat'] = JHtml::_('select.genericlist', $optionsDateformat, 'default_dateformat', + 'class="form-control" ', 'value', 'text', $selectedDateformat + ); + + $lists['discount_enable'] = JHtml::_('redshopselect.booleanlist', 'discount_enable', 'class="form-control" ', $this->config->get('DISCOUNT_ENABLE')); + $lists['invoice_mail_enable'] = JHtml::_('redshopselect.booleanlist', 'invoice_mail_enable', 'class="form-control"', $this->config->get('INVOICE_MAIL_ENABLE')); + $lists['wishlist_login_required'] = JHtml::_('redshopselect.booleanlist', 'wishlist_login_required', 'class="form-control"', $this->config->get('WISHLIST_LOGIN_REQUIRED')); + $lists['wishlist_list'] = JHtml::_('redshopselect.booleanlist', 'wishlist_list', 'class="form-control"', $this->config->get('WISHLIST_LIST')); + + // Product general + $lists['product_default_category'] = JHtml::_('redshopselect.booleanlist', 'product_default_category', 'class="form-control" size="1"', $this->config->get('PRODUCT_DEFAULT_CATEGORY')); + + $invoice_mail_send_option = array(); + $invoice_mail_send_option[0] = new stdClass; + $invoice_mail_send_option[0]->value = 0; + $invoice_mail_send_option[0]->text = JText::_('COM_REDSHOP_NONE'); + + $invoice_mail_send_option[1] = new stdClass; + $invoice_mail_send_option[1]->value = 1; + $invoice_mail_send_option[1]->text = JText::_('COM_REDSHOP_ADMINISTRATOR'); + + $invoice_mail_send_option[2] = new stdClass; + $invoice_mail_send_option[2]->value = 2; + $invoice_mail_send_option[2]->text = JText::_('COM_REDSHOP_CUSTOMER'); + + $invoice_mail_send_option[3] = new stdClass; + $invoice_mail_send_option[3]->value = 3; + $invoice_mail_send_option[3]->text = JText::_('COM_REDSHOP_BOTH'); + + $lists['invoice_mail_send_option'] = JHtml::_( + 'redshopselect.radiolist', + $invoice_mail_send_option, + 'invoice_mail_send_option', + '', + 'value', + 'text', + $this->config->get('INVOICE_MAIL_SEND_OPTION') + ); + + $order_mail_after = array(); + $order_mail_after[0] = new stdClass; + $order_mail_after[0]->value = 0; + $order_mail_after[0]->text = JText::_('COM_REDSHOP_ORDER_MAIL_BEFORE_PAYMENT'); + + $order_mail_after[1] = new stdClass; + $order_mail_after[1]->value = 1; + $order_mail_after[1]->text = JText::_('COM_REDSHOP_ORDER_MAIL_AFTER_PAYMENT_BUT_SEND_BEFORE_ADMINISTRATOR'); + + $order_mail_after[2] = new stdClass; + $order_mail_after[2]->value = 2; + $order_mail_after[2]->text = JText::_('COM_REDSHOP_ORDER_MAIL_AFTER_PAYMENT'); + + $lists['order_mail_after'] = JHtml::_( + 'select.genericlist', + $order_mail_after, + 'order_mail_after', + ' class="form-control"', + 'value', + 'text', + $this->config->get('ORDER_MAIL_AFTER') + ); + + $discount_type = array(); + $discount_type[0] = new stdClass; + $discount_type[0]->value = 0; + $discount_type[0]->text = JText::_('COM_REDSHOP_SELECT'); + + $discount_type[1] = new stdClass; + $discount_type[1]->value = 1; + $discount_type[1]->text = JText::_('COM_REDSHOP_DISCOUNT_OR_VOUCHER_OR_COUPON'); + + $discount_type[2] = new stdClass; + $discount_type[2]->value = 2; + $discount_type[2]->text = JText::_('COM_REDSHOP_DISCOUNT_VOUCHER_OR_COUPON'); + + $discount_type[3] = new stdClass; + $discount_type[3]->value = 3; + $discount_type[3]->text = JText::_('COM_REDSHOP_DISCOUNT_VOUCHER_COUPON'); + + $discount_type[4] = new stdClass; + $discount_type[4]->value = 4; + $discount_type[4]->text = JText::_('COM_REDSHOP_DISCOUNT_VOUCHER_COUPON_MULTIPLE'); + + $lists['discount_type'] = JHtml::_('select.genericlist', $discount_type, 'discount_type', + 'class="form-control" ', 'value', 'text', $this->config->get('DISCOUNT_TYPE') + ); + + /* + * Measurement select boxes + */ + $option = array(); + $option[0] = new stdClass; + $option[0]->value = 0; + $option[0]->text = JText::_('COM_REDSHOP_SELECT'); + + $option[1] = new stdClass; + $option[1]->value = 'mm'; + $option[1]->text = JText::_('COM_REDSHOP_MILLIMETER'); + + $option[2] = new stdClass; + $option[2]->value = 'cm'; + $option[2]->text = JText::_('COM_REDSHOP_CENTIMETERS'); + + $option[3] = new stdClass; + $option[3]->value = 'inch'; + $option[3]->text = JText::_('COM_REDSHOP_INCHES'); + + $option[4] = new stdClass; + $option[4]->value = 'feet'; + $option[4]->text = JText::_('COM_REDSHOP_FEET'); + + $option[5] = new stdClass; + $option[5]->value = 'm'; + $option[5]->text = JText::_('COM_REDSHOP_METER'); + + $option[5] = new stdClass; + $option[5]->value = 'l'; + $option[5]->text = JText::_('COM_REDSHOP_LITER'); + + $option[5] = new stdClass; + $option[5]->value = 'ml'; + $option[5]->text = JText::_('COM_REDSHOP_MILLILITER'); + + $lists['default_volume_unit'] = JHtml::_('select.genericlist', $option, 'default_volume_unit', + 'class="form-control" ', 'value', 'text', $this->config->get('DEFAULT_VOLUME_UNIT') + ); + unset($option); + + $option = array(); + $option[0] = new stdClass; + $option[0]->value = 0; + $option[0]->text = JText::_('COM_REDSHOP_SELECT'); + + $option[1] = new stdClass; + $option[1]->value = 'gram'; + $option[1]->text = JText::_('COM_REDSHOP_GRAM'); + + $option[2] = new stdClass; + $option[2]->value = 'pounds'; + $option[2]->text = JText::_('COM_REDSHOP_POUNDS'); + + $option[3] = new stdClass; + $option[3]->value = 'kg'; + $option[3]->text = JText::_('COM_REDSHOP_KG'); + + $lists['default_weight_unit'] = JHtml::_('select.genericlist', $option, 'default_weight_unit', + 'class="form-control" ', 'value', 'text', $this->config->get('DEFAULT_WEIGHT_UNIT') + ); + unset($option); + + $lists['postdk_integration'] = JHtml::_('redshopselect.booleanlist', 'postdk_integration', 'class="form-control" size="1"', $this->config->get('POSTDK_INTEGRATION')); + $lists['send_catalog_reminder_mail'] = JHtml::_('redshopselect.booleanlist', 'send_catalog_reminder_mail', 'class="form-control" size="1"', $this->config->get('SEND_CATALOG_REMINDER_MAIL')); + + $lists['load_redshop_style'] = JHtml::_('redshopselect.booleanlist', 'load_redshop_style', 'class="form-control" size="1"', $this->config->get('LOAD_REDSHOP_STYLE')); + + $lists['enable_stockroom_notification'] = JHtml::_('redshopselect.booleanlist', 'enable_stockroom_notification', 'class="form-control" size="1"', $this->config->get('ENABLE_STOCKROOM_NOTIFICATION')); + + $lists['inline_editing'] = JHtml::_( + 'redshopselect.booleanlist', 'inline_editing', 'class="form-control" size="1"', $this->config->get('INLINE_EDITING') + ); + + $lists['currency_libraries'] = JHtml::_('redshopselect.booleanlist', 'currency_libraries', + 'class="form-control" size="1"', $this->config->get('CURRENCY_LIBRARIES'), $yes = JText::_('COM_REDSHOP_CURRENCY_LIBRARIES_LAYER'), + $no = JText::_('COM_REDSHOP_CURRENCY_LIBRARIES_ECB') + ); + + $current_version = $model->getcurrentversion(); + $getinstalledmodule = $model->getinstalledmodule(); + $getinstalledplugins = $model->getinstalledplugins(); + $getinstalledshipping = $model->getinstalledplugins('redshop_shipping'); + + $db_version = $db->getVersion(); + $php_version = phpversion(); + $server = $this->get_server_software(); + $gd_check = extension_loaded('gd'); + $mb_check = extension_loaded('mbstring'); + + $this->server = $server; + $this->php_version = $php_version; + $this->db_version = $db_version; + $this->gd_check = $gd_check; + $this->mb_check = $mb_check; + $this->getinstalledmodule = $getinstalledmodule; + $this->getinstalledplugins = $getinstalledplugins; + $this->getinstalledshipping = $getinstalledshipping; + $this->current_version = $current_version; + $this->lists = $lists; + $this->request_url = JUri::getInstance()->toString(); + $this->tabmenu = $this->getTabMenu(); + + parent::display($tpl); + } + + public function get_server_software() + { + if (isset($_SERVER['SERVER_SOFTWARE'])) + { + return $_SERVER['SERVER_SOFTWARE']; + } + elseif ($sf = getenv('SERVER_SOFTWARE')) + { + return $sf; + } + else + { + return JText::_('COM_REDSHOP_N_A'); + } + } + + + /** + * Tab Menu + * + * @return object Tab menu + * + * @since 1.7 + */ + private function getTabMenu() + { + $app = JFactory::getApplication(); + $selectedTabPosition = $app->getUserState('com_redshop.configuration.selectedTabPosition', 'general'); + + $tabMenu = RedshopAdminMenu::getInstance()->init(); + $tabMenu->section('tab') + ->title('COM_REDSHOP_GENERAL_CONFIGURATION') + ->addItem( + '#general', + 'COM_REDSHOP_GENERAL_CONFIGURATION', + ($selectedTabPosition == 'general') ? true : false, + 'general' + )->addItem( + '#user', + 'COM_REDSHOP_USER', + ($selectedTabPosition == 'user') ? true : false, + 'user' + )->addItem( + '#cattab', + 'COM_REDSHOP_CATEGORY_TAB', + ($selectedTabPosition == 'cattab') ? true : false, + 'cattab' + )->addItem( + '#manufacturertab', + 'COM_REDSHOP_REDMANUFACTURER_TAB', + ($selectedTabPosition == 'manufacturertab') ? true : false, + 'manufacturertab' + )->addItem( + '#producttab', + 'COM_REDSHOP_PRODUCT_TAB', + ($selectedTabPosition == 'producttab') ? true : false, + 'producttab' + )->addItem( + '#featuretab', + 'COM_REDSHOP_FEATURE_TAB', + ($selectedTabPosition == 'featuretab') ? true : false, + 'featuretab' + )->addItem( + '#pricetab', + 'COM_REDSHOP_PRICE_TAB', + ($selectedTabPosition == 'pricetab') ? true : false, + 'pricetab' + )->addItem( + '#carttab', + 'COM_REDSHOP_CART_TAB', + ($selectedTabPosition == 'carttab') ? true : false, + 'carttab' + )->addItem( + '#ordertab', + 'COM_REDSHOP_ORDER_TAB', + ($selectedTabPosition == 'ordertab') ? true : false, + 'ordertab' + )->addItem( + '#newslettertab', + 'COM_REDSHOP_NEWSLETTER_TAB', + ($selectedTabPosition == 'newslettertab') ? true : false, + 'newslettertab' + )->addItem( + '#integration', + 'COM_REDSHOP_INTEGRATION', + ($selectedTabPosition == 'integration') ? true : false, + 'integration' + )->addItem( + '#seo', + 'COM_REDSHOP_SEO', + ($selectedTabPosition == 'seo') ? true : false, + 'seo' + )->addItem( + '#dashboard', + 'COM_REDSHOP_DASHBOARD', + ($selectedTabPosition == 'dashboard') ? true : false, + 'dashboard' + )->addItem( + '#redshopabout', + 'COM_REDSHOP_ABOUT', + ($selectedTabPosition == 'redshopabout') ? true : false, + 'redshopabout' + ); + + return $tabMenu; + } +} diff --git a/component/admin/views/countries/index.html b/component/admin/views/countries/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/countries/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/countries/tmpl/default.php b/component/admin/views/countries/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/countries/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/countries/tmpl/index.html b/component/admin/views/countries/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/countries/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/countries/view.html.php b/component/admin/views/countries/view.html.php new file mode 100644 index 00000000000..8d3e9904263 --- /dev/null +++ b/component/admin/views/countries/view.html.php @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/component/admin/views/country/tmpl/edit.php b/component/admin/views/country/tmpl/edit.php new file mode 100644 index 00000000000..4c5b3166d2a --- /dev/null +++ b/component/admin/views/country/tmpl/edit.php @@ -0,0 +1,11 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/country/tmpl/index.html b/component/admin/views/country/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/country/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/country/view.html.php b/component/admin/views/country/view.html.php new file mode 100644 index 00000000000..82457d17431 --- /dev/null +++ b/component/admin/views/country/view.html.php @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/component/admin/views/coupon/tmpl/edit.php b/component/admin/views/coupon/tmpl/edit.php new file mode 100644 index 00000000000..19142b9be30 --- /dev/null +++ b/component/admin/views/coupon/tmpl/edit.php @@ -0,0 +1,12 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/coupon/tmpl/index.html b/component/admin/views/coupon/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/coupon/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/coupon/view.html.php b/component/admin/views/coupon/view.html.php new file mode 100644 index 00000000000..1064f7074b1 --- /dev/null +++ b/component/admin/views/coupon/view.html.php @@ -0,0 +1,53 @@ +item = $this->model->getItem(); + $this->form = $this->model->getForm(); + + $this->form->setField( + new SimpleXMLElement( + '' + . '' + ), + null, + true, + 'details' + ); + + $this->checkPermission(); + $this->loadFields(); + } +} diff --git a/component/admin/views/coupons/index.html b/component/admin/views/coupons/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/coupons/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/coupons/tmpl/default.php b/component/admin/views/coupons/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/coupons/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/coupons/tmpl/index.html b/component/admin/views/coupons/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/coupons/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/coupons/view.html.php b/component/admin/views/coupons/view.html.php new file mode 100644 index 00000000000..32570513f09 --- /dev/null +++ b/component/admin/views/coupons/view.html.php @@ -0,0 +1,76 @@ +checked_out && JFactory::getUser()->id != $row->checked_out; + $isInline = Redshop::getConfig()->getBool('INLINE_EDITING'); + $value = $row->{$config['dataCol']}; + + switch ($config['dataCol']) + { + case 'type': + return !$value ? '' . JText::_('COM_REDSHOP_COUPON_TYPE_OPTION_TOTAL') . '' + : '' . JText::_('COM_REDSHOP_COUPON_TYPE_OPTION_PERCENTAGE') . ''; + + case 'effect': + return !$value ? '' . JText::_('COM_REDSHOP_COUPON_EFFECT_OPTION_GLOBAL') . '' + : '' . JText::_('COM_REDSHOP_COUPON_EFFECT_OPTION_USER') . ''; + + case 'value': + if (!$isCheckedOut && $isInline && $this->canEdit && $config['inline'] === true) + { + $display = !$row->type ? RedshopHelperProductPrice::formattedPrice($value) : $value . '%'; + + return JHtml::_('redshopgrid.inline', $config['dataCol'], $value, $display, $row->id, 'number'); + } + + return !$row->type ? RedshopHelperProductPrice::formattedPrice($value) : $value . '%'; + + case 'start_date': + case 'end_date': + if ($value === '0000-00-00 00:00:00') + { + return ''; + } + + $tz = new \DateTimeZone(\JFactory::getConfig()->get('offset')); + $date = date_create_from_format('Y-m-d H:i:s', $value, new \DateTimeZone('UTC')); + + return $date->setTimezone($tz)->format(Redshop::getConfig()->get('DEFAULT_DATEFORMAT', 'd-m-Y')); + + default: + return parent::onRenderColumn($config, $index, $row); + } + } +} diff --git a/component/admin/views/currencies/index.html b/component/admin/views/currencies/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/currencies/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/currencies/tmpl/default.php b/component/admin/views/currencies/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/currencies/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/currencies/tmpl/index.html b/component/admin/views/currencies/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/currencies/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/currencies/view.html.php b/component/admin/views/currencies/view.html.php new file mode 100644 index 00000000000..40eba16272b --- /dev/null +++ b/component/admin/views/currencies/view.html.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/component/admin/views/currency/tmpl/edit.php b/component/admin/views/currency/tmpl/edit.php new file mode 100644 index 00000000000..19142b9be30 --- /dev/null +++ b/component/admin/views/currency/tmpl/edit.php @@ -0,0 +1,12 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/currency/tmpl/index.html b/component/admin/views/currency/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/currency/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/currency/view.html.php b/component/admin/views/currency/view.html.php new file mode 100644 index 00000000000..e751ce6642e --- /dev/null +++ b/component/admin/views/currency/view.html.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/component/admin/views/discount/tmpl/edit.php b/component/admin/views/discount/tmpl/edit.php new file mode 100644 index 00000000000..19142b9be30 --- /dev/null +++ b/component/admin/views/discount/tmpl/edit.php @@ -0,0 +1,12 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/discount/tmpl/index.html b/component/admin/views/discount/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/discount/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/discount/view.html.php b/component/admin/views/discount/view.html.php new file mode 100644 index 00000000000..f257312b8d1 --- /dev/null +++ b/component/admin/views/discount/view.html.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/component/admin/views/discount_product/tmpl/edit.php b/component/admin/views/discount_product/tmpl/edit.php new file mode 100644 index 00000000000..19142b9be30 --- /dev/null +++ b/component/admin/views/discount_product/tmpl/edit.php @@ -0,0 +1,12 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/discount_product/tmpl/index.html b/component/admin/views/discount_product/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/discount_product/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/discount_product/view.html.php b/component/admin/views/discount_product/view.html.php new file mode 100644 index 00000000000..8e1faad1c43 --- /dev/null +++ b/component/admin/views/discount_product/view.html.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/component/admin/views/discount_products/tmpl/default.php b/component/admin/views/discount_products/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/discount_products/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/discount_products/tmpl/index.html b/component/admin/views/discount_products/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/discount_products/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/discount_products/view.html.php b/component/admin/views/discount_products/view.html.php new file mode 100644 index 00000000000..f661af84423 --- /dev/null +++ b/component/admin/views/discount_products/view.html.php @@ -0,0 +1,93 @@ +getBool('INLINE_EDITING'); + $value = $row->{$config['dataCol']}; + + switch ($config['dataCol']) + { + case 'amount': + if ($isInline && $this->canEdit && $config['inline'] === true) + { + $display = RedshopHelperProductPrice::formattedPrice($value); + + return JHtml::_('redshopgrid.inline', $config['dataCol'], $value, $display, $row->{$this->getPrimaryKey()}, 'number'); + } + + return RedshopHelperProductPrice::formattedPrice($value); + + case 'discount_amount': + if ($isInline && $this->canEdit && $config['inline'] === true) + { + $display = !$row->discount_type ? RedshopHelperProductPrice::formattedPrice($value) : $value . ' %'; + + return JHtml::_('redshopgrid.inline', $config['dataCol'], $value, $display, $row->{$this->getPrimaryKey()}, 'number'); + } + + return !$row->discount_type ? RedshopHelperProductPrice::formattedPrice($value) : $value . ' %'; + + case 'condition': + if ($value == 1) + { + return '' . JText::_('COM_REDSHOP_DISCOUNT_CONDITION_OPTION_LOWER') . ''; + } + elseif ($value == 2) + { + return '' . JText::_('COM_REDSHOP_DISCOUNT_CONDITION_OPTION_EQUAL') . ''; + } + + return '' . JText::_('COM_REDSHOP_DISCOUNT_CONDITION_OPTION_HIGHER') . ''; + + case 'discount_type': + return !$value ? '' . JText::_('COM_REDSHOP_DISCOUNT_DISCOUNT_TYPE_OPTION_TOTAL') . '' + : '' . JText::_('COM_REDSHOP_DISCOUNT_DISCOUNT_TYPE_OPTION_PERCENTAGE') . ''; + + case 'start_date': + case 'end_date': + if (empty($value)) + { + return ''; + } + + $tz = new \DateTimeZone(\JFactory::getConfig()->get('offset')); + + return date_create_from_format('U', $value)->setTimezone($tz)->format(Redshop::getConfig()->get('DEFAULT_DATEFORMAT', 'd-m-Y')); + + default: + return parent::onRenderColumn($config, $index, $row); + } + } +} diff --git a/component/admin/views/discounts/index.html b/component/admin/views/discounts/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/discounts/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/discounts/tmpl/default.php b/component/admin/views/discounts/tmpl/default.php new file mode 100644 index 00000000000..8653f53e7d4 --- /dev/null +++ b/component/admin/views/discounts/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/discounts/tmpl/index.html b/component/admin/views/discounts/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/discounts/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/discounts/view.html.php b/component/admin/views/discounts/view.html.php new file mode 100644 index 00000000000..d012da188e0 --- /dev/null +++ b/component/admin/views/discounts/view.html.php @@ -0,0 +1,93 @@ +getBool('INLINE_EDITING'); + $value = $row->{$config['dataCol']}; + + switch ($config['dataCol']) + { + case 'amount': + if ($isInline && $this->canEdit && $config['inline'] === true) + { + $display = RedshopHelperProductPrice::formattedPrice($value); + + return JHtml::_('redshopgrid.inline', $config['dataCol'], $value, $display, $row->{$this->getPrimaryKey()}, 'number'); + } + + return RedshopHelperProductPrice::formattedPrice($value); + + case 'discount_amount': + if ($isInline && $this->canEdit && $config['inline'] === true) + { + $display = !$row->discount_type ? RedshopHelperProductPrice::formattedPrice($value) : $value . ' %'; + + return JHtml::_('redshopgrid.inline', $config['dataCol'], $value, $display, $row->{$this->getPrimaryKey()}, 'number'); + } + + return !$row->discount_type ? RedshopHelperProductPrice::formattedPrice($value) : $value . ' %'; + + case 'condition': + if ($value == 1) + { + return '' . JText::_('COM_REDSHOP_DISCOUNT_CONDITION_OPTION_LOWER') . ''; + } + elseif ($value == 2) + { + return '' . JText::_('COM_REDSHOP_DISCOUNT_CONDITION_OPTION_EQUAL') . ''; + } + + return '' . JText::_('COM_REDSHOP_DISCOUNT_CONDITION_OPTION_HIGHER') . ''; + + case 'discount_type': + return !$value ? '' . JText::_('COM_REDSHOP_DISCOUNT_DISCOUNT_TYPE_OPTION_TOTAL') . '' + : '' . JText::_('COM_REDSHOP_DISCOUNT_DISCOUNT_TYPE_OPTION_PERCENTAGE') . ''; + + case 'start_date': + case 'end_date': + if (empty($value)) + { + return ''; + } + + $tz = new \DateTimeZone(\JFactory::getConfig()->get('offset')); + + return date_create_from_format('U', $value)->setTimezone($tz)->format(Redshop::getConfig()->get('DEFAULT_DATEFORMAT', 'd-m-Y')); + + default: + return parent::onRenderColumn($config, $index, $row); + } + } +} diff --git a/component/admin/views/export/index.html b/component/admin/views/export/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/export/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/export/tmpl/default.php b/component/admin/views/export/tmpl/default.php new file mode 100755 index 00000000000..5a20b2349db --- /dev/null +++ b/component/admin/views/export/tmpl/default.php @@ -0,0 +1,220 @@ + + +exports)): ?> +
    + × +

    + +

    +
    +

    +
    +
    + + + + + +
    +
    +
    + +
    +
    +

    + +

    +
    +
    + exports as $export): ?> + + +
    +
    + +
    +
    + +
    +
    +

    + +

    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +

    + +

    +
    +
    +
    +
    +
    + 0% +
    +
    +
    +
    +

    +
    +
    + +
    +
    +
    +
    + +
    +
    + + + + + +
    + diff --git a/component/admin/views/export/tmpl/index.html b/component/admin/views/export/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/export/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/export/view.html.php b/component/admin/views/export/view.html.php new file mode 100644 index 00000000000..fe2d05e9d7a --- /dev/null +++ b/component/admin/views/export/view.html.php @@ -0,0 +1,44 @@ +getModel('export'); + $this->exports = $model->getExports(); + + $document = JFactory::getDocument(); + $document->setTitle(JText::_('COM_REDSHOP_EXPORT')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_EXPORT_MANAGEMENT')); + + parent::display($tpl); + } +} diff --git a/component/admin/views/field/index.html b/component/admin/views/field/index.html new file mode 100755 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/field/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/field/tmpl/edit.php b/component/admin/views/field/tmpl/edit.php new file mode 100755 index 00000000000..776a051eebf --- /dev/null +++ b/component/admin/views/field/tmpl/edit.php @@ -0,0 +1,355 @@ + + + + + +
    +
    +
    +
    +
    +

    +
    +
    + form->renderField('type') ?> + form->renderField('section') ?> + form->renderField('groupId') ?> + form->renderField('name') ?> + form->renderField('title') ?> + form->renderField('class') ?> + form->renderField('maxlength') ?> + form->renderField('size') ?> + form->renderField('cols') ?> + form->renderField('rows') ?> + item->section == 1 || $this->item->section == 17) + { + $display = 'style="display:block;"'; + } + else + { + $display = 'style="display:none;"'; + } + ?> + form->renderField('display_in_product') ?> + form->renderField('display_in_checkout') ?> + form->renderField('show_in_front') ?> + form->renderField('required') ?> + form->renderField('published') ?> + form->renderField('description') ?> +
    +
    +
    +
    +
    +
    +

    +
    +
    +

    + +

    + + + + + + + + + + + + lists['extra_data'])) : ?> + lists['extra_data'] as $index => $extraData): ?> + + + + + + + + + + + + + + + + +
      
    + + + + + + + field_name) && $extraData->field_name != '') : ?> + + + + lists['extra_data']) > 1) : ?> + + +
    + + + + + +  
    +
    +
    +
    +
    + + form->getInput('id'); ?> + + + +
    diff --git a/component/admin/views/field/tmpl/index.html b/component/admin/views/field/tmpl/index.html new file mode 100755 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/field/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/field/view.html.php b/component/admin/views/field/view.html.php new file mode 100755 index 00000000000..567433ab4a9 --- /dev/null +++ b/component/admin/views/field/view.html.php @@ -0,0 +1,58 @@ +form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->state = $this->get('State'); + + if ($this->item->type == 15) + { + $this->form->setFieldAttribute('section', 'disabled', 1); + } + + $this->item = $this->get('Item'); + + $field_data = RedshopEntityField::getInstance($this->item->id)->getFieldValues(); + + $list = array(); + $lists['extra_data'] = $field_data; + + $this->lists = $lists; + + parent::beforeDisplay($tpl); + } +} diff --git a/component/admin/views/field_group/index.html b/component/admin/views/field_group/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/field_group/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/field_group/tmpl/edit.php b/component/admin/views/field_group/tmpl/edit.php new file mode 100644 index 00000000000..4c5b3166d2a --- /dev/null +++ b/component/admin/views/field_group/tmpl/edit.php @@ -0,0 +1,11 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/field_group/tmpl/index.html b/component/admin/views/field_group/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/field_group/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/field_group/view.html.php b/component/admin/views/field_group/view.html.php new file mode 100644 index 00000000000..4b83b59a8e5 --- /dev/null +++ b/component/admin/views/field_group/view.html.php @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/component/admin/views/field_groups/tmpl/default.php b/component/admin/views/field_groups/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/field_groups/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/field_groups/tmpl/index.html b/component/admin/views/field_groups/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/field_groups/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/field_groups/view.html.php b/component/admin/views/field_groups/view.html.php new file mode 100644 index 00000000000..0654f59d214 --- /dev/null +++ b/component/admin/views/field_groups/view.html.php @@ -0,0 +1,50 @@ +section); + } + + return parent::onRenderColumn($config, $index, $row); + } +} diff --git a/component/admin/views/fields/index.html b/component/admin/views/fields/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/fields/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/fields/tmpl/default.php b/component/admin/views/fields/tmpl/default.php new file mode 100644 index 00000000000..22f36200a5c --- /dev/null +++ b/component/admin/views/fields/tmpl/default.php @@ -0,0 +1,79 @@ +state->get('filter.field_section'); + +echo RedshopLayoutHelper::render('view.list', array('data' => $this)); + +?> + + + + \ No newline at end of file diff --git a/component/admin/views/fields/view.html.php b/component/admin/views/fields/view.html.php new file mode 100644 index 00000000000..276982a1d07 --- /dev/null +++ b/component/admin/views/fields/view.html.php @@ -0,0 +1,119 @@ + false); + + /** + * Method for run before display to initial variables. + * + * @param string $tpl Template name + * + * @return void + * @throws Exception + * + * @since 2.0.6 + */ + public function beforeDisplay(&$tpl) + { + parent::beforeDisplay($tpl); + + // Only display ordering column if user choose filter fields by section + $filterSection = (int) $this->state->get('filter.field_section', 0); + + if (!$filterSection) + { + $this->hasOrdering = false; + } + } + + /** + * Method for render 'Published' column + * + * @param array $config Row config. + * @param int $index Row index. + * @param object $row Row data. + * + * @return string + * @throws Exception + * + * @since 2.0.6 + */ + public function onRenderColumn($config, $index, $row) + { + if ($config['dataCol'] == 'type') + { + return RedshopHelperTemplate::getFieldTypeSections($row->type); + } + elseif ($config['dataCol'] == 'section') + { + return RedshopHelperTemplate::getFieldSections($row->section); + } + elseif ($config['dataCol'] == 'groupId') + { + return $row->groupName; + } + + return parent::onRenderColumn($config, $index, $row); + } + + /** + * Method for add toolbar. + * + * @return void + * + * @since 2.0.6 + */ + protected function addToolbar() + { + parent::addToolbar(); + + $filterSection = (int) $this->state->get('filter.field_section'); + + if ($filterSection) + { + /** @var RedshopModelField_Groups $model */ + $model = RedshopModel::getInstance('Field_Groups', 'RedshopModel', array('ignore_request' => true)); + $model->setState('filter.section', $filterSection); + $model->setState('list.limit', 99); + + $fieldGroups = $model->getItems(); + $this->fieldGroups = $fieldGroups === false ? array() : $fieldGroups; + + JToolbarHelper::modal('fieldsAssignGroup', 'fa fa-list', 'COM_REDSHOP_FIELDS_MASS_ASSIGN_GROUP'); + } + } +} diff --git a/component/admin/views/giftcard/index.html b/component/admin/views/giftcard/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/giftcard/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/giftcard/tmpl/edit.php b/component/admin/views/giftcard/tmpl/edit.php new file mode 100644 index 00000000000..00539cf4fb9 --- /dev/null +++ b/component/admin/views/giftcard/tmpl/edit.php @@ -0,0 +1,136 @@ +item->giftcard_id) +{ + $this->form->setValue('giftcard_price', null, $producthelper->redpriceDecimal($this->item->giftcard_price)); + $this->form->setValue('giftcard_value', null, $producthelper->redpriceDecimal($this->item->giftcard_value)); +} + +JFactory::getDocument()->addScriptDeclaration(' + Joomla.submitbutton = function(task) + { + if (task == "giftcard.cancel" || document.formvalidator.isValid(document.getElementById("adminForm"))) + { + Joomla.submitform(task); + } + }; +'); +?> +
    + +
    +
    +
    +
    +

    +
    +
    + form->renderField('giftcard_name') ?> + form->renderField('customer_amount') ?> + form->renderField('giftcard_price') ?> + form->renderField('giftcard_value') ?> + form->renderField('giftcard_validity') ?> + form->renderField('free_shipping') ?> + form->renderField('published') ?> +
    +
    + get('ECONOMIC_INTEGRATION')) : ?> +
    +
    +

    +
    +
    + form->renderField('accountgroup_id') ?> +
    +
    + +
    +
    +
    +
    +

    +
    +
    + form->renderField('giftcard_bgimage_file') ?> +
    +
    +
    +
    + item->giftcard_bgimage; + $giftCardImagePath = RedshopHelperMedia::getImagePath( + $value, + '', + 'thumb', + 'giftcard', + 100, + 100, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + ?> + + + + + + + + form->getInput('giftcard_bgimage') ?> +
    +
    + form->renderField('giftcard_image_file') ?> +
    +
    +
    +
    + item->giftcard_image; + $giftCardImagePath = RedshopHelperMedia::getImagePath( + $value, + '', + 'thumb', + 'giftcard', + 100, + 100, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + ?> + + + + + + + + form->getInput('giftcard_image') ?> +
    +
    + form->renderField('giftcard_desc') ?> +
    +
    +
    +
    + + + form->getInput('giftcard_id') ?> + +
    diff --git a/component/admin/views/giftcard/tmpl/index.html b/component/admin/views/giftcard/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/giftcard/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/giftcard/view.html.php b/component/admin/views/giftcard/view.html.php new file mode 100644 index 00000000000..66a3b769ab0 --- /dev/null +++ b/component/admin/views/giftcard/view.html.php @@ -0,0 +1,84 @@ +form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->state = $this->get('State'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors)); + + return false; + } + + $this->addToolbar(); + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + + $isNew = ($this->item->giftcard_id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + // Prepare text for title + $title = JText::_('COM_REDSHOP_GIFTCARD_MANAGEMENT') . ': [ ' . $text . ' ]'; + + JToolBarHelper::title($title, 'redshop_giftcard_48'); + JToolBarHelper::apply('giftcard.apply'); + JToolBarHelper::save('giftcard.save'); + + if ($isNew) + { + JToolBarHelper::cancel('giftcard.cancel'); + } + else + { + JToolBarHelper::cancel('giftcard.cancel', JText::_('JTOOLBAR_CLOSE')); + } + } +} diff --git a/component/admin/views/giftcards/index.html b/component/admin/views/giftcards/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/giftcards/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/giftcards/tmpl/default.php b/component/admin/views/giftcards/tmpl/default.php new file mode 100644 index 00000000000..4616c42e364 --- /dev/null +++ b/component/admin/views/giftcards/tmpl/default.php @@ -0,0 +1,205 @@ +escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); + +?> + +
    +
    +
    +
    + + "> + +
    +
    +
    + + items)) : ?> +
    + +
    + + + + + + + + + + + + + + + + + items as $i => $item) : ?> + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + +
    + giftcard_id); ?> + +
    + published, $i, 'giftcards.', true, 'cb'); ?> +
    +
    + + + giftcard_image; ?> + + + giftcard_image, + '', + 'thumb', + 'giftcard', + 150, + 150, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + ?> + + + + + + giftcard_bgimage; ?> + + + giftcard_bgimage, + '', + 'thumb', + 'giftcard', + 150, + 150, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + ?> + + + + + + getProductFormattedPrice($item->giftcard_price);?> + + getProductFormattedPrice($item->giftcard_value);?> + + giftcard_validity;?> + + giftcard_id; ?> +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    + + + pagination->getListFooter(); ?> + + + + + + +
    diff --git a/component/admin/views/giftcards/tmpl/index.html b/component/admin/views/giftcards/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/giftcards/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/giftcards/view.html.php b/component/admin/views/giftcards/view.html.php new file mode 100644 index 00000000000..8af1704375f --- /dev/null +++ b/component/admin/views/giftcards/view.html.php @@ -0,0 +1,73 @@ +items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode('
    ', $errors)); + + return false; + } + + // Set the tool-bar and number of found items + $this->addToolBar(); + + // Display the template + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolBar() + { + $title = JText::_('COM_REDSHOP_GIFTCARD_MANAGEMENT'); + + if ($this->pagination->total) + { + $title .= "(" . $this->pagination->total . ")"; + } + + JToolBarHelper::title($title, 'redshop_giftcard_48'); + JToolBarHelper::addNew('giftcard.add'); + JToolBarHelper::editList('giftcard.edit'); + JToolBarHelper::deleteList('', 'giftcards.delete'); + JToolbarHelper::publish('giftcards.publish', 'JTOOLBAR_PUBLISH', true); + JToolbarHelper::unpublish('giftcards.unpublish', 'JTOOLBAR_UNPUBLISH', true); + } +} diff --git a/component/admin/views/import/index.html b/component/admin/views/import/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/import/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/import/tmpl/default.php b/component/admin/views/import/tmpl/default.php new file mode 100755 index 00000000000..83742ead96e --- /dev/null +++ b/component/admin/views/import/tmpl/default.php @@ -0,0 +1,381 @@ +get('IMPORT_FILE_MIME', 'text/csv,application/vnd.ms-excel')); +$allowMaxFileSize = (int) Redshop::getConfig()->get('IMPORT_MAX_FILE_SIZE', 2000000); +$allowMinFileSize = (int) Redshop::getConfig()->get('IMPORT_MIN_FILE_SIZE', 1); +$allowFileExtensions = explode(',', Redshop::getConfig()->get('IMPORT_FILE_EXTENSION', '.csv')); + +// Defines encoding used in import +$characterSets = array( + 'ISO-8859-1' => 'COM_REDSHOP_IMPORT_CHARS_ISO88591', + 'ISO-8859-5' => 'COM_REDSHOP_IMPORT_CHARS_ISO88595', + 'ISO-8859-15' => 'COM_REDSHOP_IMPORT_CHARS_ISO885915', + 'UTF-8' => 'COM_REDSHOP_IMPORT_CHARS_UTF8', + 'cp866' => 'COM_REDSHOP_IMPORT_CHARS_CP866', + 'cp1251' => 'COM_REDSHOP_IMPORT_CHARS_CP1251', + 'cp1252' => 'COM_REDSHOP_IMPORT_CHARS_CP1252', + 'KOI8-R' => 'COM_REDSHOP_IMPORT_CHARS_KOI8R', + 'BIG5' => 'COM_REDSHOP_IMPORT_CHARS_BIG5', + 'GB2312' => 'COM_REDSHOP_IMPORT_CHARS_GB2312', + 'BIG5-HKSCS' => 'COM_REDSHOP_IMPORT_CHARS_BIG5HKSCS', + 'Shift_JIS' => 'COM_REDSHOP_IMPORT_CHARS_SHIFTJIS', + 'EUC-JP' => 'COM_REDSHOP_IMPORT_CHARS_EUCJP', + 'MacRoman' => 'COM_REDSHOP_IMPORT_CHARS_MACROMAN' +); + +// Creating JOption for JSelect box. +foreach ($characterSets as $char => $name) +{ + $title = sprintf(JText::_($name), $char); + $encodings[] = JHTML::_('select.option', $char, $title); +} +?> + +imports)): ?> +
    + × +

    + +

    +
    +

    +
    +
    + + + + +
    +
    +
    + +
    +
    +

    + +

    +
    +
    + imports as $import): ?> + + +
    +
    + +
    +
    + +
    +
    +

    + +

    +
    +
    +
    +
    +

    + :  + bytes +

    +

    + :  + bytes +

    +

    + :  + +

    +

    + :  + +

    +

    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +

    +
    +
    +
    +
    +
    + + +

    + +
    +

    :

    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    + \ No newline at end of file diff --git a/component/admin/views/import/view.html.php b/component/admin/views/import/view.html.php new file mode 100644 index 00000000000..e68e98cb5f7 --- /dev/null +++ b/component/admin/views/import/view.html.php @@ -0,0 +1,52 @@ +getModel(); + + $this->imports = $model->getImports(); + + $document->setTitle(JText::_('COM_REDSHOP_DATA_IMPORT')); + JToolBarHelper::title(JText::_('COM_REDSHOP_DATA_IMPORT')); + + parent::display($tpl); + } +} diff --git a/component/admin/views/import_vm/index.html b/component/admin/views/import_vm/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/import_vm/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/import_vm/tmpl/default.php b/component/admin/views/import_vm/tmpl/default.php new file mode 100644 index 00000000000..65fc6997fe4 --- /dev/null +++ b/component/admin/views/import_vm/tmpl/default.php @@ -0,0 +1,562 @@ +model->countCategories(); +$products = $this->model->countProducts(); +$shopperGroups = $this->model->countShopperGroups(); +$users = $this->model->countUsers(); +$manufacturers = $this->model->countManufacturers(); +$orderStatuses = $this->model->countOrderStatuses(); +$orders = $this->model->countOrders(); +?> + +checkVirtuemart): ?> +
    +
    +

    +
    +
    + + + + +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    model->countCategories() ?> + + +
    +
    model->countManufacturers() ?> + + +
    +
    model->countShopperGroups() ?> + + +
    +
    model->countUsers() ?> + + +
    +
    model->countOrderStatuses() ?> + + +
    +
    model->countProducts() ?> + + +
    +
    model->countOrders() ?> + + +
    +
    +
    + +
    diff --git a/component/admin/views/import_vm/tmpl/index.html b/component/admin/views/import_vm/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/import_vm/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/import_vm/view.html.php b/component/admin/views/import_vm/view.html.php new file mode 100644 index 00000000000..dc92aceced5 --- /dev/null +++ b/component/admin/views/import_vm/view.html.php @@ -0,0 +1,54 @@ +checkVirtuemart = (boolean) JComponentHelper::isEnabled('com_virtuemart'); + $this->model = $this->getModel('Import_VM'); + + $document->setTitle(JText::_('COM_REDSHOP_IMPORT_FROM_VM')); + JToolBarHelper::title(JText::_('COM_REDSHOP_IMPORT_FROM_VM'), 'redshop_import48'); + + parent::display($tpl); + } +} diff --git a/component/admin/views/index.html b/component/admin/views/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/install/index.html b/component/admin/views/install/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/install/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/install/tmpl/default.php b/component/admin/views/install/tmpl/default.php new file mode 100644 index 00000000000..05bbc133d79 --- /dev/null +++ b/component/admin/views/install/tmpl/default.php @@ -0,0 +1,156 @@ + + + +
    + +
    +
    +
    0% +
    +
    +
    + + + steps as $i => $step): ?> + "> + + + + + + +
    + + + + + Pending + +
    +
    diff --git a/component/admin/views/install/tmpl/index.html b/component/admin/views/install/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/install/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/install/view.html.php b/component/admin/views/install/view.html.php new file mode 100644 index 00000000000..94ed36d09a6 --- /dev/null +++ b/component/admin/views/install/view.html.php @@ -0,0 +1,71 @@ +installType = JFactory::getApplication()->input->getString('install_type', 'install'); + + JToolbarHelper::title(JText::_('COM_REDSHOP_INSTALL_TITLE')); + + /** @var RedshopModelInstall $model */ + $model = $this->getModel(); + + $this->steps = $model->getSteps($this->installType); + + if ($this->installType == 'update') + { + $this->availableVersions = $model->getAvailableUpdate(); + } + + // Display the template + parent::display($tpl); + } +} diff --git a/component/admin/views/mail/index.html b/component/admin/views/mail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/mail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/mail/tmpl/edit.php b/component/admin/views/mail/tmpl/edit.php new file mode 100644 index 00000000000..f2adf967d6a --- /dev/null +++ b/component/admin/views/mail/tmpl/edit.php @@ -0,0 +1,19 @@ + +
    +
    + formLayout, array('data' => $this)) ?> +
    +
    + loadTemplate('hints') ?> +
    +
    diff --git a/component/admin/views/mail/tmpl/edit_hints.php b/component/admin/views/mail/tmpl/edit_hints.php new file mode 100644 index 00000000000..8723c3a81fd --- /dev/null +++ b/component/admin/views/mail/tmpl/edit_hints.php @@ -0,0 +1,445 @@ + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + + +
    +
    +
    + + {companyname_lbl}{companyname} + {firstname_lbl}{firstname} + {lastname_lbl}{lastname} + {address_lbl}{address} + {city_lbl}{city} + {zip_lbl}{zip} + {country_lbl}{country} + {state_lbl}{state} + {phone_lbl}{phone} + {email_lbl}{email} + {vatnumber_lbl}{vatnumber} + {taxexempt_lbl}{taxexempt} + {user_taxexempt_request_lbl}{user_taxexempt_request}{billing_extrafield} + {billing_address_end}'; + + $newshippingtag = '{shipping_address_start} + + + + + + + + + {shipping_extrafield} +
    {firstname_lbl}{firstname}
    {lastname_lbl}{lastname}
    {address_lbl}{address}
    {city_lbl}{city}
    {zip_lbl}{zip}
    {country_lbl}{country}
    {state_lbl}{state}
    {phone_lbl}{phone}
    {shipping_address_end}'; + ?> + + + + + + + + + + + + + +
    + {' . $tags[$i]->name . '} -- ' . $tags[$i]->title . ''; + } ?> +
    + {' . $tags[$i]->name . '} -- ' . $tags[$i]->title . ''; + } ?> +

    " . htmlentities($newshippingtag); ?>
    +
    +
    + + + + + + + + + + + + + +
    + {' . $tags[$i]->name . '} -- ' . $tags[$i]->title . ''; + } ?> +
    + {' . $tags[$i]->name . '} -- ' . $tags[$i]->title . ''; + } ?> +

    " . htmlentities($newshippingtag); ?>
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/component/admin/views/mail/tmpl/index.html b/component/admin/views/mail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/mail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/mail/view.html.php b/component/admin/views/mail/view.html.php new file mode 100644 index 00000000000..7ba696d1991 --- /dev/null +++ b/component/admin/views/mail/view.html.php @@ -0,0 +1,28 @@ + + + \ No newline at end of file diff --git a/component/admin/views/mails/tmpl/default.php b/component/admin/views/mails/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/mails/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/mails/tmpl/index.html b/component/admin/views/mails/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/mails/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/mails/view.html.php b/component/admin/views/mails/view.html.php new file mode 100644 index 00000000000..836532e5793 --- /dev/null +++ b/component/admin/views/mails/view.html.php @@ -0,0 +1,41 @@ +mail_section); + } + + return parent::onRenderColumn($config, $index, $row); + } +} diff --git a/component/admin/views/manufacturer/index.html b/component/admin/views/manufacturer/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/manufacturer/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/manufacturer/tmpl/edit.php b/component/admin/views/manufacturer/tmpl/edit.php new file mode 100644 index 00000000000..4c5b3166d2a --- /dev/null +++ b/component/admin/views/manufacturer/tmpl/edit.php @@ -0,0 +1,11 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/manufacturer/tmpl/index.html b/component/admin/views/manufacturer/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/manufacturer/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/manufacturer/view.html.php b/component/admin/views/manufacturer/view.html.php new file mode 100644 index 00000000000..494a685e554 --- /dev/null +++ b/component/admin/views/manufacturer/view.html.php @@ -0,0 +1,132 @@ +item = $this->model->getItem(); + $this->form = $this->model->getForm(); + + $media = RedshopEntityManufacturer::getInstance($this->item->id)->getMedia(); + + if ($media->isValid()) + { + $this->form->setFieldAttribute('media', 'media-id', $media->get('media_id')); + $this->form->setFieldAttribute('media', 'media-reference', $this->item->id); + } + + $this->checkPermission(); + $this->loadFields(); + } + + /** + * Method for prepare fields in group and also HTML content + * + * @param object $group Group object + * + * @return void + * @throws Exception + * + * @since 2.0.6 + */ + protected function prepareFields($group) + { + if ($group->name == 'fields') + { + $group->fields = RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_MANUFACTURER, $this->item->id); + $group->html = $group->fields; + + return; + } + + parent::prepareFields($group); + } + + /** + * Method for prepare field HTML + * + * @param object $field Group object + * + * @return boolean|string False if keep. String for HTML content if success. + * @throws Exception + * + * @since 2.1.0 + */ + protected function prepareField($field) + { + if ((string) $field->getAttribute('name') != 'excluding_category_list') + { + return parent::prepareField($field); + } + + // Special case for excluding category + $pluginManufacturer = RedshopHelperOrder::getParameters('plg_manucaturer_excluding_category'); + $showExcluding = !empty($pluginManufacturer) && $pluginManufacturer[0]->enabled; + + if (!$showExcluding) + { + return parent::prepareField($field); + } + + $this->form->setFieldAttribute('excluding_category_list', 'type', 'text'); + + return '
    ' + . $this->form->getLabel($field->getAttribute('name')) + . '
    ' + . RedshopHelperCategory::listAll( + "excluding_category_list[]", + 0, + $this->item->excluding_category_list, + 10, + false, + true, + array(), + '100%' + ) + . '
    '; + } +} diff --git a/component/admin/views/manufacturers/index.html b/component/admin/views/manufacturers/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/manufacturers/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/manufacturers/tmpl/default.php b/component/admin/views/manufacturers/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/manufacturers/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/manufacturers/tmpl/index.html b/component/admin/views/manufacturers/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/manufacturers/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/manufacturers/view.html.php b/component/admin/views/manufacturers/view.html.php new file mode 100644 index 00000000000..a8e7e446129 --- /dev/null +++ b/component/admin/views/manufacturers/view.html.php @@ -0,0 +1,64 @@ +id)->getMedia(); + + if (!$media->isValid()) + { + return ''; + } + + $mediaFile = $media->generateThumb(100, 100); + + return '' + . '' + . ''; + } +} diff --git a/component/admin/views/mass_discount/index.html b/component/admin/views/mass_discount/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/mass_discount/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/mass_discount/tmpl/edit.php b/component/admin/views/mass_discount/tmpl/edit.php new file mode 100644 index 00000000000..4c5b3166d2a --- /dev/null +++ b/component/admin/views/mass_discount/tmpl/edit.php @@ -0,0 +1,11 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/mass_discount/tmpl/index.html b/component/admin/views/mass_discount/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/mass_discount/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/mass_discount/view.html.php b/component/admin/views/mass_discount/view.html.php new file mode 100644 index 00000000000..b19e632caeb --- /dev/null +++ b/component/admin/views/mass_discount/view.html.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/component/admin/views/mass_discounts/tmpl/default.php b/component/admin/views/mass_discounts/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/mass_discounts/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/mass_discounts/tmpl/index.html b/component/admin/views/mass_discounts/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/mass_discounts/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/mass_discounts/view.html.php b/component/admin/views/mass_discounts/view.html.php new file mode 100644 index 00000000000..fa2a033122d --- /dev/null +++ b/component/admin/views/mass_discounts/view.html.php @@ -0,0 +1,129 @@ +{$config['dataCol']}; + + switch ($config['dataCol']) + { + case 'type': + if ($value == 1) + { + return '' . JText::_('COM_REDSHOP_MASS_DISCOUNT_TYPE_OPTION_PERCENTAGE') . ''; + } + + return '' . JText::_('COM_REDSHOP_MASS_DISCOUNT_TYPE_OPTION_TOTAL') . ''; + + case 'start_date': + case 'end_date': + if (empty($value)) + { + return ''; + } + + $tz = new \DateTimeZone(\JFactory::getConfig()->get('offset')); + + return date_create_from_format('U', $value)->setTimezone($tz)->format(Redshop::getConfig()->get('DEFAULT_DATEFORMAT', 'd-m-Y')); + + case 'discount_product': + if (empty($value)) + { + return ''; + } + + return $this->generateList($value, 'Product', 'product_name'); + + case 'category_id': + if (empty($value)) + { + return ''; + } + + return $this->generateList($value, 'Category', 'name'); + + case 'manufacturer_id': + if (empty($value)) + { + return ''; + } + + return $this->generateList($value, 'Manufacturer', 'name'); + + default: + return parent::onRenderColumn($config, $index, $row); + } + } + + /** + * Method for return list of object->property + * + * @param string $ids Array list. + * @param string $entity Entity class + * @param string $property Property name + * + * @return string + * + * @since 2.0.7 + */ + protected function generateList($ids, $entity, $property) + { + if (empty($ids) || empty($entity) || empty($property)) + { + return ''; + } + + $ids = explode(',', $ids); + $return = array(); + $entity = 'RedshopEntity' . $entity; + + if (!class_exists($entity)) + { + return ''; + } + + foreach ($ids as $id) + { + $return[] = $entity::getInstance($id)->get($property); + } + + return implode('
    ', $return); + } +} diff --git a/component/admin/views/media/index.html b/component/admin/views/media/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/media/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/media/tmpl/additionalfile.php b/component/admin/views/media/tmpl/additionalfile.php new file mode 100644 index 00000000000..fbbcde83154 --- /dev/null +++ b/component/admin/views/media/tmpl/additionalfile.php @@ -0,0 +1,177 @@ +input->getInt('media_id'); + +?> + + +
    + +
    + + +
    +
    + +
    +
    +
    + + + + + + + + + +
    + + +
    +
    + + + +
    +
    +
    + + +
    + + + + +
    + +
    +

    + + getModel('media')->getAdditionalFiles($mediaId); + $k = 0; + + for ($i = 0, $in = count($additionalfiles); $i < $in; $i++) + { + $filename = $additionalfiles[$i]->name; + $fileId = $additionalfiles[$i]->id; + + $link = JURI::root() . "/components/com_redshop/assets/download/product/" . $filename; + + $link_delete = "index.php?tmpl=component&option=com_redshop&view=media&task=deleteAddtionalFiles&fileId=" . $fileId . "&media_id=" . $mediaId; + + $path = JPATH_ROOT . '/components/com_redshop/assets/download/product/' . $filename; + + $fileExt = strtolower(JFile::getExt($filename)); + + ?> + "> + + + + +
    + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + + + +
    + + diff --git a/component/admin/views/media/tmpl/default.php b/component/admin/views/media/tmpl/default.php new file mode 100644 index 00000000000..3efa95a10e8 --- /dev/null +++ b/component/admin/views/media/tmpl/default.php @@ -0,0 +1,305 @@ +root(); + +// For Add Media Detail +$jInput = JFactory::getApplication()->input; +$showbuttons = $jInput->getInt('showbuttons', 0); +$media_section = $jInput->getCmd('media_section', $this->state->get('filter_media_section', 0)); +$section_id = $jInput->getInt('section_id', 0); +$model = $this->getModel('media'); +$countTd = 8; +$ordering = ($this->lists['order'] == 'ordering'); + +$sectionadata = array(); +$sectiona_primary_image = ""; +$section_name = ""; +$directory = $media_section; + +if ($showbuttons == 1) +{ + switch ($media_section) + { + case "product"; + $sectionadata = Redshop::product((int) $section_id); + $section_name = isset($sectionadata->product_name) ? $sectionadata->product_name : ''; + $sectiona_primary_image = isset($sectionadata->product_full_image) ? $sectionadata->product_full_image : ''; + $directory = $media_section; + break; + case "property"; + $sectionadata = RedshopHelperProduct_Attribute::getAttributeProperties($section_id); + $section_name = $sectionadata[0]->property_name; + $sectiona_primary_image = $sectionadata[0]->property_main_image; + $directory = 'property'; + break; + case "subproperty"; + $sectionadata = RedshopHelperProduct_Attribute::getAttributeSubProperties($section_id); + $section_name = $sectionadata[0]->subattribute_color_name; + $sectiona_primary_image = $sectionadata[0]->subattribute_color_main_image; + $directory = 'subproperty'; + break; + } +} + +if ($showbuttons == 1) +{ + ?> +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +
    + +
    + lists['type']; ?> +
    +
    + lists['filter_media_section']; ?> +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + media); $i < $n; $i++): ?> + media[$i]; + $row->id = $row->media_id; + $published = JHtml::_('grid.published', $row, $i); + ?> + + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + lists ['order_Dir'], $this->lists ['order']) ?> + + lists ['order_Dir'], $this->lists ['order']) ?> + + lists ['order_Dir'], $this->lists ['order']) ?> + + lists ['order_Dir'], $this->lists ['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + media); ?> + + + lists ['order_Dir'], $this->lists ['order']); ?> + + lists ['order_Dir'], $this->lists ['order']); ?> +
    + pagination->getRowOffset($i) ?> + + id) ?> + + media_type == 'images' && in_array($row->media_section, array('manufacturer', 'category'))): ?> + media_id); + $mediaFile = $media->generateThumb(100, 100); + ?> + + + + media_name))); ?> + media_type == 'images'): ?> + media_type . '/' . $row->media_section . '/' . trim($row->media_name); + ?> + + + + media_name; ?> + + + + media_type) ? $row->media_type : 'document'; ?> + + media_type == 'download'): ?> + getAdditionalFiles($row->id); ?> + + + + + media_alternate_text ?>media_section ?> + media_name); + echo JHtml::_('jgrid.isdefault', $isDefault, $i, '', !$isDefault); + ?> + + + lists['order_Dir']); ?> +
    + + pagination->orderUpIcon($i, true, 'orderup'); ?> + pagination->orderDownIcon($i, $n, true, 'orderdown'); ?> + + pagination->orderUpIcon($i, true, 'orderdown'); ?> + pagination->orderDownIcon($i, $n, true, 'orderup'); ?> + + +
    + + ordering; ?> + +
    media_id; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + +
    + diff --git a/component/admin/views/media/tmpl/index.html b/component/admin/views/media/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/media/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/media/tmpl/thumbs.php b/component/admin/views/media/tmpl/thumbs.php new file mode 100644 index 00000000000..ff346890a1c --- /dev/null +++ b/component/admin/views/media/tmpl/thumbs.php @@ -0,0 +1,63 @@ +input; + +$fid = $jinput->get('fid'); +$fsec = $jinput->get('fsec'); + +$link = "index.php?option=com_redshop&view=media&layout=thumbs"; +if (isset($fsec)) + $link .= "&fsec=" . $fsec; +if (isset($fid)) + $link .= "&fid=" . $fid; + +$link .= "&folder=" . $this->state->folder; + +?> +
    +
    + get('folder', ''); + if ($folder != '') + echo $this->loadTemplate('up'); + ?> + + folders); $i < $n; $i++) : + $this->setFolder($i); + if ($this->_tmp_folder->name != 'thumb') + echo $this->loadTemplate('folder'); + endfor; ?> + + documents); $i < $n; $i++) : + $this->setDoc($i); + echo $this->loadTemplate('doc'); + endfor; ?> + + images) > 0) + { + for ($i = 0, $n = count($this->images); $i < $n; $i++) : + $this->setImage($i); + echo $this->loadTemplate('img'); + endfor; + } + + if (count($this->images) == 0 && count($this->documents) == 0) + { + echo "No Records Found"; + } + ?> + +
    + + + + +
    diff --git a/component/admin/views/media/tmpl/thumbs_doc.php b/component/admin/views/media/tmpl/thumbs_doc.php new file mode 100644 index 00000000000..2d266b19cf0 --- /dev/null +++ b/component/admin/views/media/tmpl/thumbs_doc.php @@ -0,0 +1,25 @@ +input->getInt('fdownload'); +$extra_link = ""; +if ($fdownload) + $extra_link = "href=\"javascript:window.parent.jdownload_file('" . $this->_tmp_doc->path_relative . "','" . $this->_tmp_doc->name . "');window.parent.SqueezeBox.close();\""; +?> +
    +
    +
    + > + <?php echo $this->_tmp_doc->name; ?> +
    +
    +
    + _tmp_doc->name; ?> +
    +
    diff --git a/component/admin/views/media/tmpl/thumbs_folder.php b/component/admin/views/media/tmpl/thumbs_folder.php new file mode 100644 index 00000000000..4999c8fd63e --- /dev/null +++ b/component/admin/views/media/tmpl/thumbs_folder.php @@ -0,0 +1,40 @@ +input; + +$fid = $jinput->get('fid'); +$fsec = $jinput->get('fsec'); + +$link = "index.php?tmpl=component&option=com_redshop&view=media&layout=thumbs"; +if (isset($fsec)) + $link .= "&fsec=" . $fsec; +if (isset($fid)) + $link .= "&fid=" . $fid; + +$link .= "&folder=" . $this->_tmp_folder->path_relative; + +$fdownload = $jinput->getInt('fdownload'); + +$extra_arg = ""; +if ($fdownload) + $extra_arg = "&fdownload=1"; +?> + diff --git a/component/admin/views/media/tmpl/thumbs_img.php b/component/admin/views/media/tmpl/thumbs_img.php new file mode 100644 index 00000000000..b6023a9377d --- /dev/null +++ b/component/admin/views/media/tmpl/thumbs_img.php @@ -0,0 +1,62 @@ +input; + +$fid = $jinput->get('fid', ''); +$fdl = $jinput->get('fdownload', ''); +$fsec = $jinput->get('fsec', ''); +$folder = $jinput->get('folder', ''); + +$basePath = "components/com_redshop/assets/images/"; + +if ($fdl) +{ + $basePath = str_replace(JPATH_ROOT . '/', '', Redshop::getConfig()->get('PRODUCT_DOWNLOAD_ROOT')) . '/'; +} + +if ($folder == '') +{ + $thumb_path = JURI::root() . $basePath . $this->_tmp_img->path_relative; +} +else +{ + $thumb_path = RedshopHelperMedia::getImagePath( + basename($this->_tmp_img->path_relative), + '', + 'thumb', + $folder, + $this->_tmp_img->width_60, + $this->_tmp_img->height_60, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); +} +?> + diff --git a/component/admin/views/media/tmpl/thumbs_up.php b/component/admin/views/media/tmpl/thumbs_up.php new file mode 100644 index 00000000000..171ff88fbfa --- /dev/null +++ b/component/admin/views/media/tmpl/thumbs_up.php @@ -0,0 +1,38 @@ +input; + +$fid = $jinput->get('fid'); +$fsec = $jinput->get('fsec'); +$link = "index.php?tmpl=component&option=com_redshop&view=media&layout=thumbs"; +if (isset($fsec)) + $link .= "&fsec=" . $fsec; +if (isset($fid)) + $link .= "&fid=" . $fid; + +$link .= "&folder=" . $this->state->parent; + +$fdownload = $jinput->getInt('fdownload'); +$extra_arg = ""; +if ($fdownload) + $extra_arg = "&fdownload=1"; +?> +
    +
    +
    + + .. +
    +
    +
    + .. +
    +
    diff --git a/component/admin/views/media/view.html.php b/component/admin/views/media/view.html.php new file mode 100644 index 00000000000..5aafad11c14 --- /dev/null +++ b/component/admin/views/media/view.html.php @@ -0,0 +1,140 @@ +state = $this->get('State'); + + $media_type = $this->state->get('media_type', 0); + $filter_media_section = $this->state->get('filter_media_section', 0); + + $optiontype = array(); + $optiontype[] = JHTML::_('select.option', '0', JText::_('COM_REDSHOP_SELECT')); + $optiontype[] = JHTML::_('select.option', 'images', JText::_('COM_REDSHOP_IMAGE')); + $optiontype[] = JHTML::_('select.option', 'video', JText::_('COM_REDSHOP_VIDEO')); + $optiontype[] = JHTML::_('select.option', 'document', JText::_('COM_REDSHOP_DOCUMENT')); + $optiontype[] = JHTML::_('select.option', 'download', JText::_('COM_REDSHOP_DOWNLOAD')); + $optiontype[] = JHTML::_('select.option', 'youtube', JText::_('COM_REDSHOP_YOUTUBE')); + + $optionsection = array(); + $optionsection[] = JHTML::_('select.option', '0', JText::_('COM_REDSHOP_SELECT')); + $optionsection[] = JHTML::_('select.option', 'product', JText::_('COM_REDSHOP_PRODUCT')); + $optionsection[] = JHTML::_('select.option', 'category', JText::_('COM_REDSHOP_CATEGORY')); + $optionsection[] = JHTML::_('select.option', 'catalog', JText::_('COM_REDSHOP_CATALOG')); + $optionsection[] = JHTML::_('select.option', 'media', JText::_('COM_REDSHOP_MEDIA')); + $optionsection[] = JHTML::_('select.option', 'property', JText::_('COM_REDSHOP_PROPERTY')); + $optionsection[] = JHTML::_('select.option', 'subproperty', JText::_('COM_REDSHOP_SUBPROPERTY')); + $optionsection[] = JHTML::_('select.option', 'manufacturer', JText::_('COM_REDSHOP_MANUFACTURER')); + + $lists ['order'] = $this->state->get('list.ordering', 'media_id'); + $lists ['order_Dir'] = $this->state->get('list.direction', ''); + + $lists['type'] = JHTML::_('select.genericlist', $optiontype, 'media_type', + 'class="inputbox" size="1" onchange="document.adminForm.submit();" ', 'value', 'text', $media_type + ); + + $lists['filter_media_section'] = JHTML::_('select.genericlist', $optionsection, 'filter_media_section', + 'class="inputbox" size="1" onchange="document.adminForm.submit();" ', 'value', 'text', $filter_media_section + ); + + $media = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->lists = $lists; + $this->media = $media; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + $this->assign('baseURL', JURI::root()); + + if (JFactory::getApplication()->input->get('layout') == 'thumbs') + { + $this->images = $this->get('images'); + $this->documents = $this->get('documents'); + $this->folders = $this->get('folders'); + } + + parent::display($tpl); + } + + public function setFolder($index = 0) + { + if (isset($this->folders[$index])) + { + $this->_tmp_folder = $this->folders[$index]; + } + else + { + $this->_tmp_folder = new JObject; + } + } + + public function setImage($index = 0) + { + if (isset($this->images[$index])) + { + $this->_tmp_img = $this->images[$index]; + } + else + { + $this->_tmp_img = new JObject; + } + } + + public function setDoc($index = 0) + { + if (isset($this->documents[$index])) + { + $this->_tmp_doc = $this->documents[$index]; + } + else + { + $this->_tmp_doc = new JObject; + } + } +} diff --git a/component/admin/views/media_detail/index.html b/component/admin/views/media_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/media_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/media_detail/tmpl/default.php b/component/admin/views/media_detail/tmpl/default.php new file mode 100644 index 00000000000..d95c6f8cb08 --- /dev/null +++ b/component/admin/views/media_detail/tmpl/default.php @@ -0,0 +1,513 @@ +input; +$post = $jinput->post->getArray(); + +jimport('joomla.filesystem.file'); + +$url = JUri::root(); + +$showbuttons = $jinput->get('showbuttons'); +$section_id = $jinput->get('section_id'); +$section_name = $jinput->get('section_name'); +$media_section = $jinput->get('media_section'); +$k = 0; + +if ($jinput->getCmd('task') == "add") +{ + $this->detail->media_id = 0; + $this->detail->media_alternate_text = ''; +} + +JFactory::getDocument()->addScriptDeclaration(' +(function ($) { + $(document).ready(function () { + $("#media_section").on("change", function(){ + $("#section_id").select2("val",""); + + if ($(this).val() == "catalog") + { + $("[name=media_type]").val("document").trigger("change.select2"); + $("[name=media_type]").attr("disabled", true); + } else { + $("[name=media_type]").attr("disabled", false); + } + }); + + var media_type = $("select[name=media_type]").val(); + var media_section = "' . $this->detail->media_section . '"; + + if (media_section == "catalog") + { + $("[name=media_type]").val("document").trigger("change.select2"); + $("[name=media_type]").attr("disabled", true); + } + + if (media_type == "youtube"){ + $("#youtube-wrapper").show(); + $("#media_data").hide(); + } + else{ + $("#youtube-wrapper").hide(); + $("#media_data").show(); + } + + $("select[name=media_type]").on("change", function(){ + var value = $(this).val(); + if (value == "youtube"){ + $("#youtube-wrapper").show(); + $("#media_data").hide(); + } + else{ + $("#youtube-wrapper").hide(); + $("#media_data").show(); + } + }); + }); +})(jQuery); +function jimage_insert(main_path) { + var path_url = "' . $url . '"; + if (main_path) { + document.getElementById("image_display").style.display = "block"; + document.getElementById("media_bank_image").value = main_path; + document.getElementById("image_display").src = path_url + main_path; + } + else { + document.getElementById("media_bank_image").value = ""; + document.getElementById("image_display").src = ""; + } +} +function jdownload_file(path, filename) { + document.getElementById("selected_file").innerHTML = filename; + document.getElementById("hdn_download_file_path").value = path; + document.getElementById("hdn_download_file").value = filename; +} +'); + +if ($showbuttons) +{ + ?> +
    +
    + + +
    +
    +
    + + + + +
    +
    +
    +
    + + detail->media_id == 0) + { + ?> + + + + + + +
    + ?lists['bulk']; ?>    +
    + '; + } + ?> + + + + +
    detail->media_id == 0) + { ?> + style="display: none;" + + > + + + + + + + + + + + +
    + detail->media_name) + { + $filetype = strtolower(JFile::getExt($this->detail->media_name)); + + if ($filetype == 'png' || $filetype == 'jpg' || $filetype == 'jpeg' || $filetype == 'gif') + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $this->detail->media_name, + '', + 'thumb', + $this->detail->media_section, + Redshop::getConfig()->get('THUMB_WIDTH'), + Redshop::getConfig()->get('THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + ?> + + + image + + + detail->media_name; ?> + + + +
    + detail->media_id == 0) + { ?> + + + + + + +
    +
    +
    + + + + + + + + + + + +
    +
    +
    + + + +
    +
    +
    + + +
    +
    + +
    +
    + + + +
    +
    +
    + + +
    +
    + detail->media_id == 0) + { ?> +
    + + + + + + + + + +
    + + + +
    +
    + +
    +
    +
    + +
    + + + + + + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + lists['type']; ?> + + +
    + + + +
    + + + +
    + + + + + + detail->media_id != 0) + { + echo ''; + } + + echo $this->lists['section']; + ?> + +
    + + + getModel('media_detail'); + + if ($showbuttons) + { + if ($section_name) + { + $sectionValue->text = $section_name; + } + else + { + if ($data = $model->getSection($section_id, $media_section)) + { + $sectionValue->text = $data->name; + } + } + + $sectionValue->value = $section_id; + $sectionIdName = 'disabled_section_id'; + $listAttributes = array('disabled' => 'disabled'); + echo ''; + } + else + { + if ($data = $model->getSection($this->detail->section_id, $this->detail->media_section)) + { + $sectionValue->text = $data->name; + $sectionValue->value = $data->id; + } + } + + echo JHtml::_('redshopselect.search', $sectionValue, + $sectionIdName, + array( + 'select2.ajaxOptions' => array('typeField' => ', media_section:$(\'#media_section\').val()'), + 'select2.options' => array('placeholder' => JText::_('COM_REDSHOP_SECTION_NAME'), 'minimumInputLength' => 0), + 'list.attr' => $listAttributes + ) + ); + echo JHTML::tooltip(JText::_('COM_REDSHOP_TOOLTIP_SECTION_NAME'), JText::_('COM_REDSHOP_SECTION_NAME'), 'tooltip.png', '', '', false); ?> +
    + : + + lists['published']; ?> +
    +
    + +
    +
    diff --git a/component/admin/views/media_detail/tmpl/index.html b/component/admin/views/media_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/media_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/media_detail/view.html.php b/component/admin/views/media_detail/view.html.php new file mode 100644 index 00000000000..aba1e715e6f --- /dev/null +++ b/component/admin/views/media_detail/view.html.php @@ -0,0 +1,128 @@ +setLayout('default'); + + $lists = array(); + + $detail = $this->get('data'); + $isNew = ($detail->media_id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_MEDIAS') . ': [ ' . $text . ' ]', 'camera redshop_media48'); + + JToolBarHelper::apply(); + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $jinput = JFactory::getApplication()->input; + + $media_section = $jinput->get('media_section'); + $showbuttons = $jinput->get('showbuttons'); + + $optiontype = array(); + $optiontype[] = JHTML::_('select.option', 'images', JText::_('COM_REDSHOP_IMAGE')); + $optiontype[] = JHTML::_('select.option', 'video', JText::_('COM_REDSHOP_VIDEO')); + $optiontype[] = JHTML::_('select.option', 'document', JText::_('COM_REDSHOP_DOCUMENT')); + $optiontype[] = JHTML::_('select.option', 'youtube', JText::_('COM_REDSHOP_YOUTUBE')); + + if ($media_section == 'product' && $showbuttons == 1) + { + $optiontype[] = JHTML::_('select.option', 'download', JText::_('COM_REDSHOP_Download')); + } + + $optionsection = array(); + $optionsection[] = JHTML::_('select.option', 'product', JText::_('COM_REDSHOP_PRODUCT')); + $optionsection[] = JHTML::_('select.option', 'property', JText::_('COM_REDSHOP_PROPERTY')); + $optionsection[] = JHTML::_('select.option', 'subproperty', JText::_('COM_REDSHOP_SUBPROPERTY')); + $optionsection[] = JHTML::_('select.option', 'category', JText::_('COM_REDSHOP_CATEGORY')); + $optionsection[] = JHTML::_('select.option', 'catalog', JText::_('COM_REDSHOP_CATALOG')); + + $optionbulk = array(); + $optionbulk[] = JHTML::_('select.option', '0', JText::_('COM_REDSHOP_SELECT')); + $optionbulk[] = JHTML::_('select.option', 'yes', JText::_('COM_REDSHOP_YES_ZIP_UPLOAD')); + $optionbulk[] = JHTML::_('select.option', 'no', JText::_('COM_REDSHOP_NO_ZIP_UPLOAD')); + + $lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + + $section_id = $jinput->get('section_id'); + $section_name = $jinput->get('section_name'); + $media_section = $jinput->get('media_section'); + + if ($media_section == 'catalog') + { + $detail->media_type = 'document'; + $detail->media_section = $media_section; + $detail->section_name = $section_name; + $detail->section_id = $section_id; + } + + $lists['type'] = JHTML::_('select.genericlist', $optiontype, 'media_type', 'class="inputbox" size="1" ', 'value', 'text', $detail->media_type, '0'); + + if ($detail->media_id == 0 && !$showbuttons) + { + $lists['section'] = JHTML::_('select.genericlist', $optionsection, 'media_section', + '', 'value', 'text' + ); + } + else + { + $defaultMedia = ($showbuttons) ? $media_section : $detail->media_section; + $lists['section'] = JHTML::_('select.genericlist', $optionsection, 'disable_media_section', + ' disabled="disabled" ', + 'value', 'text', $defaultMedia + ); + } + + $lists['bulk'] = JHTML::_('select.genericlist', $optionbulk, 'bulk', + 'class="inputbox" size="1" onchange="media_bulk(this)" title="com_redshop" ', + 'value', 'text', 'no' + ); + + $this->lists = $lists; + $this->detail = $detail; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/newsletter/index.html b/component/admin/views/newsletter/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/newsletter/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/newsletter/tmpl/default.php b/component/admin/views/newsletter/tmpl/default.php new file mode 100644 index 00000000000..27293004034 --- /dev/null +++ b/component/admin/views/newsletter/tmpl/default.php @@ -0,0 +1,100 @@ +getModel('newsletter'); +?> + + +
    +
    +
    +
    +
    + + "> + +
    +
    +
    + + + + + + + + + + + + + newsletters); $i < $n; $i++) + { + $row = $this->newsletters [$i]; + $row->id = $row->newsletter_id; + $link = JRoute::_('index.php?option=com_redshop&view=newsletter_detail&task=edit&cid[]=' . $row->newsletter_id); + $published = JHTML::_('grid.published', $row, $i); ?> + "> + + + + + + + + + + + + +
    lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>
    pagination->getRowOffset($i);?>id);?>name;?> + subject;?>noofsubscribers($row->newsletter_id);?>newsletter_id;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter();?>
    +
    + + + + + +
    diff --git a/component/admin/views/newsletter/tmpl/index.html b/component/admin/views/newsletter/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/newsletter/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/newsletter/tmpl/preview.php b/component/admin/views/newsletter/tmpl/preview.php new file mode 100644 index 00000000000..f0c25a760dd --- /dev/null +++ b/component/admin/views/newsletter/tmpl/preview.php @@ -0,0 +1,225 @@ +input; + +$post = $jinput->post->getArray(); + +$filter = $jinput->get('filter'); +$number_order = $jinput->get('number_order', ''); +$model = $this->getModel('newsletter'); +$cid = $jinput->post->get('cid', array(0), 'array'); +$newsletter_id = $jinput->get('newsletter_id'); +$oprand = $jinput->get('oprand', 'select'); +$total_start = $jinput->get('total_start', ''); +$total_end = $jinput->get('total_end', ''); +$zipstart = $jinput->get('zipstart', ''); +$zipend = $jinput->get('zipend', ''); +$start = $jinput->get('start_date', ''); +$end = $jinput->get('end_date', ''); +$cityfilter = $jinput->get('cityfilter', ''); + +if (isset($post['checkoutshoppers'])) +{ + $checked = 'checked="checked"'; +} +else +{ + $checked = ""; +} +?> + + +
    + + + "/> + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    :lists['oprand'];?>  +
    : +
    :
    :
    : + + :  + 'form-control', 'size' => '15', 'maxlength' => '19') + ); + ?> + + :  + 'form-control', 'size' => '15', 'maxlength' => '19') + ); + ?> +
    :lists['categories'];?>
    :lists['product'];?>
    :lists['country'];?>
    :lists['shoppergroups'];?>
    : name="checkoutshoppers"/>
    + + +
    +
    +
    +
     
    +
    + + + + +
    + +
    +
    + + subscribers); $i < $n; $i++) + { + $row = $this->subscribers[$i]; + + $row->id = $row->subscription_id; + + $cond = $model->order_user($row->user_id); + + $category = $model->category($row->user_id); + + $product = $model->product($row->user_id); + + if ($cond != 0 && ($category != 0 && $product != 0)) + { + + if ($i % 4 == 0) echo ''; + ?> + + + '; + + } + + + } + ?> +
    + id); ?> + + + username != NULL) + { + echo $uname = $row->firstname . " " . $row->lastname . " (" . $row->username . ")"; + } + else + { + echo $uname = $row->name; + } + + ?> +
    +
    +
    +
    diff --git a/component/admin/views/newsletter/tmpl/previewlog.php b/component/admin/views/newsletter/tmpl/previewlog.php new file mode 100644 index 00000000000..f2ffd9ea4eb --- /dev/null +++ b/component/admin/views/newsletter/tmpl/previewlog.php @@ -0,0 +1,94 @@ +input; + +$model = $this->getModel('newsletter'); +$cid = $jinput->post->get('cid', array(0), 'array'); +$newsletter_id = $jinput->get('newsletter_id'); +?> + +
    +
    +
    + + + + + +
    +
    +
    +
    +
    + + + + +
    diff --git a/component/admin/views/newsletter/view.html.php b/component/admin/views/newsletter/view.html.php new file mode 100644 index 00000000000..ddd378e239f --- /dev/null +++ b/component/admin/views/newsletter/view.html.php @@ -0,0 +1,71 @@ +setTitle(JText::_('COM_REDSHOP_NEWSLETTER')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_NEWSLETTER_MANAGEMENT'), 'envelope redshop_newsletter48'); + $layout = JFactory::getApplication()->input->getCmd('layout', ''); + + if ($layout == 'previewlog') + { + $this->setLayout($layout); + } + else + { + JToolBarHelper::custom('send_newsletter_preview', 'send.png', 'send.png', JText::_('COM_REDSHOP_SEND_NEWSLETTER'), true, false); + JToolBarHelper::custom('copy', 'copy.png', 'copy_f2.png', JText::_('COM_REDSHOP_TOOLBAR_COPY'), true); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + } + + $this->state = $this->get('State'); + $lists['order'] = $this->state->get('list.ordering', 'newsletter_id'); + $lists['order_Dir'] = $this->state->get('list.direction'); + + $newsletters = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->newsletters = $newsletters; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/newsletter/view.preview.php b/component/admin/views/newsletter/view.preview.php new file mode 100644 index 00000000000..543175e577f --- /dev/null +++ b/component/admin/views/newsletter/view.preview.php @@ -0,0 +1,98 @@ +input->post->get('cid', array(0), 'array'); + + $selected_product = $app->input->get('product', ''); + $n = $cid[0]; + + /** @var RedshopModelNewsletter $model */ + $model = $this->getModel('newsletter'); + $subscribers = $model->listallsubscribers($n); + + $document = JFactory::getDocument(); + $document->setTitle(JText::_('COM_REDSHOP_NEWSLETTER')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_NEWSLETTER_MANAGEMENT'), 'redshop_newsletter48'); + + JToolBarHelper::custom('send_newsletter', 'send.png', 'send.png', 'Send Newsletter'); + JToolBarHelper::cancel('close', JText::_('JTOOLBAR_CLOSE')); + + $uri = JFactory::getURI(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'newsletter_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + $newsletters = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $oprand = $app->input->getCmd('oprand', 'select'); + + $optionoprand = array(); + $optionoprand[] = JHtml::_('select.option', 'select', JText::_('COM_REDSHOP_SELECT')); + $optionoprand[] = JHtml::_('select.option', 'more', JText::_('COM_REDSHOP_GTOREQUEL')); + $optionoprand[] = JHtml::_('select.option', 'less', JText::_('COM_REDSHOP_LTOREQUEL')); + $optionoprand[] = JHtml::_('select.option', 'equally', JText::_('COM_REDSHOP_EQUAL_SIGN')); + $lists['oprand'] = JHtml::_('select.genericlist', $optionoprand, 'oprand', 'class="inputbox" size="1" ', 'value', 'text', $oprand); + + $country_option = array(); + $country_option[] = JHtml::_('select.option', '', JText::_('COM_REDSHOP_SELECT_COUNTRY')); + + $country = $model->getContry(); + + $country_data = array_merge($country_option, $country); + + $country_value = $app->input->get('country', ''); + + $lists['country'] = JHtml::_('select.genericlist', $country_data, 'country[]', + 'class="inputbox" multiple="multiple" size="4" ', 'value', 'text', $country_value + ); + + $categories = RedshopHelperCategory::listAll("product_category[]", 0, '', 10, true, true); + $lists['categories'] = $categories; + + $product_data = $model->getProduct(); + + $lists['product'] = JHtml::_('select.genericlist', $product_data, 'product[]', + 'class="inputbox" multiple="multiple" size="8" ', 'value', 'text', $selected_product + ); + + $shopper_option = array(); + $shopper_option[] = JHtml::_('select.option', '', JText::_('COM_REDSHOP_SELECT')); + $shoppergroup = $app->input->get('shoppergroups', ''); + $ShopperGrup = $model->getShopperGroup(); + $ShopperGroups = array_merge($shopper_option, $ShopperGrup); + + $lists['shoppergroups'] = JHtml::_('select.genericlist', $ShopperGroups, 'shoppergroups[]', + 'class="inputbox" multiple="multiple" size="8" ', 'value', 'text', $shoppergroup + ); + + $this->subscribers = $subscribers; + $this->lists = $lists; + $this->newsletters = $newsletters; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + $this->setLayout('preview'); + + parent::display($tpl); + } +} diff --git a/component/admin/views/newsletter_detail/index.html b/component/admin/views/newsletter_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/newsletter_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/newsletter_detail/tmpl/default.php b/component/admin/views/newsletter_detail/tmpl/default.php new file mode 100644 index 00000000000..ebf5891ac75 --- /dev/null +++ b/component/admin/views/newsletter_detail/tmpl/default.php @@ -0,0 +1,145 @@ +getModel('newsletter_detail'); +?> + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + +
    + + + display("body", $this->detail->body, '$widthPx', '$heightPx', '100', '20'); ?> +
    + : + + lists['newsletter_template']; ?>  + + detail->template_id != 0) + { + ?> + + + + + + +
    + : + + lists['published']; ?> +
    +
    +
    +
    +
    + + + + + +
    +
    +
    + getnewslettertexts(); + if (count($tags) > 0) + { + ?> +
    +
    + + + + + + + + +
    + desc ?>: + + name . "}"; ?> +
    +
    +
    + +
    + + + + +
    diff --git a/component/admin/views/newsletter_detail/tmpl/index.html b/component/admin/views/newsletter_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/newsletter_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/newsletter_detail/tmpl/statistics.php b/component/admin/views/newsletter_detail/tmpl/statistics.php new file mode 100644 index 00000000000..9076e649083 --- /dev/null +++ b/component/admin/views/newsletter_detail/tmpl/statistics.php @@ -0,0 +1,87 @@ +input->getInt('newsid', 0); +$model = $this->getModel('newsletter_detail'); + +$newsletter_list = $model->getNewsletterList(); + +$sel = array(); +$sel[0] = new stdClass; +$sel[0]->newsletter_id = 0; +$sel[0]->text = JText::_('COM_REDSHOP_SELECT'); +$newsletter_list = array_merge($sel, $newsletter_list); +$selnewsletter = JHTML::_('select.genericlist', $newsletter_list, 'newsid', 'class="inputbox" size="1" onchange="document.adminForm.submit();" ', 'newsletter_id', 'text', $newsid); + +$returnstring = $model->getNewsletterTracker($newsid); + +$querystring = $returnstring[0]; +$title = $returnstring[1]; + +$data = ""; +$rowdata = array(); +for ($i = 0, $in = count($querystring); $i < $in; $i++) +{ + $rowdata[] = "['" . $querystring[$i]->xdata . "'," . $querystring[$i]->ydata . "]"; +} +$rowdata = implode(",", $rowdata); +$data .= "[$rowdata]"; + +?> + +
    +
    + + + + + + +
    :
    +
    +
    + +
    +
    +
    + + + + +
    diff --git a/component/admin/views/newsletter_detail/view.html.php b/component/admin/views/newsletter_detail/view.html.php new file mode 100644 index 00000000000..5013afd51f0 --- /dev/null +++ b/component/admin/views/newsletter_detail/view.html.php @@ -0,0 +1,96 @@ +input; + + $layout = $jinput->getCmd('layout', ''); + + $model = $this->getModel('newsletter_detail'); + $templates = $model->gettemplates(); + + // Merging select option in the select box + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->value = 0; + $temps[0]->text = JText::_('COM_REDSHOP_SELECT'); + $templates = @array_merge($temps, $templates); + + $document = JFactory::getDocument(); + + $uri = JUri::getInstance(); + $lists = array(); + $detail = $this->get('data'); + $isNew = ($detail->newsletter_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + if ($layout == "statistics") + { + $document->addScript('//www.google.com/jsapi'); + $text = "statistics"; + $jinput->set('hidemainmenu', 1); + $this->setLayout($layout); + } + else + { + $this->setLayout('default'); + } + + JToolBarHelper::title(JText::_('COM_REDSHOP_NEWSLETTER') . ': [ ' . $text . ' ]', 'envelope-opened redshop_newsletter48'); + + if ($layout != "statistics") + { + JToolBarHelper::apply(); + JToolBarHelper::save(); + } + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $model = $this->getModel('newsletter_detail'); + + $lists['newsletter_template'] = JHTML::_('select.genericlist', $templates, 'template_id', + 'class="inputbox" size="1" ', 'value', 'text', $detail->template_id + ); + + $lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + + $this->lists = $lists; + $this->detail = $detail; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/newslettersubscr/index.html b/component/admin/views/newslettersubscr/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/newslettersubscr/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/newslettersubscr/tmpl/default.php b/component/admin/views/newslettersubscr/tmpl/default.php new file mode 100644 index 00000000000..9a2316bbf15 --- /dev/null +++ b/component/admin/views/newslettersubscr/tmpl/default.php @@ -0,0 +1,146 @@ +getModel('newslettersubscr'); +?> + + +
    +
    +
    +
    +
    + + "> + +
    +
    +
    + + + + + + + + + + + + + + getModel('newslettersubscr'); + $k = 0; + for ($i = 0, $n = count($this->newslettersubscrs); $i < $n; $i++) + { + $row = $this->newslettersubscrs[$i]; + $row->id = $row->subscription_id; + + $link = JRoute::_('index.php?option=com_redshop&view=newslettersubscr_detail&task=edit&cid[]=' . $row->subscription_id); + + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); + ?> + "> + + + + + + + + + + + + +
    + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($i); ?> + + id); ?> + + user_id == 0 ? $name = $row->name : $name = RedshopHelperOrder::getUserFullName($row->user_id); echo $name;?> + + convertDateFormat($row->date); ?> + + n_name; ?> + + + + subscription_id; ?> +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + + +
    diff --git a/component/admin/views/newslettersubscr/tmpl/index.html b/component/admin/views/newslettersubscr/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/newslettersubscr/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/newslettersubscr/view.html.php b/component/admin/views/newslettersubscr/view.html.php new file mode 100644 index 00000000000..fc37932c907 --- /dev/null +++ b/component/admin/views/newslettersubscr/view.html.php @@ -0,0 +1,61 @@ +setTitle(JText::_('COM_REDSHOP_NEWSLETTER_SUBSCR')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_NEWSLETTER_SUBSCR_MANAGEMENT'), 'envelope redshop_newsletter48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $this->state = $this->get('State'); + $lists['order'] = $this->state->get('list.ordering', 'subscription_id'); + $lists['order_Dir'] = $this->state->get('list.direction'); + + $newslettersubscrs = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->newslettersubscrs = $newslettersubscrs; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/newslettersubscr_detail/index.html b/component/admin/views/newslettersubscr_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/newslettersubscr_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/newslettersubscr_detail/tmpl/default.php b/component/admin/views/newslettersubscr_detail/tmpl/default.php new file mode 100644 index 00000000000..5185078ca82 --- /dev/null +++ b/component/admin/views/newslettersubscr_detail/tmpl/default.php @@ -0,0 +1,132 @@ +getModel('newslettersubscr_detail'); +?> + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + *: + + text = ($this->detail->user_id != 0) ? $model->getuserfullname2($this->detail->user_id) : $this->detail->name; + $userObject->value = ($this->detail->subscription_id != 0) ? $this->detail->user_id : ''; + echo JHTML::_('redshopselect.search', $userObject, 'user_id', + array( + 'select2.ajaxOptions' => array('typeField' => ', user:1'), + 'select2.options' => array( + 'placeholder' => JText::_('COM_REDSHOP_NEWSLETTER_SELECT_USER'), + 'events' => array('select2-selecting' => 'function(e) {document.getElementById(\'email\').value = e.object.volume;}') + ) + ) + ); + ?> + +
    + : + + lists['newsletters']; ?> + +
    + + + detail->date): + $datee = date(Redshop::getConfig()->getString('DEFAULT_DATEFORMAT', 'Y-m-d'), $this->detail->date); + else: + $datee = null; + endif; + + echo JHtml::_( + 'redshopcalendar.calendar', + $datee, + 'date', + 'date', + null, + array('class' => 'form-control', 'size' => '15', 'maxlength' => '19'), + true + ); + ?> +
    + + + + +
    + : + + lists['published']; ?> +
    +
    +
    +
    + + + + +
    diff --git a/component/admin/views/newslettersubscr_detail/tmpl/index.html b/component/admin/views/newslettersubscr_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/newslettersubscr_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/newslettersubscr_detail/view.html.php b/component/admin/views/newslettersubscr_detail/view.html.php new file mode 100644 index 00000000000..2c21c205e1b --- /dev/null +++ b/component/admin/views/newslettersubscr_detail/view.html.php @@ -0,0 +1,70 @@ +setLayout('default'); + + $lists = array(); + + $detail = $this->get('data'); + + $isNew = ($detail->subscription_id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_NEWSLETTER_SUBSCR') . ': [ ' . $text . ' ]', 'envelope-opened redshop_newsletter48'); + JToolBarHelper::apply(); + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $model = $this->getModel('newslettersubscr_detail'); + $newsletters = $model->getnewsletters(); + + $lists['newsletters'] = JHTML::_('select.genericlist', $newsletters, 'newsletter_id', + 'class="inputbox" size="1" ', 'value', 'text', $detail->newsletter_id + ); + $lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + + $this->lists = $lists; + $this->detail = $detail; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/opsearch/index.html b/component/admin/views/opsearch/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/opsearch/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/opsearch/tmpl/default.php b/component/admin/views/opsearch/tmpl/default.php new file mode 100644 index 00000000000..00daaaca182 --- /dev/null +++ b/component/admin/views/opsearch/tmpl/default.php @@ -0,0 +1,117 @@ +input->get('showbuttons', ''); ?> +
    +
    + +
    +
    + text = ''; + + if ($this->state->get('filter_product') && ($productData = $productHelper->getProductById($this->state->get('filter_product')))) + { + $filterObject->text = $productData->product_name; + } + + $filterObject->value = $this->state->get('filter_product'); + + echo JHTML::_('redshopselect.search', $filterObject, 'filter_product', + array( + 'select2.options' => array( + 'events' => array('select2-selecting' => 'function(e) {document.getElementById(\'filter_product\').value = e.object.id;document.adminForm.submit();}') + ) + ) + ); + ?> + +
    +
    + lists['filter_status']; ?> +
    +
    + lists['filter_user']; ?> +
    +
    + + + + + + + + + + + + + + + products); $i < $n; $i++) + { + $row = $this->products[$i]; + + $link = JRoute::_('index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $row->product_id); + $link_order = 'index.php?option=com_redshop&view=order_detail&task=edit&cid[]=' . $row->order_id; + $link_order = RedshopHelperUtility::getSSLLink($link_order); ?> + "> + + + + + + + + + + + + + + + + + + +
    lists['order_Dir'], $this->lists['order']); ?>lists['order_Dir'], $this->lists['order']); ?>lists['order_Dir'], $this->lists['order']); ?>lists['order_Dir'], $this->lists['order']); ?>lists['order_Dir'], $this->lists['order']); ?>lists['order_Dir'], $this->lists['order']); ?>
    pagination->getRowOffset($i); ?>order_item_name; ?> + order_item_sku; ?>order_id; ?> + convertDateFormat($row->mdate);?>order_status);?>product_quantity; ?>fullname; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + +
    diff --git a/component/admin/views/opsearch/tmpl/index.html b/component/admin/views/opsearch/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/opsearch/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/opsearch/view.html.php b/component/admin/views/opsearch/view.html.php new file mode 100644 index 00000000000..26de814ccbd --- /dev/null +++ b/component/admin/views/opsearch/view.html.php @@ -0,0 +1,56 @@ +getModel('opsearch'); + + $uri = JUri::getInstance(); + $document = JFactory::getDocument(); + + $document->setTitle(JText::_('COM_REDSHOP_PRODUCT_ORDER_SEARCH_BY_CUSTOMER')); + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_ORDER_SEARCH_BY_CUSTOMER'), 'redshop_order48'); + + $this->state = $this->get('State'); + $lists['order'] = $this->state->get('list.ordering', 'order_item_name'); + $lists['order_Dir'] = $this->state->get('list.direction', ''); + + $filter_user = $this->state->get('filter_user', 0); + $filter_status = $this->state->get('filter_status', 0); + + $products = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $lists['filter_user'] = $model->getuserlist('filter_user', $filter_user, 'class="inputbox" size="1" onchange="document.adminForm.submit();"'); + $lists['filter_status'] = RedshopHelperOrder::getStatusList('filter_status', $filter_status, + 'class="inputbox" size="1" onchange="document.adminForm.submit();"' + ); + + $this->lists = $lists; + $this->products = $products; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/order/index.html b/component/admin/views/order/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/order/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/order/tmpl/batch.php b/component/admin/views/order/tmpl/batch.php new file mode 100644 index 00000000000..558bec5725c --- /dev/null +++ b/component/admin/views/order/tmpl/batch.php @@ -0,0 +1,79 @@ +getUserState("com_redshop.order.batch.postdata"); +$postdata = unserialize($serialized); +$orderIds = implode(',', $postdata['cid']); +?> + + + + +
    +
    +
    + +
     
    + +
    +
    + diff --git a/component/admin/views/order/tmpl/default.php b/component/admin/views/order/tmpl/default.php new file mode 100644 index 00000000000..3827278857e --- /dev/null +++ b/component/admin/views/order/tmpl/default.php @@ -0,0 +1,798 @@ +getString('DEFAULT_DATEFORMAT', 'Y-m-d'); +$lists = $this->lists; +$model = $this->getModel('order'); +$stockroomHelper = rsstockroomhelper::getInstance(); +$dispatcher = RedshopHelperUtility::getDispatcher(); +JPluginHelper::importPlugin('redshop_product'); +?> + + + + + +
    +
    +
    +
    +
    + + + +
    +
    +
    + +
    + get('State'); + $startDate = $state->get('filter_from_date'); + $endDate = $state->get('filter_to_date'); + ?> +
    + '15', + 'maxlength' => '19', + 'placeholder' => JText::_('COM_REDSHOP_FROM') . ' ' . JText::_('JDATE') + ) + ); + ?> +
    +
    + '15', + 'maxlength' => '19', + 'placeholder' => JText::_('COM_REDSHOP_TO') . ' ' . JText::_('JDATE') + ) + ); + ?> +
    + +
    + +
    +
    + +
    +
    +
    + + + + + + + + get('ECONOMIC_INTEGRATION') == 1 && Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT') == 2): ?> + + + + + + + + + + + + get('USE_STOCKROOM') == 1): ?> + + + + + + + get('POSTDK_INTEGRATION')): ?> + + + + + + get('SEND_MAIL_TO_CUSTOMER') ? 'checked' : 0; + $k = 0; + ?> + orders); $i < $n; $i++): ?> + orders[$i]; + $row->id = $row->order_id; + $link = 'index.php?option=com_redshop&view=order_detail&task=edit&cid[]=' . $row->order_id; + $link = RedshopHelperUtility::getSSLLink($link); + + /** + * This is an event that is using into back-end order listing page. In to grid column, below update status. + * This event is called to add highlighter from which order can be identified that plug-in enhancement is included into this order. + */ + $data = new stdClass; + $data->highlight = new stdClass; + $results = $dispatcher->trigger('toHighlightGrid', array(&$row)); + $data->highlight->toHighlightGrid = trim(implode("\n", $results)); + ?> + + + + + get('ECONOMIC_INTEGRATION') == 1 && Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT') == 2 + && $row->invoice_no && $row->is_booked == 1 && $row->bookinvoice_number + ): ?> + + + + + + + + + + + + get('USE_STOCKROOM') == 1) : ?> + order_id); + $stockroomIds = array(); + + foreach ($orderItems as $orderItem) + { + if (!empty($orderItem->stockroom_id)) + { + $stockroomIds[] = (int) $orderItem->stockroom_id; + } + } + ?> + + + + + + + get('POSTDK_INTEGRATION')) + { + $details = Redshop\Shipping\Rate::decrypt($row->ship_method_id); + $shippingParams = new JRegistry; + + if (!empty($details[0])) + { + $shippingPlugin = JPluginHelper::getPlugin( + 'redshop_shipping', + str_replace('plgredshop_shipping', '', strtolower($details[0])) + ); + + if (!empty($shippingPlugin)) + { + $shippingParams = new JRegistry($shippingPlugin->params); + } + } + + // Checking 'plgredshop_shippingdefault_shipping' to support backward compatibility + $allowPacsoftLabel = ($details[0] === 'plgredshop_shippingdefault_shipping' || (boolean) $shippingParams->get('allowPacsoftLabel')); + + if ($allowPacsoftLabel) + { + echo "'; + } + } + ?> + + + + + + + + +
    # + lists['order_Dir'], $this->lists['order']) ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + + + trigger('onAdminDisplayOrder', array(array(), 'header')) ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + + + + + lists['order_Dir'], $this->lists['order']); ?> +  
    + pagination->getRowOffset($i); ?> + + id); ?> + + order_id ?> + bookinvoice_number ?> + + firstname . ' ' . $row->lastname ?> + + + user_email ?> + + is_company): ?> + company_name; ?> + + + + + customer_note) ?> + + trigger('onAdminDisplayOrder', array(&$row, 'row')) ?> + + order_status_name ?> + + order_payment_status); ?> + + order_payment_status == 'Paid'): ?> + + order_payment_status == 'Unpaid'): ?> + + order_payment_status == 'Partial Paid' || $row->order_payment_status == 'PartialPaid'): ?> + + + + + getProductFormattedPrice($row->order_total); ?> + + order_id; + ?> + + + + highlight->toHighlightGrid; ?> + + + + + stockroom_name ?> +
    + min_del_time . "-" . $stockroom->max_del_time . " " . $stockroom->delivery_time ?> +
    + + +
    + "; + + if (!empty($stockroomIds)) + { + $max_delivery = RedshopHelperStockroom::getStockroomMaxDelivery(implode(',', $stockroomIds)); + $orderDate = $config->convertDateFormat($row->cdate); + + $stamp = mktime(0, 0, 0, date('m', $row->cdate), date('d', $row->cdate) + $max_delivery[0]->max_del_time, date('Y', $row->cdate)); + $delivery_date = date('d/m/Y', $stamp); + $current_date = date('d/m/Y'); + $dateDiff = RedshopHelperStockroom::getDateDiff($stamp, time()); + + if ($dateDiff < 0) + { + $dateDiff = 0; + } + + echo $dateDiff . " " . $max_delivery[0]->delivery_time; + } + ?> + + cdate); ?> + + + + + + + + + + invoice_no != ''): ?> + is_booked == 0 && $row->bookinvoice_date <= 0): ?> + is_company == 1 && $row->ean_number != ""): ?> + + + order_id . '\';document.invoice.bookInvoiceDate.value=document.getElementById(\'bookDate' . $i . '\').value;document.invoice.submit(); }'; + + if ($row->order_payment_status == 'Paid' || $row->order_status == 'PR' || $row->order_status == 'C') + { + $confirm = 'document.invoice.order_id.value=\'' . $row->order_id . '\';document.invoice.bookInvoiceDate.value=document.getElementById(\'bookDate' . $i . '\').value;document.invoice.submit();'; + } + + echo JHtml::_( + 'redshopcalendar.calendar', + date($calendarFormat), + 'bookDate' . $i, + 'bookDate' . $i, + $calendarFormat, + array('class' => 'form-control', 'size' => '15', 'maxlength' => '19') + ); + ?> +
    + " + onclick="javascript:">
    + + bookinvoice_date > 0): ?> +
    + convertDateFormat($row->bookinvoice_date) ?> + + +
    "; + + if ($row->order_label_create) + { + echo JTEXT::_("COM_REDSHOP_XML_ALREADY_GENERATED"); + } + else + { + echo JHtml::_( + 'redshopcalendar.calendar', + date($calendarFormat), + 'specifiedDate' . $i, + 'specifiedDate' . $i, + $calendarFormat, + array('class' => 'form-control', 'size' => '15', 'maxlength' => '19') + ); + ?> + + "; + } + else + { + echo '' . JText::_('COM_REDSHOP_NO_PACSOFT_LABEL') . '
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    + + + + + + + + + +
    +
    + + + + + +
    + +
    + + + + + +
    + + + +get('POSTDK_INTEGRATION')): ?> + + + diff --git a/component/admin/views/order/tmpl/index.html b/component/admin/views/order/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/order/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/order/tmpl/labellisting.php b/component/admin/views/order/tmpl/labellisting.php new file mode 100644 index 00000000000..18ade7f4b1b --- /dev/null +++ b/component/admin/views/order/tmpl/labellisting.php @@ -0,0 +1,123 @@ +input; +$download = $jinput->get('download'); + +if ($download) +{ + $oid = $jinput->getInt('oid'); + $baseURL = JURI::root(); + + $name = 'label_' . $oid . '.pdf'; + $tmp_name = JPATH_COMPONENT_ADMINISTRATOR . '/assets/lables/' . $name; + + $tmp_type = strtolower(JFile::getExt($name)); + + switch ($tmp_type) + { + case "pdf": + $ctype = "application/pdf"; + break; + default: + $ctype = "application/force-download"; + } + + header("Pragma: public"); + header('Expires: 0'); + header("Content-Type: $ctype"); + header('Content-Length: ' . filesize($tmp_name)); + header('Content-Disposition: attachment; filename=' . basename($name)); + + ob_clean(); + flush(); + readfile($tmp_name); + $app->close(); +} +?> +
    +
    + + + + + + + + + + + orders); $i < $n; $i++) + { + $row = $this->orders[$i]; + $row->id = $row->order_id; + $link = JRoute::_('index.php?option=com_redshop&view=order_detail&task=edit&cid[]=' . $row->order_id); + $dlink = JRoute::_('index.php?option=com_redshop&view=order&layout=labellisting&download=1&oid=' . $row->order_id); + $plink = JURI::base() . 'components/com_redshop/assets/lables/label_' . $row->order_id . '.pdf'; + ?> + "> + + + + + + + + + + +
    + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($i); ?> + + order_id; ?> + order_number; ?>cdate; ?>ship_method_id); + if (strstr($details[0], 'default_shipping')) + { + if (file_exists(JPATH_SITE . '/administrator/components/com_redshop/assets/lables/label_' . $row->order_id . '.pdf')) + { + ?> + + +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + + + + + +
    diff --git a/component/admin/views/order/view.html.php b/component/admin/views/order/view.html.php new file mode 100644 index 00000000000..ef2433fb788 --- /dev/null +++ b/component/admin/views/order/view.html.php @@ -0,0 +1,167 @@ +setTitle(JText::_('COM_REDSHOP_ORDER')); + $layout = JFactory::getApplication()->input->getCmd('layout'); + + if ($layout == 'previewlog') + { + $this->setLayout($layout); + } + elseif ($layout == 'labellisting') + { + RedshopToolbarHelper::title(JText::_('COM_REDSHOP_DOWNLOAD_LABEL'), 'redshop_order48'); + $this->setLayout('labellisting'); + RedshopToolbarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + elseif ($layout == 'batch') + { + RedshopToolbarHelper::title(JText::_('COM_REDSHOP_ORDER_MANAGEMENT'), 'stack redshop_order48'); + } + else + { + RedshopToolbarHelper::title(JText::_('COM_REDSHOP_ORDER_MANAGEMENT'), 'stack redshop_order48'); + RedshopToolbarHelper::addNew(); + + RedshopToolbarHelper::custom( + 'multiprint_order', + 'print_f2.png', + 'print_f2.png', + 'COM_REDSHOP_MULTI_PRINT_ORDER_LBL', + true + ); + + RedshopToolbarHelper::modal('massOrderStatusChange', 'fa fa-gears', 'COM_REDSHOP_CHANGE_STATUS_TO_ALL_LBL'); + + if (Redshop::getConfig()->get('POSTDK_INTEGRATION')) + { + RedshopToolbarHelper::modal('massOrderStatusPacsoft', 'fa fa-gears', 'COM_REDSHOP_CHANGE_STATUS_TO_ALL_WITH_PACSOFT_LBL'); + } + + $group = RedshopToolbarHelper::createGroup('export', 'COM_REDSHOP_EXPORT_DATA_LBL'); + + $group->appendButton('Standard', + '', + 'COM_REDSHOP_EXPORT_DATA_LBL', + 'export_data', + true + ); + + $group->appendButton('Standard', + '', + 'COM_REDSHOP_EXPORT_FULL_DATA_LBL', + 'export_fullorder_data', + false + ); + + $group->appendButton('Standard', + '', + 'COM_REDSHOP_EXPORT_GLS_LBL', + 'gls_export', + true + ); + + $group->appendButton('Standard', + '', + 'COM_REDSHOP_EXPORT_GLS_BUSINESS_LBL', + 'business_gls_export', + true + ); + + $group->renderGroup(); + + RedshopToolbarHelper::deleteList(); + + // Check PDF plugin + if (!RedshopHelperPdf::isAvailablePdfPlugins()) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_WARNING_MISSING_PDF_PLUGIN'), 'warning'); + } + } + + $state = $this->get('State'); + $this->filter = $state->get('filter'); + $filter_by = $state->get('filter_by'); + $filter_status = $state->get('filter_status'); + $filter_payment_status = $state->get('filter_payment_status'); + + $lists['order'] = $state->get('list.ordering', 'o.order_id'); + $lists['order_Dir'] = $state->get('list.direction', 'desc'); + + $lists['filter_by'] = RedshopHelperOrder::getFilterByList('filter_by', $filter_by, + 'class="inputbox" size="1" onchange="document.adminForm.submit();"' + ); + + $lists['filter_status'] = RedshopHelperOrder::getStatusList('filter_status', $filter_status, + 'class="inputbox" size="1" onchange="document.adminForm.submit();"' + ); + $lists['filter_payment_status'] = RedshopHelperOrder::getPaymentStatusList('filter_payment_status', $filter_payment_status, + 'class="inputbox" size="1" onchange="document.adminForm.submit();" ' + ); + + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->orders = $this->get('Data'); + $this->pagination = $this->get('Pagination'); + $this->request_url = JUri::getInstance()->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/order_detail/index.html b/component/admin/views/order_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/order_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/order_detail/tmpl/billing.php b/component/admin/views/order_detail/tmpl/billing.php new file mode 100644 index 00000000000..457ae8eac9b --- /dev/null +++ b/component/admin/views/order_detail/tmpl/billing.php @@ -0,0 +1,253 @@ +billing; +$is_company = $billing->is_company; +$allowCompany = ''; + +if ($is_company != 1) +{ + $allowCompany = 'style="display:none;"'; +} + +$extra_field = extra_field::getInstance(); + +if (!isset($billing->order_info_id)) + $billing->order_info_id = 0; + +$Itemid = JFactory::getApplication()->input->get('Itemid'); +?> + +
    +
    +
    + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + showcountry == 0) echo " style='display:none;'"; ?>> + + + + showstate == 0) echo " style='display:none;'"; ?> > + + + + + + + + + + + + > + + + + get('USE_TAX_EXEMPT') == 1) + { + ?> + > + + + + > + + + + > + + + + > + + + + users_info_id); + } + else + { + echo RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS, $billing->users_info_id); + } + + ?> + + + + +
    lists['is_company']; ?>
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + lists['country_code']; ?> +
    + + + lists['state_code']; ?> +
    + + + +
    + +
    lists['tax_exempt']; + echo JHTML::tooltip(JText::_('COM_REDSHOP_TOOLTIP_TAX_EXEMPT'), JText::_('COM_REDSHOP_TAX_EXEMPT'), 'tooltip.png', '', '', false); ?>
    lists['requesting_tax_exempt']; ?> +
    lists['tax_exempt_approved']; ?> +
    + +
    +
    +
    + +
    + + + + + + + + + +
    diff --git a/component/admin/views/order_detail/tmpl/ccdetail.php b/component/admin/views/order_detail/tmpl/ccdetail.php new file mode 100644 index 00000000000..7e2f26385c8 --- /dev/null +++ b/component/admin/views/order_detail/tmpl/ccdetail.php @@ -0,0 +1,49 @@ +ccdetail; +$cardnumber = base64_decode($ccdetail->order_payment_number); + +$edate = $ccdetail->order_payment_expire; + +$j = 1; +if (!isset($edate[5])) +{ + $j = 0; + $emonth = "0" . $edate[0]; +} +else + $emonth = $edate[0] . $edate[$j + 0]; + + +$eyear = $edate[$j + 1] . $edate[$j + 2] . $edate[$j + 3] . $edate[$j + 4]; +?> +
    +

    + + + + + + + + + + + + + + + + + +
    ::order_payment_cardname);?>
    ::
    ::
    ::order_payment_ccv);?>
    +
    diff --git a/component/admin/views/order_detail/tmpl/creditcardpayment.php b/component/admin/views/order_detail/tmpl/creditcardpayment.php new file mode 100644 index 00000000000..57035152ba3 --- /dev/null +++ b/component/admin/views/order_detail/tmpl/creditcardpayment.php @@ -0,0 +1,355 @@ +id; + +$Itemid = RedshopHelperRouter::getCheckoutItemId(); +$cart = $session->get('cart'); + +$payment_method_id = $app->input->getCmd('payment_method_id', ''); +$paymentinfo = RedshopHelperOrder::getPaymentMethodInfo($payment_method_id); +$paymentinfo = $paymentinfo[0]; + +$order_id = $app->input->getInt('order_id', 0); + +JPluginHelper::importPlugin('redshop_product'); +$dispatcher = RedshopHelperUtility::getDispatcher(); +$dispatcher->trigger('getStockroomStatus', array($order_id)); + +$order = RedshopEntityOrder::getInstance($order_id)->getItem(); + +// Add Plugin support +$dispatcher->trigger('afterOrderPlace', array($cart, $order)); + +$plugin = $app->input->getCmd('plugin', ''); + +$getparameters = RedshopHelperOrder::getParameters($plugin); + +$paymentinfo = $getparameters[0]; + +$paymentparams = new JRegistry($paymentinfo->params); + +$is_creditcard = $paymentparams->get('is_creditcard', ''); +$payment_oprand = $paymentparams->get('payment_oprand', ''); +$payment_discount_is_percent = $paymentparams->get('payment_discount_is_percent', ''); +$payment_price = $paymentparams->get('payment_price', ''); +$accepted_credict_card = $paymentparams->get("accepted_credict_card"); + +$paymentinfo = new stdclass; +$paymentinfo->payment_price = $payment_price; +$paymentinfo->is_creditcard = $is_creditcard; +$paymentinfo->payment_oprand = $payment_oprand; +$paymentinfo->payment_discount_is_percent = $payment_discount_is_percent; +$paymentinfo->accepted_credict_card = $accepted_credict_card; + +$shopperGroupId = RedshopHelperUser::getShopperGroup($user_id); + +if (Redshop::getConfig()->get('PAYMENT_CALCULATION_ON') == 'subtotal') +{ + $paymentAmount = $order->order_subtotal; +} +else +{ + $paymentAmount = $order->order_total; +} + +$paymentArray = RedshopHelperPayment::calculate($paymentAmount, $paymentinfo, $order->order_total); +$total = $paymentArray[0]; +$payment_amount = $paymentArray[1]; + +if ($is_creditcard == 1 && $app->input->getCmd('ccinfo', '') != '1') +{ + $accepted_cc_list = array(); + $accepted_cc_list = $accepted_credict_card; + if ($accepted_credict_card != "") + $cc_list = array(); + + $cc_list['VISA'] = new stdClass; + $cc_list['VISA']->img = 'visa.jpg'; + $cc_list['MC'] = new stdClass; + $cc_list['MC']->img = 'master.jpg'; + $cc_list['amex'] = new stdClass; + $cc_list['amex']->img = 'blue.jpg'; + $cc_list['maestro'] = new stdClass; + $cc_list['maestro']->img = 'mastero.jpg'; + $cc_list['jcb'] = new stdClass; + $cc_list['jcb']->img = 'jcb.jpg'; + $cc_list['diners'] = new stdClass; + $cc_list['diners']->img = 'dinnersclub.jpg'; + $cc_list['discover'] = new stdClass; + $cc_list['discover']->img = 'discover.jpg'; + ?> + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + img; + ?> + + + + + + + + +
    /> +
    + +
    + + + +
    + + + +
    + JText::_('COM_REDSHOP_JAN'), + "02" => JText::_('COM_REDSHOP_FEB'), + "03" => JText::_('COM_REDSHOP_MAR'), + "04" => JText::_('COM_REDSHOP_APR'), + "05" => JText::_('COM_REDSHOP_MAY'), + "06" => JText::_('COM_REDSHOP_JUN'), + "07" => JText::_('COM_REDSHOP_JUL'), + "08" => JText::_('COM_REDSHOP_AUG'), + "09" => JText::_('COM_REDSHOP_SEP'), + "10" => JText::_('COM_REDSHOP_OCT'), + "11" => JText::_('COM_REDSHOP_NOV'), + "12" => JText::_('COM_REDSHOP_DEC')); + + $html = "\n"; + + ?> + + / +
    + + + +
    + + + order_total; + $cart_shipping = 0; + if (!isset($order->order_shipping) || $order->order_shipping == '') + { + $cart_shipping = 0; + } + else + { + $cart_shipping = $order->order_shipping; + } + // $total = ($total - $cart_shipping)+$order_shipping_rate; + $total = $total + $cart_shipping; + + $tax = $order->order_tax; + $check_type = $order->order_discount; + + $cdiscount = $order->order_discount; + if ($check_type == 0) //////// 0 : Discount code in total , 1: Discount code in total + { + $discount_total = $order->order_discount; + } + else if ($check_type == 1) //////// 0 : Discount code in percentage , 1: Discount code in perstage + { + $discount_total = $order->order_discount; + $discount_total = ($total * $discount_total) / 100; + } + + + $odiscount = 0; + if ($order->order_discount > 0) + { + $total = ($total) - ($odiscount); + $odiscount = $discount_total + $order->order_discount; + } + else + { + $total = 0; + $odiscount = $cdiscount + $order->order_discount; + } + + $issplit = $session->get('issplit'); + if ($issplit) + $amt = $total / 2; + else + $amt = $total; + ?> + order_total; + //echo $producthelper->getProductFormattedPrice($amt); ?> +
    +
    +
    + + + + + + + + +
    +
    +redirect( + 'index.php?option=com_redshop&view=order_detail&task=checkoutnext&payment_plugin=' . $plugin . '&order_id=' + . $order_id . '&ccinfo=0&users_info_id=' . $order->user_info_id + ); + } + else + { + JPluginHelper::importPlugin('redshop_payment'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $results = $dispatcher->trigger('onPrePayment', array($plugin, array())); + $paymentResponse = $results[0]; + ?> +
    + + + + + + + + +
    + input->getCmd('tmpl'); +$model = $this->getModel('order_detail'); +$session = JFactory::getSession(); +$billing = $this->billing; +$shipping = $this->shipping; +$isCompany = (!empty($billing->is_company) ? $billing->is_company : ''); +$orderId = $this->detail->order_id; +$products = RedshopHelperOrder::getOrderItemDetail($orderId); +$orderStatusLogs = RedshopEntityOrder::getInstance($orderId)->getStatusLog(); + +if (!$shipping) +{ + $shipping = $billing; +} + +if (!empty($shipping->users_info_id)) +{ + $session->set('shipp_users_info_id', $shipping->users_info_id); +} + +# get Downloadable Products +$downloadProducts = RedshopHelperOrder::getDownloadProduct($orderId); +$totalDownloadProduct = count($downloadProducts); +$dproducts = array(); + +for ($t = 0; $t < $totalDownloadProduct; $t++) +{ + $downloadProduct = $downloadProducts[$t]; + + $dproducts[$downloadProduct->product_id][$downloadProduct->download_id] = $downloadProduct; +} +?> + + +
    +
    +
    + + + + +
    + + detail->cdate); ?> +
    +
    +
    +
    +
    + + + + +
    + + getProductFormattedPrice($this->detail->order_total); ?> +
    +
    +
    + +
    +
    + + + + +
    + + +
    +
    +
    + +
    +
    + + + + +
    + + detail->order_payment_status ?> +
    +
    +
    +
    + +
    +
    +
    +
    +
    +

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + get('SEND_MAIL_TO_CUSTOMER')) + { + $sendMailToCustomer = "checked"; + } + $linkUpdate = JRoute::_('index.php?option=com_redshop&view=order&task=update_status&return=order_detail&order_id[]=' . $orderId); + ?> + + + + + + + + + + + + + + + + + + + + +
    :
    :detail->order_number; ?>
    :detail->invoice_number; ?>
    :convertDateFormat($this->detail->cdate); ?>
    :payment_detail->order_payment_name); ?> + getccdetail($orderId))): ?> + + +
    :getPaymentandShippingExtrafields($this->detail, 18); ?> + +
    :payment_detail->order_payment_trans_id != "") + { + echo $this->payment_detail->order_payment_trans_id; + } + else + { + echo "N/A"; + } + ?> +
    :detail->ip_address; ?>
    :detail->customer_message; ?>
    :detail->referral_code; ?>
    : + detail->discount_type); + $discount_type = ''; + for ($d = 0, $dn = count($arr_discount); $d < $dn; $d++) + { + if ($arr_discount[$d]) + { + $arr_discount_type = explode(':', $arr_discount[$d]); + + if ($arr_discount_type[0] == 'c') + $discount_type .= JText::_('COM_REDSHOP_COUPON_CODE') . ' : ' . $arr_discount_type[1] . '
    '; + if ($arr_discount_type[0] == 'v') + $discount_type .= JText::_('COM_REDSHOP_VOUCHER_CODE') . ' : ' . $arr_discount_type[1] . '
    '; + } + } + + if (!$discount_type) + { + $discount_type = JText::_('COM_REDSHOP_NO_DISCOUNT_AVAILABLE'); + } + ?> + +

    :
    + + + detail->order_status, "class=\"form-control\" size=\"1\" ") ?> +
    + + + detail->order_payment_status, "class=\"form-control\" size=\"1\" "); ?> +
    + + + +
    +   + + +
    + +
    + + + + + + + + +
    +
    +
    +
    + +
    + detail->ship_method_id) : ?> +
    +
    +

    +
    +
    +
    + + + + + + + + + + + + + + + + + + detail->ship_method_id); + + if (count($details) <= 1) + { + $details = explode("|", $row->ship_method_id); + } + + $disp_style = ''; + + if (strtolower($details[0]) != 'plgredshop_shippingdefault_shipping_gls') + { + $disp_style = "style=display:none"; + } + ?> + + + + detail->track_no) + { ?> + + + + + +
    + : + + detail, "{shipping_method}"); ?> +
    + : + + detail, "{shipping_rate_name}"); ?> +
    + : + + getPaymentandShippingExtrafields($this->detail, 19); ?> +
    + : + + loadTemplate('shipping'); ?> +
    +
    > + trigger('getGLSLocation', array($shipping->users_info_id, 'default_shipping_gls', $this->detail->shop_id)); ?> + +
    +
    :detail->track_no; ?>
    + + + + + + + +
    + +
    +
    + +
    +
    +
    +
    +

    + + + + + +

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + users_info_id)) + { + $fields = RedshopHelperExtrafields::listAllFieldDisplay(8, $billing->users_info_id); + } + } + else + { + if (!empty($billing->users_info_id)) + { + $fields = RedshopHelperExtrafields::listAllFieldDisplay(7, $billing->users_info_id); + } + } + echo (!empty($fields) ? $fields : ''); + ?> +
    :firstname) ? $billing->firstname : ''); ?>
    :lastname) ? $billing->lastname : ''); ?>
    :company_name) ? $billing->company_name : ''); ?>
    :address) ? $billing->address : ''); ?>
    :zipcode) ? $billing->zipcode : ''); ?>
    :city) ? $billing->city : ''); ?>
    :country_code)) ? JText::_(RedshopHelperOrder::getCountryName($billing->country_code)) : ''; ?>
    :state_code)) ? RedshopHelperOrder::getStateName($billing->state_code, $billing->country_code) : ''; ?>
    :phone) ? $billing->phone : ''); ?>
    : + user_email) ? $billing->user_email : ''); ?> +
    :vat_number) ? $billing->vat_number : ''); ?>
    :tax_exempt) ? $billing->tax_exempt : ''); ?>
    :ean_number) ? $billing->ean_number : ''); ?>
    +
    +
    +
    +
    +
    +
    +

    + + + + + +

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + users_info_id)) + { + if ($isCompany) + { + $fields = RedshopHelperExtrafields::listAllFieldDisplay(15, $shipping->users_info_id); + } + else + { + $fields = RedshopHelperExtrafields::listAllFieldDisplay(14, $shipping->users_info_id); + } + } + echo (!empty($fields) ? $fields : ''); ?> +
    :firstname) ? $shipping->firstname : ''); ?>
    :lastname) ? $shipping->lastname : ''); ?>
    :address) ? $shipping->address : ''); ?>
    :zipcode) ? $shipping->zipcode : ''); ?>
    :city) ? $shipping->city : ''); ?>
    :country_code) ? JText::_(RedshopHelperOrder::getCountryName($shipping->country_code)) : ''); ?>
    :state_code) ? RedshopHelperOrder::getStateName($shipping->state_code, $shipping->country_code) : ''); ?>
    :phone) ? $shipping->phone : ''); ?>
    +
    +
    +
    +
    +
    +
    + + lists['order_extra_fields'])): ?> +
    +
    +
    +
    +

    +
    +
    +
    + lists['order_extra_fields'] ?> + + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +

    +
    +
    + + + + + 0) echo ''; ?> + + product_quantity; + $product_id = $products[$i]->product_id; + + if ($productdetail = $productHelper->getProductById($product_id)) + { + $ordervolume = $ordervolume + $productdetail->product_volume; + } + + $order_item_id = $products[$i]->order_item_id; + $order_item_name = $products[$i]->order_item_name; + $order_item_sku = $products[$i]->order_item_sku; + $wrapper_id = $products[$i]->wrapper_id; + + $p_userfield = $productHelper->getuserfield($order_item_id); + $subscribe_detail = $model->getUserProductSubscriptionDetail($order_item_id); + $catId = $productHelper->getCategoryProduct($product_id); + $res = RedshopEntityCategory::getInstance((int) $catId)->getItem(); + $cname = ''; + + if (!empty($res)) + { + $cname = $res->name; + $clink = JRoute::_($url . 'index.php?option=com_redshop&view=category&layout=detail&cid=' . $catId); + $cname = "" . $cname . ""; + } + + $subtotal_excl_vat += $products[$i]->product_item_price_excl_vat * $quantity; + $vat = ($products[$i]->product_item_price - $products[$i]->product_item_price_excl_vat); + + // Make sure this variable is object before we can use it + if (is_object($productdetail)) + { + // Generate frontend link + $itemData = $productHelper->getMenuInformation(0, 0, '', 'product&pid=' . $productdetail->product_id); + $catIdMain = $productdetail->cat_in_sefurl; + + if (!empty($itemData)) + { + $pItemid = $itemData->id; + } + else + { + $objhelper = redhelper::getInstance(); + $pItemid = RedshopHelperRouter::getItemId($productdetail->product_id, $catIdMain); + } + + $productFrontendLink = JUri::root(); + $productFrontendLink .= 'index.php?option=com_redshop'; + $productFrontendLink .= '&view=product&pid=' . $productdetail->product_id; + $productFrontendLink .= '&cid=' . $catIdMain; + $productFrontendLink .= '&Itemid=' . $pItemid; + } + else + { + $productFrontendLink = '#'; + } + + $makeAttributeOrder = $productHelper->makeAttributeOrder($order_item_id); + + $displayAttribute = $makeAttributeOrder->product_attribute; + + ?> + + + + + + + + +
    + + + + + + + + + + + + +
    +
    ' . JText::_('COM_REDSHOP_DOWNLOAD_SETTING') . '
    + + + + 0) + { + ?> + + + + +
    +
    + + + + + + + + + + + + + +
    +
    + + + +
    + SKU:  + +
    +
    +
    + +
    + + +
    + Category: + +
    +
    +
    + trigger('onAdminDisplayOrderItem', array($orderId, $products[$i])) ?> + + product_accessory . "
    " . $products[$i]->discount_calc_data; + + if ($wrapper_id) + { + $wrapper = $productHelper->getWrapper($product_id, $wrapper_id); + echo "
    " . JText::_('COM_REDSHOP_WRAPPER') . ": " . $wrapper[0]->wrapper_name . "(" . $products[$i]->wrapper_price . ")"; + } + + if ($subscribe_detail) + { + $subscription_detail = $model->getProductSubscriptionDetail($product_id, $subscribe_detail->subscription_id); + $selected_subscription = $subscription_detail->subscription_period . " " . $subscription_detail->period_type; + echo JText::_('COM_REDSHOP_SUBSCRIPTION') . ': ' . $selected_subscription; + } + ?> +

    + trigger('onDisplayOrderItemNote', array($products[$i])); + ?> +
    +
    + get('REDCURRENCY_SYMBOL'); ?> + +
    +
    get('REDCURRENCY_SYMBOL') . " " . $vat; ?>getProductFormattedPrice($products[$i]->product_item_price) . " " . JText::_('COM_REDSHOP_INCL_VAT'); ?> + + + get('REDCURRENCY_SYMBOL') . " "; + echo $productHelper->redpriceDecimal($products[$i]->product_final_price); + ?> + + order_status, "class=\"form-control\" size=\"1\" "); + ?> +

    + +
    + + +
    + + + + + + + + + + + + +
    +
    + 0) + { + ?> +
    + + file_name), 11); + $download_id = $downloads->download_id; + $download_max = $downloads->download_max; + $end_date = $downloads->end_date; + $product_download_infinite = ($end_date == 0) ? 1 : 0; + + if ($end_date == 0) + { + $limit_over = false; + } + else + { + $days_in_time = $end_date - time(); + $hour = date("H", $end_date); + $minite = date("i", $end_date); + $days = round($days_in_time / (24 * 60 * 60)); + $limit_over = false; + if ($days_in_time <= 0 || $download_max <= 0) + { + $limit_over = true; + } + } + $td_style = ($end_date == 0) ? 'style="display:none;"' : 'style="display:table-row;"'; + ?> + + + + + + + + + + + + + > + + + + > + + + + > + + + + + + + + + + +
    + : +
    + +
    + : + +
    + +
    + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + detail->order_tax; + $totaldiscount = $this->detail->order_discount; + $special_discount_amount = $this->detail->special_discount_amount; + $vatOnDiscount = false; + + if ((int) Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT') == 0 && (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') + && (int) $this->detail->order_discount != 0 && (int) $order_tax + && !empty($this->detail->order_discount) + ) + { + $vatOnDiscount = true; + $Discountvat = ((float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') * $totaldiscount) / (1 + (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')); + $totaldiscount = $totaldiscount - $Discountvat; + } + + if ((int) Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT') == 0 && (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') + && (int) $this->detail->special_discount_amount != 0 && (int) $order_tax + && !empty($this->detail->special_discount_amount) + ) + { + $vatOnDiscount = true; + $Discountvat = ((float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') * $special_discount_amount) / (1 + (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')); + $special_discount_amount = $special_discount_amount - $Discountvat; + } + + if ($vatOnDiscount) + { + $order_tax = (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') * ($subtotal_excl_vat - ($totaldiscount + $special_discount_amount)); + } + ?> + + + + + + + + + + + + + + + + + + + + + + + +
    : + + getProductFormattedPrice($subtotal_excl_vat); ?> +
    : + getProductFormattedPrice($order_tax); ?> +
    + + detail->payment_oprand == '+') + echo JText::_('COM_REDSHOP_PAYMENT_CHARGES_LBL'); + else + echo JText::_('COM_REDSHOP_PAYMENT_DISCOUNT_LBL'); + ?>: + + + getProductFormattedPrice($this->detail->payment_discount); ?> +
    + + : + + +
    +
    + get('REDCURRENCY_SYMBOL'); ?> + + + + + + +
    +
    + getProductFormattedPrice($totaldiscount); ?> + + + +
    +
    + : + +
    +
    + + + + + + + +
    +
    + getProductFormattedPrice($special_discount_amount); + ?> + + + + +
    +
    : + + getProductFormattedPrice($this->detail->order_shipping); ?> +
    : + + getProductFormattedPrice($this->detail->order_total); ?> +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    array('typeField' => ', isproduct:1'), + 'select2.options' => array( + 'events' => array('select2-selecting' => 'function(e) { + document.getElementById(\'product1\').value = e.object.id; + displayProductDetailInfo(\'product1\', 0); + displayAddbutton(e.object.id, \'product1\');}') + ) + ) + ); + ?> +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    +
    +
    +
      + + $log): ?> + +
    • + date_changed) ?> +
    • + +
    • + +
      +

      +
      +

      : order_status_name ?> +

      + order_payment_status)): ?> +

      : +

      + + order_payment_status))); ?> +

      : +

      + +

      customer_note ?>

      +
      +
      +
    • + + order_status != $nextLog->order_status): ?> +
    • + +
      +
      +  order_status_name ?> +
      +
      +
    • + + order_payment_status != $nextLog->order_payment_status && $log->order_payment_status): ?> + order_payment_status))); ?> +
    • + +
      +
      +   +
      +
      +
    • + + customer_note) && $log->customer_note != $nextLog->customer_note): ?> +
    • + +
      +
      + customer_note ?> +
      +
      +
    • + + + +
    +
    +
    +
    +
    +
    +loadTemplate('plugin'); ?> +
    + diff --git a/component/admin/views/order_detail/tmpl/default_plugin.php b/component/admin/views/order_detail/tmpl/default_plugin.php new file mode 100644 index 00000000000..09e2cbb50de --- /dev/null +++ b/component/admin/views/order_detail/tmpl/default_plugin.php @@ -0,0 +1,22 @@ +trigger('onBackendOrderDetailFooter', array(& $this)); +$data->loadhtml = trim(implode("\n", $results)); + +echo $data->loadhtml; diff --git a/component/admin/views/order_detail/tmpl/default_shipping.php b/component/admin/views/order_detail/tmpl/default_shipping.php new file mode 100644 index 00000000000..7a41ae1a98f --- /dev/null +++ b/component/admin/views/order_detail/tmpl/default_shipping.php @@ -0,0 +1,22 @@ +get('shipp_users_info_id'); +$d['user_id'] = $this->detail->user_id; +$d['users_info_id'] = $shipp_users_info_id; +$d['ordertotal'] = $this->detail->order_total; +$d['order_subtotal'] = $this->detail->order_subtotal; + +$responce = RedshopHelperProduct::replaceShippingMethod($d, $shipp_users_info_id, $this->detail->ship_method_id); + +echo $responce; diff --git a/component/admin/views/order_detail/tmpl/index.html b/component/admin/views/order_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/order_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/order_detail/tmpl/print_order.php b/component/admin/views/order_detail/tmpl/print_order.php new file mode 100644 index 00000000000..dd82bd63964 --- /dev/null +++ b/component/admin/views/order_detail/tmpl/print_order.php @@ -0,0 +1,36 @@ +root(); +$redTemplate = Redtemplate::getInstance(); +$OrdersDetail = $this->detail; +$order_print_template = RedshopHelperTemplate::getTemplate("order_print"); + +if (count($order_print_template) > 0 && $order_print_template[0]->template_desc != "") +{ + $ordersprint_template = $order_print_template[0]->template_desc; +} +else +{ + $ordersprint_template = '
    {order_information_lbl}{print}
    {order_id_lbl} : {order_id}
    {order_number_lbl} : {order_number}
    {requisition_number_lbl} : {requisition_number}
    {order_date_lbl} : {order_date}
    {order_status_lbl} : {order_status}
    {shipping_method_lbl} : {shipping_method} : {shipping_rate_name}
    {payment_lbl} : {payment_method}
    {billing_address_information_lbl}
    {billing_address}
    {shipping_address_information_lbl}
    {shipping_address}
    {order_detail_lbl}
    {product_loop_start}{product_loop_end}
    {product_name_lbl}{note_lbl}{price_lbl}{quantity_lbl}Total Price

    {product_name}
    {product_attribute}{product_accessory}{product_userfields}

    {product_wrapper}{product_thumb_image}{product_price}{product_quantity}{product_total_price}
    {if vat}{vat end if}{if discount}{discount end if}
    {order_subtotal_lbl} : {order_subtotal}
    {vat_lbl} : {order_tax}
    {discount_lbl} : {order_discount}
    {shipping_lbl} : {order_shipping}

    {total_lbl} :{order_total}



    '; +} + +$print_tag = "" + . "" . JText::_("; + +$message = str_replace("{print}", $print_tag, $ordersprint_template); +$message = Template::replaceTemplate($OrdersDetail, $message, true); +echo eval("?>" . $message . " diff --git a/component/admin/views/order_detail/tmpl/shipping.php b/component/admin/views/order_detail/tmpl/shipping.php new file mode 100644 index 00000000000..9e2bc7913bb --- /dev/null +++ b/component/admin/views/order_detail/tmpl/shipping.php @@ -0,0 +1,192 @@ +billing; +$shipping = $this->shipping; + +if (!$shipping) +{ + $shipping = $billing; +} +if (!isset($shipping->order_info_id)) + $shipping->order_info_id = 0; + +$Itemid = JFactory::getApplication()->input->get('Itemid'); +?> + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + showcountry == 0) echo " style='display:none;'"; ?>> + + + + showstate == 0) echo " style='display:none;'"; ?> > + + + + + + + + + is_company == 1) + { + echo $extrafields = RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS, $shipping->users_info_id); + } + else + { + echo $extrafields = RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS, $shipping->users_info_id); + } + ?> + + + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + lists['country_code']; ?> +
    + + + lists['state_code']; ?> +
    + + + +
    + +
    +
    +
    + +
    + + + + + + + + + + + + + +
    diff --git a/component/admin/views/order_detail/view.html.php b/component/admin/views/order_detail/view.html.php new file mode 100644 index 00000000000..8346df0fc26 --- /dev/null +++ b/component/admin/views/order_detail/view.html.php @@ -0,0 +1,231 @@ +input; + $document->setTitle(JText::_('COM_REDSHOP_ORDER')); + + $uri = JUri::getInstance(); + + // Load payment languages + RedshopHelperPayment::loadLanguages(); + + // Load Shipping plugin language files + RedshopHelperShipping::loadLanguages(); + + $layout = $input->getCmd('layout', ''); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.order.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.admin.common.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.validation.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/json.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/ajaxupload.min.js', false, true); + + $lists = array(); + + $model = $this->getModel(); + + $detail = $this->get('data'); + + $billing = RedshopHelperOrder::getOrderBillingUserInfo($detail->order_id); + $shipping = RedshopHelperOrder::getOrderShippingUserInfo($detail->order_id); + + $task = $input->getCmd('task', ''); + + if ($task == 'ccdetail') + { + $ccdetail = $model->getccdetail($detail->order_id); + $this->ccdetail = $ccdetail; + $this->setLayout('ccdetail'); + + parent::display($tpl); + JFactory::getApplication()->close(); + } + + if ($layout == 'shipping' || $layout == 'billing') + { + if (!$shipping || $layout == 'billing') + { + $shipping = $billing; + } + + $this->setLayout($layout); + + $countryarray = RedshopHelperWorld::getCountryList((array) $shipping); + $shipping->country_code = $countryarray['country_code']; + $lists['country_code'] = $countryarray['country_dropdown']; + + $statearray = RedshopHelperWorld::getStateList((array) $shipping); + $lists['state_code'] = $statearray['state_dropdown']; + + $showcountry = (count($countryarray['countrylist']) == 1 && count($statearray['statelist']) == 0) ? 0 : 1; + $showstate = ($statearray['is_states'] <= 0) ? 0 : 1; + + $isCompany = array(); + $isCompany[0] = new stdClass; + $isCompany[0]->value = 0; + $isCompany[0]->text = JText::_('COM_REDSHOP_USER_CUSTOMER'); + $isCompany[1] = new stdClass; + $isCompany[1]->value = 1; + $isCompany[1]->text = JText::_('COM_REDSHOP_USER_COMPANY'); + $lists['is_company'] = JHTML::_( + 'select.genericlist', + $isCompany, + 'is_company', + 'class="inputbox" onchange="showOfflineCompanyOrCustomer(this.value);" ', + 'value', + 'text', + $billing->is_company + ); + + $lists['tax_exempt'] = JHTML::_('select.booleanlist', 'tax_exempt', 'class="inputbox"', $billing->tax_exempt); + $lists['tax_exempt_approved'] = JHTML::_('select.booleanlist', 'tax_exempt_approved', 'class="inputbox"', $billing->tax_exempt_approved); + $lists['requesting_tax_exempt'] = JHTML::_('select.booleanlist', 'requesting_tax_exempt', 'class="inputbox"', $billing->requesting_tax_exempt); + + $this->showcountry = $showcountry; + $this->showstate = $showstate; + } + + elseif ($layout == "print_order" || $layout == 'productorderinfo' || $layout == 'creditcardpayment') + { + $this->setLayout($layout); + } + + else + { + $this->setLayout('default'); + } + + $payment_detail = RedshopHelperOrder::getPaymentInfo($detail->order_id); + + if (is_array($payment_detail) && count($payment_detail)) + { + $payment_detail = $payment_detail[0]; + } + + $isNew = ($detail->order_id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + JToolBarHelper::title(JText::_('COM_REDSHOP_ORDER') . ': [ ' . $text . ' ]', 'pencil-2 redshop_order48'); + + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + + $order_id = $detail->order_id; + + if (RedshopHelperPdf::isAvailablePdfPlugins()) + { + RedshopToolbarHelper::link( + 'index.php?option=com_redshop&view=order_detail&task=createpdfstocknote&cid[]=' . $order_id, + 'redshop_export_export32', + 'COM_REDSHOP_CREATE_STOCKNOTE', + '_blank' + ); + + RedshopToolbarHelper::link( + 'index.php?option=com_redshop&view=order_detail&task=createpdf&cid[]=' . $order_id, + 'redshop_export_export32', + 'COM_REDSHOP_CREATE_SHIPPING_LABEL', + '_blank' + ); + } + + $tmpl = JFactory::getApplication()->input->get('tmpl', ''); + $appendTmpl = ($tmpl) ? '&tmpl=component' : ''; + + RedshopToolbarHelper::link( + 'index.php?option=com_redshop&view=order_detail&task=send_downloadmail&cid[]=' . $order_id . $appendTmpl, + 'send', + 'COM_REDSHOP_SEND_DOWNLOEADMAIL' + ); + + RedshopToolbarHelper::link( + 'index.php?option=com_redshop&view=order_detail&task=resendOrderMail&orderid=' . $order_id . $appendTmpl, + 'send', + 'COM_REDSHOP_RESEND_ORDER_MAIL' + ); + + RedshopToolbarHelper::link( + 'index.php?option=com_redshop&view=order_detail&task=send_invoicemail&cid[]=' . $order_id . $appendTmpl, + 'send', + 'COM_REDSHOP_SEND_INVOICEMAIL' + ); + + if (isset($payment_detail->plugin->params) && $payment_detail->plugin->params->get('enableVault') + && ('P' == $detail->order_status || 'Unpaid' == $detail->order_payment_status)) + { + RedshopToolbarHelper::link( + 'index.php?option=com_redshop&view=order_detail&task=pay&orderId=' . $order_id . $appendTmpl, + 'credit', + 'COM_REDSHOP_ORDER_PAY' + ); + } + + if ($tmpl) + { + RedshopToolbarHelper::link( + 'index.php?option=com_redshop&view=order&tmpl=component', + 'back', + 'COM_REDSHOP_BACK' + ); + } + + RedshopToolbarHelper::link( + 'index.php?tmpl=component&option=com_redshop&view=order_detail&layout=print_order&cid[]=' . $order_id, + 'print', + 'COM_REDSHOP_PRINT', + '_blank' + ); + + $lists['order_extra_fields'] = RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_ORDER, $order_id); + + $this->lists = $lists; + $this->detail = $detail; + $this->billing = $billing; + $this->shipping = $shipping; + $this->payment_detail = $payment_detail; + $this->shipping_rate_id = $detail->ship_method_id; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/order_detail/view.pdf.php b/component/admin/views/order_detail/view.pdf.php new file mode 100644 index 00000000000..0adc5601f40 --- /dev/null +++ b/component/admin/views/order_detail/view.pdf.php @@ -0,0 +1,98 @@ +enqueueMessage(JText::_('COM_REDSHOP_ERROR_MISSING_PDF_PLUGIN'), 'error'); + JFactory::getApplication()->redirect(JRoute::_('index.php?option=com_redshop', false)); + } + + $config = Redconfiguration::getInstance(); + $detail = $this->get('data'); + $billing = RedshopHelperOrder::getBillingAddress($detail->user_id); + $shipping = RedshopHelperOrder::getOrderShippingUserInfo($detail->order_id); + + if (!$shipping) + { + $shipping = $billing; + } + + $template = RedshopHelperTemplate::getTemplate('shipping_pdf'); + $pdfTemplate = $template[0]->template_desc; + + ob_start(); + + $order_status = RedshopHelperOrder::getOrderStatusTitle($detail->order_status); + $pdfTemplate = str_replace("{order_information_lbl}", JText::_('COM_REDSHOP_ORDER_INFORMATION'), $pdfTemplate); + $pdfTemplate = str_replace("{order_id_lbl}", JText::_('COM_REDSHOP_ORDER_ID'), $pdfTemplate); + $pdfTemplate = str_replace("{order_number_lbl}", JText::_('COM_REDSHOP_ORDER_NUMBER'), $pdfTemplate); + $pdfTemplate = str_replace("{order_date_lbl}", JText::_('COM_REDSHOP_ORDER_DATE'), $pdfTemplate); + $pdfTemplate = str_replace("{order_status_lbl}", JText::_('COM_REDSHOP_ORDER_STATUS'), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_address_info_lbl}", JText::_('COM_REDSHOP_SHIPPING_ADDRESS_INFORMATION'), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_firstname_lbl}", JText::_('COM_REDSHOP_FIRSTNAME'), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_lastname_lbl}", JText::_('COM_REDSHOP_LASTNAME'), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_address_lbl}", JText::_('COM_REDSHOP_ADDRESS'), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_zip_lbl}", JText::_('COM_REDSHOP_ZIP'), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_city_lbl}", JText::_('COM_REDSHOP_CITY'), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_country_lbl}", JText::_('COM_REDSHOP_COUNTRY'), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_state_lbl}", JText::_('COM_REDSHOP_STATE'), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_phone_lbl}", JText::_('COM_REDSHOP_PHONE'), $pdfTemplate); + + $pdfTemplate = str_replace("{order_id}", $detail->order_id, $pdfTemplate); + $pdfTemplate = str_replace("{order_number}", $detail->order_number, $pdfTemplate); + $pdfTemplate = str_replace("{order_date}", $config->convertDateFormat($detail->cdate), $pdfTemplate); + $pdfTemplate = str_replace("{order_status}", $order_status, $pdfTemplate); + + $pdfTemplate = str_replace("{shipping_firstname}", $shipping->firstname, $pdfTemplate); + $pdfTemplate = str_replace("{shipping_lastname}", $shipping->lastname, $pdfTemplate); + $pdfTemplate = str_replace("{shipping_address}", $shipping->address, $pdfTemplate); + $pdfTemplate = str_replace("{shipping_zip}", $shipping->zipcode, $pdfTemplate); + $pdfTemplate = str_replace("{shipping_city}", $shipping->city, $pdfTemplate); + $pdfTemplate = str_replace("{shipping_country}", JTEXT::_(RedshopHelperOrder::getCountryName($shipping->country_code)), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_state}", RedshopHelperOrder::getStateName($shipping->state_code, $shipping->country_code), $pdfTemplate); + $pdfTemplate = str_replace("{shipping_phone}", $shipping->zipcode, $pdfTemplate); + + // If user is company than + if ($billing->is_company && $billing->company_name != "") + { + $pdfTemplate = str_replace("{company_name}", $billing->company_name, $pdfTemplate); + $pdfTemplate = str_replace("{company_name_lbl}", JText::_('COM_REDSHOP_COMPANY_NAME'), $pdfTemplate); + } + else + { + $pdfTemplate = str_replace("{company_name}", "", $pdfTemplate); + $pdfTemplate = str_replace("{company_name_lbl}", "", $pdfTemplate); + } + + JPluginHelper::importPlugin('redshop_pdf'); + RedshopHelperUtility::getDispatcher()->trigger('onRedshopOrderGenerateShippingPdf', array($detail, $pdfTemplate)); + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/views/order_detail/view.stocknotepdf.php b/component/admin/views/order_detail/view.stocknotepdf.php new file mode 100644 index 00000000000..6daa9871f41 --- /dev/null +++ b/component/admin/views/order_detail/view.stocknotepdf.php @@ -0,0 +1,91 @@ +enqueueMessage(JText::_('COM_REDSHOP_ERROR_MISSING_PDF_PLUGIN'), 'error'); + JFactory::getApplication()->redirect(JRoute::_('index.php?option=com_redshop', false)); + } + + $config = Redconfiguration::getInstance(); + $detail = $this->get('data'); + $products = RedshopHelperOrder::getOrderItemDetail($detail->order_id); + $template = RedshopHelperTemplate::getTemplate('stock_note'); + $cartHelper = rsCarthelper::getInstance(); + + if (!empty($template) && !empty($template[0]->template_desc)) + { + $pdfTemplate = $template[0]->template_desc; + } + else + { + $pdfTemplate = '
    {order_id_lbl} : {order_id} {order_date_lbl} : {order_date}
    + + {product_loop_start} + + + + + + {product_loop_end} + +
    {product_name_lbl} {product_number_lbl} {product_quantity_lbl}
    + + + +
    {product_name}
    {product_attribute}
    +
    {product_number}{product_quantity}
    '; + } + + ob_start(); + + $pdfTemplate = Template::replaceTemplate($detail, $pdfTemplate); + + $pdfTemplate = str_replace("{order_id_lbl}", JText::_('COM_REDSHOP_ORDER_ID'), $pdfTemplate); + $pdfTemplate = str_replace("{order_id}", $detail->order_id, $pdfTemplate); + $pdfTemplate = str_replace("{order_date_lbl}", JText::_('COM_REDSHOP_ORDER_DATE'), $pdfTemplate); + $pdfTemplate = str_replace("{order_date}", $config->convertDateFormat($detail->cdate), $pdfTemplate); + $pdfTemplate = str_replace("{product_name_lbl}", JText::_('COM_REDSHOP_PRODUCT_NAME'), $pdfTemplate); + $pdfTemplate = str_replace("{product_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER'), $pdfTemplate); + $pdfTemplate = str_replace("{product_quantity_lbl}", JText::_('COM_REDSHOP_QUANTITY'), $pdfTemplate); + $billing = RedshopHelperOrder::getOrderBillingUserInfo($detail->order_id); + $pdfTemplate = RedshopHelperBillingTag::replaceBillingAddress($pdfTemplate, $billing); + $shipping = RedshopHelperOrder::getOrderShippingUserInfo($detail->order_id); + $pdfTemplate = Redshop\Shipping\Tag::replaceShippingAddress($pdfTemplate, $shipping); + $pdfTemplate = str_replace("{requisition_number}", $detail->requisition_number, $pdfTemplate); + $pdfTemplate = str_replace("{requisition_number_lbl}", JText::_('COM_REDSHOP_REQUISITION_NUMBER'), $pdfTemplate); + + JPluginHelper::importPlugin('redshop_pdf'); + RedshopHelperUtility::getDispatcher()->trigger('onRedshopOrderGenerateStockNotePdf', array($detail, $pdfTemplate)); + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/views/order_status/index.html b/component/admin/views/order_status/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/order_status/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/order_status/tmpl/edit.php b/component/admin/views/order_status/tmpl/edit.php new file mode 100644 index 00000000000..4c5b3166d2a --- /dev/null +++ b/component/admin/views/order_status/tmpl/edit.php @@ -0,0 +1,11 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/order_status/tmpl/index.html b/component/admin/views/order_status/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/order_status/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/order_status/view.html.php b/component/admin/views/order_status/view.html.php new file mode 100644 index 00000000000..0de6d181e9f --- /dev/null +++ b/component/admin/views/order_status/view.html.php @@ -0,0 +1,32 @@ +[ ' . JText::_('COM_REDSHOP_EDIT') . ' ]'; + } +} diff --git a/component/admin/views/order_statuses/index.html b/component/admin/views/order_statuses/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/order_statuses/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/order_statuses/tmpl/default.php b/component/admin/views/order_statuses/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/order_statuses/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/order_statuses/tmpl/index.html b/component/admin/views/order_statuses/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/order_statuses/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/order_statuses/view.html.php b/component/admin/views/order_statuses/view.html.php new file mode 100644 index 00000000000..14a863ade98 --- /dev/null +++ b/component/admin/views/order_statuses/view.html.php @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/component/admin/views/prices/tmpl/default.php b/component/admin/views/prices/tmpl/default.php new file mode 100644 index 00000000000..c7c077d9c9c --- /dev/null +++ b/component/admin/views/prices/tmpl/default.php @@ -0,0 +1,82 @@ + + +
    +
    + + + + + + + + + + + + + + media); $i++) + { + $row = $this->media[$i]; + $row->id = $row->price_id; + //$product_id = $row->product_id; + $link = JRoute::_('index.php?option=com_redshop&view=prices_detail&task=edit&product_id=' . $row->product_id . '&cid[]=' . $row->price_id);?> + "> + + + + + + + + + + + + + +
    pagination->getRowOffset($i); ?>id); ?>product_name;?> + shopper_group_name;?>price_quantity_start;?>price_quantity_end;?>getProductFormattedPrice($row->product_price); ?>getProductFormattedPrice($row->discount_price); ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + + +
    diff --git a/component/admin/views/prices/tmpl/index.html b/component/admin/views/prices/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/prices/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/prices/view.html.php b/component/admin/views/prices/view.html.php new file mode 100644 index 00000000000..7f46569c38b --- /dev/null +++ b/component/admin/views/prices/view.html.php @@ -0,0 +1,48 @@ +setTitle(JText::_('COM_REDSHOP_PRODUCT_PRICE')); + jimport('joomla.html.pagination'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_PRICE'), 'redshop_vatrates48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + + $limitstart = $app->getUserStateFromRequest($context . 'limitstart', 'limitstart', '0'); + $limit = $app->getUserStateFromRequest($context . 'limit', 'limit', '10'); + + $total = $this->get('Total'); + $media = $this->get('Data'); + $product_id = $this->get('ProductId'); + + $pagination = new JPagination($total, $limitstart, $limit); + $this->user = JFactory::getUser(); + + $this->media = $media; + $this->product_id = $product_id; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/prices_detail/index.html b/component/admin/views/prices_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/prices_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/prices_detail/tmpl/default.php b/component/admin/views/prices_detail/tmpl/default.php new file mode 100644 index 00000000000..12f8b34405a --- /dev/null +++ b/component/admin/views/prices_detail/tmpl/default.php @@ -0,0 +1,141 @@ +getString('DEFAULT_DATEFORMAT', 'Y-m-d'); +$producthelper = productHelper::getInstance(); +?> + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    :lists['product_name']; ?>
    + : + lists['shopper_group_name']; ?>
    + : + +
    + : + +
    : +
    : + +
    + : + + detail->discount_start_date) + { + $sdate = date(Redshop::getConfig()->getString('DEFAULT_DATEFORMAT', 'Y-m-d'), $this->detail->discount_start_date); + } + + echo JHtml::_( + 'redshopcalendar.calendar', + $sdate, + 'discount_start_date', + 'discount_start_date', + $calendarFormat, + array('class' => 'form-control', 'size' => '15', 'maxlength' => '19') + ); + ?> +
    + : + + detail->discount_end_date) + { + $sdate = date(Redshop::getConfig()->getString('DEFAULT_DATEFORMAT', 'Y-m-d'), $this->detail->discount_end_date); + } + + echo JHtml::_( + 'redshopcalendar.calendar', + $sdate, + 'discount_end_date', + 'discount_end_date', + $calendarFormat, + array('class' => 'form-control', 'size' => '15', 'maxlength' => '19') + ); + ?> +
    +
    +
    +
    + + + + +
    diff --git a/component/admin/views/prices_detail/tmpl/index.html b/component/admin/views/prices_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/prices_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/prices_detail/view.html.php b/component/admin/views/prices_detail/view.html.php new file mode 100644 index 00000000000..859ce72391d --- /dev/null +++ b/component/admin/views/prices_detail/view.html.php @@ -0,0 +1,54 @@ +setLayout('default'); + + $this->lists = array(); + $this->detail = $this->get('data'); + $isNew = ($this->detail->price_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_PRICE') . ': [ ' . $text . ' ]', 'redshop_vatrates48'); + JToolBarHelper::apply(); + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $this->lists['product_id'] = $this->detail->product_id; + $this->lists['product_name'] = $this->detail->product_name; + $this->lists['shopper_group_name'] = RedshopHelperShopper_Group::listAll("shopper_group_id", 0, array((int) $this->detail->shopper_group_id)); + + $this->request_url = JFactory::getURI()->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/product/index.html b/component/admin/views/product/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product/tmpl/default.php b/component/admin/views/product/tmpl/default.php new file mode 100644 index 00000000000..b87f97654de --- /dev/null +++ b/component/admin/views/product/tmpl/default.php @@ -0,0 +1,374 @@ +getModel('product'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$ordering = ($this->lists['order'] == 'x.ordering'); +$allowOrder = ($listOrder == 'x.ordering' && strtolower($listDirn) == 'asc'); + +if ($allowOrder) +{ + $saveOrderingUrl = 'index.php?option=com_redshop&task=product.saveOrderAjax'; + JHtml::_('redshopsortable.sortable', 'adminForm', 'adminForm', 'asc', $saveOrderingUrl); +} + +$category_id = $this->state->get('category_id', 0); + +$user = JFactory::getUser(); +$userId = (int) $user->id; +JHtml::_('redshopjquery.framework'); +?> + +
    + +
    +
    +
    +
    + "> + "> + +
    +
    +
    + +
    +
    + lists['category']; ?> +
    +
    + lists['manufacturer']; ?> +
    +
    + lists['product_sort']; ?> +
    +
    + + + + + + + + 0): ?> + + + + + + + list_in_products as $listInProduct): ?> + + + + + + + + + + + + + + + products as $index => $product): ?> + id = $product->product_id; + $link = JRoute::_('index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $product->product_id); + $published = JHtml::_('jgrid.published', $product->published, $index, '', 1); + ?> + "> + + + + 0) + { + ?> + + + + + + + + list_in_products as $list_in_product) : ?> + id, 1, $product->product_id); + $fieldValue = ''; + if (!empty($fieldArray)) + { + $fieldValue = $fieldArray->data_txt; + } + ?> + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + title); ?> + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($index); ?> + + + + + + + + + authorise('core.manage', 'com_checkin') || $product->checked_out == $userId || $product->checked_out == 0; + ?> + checked_out) : ?> + checked_out); ?> + name, $product->checked_out_time, 'product.', $canCheckin); ?> + + children)) + { + ?> + treename; ?> + product_parent_id == 0) + { + ?> + treename; ?> + product_parent_id); + + ?> + treename; ?> [child: product_name; ?>] + + children)) + { + ?> + treename; ?> + product_parent_id == 0) + { + ?> + treename; ?> + product_parent_id); + + ?> + treename; ?> [child: product_name; ?>] + + + + product_number; ?> + + getProductFormattedPrice($product->product_price); ?> + + media (MediaDetail($product->product_id)); ?>) + + getWrapper($product->product_id, 0, 1); ?> + + <?php echo JText::_('COM_REDSHOP_WRAPPER'); ?> + + + visited; ?> + + listedincats($product->product_id); ?> + + name . "
    "; ?> + +
    + manufacturer_id)->get('name', ''); ?> + + + + + + product_id; ?> +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + + + +
    diff --git a/component/admin/views/product/tmpl/element.php b/component/admin/views/product/tmpl/element.php new file mode 100644 index 00000000000..71834b65004 --- /dev/null +++ b/component/admin/views/product/tmpl/element.php @@ -0,0 +1,150 @@ +getModel('product'); +$category_id = $this->state->get('category_id', 0); +$object = JFactory::getApplication()->input->getRaw('object'); +$action = 'index.php?option=com_redshop&view=product&layout=element&tmpl=component&object=' . $object; +?> + +
    +
    +
    + + "> +
    +
    +
    + +
    +
    + lists['category']; ?> +
    + +
    + + + + + + + + + + + + 0): ?> + + + + products as $i => $product): ?> + id = $product->product_id; + $link = JRoute::_('index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $product->product_id); + + $published = JHtml::_('jgrid.published', $product->published, $i, '', 1); + ?> + "> + + + + + + + + + 0): ?> + + + + + + + + + +
    + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + +
    + pagination->getRowOffset($i) ?> + + product_name) ?>', '');"> + product_name; ?> + + product_number; ?> + + visited; ?> + + listedincats($product->product_id); ?> + + name . "
    "; ?> + +
    + manufacturer_id)->get('name') ?> + + product_id; ?> + + ordering; ?> +
    + =')): ?> +
    + pagination->getLimitBox() ?> +
    + + pagination->getListFooter() ?> +
    +
    + + + + +
    diff --git a/component/admin/views/product/tmpl/importattribute.php b/component/admin/views/product/tmpl/importattribute.php new file mode 100644 index 00000000000..b8907bbd94d --- /dev/null +++ b/component/admin/views/product/tmpl/importattribute.php @@ -0,0 +1,111 @@ +input; +$import_start = $jinput->getInt('import_start', 0); +$import_end = $jinput->getInt('import_end', 10); + +if (isset($post['import_start'])) +{ + $import_start = $post['import_start']; +} +if (isset($post['import_end'])) +{ + $import_end = $post['import_end']; +} +?> + +
    +
    +
    + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + + + +
    diff --git a/component/admin/views/product/tmpl/importproduct.php b/component/admin/views/product/tmpl/importproduct.php new file mode 100644 index 00000000000..06f2dcd0c3a --- /dev/null +++ b/component/admin/views/product/tmpl/importproduct.php @@ -0,0 +1,111 @@ +input; +$import_start = $jinput->getInt('import_start', 0); +$import_end = $jinput->getInt('import_end', 10); + +if (isset($post['import_start'])) +{ + $import_start = $post['import_start']; +} +if (isset($post['import_end'])) +{ + $import_end = $post['import_end']; +} +?> + +
    +
    +
    + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + + + +
    diff --git a/component/admin/views/product/tmpl/index.html b/component/admin/views/product/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product/tmpl/ins_product.php b/component/admin/views/product/tmpl/ins_product.php new file mode 100644 index 00000000000..2ecc31ddee9 --- /dev/null +++ b/component/admin/views/product/tmpl/ins_product.php @@ -0,0 +1,125 @@ +getModel('product'); +$eName = JFactory::getApplication()->input->get('e_name'); +$eName = preg_replace('#[^A-Z0-9\-\_\[\]]#i', '', $eName); +?> + + + +
    + "> + + +
    + + + + + + + + + + + products); $i < $n; $i++) + { + $row = $this->products[$i]; + $row->id = $row->product_id; + $link = JRoute::_('index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $row->product_id); + + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); + + ?> + "> + + + + + + + + + + + +
    + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($i); ?> + +
    product_name; ?>
    +
    +
    product_number;?>
    +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + + +
    diff --git a/component/admin/views/product/tmpl/listing.php b/component/admin/views/product/tmpl/listing.php new file mode 100644 index 00000000000..5af6c606071 --- /dev/null +++ b/component/admin/views/product/tmpl/listing.php @@ -0,0 +1,175 @@ +getModel('product'); + +?> + + + + +
    +
    +
    +
    + + "> +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + products as $i => $row): ?> + + + + + + + + + + + + + + +
    + # + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + + + + + + + + + +
    + pagination->getRowOffset($i); ?> + + product_id) ?> + + + product_name ?> + + + product_number ?> + + + + + + + + + + +
    + =')): ?> +
    + pagination->getLimitBox() ?> +
    + + pagination->getListFooter() ?> +
    +
    + + + + + +
    diff --git a/component/admin/views/product/view.html.php b/component/admin/views/product/view.html.php new file mode 100644 index 00000000000..06e5c2a816f --- /dev/null +++ b/component/admin/views/product/view.html.php @@ -0,0 +1,188 @@ +input->getCmd('layout', ''); + + if ($layout != 'importproduct' && $layout != 'importattribute' && $layout != 'listing' && $layout != 'ins_product') + { + JToolbarHelper::addNew('product_detail.addRedirect'); + JToolbarHelper::editList('product_detail.editRedirect'); + JToolBarHelper::custom('copy', 'copy.png', 'copy_f2.png', JText::_('COM_REDSHOP_TOOLBAR_COPY'), true); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + JToolBarHelper::custom('assignCategory', 'save.png', 'save_f2.png', JText::_('COM_REDSHOP_ASSIGN_CATEGORY'), true); + JToolBarHelper::custom('removeCategory', 'delete.png', 'delete_f2.png', JText::_('COM_REDSHOP_REMOVE_CATEGORY'), true); + } + + if ($layout == 'listing') + { + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_PRICE_MANAGEMENT')); + } + } + + public function display($tpl = null) + { + global $context; + + $context = 'product_id'; + + $GLOBALS['productlist'] = array(); + + $list_in_products = RedshopHelperExtrafields::listAllFieldInProduct(); + + $uri = JUri::getInstance(); + + $layout = JFactory::getApplication()->input->getCmd('layout', ''); + + // We don't need toolbar in the modal window. + if ($layout !== 'element') + { + $this->/** @scrutinizer ignore-call */ addToolbar(); + } + + $state = $this->get('State'); + $category_id = $state->get('category_id'); + + if ($category_id) + { + $filter_order = $state->get('list.ordering', 'x.ordering'); + } + else + { + $filter_order = $state->get('list.ordering', 'p.product_id'); + } + + $filter_order_Dir = $state->get('list.direction'); + + $search_field = $state->get('search_field'); + $keyword = $state->get('keyword'); + + $categories = $this->get('CategoryList'); + $categories1 = array(); + + foreach ($categories as $key => $value) + { + $categories1[$key] = new stdClass; + $categories1[$key]->id = $categories[$key]->id; + $categories1[$key]->parent_id = $categories[$key]->parent_id; + $categories1[$key]->title = $categories[$key]->title; + $treename = str_replace("      ", " ", $categories[$key]->treename); + $treename = str_replace("", " ", $treename); + $treename = str_replace(" ", " ", $treename); + $categories1[$key]->treename = $treename; + $categories1[$key]->children = $categories[$key]->children; + } + + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->id = "0"; + $temps[0]->treename = JText::_('COM_REDSHOP_SELECT_CATEGORY'); + $categories1 = @array_merge($temps, $categories1); + + $lists['category'] = JHTML::_('select.genericlist', $categories1, 'category_id', + 'class="inputbox" onchange="document.adminForm.submit();" ', 'id', 'treename', $category_id + ); + + $manufacturers = RedshopHelperManufacturer::getManufacturers(); + $manufacturers1 = array(); + + foreach ($manufacturers as $key => $value) + { + $manufacturers1[$key] = new stdClass; + $manufacturers1[$key]->id = $manufacturers[$key]->id; + $manufacturers1[$key]->treename = $manufacturers[$key]->name; + } + + $tempsManuf = array(); + $tempsManuf[0] = new stdClass; + $tempsManuf[0]->id = "all"; + $tempsManuf[0]->treename = JText::_('COM_REDSHOP_ALL_MANUFACTURERS'); + $tempsManuf[1] = new stdClass; + $tempsManuf[1]->id = "undefined"; + $tempsManuf[1]->treename = JText::_('COM_REDSHOP_UNDEFINED_MANUFACTURERS'); + $manufacturers1 = @array_merge($tempsManuf, $manufacturers1); + + $manufacturer_id = $state->get('manufacturer_id'); + + $lists['manufacturer'] = JHTML::_('select.genericlist', $manufacturers1, 'manufacturer_id', + 'class="inputbox" onchange="document.adminForm.submit();" ', 'id', 'treename', $manufacturer_id + ); + + $product_sort = RedshopHelperProduct::getProductsSortByList(); + $lists['product_sort'] = JHTML::_('select.genericlist', $product_sort, 'product_sort', + 'class="inputbox" onchange="document.adminForm.submit();" ', 'value', 'text', $state->get('product_sort') + ); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + $products = $this->get('Data'); + + $pagination = $this->get('Pagination'); + + // Assign template + $templates = RedshopHelperTemplate::getTemplate('product'); + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->id = "0"; + $temps[0]->name = JText::_('COM_REDSHOP_ASSIGN_TEMPLATE'); + $templates = @array_merge($temps, $templates); + + $lists['product_template'] = JHtml::_('select.genericlist', $templates, 'product_template', + 'class="inputbox" size="1" onchange="return AssignTemplate()" ', 'id', 'name', 0 + ); + + $this->state = $state; + $this->list_in_products = $list_in_products; + $this->keyword = $keyword; + $this->search_field = $search_field; + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->products = $products; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/product_attribute_price/index.html b/component/admin/views/product_attribute_price/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product_attribute_price/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product_attribute_price/tmpl/default.php b/component/admin/views/product_attribute_price/tmpl/default.php new file mode 100644 index 00000000000..2bedd4b1a89 --- /dev/null +++ b/component/admin/views/product_attribute_price/tmpl/default.php @@ -0,0 +1,67 @@ + + +
    +
    + + + + + + + + + + prices); $i++) + { + $row = $this->prices[$i]; + $row->id = $row->price_id; + //$product_id = $row->product_id; + ?> + "> + + + + + + + + + +
    + +
    shopper_group_name;?>
    +
    + + + + + + + +
    diff --git a/component/admin/views/product_attribute_price/tmpl/index.html b/component/admin/views/product_attribute_price/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product_attribute_price/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product_attribute_price/view.html.php b/component/admin/views/product_attribute_price/view.html.php new file mode 100644 index 00000000000..c18d5954740 --- /dev/null +++ b/component/admin/views/product_attribute_price/view.html.php @@ -0,0 +1,50 @@ +input; + $section_id = $jinput->get('section_id'); + $section = $jinput->get('section'); + $cid = $jinput->get('cid'); + $uri = JFactory::getURI(); + $document = JFactory::getDocument(); + + $document->setTitle(JText::_('COM_REDSHOP_PRODUCT_PRICE')); + jimport('joomla.html.pagination'); + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_PRICE'), 'redshop_vatrates48'); + + $sql = "SELECT * FROM #__redshop_product WHERE product_id = '$cid'"; + $db->setQuery($sql); + $product = $db->loadObject(); + + $sql = "SELECT g.*,p.product_price,p.price_id,p.price_quantity_end,p.price_quantity_start FROM #__redshop_shopper_group g LEFT JOIN #__redshop_product_attribute_price p ON g.shopper_group_id = p.shopper_group_id AND section_id = '$section_id'"; + $db->setQuery($sql); + $prices = $db->loadObjectList(); + $uri = JFactory::getURI(); + + $this->product = $product; + + $this->prices = $prices; + + $this->section_id = $section_id; + $this->section = $section; + $this->cid = $cid; + + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/product_category/index.html b/component/admin/views/product_category/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product_category/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product_category/tmpl/default.php b/component/admin/views/product_category/tmpl/default.php new file mode 100644 index 00000000000..398534f7646 --- /dev/null +++ b/component/admin/views/product_category/tmpl/default.php @@ -0,0 +1,78 @@ + + + +
    +
    +
    lists["category"]; ?> +
    + + + + + + + + products as $row): ?> + + + + + +
    + product_name; ?> + + + categories) && count($row->categories)) + { + foreach ($row->categories as $category) + { + echo $category . '
    '; + } + } + ?> +
    + + + +
    diff --git a/component/admin/views/product_category/tmpl/index.html b/component/admin/views/product_category/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product_category/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product_category/view.html.php b/component/admin/views/product_category/view.html.php new file mode 100644 index 00000000000..529fa4c34fa --- /dev/null +++ b/component/admin/views/product_category/view.html.php @@ -0,0 +1,47 @@ +setTitle(JText::_('COM_REDSHOP_PRODUCT')); + $task = JFactory::getApplication()->input->getCmd('task', ''); + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_MANAGEMENT'), 'redshop_products48'); + + if ($task == 'assignCategory') + { + JToolBarHelper::custom('saveProduct_Category', 'save.png', 'save_f2.png', JText::_('COM_REDSHOP_ASSIGN_CATEGORY'), false); + } + else + { + JToolBarHelper::custom('removeProduct_Category', 'delete.png', 'delete.png', JText::_('COM_REDSHOP_REMOVE_CATEGORY'), false); + } + + JToolBarHelper::back(); + + $model = $this->getModel("product_category"); + $products = $model->getProductlist(); + + $lists['category'] = JHTML::_('select.genericlist', RedshopHelperCategory::getCategoryListArray(), 'category_id[]', + 'class="inputbox" multiple="multiple" size="10"', 'id', 'name' + ); + + $this->products = $products; + $this->lists = $lists; + + parent::display($tpl); + } +} diff --git a/component/admin/views/product_detail/index.html b/component/admin/views/product_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product_detail/tmpl/attribute_color.php b/component/admin/views/product_detail/tmpl/attribute_color.php new file mode 100644 index 00000000000..f6f8fde02fc --- /dev/null +++ b/component/admin/views/product_detail/tmpl/attribute_color.php @@ -0,0 +1,145 @@ +root(); + +$section_id = $this->input->getInt('section_id', null); +$product_id = $this->input->getInt('cid', null); +$images = $this->producthelper->getAttibuteSubProperty(0, $section_id) +?> + + + +
    +
    + + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + 0) : ?> + subattribute_color_image; + + $thumbUrl = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'subcolor', + Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'), + Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + ?> + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + + + + + + + +
    +
    +
    + +
    + + + + + +
    diff --git a/component/admin/views/product_detail/tmpl/default.php b/component/admin/views/product_detail/tmpl/default.php new file mode 100644 index 00000000000..bd47d999e52 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default.php @@ -0,0 +1,331 @@ + + + + +input->getBool('showbuttons', false)) : ?> +
    +
    + + +
    +
    +
    + + +
    + + $this, + 'tabMenu' => $this->tabmenu->getData('tab')->items, + ) + ); + + // Echo plugin tabs. + $this->dispatcher->trigger('onDisplayProductTabs', array($this->detail)); + ?> + +
    + + + + + + + + + + + + + + + +
    + diff --git a/component/admin/views/product_detail/tmpl/default_calculator.php b/component/admin/views/product_detail/tmpl/default_calculator.php new file mode 100644 index 00000000000..329c02f5242 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_calculator.php @@ -0,0 +1,323 @@ +getModel('product_detail'); +$stockrooms = $model->StockRoomList(); +?> + + + +
    +
    +
    +
    +

    +
    +
    + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + + + lists['use_discount_calc'];?> +
    + + + lists['discount_calc_method'];?> +
    + + + lists['allow_decimal_piece'];?> +
    + + + lists['use_range'];?> +
    + +
    + +
    + +
    + + + + + + + + + + + + getDiscountCalcData(); + + // ToDo: This should be in view.html.php? + for ($i = 0, $in = count($calc_data); $i < $in; $i++) + { + // Calculation UNIT. + $lists = array(); + $options = array(); + $options[] = JHtml::_('select.option', 'mm', JText::_('COM_REDSHOP_MILLIMETER')); + $options[] = JHtml::_('select.option', 'cm', JText::_('COM_REDSHOP_CENTIMETER')); + $options[] = JHtml::_('select.option', 'm', JText::_('COM_REDSHOP_METER')); + $lists['discount_calc_unit'] = JHtml::_( + 'select.genericlist', + $options, + 'discount_calc_unit[]', + 'class="inputbox" size="1" ', + 'value', + 'text', + $calc_data[$i]->discount_calc_unit + ); + unset($options); + ?> + + + + + + + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + +
    + +
    + +
    + +
    + + + + + + + + + + + getDiscountCalcDataExtra(); + + for ($i = 0, $in = count($calc_data); $i < $in; $i++) + { + // Calculation UNIT. + $options = array(); + $options[] = JHtml::_('select.option', '+', JText::_('COM_REDSHOP_PLUS')); + $options[] = JHtml::_('select.option', '-', JText::_('COM_REDSHOP_MINUS')); + $options[] = JHtml::_('select.option', '%', JText::_('COM_REDSHOP_PERCENTAGE')); + $lists['discount_calc_oprand'] = JHtml::_( + 'select.genericlist', + $options, + 'pdc_oprand[]', + 'class="inputbox" size="1" ', + 'value', + 'text', + $calc_data[$i]->oprand + ); + + unset($options); + ?> + + + + + + + + +
    + + + + + + + + + +
    + + + + + + + + +
    + +
    + +
    +
    +
    +
    +
    + diff --git a/component/admin/views/product_detail/tmpl/default_economic_settings.php b/component/admin/views/product_detail/tmpl/default_economic_settings.php new file mode 100644 index 00000000000..1f614e7e7c3 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_economic_settings.php @@ -0,0 +1,92 @@ + + +
    +
    +
    +
    +

    +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + +
    + + + lists['accountgroup_id'];?> + + +
    + + + + + +
    +
    +
    + +
    +
    +
    +
    +
    + diff --git a/component/admin/views/product_detail/tmpl/default_extrafield.php b/component/admin/views/product_detail/tmpl/default_extrafield.php new file mode 100644 index 00000000000..182cc0425f3 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_extrafield.php @@ -0,0 +1,63 @@ +detail->product_template; +$template = RedshopHelperTemplate::getTemplate("product", $templateId); + +if (count($template) == 0) +{ + return; +} + +$template = $template[0]->template_desc; +$sections = array( + RedshopHelperExtrafields::SECTION_PRODUCT, + RedshopHelperExtrafields::SECTION_PRODUCT_FINDER_DATE_PICKER +); + +$html = ''; + +foreach ($sections as $section) +{ + $html .= RedshopHelperExtrafields::listAllField($section, $this->detail->product_id, ''); +} + +$this->dispatcher->trigger('onRenderExtraFields', array($this->detail->product_id, &$html)); +?> + +
    +
    +
    +
    +

    +
    +
    + array( + 'info' => array(JText::_('COM_REDSHOP_PRODUCT_NO_EXTRA_FIELD_HINT')) + ), + 'showHeading' => false, + 'allowClose' => false + ) + ); + ?> +
    +
    +
    +
    + +
    +
    + +
    +
    +get('PRICE_DECIMAL', '.'); +$priceThousand = Redshop::getConfig()->get('THOUSAND_SEPERATOR', ','); +$editor = JFactory::getEditor(); +$calendarFormat = Redshop::getConfig()->getString('DEFAULT_DATEFORMAT', 'Y-m-d'); +$config = JFactory::getConfig(); +$tz = new \DateTimeZone($config->get('offset')); + +$media = RedshopEntityProduct::getInstance($this->detail->product_id)->getMedia(); + +$fullMediaId = 0; +$fullImage = $this->detail->product_full_image; + +foreach ($media->getAll() as $mediaItem) +{ + if ($mediaItem->get('media_name') == $this->detail->product_full_image) + { + $fullImage = $mediaItem->get('media_name'); + $fullMediaId = $mediaItem->getId(); + } +} +?> + +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    + + +
    + +
    + + + +
    + +
    + + lists['categories']; ?> +
    + +
    + + lists['product_type']; ?> +
    + +
    + + lists['product_template']; ?> +
    + +
    + + lists['manufacturers']; ?> +
    + +
    + + lists['published']; ?> +
    +
    +
    +
    + + +
    + get('REDCURRENCY_SYMBOL') ?> + +
    +
    + +
    + + lists['product_tax_group_id']; ?> +
    + +
    + + +
    + get('REDCURRENCY_SYMBOL') ?> + +
    +
    + +
    + + detail->discount_stratdate) + { + $startDate = is_numeric($this->detail->discount_stratdate) ? + date_create_from_format('U', $this->detail->discount_stratdate)->setTimezone($tz)->format($calendarFormat) + : $this->detail->discount_stratdate; + } + + echo JHtml::_( + 'redshopcalendar.calendar', + $startDate, + 'discount_stratdate', + 'discount_stratdate', + $calendarFormat, + array('class' => 'form-control', 'size' => '15', 'maxlength' => '19'), + null, + $config->get('offset') + ); + ?> +
    + +
    + + detail->discount_enddate) + { + $endDate = is_numeric($this->detail->discount_enddate) ? + date_create_from_format('U', $this->detail->discount_enddate)->setTimezone($tz)->format($calendarFormat) + : $this->detail->discount_enddate; + } + + echo JHtml::_( + 'redshopcalendar.calendar', + $endDate, + 'discount_enddate', + 'discount_enddate', + $calendarFormat, + array('class' => 'form-control', 'size' => '15', 'maxlength' => '19'), + null, + $config->get('offset') + ); + ?> +
    + + detail->discount_stratdate || !$this->detail->discount_enddate) : ?> + + + +
    > + detail->product_on_sale) ? JText::_('JYES') : JText::_('JNO'); + echo JText::sprintf('COM_REDSHOP_PRODUCT_ON_SALE_HINT', $isProductOnSale); + ?> +
    + +
    + + lists['jtags']; ?> +
    +
    +
    +
    +
    + + +
    +
    +

    +
    +
    +
    + + display("product_desc", $this->detail->product_desc, '$widthPx', '$heightPx', '100', '20'); ?> +
    +
    + +
    + + display("product_s_desc", $this->detail->product_s_desc, '$widthPx', '$heightPx', '100', '20'); ?> +
    +
    +
    + + +
    + +
    +
    +
    +

    +
    +
    +
    + detail->product_id, + 'product', + $fullImage, + false, + false, + $fullMediaId + ) ?> +
    + detail->product_id > 0) : ?> + detail->product_id . '&showbuttons=1&media_section=product'; ?> +
    + + + +
    + +
    +
    + +
    +
    +

    +
    +
    + 'product_back_full_image', + 'deleteid' => 'back_image_delete', + 'displayid' => 'back_image_display', + 'type' => 'product', + 'image' => $this->detail->product_back_full_image + ) + ); + ?> +
    +
    + +
    +
    +

    +
    +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    + +
    +
    +

    +
    +
    +
    + + lists['supplier']; ?> +
    + +
    + + producthelper->getProductByID($this->detail->product_parent_id), + 'product_parent_id', + array( + 'select2.options' => array('multiple' => 'false', 'placeholder' => JText::_('COM_REDSHOP_PARENT_PRODUCT')), + 'option.key' => 'product_id', + 'option.text' => 'product_name', + 'select2.ajaxOptions' => array('typeField' => ', parent:1, product_id:' . $this->detail->product_id) + ) + ); + ?> +
    + +
    + + lists['product_special']; ?> +
    + +
    + + lists['expired']; ?> +
    + +
    + + lists['not_for_sale']; ?> +
    + +
    + + lists['not_for_sale_showprice']; ?> +
    + +
    + + lists['preorder']; ?> +
    + +
    + + +
    + + get('ALLOW_PRE_ORDER')) : ?> +
    + + detail->product_availability_date) + { + $availability_date = date("d-m-Y", $this->detail->product_availability_date); + } + + echo JHtml::_( + 'calendar', + $availability_date, + 'product_availability_date', + 'product_availability_date', + $calendarFormat, + array('class' => 'inputbox', 'size' => '15', 'maxlength' => '19') + ); + ?> +
    + + +
    + + +
    + +
    + + +
    +
    +
    +
    +
    diff --git a/component/admin/views/product_detail/tmpl/default_product_accessory.php b/component/admin/views/product_detail/tmpl/default_product_accessory.php new file mode 100644 index 00000000000..33fd77b63a9 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_product_accessory.php @@ -0,0 +1,161 @@ + + +
    +
    +
    +
    +
    +

    +
    +
    +
    + + + + + +
    + + + array( + 'events' => array( + 'select2-selecting' => 'function(e) {create_table_accessory(e.object.text, e.object.id, e.object.price)}', + 'select2-close' => 'function(e) {$(this).select2("val", "")}' + ) + ), + 'select2.ajaxOptions' => array( + 'typeField' => ', accessoryList: function(){ + var listAcc = []; + jQuery(\'input.childProductAccessory\').each(function(){ + listAcc[listAcc.length] = jQuery(this).val(); + }); + return listAcc.join(","); + }, product_id:' . $this->detail->product_id + ), + ) + ); + ?> +
    +
    + + + + + + + + + + + + + lists['accessory_product']; + + for ($f = 0, $fn = count($accessory_product); $f < $fn; $f++) + { + $accessory_main_price = 0; + + if ($this->detail->product_id && $accessory_product[$f]->accessory_id) + { + $accessory_main_price = $this->producthelper->getAccessoryPrice( + $this->detail->product_id, + $accessory_product[$f]->newaccessory_price, + $accessory_product[$f]->accessory_main_price, + 1 + ); + } + + $checked = ($accessory_product[$f]->setdefault_selected) ? "checked" : ""; + ?> + + + + + + + + + + +
    + + + + + + + + + + + +
    + product_name;?> + + + + + + + + + + + + +
    + +
    +
    +
    +
    + loadTemplate('related'); ?> +
    +
    +
    + diff --git a/component/admin/views/product_detail/tmpl/default_product_attribute.php b/component/admin/views/product_detail/tmpl/default_product_attribute.php new file mode 100755 index 00000000000..1bc6d48ffbe --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_product_attribute.php @@ -0,0 +1,166 @@ + + +
    +
    +
    +
    +

    +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    + +
    lists['copy_attribute']; ?>
    lists['attributesSet']; ?>
    + +
    +
    +
    + $this)); ?> +
    +
    +
    +
    + + diff --git a/component/admin/views/product_detail/tmpl/default_product_images.php b/component/admin/views/product_detail/tmpl/default_product_images.php new file mode 100644 index 00000000000..b1d5c08983b --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_product_images.php @@ -0,0 +1,133 @@ + + +
    +
    +
    +
    +

    +
    +
    +
    + + 'product_thumb_image', + 'deleteid' => 'thumb_image_delete', + 'displayid' => 'thumb_image_display', + 'type' => 'product', + 'image' => $this->detail->product_thumb_image + ) + ); + ?> +
    + +
    + + 'product_back_thumb_image', + 'deleteid' => 'back_thumb_image_delete', + 'displayid' => 'thumb_back_image_display', + 'type' => 'product', + 'image' => $this->detail->product_back_thumb_image + ) + ); + ?> +
    + +
    + + 'product_preview_image', + 'deleteid' => 'preview_image_delete', + 'displayid' => 'preview_image_display', + 'type' => 'product', + 'image' => $this->detail->product_preview_image + ) + ); + ?> +
    + +
    + + 'product_preview_back_image', + 'deleteid' => 'preview_back_image_delete', + 'displayid' => 'preview_back_image_display', + 'type' => 'product', + 'image' => $this->detail->product_preview_back_image + ) + ); + ?> +
    +
    +
    +
    +
    diff --git a/component/admin/views/product_detail/tmpl/default_product_meta_data.php b/component/admin/views/product_detail/tmpl/default_product_meta_data.php new file mode 100644 index 00000000000..4e735cb3337 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_product_meta_data.php @@ -0,0 +1,157 @@ + + +
    +
    +
    +
    +

    +
    +
    +
    + + lists['append_to_global_seo']; ?> +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + " + /> + +
    + +
    + + lists['cat_in_sefurl']; ?> +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    +
    +
    diff --git a/component/admin/views/product_detail/tmpl/default_product_payment_method.php b/component/admin/views/product_detail/tmpl/default_product_payment_method.php new file mode 100644 index 00000000000..68581dd2f69 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_product_payment_method.php @@ -0,0 +1,49 @@ +detail->use_individual_payment_method == 1 ? 'block' : 'none'; +?> + +
    +
    +
    +
    +

    +
    +
    +
    + +
    + lists['use_individual_payment_method']; ?> +
    +
    +
    +
    + +
    + lists['payment_methods']; ?> +
    +
    +
    +
    +
    +
    diff --git a/component/admin/views/product_detail/tmpl/default_productfinder.php b/component/admin/views/product_detail/tmpl/default_productfinder.php new file mode 100644 index 00000000000..90482dbacb7 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_productfinder.php @@ -0,0 +1,31 @@ +getassociation)) +{ + $accosiation_id = $this->getassociation->id; + $ordering = $this->getassociation->ordering; +} + +?> +
    + + + + + +
    lists['tags']; ?>
    + + +
    diff --git a/component/admin/views/product_detail/tmpl/default_productstockroom.php b/component/admin/views/product_detail/tmpl/default_productstockroom.php new file mode 100644 index 00000000000..2e3cc8dd43b --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_productstockroom.php @@ -0,0 +1,105 @@ +getModel('product_detail'); +$stockrooms = $model->StockRoomList(); +?> + + + + + + + +
    + + + + + + + + + + + + + + + + + 0) + { + foreach ($stockrooms as $s) + { + $ordered_preorder = ""; + $preorder_stock = ""; + $quantity = $model->StockRoomProductQuantity($this->detail->product_id, $s->stockroom_id); + $preorder_stock_data = $model->StockRoomPreorderProductQuantity($this->detail->product_id, $s->stockroom_id); + + if ($preorder_stock_data) + { + $ordered_preorder = $preorder_stock_data[0]->ordered_preorder; + $preorder_stock = $preorder_stock_data[0]->preorder_stock; + } + ?> + + + + + + + + + + "/> + + +
    + stockroom_name; ?> + + + + + min_del_time != '') + { + $del_time = $s->min_del_time; + + if ($s->delivery_time == 'Days') + { + echo $del_time . " " . JText::_('COM_REDSHOP_DAYS'); + } + elseif ($s->delivery_time == 'Weeks') + { + $del_time = $s->min_del_time / 7; + echo (int) $del_time . " " . JText::_('COM_REDSHOP_WEEKS'); + } + } + ?> + + + + + + + +
    + +
    diff --git a/component/admin/views/product_detail/tmpl/default_producttype.php b/component/admin/views/product_detail/tmpl/default_producttype.php new file mode 100644 index 00000000000..bfa9b11f36c --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_producttype.php @@ -0,0 +1,325 @@ +detail->product_download_infinite == 0) ? 'style="display:table-row;"' : 'style="display:none;"'; + +$optionPeriod = array(); +?> + +producthelper->getSubscription($this->detail->product_id); +$renewal_detail = $this->model->getSubscriptionrenewal(); +$productSerialDetail = $this->productSerialDetail; +$total_serial = count($productSerialDetail); +?> + +
    +
    +
    +
    +

    +
    +
    + detail->product_type == 'file') || ($this->detail->product_download == 1)) : ?> +
    + + + + + + + + + + + + + + > + + + + + > + + + + + > + + + + + + + + + +
    + + + lists['product_download'];?> +
    + + + detail->product_download_infinite + ); + ?> +
    + + + +
    + + + +
    + + + + +
    + + + +
    + + 0) :?> + + + + + + + + + + + + + + + +
    + <?php echo JText::_('COM_REDSHOP_DELETE'); ?> + + + + serial_number; ?> + + is_used ? JText::_('COM_REDSHOP_YES') : JText::_('COM_REDSHOP_NO'); ?> +
    + + +
    + detail->product_type == 'subscription') : ?> +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    + + + + + period_type); + ?> + + + + +
    + +
    + + + + + + +
    + + + + + +
    + +
    + + dispatcher->trigger('onDisplayProductTypeData', array($this->detail)); + ?> + +
    +
    +
    +
    + + + + + + diff --git a/component/admin/views/product_detail/tmpl/default_related.php b/component/admin/views/product_detail/tmpl/default_related.php new file mode 100644 index 00000000000..fdda091b67a --- /dev/null +++ b/component/admin/views/product_detail/tmpl/default_related.php @@ -0,0 +1,86 @@ + +
    +
    +

    +
    +
    + + + + + + + + +
    + + + + lists['related_product']; ?> +
    + + + +
    +
    +
    + + diff --git a/component/admin/views/product_detail/tmpl/index.html b/component/admin/views/product_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product_detail/tmpl/productstockroom.php b/component/admin/views/product_detail/tmpl/productstockroom.php new file mode 100644 index 00000000000..a569aff375f --- /dev/null +++ b/component/admin/views/product_detail/tmpl/productstockroom.php @@ -0,0 +1,114 @@ +getModel('product_detail'); + +$cid = $this->input->getInt('cid', 0); + +$section_id = $this->input->getInt('section_id', 0); +$section = $this->input->getString('property', ''); + + +$stockrooms = $model->StockRoomList(); + +?> +
    + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + 0) + { + foreach ($stockrooms as $s) + { + $ordered_preorder = ""; + $preorder_stock = ""; + $quantity = $model->StockRoomAttProductQuantity($section_id, $s->stockroom_id, $section); + $preorder_stock_data = $model->StockRoomAttProductPreorderstock($section_id, $s->stockroom_id, $section); + + if ($preorder_stock_data) + { + $ordered_preorder = $preorder_stock_data[0]->ordered_preorder; + $preorder_stock = $preorder_stock_data[0]->preorder_stock; + } + ?> + + + + + + + + + + + +
    + stockroom_name; ?> + + + + + + + + + +
    + +
    + +
    + + + + + +
    + +
    diff --git a/component/admin/views/product_detail/tmpl/property_images.php b/component/admin/views/product_detail/tmpl/property_images.php new file mode 100644 index 00000000000..ff39c7384e2 --- /dev/null +++ b/component/admin/views/product_detail/tmpl/property_images.php @@ -0,0 +1,179 @@ +root(); + +$showbuttons = $this->input->getBool('showbuttons', false); +$section_id = $this->input->getInt('section_id', null); +$fsec = $this->input->getString('fsec', ''); +$product_id = $this->input->getInt('cid', null); + +if ($fsec == 'subproperty') +{ + $images = $this->model->getSubpropertyImages($section_id); + $mainImage = $this->producthelper->getAttibuteSubProperty($section_id); +} +else +{ + $mainImage = $this->producthelper->getAttibuteProperty($section_id); + $images = $this->model->getpropertyImages($section_id); +} + +$mainImage = $mainImage[0]; +?> + + + +
    + +
    + + +
    + +
    + +
    + +
    + +
    + +
    + + + + + + + + + + + + + +
    + + + + +
    + + + + + +
    +
    + +
    + + + + + + + + + +
    +subattribute_color_image; + $rs_folder = 'subcolor'; +} +else +{ + $thumb = $mainImage->property_main_image; + $rs_folder = 'property'; +} + +$mainimg = ''; + +if (file_exists(REDSHOP_FRONT_IMAGES_RELPATH . $rs_folder . "/" . $thumb) && $thumb != '') +{ + $mainimg .= '
    '; + $mainimg .= " "; + $mainimg .= "
    "; + + echo '
    ' . JText::_('COM_REDSHOP_MAIN_IMAGE') . '
    '; + echo $mainimg; +} + +if (count($images)) +{ + echo '


    ' . JText::_('COM_REDSHOP_ADDITIONAL_IMAGES') . '
    '; + $more_images = ''; + + for ($i = 0, $in = count($images); $i < $in; $i++) + { + $image = $images[$i]; + $thumb = $image->media_name; + + if (file_exists(REDSHOP_FRONT_IMAGES_RELPATH . "property/" . $thumb) && $thumb != '') + { + $more_images .= '
    '; + $more_images .= "
    " . + "" . + JText::_('COM_REDSHOP_DELETE') . + ""; + $more_images .= "
    "; + } + } + + echo $more_images; +} diff --git a/component/admin/views/product_detail/view.html.php b/component/admin/views/product_detail/view.html.php new file mode 100644 index 00000000000..70cd50efe2b --- /dev/null +++ b/component/admin/views/product_detail/view.html.php @@ -0,0 +1,754 @@ +input = $app->input; + $user = JFactory::getUser(); + + JPluginHelper::importPlugin('redshop_product'); + JPluginHelper::importPlugin('redshop_product_type'); + + $this->dispatcher = RedshopHelperUtility::getDispatcher(); + $this->producthelper = productHelper::getInstance(); + + $this->option = $this->input->getString('option', 'com_redshop'); + $lists = array(); + + $model = $this->getModel('product_detail'); + $detail = $this->get('data'); + + $isNew = ($detail->product_id < 1); + + // Load new product default values + if ($isNew) + { + $detail->append_to_global_seo = ''; + $detail->canonical_url = ''; + } + + // Fail if checked out not by 'me' + if ($model->isCheckedOut($user->get('id'))) + { + $msg = JText::_('COM_REDSHOP_PRODUCT_BEING_EDITED'); + $app->redirect('index.php?option=com_redshop&view=product', $msg); + } + + // Check redproductfinder is installed + $CheckRedProductFinder = $model->CheckRedProductFinder(); + $this->CheckRedProductFinder = $CheckRedProductFinder; + + // Get association id + $getAssociation = $model->getAssociation(); + $this->getassociation = $getAssociation; + + // Get the tag names + $tags = $model->Tags(); + $associationtags = array(); + + if (isset($getAssociation) && count($getAssociation) > 0) + { + $associationtags = $model->AssociationTags($getAssociation->id); + } + + if (count($tags) > 0) + { + $lists['tags'] = JHtml::_('select.genericlist', $tags, 'tag_id[]', 'multiple', 'id', 'tag_name', $associationtags); + } + + $types = $model->TypeTagList(); + + // Get the Quality Score data + + $qs = $this->get('QualityScores', 'product_detail'); + + // ToDo: Don't echo HTML but use tmpl files. + // Create the select list as checkboxes + + $html = '
    '; + + if (count($types) > 0) + { + foreach ($types as $typeid => $type) + { + $counttags = count($type['tags']); + $rand = rand(); + + // Add the type + + $html .= '
    ' . JText::_('COM_REDSHOP_TYPE_LIST') + . ' ' . $type['type_name'] . '
    '; + $html .= '
    '; + + // Add the tags + + if ($counttags > 0) + { + foreach ($type['tags'] as $tagid => $tag) + { + // Check if the tag is selected + + if (in_array($tagid, $associationtags)) + { + $selected = 'checked="checked"'; + } + + else + { + $selected = ''; + } + + $html .= ''; + + $qs_value = ''; + + if (is_array($qs)) + { + if (array_key_exists($typeid . '.' . $tagid, $qs)) + { + $qs_value = $qs[$typeid . '.' . $tagid]['quality_score']; + } + } + + $html .= ''; + + $html .= '
    ' + . JText::_('COM_REDSHOP_TAG_LIST') . ' ' . $tag['tag_name']; + $html .= '
    ' . JText::_('COM_REDSHOP_QUALITY_SCORE') + . ''; + $html .= '
     ' + . JText::_('COM_REDSHOP_ADD_DEPENDENCY') . '
    '; + } + } + + $html .= '
    '; + } + } + + $html .= '
    '; + $lists['tags'] = $html; + $templates = RedshopHelperTemplate::getTemplate("product"); + $manufacturers = $model->getmanufacturers(); + $supplier = $model->getsupplier(); + $productCategories = $this->input->post->get('product_category', array(), 'array'); + + if (!empty($productCategories)) + { + $productcats = $productCategories; + } + else + { + $productcats = $model->getproductcats(); + } + + $attributes = $model->getattributes(); + $attributesSet = $model->getAttributeSetList(); + + // Merging select option in the select box + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->id = "0"; + $temps[0]->name = JText::_('COM_REDSHOP_SELECT'); + + if (is_array($templates)) + { + $templates = array_merge($temps, $templates); + } + + // Merging select option in the select box + $supps = array(); + $supps[0] = new stdClass; + $supps[0]->value = "0"; + $supps[0]->text = JText::_('COM_REDSHOP_SELECT'); + + if (is_array($manufacturers)) + { + $manufacturers = array_merge($supps, $manufacturers); + } + + // Merging select option in the select box + $supps = array(); + $supps[0] = new stdClass; + $supps[0]->value = "0"; + $supps[0]->text = JText::_('COM_REDSHOP_SELECT'); + + if (is_array($supplier)) + { + $supplier = array_merge($supps, $supplier); + } + + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_MANAGEMENT_DETAIL'), 'pencil-2 redshop_products48'); + + $document = JFactory::getDocument(); + + $document->addScriptDeclaration("var WANT_TO_DELETE = '" . JText::_('COM_REDSHOP_DO_WANT_TO_DELETE') . "';"); + + /** + * Override field.js file. + * With this trigger the file can be loaded from a plugin. This can be used + * to display different JS generated interface for attributes depending on a product type. + * So, product type plugins should be used for this event. Be aware that this file should + * be loaded only once. + */ + $loadedFromAPlugin = $this->dispatcher->trigger('loadFieldsJSFromPlugin', array($detail)); + + if (in_array(1, $loadedFromAPlugin)) + { + $loadedFromAPlugin = true; + } + else + { + $loadedFromAPlugin = false; + } + + if (!$loadedFromAPlugin) + { + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.fields.min.js', false, true); + } + + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/json.min.js', false, true); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.validation.min.js', false, true); + + if (version_compare(JVERSION, '3.0', '<')) + { + /** @scrutinizer ignore-deprecated */ + JHtml::stylesheet('com_redshop/redshop.update.min.css', array(), true); + } + + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.attribute-manipulation.min.js', false, true); + + if (file_exists(JPATH_SITE . '/components/com_redproductfinder/helpers/redproductfinder.css')) + { + $document->addStyleSheet('components/com_redproductfinder/helpers/redproductfinder.css'); + } + + $uri = JFactory::getURI(); + + $layout = $this->input->getString('layout', ''); + + if ($layout === 'property_images') + { + $this->setLayout('property_images'); + } + elseif ($layout === 'attribute_color') + { + $this->setLayout('attribute_color'); + } + elseif ($layout === 'productstockroom') + { + $this->setLayout('productstockroom'); + } + else + { + $this->setLayout('default'); + } + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : $detail->product_name . " - " . JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT') . ': [ ' . $text . ' ]', 'pencil-2 redshop_products48'); + + JToolBarHelper::apply(); + JToolBarHelper::save(); + JToolBarHelper::save2new(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolbarHelper::save2copy(); + $model->checkout($user->get('id')); + + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + if ($detail->product_id > 0) + { + $menu = $this->producthelper->getMenuInformation(0, 0, '', 'product&pid=' . $detail->product_id); + $mainCategoryId = $detail->cat_in_sefurl; + + if (!empty($menu)) + { + $pItemid = $menu->id; + } + else + { + $pItemid = RedshopHelperRouter::getItemId($detail->product_id, $mainCategoryId); + } + + $link = JUri::root(); + $link .= 'index.php?option=com_redshop'; + $link .= '&view=product&pid=' . $detail->product_id; + $link .= '&cid=' . $mainCategoryId; + $link .= '&Itemid=' . $pItemid; + + RedshopToolbarHelper::link($link, 'preview', 'JGLOBAL_PREVIEW', '_blank'); + JToolBarHelper::addNew('prices', JText::_('COM_REDSHOP_ADD_PRICE_LBL')); + } + + $model = $this->getModel('product_detail'); + + $accessoryProducts = array(); + + if ($detail->product_id) + { + $accessoryProducts = RedshopHelperAccessory::getProductAccessories(0, $detail->product_id); + } + + $lists['accessory_product'] = $accessoryProducts; + $lists['QUANTITY_SELECTBOX_VALUE'] = $detail->quantity_selectbox_value; + + // For preselected. + if ($detail->product_template == "") + { + $default_preselected = Redshop::getConfig()->get('PRODUCT_TEMPLATE'); + $detail->product_template = $default_preselected; + } + + $lists['product_template'] = JHtml::_('select.genericlist', $templates, 'product_template', + 'class="inputbox" size="1" onchange="set_dynamic_field(this.value,\'' . $detail->product_id . '\',\'1,12,17\');" ', + 'id', 'name', $detail->product_template + ); + + $lists['related_product'] = JHtml::_('redshopselect.search', $model->related_product_data($detail->product_id), 'related_product', + array( + 'select2.ajaxOptions' => array('typeField' => ', related:1, product_id:' . $detail->product_id), + 'select2.options' => array('multiple' => 'true') + ) + ); + + $product_tax = $model->gettax(); + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->value = "0"; + $temps[0]->text = JText::_('COM_REDSHOP_SELECT'); + + if (is_array($product_tax)) + { + $product_tax = array_merge($temps, $product_tax); + } + + $lists['product_tax'] = JHtml::_('select.genericlist', $product_tax, 'product_tax_id', + 'class="inputbox" size="1" ', 'value', 'text', $detail->product_tax_id + ); + + $categories = RedshopHelperCategory::listAll("product_category[]", 0, $productcats, 10, false, true); + $lists['categories'] = $categories; + $detail->first_selected_category_id = isset($productcats[0]) ? $productcats[0] : null; + + // Payment method list + $lists['payment_methods'] = RedshopHelperPayment::listAll("payment_method[]", $detail->product_id, 10, true); + + $detail->use_individual_payment_method = isset($detail->use_individual_payment_method) ? $detail->use_individual_payment_method : null; + + $lists['use_individual_payment_method'] = JHtml::_( + 'select.booleanlist', 'use_individual_payment_method', 'class="inputbox"', $detail->use_individual_payment_method + ); + + $lists['manufacturers'] = JHtml::_('select.genericlist', $manufacturers, 'manufacturer_id', + 'class="inputbox" size="1" ', 'value', 'text', $detail->manufacturer_id + ); + + $lists['supplier'] = JHtml::_('select.genericlist', $supplier, 'supplier_id', 'class="inputbox" size="1" ', 'value', 'text', $detail->supplier_id); + $lists['published'] = JHtml::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + $lists['product_on_sale'] = JHtml::_('select.booleanlist', 'product_on_sale', 'class="inputbox"', $detail->product_on_sale); + $lists['copy_attribute'] = JHtml::_('select.booleanlist', 'copy_attribute', 'class="inputbox"', 0); + $lists['product_special'] = JHtml::_('select.booleanlist', 'product_special', 'class="inputbox"', $detail->product_special); + $lists['product_download'] = JHtml::_('select.booleanlist', 'product_download', 'class="inputbox"', $detail->product_download); + + $detail->not_for_sale_showprice = 0; + + if ($detail->not_for_sale == 2) + { + $detail->not_for_sale = 1; + $detail->not_for_sale_showprice = 1; + } + + $lists['not_for_sale'] = JHtml::_('select.booleanlist', 'not_for_sale', 'class="inputbox"', $detail->not_for_sale); + $lists['not_for_sale_showprice'] = JHtml::_('select.booleanlist', 'not_for_sale_showprice', 'class="inputbox"', $detail->not_for_sale_showprice); + + $lists['expired'] = JHtml::_('select.booleanlist', 'expired', 'class="inputbox"', $detail->expired); + $lists['allow_decimal_piece'] = JHtml::_('select.booleanlist', 'allow_decimal_piece', 'class="inputbox"', $detail->allow_decimal_piece); + + // For individual pre-order + $preorder_data = RedshopHelperUtility::getPreOrderByList(); + $lists['preorder'] = JHtml::_('select.genericlist', $preorder_data, 'preorder', 'class="inputbox" size="1" ', 'value', 'text', $detail->preorder); + + // Discount calculator + $lists['use_discount_calc'] = JHtml::_('select.booleanlist', 'use_discount_calc', 'class="inputbox"', $detail->use_discount_calc); + + $selectOption = array(); + $selectOption[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_RANGE')); + $selectOption[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_PRICE_PER_PIECE')); + $lists['use_range'] = JHtml::_('select.genericlist', $selectOption, 'use_range', 'class="inputbox" size="1" ', 'value', 'text', $detail->use_range); + unset($selectOption); + + // Calculation method + $selectOption[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_SELECT')); + $selectOption[] = JHtml::_('select.option', 'volume', JText::_('COM_REDSHOP_VOLUME')); + $selectOption[] = JHtml::_('select.option', 'area', JText::_('COM_REDSHOP_AREA')); + $selectOption[] = JHtml::_('select.option', 'circumference', JText::_('COM_REDSHOP_CIRCUMFERENCE')); + $lists['discount_calc_method'] = JHtml::_('select.genericlist', $selectOption, 'discount_calc_method', + 'class="inputbox" size="1" ', 'value', 'text', $detail->discount_calc_method + ); + unset($selectOption); + + // Calculation UNIT + $remove_format = JHtml::$formatOptions; + + $selectOption[] = JHtml::_('select.option', 'mm', JText::_('COM_REDSHOP_MILLIMETER')); + $selectOption[] = JHtml::_('select.option', 'cm', JText::_('COM_REDSHOP_CENTIMETER')); + $selectOption[] = JHtml::_('select.option', 'm', JText::_('COM_REDSHOP_METER')); + $lists['discount_calc_unit'] = JHtml::_('select.genericlist', $selectOption, 'discount_calc_unit[]', + 'class="inputbox" size="1" ', 'value', 'text', Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') + ); + $lists['discount_calc_unit'] = str_replace($remove_format['format.indent'], "", $lists['discount_calc_unit']); + $lists['discount_calc_unit'] = str_replace($remove_format['format.eol'], "", $lists['discount_calc_unit']); + unset($selectOption); + + $productVatGroup = $model->getVatGroup(); + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->value = ""; + $temps[0]->text = JText::_('COM_REDSHOP_SELECT'); + + if (is_array($productVatGroup)) + { + $productVatGroup = array_merge($temps, $productVatGroup); + } + + if (Redshop::getConfig()->get('DEFAULT_VAT_GROUP') && !$detail->product_tax_group_id) + { + $detail->product_tax_group_id = Redshop::getConfig()->get('DEFAULT_VAT_GROUP'); + } + + $append_to_global_seo = array(); + $append_to_global_seo[] = JHtml::_('select.option', 'append', JText::_('COM_REDSHOP_APPEND_TO_GLOBAL_SEO')); + $append_to_global_seo[] = JHtml::_('select.option', 'prepend', JText::_('COM_REDSHOP_PREPEND_TO_GLOBAL_SEO')); + $append_to_global_seo[] = JHtml::_('select.option', 'replace', JText::_('COM_REDSHOP_REPLACE_TO_GLOBAL_SEO')); + $lists['append_to_global_seo'] = JHtml::_('select.genericlist', $append_to_global_seo, 'append_to_global_seo', + 'class="inputbox" size="1" ', 'value', 'text', $detail->append_to_global_seo + ); + + $lists['product_tax_group_id'] = JHtml::_('select.genericlist', $productVatGroup, 'product_tax_group_id', + 'class="inputbox" size="1" ', 'value', 'text', $detail->product_tax_group_id + ); + $prop_oprand = array(); + $prop_oprand[] = JHtml::_('select.option', 'select', JText::_('COM_REDSHOP_SELECT')); + $prop_oprand[] = JHtml::_('select.option', '+', JText::_('COM_REDSHOP_PLUS')); + $prop_oprand[] = JHtml::_('select.option', '=', JText::_('COM_REDSHOP_EQUAL')); + $prop_oprand[] = JHtml::_('select.option', '-', JText::_('COM_REDSHOP_MINUS')); + + $cat_in_sefurl = $model->catin_sefurl($detail->product_id); + $lists['cat_in_sefurl'] = JHtml::_('select.genericlist', $cat_in_sefurl, 'cat_in_sefurl', + 'class="inputbox" size="1" ', 'value', 'text', $detail->cat_in_sefurl + ); + + $lists['attributes'] = $attributes; + + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->value = ""; + $temps[0]->text = JText::_('COM_REDSHOP_SELECT'); + + if (is_array($attributesSet)) + { + $attributesSet = array_merge($temps, $attributesSet); + } + + $lists['attributesSet'] = JHtml::_('select.genericlist', $attributesSet, 'attribute_set_id', + 'class="inputbox" size="1" ', 'value', 'text', $detail->attribute_set_id + ); + + // Product type selection + $productTypeOptions = array(); + $productTypeOptions[] = JHtml::_('select.option', 'product', JText::_('COM_REDSHOP_PRODUCT')); + $productTypeOptions[] = JHtml::_('select.option', 'file', JText::_('COM_REDSHOP_FILE')); + $productTypeOptions[] = JHtml::_('select.option', 'subscription', JText::_('COM_REDSHOP_SUBSCRIPTION')); + + /* + * Trigger event which can update list of product types. + * Example of a returned value: + * return array('value' => 'redDESIGN', 'text' => JText::_('PLG_REDSHOP_PRODUCT_TYPE_REDDESIGN_REDDESIGN_PRODUCT_TYPE')); + */ + $productTypePluginOptions = $this->dispatcher->trigger('onListProductTypes'); + + foreach ($productTypePluginOptions as $productTypePluginOption) + { + $productTypeOptions[] = JHtml::_('select.option', $productTypePluginOption['value'], $productTypePluginOption['text']); + } + + if ($detail->product_download == 1) + { + $detail->product_type = 'file'; + } + + $lists["product_type"] = JHtml::_( + 'select.genericlist', + $productTypeOptions, + 'product_type', + 'onchange="set_dynamic_field(this.value,\'' . $detail->product_id . '\',\'1,12,17\');"', + 'value', + 'text', + $detail->product_type + ); + + $accountgroup = RedshopHelperUtility::getEconomicAccountGroup(); + $op = array(); + $op[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_SELECT')); + $accountgroup = array_merge($op, $accountgroup); + + $lists["accountgroup_id"] = JHtml::_('select.genericlist', $accountgroup, 'accountgroup_id', + 'class="inputbox" size="1" ', 'value', 'text', $detail->accountgroup_id + ); + + // For downloadable products + $productSerialDetail = $model->getProdcutSerialNumbers(); + + // Joomla tags + $jtags = JHelperTags::searchTags(); + + $currentTags = null; + + if (!empty($detail->product_id)) + { + $tagsHelper = new JHelperTags; + $currentTags = $tagsHelper->getTagIds($detail->product_id, 'com_redshop.product'); + $currentTags = explode(',', $currentTags); + } + + $lists['jtags'] = JHtml::_( + 'select.genericlist', $jtags, 'jtags[]', 'class="inputbox" size="10" multiple="multiple"', 'value', 'text', $currentTags + ); + + $this->model = $model; + $this->lists = $lists; + $this->detail = $detail; + $this->productSerialDetail = $productSerialDetail; + $this->request_url = $uri->toString(); + $this->tabmenu = $this->getTabMenu(); + + parent::display($tpl); + } + + /** + * Tab Menu + * + * @return object Tab menu + * @throws Exception + * + * @since 1.7 + */ + private function getTabMenu() + { + $app = JFactory::getApplication(); + $selectedTabPosition = $app->getUserState('com_redshop.product_detail.selectedTabPosition', 'general_data'); + + $tabMenu = RedshopAdminMenu::getInstance()->init(); + $tabMenu->section('tab') + ->title('COM_REDSHOP_PRODUCT_INFORMATION') + ->addItem( + '#general_data', + 'COM_REDSHOP_PRODUCT_INFORMATION', + ($selectedTabPosition === 'general_data') ? true : false, + 'general_data' + ); + + if ($this->detail->product_type !== 'product' && !empty($this->detail->product_type)) + { + $tabMenu->addItem( + '#producttype', + 'COM_REDSHOP_CHANGE_PRODUCT_TYPE_TAB', + ($selectedTabPosition === 'producttype') ? true : false, + 'producttype' + ); + } + + $tabMenu->addItem( + '#extrafield', + 'COM_REDSHOP_FIELDS', + ($selectedTabPosition === 'extrafield') ? true : false, + 'extrafield' + )->addItem( + '#product_images', + 'COM_REDSHOP_PRODUCT_IMAGES', + ($selectedTabPosition === 'product_images') ? true : false, + 'product_images' + )->addItem( + '#product_attribute', + 'COM_REDSHOP_PRODUCT_ATTRIBUTES', + ($selectedTabPosition === 'product_attribute') ? true : false, + 'product_attribute' + )->addItem( + '#product_accessory', + 'COM_REDSHOP_ACCESSORY_RELATED_PRODUCT', + ($selectedTabPosition === 'product_accessory') ? true : false, + 'product_accessory' + ); + + if ($this->CheckRedProductFinder > 0) + { + $tabMenu->addItem( + '#productfinder', + 'COM_REDSHOP_REDPRODUCTFINDER_ASSOCIATION', + $selectedTabPosition === 'productfinder', + 'productfinder' + ); + } + + $tabMenu->addItem( + '#product_meta_data', + 'COM_REDSHOP_META_DATA_TAB', + $selectedTabPosition === 'product_meta_data', + 'product_meta_data' + ); + + if (Redshop::getConfig()->getBool('USE_STOCKROOM')) + { + $tabMenu->addItem( + '#productstockroom', + 'COM_REDSHOP_STOCKROOM_TAB', + $selectedTabPosition === 'productstockroom', + 'productstockroom' + ); + } + + $tabMenu->addItem( + '#calculator', + 'COM_REDSHOP_DISCOUNT_CALCULATOR', + $selectedTabPosition === 'calculator', + 'calculator' + ); + + $tabMenu->addItem( + '#product_payment_method', + 'COM_REDSHOP_TEMPLATE_PAYMENT_METHOD', + $selectedTabPosition === 'product_payment_method', + 'product_payment_method' + ); + + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION')) + { + $tabMenu->addItem( + '#economic_settings', + 'COM_REDSHOP_ECONOMIC_SETTINGS', + $selectedTabPosition === 'economic_settings', + 'economic_settings' + ); + } + + return $tabMenu; + } +} diff --git a/component/admin/views/product_price/index.html b/component/admin/views/product_price/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product_price/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product_price/tmpl/default.php b/component/admin/views/product_price/tmpl/default.php new file mode 100644 index 00000000000..7483e459ea3 --- /dev/null +++ b/component/admin/views/product_price/tmpl/default.php @@ -0,0 +1,65 @@ + + +
    +
    + + + + + + + + + + prices as $row): ?> + + + + + + + +
    + + + +
    shopper_group_name ?> + + + + + + + +
    +
    + + + + + +
    diff --git a/component/admin/views/product_price/tmpl/index.html b/component/admin/views/product_price/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/product_price/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/product_price/view.html.php b/component/admin/views/product_price/view.html.php new file mode 100644 index 00000000000..32f75e1ac41 --- /dev/null +++ b/component/admin/views/product_price/view.html.php @@ -0,0 +1,45 @@ +input->get('pid'); + + $db = JFactory::getDbo(); + $uri = JFactory::getURI(); + $document = JFactory::getDocument(); + + $document->setTitle(JText::_('COM_REDSHOP_PRODUCT_PRICE')); + jimport('joomla.html.pagination'); + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_PRICE'), 'redshop_vatrates48'); + + $sql = "SELECT * FROM #__redshop_product WHERE product_id = '$product_id'"; + $db->setQuery($sql); + $product = $db->loadObject(); + + $sql = "SELECT g.*,p.product_price,p.price_id,p.price_quantity_end,p.price_quantity_start FROM #__redshop_shopper_group g LEFT JOIN #__redshop_product_price p ON g.shopper_group_id = p.shopper_group_id AND product_id = '$product_id'"; + $db->setQuery($sql); + $prices = $db->loadObjectList(); + + $this->product = $product; + + $this->prices = $prices; + + $this->pid = $product_id; + + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/producttags/index.html b/component/admin/views/producttags/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/producttags/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/producttags/tmpl/default.php b/component/admin/views/producttags/tmpl/default.php new file mode 100644 index 00000000000..f7a1fb83a86 --- /dev/null +++ b/component/admin/views/producttags/tmpl/default.php @@ -0,0 +1,130 @@ + + +
    +
    + + + + + + + + + + + + + + + + tags); $i < $n; $i++) + { + $row = $this->tags[$i]; + $row->id = $row->tags_id; + $link = JRoute::_('index.php?option=com_redshop&view=producttags_detail&task=edit&cid[]=' . $row->tags_id); + + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); + ?> + "> + + + + + + + + + + + + + + + +
    + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($i); ?> + + id); ?> + + tags_name; ?> + + usag; ?> + + products; ?> + + users; ?> + + tags_counter; ?> + tags_id; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + + +
    diff --git a/component/admin/views/producttags/tmpl/index.html b/component/admin/views/producttags/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/producttags/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/producttags/view.html.php b/component/admin/views/producttags/view.html.php new file mode 100644 index 00000000000..fef7a8513fe --- /dev/null +++ b/component/admin/views/producttags/view.html.php @@ -0,0 +1,48 @@ +setTitle(JText::_('COM_REDSHOP_TAGS')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_TAGS_MANAGEMENT'), 'redshop_textlibrary48'); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'tags_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + + $tags = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->tags = $tags; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/producttags_detail/index.html b/component/admin/views/producttags_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/producttags_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/producttags_detail/tmpl/default.php b/component/admin/views/producttags_detail/tmpl/default.php new file mode 100644 index 00000000000..ab818460e84 --- /dev/null +++ b/component/admin/views/producttags_detail/tmpl/default.php @@ -0,0 +1,63 @@ + + + +
    +
    +
    + + + + + + + + + + +
    + + + + +
    + : + + lists['published']; ?> +
    +
    +
    +
    + + + + +
    diff --git a/component/admin/views/producttags_detail/tmpl/index.html b/component/admin/views/producttags_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/producttags_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/producttags_detail/view.html.php b/component/admin/views/producttags_detail/view.html.php new file mode 100644 index 00000000000..3bc58ec1622 --- /dev/null +++ b/component/admin/views/producttags_detail/view.html.php @@ -0,0 +1,59 @@ +setLayout('default'); + + $lists = array(); + + $detail = $this->get('data'); + + $isNew = ($detail->tags_id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_TAGS') . ': [ ' . $text . ' ]', 'redshop_textlibrary48'); + + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + + $this->lists = $lists; + $this->detail = $detail; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/question/index.html b/component/admin/views/question/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/question/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/question/tmpl/edit.php b/component/admin/views/question/tmpl/edit.php new file mode 100644 index 00000000000..6927283a7db --- /dev/null +++ b/component/admin/views/question/tmpl/edit.php @@ -0,0 +1,133 @@ + + +
    +
    +
    +
    +
    +

    +
    +
    + form->renderField('product_id') ?> +
    + +
    +

    detail->user_name ?>

    + form->getInput('user_name') ?> +
    +
    +
    + +
    detail->user_email ?>
    + form->getInput('user_email') ?> +
    + form->renderField('telephone') ?> + form->renderField('address') ?> + form->renderField('published') ?> + form->renderField('question') ?> +
    +
    +
    +
    +
    +
    +

    +
    +
    + answers)): ?> +
    + +
    + + +
    + + + + + + + + + + + + + answers as $answer) : ?> + + + + + + + + + + + + + + +
    #
    id, false, 'aid'); ?>question ?>user_name ?>user_email ?>question_date); ?>
    + +
    +
    + +
    +
    +
    +
    +

    +
    +
    + form->renderField('answer') ?> +
    +
    +
    +
    + + + form->getInput('id') ?> + +
    diff --git a/component/admin/views/question/tmpl/index.html b/component/admin/views/question/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/question/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/question/view.html.php b/component/admin/views/question/view.html.php new file mode 100644 index 00000000000..c031743e297 --- /dev/null +++ b/component/admin/views/question/view.html.php @@ -0,0 +1,84 @@ +form = $this->get('Form'); + $this->detail = $this->get('Item'); + $this->item = $this->detail; + $this->state = $this->get('State'); + + $model = $this->getModel('Question'); + $this->answers = $model->getAnswers($this->item->id); + $this->requestUrl = JUri::getInstance()->toString(); + + if (!$this->item->id) + { + $user = JFactory::getUser(); + $this->item->user_email = $user->email; + $this->item->user_name = $user->username; + } + + $this->addToolBar(); + + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + + $isNew = ($this->item->id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_QUESTION_MANAGEMENT') . ': [ ' . $text . ' ]', 'redshop_question_48'); + JToolBarHelper::apply('question.apply'); + JToolBarHelper::save('question.save'); + + if ($isNew) + { + JToolBarHelper::cancel('question.cancel'); + } + else + { + JToolBarHelper::cancel('question.cancel', JText::_('JTOOLBAR_CLOSE')); + } + } +} diff --git a/component/admin/views/questions/index.html b/component/admin/views/questions/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/questions/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/questions/tmpl/default.php b/component/admin/views/questions/tmpl/default.php new file mode 100644 index 00000000000..4241b8ed981 --- /dev/null +++ b/component/admin/views/questions/tmpl/default.php @@ -0,0 +1,146 @@ +escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$filterSearch = $this->state->get('filter.search', ''); +$ordering = ($this->ordering == 'q.ordering'); + +// Allow ordering on specific case. +$allowOrder = ($listOrder == 'q.ordering' && strtolower($listDirn) == 'asc'); + +if ($allowOrder) +{ + $saveOrderingUrl = 'index.php?option=com_redshop&task=questions.saveOrderAjax'; + JHtml::_('redshopsortable.sortable', 'adminForm', 'adminForm', 'asc', $saveOrderingUrl); +} +?> + +
    +
    + $this, + 'options' => array( + 'searchField' => 'search', + 'searchFieldSelector' => '#filter_search', + 'limitFieldSelector' => '#list_users_limit', + 'activeOrder' => $listOrder, + 'activeDirection' => $listDirn, + ) + ) + ) ?> +
    + + items)) : ?> +
    + +
    + + + + + + + + + + + + + + + + + + + + items as $row): ?> + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + id); ?> + + + + + + + published, $i, '', 1) ?> + + + question) > 50): ?> + question, 0, 50) . "..." ?> + + question ?> + + + + product_name ?> + + getQuestionAnswer($row->id, 0, 1); + $answer = count($answer); + ?> + + + + user_name ?>user_email ?>id ?>
    + pagination->getListFooter(); ?>
    + + + + + + + +
    diff --git a/component/admin/views/questions/tmpl/index.html b/component/admin/views/questions/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/questions/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/questions/view.html.php b/component/admin/views/questions/view.html.php new file mode 100644 index 00000000000..063497e125c --- /dev/null +++ b/component/admin/views/questions/view.html.php @@ -0,0 +1,134 @@ +getModel(); + + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->ordering = $this->state->get('list.ordering', 'q.ordering'); + $this->activeFilters = $model->getActiveFilters(); + $this->filterForm = $model->getForm(); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode('
    ', $errors)); + + return false; + } + + // Set the tool-bar and number of found items + $this->addToolBar(); + + // Display the template + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 2.0.0.4 + */ + protected function addToolBar() + { + $title = JText::_('COM_REDSHOP_QUESTION_MANAGEMENT'); + + if ($this->pagination->total) + { + $title .= "(" . $this->pagination->total . ")"; + } + + JToolBarHelper::title($title, 'redshop_question_48'); + JToolBarHelper::addNew('question.add'); + JToolBarHelper::editList('question.edit'); + JToolBarHelper::deleteList('', 'questions.delete'); + JToolbarHelper::publish('questions.publish', 'JTOOLBAR_PUBLISH', true); + JToolbarHelper::unpublish('questions.unpublish', 'JTOOLBAR_UNPUBLISH', true); + } +} diff --git a/component/admin/views/quotation/index.html b/component/admin/views/quotation/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/quotation/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/quotation/tmpl/default.php b/component/admin/views/quotation/tmpl/default.php new file mode 100644 index 00000000000..17ddb5b2807 --- /dev/null +++ b/component/admin/views/quotation/tmpl/default.php @@ -0,0 +1,133 @@ +lists; +$model = $this->getModel('quotation'); +?> + + +
    +
    +
    +
    +
    + + "> + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + quotation); $i < $n; $i++) + { + $row = $this->quotation[$i]; + $row->id = $row->quotation_id; + $display = $row->user_email; + if ($row->user_id) + { + $userarr = $producthelper->getUserInformation($row->user_id); + if (count($userarr) > 0) + { + $display = $userarr->firstname . ' ' . $userarr->lastname; + $display .= ($userarr->is_company && $userarr->company_name != "") ? "
    " . $userarr->company_name : ""; + } + } + $link = JRoute::_('index.php?option=com_redshop&view=quotation_detail&task=edit&cid[]=' . $row->quotation_id); + $status = RedshopHelperQuotation::getQuotationStatusName($row->quotation_status); + if ($row->quotation_status == 5) + { + $status .= " (" . JText::_('COM_REDSHOP_ORDER_ID') . "-" . $row->order_id . " )"; + } ?> + "> + + + + + + + + + + + + +
    + + + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?>
    pagination->getRowOffset($i); ?>id); ?>quotation_id; ?> + quotation_number; ?> + getProductFormattedPrice($row->quotation_total); ?>convertDateFormat($row->quotation_cdate); ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + + + + +
    diff --git a/component/admin/views/quotation/tmpl/index.html b/component/admin/views/quotation/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/quotation/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/quotation/view.csv.php b/component/admin/views/quotation/view.csv.php new file mode 100644 index 00000000000..686f1b1891d --- /dev/null +++ b/component/admin/views/quotation/view.csv.php @@ -0,0 +1,39 @@ +getModel(); + + return $model->getCsvColumns(); + } +} diff --git a/component/admin/views/quotation/view.html.php b/component/admin/views/quotation/view.html.php new file mode 100644 index 00000000000..7b1e9a38458 --- /dev/null +++ b/component/admin/views/quotation/view.html.php @@ -0,0 +1,70 @@ +setTitle(JText::_('COM_REDSHOP_quotation')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_QUOTATION_MANAGEMENT'), 'redshop_quotation48'); + JToolBarHelper::addNew(); + RedshopToolbarHelper::link('index.php?option=com_redshop&view=quotation&format=csv', 'save', JText::_('COM_REDSHOP_EXPORT_DATA_LBL')); + JToolBarHelper::editList(); + JToolBarHelper::deleteList(); + + $this->state = $this->get('State'); + $filterStatus = $this->state->get('filter_status', 0); + + $lists['order'] = $this->state->get('list.ordering', 'q.quotation_cdate'); + $lists['order_Dir'] = $this->state->get('list.direction', 'desc'); + + $quotation = $this->get('Items'); + $pagination = $this->get('Pagination'); + + $optionsection = RedshopHelperQuotation::getQuotationStatusList(); + $lists['filter_status'] = JHTML::_('select.genericlist', $optionsection, 'filter_status', + 'class="inputbox" size="1" onchange="document.adminForm.submit();"', 'value', 'text', $filterStatus + ); + + $this->lists = $lists; + $this->quotation = $quotation; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/quotation_detail/index.html b/component/admin/views/quotation_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/quotation_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/quotation_detail/tmpl/default.php b/component/admin/views/quotation_detail/tmpl/default.php new file mode 100644 index 00000000000..05055ddcb13 --- /dev/null +++ b/component/admin/views/quotation_detail/tmpl/default.php @@ -0,0 +1,614 @@ +getModel('quotation_detail'); + +$extra_field = extra_field::getInstance(); +$quotation = $this->quotation; + +$uri = JURI::getInstance(); +$url = $uri->root(); + +$quotation_item = RedshopHelperQuotation::getQuotationProduct($quotation->quotation_id); ?> + +
    + +quotation_id) +{ + $edit_addlink = JRoute::_('index.php?tmpl=component&option=com_redshop&view=quotation_detail&layout=account'); + ?> + + + + + +
    +
    +
    +
    +

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    convertDateFormat($quotation->quotation_cdate);?>
    quotation_number;?> +
    quotation_ipaddress;?> +
    + quotation_customer_note;?> +
    lists['quotation_status'];?>
    +
    +
    +
    + +
    +
    +
    +

    +
    + +
    + + + + + + + user_id != 0) + { + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + quotationuser->is_company) + { + ?> + + + + + + + + + user_info_id); + } + else + { + $fields = RedshopHelperExtrafields::listAllFieldDisplay(7, $quotation->user_info_id); + } + + echo $fields; + } + else + { + if (!isset($quotation->user_info_id)) + { + $quotation->user_info_id = 0; + }?> + + + + + user_info_id, 0, $quotation->user_email); ?> + + +
    :quotationuser->firstname; ?>
    :quotationuser->lastname; ?>
    :quotationuser->address; ?>
    :quotationuser->zipcode; ?>
    :quotationuser->city; ?>
    :quotationuser->country_code)); ?>
    :quotationuser->state_code, $this->quotationuser->country_code); ?>
    :quotationuser->phone; ?>
    :quotationuser->user_email; ?>
    :quotationuser->vat_number; ?>
    :quotationuser->tax_exempt; ?>
    :user_email; ?>
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    +
    + +
    + + + + + + + id, 16, $quotation->quotation_id); ?> + + + + + + + + +
    title; ?>:data_txt; ?>
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    +
    +
    + + + + + + + + + + + is_giftcard == 1) + { + $giftcardData = RedshopEntityGiftcard::getInstance($quo->product_id)->getItem(); + + $actual_price = $giftcardData->giftcard_price; + $product_number = ""; + $section = 13; + } + else + { + $product = Redshop::product((int) $quo->product_id); + $actual_price = $product->product_price; + $product_number = "
    " . JText::_('COM_REDSHOP_PRODUCT_NUMBER') . ": ( " . $product->product_number . " ) "; + $section = 12; + $vat = 0; + + if ($quo->product_excl_price > 0) + { + $vat = $producthelper->getProductTax($quo->product_id, $quo->product_excl_price, $quotation->user_id); + } + + $quo->product_price = $quo->product_excl_price + $vat; + } + + $product_userfield = RedshopHelperQuotation::displayQuotationUserField($quo->quotation_item_id, $section); + + $product_attribute = "
    " . $producthelper->makeAttributeQuotation($quo->quotation_item_id, 0, $quo->product_id); + $product_accessory = "
    " . $producthelper->makeAccessoryQuotation($quo->quotation_item_id); + + $wrapper_name = ""; + + if ($quo->product_wrapperid) + { + $wrapper = $producthelper->getWrapper($quo->product_id, $quo->product_wrapperid); + + if (count($wrapper) > 0) + { + $wrapper_name = $wrapper[0]->wrapper_name . " (" . $producthelper->getProductFormattedPrice($quo->wrapper_price) . ")"; + } + } + + $product_title = "
    " . $quo->product_name . $product_number . "
    " . $product_attribute . $product_accessory . $product_userfield; + + $product_total = $quo->product_price * $quo->product_quantity; + $product_tax = ($quo->product_price - $quo->product_excl_price) * $quo->product_quantity; + + $delete_itemlink = JRoute::_('index.php?option=com_redshop&view=quotation_detail&task=deleteitem&cid[]=' . $quotation->quotation_id . '&qitemid=' . $quo->quotation_item_id); + ?> + + + + + + + + + + + + + +
    + + <?php echo JText::_('COM_REDSHOP_DELETE'); ?> + + +
    getProductFormattedPrice($quo->product_price);?>
    +
    + +
    getProductFormattedPrice($product_total);?>
    + +
    + + + + + + + + + quotation_total) + { + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    getProductFormattedPrice($quotation->quotation_subtotal);?>
    + + +
    + + + quotation_tax; + $DiscountWithotVat = $quotation->quotation_discount; + $DiscountspWithotVat = ($quotation->quotation_special_discount * ($quotation->quotation_subtotal + $quotation->quotation_tax)) / 100; + $Discountvat = 0; + + if ((float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')) + { + $Discountvat = ((float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') * $quotation->quotation_discount) / (1 + (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')); + $DiscountWithotVat = $quotation->quotation_discount - $Discountvat; + $tax = $tax - $Discountvat; + } + + if ((float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')) + { + $sp_discount = ($quotation->quotation_special_discount * ($quotation->quotation_subtotal + $quotation->quotation_tax)) / 100; + $Discountspvat = ($sp_discount * (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')) / (1 + (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')); + $DiscountspWithotVat = $sp_discount - $Discountspvat; + $tax = $tax - $Discountspvat; + } + ?> + + getProductFormattedPrice($DiscountWithotVat);?> +
    + + + +
    + + + +
    + + %   
    +
    + +
    getProductFormattedPrice($quotation->quotation_subtotal - $DiscountWithotVat - $DiscountspWithotVat);?>
    + + +
    +
    getProductFormattedPrice($tax);?>
    +
    +
    +
    +
    getProductFormattedPrice($quotation->quotation_total);?>
    + + + + +
    +
    +
    +
    +
    + +
    +
    +

    +
    +
    + + + + + + + + + + + + + + +
    + + + + + +
    array('typeField' => ', isproduct:1'), + 'select2.options' => array( + 'events' => array('select2-selecting' => 'function(e) { + document.getElementById(\'product1\').value = e.object.id; + displayProductDetailInfo(\'product1\', 0); + addItembutton(\'product1\');}') + ) + ) + ); + ?> +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + +
    + +
    diff --git a/component/admin/views/quotation_detail/tmpl/index.html b/component/admin/views/quotation_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/quotation_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/quotation_detail/view.html.php b/component/admin/views/quotation_detail/view.html.php new file mode 100644 index 00000000000..1cba848cae4 --- /dev/null +++ b/component/admin/views/quotation_detail/view.html.php @@ -0,0 +1,75 @@ +input->getCmd('layout', 'default'); + + $document = JFactory::getDocument(); + $document->setTitle(JText::_('COM_REDSHOP_QUOTATION')); + + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.order.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.admin.common.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/json.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/ajaxupload.min.js', false, true); + + $uri = JUri::getInstance(); + $lists = array(); + + if ($layout != 'default') + { + $this->setLayout($layout); + } + + $detail = $this->get('data'); + $isNew = ($detail->quotation_id < 1); + $userarr = $this->get('userdata'); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_QUOTATION_DETAIL') . ': [ ' . $text . ' ]', 'redshop_quotation48'); + JToolBarHelper::apply(); + JToolBarHelper::save(); + JToolBarHelper::custom('send', 'send.png', 'send.png', JText::_('COM_REDSHOP_SEND'), false); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $status = RedshopHelperQuotation::getQuotationStatusList(); + $lists['quotation_status'] = JHTML::_('select.genericlist', $status, 'quotation_status', + 'class="inputbox" size="1" ', 'value', 'text', $detail->quotation_status + ); + + $this->lists = $lists; + $this->quotation = $detail; + $this->quotationuser = $userarr; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/rating/index.html b/component/admin/views/rating/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/rating/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/rating/tmpl/default.php b/component/admin/views/rating/tmpl/default.php new file mode 100644 index 00000000000..86e0359a3d9 --- /dev/null +++ b/component/admin/views/rating/tmpl/default.php @@ -0,0 +1,169 @@ +getModel('rating'); +$config = Redconfiguration::getInstance(); +$url = JURI::base(); +$order_functions = order_functions::getInstance(); +?> + +
    +
    +
    +
    +
    + + "> + +
    +
    +
    + + + + + + + + + + + + + + + + ratings); $i < $n; $i++) + { + $row = $this->ratings[$i]; + $row->id = $row->rating_id; + $link = JRoute::_('index.php?option=com_redshop&view=rating_detail&task=edit&cid[]=' . $row->rating_id); + $prodlink = JRoute::_('index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $row->product_id); + + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); + + $row->published = $row->favoured; + $favoured = JHTML::_('grid.published', $row, $i, 'tick.png', 'publish_x.png', 'fv_'); + + if ($row->userid) + $username = RedshopHelperOrder::getUserFullName($row->userid); + else + $username = $row->username; + + ?> + "> + + + + + + + + + + + + + + + + +
    + + + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($i); ?> + + id); ?> + + title, 0, 50); ?> + + product_name; ?> + + + + convertDateFormat($row->time); ?> + + + + + + + + rating_id; ?> +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + + +
    diff --git a/component/admin/views/rating/tmpl/index.html b/component/admin/views/rating/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/rating/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/rating/view.html.php b/component/admin/views/rating/view.html.php new file mode 100644 index 00000000000..0103f495981 --- /dev/null +++ b/component/admin/views/rating/view.html.php @@ -0,0 +1,48 @@ +setTitle(JText::_('COM_REDSHOP_RATING')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_RATING_MANAGEMENT'), 'redshop_rating48'); + + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $this->state = $this->get('State'); + $lists['order'] = $this->state->get('list.ordering', 'rating_id'); + $lists['order_Dir'] = $this->state->get('list.direction', 'desc'); + + $ratings = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->user = $user; + $this->lists = $lists; + $this->ratings = $ratings; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/rating_detail/index.html b/component/admin/views/rating_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/rating_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/rating_detail/tmpl/default.php b/component/admin/views/rating_detail/tmpl/default.php new file mode 100644 index 00000000000..5f1a04afbcc --- /dev/null +++ b/component/admin/views/rating_detail/tmpl/default.php @@ -0,0 +1,214 @@ +input; + +$product_data = $jinput->get('product'); +$model = $this->getModel('rating_detail'); +$productHelper = productHelper::getInstance(); +?> + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + + + + + + +
    +
    + detail->user_rating == 5) echo "checked='checked'"; ?>> +
    +
    + detail->user_rating == 4) echo "checked='checked'"; ?>> +
    +
    + detail->user_rating == 3) echo "checked='checked'"; ?>> +
    +
    + detail->user_rating == 2) echo "checked='checked'"; ?>> +
    +
    + detail->user_rating == 1) echo "checked='checked'"; ?>> +
    +
    + detail->user_rating == 0) echo "checked='checked'"; ?>> +
    +
    + + + +
    + : + + detail->username)) + { + if ($this->detail->userid == 0) + { + $uname->text = $this->detail->username; + } + else + { + $uname->text = $model->getuserfullname2($this->detail->userid); + } + + $uname->value = $this->detail->userid; + } + + echo JHTML::_('redshopselect.search', $uname, 'userid', + array( + 'select2.ajaxOptions' => array('typeField' => ', user:1'), + ) + ); + ?> + +
    + : + text = $product_data->product_name; + $productObject->value = $product_data->product_id; + $listAttributes = array('disabled' => 'disabled'); + } + elseif (isset($this->detail->product_id) && ($productInfo = $productHelper->getProductById($this->detail->product_id))) + { + $productObject->text = $productInfo->product_name; + $productObject->value = $this->detail->product_id; + } + + echo JHTML::_('redshopselect.search', $productObject, 'product_id', + array( + 'select2.ajaxOptions' => array('typeField' => ', isproduct:1'), + 'list.attr' => $listAttributes + ) + ); + ?> + +
    + : + + lists['favoured']; ?> +
    + : + + lists['published']; ?> +
    +
    +
    + +
    + get('pid')) + $pid = $jinput->get('pid'); + else + $pid = $this->detail->product_id; + ?> + + + + +
    diff --git a/component/admin/views/rating_detail/tmpl/index.html b/component/admin/views/rating_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/rating_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/rating_detail/view.html.php b/component/admin/views/rating_detail/view.html.php new file mode 100644 index 00000000000..a722acf6328 --- /dev/null +++ b/component/admin/views/rating_detail/view.html.php @@ -0,0 +1,64 @@ +input->get('userslist', array(), 'ARRAY'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_RATING_MANAGEMENT_DETAIL'), 'redshop_rating48'); + + $uri = JFactory::getURI(); + + $this->setLayout('default'); + + $lists = array(); + + $detail = $this->get('data'); + + $isNew = ($detail->rating_id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_RATING') . ': [ ' . $text . ' ]', 'redshop_rating48'); + + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + $lists['favoured'] = JHTML::_('select.booleanlist', 'favoured', 'class="inputbox"', $detail->favoured); + + $lists['userslist'] = JHTML::_('select.genericlist', $userslist, 'userid', 'class="inputbox" size="1" ', 'value', 'text', $detail->userid); + + $this->lists = $lists; + $this->detail = $detail; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/redshop/index.html b/component/admin/views/redshop/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/redshop/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/redshop/tmpl/default.php b/component/admin/views/redshop/tmpl/default.php new file mode 100644 index 00000000000..fee37725137 --- /dev/null +++ b/component/admin/views/redshop/tmpl/default.php @@ -0,0 +1,140 @@ +model->getStatisticDashboard(); +?> + + +groups); +$user->usertype = $userType[0]; +$user->gid = $user->groups[$user->usertype]; +?> + +
    +
    +
    + + + + +
    + + getProductFormattedPrice($statistic[0]); ?> +
    +
    +
    +
    +
    + + + + +
    + + +
    +
    +
    + +
    +
    + + + + +
    + + +
    +
    +
    + +
    +
    + + + + +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    +

    + +

    +
    + +
    + loadTemplate('sales_piechart'); ?> +
    +
    +
    +
    + +
    +
    +
    +
    +

    + +

    +
    + +
    + loadTemplate('newest_orders'); ?> +
    +
    +
    + +
    +
    +
    +

    + +

    +
    + +
    + loadTemplate('newest_customers'); ?> +
    +
    +
    +
    diff --git a/component/admin/views/redshop/tmpl/default_newest_customers.php b/component/admin/views/redshop/tmpl/default_newest_customers.php new file mode 100644 index 00000000000..8520afbe0a9 --- /dev/null +++ b/component/admin/views/redshop/tmpl/default_newest_customers.php @@ -0,0 +1,55 @@ +getModel('redshop'); +?> +
    +
    + + + + + + + + + + newcustomers); $i < $n; $i++) + { + $row = $this->newcustomers[$i]; + $row->id = $row->users_info_id; + + $order = $model->gettotalOrder($row->id); + + $order->order_total = ($order->order_total) ? $order->order_total : 0; + $avg_amount = ($order->tot_order > 0) ? $order->order_total / $order->tot_order : 0; + + $link = "index.php?option=com_redshop&view=user_detail&task=edit&cid[]=" . $row->id; + ?> + " onclick="window.location.href=''"> + + + + + + +
    firstname . ' ' . $row->lastname; ?> + tot_order ?>getProductFormattedPrice($avg_amount); ?> + getProductFormattedPrice($order->order_total);?> +
    +
    +
    diff --git a/component/admin/views/redshop/tmpl/default_newest_orders.php b/component/admin/views/redshop/tmpl/default_newest_orders.php new file mode 100644 index 00000000000..44343c100c1 --- /dev/null +++ b/component/admin/views/redshop/tmpl/default_newest_orders.php @@ -0,0 +1,55 @@ + +
    +
    + + + + + + + + + + + + neworders); $i < $n; $i++) + { + $row = $this->neworders[$i]; + $row->id = $row->order_id; + $link = "index.php?option=com_redshop&view=order_detail&task=edit&cid[]=" . $row->id; ?> + " onclick="window.location.href=''"> + + + + + + + + + + + +
    + id; ?> + name; ?> + getProductFormattedPrice($row->order_total); ?> +
    order_status_name; ?>
    order_payment_status; ?>
    +
    + + + +
    diff --git a/component/admin/views/redshop/tmpl/default_sales_piechart.php b/component/admin/views/redshop/tmpl/default_sales_piechart.php new file mode 100644 index 00000000000..dd222c43e62 --- /dev/null +++ b/component/admin/views/redshop/tmpl/default_sales_piechart.php @@ -0,0 +1,161 @@ +addScript('//www.gstatic.com/charts/loader.js'); + +$producthelper = productHelper::getInstance(); + +$turnover = RedshopModel::getInstance('Statistic', 'RedshopModel')->getTotalTurnOverCpanel(); + +$sales = RedshopModel::getInstance('Statistic', 'RedshopModel')->getTotalSalesCpanel(); +?> + + + +
    +
    +
    +
    +
    +
    + input->getInt('filteroption', 1) + ); + + ?> +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + +
    getProductFormattedPrice($sale[0]); ?>
    +
    +
    diff --git a/component/admin/views/redshop/tmpl/index.html b/component/admin/views/redshop/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/redshop/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/redshop/tmpl/noconfig.php b/component/admin/views/redshop/tmpl/noconfig.php new file mode 100644 index 00000000000..2b431f82b7a --- /dev/null +++ b/component/admin/views/redshop/tmpl/noconfig.php @@ -0,0 +1,21 @@ + +isExists()) : ?> +
    +

    + + + + +

    +
    + diff --git a/component/admin/views/redshop/view.html.php b/component/admin/views/redshop/view.html.php new file mode 100644 index 00000000000..c57050aaa82 --- /dev/null +++ b/component/admin/views/redshop/view.html.php @@ -0,0 +1,94 @@ +layout = JFactory::getApplication()->input->getCmd('layout', 'default'); + + $menuHide = explode(",", Redshop::getConfig()->get('MENUHIDE')); + + JToolBarHelper::title(JText::sprintf('COM_REDSHOP_ADMIN_WELCOME', $user->name)); + + if ($this->layout != "noconfig") + { + if (!in_array('COM_REDSHOP_STATISTIC', $menuHide)) + { + JToolBarHelper::custom('statistic', 'redshop_statistic32', JText::_('COM_REDSHOP_STATISTIC'), + JText::_('COM_REDSHOP_STATISTIC'), false + ); + } + + if (!in_array('COM_REDSHOP_RESHOP_CONFIGURATION', $menuHide)) + { + JToolBarHelper::custom('configuration', 'redshop_icon-32-settings', JText::_('COM_REDSHOP_CONFIG'), + JText::_('COM_REDSHOP_CONFIG'), false + ); + } + } + + if (!$user->authorise('core.manage', 'com_redshop')) + { + throw new Exception('COM_REDSHOP_ACCESS_ERROR_NOT_HAVE_PERMISSION'); + } + + $this->model = $this->getModel(); + $this->newcustomers = $this->model->getNewcustomers(); + $this->neworders = $this->model->getNeworders(); + + // Check PDF plugin + if (!RedshopHelperPdf::isAvailablePdfPlugins()) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_WARNING_MISSING_PDF_PLUGIN'), 'warning'); + } + + parent::display($tpl); + } +} diff --git a/component/admin/views/sample/index.html b/component/admin/views/sample/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/sample/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/sample/tmpl/default.php b/component/admin/views/sample/tmpl/default.php new file mode 100644 index 00000000000..d4ae69ecf80 --- /dev/null +++ b/component/admin/views/sample/tmpl/default.php @@ -0,0 +1,82 @@ + + + +
    +
    + + + + + + + + + + + catalog); $i < $n; $i++) + { + $row = $this->catalog[$i]; + $row->id = $row->sample_id; + $link = JRoute::_('index.php?option=com_redshop&view=sample_detail&task=edit&cid[]=' . $row->sample_id); + + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1);?> + "> + + + + + + + + + + +
    lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    pagination->getRowOffset($i); ?>id); ?>sample_name; ?>sample_id; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + + + + +
    diff --git a/component/admin/views/sample/tmpl/index.html b/component/admin/views/sample/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/sample/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/sample/view.html.php b/component/admin/views/sample/view.html.php new file mode 100644 index 00000000000..83a33cfc999 --- /dev/null +++ b/component/admin/views/sample/view.html.php @@ -0,0 +1,49 @@ +setTitle(JText::_('COM_REDSHOP_CATALOG')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_SAMPLE'), 'redshop_catalogmanagement48'); + + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'sample_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + + $catalog = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->lists = $lists; + $this->catalog = $catalog; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/sample_catalog/index.html b/component/admin/views/sample_catalog/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/sample_catalog/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/sample_catalog/tmpl/default.php b/component/admin/views/sample_catalog/tmpl/default.php new file mode 100644 index 00000000000..17d92c4386e --- /dev/null +++ b/component/admin/views/sample_catalog/tmpl/default.php @@ -0,0 +1,48 @@ +root(); +$comment = JFactory::getApplication()->input->get('filter'); + +?> + + + + + + + + + + +
    + + sample); $i++) + { + + $sample_data = $this->sample[$i]; + echo''; + echo''; + if ($sample_data->is_image == 0) + echo ''; + else + echo ''; + + echo ''; + } + ?>
    ' . JText::_('COM_REDSHOP_SAMPLE_NAME'); + echo ''; + echo $sample_data->sample_name; + echo '
      


    +
    diff --git a/component/admin/views/sample_catalog/tmpl/index.html b/component/admin/views/sample_catalog/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/sample_catalog/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/sample_catalog/view.html.php b/component/admin/views/sample_catalog/view.html.php new file mode 100644 index 00000000000..2028764b756 --- /dev/null +++ b/component/admin/views/sample_catalog/view.html.php @@ -0,0 +1,28 @@ +setLayout('default'); + $detail = $this->get('data'); + $model = $this->getModel('sample_catalog'); + $sample = $model->getsample($detail->colour_id); + + $this->detail = $detail; + $this->sample = $sample; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/sample_detail/index.html b/component/admin/views/sample_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/sample_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/sample_detail/tmpl/default.php b/component/admin/views/sample_detail/tmpl/default.php new file mode 100644 index 00000000000..24516a6b326 --- /dev/null +++ b/component/admin/views/sample_detail/tmpl/default.php @@ -0,0 +1,152 @@ +root(); + +?> + + + +
    + +
    + +
    + + + + + + + + + + + +
    + + + +
    + : + lists['published']; ?> +
    + +
    + + +
    + + + + + + + + + + + + + + +
    : + +
    +
    +
    +
    : +
    + +
    +
    + + + +
    + +
    +
    + + + + + + lists['color_data']); $j++) + { + + echo''; + if ($this->lists['color_data'][$j]->is_image == 0) + echo ''; + else + echo ''; + + echo ''; + echo ''; + + } + ?> +
     
    +
    + +
    + + + + +
    +
    + diff --git a/component/admin/views/sample_detail/tmpl/index.html b/component/admin/views/sample_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/sample_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/sample_detail/view.html.php b/component/admin/views/sample_detail/view.html.php new file mode 100644 index 00000000000..2430f714201 --- /dev/null +++ b/component/admin/views/sample_detail/view.html.php @@ -0,0 +1,91 @@ +setLayout('default'); + + $lists = array(); + + $detail = $this->get('data'); + + $layout = JFactory::getApplication()->input->getCmd('layout', 'default'); + + $this->setLayout($layout); + + $model = $this->getModel('sample_detail'); + + if ($layout == 'default') + { + $isNew = ($detail->sample_id < 1); + $color_data = $model->color_Data($detail->sample_id); + + if (!is_array($color_data)) + { + $color_data = array(); + } + + $lists['color_data'] = $color_data; + } + else + { + $isNew = ($detail->catalog_id < 1); + } + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_SAMPLE') . ': [ ' . $text . ' ]', 'redshop_catalogmanagement48'); + + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + + $this->lists = $lists; + $this->detail = $detail; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/sample_request/index.html b/component/admin/views/sample_request/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/sample_request/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/sample_request/tmpl/default.php b/component/admin/views/sample_request/tmpl/default.php new file mode 100644 index 00000000000..63ee374ffe8 --- /dev/null +++ b/component/admin/views/sample_request/tmpl/default.php @@ -0,0 +1,124 @@ + + +
    +
    + + + + + + + + + + + + + + + + catalog); $i < $n; $i++) + { + $row = $this->catalog[$i]; + $row->id = $row->request_id; + $row->published = $row->block; + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); + + $reminder1 = JHtml::_('jgrid.published', $row->reminder_1, $i, '', 1); + $reminder2 = JHtml::_('jgrid.published', $row->reminder_2, $i, '', 1); + $reminder3 = JHtml::_('jgrid.published', $row->reminder_3, $i, '', 1); ?> + "> + + + + + + + + + + + + + + +
    + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    pagination->getRowOffset($i); ?>id); ?>name; ?>email; ?>convertDateFormat($row->registerdate); ?> + +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + +
    diff --git a/component/admin/views/sample_request/tmpl/index.html b/component/admin/views/sample_request/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/sample_request/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/sample_request/view.html.php b/component/admin/views/sample_request/view.html.php new file mode 100644 index 00000000000..aa3c56b784a --- /dev/null +++ b/component/admin/views/sample_request/view.html.php @@ -0,0 +1,47 @@ +setTitle(JText::_('COM_REDSHOP_CATALOG_SAMPLE')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_PRODUCT_SAMPLE'), 'redshop_colorsample48'); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'request_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + + $catalog = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->catalog = $catalog; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/search/index.html b/component/admin/views/search/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/search/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/search/tmpl/default.php b/component/admin/views/search/tmpl/default.php new file mode 100644 index 00000000000..93461ec450a --- /dev/null +++ b/component/admin/views/search/tmpl/default.php @@ -0,0 +1,17 @@ +detail; + +$encoded = json_encode($test); + +echo "{\"results\": " . $encoded . "}"; + +JFactory::getApplication()->close(); diff --git a/component/admin/views/search/tmpl/index.html b/component/admin/views/search/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/search/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/search/view.html.php b/component/admin/views/search/view.html.php new file mode 100644 index 00000000000..201b0466249 --- /dev/null +++ b/component/admin/views/search/view.html.php @@ -0,0 +1,28 @@ +detail = $this->get('data'); + + parent::display($tpl); + } +} diff --git a/component/admin/views/shipping/index.html b/component/admin/views/shipping/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping/tmpl/default.php b/component/admin/views/shipping/tmpl/default.php new file mode 100644 index 00000000000..86a7699ebec --- /dev/null +++ b/component/admin/views/shipping/tmpl/default.php @@ -0,0 +1,116 @@ +lists['order'] == 'ordering'); +?> +
    + + + + + + + + + + + + + + + shippings); $i < $n; $i++) + { + $row = $this->shippings[$i]; + $link = JRoute::_('index.php?option=com_redshop&view=shipping_detail&task=edit&cid[]=' . $row->extension_id); + + $published = JHtml::_('jgrid.published', $row->enabled, $i, '', 1); + $cache = new Registry($row->manifest_cache); + $params = new Registry($row->params); + ?> + "> + + + + + + + + + + + + + + + + +
    # + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + + + + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($i); ?> + + extension_id); ?> + + + name); ?> + + + element; ?> + + get('version'); ?> + + get('is_shipper', 0) == 1): ?> + + + + get('shipper_location', 0) == 1): ?> + + + + + + extension_id; ?> +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    + + + + +
    diff --git a/component/admin/views/shipping/tmpl/index.html b/component/admin/views/shipping/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping/view.html.php b/component/admin/views/shipping/view.html.php new file mode 100644 index 00000000000..566ad4ccafa --- /dev/null +++ b/component/admin/views/shipping/view.html.php @@ -0,0 +1,88 @@ +shippings = $this->get('Data'); + + foreach ($this->shippings as $shippingMethod) + { + $extension = 'plg_redshop_shipping_' . strtolower($shippingMethod->element); + $language->load($extension, JPATH_ADMINISTRATOR); + } + + $document->setTitle(JText::_('COM_REDSHOP_SHIPPING')); + + JToolbarHelper::title(JText::_('COM_REDSHOP_SHIPPING_MANAGEMENT'), 'redshop_shipping48'); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'ordering'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + + $pagination = $this->get('Pagination'); + + $this->lists = $lists; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/shipping_box/index.html b/component/admin/views/shipping_box/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping_box/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_box/tmpl/edit.php b/component/admin/views/shipping_box/tmpl/edit.php new file mode 100644 index 00000000000..4c5b3166d2a --- /dev/null +++ b/component/admin/views/shipping_box/tmpl/edit.php @@ -0,0 +1,11 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/shipping_box/tmpl/index.html b/component/admin/views/shipping_box/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping_box/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_box/view.html.php b/component/admin/views/shipping_box/view.html.php new file mode 100644 index 00000000000..fdcd7a33ab3 --- /dev/null +++ b/component/admin/views/shipping_box/view.html.php @@ -0,0 +1,32 @@ +[ ' . JText::_('COM_REDSHOP_EDIT') . ' ]'; + } +} diff --git a/component/admin/views/shipping_boxes/index.html b/component/admin/views/shipping_boxes/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping_boxes/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_boxes/tmpl/default.php b/component/admin/views/shipping_boxes/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/shipping_boxes/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/shipping_boxes/tmpl/index.html b/component/admin/views/shipping_boxes/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping_boxes/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_boxes/view.html.php b/component/admin/views/shipping_boxes/view.html.php new file mode 100644 index 00000000000..85a6db7bab9 --- /dev/null +++ b/component/admin/views/shipping_boxes/view.html.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_detail/tmpl/default.php b/component/admin/views/shipping_detail/tmpl/default.php new file mode 100644 index 00000000000..3e0a90794d6 --- /dev/null +++ b/component/admin/views/shipping_detail/tmpl/default.php @@ -0,0 +1,93 @@ + + +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    + +
    + detail->name) ?> +
    +
    +
    +
    +
    + +
    + detail->element) ?> +
    +
    +
    +
    +
    + +
    + lists['published'] ?> +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    +
    +
    + trigger('onShowConfig', array($this->detail)); + ?> +
    +
    +
    +
    + + + + + +
    diff --git a/component/admin/views/shipping_detail/tmpl/default_install.php b/component/admin/views/shipping_detail/tmpl/default_install.php new file mode 100644 index 00000000000..565fe2d121e --- /dev/null +++ b/component/admin/views/shipping_detail/tmpl/default_install.php @@ -0,0 +1,30 @@ + + +
    +
    +
    + + + + + + + +
    +
    +
    +
    + + +
    diff --git a/component/admin/views/shipping_detail/tmpl/index.html b/component/admin/views/shipping_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_detail/view.html.php b/component/admin/views/shipping_detail/view.html.php new file mode 100644 index 00000000000..fa827fc2371 --- /dev/null +++ b/component/admin/views/shipping_detail/view.html.php @@ -0,0 +1,96 @@ +setLayout('default'); + $lists = array(); + $detail = $this->get('data'); + + // Load language file of the shipping plugin + JFactory::getLanguage()->load('plg_redshop_shipping_' . strtolower($detail->element), JPATH_ADMINISTRATOR); + + // Load language file from plugin folder. + JFactory::getLanguage()->load( + 'plg_redshop_shipping_' . strtolower($detail->element), + JPATH_ROOT . '/plugins/redshop_shipping/' . $detail->element + ); + + $isNew = ($detail->extension_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_SHIPPING') . ': [ ' . $text . ' ]', 'redshop_shipping48'); + + $path = JPATH_ROOT . '/plugins'; + $configPath = $path . '/' . $detail->folder . '/' . $detail->element . '/' . $detail->element . '.xml'; + $shippingConfigPath = $path . '/' . $detail->folder . '/' . $detail->element . '/' . $detail->element . '.cfg.php'; + + if (JFile::exists($shippingConfigPath)) + { + include_once $shippingConfigPath; + } + + $params = new Registry($detail->params, $configPath); + $hasRate = $params->get('is_shipper'); + $hasLocation = $params->get('shipper_location'); + + if ($hasRate) + { + JToolbarHelper::custom('shipping_rate', 'redshop_shipping_rates32', + JText::_('COM_REDSHOP_SHIPPING_RATE_LBL'), JText::_('COM_REDSHOP_SHIPPING_RATE_LBL'), false, false + ); + } + elseif ($hasLocation) + { + JToolbarHelper::custom('shipping_rate', 'redshop_shipping_rates32', + JText::_('COM_REDSHOP_SHIPPING_LOCATION'), JText::_('COM_REDSHOP_SHIPPING_LOCATION'), false, false + ); + } + + JToolbarHelper::apply(); + JToolbarHelper::save(); + JToolbarHelper::cancel(); + + $lists['published'] = JHtml::_('redshopselect.booleanlist', 'published', 'class="inputbox"', $detail->enabled); + + $this->lists = $lists; + $this->detail = $detail; + + parent::display($tpl); + } +} diff --git a/component/admin/views/shipping_rate/index.html b/component/admin/views/shipping_rate/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping_rate/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_rate/tmpl/default.php b/component/admin/views/shipping_rate/tmpl/default.php new file mode 100644 index 00000000000..17c483fefe0 --- /dev/null +++ b/component/admin/views/shipping_rate/tmpl/default.php @@ -0,0 +1,111 @@ +shipper_location) +{ + // FOR SELF PICKUP + $bool = false; + $shippname = JText::_('COM_REDSHOP_SHIPPING_LOCATION'); +} +?> + +
    +
    + + + + + + + + + + + + + + shipping_rates); $i < $n; $i++) + { + $row = $this->shipping_rates[$i]; +// $row->id = $row->shipping_rate_id; + $link = JRoute::_('index.php?option=com_redshop&view=shipping_rate_detail&task=edit&cid[]=' . $row->shipping_rate_id . '&id=' . $this->shipping->id); ?> + "> + + + + + + + + + + + + + +
    + + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    pagination->getRowOffset($i); ?>shipping_rate_id); ?>shipping_rate_name; ?> + getProductFormattedPrice($row->shipping_rate_value); ?>shipping_rate_priority; ?>shipping_rate_id; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + + + + + +
    diff --git a/component/admin/views/shipping_rate/tmpl/index.html b/component/admin/views/shipping_rate/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping_rate/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_rate/view.html.php b/component/admin/views/shipping_rate/view.html.php new file mode 100644 index 00000000000..af4a821f45a --- /dev/null +++ b/component/admin/views/shipping_rate/view.html.php @@ -0,0 +1,73 @@ +getUserStateFromRequest($context . 'filter_order', 'filter_order', 'shipping_rate_id'); + $lists['order_Dir'] = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + $id = $app->getUserStateFromRequest($context . 'extension_id', 'extension_id', '0'); + + if ((int) $id == 0) + { + throw new Exception("Direct Access not allowed, go to " . JText::_('COM_REDSHOP_SHIPPING') . ""); + + return false; + } + + $shipping = RedshopHelperShipping::getShippingMethodById($id); + + $shipping_rates = $this->get('Data'); + $pagination = $this->get('Pagination'); + + // Load language file of the shipping plugin + JFactory::getLanguage()->load( + 'plg_redshop_shipping_' . strtolower($shipping->element), + JPATH_ADMINISTRATOR + ); + + $plugin = JPluginHelper::getPlugin($shipping->folder, $shipping->element); + $pluginParams = new JRegistry($plugin->params); + + $is_shipper = $pluginParams->get('is_shipper'); + $shipper_location = $pluginParams->get('shipper_location'); + + $jtitle = ($shipper_location) ? JText::_('COM_REDSHOP_SHIPPING_LOCATION') : JText::_('COM_REDSHOP_SHIPPING_RATE'); + JToolBarHelper::title($jtitle . ' [ ' . JText::_($shipping->name) . ' ]', 'redshop_shipping_rates48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + + if ($is_shipper) + { + JToolBarHelper::custom('copy', 'copy.png', 'copy_f2.png', JText::_('COM_REDSHOP_TOOLBAR_COPY'), true); + } + + JToolBarHelper::deleteList(); + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + + $this->lists = $lists; + $this->shipping_rates = $shipping_rates; + $this->shipping = $shipping; + $this->pagination = $pagination; + $this->is_shipper = $is_shipper; + $this->shipper_location = $shipper_location; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/shipping_rate_detail/index.html b/component/admin/views/shipping_rate_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping_rate_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_rate_detail/tmpl/default.php b/component/admin/views/shipping_rate_detail/tmpl/default.php new file mode 100644 index 00000000000..3d76fd16251 --- /dev/null +++ b/component/admin/views/shipping_rate_detail/tmpl/default.php @@ -0,0 +1,450 @@ + + + +
    + + + + + +shipper_location) +{ + ?> +
    +
    + + + + + + + + + +
    + : + + +
    + : + + display("shipping_location_info", $this->detail->shipping_location_info, '$widthPx', '$heightPx', '100', '20', '1'); ?> +
    +
    +
    + 0)); + echo JHtml::_('tabs.panel', JText::_('COM_REDSHOP_DETAILS'), 'tab1'); ?> +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + detail->shipping_class === 'default_shipping') + { + ?> + + + + + + + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + +
    + + + lists['shipping_rate_country']; ?> +
    + + + lists['shipping_rate_state']; ?> +
    + + + lists['shipping_product'];?> +
    + + + lists['shipping_rate_on_category']; ?> +
    + + + lists['shipping_rate_on_shopper_group']; ?> +
    + + + +
    + + + +
    + + + lists['company_only']; ?> +
    + + + lists['shipping_tax_group_id']; ?> +
    + + + detail->apply_vat) + { + $checked = "checked='checked'"; + } + + echo ""; + ?> +
    + + + +
    + + +
    + lists['deliver_type'];?> +
    +
    + + + +
    + +
    +
    + lists['extra_field'] != "") + { + echo JHtml::_('tabs.panel', JText::_('COM_REDSHOP_EXTRA_FIELD'), 'tab2'); + ?> +
    + lists['extra_field']; + ?> +
    '; + } + + echo JHtml::_('tabs.end'); +} ?> +
    +
    diff --git a/component/admin/views/shipping_rate_detail/tmpl/index.html b/component/admin/views/shipping_rate_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shipping_rate_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shipping_rate_detail/view.html.php b/component/admin/views/shipping_rate_detail/view.html.php new file mode 100644 index 00000000000..b75d6e2a41c --- /dev/null +++ b/component/admin/views/shipping_rate_detail/view.html.php @@ -0,0 +1,170 @@ +getModel(); + $db = JFactory::getDbo(); + + $id = (int) $app->getUserStateFromRequest($context . 'extension_id', 'extension_id', '0'); + $shipping = RedshopHelperShipping::getShippingMethodById($id); + + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.admin.common.min.js', false, true); + + // Load language file of the shipping plugin + JFactory::getLanguage()->load( + 'plg_redshop_shipping_' . strtolower($shipping->element), + JPATH_ADMINISTRATOR + ); + + $plugin = JPluginHelper::getPlugin($shipping->folder, $shipping->element); + $pluginParams = new JRegistry($plugin->params); + + $is_shipper = $pluginParams->get('is_shipper'); + $shipper_location = $pluginParams->get('shipper_location'); + + $jtitle = ($shipper_location) ? JText::_('COM_REDSHOP_SHIPPING_LOCATION') : JText::_('COM_REDSHOP_SHIPPING_RATE'); + + $this->setLayout('default'); + $lists = array(); + $detail = $this->get('data'); + $isNew = ($detail->shipping_rate_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + JToolBarHelper::title($jtitle . ': [ ' . JText::_($shipping->name) . ' : ' . $text . ' ]', 'redshop_shipping_rates48'); + JToolBarHelper::save(); + JToolBarHelper::apply(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $q = "SELECT country_3_code as value,country_name as text from #__redshop_country ORDER BY country_name ASC"; + $db->setQuery($q); + $countries[] = JHTML::_('select.option', '0', '- ' . JText::_('COM_REDSHOP_SELECT_COUNTRY') . ' -', 'value', 'text'); + $countries = array_merge($countries, $db->loadObjectList()); + + $shipping_rate_state = array(); + + if ($detail->shipping_rate_country) + { + $shipping_rate_state = $model->GetStateList($detail->shipping_rate_country); + } + + $detail->shipping_rate_state = explode(',', $detail->shipping_rate_state); + $tmp = new stdClass; + $tmp = @array_merge($tmp, $detail->shipping_rate_state); + + $lists['shipping_rate_state'] = JHTML::_('select.genericlist', $shipping_rate_state, 'shipping_rate_state[]', + 'class="inputbox" multiple="multiple"', 'value', 'text', $detail->shipping_rate_state + ); + + $detail->shipping_rate_country = explode(',', $detail->shipping_rate_country); + $tmp = new stdClass; + $tmp = @array_merge($tmp, $detail->shipping_rate_country); + $lists['shipping_rate_country'] = JHTML::_('select.genericlist', $countries, 'shipping_rate_country[]', + 'class="inputbox" multiple="multiple" onchange="getStateList()" ', 'value', 'text', $detail->shipping_rate_country + ); + + $detail->shipping_rate_on_category = explode(',', $detail->shipping_rate_on_category); + + $lists['shipping_rate_on_category'] = RedshopHelperCategory::listAll("shipping_rate_on_category[]", 0, + $detail->shipping_rate_on_category, 10, false, true + ); + + $shoppergroup = Redshop\Helper\ShopperGroup::generateList(); + $detail->shipping_rate_on_shopper_group = explode(',', $detail->shipping_rate_on_shopper_group); + $lists['shipping_rate_on_shopper_group'] = JHTML::_('select.genericlist', $shoppergroup, 'shipping_rate_on_shopper_group[]', + 'class="inputbox" multiple="multiple" ', 'value', 'text', $detail->shipping_rate_on_shopper_group + ); + + $lists['deliver_type'] = JHTML::_('select.booleanlist', 'deliver_type', 'class="inputbox"', + $detail->deliver_type, 'COM_REDSHOP_HOME', 'COM_REDSHOP_POSTOFFICE' + ); + + $result_container = array(); + + if ($detail->shipping_rate_on_product) + { + $result_container = $model->GetProductListshippingrate($detail->shipping_rate_on_product); + } + + $lists['shipping_product'] = JHTML::_('redshopselect.search', $result_container, 'container_product', + array( + 'select2.ajaxOptions' => array('typeField' => ', alert:"shipping"'), + 'select2.options' => array('multiple' => true) + ) + ); + + // Extra field + $list_field = RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_SHIPPING, $detail->shipping_rate_id); + $lists['extra_field'] = $list_field; + + $shippingVatGroup = $model->getVatGroup(); + + $temps = array( + (object) array( + 'value' => '', + 'text' => JText::_('COM_REDSHOP_SELECT') + ) + ); + + $shippingVatGroup = array_merge($temps, $shippingVatGroup); + + $shippingfor = array( + (object) array( + 'value' => 0, + 'text' => JText::_('COM_REDSHOP_BOTH') + ), + (object) array( + 'value' => 1, + 'text' => JText::_('COM_REDSHOP_COMPANY_ONLY') + ), + (object) array( + 'value' => 2, + 'text' => JText::_('COM_REDSHOP_PRIVATE') + ), + ); + + $lists['company_only'] = JHTML::_('select.genericlist', $shippingfor, 'company_only', + 'class="inputbox" size="1" ', 'value', 'text', $detail->company_only + ); + $lists['shipping_tax_group_id'] = JHTML::_('select.genericlist', $shippingVatGroup, 'shipping_tax_group_id', + 'class="inputbox" size="1" ', 'value', 'text', $detail->shipping_tax_group_id + ); + + $this->is_shipper = $is_shipper; + $this->shipper_location = $shipper_location; + $this->lists = $lists; + $this->detail = $detail; + $this->shipping = $shipping; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/shopper_group/index.html b/component/admin/views/shopper_group/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shopper_group/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shopper_group/tmpl/default.php b/component/admin/views/shopper_group/tmpl/default.php new file mode 100644 index 00000000000..877cb2ffd12 --- /dev/null +++ b/component/admin/views/shopper_group/tmpl/default.php @@ -0,0 +1,142 @@ + + +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + pagination->limitstart, $j = 0, $n = count($this->media); $i < ($this->pagination->limitstart + $this->pagination->limit); $i++, $j++) + { + if (!isset($this->media[$i])) + { + break; + } + + $row = $this->media[$i]; + $row->id = $row->shopper_group_id; + + $link = JRoute::_('index.php?option=com_redshop&view=shopper_group_detail&task=edit&cid[]=' . $row->shopper_group_id); + + $published = JHTML::_('grid.published', $row, $j); + + $link_adddis = JRoute::_('index.php?option=com_redshop&view=discount&layout=edit&spgrpdis_filter=' . $row->shopper_group_id); + + ?> + "> + + + + + + + + + + + +
    + + + + + lists['order_Dir'], $this->lists['order']); ?> + + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($j); ?> + + id); ?> + shopper_group_name; ?> + + + + + shopper_group_id; ?> +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    + + + + + + +
    diff --git a/component/admin/views/shopper_group/tmpl/index.html b/component/admin/views/shopper_group/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shopper_group/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shopper_group/view.html.php b/component/admin/views/shopper_group/view.html.php new file mode 100644 index 00000000000..b76c5b65be5 --- /dev/null +++ b/component/admin/views/shopper_group/view.html.php @@ -0,0 +1,62 @@ +setTitle(JText::_('COM_REDSHOP_SHOPPER_GROUP')); + jimport('joomla.html.pagination'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_SHOPPER_GROUP_MANAGEMENT'), 'users redshop_manufact48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $state = $this->get('State'); + $this->filter = $state->get('filter'); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'shopper_group_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + + $pagination = $this->get('Pagination'); + + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->media = $this->get('Data'); + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/shopper_group_detail/index.html b/component/admin/views/shopper_group_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shopper_group_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shopper_group_detail/tmpl/default.php b/component/admin/views/shopper_group_detail/tmpl/default.php new file mode 100644 index 00000000000..58db4d58405 --- /dev/null +++ b/component/admin/views/shopper_group_detail/tmpl/default.php @@ -0,0 +1,297 @@ +root(); +?> + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + : + + +
    + : + lists['groups']; ?>
    : + lists['customertype']; ?>
    : + lists['portal']; ?>
    : + lists['categories']; ?> +
    : + lists['manufacturers']; ?> +
    + : + + detail->shopper_group_id . "Itemid=" . Redshop::getConfig()->get('PORTAL_LOGIN_ITEMID'); ?>" + target="_blank">detail->shopper_group_id . "Itemid=" . Redshop::getConfig()->get('PORTAL_LOGIN_ITEMID'); ?> +
    : + + +
    : + lists['default_shipping']; ?>
    : + + + +
    : + + +
    + : + lists['tax_group_id']; + echo JHTML::tooltip(JText::_('COM_REDSHOP_TOOLTIP_USE_VAT_GROUP'), JText::_('COM_REDSHOP_USE_VAT_GROUP_LBL'), 'tooltip.png', '', '', false, 'hasTip'); ?>
    :lists['apply_vat']; + echo JHTML::tooltip(JText::_('COM_REDSHOP_TOOLTIP_ADD_VAT'), JText::_('COM_REDSHOP_ADD_VAT'), 'tooltip.png', '', '', false, 'hasTip'); ?> +
    : + lists['show_price_without_vat']; + echo JHTML::tooltip(JText::_('COM_REDSHOP_TOOLTIP_SHOW_PRICE_WITHOUT_VAT'), JText::_('COM_REDSHOP_SHOW_PRICE_WITH_OR_WITHOUT_VAT'), 'tooltip.png', '', '', false, 'hasTip'); ?> +
    : + lists['show_price']; ?>
    + : + lists['use_as_catalog']; ?>
    : + lists['apply_product_price_vat']; + echo JHTML::tooltip(JText::_('COM_REDSHOP_TOOLTIP_PRODUCT_PRICE_VAT_LBL'), JText::_('COM_REDSHOP_PRODUCT_PRICE_VAT_LBL'), 'tooltip.png', '', '', false, 'hasTip'); ?> +
    + : + lists['shopper_group_quotation_mode']; + echo JHTML::tooltip(JText::_('COM_REDSHOP_TOOLTIP_QUOTATION_MODE_LBL'), JText::_('COM_REDSHOP_QUOTATION_MODE_LBL'), 'tooltip.png', '', '', false, 'hasTip'); ?> +
    :lists['published']; ?>
    +
    +
    +
    + + + + + + +
    + +
    + +
    + +
    + detail->shopper_group_logo) : ?> +
    + detail->shopper_group_logo; + $imagethumb_path = RedshopHelperMedia::getImagePath( + $this->detail->shopper_group_logo, + '', + 'thumb', + 'shopperlogo', + Redshop::getConfig()->get('THUMB_WIDTH'), + Redshop::getConfig()->get('THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + ?> + + + +
    + +
    +
    +
    +
    + + + + + +
    + display( + "shopper_group_introtext", + $this->detail->shopper_group_introtext, + '400', + '600', + '100', + '40' + ); + ?> +
    +
    +
    +
    +
    + + + + + +
    display("shopper_group_desc", $this->detail->shopper_group_desc, '$widthPx', '$heightPx', '100', '40'); ?>
    +
    +
    +
    +
    + + + +
    + diff --git a/component/admin/views/shopper_group_detail/tmpl/index.html b/component/admin/views/shopper_group_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/shopper_group_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/shopper_group_detail/view.html.php b/component/admin/views/shopper_group_detail/view.html.php new file mode 100644 index 00000000000..7f776d49f72 --- /dev/null +++ b/component/admin/views/shopper_group_detail/view.html.php @@ -0,0 +1,148 @@ +setLayout('default'); + + $lists = array(); + + $detail = $this->get('data'); + + $isNew = ($detail->shopper_group_id < 1); + + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_SHOPPER_GROUP') . ': [ ' . $text . ' ]', 'users redshop_manufact48'); + + JToolBarHelper::apply(); + + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $groups = RedshopHelperShopper_Group::listAll("parent_id", $detail->shopper_group_id); + $lists['groups'] = $groups; + $model = $this->getModel('shopper_group_detail'); + $optioncustomer = array(); + $optioncustomer[] = JHTML::_('select.option', '-1', JText::_('COM_REDSHOP_SELECT')); + $optioncustomer[] = JHTML::_('select.option', '0', JText::_('COM_REDSHOP_COMPANY')); + $optioncustomer[] = JHTML::_('select.option', '1', JText::_('COM_REDSHOP_PRIVATE')); + $lists['customertype'] = JHTML::_('select.genericlist', $optioncustomer, 'shopper_group_customer_type', + 'class="inputbox" size="1" ', 'value', 'text', $detail->shopper_group_customer_type + ); + + $lists['portal'] = JHTML::_('redshopselect.booleanlist', 'shopper_group_portal', 'class="inputbox"', $detail->shopper_group_portal); + $lists['default_shipping'] = JHTML::_('redshopselect.booleanlist', 'default_shipping', 'class="inputbox"', $detail->default_shipping); + $lists['published'] = JHTML::_('redshopselect.booleanlist', 'published', 'class="inputbox"', $detail->published); + $lists['show_price_without_vat'] = JHTML::_('redshopselect.booleanlist', 'show_price_without_vat', 'class="inputbox"', $detail->show_price_without_vat); + $lists['shopper_group_quotation_mode'] = JHTML::_('redshopselect.booleanlist', 'shopper_group_quotation_mode', + 'class="inputbox"', $detail->shopper_group_quotation_mode + ); + + // For individual show_price and catalog + $show_price_data = RedshopHelperUtility::getPreOrderByList(); + $lists['show_price'] = JHTML::_('select.genericlist', $show_price_data, 'show_price', + 'class="inputbox" size="1" ', 'value', 'text', $detail->show_price + ); + $lists['use_as_catalog'] = JHTML::_('select.genericlist', $show_price_data, 'use_as_catalog', + 'class="inputbox" size="1" ', 'value', 'text', $detail->use_as_catalog + ); + + $shopper_group_categories = $detail->shopper_group_categories; + $shopper_group_categories = explode(",", $shopper_group_categories); + + $categories = RedshopHelperCategory::listAll("shopper_group_categories[]", 0, $shopper_group_categories, 20, true, true, array(), 250); + $lists['categories'] = $categories; + + $shopper_group_manufactures = ''; + + if (isset($detail->shopper_group_manufactures)) + { + $shopper_group_manufactures = $detail->shopper_group_manufactures; + } + + $shopper_group_manufactures = explode(",", $shopper_group_manufactures); + $manufacturers = $model->getmanufacturers(); + $lists['manufacturers'] = JHTML::_('select.genericlist', $manufacturers, 'shopper_group_manufactures[]', + 'class="inputbox" multiple="multiple" size="10" style="width: 250px;"> ', 'value', 'text', + $shopper_group_manufactures + ); + + $vatgroup = $model->getVatGroup(); + $tmp = array(); + $tmp[] = JHTML::_('select.option', 0, JText::_('COM_REDSHOP_SELECT')); + $vatgroup = @array_merge($tmp, $vatgroup); + $lists['tax_group_id'] = JHTML::_('select.genericlist', $vatgroup, 'tax_group_id', + 'class="inputbox" size="1"', 'value', 'text', $detail->tax_group_id + ); + + if (!isset($lists['apply_vat'])) + { + $lists['apply_vat'] = ""; + } + + if (!isset($lists['is_logged_in'])) + { + $lists['is_logged_in'] = ""; + } + + if (!isset($lists['apply_product_price_vat'])) + { + $lists['apply_product_price_vat'] = ""; + } + + if (!isset($lists['tax_exempt'])) + { + $lists['tax_exempt'] = ""; + } + + if (!isset($lists['tax_exempt_on_shipping'])) + { + $lists['tax_exempt_on_shipping'] = ""; + } + + $this->lists = $lists; + $this->detail = $detail; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/state/index.html b/component/admin/views/state/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/state/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/state/tmpl/edit.php b/component/admin/views/state/tmpl/edit.php new file mode 100644 index 00000000000..4c5b3166d2a --- /dev/null +++ b/component/admin/views/state/tmpl/edit.php @@ -0,0 +1,11 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/state/tmpl/index.html b/component/admin/views/state/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/state/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/state/view.html.php b/component/admin/views/state/view.html.php new file mode 100644 index 00000000000..97e450d7748 --- /dev/null +++ b/component/admin/views/state/view.html.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/component/admin/views/states/tmpl/default.php b/component/admin/views/states/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/states/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/states/tmpl/index.html b/component/admin/views/states/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/states/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/states/view.html.php b/component/admin/views/states/view.html.php new file mode 100644 index 00000000000..52e59a04ed3 --- /dev/null +++ b/component/admin/views/states/view.html.php @@ -0,0 +1,61 @@ +{$config['dataCol']}; + + if ($config['dataCol'] === 'country_id') + { + return RedshopEntityCountry::getInstance($value)->get('country_name'); + } + + if ($config['dataCol'] === 'show_state') + { + if ($value === 3) + { + return JText::_('COM_REDSHOP_THREE_LETTER_ABBRIVATION'); + } + + return JText::_('COM_REDSHOP_TWO_LETTER_ABBRIVATION'); + } + + return parent::onRenderColumn($config, $index, $row); + } +} diff --git a/component/admin/views/statistic/index.html b/component/admin/views/statistic/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/statistic/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/statistic/tmpl/amountorder.php b/component/admin/views/statistic/tmpl/amountorder.php new file mode 100644 index 00000000000..00473ad7e31 --- /dev/null +++ b/component/admin/views/statistic/tmpl/amountorder.php @@ -0,0 +1,67 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + +
    lists['filteroption'];?>
    + + + + + + + + + amountorder[$i]) || !is_object($this->amountorder[$i])) + { + break; + } + + $row = $this->amountorder[$i]; + + if ($this->filteroption && $row->viewdate != $disdate) + { + $disdate = $row->viewdate; ?> + + + + + + + + + + + + + +
    firstname . ' ' . $row->lastname; ?>totalorder;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/amountprice.php b/component/admin/views/statistic/tmpl/amountprice.php new file mode 100644 index 00000000000..626566fc7c0 --- /dev/null +++ b/component/admin/views/statistic/tmpl/amountprice.php @@ -0,0 +1,69 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + +
    lists['filteroption'];?>
    + + + + + + + + + amountprice[$i]) || !is_object($this->amountprice[$i])) + { + break; + } + + $row = $this->amountprice[$i]; + + if ($this->filteroption && $row->viewdate != $disdate) + { + $disdate = $row->viewdate; ?> + + + + + + + + + + + + + +
    firstname . ' ' . $row->lastname; ?>getProductFormattedPrice($row->order_total);?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/amountspent.php b/component/admin/views/statistic/tmpl/amountspent.php new file mode 100644 index 00000000000..f3301579f7c --- /dev/null +++ b/component/admin/views/statistic/tmpl/amountspent.php @@ -0,0 +1,69 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + +
    lists['filteroption'];?>
    + + + + + + + + + amountspentintotal[$i]) || !is_object($this->amountspentintotal[$i])) + { + break; + } + + $row = $this->amountspentintotal[$i]; + + if ($this->filteroption && $row->viewdate != $disdate) + { + $disdate = $row->viewdate; ?> + + + + + + + + + + + + + +
    firstname . ' ' . $row->lastname; ?>getProductFormattedPrice($row->order_total);?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/avrgorder.php b/component/admin/views/statistic/tmpl/avrgorder.php new file mode 100644 index 00000000000..4faa754da76 --- /dev/null +++ b/component/admin/views/statistic/tmpl/avrgorder.php @@ -0,0 +1,61 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + +
    lists['filteroption'];?>
    + + + + + filteroption) + { ?> + + + + + + avgorderamount[$i]) && is_object($this->avgorderamount[$i]); $i++, $j++) + { + $row = $this->avgorderamount[$i]; ?> + + + filteroption) + { ?> + + + + + + + + +
    viewdate;?>getProductFormattedPrice($row->avg_order);?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/bestsell.php b/component/admin/views/statistic/tmpl/bestsell.php new file mode 100644 index 00000000000..41ee312aec6 --- /dev/null +++ b/component/admin/views/statistic/tmpl/bestsell.php @@ -0,0 +1,87 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + + +
    lists['filteroption'];?>lists['typeoption'];?>
    + + + + + + + + + + bestsell[$i]) || !is_object($this->bestsell[$i])) + { + break; + } + + $row = $this->bestsell[$i]; + + if ($this->filteroption && $this->filteroption != 0 && $row->viewdate != $disdate) + { + $disdate = $row->viewdate; ?> + + + + product_id); + if ($row->product_id != NULL) + { + ?> + + + + + + + + + + +
    typeoption == 2) + echo JText::_('COM_REDSHOP_NUMBER_OF_ITEMS_SOLD'); + else + echo JText::_('COM_REDSHOP_NUMBER_OF_TIMES_SOLD'); ?> +
    + product_name; ?>getProductFormattedPrice($row->product_price);?>totalproduct;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/default.php b/component/admin/views/statistic/tmpl/default.php new file mode 100644 index 00000000000..061f200019d --- /dev/null +++ b/component/admin/views/statistic/tmpl/default.php @@ -0,0 +1,86 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + +
    lists['filteroption'];?>
    + + + + + + + + redshopviewer[$i]) === false) + { + continue; + } + + $row = $this->redshopviewer[$i]; + + if (!is_object($row)) + { + break; + } + ?> + + + + + + + + +
    filteroption != 0) + { + echo JText::_('COM_REDSHOP_DATE'); + } + else + { + echo JText::_('COM_REDSHOP_HASH'); + } + ?> +
    + filteroption != 0 && isset($row->viewdate) === true) + { + echo $row->viewdate; + } + else + { + echo JText::_('COM_REDSHOP_HASH'); + } + ?> + viewer) ? $row->viewer : 0;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/index.html b/component/admin/views/statistic/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/statistic/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/statistic/tmpl/neworder.php b/component/admin/views/statistic/tmpl/neworder.php new file mode 100644 index 00000000000..2435673bfa9 --- /dev/null +++ b/component/admin/views/statistic/tmpl/neworder.php @@ -0,0 +1,80 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + + + + + + +
    lists['filteroption'];?>
    startdate , 'startdate', 'startdate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    enddate , 'enddate', 'enddate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    />
    + + + + + + + + + + neworder[$i]) || !is_object($this->neworder[$i])) + { + break; + } + + $row = $this->neworder[$i]; + + if ($this->filteroption && $row->viewdate != $disdate) + { + $disdate = $row->viewdate; ?> + + + + order_id);?> + + + + + + + + + + +
    + order_id; ?>firstname . ' ' . $row->lastname;?>getProductFormattedPrice($row->order_total);?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/newprod.php b/component/admin/views/statistic/tmpl/newprod.php new file mode 100644 index 00000000000..36fdb8caecf --- /dev/null +++ b/component/admin/views/statistic/tmpl/newprod.php @@ -0,0 +1,77 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + + + + + + +
    lists['filteroption'];?>
    startdate , 'startdate', 'startdate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    enddate , 'enddate', 'enddate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    />
    + + + + + + + + + newprod[$i]) || !is_object($this->newprod[$i])) + { + break; + } + + $row = $this->newprod[$i]; + + if ($this->filteroption && $row->viewdate != $disdate) + { + $disdate = $row->viewdate; ?> + + + + product_id);?> + + + + + + + + + +
    + product_name; ?>getProductFormattedPrice($row->product_price);?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/pageview.php b/component/admin/views/statistic/tmpl/pageview.php new file mode 100644 index 00000000000..5dfa4e3e070 --- /dev/null +++ b/component/admin/views/statistic/tmpl/pageview.php @@ -0,0 +1,84 @@ +getModel('statistic'); + +$start = $this->pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + + + + + + +
    lists['filteroption'];?>
    startdate , 'startdate', 'startdate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    enddate , 'enddate', 'enddate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    />
    + + + + + + + + + pageviewer[$i]) || !is_object($this->pageviewer[$i]) ) + { + break; + } + + $row = $this->pageviewer[$i]; + + if ($this->filteroption && $row->viewdate != $disdate) + { + $disdate = $row->viewdate; ?> + + + + getSectionDetail($row->section, $row->section_id); + if (count($secinfo) > 0) + { + $link = JRoute::_('index.php?option=com_redshop&view=' . $row->section . '_detail&task=edit&cid[]=' . $secinfo->id); + $sectionname = "" . $row->section . " :: " . $secinfo->sname . ""; + } + else + { + $sectionname = $row->section; + } ?> + + + + + + + + + +
    totalpage;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/popularsell.php b/component/admin/views/statistic/tmpl/popularsell.php new file mode 100644 index 00000000000..5e1e280b765 --- /dev/null +++ b/component/admin/views/statistic/tmpl/popularsell.php @@ -0,0 +1,79 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + + + + + + +
    lists['filteroption'];?>
    startdate , 'startdate', 'startdate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    enddate , 'enddate', 'enddate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    />
    + + + + + + + + + + popularsell[$i]) || !is_object($this->popularsell[$i])) + { + break; + } + + $row = $this->popularsell[$i]; + + if ($this->filteroption && $row->viewdate != $disdate) + { + $disdate = $row->viewdate; ?> + + + + product_id); ?> + + + + + + + + + + +
    + product_name; ?>getProductFormattedPrice($row->product_price);?>visited;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/tmpl/turnover.php b/component/admin/views/statistic/tmpl/turnover.php new file mode 100644 index 00000000000..a9b1b425c91 --- /dev/null +++ b/component/admin/views/statistic/tmpl/turnover.php @@ -0,0 +1,73 @@ +pagination->limitstart; +$end = $this->pagination->limit; +?> +
    +
    + + + + + + + + + +
    lists['filteroption'];?>
    startdate , 'startdate', 'startdate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    enddate , 'enddate', 'enddate',$format = '%d-%m-%Y',array('class'=>'inputbox', 'size'=>'15', 'maxlength'=>'19'));?>
    />
    + + + + + filteroption) + { ?> + + + + + + totalturnover[$i]) || !is_object($this->totalturnover[$i])) + { + break; + } + + $row = $this->totalturnover[$i]; + ?> + + + filteroption) + { ?> + + + + + + + + +
    viewdate;?>getProductFormattedPrice($row->turnover);?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + +
    diff --git a/component/admin/views/statistic/view.html.php b/component/admin/views/statistic/view.html.php new file mode 100644 index 00000000000..0832233e99c --- /dev/null +++ b/component/admin/views/statistic/view.html.php @@ -0,0 +1,210 @@ +input->getCmd('layout', ''); + + $startdate = $app->input->getInt('startdate', 0); + $enddate = $app->input->getInt('enddate', 0); + + $filteroption = $app->input->getInt('filteroption', 0); + $typeoption = $app->input->getInt('typeoption', 2); + + $lists = array(); + $option = array(); + + $option[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_Select')); + $option[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_DAILY')); + $option[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_WEEKLY')); + $option[] = JHtml::_('select.option', '3', JText::_('COM_REDSHOP_MONTHLY')); + $option[] = JHtml::_('select.option', '4', JText::_('COM_REDSHOP_YEARLY')); + + $type[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_NUMBER_OF_TIMES_SOLD')); + $type[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_NUMBER_OF_ITEMS_SOLD')); + + $lists['filteroption'] = JHtml::_('select.genericlist', $option, 'filteroption', + 'class="inputbox" size="1" onchange="document.adminForm.submit();" ', 'value', 'text', $filteroption + ); + + $lists['typeoption'] = JHtml::_('select.genericlist', $type, 'typeoption', + 'class="inputbox" size="1" onchange="document.adminForm.submit();" ', 'value', 'text', $typeoption + ); + + $redshopviewer = array(); + $pageviewer = array(); + $avgorderamount = array(); + $popularsell = array(); + $bestsell = array(); + $newprod = array(); + $neworder = array(); + $totalturnover = array(); + $amountorder = array(); + $amountprice = array(); + $amountspentintotal = array(); + + $limitstart = $app->getUserStateFromRequest($context . 'limitstart', 'limitstart', '0'); + $limit = $app->getUserStateFromRequest($context . 'limit', 'limit', '10'); + + if ($layout == 'turnover') + { + $this->setLayout('turnover'); + $title = JText::_('COM_REDSHOP_TOTAL_TURNOVER'); + $totalturnover = $this->get('TotalTurnover'); + $total = count($totalturnover); + } + elseif ($layout == 'pageview') + { + $this->setLayout('pageview'); + $title = JText::_('COM_REDSHOP_TOTAL_PAGEVIEWERS'); + $pageviewer = $this->get('PageViewer'); + $total = count($pageviewer); + } + elseif ($layout == 'amountorder') + { + $this->setLayout('amountorder'); + $title = JText::_('COM_REDSHOP_TOP_CUSTOMER_AMOUNT_OF_ORDER'); + $amountorder = $this->get('AmountOrder'); + $total = count($amountorder); + } + elseif ($layout == 'avrgorder') + { + $this->setLayout('avrgorder'); + $title = JText::_('COM_REDSHOP_AVG_ORDER_AMOUNT_CUSTOMER'); + $avgorderamount = $this->get('AvgOrderAmount'); + $total = count($avgorderamount); + } + elseif ($layout == 'amountprice') + { + $this->setLayout('amountprice'); + $title = JText::_('COM_REDSHOP_TOP_CUSTOMER_AMOUNT_OF_PRICE_PER_ORDER'); + $amountprice = $this->get('AmountPrice'); + $total = count($amountprice); + } + elseif ($layout == 'amountspent') + { + $this->setLayout('amountspent'); + $title = JText::_('COM_REDSHOP_TOP_CUSTOMER_AMOUNT_SPENT_IN_TOTAL'); + $amountspentintotal = $this->get('AmountSpentInTotal'); + $total = count($amountspentintotal); + } + elseif ($layout == 'bestsell') + { + $this->setLayout('bestsell'); + $title = JText::_('COM_REDSHOP_BEST_SELLERS'); + $bestsell = $this->get('BestSellers'); + $total = count($bestsell); + } + elseif ($layout == 'popularsell') + { + $this->setLayout('popularsell'); + $title = JText::_('COM_REDSHOP_MOST_VISITED_PRODUCTS'); + $popularsell = $this->get('MostPopular'); + $total = count($popularsell); + } + elseif ($layout == 'newprod') + { + $this->setLayout('newprod'); + $title = JText::_('COM_REDSHOP_NEWEST_PRODUCTS'); + $newprod = $this->get('NewProducts'); + $total = count($newprod); + } + elseif ($layout == 'neworder') + { + $this->setLayout('neworder'); + $title = JText::_('COM_REDSHOP_NEWEST_ORDERS'); + $neworder = $this->get('NewOrders'); + $total = count($neworder); + } + else + { + $this->setLayout('default'); + $title = JText::_('COM_REDSHOP_TOTAL_VISITORS'); + $redshopviewer = $this->get('RedshopViewer'); + $total = count($redshopviewer); + } + + $document->setTitle(JText::_('COM_REDSHOP_STATISTIC')); + + $pagination = new JPagination($total, $limitstart, $limit); + $this->pagination = $pagination; + + $this->startdate = $startdate; + $this->enddate = $enddate; + + $this->popularsell = $popularsell; + $this->bestsell = $bestsell; + $this->avgorderamount = $avgorderamount; + $this->newprod = $newprod; + $this->neworder = $neworder; + $this->totalturnover = $totalturnover; + $this->amountorder = $amountorder; + $this->amountprice = $amountprice; + $this->amountspentintotal = $amountspentintotal; + $this->redshopviewer = $redshopviewer; + $this->pageviewer = $pageviewer; + $this->lists = $lists; + $this->filteroption = $filteroption; + $this->typeoption = $typeoption; + $this->layout = $layout; + $this->request_url = $uri->toString(); + $this->title = $title; + + $this->addToolbar(); + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + * + * @throws Exception + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + JToolBarHelper::title($this->title, 'statistic redshop_statistic48'); + } +} diff --git a/component/admin/views/statistic_customer/index.html b/component/admin/views/statistic_customer/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/statistic_customer/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/statistic_customer/tmpl/default.php b/component/admin/views/statistic_customer/tmpl/default.php new file mode 100644 index 00000000000..f939cfd00f7 --- /dev/null +++ b/component/admin/views/statistic_customer/tmpl/default.php @@ -0,0 +1,129 @@ +addScript('//www.gstatic.com/charts/loader.js'); + +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +?> + + +
    +
    +
    +
    + filterForm->getInput('date_range', 'filter') ?> +
    +
    +
    +
    + filterForm->getInput('limit', 'list') ?> +
    +
    +
    + customers)): ?> +
    +
    +

    +
    + +

    +
    +
    + + + + + + + + + + + customers as $i => $row) : ?> + + + + + + + + + + + +
    + + + + + + + +
    + + firstname . ' ' . $row->lastname; ?> + + user_email ?>count ?>total_sale) ?>
    + pagination->getListFooter(); ?> +
    + + + + + + + +
    diff --git a/component/admin/views/statistic_customer/view.html.php b/component/admin/views/statistic_customer/view.html.php new file mode 100644 index 00000000000..248e34a2101 --- /dev/null +++ b/component/admin/views/statistic_customer/view.html.php @@ -0,0 +1,81 @@ +setTitle(JText::_('COM_REDSHOP_STATISTIC_CUSTOMER')); + + /** @var RedshopModelStatistic_Customer $model */ + $model = $this->getModel(); + + $this->customers = $model->getItems(); + $this->pagination = $model->getPagination(); + $this->state = $model->getState(); + $this->filterForm = $model->getForm(); + + $this->addToolbar(); + + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + JToolBarHelper::title(JText::_('COM_REDSHOP_STATISTIC_CUSTOMER'), 'statistic redshop_statistic48'); + + RedshopToolbarHelper::custom( + 'exportCustomer', + 'save.png', + 'save_f2.png', + 'COM_REDSHOP_EXPORT_DATA_LBL', + false + ); + RedshopToolbarHelper::link( + 'index.php?tmpl=component&option=com_redshop&view=statistic_customer', + 'print', + 'COM_REDSHOP_PRINT', + '_blank' + ); + } +} diff --git a/component/admin/views/statistic_order/index.html b/component/admin/views/statistic_order/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/statistic_order/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/statistic_order/tmpl/default.php b/component/admin/views/statistic_order/tmpl/default.php new file mode 100644 index 00000000000..2cb388fcc14 --- /dev/null +++ b/component/admin/views/statistic_order/tmpl/default.php @@ -0,0 +1,123 @@ +addScript('//www.gstatic.com/charts/loader.js'); + +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +?> + +
    +
    +
    +
    + filterForm->getInput('date_range', 'filter') ?> +
    +
    +
    +
    + filterForm->getInput('date_group', 'filter') ?> +
    +
    +
    +
    + filterForm->getInput('limit', 'list') ?> +
    +
    +
    + orders)): ?> +
    +
    +

    +
    + +
    +
    +
    + + + + + + + + + + orders as $i => $row) : ?> + + + + + + + + + + +
    + + + + + +
    viewdate; ?>count; ?>order_total) ?>
    + pagination->getListFooter(); ?> +
    + + + + + + + +
    diff --git a/component/admin/views/statistic_order/view.html.php b/component/admin/views/statistic_order/view.html.php new file mode 100644 index 00000000000..ca1759558a7 --- /dev/null +++ b/component/admin/views/statistic_order/view.html.php @@ -0,0 +1,69 @@ +setTitle(JText::_('COM_REDSHOP_STATISTIC_ORDER')); + + $model = $this->getModel(); + + $this->orders = $model->getItems(); + $this->pagination = $model->getPagination(); + $this->state = $model->getState(); + $this->filterForm = $model->getForm(); + + $this->addToolbar(); + + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + JToolBarHelper::title(JText::_('COM_REDSHOP_STATISTIC_ORDER'), 'statistic redshop_statistic48'); + RedshopToolbarHelper::link( + 'index.php?tmpl=component&option=com_redshop&task=statistic_order.exportOrder&date_range=' . $this->state->get('filter.date_range'), + 'save.png', + 'COM_REDSHOP_EXPORT_DATA_LBL', + '_blank' + ); + RedshopToolbarHelper::link( + 'index.php?tmpl=component&option=com_redshop&view=statistic_order', + 'print', + 'COM_REDSHOP_PRINT', + '_blank' + ); + } +} diff --git a/component/admin/views/statistic_product/index.html b/component/admin/views/statistic_product/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/statistic_product/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/statistic_product/tmpl/default.php b/component/admin/views/statistic_product/tmpl/default.php new file mode 100644 index 00000000000..60690eef366 --- /dev/null +++ b/component/admin/views/statistic_product/tmpl/default.php @@ -0,0 +1,122 @@ +addScript('//www.gstatic.com/charts/loader.js'); + +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +?> + +
    +
    +
    +
    + filterForm->getInput('date_range', 'filter') ?> +
    +
    +
    +
    + filterForm->getInput('limit', 'list') ?> +
    +
    +
    + products)): ?> +
    +
    +

    +
    + +
    +
    + + + + + + + + + + + + + products as $i => $row) : ?> + + + + + + + + + + + + + +
    + product_name; ?> + product_number ?>manufacturer_name ?>order_count ?>unit_sold ?>total_sale); ?>
    + pagination->getListFooter(); ?> +
    + + + + + + + +
    diff --git a/component/admin/views/statistic_product/view.html.php b/component/admin/views/statistic_product/view.html.php new file mode 100644 index 00000000000..bdde6848c44 --- /dev/null +++ b/component/admin/views/statistic_product/view.html.php @@ -0,0 +1,71 @@ +setTitle(JText::_('COM_REDSHOP_STATISTIC_PRODUCT')); + + $model = $this->getModel(); + + $this->products = $model->getItems(); + $this->pagination = $model->getPagination(); + $this->state = $model->getState(); + $this->filterForm = $model->getForm(); + + $this->addToolbar(); + + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + JToolBarHelper::title(JText::_('COM_REDSHOP_STATISTIC_PRODUCT'), 'statistic redshop_statistic48'); + + RedshopToolbarHelper::custom( + 'exportProduct', + 'save.png', + 'save_f2.png', + 'COM_REDSHOP_EXPORT_DATA_LBL', + false + ); + RedshopToolbarHelper::link( + 'index.php?tmpl=component&option=com_redshop&view=statistic_product', + 'print', + 'COM_REDSHOP_PRINT', + '_blank' + ); + } +} diff --git a/component/admin/views/statistic_quotation/index.html b/component/admin/views/statistic_quotation/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/statistic_quotation/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/statistic_quotation/tmpl/default.php b/component/admin/views/statistic_quotation/tmpl/default.php new file mode 100644 index 00000000000..e2407075be9 --- /dev/null +++ b/component/admin/views/statistic_quotation/tmpl/default.php @@ -0,0 +1,162 @@ +addScript('//www.gstatic.com/charts/loader.js'); +$producthelper = productHelper::getInstance(); +?> + +
    +
    + + + + +
    +
    + + + + + +
    +
    +
    + + + + + + + + + quotations as $i => $row) : ?> + + + + + + +
    viewdate; ?>count; ?>getProductFormattedPrice($row->quotation_total);?>
    +
    + + +
    diff --git a/component/admin/views/statistic_quotation/view.html.php b/component/admin/views/statistic_quotation/view.html.php new file mode 100644 index 00000000000..fe733d12969 --- /dev/null +++ b/component/admin/views/statistic_quotation/view.html.php @@ -0,0 +1,76 @@ +setTitle(JText::_('COM_REDSHOP_STATISTIC_QUOTATION')); + /** @scrutinizer ignore-deprecated */JHtml::stylesheet('com_redshop/daterangepicker.min.css', array(), true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/moment.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/daterangepicker.min.js', false, true); + + $this->quotations = $this->get('Quotations'); + $this->filterStartDate = $app->input->getString('filter_start_date', ''); + $this->filterEndDate = $app->input->getString('filter_end_date', ''); + $this->filterDateLabel = $app->input->getString('filter_date_label', ''); + + $this->addToolbar(); + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + $title = JText::_('COM_REDSHOP_STATISTIC_QUOTATION'); + JFactory::getApplication()->input->set('hidemainmenu', true); + JToolBarHelper::title(JText::_('COM_REDSHOP_STATISTIC_QUOTATION') . " :: " . $title, 'statistic redshop_statistic48'); + + RedshopToolbarHelper::custom( + 'exportQuotation', + 'save.png', + 'save_f2.png', + 'COM_REDSHOP_EXPORT_DATA_LBL', + false + ); + RedshopToolbarHelper::link( + 'index.php?tmpl=component&option=com_redshop&view=statistic_quotation', + 'print', + 'COM_REDSHOP_PRINT', + '_blank' + ); + } +} diff --git a/component/admin/views/statistic_variant/index.html b/component/admin/views/statistic_variant/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/statistic_variant/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/statistic_variant/tmpl/default.php b/component/admin/views/statistic_variant/tmpl/default.php new file mode 100644 index 00000000000..7475d3ca986 --- /dev/null +++ b/component/admin/views/statistic_variant/tmpl/default.php @@ -0,0 +1,184 @@ +addScript('//www.gstatic.com/charts/loader.js'); +$productHelper = productHelper::getInstance(); +$total = 0; + +foreach ($this->productVariants as $itemId => $data) +{ + $total += $data['total_sale']; +} +?> + +
    +
    + + + + +
    +
    + + + + + +
    +
    +
    + + + + + + + + + + + + 0) :?> + productVariants as $itemId => $data) : + $row = (object) $data; + ?> + total_sale)) : ?> + + + + + + + + + + + +
    viewdate; ?>product_name; ?>product_attribute; ?>product_attribute_sku; ?>unit_sold; ?>getProductFormattedPrice($row->total_sale); ?>
    +
    + + +
    diff --git a/component/admin/views/statistic_variant/view.html.php b/component/admin/views/statistic_variant/view.html.php new file mode 100644 index 00000000000..987ebb6ad6b --- /dev/null +++ b/component/admin/views/statistic_variant/view.html.php @@ -0,0 +1,78 @@ +setTitle(JText::_('COM_REDSHOP_STATISTIC_PRODUCT_VARIANT')); + /** @scrutinizer ignore-deprecated */JHtml::stylesheet('com_redshop/daterangepicker.min.css', array(), true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/moment.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/daterangepicker.min.js', false, true); + + $this->productVariants = $this->get('ProductVariants'); + $this->filterStartDate = $app->input->getString('filter_start_date', ''); + $this->filterEndDate = $app->input->getString('filter_end_date', ''); + $this->filterDateLabel = $app->input->getString('filter_date_label', ''); + + $this->addToolbar(); + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + $title = JText::_('COM_REDSHOP_STATISTIC_PRODUCT_VARIANT'); + JFactory::getApplication()->input->set('hidemainmenu', true); + JToolBarHelper::title( + JText::_('COM_REDSHOP_STATISTIC_PRODUCT_VARIANT') . " :: " . $title, 'statistic redshop_statistic48' + ); + + RedshopToolbarHelper::custom( + 'exportProductVariant', + 'save.png', + 'save_f2.png', + 'COM_REDSHOP_EXPORT_DATA_LBL', + false + ); + RedshopToolbarHelper::link( + 'index.php?tmpl=component&option=com_redshop&view=statistic_variant', + 'print', + 'COM_REDSHOP_PRINT', + '_blank' + ); + } +} diff --git a/component/admin/views/stockimage/index.html b/component/admin/views/stockimage/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/stockimage/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/stockimage/tmpl/default.php b/component/admin/views/stockimage/tmpl/default.php new file mode 100644 index 00000000000..aec2c57ccac --- /dev/null +++ b/component/admin/views/stockimage/tmpl/default.php @@ -0,0 +1,113 @@ +input->get('filter'); + +$model = $this->getModel('stockimage'); +?> + + +
    +
    +
    +
    +
    + + " /> + +
    +
    +
    + + + + + + + + + + + + + + + data); $i < $n; $i++) + { + $row = $this->data[$i]; + $row->id = $row->stock_amount_id; + + $thumbUrl = RedshopHelperMedia::getImagePath( + $row->stock_amount_image, + '', + 'thumb', + 'stockroom', + Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_WIDTH'), + Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $link = JRoute::_('index.php?option=com_redshop&view=stockimage_detail&task=edit&cid[]=' . $row->id); ?> + "> + + + + + + + + + + + + + +
    lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>
    pagination->getRowOffset($i);?>id);?>stock_amount_image_tooltip;?> + stock_quantity;?>getStockAmountOption($row->stock_option);?>stockroom_name;?>stock_amount_id;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter();?>
    +
    + + + + + + +
    diff --git a/component/admin/views/stockimage/tmpl/index.html b/component/admin/views/stockimage/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/stockimage/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/stockimage/view.html.php b/component/admin/views/stockimage/view.html.php new file mode 100644 index 00000000000..375fa29df10 --- /dev/null +++ b/component/admin/views/stockimage/view.html.php @@ -0,0 +1,48 @@ +setTitle(JText::_('COM_REDSHOP_STOCKIMAGE')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_STOCKIMAGE_MANAGEMENT'), 'redshop_stockroom48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + + $state = $this->get('State'); + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'stock_amount_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + + $lists ['order'] = $filter_order; + $lists ['order_Dir'] = $filter_order_Dir; + $this->filter = $state->get('filter'); + + $data = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->lists = $lists; + $this->data = $data; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/stockimage_detail/index.html b/component/admin/views/stockimage_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/stockimage_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/stockimage_detail/tmpl/default.php b/component/admin/views/stockimage_detail/tmpl/default.php new file mode 100644 index 00000000000..1f5702acef6 --- /dev/null +++ b/component/admin/views/stockimage_detail/tmpl/default.php @@ -0,0 +1,93 @@ +root(); + +$thumbUrl = RedshopHelperMedia::getImagePath( + $this->detail->stock_amount_image, + '', + 'thumb', + 'stockroom', + Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_WIDTH'), + Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + +?> + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    : +
    : + lists['stockroom_id'];?>
    : + lists['stock_option'];?>
    : +
    : + +
    +
    +
    +
    +
    + + + + +
    diff --git a/component/admin/views/stockimage_detail/tmpl/index.html b/component/admin/views/stockimage_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/stockimage_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/stockimage_detail/view.html.php b/component/admin/views/stockimage_detail/view.html.php new file mode 100644 index 00000000000..20e278118a2 --- /dev/null +++ b/component/admin/views/stockimage_detail/view.html.php @@ -0,0 +1,71 @@ +setLayout('default'); + + $lists = array(); + + $detail = $this->get('data'); + $isNew = ($detail->stock_amount_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + JToolBarHelper::title(JText::_('COM_REDSHOP_STOCKIMAGE') . ': [ ' . $text . ' ]', 'redshop_stockroom48'); + + // Create the toolbar + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $model = $this->getModel('stockimage_detail'); + + $stock_option = $model->getStockAmountOption(); + $stockroom_name = $model->getStockRoomList(); + $op = array(); + $op[0] = new stdClass; + $op[0]->value = 0; + $op[0]->text = JText::_('COM_REDSHOP_SELECT'); + $stockroom_name = array_merge($op, $stockroom_name); + + $lists['stock_option'] = JHTML::_('select.genericlist', $stock_option, 'stock_option', + 'class="inputbox" size="1" ', 'value', 'text', $detail->stock_option + ); + + $lists['stockroom_id'] = JHTML::_('select.genericlist', $stockroom_name, 'stockroom_id', + 'class="inputbox" size="1" ', 'value', 'text', $detail->stockroom_id + ); + + $this->lists = $lists; + $this->detail = $detail; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/stockroom/index.html b/component/admin/views/stockroom/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/stockroom/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/stockroom/tmpl/default.php b/component/admin/views/stockroom/tmpl/default.php new file mode 100644 index 00000000000..e2b27356737 --- /dev/null +++ b/component/admin/views/stockroom/tmpl/default.php @@ -0,0 +1,99 @@ +input->get('filter'); +?> + +
    +
    +
    +
    +
    + + " /> + +
    +
    +
    + + + + + + + + + + + + + + stockroom); $i < $n; $i++) + { + $row = $this->stockroom [$i]; + $row->id = $row->stockroom_id; + $link = JRoute::_('index.php?option=com_redshop&view=stockroom_detail&task=edit&cid[]=' . $row->stockroom_id);?> + "> + + + + + + + + + + + + + +
    lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>
    pagination->getRowOffset($i);?>id);?> + stockroom_name;?>min_del_time;?>max_del_time;?>published = $row->show_in_front; + echo $show_in_front = JHTML::_('grid.published', $row, $i, 'tick.png', 'publish_x.png', 'front');?>stockroom_id;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter();?>
    +
    + + + + + + +
    diff --git a/component/admin/views/stockroom/tmpl/index.html b/component/admin/views/stockroom/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/stockroom/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/stockroom/view.html.php b/component/admin/views/stockroom/view.html.php new file mode 100644 index 00000000000..923a5042b1c --- /dev/null +++ b/component/admin/views/stockroom/view.html.php @@ -0,0 +1,54 @@ +setTitle(JText::_('COM_REDSHOP_STOCKROOM')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_STOCKROOM_MANAGEMENT'), 'redshop_stockroom48'); + JToolBarHelper::custom('listing', 'copy.png', 'copy_f2.png', JText::_('COM_REDSHOP_LISTING'), false); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::custom('copy', 'copy.png', 'copy_f2.png', JText::_('COM_REDSHOP_TOOLBAR_COPY'), true); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $this->state = $this->get('State'); + $lists ['order'] = $this->state->get('list.ordering', 'stockroom_id'); + $lists ['order_Dir'] = $this->state->get('list.direction'); + + $stockroom = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->lists = $lists; + $this->stockroom = $stockroom; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/stockroom_detail/index.html b/component/admin/views/stockroom_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/stockroom_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/stockroom_detail/tmpl/default.php b/component/admin/views/stockroom_detail/tmpl/default.php new file mode 100644 index 00000000000..35cc29b3042 --- /dev/null +++ b/component/admin/views/stockroom_detail/tmpl/default.php @@ -0,0 +1,151 @@ + + + +
    +
    +
    + + + + + + + + + + + + + + + + + detail->delivery_time == 'Weeks') + { + $this->detail->min_del_time = (int) $this->detail->min_del_time / 7; + $this->detail->max_del_time = (int) $this->detail->max_del_time / 7; + } + + ?> + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + + + booleanlist; ?> +
    + + + + +
    + + + + +
    + : + + lists['show_in_front']; ?> +
    + : + + lists['published']; ?> +
    +
    +
    +
    + +
    + +
    +
    + + + + + + +
    + display("stockroom_desc", $this->detail->stockroom_desc, '$widthPx', '$heightPx', '100', '20', '1'); ?> +
    +
    +
    +
    + + + + +
    diff --git a/component/admin/views/stockroom_detail/tmpl/importstock.php b/component/admin/views/stockroom_detail/tmpl/importstock.php new file mode 100644 index 00000000000..2138f2b4fe2 --- /dev/null +++ b/component/admin/views/stockroom_detail/tmpl/importstock.php @@ -0,0 +1,125 @@ + + +
    +
    +
    + + + + + + +
    lists['stockroom_id'];?>    +
    +
    +
    + + + + + + + + +
    +
    +
    + +
    +
    +
    + + + + +
    diff --git a/component/admin/views/stockroom_detail/tmpl/index.html b/component/admin/views/stockroom_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/stockroom_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/stockroom_detail/view.html.php b/component/admin/views/stockroom_detail/view.html.php new file mode 100644 index 00000000000..d9a9d029dd1 --- /dev/null +++ b/component/admin/views/stockroom_detail/view.html.php @@ -0,0 +1,87 @@ +input->getCmd('layout', ''); + + $lists = array(); + $uri = JFactory::getURI(); + + /** @var RedshopModelStockroom_detail $model */ + $model = $this->getModel('stockroom_detail'); + + if ($layout == 'importstock') + { + $stockroom_name = $model->getStockRoomList(); + $op = array(); + $op[0]->value = 0; + $op[0]->text = JText::_('COM_REDSHOP_SELECT'); + $stockroom_name = array_merge($op, $stockroom_name); + $lists['stockroom_id'] = JHTML::_('select.genericlist', $stockroom_name, 'stockroom_id', 'class="inputbox" size="1" ', 'value', 'text'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_IMPORT_STOCK_FROM_ECONOMIC'), 'redshop_stockroom48'); + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + $this->setLayout($layout); + } + else + { + $this->setLayout('default'); + $detail = $this->get('data'); + + $isNew = ($detail->stockroom_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + JToolBarHelper::title(JText::_('COM_REDSHOP_STOCKROOM') . ': [ ' . $text . ' ]', 'redshop_stockroom48'); + + // Create the toolbar + JToolBarHelper::apply(); + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $lists['show_in_front'] = JHtml::_('select.booleanlist', 'show_in_front', 'class="inputbox"', $detail->show_in_front); + $lists['published'] = JHtml::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + + $delivery_time = array(); + $delivery_time['value'] = "days"; + $delivery_time['value'] .= "weeks"; + + $booleanlist = RedshopHelperExtrafields::booleanList('delivery_time', 'class="inputbox"', $detail->delivery_time, + JText::_('COM_REDSHOP_DAYS'), JText::_('COM_REDSHOP_WEEKS') + ); + + $this->booleanlist = $booleanlist; + $this->detail = $detail; + } + + $this->lists = $lists; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/stockroom_listing/index.html b/component/admin/views/stockroom_listing/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/stockroom_listing/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/stockroom_listing/tmpl/default.php b/component/admin/views/stockroom_listing/tmpl/default.php new file mode 100644 index 00000000000..6a8314acb4f --- /dev/null +++ b/component/admin/views/stockroom_listing/tmpl/default.php @@ -0,0 +1,306 @@ +getmodel('stockroom_listing'); +$showbuttons = JFactory::getApplication()->input->getInt('showbuttons', 0); +?> + +
    + + + +
    + + + +
    +
    +
    +
    + + " > + " onclick="clearForm();" > +
    +
    +
    + state->get('search_field') + ); + ?> +
    +
    + lists['category'];?> +
    +
    + lists['stockroom_type']; ?> +
    +
    +
    + + + + + + + stockroom_type != 'product') : ?> + + + + stockroom);$j++) : ?> + + + + + + + resultlisting); $i < $n; $i++) : ?> + resultlisting [$i]; + $link1 = JRoute::_('index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $row->product_id); + ?> + "> + + + + stockroom_type != 'product') : ?> + + + + + stockroom); $j < $countStockRoom; $j++) : ?> + + stockroom_type != 'product') ? $row->section_id : $row->product_id; + + if (isset($this->quantities[$section_id . '.' . $this->stockroom[$j]->stockroom_id])) + { + $secrow = $this->quantities[$section_id . '.' . $this->stockroom[$j]->stockroom_id]; + $quantity = $secrow->quantity; + $preorder_stock = $secrow->preorder_stock; + $ordered_preorder = $secrow->ordered_preorder; + } + + $quntotal[$i][$j] = $quantity; + $preorder_stocktotal[$i][$j] = $preorder_stock; + ?> + + + + + + + stockroom); $j < $nj; $j++) + { + $qungrandtotal[$j] = 0; + $preorder_stockalltotal[$j] = 0; + + for ($i = 0, $ni = count($this->resultlisting); $i < $ni; $i++) + { + $qungrandtotal[$j] = $qungrandtotal[$j] + $quntotal[$i][$j]; + $preorder_stockalltotal[$j] = $preorder_stockalltotal[$j] + $preorder_stocktotal[$i][$j]; + } + } + + $colspan = ($this->stockroom_type == 'product') ? 3 : 5; + ?> + + + + stockroom); $j++) : ?> + + + + + + + + + + +
    + + + lists ['order_Dir'], + $this->lists ['order'] + ); + ?> + + lists ['order_Dir'], + $this->lists ['order'] + ); + ?> + + + + stockroom_type == 'property') : ?> + + stockroom_type == 'subproperty') : ?> + + + + stockroom[$j]->stockroom_name; ?> + + +
    + stockroom[$j]->stockroom_name;?> + +
    + pagination->getRowOffset($i); ?> + + + product_number; ?> + + + + product_name; ?> + + + stockroom_type == 'property') : ?> + property_number; ?> + stockroom_type == 'subproperty') : ?> + subattribute_color_number; ?> + + + stockroom_type == 'property') : ?> + property_name; ?> + stockroom_type == 'subproperty') : ?> + subattribute_color_name; ?> + + + + + + + + + 0) : ?> + ( ) + + +
    + + + + + +
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + +
    diff --git a/component/admin/views/stockroom_listing/tmpl/index.html b/component/admin/views/stockroom_listing/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/stockroom_listing/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/stockroom_listing/view.csv.php b/component/admin/views/stockroom_listing/view.csv.php new file mode 100644 index 00000000000..605c8eff346 --- /dev/null +++ b/component/admin/views/stockroom_listing/view.csv.php @@ -0,0 +1,157 @@ +getModel(); + + return $model->getCsvColumns(); + } + + /** + * Execute and display a template script. + * + * @param string $tpl The name of the template file to parse. + * + * @return mixed A string if successful, otherwise a Error object. + * + * @throws RuntimeException + */ + public function display($tpl = null) + { + // Get the columns + $columns = $this->getColumns(); + + if (empty($columns)) + { + throw new RuntimeException( + sprintf( + 'Empty columns not allowed for the csv view %s', + get_class($this) + ) + ); + } + + $model = $this->getModel(); + + // For additional filtering and formating if needed + $model->setState('streamOutput', 'csv'); + + // Prepare the items + $items = $model->getItems(); + $state = $this->get('State'); + $stockroom_type = $state->get('stockroom_type'); + $stockrooms = $this->get('Stockroom'); + $ids = array(); + + if ($stockroom_type != 'product') + { + $nameId = 'section_id'; + } + else + { + $nameId = 'product_id'; + unset($columns['section_id'], $columns['stockroom_type']); + } + + foreach ($items as $item) + { + $ids[] = $item->$nameId; + } + + $quantities = $model->getQuantity($stockroom_type, '', $ids); + + $csvLines[0] = $columns; + $i = 1; + + if ($stockrooms) + { + foreach ($stockrooms as $stockroom) + { + foreach ($items as $item) + { + if (!isset($quantities[$item->$nameId . '.' . $stockroom->stockroom_id])) + { + continue; + } + + $value = $quantities[$item->$nameId . '.' . $stockroom->stockroom_id]; + + foreach ($columns as $name => $title) + { + if (property_exists($value, $name)) + { + $csvLines[$i][$name] = $value->$name; + } + } + + $csvLines[$i]['stockroom_type'] = $state->get('stockroom_type'); + + foreach ($columns as $name => $title) + { + if (property_exists($item, $name)) + { + $csvLines[$i][$name] = $item->$name; + } + } + + $i++; + } + } + } + + $stream = $this->initFIle(); + + foreach ($csvLines as $line) + { + $orderLine = array(); + + foreach ($columns as $name => $title) + { + if (array_key_exists($name, $line)) + { + $orderLine[$name] = $line[$name]; + } + else + { + $orderLine[$name] = ''; + } + } + + fputcsv($stream, $orderLine, $this->delimiter, $this->enclosure); + } + + fclose($stream); + + JFactory::getApplication()->close(); + } +} diff --git a/component/admin/views/stockroom_listing/view.html.php b/component/admin/views/stockroom_listing/view.html.php new file mode 100644 index 00000000000..36cc347a8b6 --- /dev/null +++ b/component/admin/views/stockroom_listing/view.html.php @@ -0,0 +1,105 @@ +setTitle(JText::_('COM_REDSHOP_STOCKROOM_LISTING')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_STOCKROOM_LISTING_MANAGEMENT'), 'redshop_stockroom48'); + RedshopToolbarHelper::link('index.php?option=com_redshop&view=stockroom_listing&format=csv', 'save', JText::_('COM_REDSHOP_EXPORT_DATA_LBL')); + JToolBarHelper::custom('print_data', 'save.png', 'save_f2.png', 'Print Data', false); + + $this->state = $this->get('State'); + $stockroom_type = $this->state->get('stockroom_type'); + $category_id = $this->state->get('category_id'); + + // Stockroom type and attribute type + $optiontype = array(); + + $optiontype[] = JHTML::_('select.option', 'product', JText::_('COM_REDSHOP_PRODUCT')); + $optiontype[] = JHTML::_('select.option', 'property', JText::_('COM_REDSHOP_PROPERTY')); + $optiontype[] = JHTML::_('select.option', 'subproperty', JText::_('COM_REDSHOP_SUBPROPERTY')); + + $lists['stockroom_type'] = JHTML::_('select.genericlist', $optiontype, 'stockroom_type', + 'class="inputbox" size="1" onchange="document.adminForm.submit();" ', 'value', 'text', $stockroom_type + ); + + $categories = RedshopHelperCategory::getCategoryListArray(); + + if (is_null($categories)) + { + $categories = array(); + } + + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->id = "0"; + $temps[0]->name = JText::_('COM_REDSHOP_SELECT_CATEGORY'); + $categories = @array_merge($temps, $categories); + $lists['category'] = JHTML::_('select.genericlist', $categories, 'category_id', + 'class="inputbox" onchange="getTaskChange();document.adminForm.submit();" ', + 'id', 'name', $category_id + ); + + $lists ['order'] = $this->state->get('list.ordering', 'p.product_id'); + $lists ['order_Dir'] = $this->state->get('list.direction'); + + $resultlisting = $this->get('Items'); + $stockroom = $this->get('Stockroom'); + $pagination = $this->get('Pagination'); + $model = $this->getModel('stockroom_listing'); + $ids = array(); + + if ($resultlisting) + { + if ($stockroom_type != 'product') + { + $nameId = 'section_id'; + } + else + { + $nameId = 'product_id'; + } + + foreach ($resultlisting as $item) + { + $ids[] = $item->$nameId; + } + } + + $this->quantities = $model->getQuantity($stockroom_type, '', $ids); + + $this->lists = $lists; + $this->resultlisting = $resultlisting; + $this->stockroom = $stockroom; + $this->stockroom_type = $stockroom_type; + + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/supplier/index.html b/component/admin/views/supplier/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/supplier/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/supplier/tmpl/edit.php b/component/admin/views/supplier/tmpl/edit.php new file mode 100644 index 00000000000..19142b9be30 --- /dev/null +++ b/component/admin/views/supplier/tmpl/edit.php @@ -0,0 +1,12 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/supplier/tmpl/index.html b/component/admin/views/supplier/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/supplier/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/supplier/view.html.php b/component/admin/views/supplier/view.html.php new file mode 100644 index 00000000000..ee0dec61a25 --- /dev/null +++ b/component/admin/views/supplier/view.html.php @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/component/admin/views/suppliers/tmpl/default.php b/component/admin/views/suppliers/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/suppliers/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/suppliers/tmpl/index.html b/component/admin/views/suppliers/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/suppliers/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/suppliers/view.html.php b/component/admin/views/suppliers/view.html.php new file mode 100644 index 00000000000..a0285cac5cf --- /dev/null +++ b/component/admin/views/suppliers/view.html.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/component/admin/views/tax_group/tmpl/edit.php b/component/admin/views/tax_group/tmpl/edit.php new file mode 100644 index 00000000000..19142b9be30 --- /dev/null +++ b/component/admin/views/tax_group/tmpl/edit.php @@ -0,0 +1,12 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/tax_group/tmpl/index.html b/component/admin/views/tax_group/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/tax_group/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/tax_group/view.html.php b/component/admin/views/tax_group/view.html.php new file mode 100644 index 00000000000..0d50a9bde25 --- /dev/null +++ b/component/admin/views/tax_group/view.html.php @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/component/admin/views/tax_groups/tmpl/default.php b/component/admin/views/tax_groups/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/tax_groups/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/tax_groups/tmpl/index.html b/component/admin/views/tax_groups/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/tax_groups/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/tax_groups/view.html.php b/component/admin/views/tax_groups/view.html.php new file mode 100644 index 00000000000..577a0874545 --- /dev/null +++ b/component/admin/views/tax_groups/view.html.php @@ -0,0 +1,73 @@ +columns[] = array( + // This column is sortable? + 'sortable' => false, + // Text for column + 'text' => JText::_('COM_REDSHOP_TAX_RATE'), + // Name of property for get data. + 'dataCol' => 'tax_rates', + // Width of column + 'width' => '10%', + // Enable edit inline? + 'inline' => false, + // Display with edit link or not? + 'edit_link' => false, + // Type of column + 'type' => 'text', + ); + } + + /** + * Method for render 'Published' column + * + * @param array $config Row config. + * @param int $index Row index. + * @param object $row Row data. + * + * @return string + * + * @since 2.0.6 + */ + public function onRenderColumn($config, $index, $row) + { + if ($config['dataCol'] !== 'tax_rates') + { + return parent::onRenderColumn($config, $index, $row); + } + + $taxRates = RedshopEntityTax_Group::getInstance($row->id)->getTaxRates()->count(); + + return '' . $taxRates . ''; + } +} diff --git a/component/admin/views/tax_rate/index.html b/component/admin/views/tax_rate/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/tax_rate/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/tax_rate/tmpl/edit.php b/component/admin/views/tax_rate/tmpl/edit.php new file mode 100644 index 00000000000..c74e2bd2b3c --- /dev/null +++ b/component/admin/views/tax_rate/tmpl/edit.php @@ -0,0 +1,39 @@ +formLayout, array('data' => $this)); +?> + + diff --git a/component/admin/views/tax_rate/tmpl/index.html b/component/admin/views/tax_rate/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/tax_rate/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/tax_rate/view.html.php b/component/admin/views/tax_rate/view.html.php new file mode 100644 index 00000000000..6118675c4fd --- /dev/null +++ b/component/admin/views/tax_rate/view.html.php @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/component/admin/views/tax_rates/tmpl/default.php b/component/admin/views/tax_rates/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/tax_rates/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/tax_rates/tmpl/index.html b/component/admin/views/tax_rates/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/tax_rates/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/tax_rates/view.html.php b/component/admin/views/tax_rates/view.html.php new file mode 100644 index 00000000000..4d7fa370aa9 --- /dev/null +++ b/component/admin/views/tax_rates/view.html.php @@ -0,0 +1,60 @@ +{$config['dataCol']}; + + switch ($config['dataCol']) + { + case 'tax_group_id': + return '' + . $row->tax_group_name . ''; + + case 'tax_country': + return $row->country_name; + + case 'tax_state': + return $row->state_name; + + case 'tax_rate': + return number_format( + $value * 100, + 2, + Redshop::getConfig()->get('PRICE_SEPERATOR'), + Redshop::getConfig()->get('THOUSAND_SEPERATOR') + ) . ' %'; + + default: + return parent::onRenderColumn($config, $index, $row); + } + } +} diff --git a/component/admin/views/template/index.html b/component/admin/views/template/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/template/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/template/tmpl/edit.php b/component/admin/views/template/tmpl/edit.php new file mode 100644 index 00000000000..19c10d88cec --- /dev/null +++ b/component/admin/views/template/tmpl/edit.php @@ -0,0 +1,21 @@ + +
    +
    + formLayout, array('data' => $this)) ?> +
    +
    + item->section): ?> + loadTemplate('hints') ?> + +
    +
    diff --git a/component/admin/views/template/tmpl/edit_hints.php b/component/admin/views/template/tmpl/edit_hints.php new file mode 100644 index 00000000000..91b2363841f --- /dev/null +++ b/component/admin/views/template/tmpl/edit_hints.php @@ -0,0 +1,633 @@ + RedshopHelperText::getTextLibraryData('category'), + 'newsletter' => RedshopHelperText::getTextLibraryData('newsletter'), + 'product' => RedshopHelperText::getTextLibraryData('product') +); + +$newBillingTags = array( + 'billing_address_start' => '', + 'companyname_lbl' => '', + 'companyname' => '', + 'firstname_lbl' => '', + 'firstname' => '', + 'lastname_lbl' => '', + 'lastname' => '', + 'address_lbl' => '', + 'address' => '', + 'city_lbl' => '', + 'city' => '', + 'zip_lbl' => '', + 'zip' => '', + 'country_lbl' => '', + 'country' => '', + 'state_lbl' => '', + 'state' => '', + 'phone_lbl' => '', + 'phone' => '', + 'email_lbl' => '', + 'email' => '', + 'vatnumber_lbl' => '', + 'vatnumber' => '', + 'taxexempt_lbl' => '', + 'taxexempt' => '', + 'user_taxexempt_request_lbl' => '', + 'user_taxexempt_request' => '', + 'billing_extrafield' => '', + 'billing_address_end' => '' +); + +$newShippingTags = array( + 'shipping_address_start' => '', + 'companyname_lbl' => '', + 'companyname' => '', + 'firstname_lbl' => '', + 'firstname' => '', + 'lastname_lbl' => '', + 'lastname' => '', + 'address_lbl' => '', + 'address' => '', + 'city_lbl' => '', + 'city' => '', + 'zip_lbl' => '', + 'zip' => '', + 'country_lbl' => '', + 'country' => '', + 'state_lbl' => '', + 'state' => '', + 'phone_lbl' => '', + 'phone' => '', + 'shipping_extrafield' => '', + 'shipping_address_end' => '' +) +?> +
    +
    +

    +
    +
    +
    + +
    +
    +
    +
    + item->section) + { + case 'category': + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_CATEGORY, JText::_("COM_REDSHOP_FIELDS") + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_PRODUCT, JText::_("COM_REDSHOP_TEMPLATE_PRODUCT_FIELDS_TITLE") + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array( + 'tags' => RedshopHelperTemplate::getTemplateTags($this->item->section), + 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_CATEGORY_HINT') + ) + ); + + $addToCartAvailable = RedshopHelperTemplate::getTemplate('add_to_cart'); + $tags = array(); + foreach ($addToCartAvailable as $tag): + $tags['form_addtocart:' . $tag->name] = JText::_('COM_REDSHOP_ADD_TO_CART_TEMPLATE_AVAILABLE_HINT'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', + array( + 'tags' => $tags, + 'header' => JText::_('COM_REDSHOP_ADD_TO_CART') + ) + ); + + $availableTags = RedshopHelperTemplate::getTemplate('related_product'); + $tags = array(); + foreach ($availableTags as $tag): + $key = 'related_product_lightbox:' . $tag->name . '[:lightboxwidth][:lightboxheight]'; + $tags[$key] = JText::_("COM_REDSHOP_EXAMPLE_TEMPLATE") . ': {related_product_lightbox:' . $tag->name . ':600:300}'; + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_RELATED_PRODUCT_LIGHTBOX_TEMPLATE_AVAILABLE_HINT'))); + ?> +
    +

    + : +

    +
    + RedshopHelperTemplate::getTemplateTags($this->item->section), + 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_GIFTCARD_HINT') + ) + ); + + break; + case 'product': + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_PRODUCT, JText::_("COM_REDSHOP_PRODUCT_FIELDS") + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, JText::_("COM_REDSHOP_PRODUCT_USERFIELD") + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array( + 'tags' => RedshopHelperTemplate::getTemplateTags($this->item->section), + 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_PRODUCT_HINT') + ) + ); + + $addToCartAvailable = RedshopHelperTemplate::getTemplate('add_to_cart'); + $tags = array(); + foreach ($addToCartAvailable as $tag): + $tags['form_addtocart:' . $tag->name] = JText::_('COM_REDSHOP_ADD_TO_CART_TEMPLATE_AVAILABLE_HINT'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_ADD_TO_CART'))); + + $availableTags = RedshopHelperTemplate::getTemplate('attribute_template'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['attribute_template:' . $tag->name] = JText::_('COM_REDSHOP_ATTRIBUTE_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_HINT'))); + + $availableTags = RedshopHelperTemplate::getTemplate('attributewithcart_template'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['attributewithcart_template:' . $tag->name] = JText::_('COM_REDSHOP_ATTRIBUTE_WITH_CART_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_ATTRIBUTE_WITH_CART_HINT'))); + + $availableTags = RedshopHelperTemplate::getTemplate('related_product'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['related_product:' . $tag->name] = JText::_('COM_REDSHOP_RELATED_PRODUCT_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_RELATED_PRODUCT_HINT'))); + + $availableTags = RedshopHelperTemplate::getTemplate('wrapper_template'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['wrapper_template:' . $tag->name] = JText::_('COM_REDSHOP_WRAPPER_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_WRAPPER_HINT'))); + + break; + case 'product_sample': + echo RedshopHelperTemplate::renderFieldTagHints(RedshopHelperExtrafields::SECTION_COLOR_SAMPLE); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags($this->item->section)) + ); + + break; + case 'manufacturer': + echo RedshopHelperTemplate::renderFieldTagHints(RedshopHelperExtrafields::SECTION_MANUFACTURER); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags($this->item->section)) + ); + + break; + case 'manufacturer_products': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags($this->item->section)) + ); + + $addToCartAvailable = RedshopHelperTemplate::getTemplate('add_to_cart'); + $tags = array(); + foreach ($addToCartAvailable as $tag): + $tags['form_addtocart:' . $tag->name] = JText::_('COM_REDSHOP_ADD_TO_CART_TEMPLATE_AVAILABLE_HINT'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_ADD_TO_CART'))); + + break; + case 'categoryproduct': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('category_product')) + ); + + break; + case 'catalog': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('catalogue')) + ); + + break; + case 'order_detail': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('order_detail')) + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS, JText::_("COM_REDSHOP_CUSTOMER_SHIPPING_ADDRESS") + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS, JText::_("COM_REDSHOP_COMPANY_SHIPPING_ADDRESS") + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => $newBillingTags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_BILLING_HINT')) + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => $newShippingTags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_SHIPPING_HINT')) + ); + + break; + case 'order_receipt': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('order_receipt')) + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS, JText::_("COM_REDSHOP_CUSTOMER_SHIPPING_ADDRESS") + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS, JText::_("COM_REDSHOP_COMPANY_SHIPPING_ADDRESS") + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => $newBillingTags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_BILLING_HINT')) + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => $newShippingTags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_SHIPPING_HINT')) + ); + + break; + case 'order_print': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('order_print')) + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS, JText::_("COM_REDSHOP_CUSTOMER_SHIPPING_ADDRESS") + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS, JText::_("COM_REDSHOP_COMPANY_SHIPPING_ADDRESS") + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => $newBillingTags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_BILLING_HINT')) + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => $newShippingTags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_SHIPPING_HINT')) + ); + + break; + case 'order_list': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('orderlist')) + ); + + break; + case 'related_product': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('related_product')) + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_PRODUCT, JText::_("COM_REDSHOP_PRODUCT_FIELDS") + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, JText::_("COM_REDSHOP_PRODUCT_USERFIELD") + ); + + break; + case 'attribute_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('attribute')) + ); + + break; + case 'attributewithcart_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('attribute_with_cart')) + ); + + $availableTags = RedshopHelperTemplate::getTemplate('add_to_cart'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['form_addtocart:' . $tag->name] = JText::_('COM_REDSHOP_ADD_TO_CART_TEMPLATE_AVAILABLE_HINT'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_ADD_TO_CART'))); + break; + case 'accessory_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('accessory')) + ); + break; + case 'wrapper_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('wrapper')) + ); + + break; + case 'wishlist_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('wishlist')) + ); + + break; + case 'wishlist_mail_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('wishlist_mail')) + ); + + break; + case 'ask_question_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('ask_question')) + ); + + break; + case 'ajax_cart_detail_box': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array( + 'tags' => RedshopHelperTemplate::getTemplateTags('ajax_product'), + 'header' => JText::_('COM_REDSHOP_AJAX_CART_BOX_DETAIL_TEMPLATE_HINT') + ) + ); + + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_USER_INFORMATIONS + ); + + $availableTags = RedshopHelperTemplate::getTemplate('add_to_cart'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['form_addtocart:' . $tag->name] = JText::_('COM_REDSHOP_ADD_TO_CART_TEMPLATE_AVAILABLE_HINT'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_ADD_TO_CART'))); + + break; + case 'redproductfinder': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('redproductfinder')) + ); + + $availableTags = RedshopHelperTemplate::getTemplate('add_to_cart'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['form_addtocart:' . $tag->name] = JText::_('COM_REDSHOP_ADD_TO_CART_TEMPLATE_AVAILABLE_HINT'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_ADD_TO_CART'))); + + break; + case 'account_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('account')) + ); + break; + case 'shippingbox': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('shipping_box')) + ); + break; + case 'onestep_checkout': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('onestep_checkout')) + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => $newBillingTags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_BILLING_HINT')) + ); + + $availableTags = RedshopHelperTemplate::getTemplate('checkout'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['checkout_template:' . $tag->name] = JText::_('COM_REDSHOP_CHECKOUT_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags)); + + $availableTags = RedshopHelperTemplate::getTemplate('shippingbox'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['shippingbox_template:' . $tag->name] = JText::_('COM_REDSHOP_SHIPPING_BOX_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags)); + + $availableTags = RedshopHelperTemplate::getTemplate('redshop_shipping'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['shipping_template:' . $tag->name] = JText::_('COM_REDSHOP_SHIPPING_METHOD_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags)); + + $availableTags = RedshopHelperTemplate::getTemplate('redshop_payment'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['payment_template:' . $tag->name] = JText::_('COM_REDSHOP_PAYMENT_METHOD_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags)); + + break; + case 'change_cart_attribute': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('change_cart_attribute')) + ); + + $availableTags = RedshopHelperTemplate::getTemplate('attribute_template'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['attribute_template:' . $tag->name] = JText::_('COM_REDSHOP_ATTRIBUTE_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags)); + + $availableTags = RedshopHelperTemplate::getTemplate('attributewithcart_template'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['attributewithcart_template:' . $tag->name] = JText::_('COM_REDSHOP_ATTRIBUTE_WITH_CART_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags)); + + break; + case 'product_content_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('product_content')) + ); + + break; + case 'billing_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('billing')) + ); + + $availableTags = RedshopHelperTemplate::getTemplate('private_billing_template'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['private_billing_template:' . $tag->name] = JText::_('COM_REDSHOP_PRIVATE_BILLING_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_PRIVATE_BILLING_TEMPLATE'))); + + $availableTags = RedshopHelperTemplate::getTemplate('company_billing_template'); + $tags = array(); + foreach ($availableTags as $tag): + $tags['company_billing_template:' . $tag->name] = JText::_('COM_REDSHOP_COMPANY_BILLING_TEMPLATE'); + endforeach; + echo RedshopLayoutHelper::render('templates.tags_hint', array('tags' => $tags, 'header' => JText::_('COM_REDSHOP_COMPANY_BILLING_TEMPLATE'))); + + break; + case 'private_billing_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('private_billing')) + ); + + break; + case 'company_billing_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('company_billing')) + ); + echo RedshopHelperTemplate::renderFieldTagHints( + RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS, JText::_("COM_REDSHOP_FIELDS") + ); + + break; + case 'shipping_template': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('shipping')) + ); + + break; + case 'stock_note': + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags('stock_note')) + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => $newBillingTags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_BILLING_HINT')) + ); + + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => $newShippingTags, 'header' => JText::_('COM_REDSHOP_TEMPLATE_TAG_SHIPPING_HINT')) + ); + + break; + + default: + echo RedshopLayoutHelper::render( + 'templates.tags_hint', + array('tags' => RedshopHelperTemplate::getTemplateTags($this->item->section)) + ); + + break; + } + ?> +
    +
    + item->section, true); + ?> + + + +
    + $texts): ?> + +
    + + + + + + + + + +
    {name ?>}desc ?>
    +
    + + +
    +
    +
    +
    +
    +
    diff --git a/component/admin/views/template/tmpl/index.html b/component/admin/views/template/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/template/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/template/view.html.php b/component/admin/views/template/view.html.php new file mode 100644 index 00000000000..865a6c45ed7 --- /dev/null +++ b/component/admin/views/template/view.html.php @@ -0,0 +1,28 @@ + + + \ No newline at end of file diff --git a/component/admin/views/templates/tmpl/default.php b/component/admin/views/templates/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/templates/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/templates/tmpl/index.html b/component/admin/views/templates/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/templates/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/templates/view.html.php b/component/admin/views/templates/view.html.php new file mode 100644 index 00000000000..22ac0227a74 --- /dev/null +++ b/component/admin/views/templates/view.html.php @@ -0,0 +1,51 @@ +section); + + return is_string($return) ? $return : ''; + } + + return parent::onRenderColumn($config, $index, $row); + } +} diff --git a/component/admin/views/text/index.html b/component/admin/views/text/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/text/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/text/tmpl/edit.php b/component/admin/views/text/tmpl/edit.php new file mode 100644 index 00000000000..19142b9be30 --- /dev/null +++ b/component/admin/views/text/tmpl/edit.php @@ -0,0 +1,12 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/text/tmpl/index.html b/component/admin/views/text/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/text/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/text/view.html.php b/component/admin/views/text/view.html.php new file mode 100644 index 00000000000..29ef9fbed50 --- /dev/null +++ b/component/admin/views/text/view.html.php @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/component/admin/views/texts/tmpl/default.php b/component/admin/views/texts/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/texts/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/texts/tmpl/index.html b/component/admin/views/texts/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/texts/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/texts/view.html.php b/component/admin/views/texts/view.html.php new file mode 100644 index 00000000000..7fc23f9c3ac --- /dev/null +++ b/component/admin/views/texts/view.html.php @@ -0,0 +1,61 @@ +{$config['dataCol']}; + + if ($value == 'category') + { + return '' . JText::_('COM_REDSHOP_TEXT_SECTION_OPTION_CATEGORY') . ''; + } + elseif ($value == 'newsletter') + { + return '' . JText::_('COM_REDSHOP_TEXT_SECTION_OPTION_NEWSLETTER') . ''; + } + + return '' . JText::_('COM_REDSHOP_TEXT_SECTION_OPTION_PRODUCT') . ''; + } +} diff --git a/component/admin/views/tool_image/index.html b/component/admin/views/tool_image/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/tool_image/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/tool_image/tmpl/default.php b/component/admin/views/tool_image/tmpl/default.php new file mode 100644 index 00000000000..ed5d392bc30 --- /dev/null +++ b/component/admin/views/tool_image/tmpl/default.php @@ -0,0 +1,117 @@ + + + +
    +
    +
    +
    +

    + + +

    +
    +
    +
    +
    + + + +
    +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/component/admin/views/tool_image/tmpl/index.html b/component/admin/views/tool_image/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/tool_image/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/tool_image/view.html.php b/component/admin/views/tool_image/view.html.php new file mode 100644 index 00000000000..1fdc372bbbe --- /dev/null +++ b/component/admin/views/tool_image/view.html.php @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/component/admin/views/tool_update/tmpl/default.php b/component/admin/views/tool_update/tmpl/default.php new file mode 100644 index 00000000000..b5a0b2f6eae --- /dev/null +++ b/component/admin/views/tool_update/tmpl/default.php @@ -0,0 +1,192 @@ + + +
    + availableVersions)): ?> +
    + + +

    +
    + + + + + + + + + + + + availableVersions as $availableVersion): ?> + + + + + + + + + +
    + +   
    version ?> + + + +
      + tasks as $task): ?> +
    • + +
    +
    + + +
    + +
    diff --git a/component/admin/views/tool_update/tmpl/index.html b/component/admin/views/tool_update/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/tool_update/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/tool_update/view.html.php b/component/admin/views/tool_update/view.html.php new file mode 100644 index 00000000000..df7ff7372d0 --- /dev/null +++ b/component/admin/views/tool_update/view.html.php @@ -0,0 +1,49 @@ +getModel(); + + $this->availableVersions = $model->getAvailableUpdate(); + + JFactory::getDocument()->setTitle(JText::_('COM_REDSHOP_TOOL')); + JToolbarHelper::title(JText::_('COM_REDSHOP_TOOL')); + + // Display the template + parent::display($tpl); + } +} diff --git a/component/admin/views/user/index.html b/component/admin/views/user/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/user/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/user/tmpl/default.php b/component/admin/views/user/tmpl/default.php new file mode 100644 index 00000000000..e845f3b343a --- /dev/null +++ b/component/admin/views/user/tmpl/default.php @@ -0,0 +1,171 @@ +input->get('filter'); +$model = $this->getModel('user'); +?> + + +
    +
    +
    +
    + + "> + + +
    +
    + +
    + + lists ['shopper_group'];?> +
    +
    + + lists ['tax_exempt_request'];?> +
    +
    +
    + + + + + + + + + + + + + + + user); $i < $n; $i++) + { + $row = $this->user [$i]; + $row->id = $row->user_id; + + $link = RedshopHelperUtility::getSSLLink( + 'index.php?option=com_redshop&view=user_detail&task=edit&user_id=' . $row->id . '&cid[]=' . $row->users_info_id + ); + + $iscompany = JText::_('COM_REDSHOP_USER_CUSTOMER'); + + if ($row->is_company) + { + $iscompany = JText::_('COM_REDSHOP_USER_COMPANY'); + } + + $fisrt_name = '' . $row->firstname . ''; + $last_name = $row->lastname; + ?> + "> + + + + + + + + + + + + + + +
    lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']); ?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>lists ['order_Dir'], $this->lists ['order']);?>
    pagination->getRowOffset($i);?>users_info_id);?> username;?> + shopper_group_id); + + if (count($shoppergroup) > 0) + { + echo $shoppergroup[0]->text; + } + ?> + + users_info_id); + echo $producthelper->getProductFormattedPrice($totalsales); + ?> + users_info_id;?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?> +
    +
    + + + + + + +
    diff --git a/component/admin/views/user/tmpl/index.html b/component/admin/views/user/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/user/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/user/tmpl/user_sync.php b/component/admin/views/user/tmpl/user_sync.php new file mode 100644 index 00000000000..6140c4d65cc --- /dev/null +++ b/component/admin/views/user/tmpl/user_sync.php @@ -0,0 +1,50 @@ + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + sync_user) + { + echo ''; + echo JText::_("COM_REDSHOP_ADDED"); + echo ' ' . $this->sync_user . ' '; + echo JText::_("COM_REDSHOP_YES_SYNC"); + echo '.'; + } + else + { + echo ''; + echo JText::_('COM_REDSHOP_NO_SYNC'); + echo '!'; + } + ?> +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    diff --git a/component/admin/views/user/view.html.php b/component/admin/views/user/view.html.php new file mode 100644 index 00000000000..22f05124c0a --- /dev/null +++ b/component/admin/views/user/view.html.php @@ -0,0 +1,78 @@ +setTitle(JText::_('COM_REDSHOP_USER')); + + $userhelper = rsUserHelper::getInstance(); + + $this->state = $this->get('State'); + $sync = JFactory::getApplication()->input->get('sync'); + $spgrp_filter = $this->state->get('spgrp_filter'); + $tax_exempt_request_filter = $this->state->get('tax_exempt_request_filter'); + + if ($sync) + { + $this->setLayout('user_sync'); + $sync_user = RedshopInstall::synchronizeUser(); + $this->sync_user = $sync_user; + } + else + { + $this->setLayout('default'); + JToolBarHelper::title(JText::_('COM_REDSHOP_USER_MANAGEMENT'), 'users redshop_user48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + } + + $lists ['order'] = $this->state->get('list.ordering', 'users_info_id'); + $lists ['order_Dir'] = $this->state->get('list.direction'); + + $user = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $shopper_groups = Redshop\Helper\ShopperGroup::generateList(); + + $temps = array(); + $temps[0] = new stdClass; + $temps[0]->value = 0; + $temps[0]->text = JText::_('COM_REDSHOP_SELECT'); + $shopper_groups = array_merge($temps, $shopper_groups); + + $lists['shopper_group'] = JHTML::_('select.genericlist', $shopper_groups, 'spgrp_filter', + 'class="inputbox" size="1" onchange="document.adminForm.submit()"', 'value', 'text', $spgrp_filter + ); + + $optiontax_req = array(); + $optiontax_req[] = JHTML::_('select.option', 'select', JText::_('COM_REDSHOP_SELECT')); + $optiontax_req[] = JHTML::_('select.option', '1', JText::_('COM_REDSHOP_yes')); + $optiontax_req[] = JHTML::_('select.option', '0', JText::_('COM_REDSHOP_no')); + $lists['tax_exempt_request'] = JHTML::_('select.genericlist', $optiontax_req, 'tax_exempt_request_filter', + 'class="inputbox" size="1" onchange="document.adminForm.submit()"', 'value', 'text', $tax_exempt_request_filter + ); + + $this->lists = $lists; + $this->user = $user; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/user_detail/index.html b/component/admin/views/user_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/user_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/user_detail/tmpl/default.php b/component/admin/views/user_detail/tmpl/default.php new file mode 100644 index 00000000000..4ef2a077454 --- /dev/null +++ b/component/admin/views/user_detail/tmpl/default.php @@ -0,0 +1,203 @@ +input; +$this->producthelper = productHelper::getInstance(); +$this->order_functions = order_functions::getInstance(); +$this->config = Redconfiguration::getInstance(); +$this->model = $this->getModel('user_detail'); +$this->flag = $jinput->getString('flag', ''); +$this->shipping = $jinput->getString('shipping', ''); +$cancel = $jinput->getString('cancel', ''); +$this->silerntuser = ($this->detail->users_info_id) ? true : false; + +if ($this->detail->users_info_id && $this->detail->user_id && $this->detail->username) +{ + $this->silerntuser = false; +} + +/* + set selected tab index + 0 default + 2 for shipping + 3 for order + */ +$tab = 0; + +if ($cancel) +{ + $tab = 2; +} + +if ($this->pagination->limitstart > 0) +{ + $tab = 3; +} +?> + + +
    + $tab)); + + if (!$this->shipping) + { + // Create 1st Tab + echo JHtml::_('tabs.panel', JText::_('COM_REDSHOP_GENERAL_USER_INFO'), 'tab1'); + echo $this->loadTemplate('user'); + } + + $title = ($this->shipping == 1) ? JText::_('COM_REDSHOP_SHIPPING_INFORMATION') : JText::_('COM_REDSHOP_BILLING_INFORMATION'); + echo JHtml::_('tabs.panel', $title, 'tab2'); + echo $this->loadTemplate('billing'); + + if (!$this->shipping && $this->detail->user_id != 0 || $cancel == 1) + { + echo JHtml::_('tabs.panel', JText::_('COM_REDSHOP_SHIPPING_INFORMATION'), 'tab3'); + echo $this->loadTemplate('shipping'); + } + + $this->userorders = $this->model->userOrders(); + + if ($this->detail->user_id && count($this->userorders) > 0) + { + echo JHtml::_('tabs.panel', JText::_('COM_REDSHOP_ORDER_INFORMATION'), 'tab4'); + echo $this->loadTemplate('order'); + } + + if ($this->lists['extra_field'] != "") + { + echo JHtml::_('tabs.panel', JText::_('COM_REDSHOP_EXTRA_FIELD'), 'tab5'); ?> +
    lists ['extra_field']; ?>
    '; + echo ''; + } + + // Echo plugin tabs. + $this->dispatcher->trigger('onDisplayUserTabs', array($this->detail)); + + echo JHtml::_('tabs.end'); + + if ($this->shipping) + { + $info_id = $jinput->getString('info_id', ''); + echo ' + + '; + } + else + { + echo ''; + } +?> +
    + + + + +
    diff --git a/component/admin/views/user_detail/tmpl/default_billing.php b/component/admin/views/user_detail/tmpl/default_billing.php new file mode 100644 index 00000000000..9d202e6aef2 --- /dev/null +++ b/component/admin/views/user_detail/tmpl/default_billing.php @@ -0,0 +1,168 @@ +setUserState('com_redshop.user_detail.data', ""); + +$allowCustomer = ''; +$allowCompany = ''; + +if (!$this->shipping && $this->detail->is_company == 1) +{ + $allowCustomer = 'style="display:none;"'; +} +else +{ + $allowCompany = 'style="display:none;"'; +} + +$countrystyle = (isset($this->showcountry) && $this->showcountry == 0) ? ' style="display:none;" ' : ''; +$statestyle = (isset($this->showstates) && $this->showstates == 0) ? ' style="display:none;" ' : ''; +?> +
    + + + + + + + + + + > + + + + + + + + + + + + > + + + + > + + + + + + + + + + + + > + + + + get('USE_TAX_EXEMPT') == 1) + { + ?> + > + + + + > + + + + > + + + + > + + + + + + + + shipping) + { + ?> + + + + + + + + + + +
    + : +
    : + +
    :
    : + +
    : + +
    :lists['country_code']; ?> +
    +
    >:
    +
    +
    >lists['state_code']; ?> +
    +
    : + +
    :
    :
    : + +
    :lists['requesting_tax_exempt']; ?> +
    :lists['tax_exempt_approved']; ?> + +
    + shipping)): ?> + detail->is_company == 1): ?> + lists['shipping_company_field'] != ""): ?> +
    lists['shipping_company_field'] ?>
    + + + lists['shipping_customer_field'] != ""): ?> +
    lists['shipping_customer_field'] ?>
    + + + + lists['company_field'] != ""): ?> +
    > + lists['company_field'] ?> +
    + + lists['customer_field'] != ""): ?> +
    > + lists['customer_field'] ?> +
    + + +
    +
    diff --git a/component/admin/views/user_detail/tmpl/default_order.php b/component/admin/views/user_detail/tmpl/default_order.php new file mode 100644 index 00000000000..b7646d64272 --- /dev/null +++ b/component/admin/views/user_detail/tmpl/default_order.php @@ -0,0 +1,52 @@ + +
    + + + + + + + + + + + + userorders); $i++) + { + $row = $this->userorders[$i]; + $row->id = $row->order_id; + $link = JRoute::_('index.php?option=com_redshop&view=order_detail&task=edit&cid[]=' . $row->order_id); ?> + + + + + + + + + + + + +
    pagination->getRowOffset($i);?> + order_id;?>order_number; ?>config->convertDateFormat($row->cdate); ?>producthelper->getProductFormattedPrice($row->order_total);?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    diff --git a/component/admin/views/user_detail/tmpl/default_shipping.php b/component/admin/views/user_detail/tmpl/default_shipping.php new file mode 100644 index 00000000000..fb004177428 --- /dev/null +++ b/component/admin/views/user_detail/tmpl/default_shipping.php @@ -0,0 +1,49 @@ +order_functions->getShippingAddress($this->detail->user_id); + +$addlink = JRoute::_('index.php?option=com_redshop&view=user_detail&task=edit&shipping=1&info_id=' . $this->detail->users_info_id . '&cid[]=0'); +?> +
    + +
    + + + + + + + + + + detail->users_info_id . '&cid[]=' . $row->users_info_id); + $link_delete = JRoute::_('index.php?option=com_redshop&view=user_detail&task=remove&shipping=1&info_id=' . $this->detail->users_info_id . '&cid[]=' . $row->users_info_id); ?> + "> + + + + + + +
    firstname;?> + lastname;?>users_info_id;?> +
    +
    diff --git a/component/admin/views/user_detail/tmpl/default_user.php b/component/admin/views/user_detail/tmpl/default_user.php new file mode 100644 index 00000000000..b8e439164a2 --- /dev/null +++ b/component/admin/views/user_detail/tmpl/default_user.php @@ -0,0 +1,76 @@ + +
    +
    + + + + silerntuser) + { + ?> + + + + + + + + + + + + + + + + + + + + + + silerntuser) + { + ?> + + + + + + + + + + + + + + + + + +
    : + + *
    +
    : + + *
    lists['shopper_group']; ?> +
    detail->user_groups, true); ?> +
    lists['block']; ?>
    lists['is_company']; ?>
    lists['sendEmail']; ?>
    +
    +
    diff --git a/component/admin/views/user_detail/tmpl/index.html b/component/admin/views/user_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/user_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/user_detail/view.html.php b/component/admin/views/user_detail/view.html.php new file mode 100644 index 00000000000..3eea8f272eb --- /dev/null +++ b/component/admin/views/user_detail/view.html.php @@ -0,0 +1,163 @@ +dispatcher = RedshopHelperUtility::getDispatcher(); + + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/json.min.js', false, true); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.validation.min.js', false, true); + + $this->setLayout('default'); + + $this->lists = array(); + $this->detail = $this->get('data'); + + $isNew = ($this->detail->users_info_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + if (JFactory::getApplication()->input->getString('shipping')) + { + JToolbarHelper::title( + JText::_('COM_REDSHOP_USER_SHIPPING_DETAIL') . ': [ ' + . $text . ' ]', 'user redshop_user48' + ); + } + else + { + JToolbarHelper::title( + JText::_('COM_REDSHOP_USER_MANAGEMENT_DETAIL') . ': [ ' + . $text . ' ]', 'user redshop_user48' + ); + } + + JToolbarHelper::apply(); + JToolbarHelper::save(); + + if ($isNew) + { + JToolbarHelper::cancel(); + } + else + { + JToolbarHelper::custom('order', 'redshop_order32', '', JText::_('COM_REDSHOP_PLACE_ORDER'), false); + JToolbarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $this->pagination = $this->get('Pagination'); + $this->detail->user_groups = RedshopHelperUser::getUserGroups($this->detail->users_info_id); + $this->lists['shopper_group'] = RedshopHelperShopper_Group::listAll("shopper_group_id", 0, array((int) $this->detail->shopper_group_id)); + + $this->lists['tax_exempt'] = JHtml::_('select.booleanlist', 'tax_exempt', 'class="inputbox"', $this->detail->tax_exempt); + $this->lists['block'] = JHtml::_('select.booleanlist', 'block', 'class="inputbox"', $this->detail->block); + + $this->lists['tax_exempt_approved'] = JHtml::_( + 'select.booleanlist', 'tax_exempt_approved', 'class="inputbox"', $this->detail->tax_exempt_approved + ); + + $this->lists['requesting_tax_exempt'] = JHtml::_( + 'select.booleanlist', 'requesting_tax_exempt', 'class="inputbox"', $this->detail->requesting_tax_exempt + ); + + $this->lists['is_company'] = JHtml::_( + 'select.booleanlist', + 'is_company', + 'class="inputbox" onchange="showOfflineCompanyOrCustomer(this.value);" ', + $this->detail->is_company, + JText::_('COM_REDSHOP_USER_COMPANY'), + JText::_('COM_REDSHOP_USER_CUSTOMER') + ); + + $this->lists['sendEmail'] = JHtml::_('select.booleanlist', 'sendEmail', 'class="inputbox"', $this->detail->sendEmail); + + $this->lists['extra_field'] = RedshopHelperExtrafields::listAllField( + RedshopHelperExtrafields::SECTION_USER_INFORMATIONS, $this->detail->users_info_id + ); + + $this->lists['customer_field'] = RedshopHelperExtrafields::listAllField( + RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS, $this->detail->users_info_id + ); + + $this->lists['company_field'] = RedshopHelperExtrafields::listAllField( + RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS, $this->detail->users_info_id + ); + + $this->lists['shipping_customer_field'] = RedshopHelperExtrafields::listAllField( + RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS, $this->detail->users_info_id + ); + + $this->lists['shipping_company_field'] = RedshopHelperExtrafields::listAllField( + RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS, $this->detail->users_info_id + ); + + $countries = RedshopHelperWorld::getCountryList((array) $this->detail); + $this->detail->country_code = $countries['country_code']; + $this->lists['country_code'] = $countries['country_dropdown']; + + $states = RedshopHelperWorld::getStateList((array) $this->detail); + $this->lists['state_code'] = $states['state_dropdown']; + + $this->request_url = JUri::getInstance()->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/voucher/index.html b/component/admin/views/voucher/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/voucher/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/voucher/tmpl/edit.php b/component/admin/views/voucher/tmpl/edit.php new file mode 100644 index 00000000000..19142b9be30 --- /dev/null +++ b/component/admin/views/voucher/tmpl/edit.php @@ -0,0 +1,12 @@ +formLayout, array('data' => $this)); diff --git a/component/admin/views/voucher/tmpl/index.html b/component/admin/views/voucher/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/voucher/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/voucher/view.html.php b/component/admin/views/voucher/view.html.php new file mode 100644 index 00000000000..4498df7e787 --- /dev/null +++ b/component/admin/views/voucher/view.html.php @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/component/admin/views/vouchers/tmpl/default.php b/component/admin/views/vouchers/tmpl/default.php new file mode 100644 index 00000000000..450631c17b3 --- /dev/null +++ b/component/admin/views/vouchers/tmpl/default.php @@ -0,0 +1,11 @@ + $this)); diff --git a/component/admin/views/vouchers/tmpl/index.html b/component/admin/views/vouchers/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/admin/views/vouchers/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/admin/views/vouchers/view.html.php b/component/admin/views/vouchers/view.html.php new file mode 100644 index 00000000000..d87b840198c --- /dev/null +++ b/component/admin/views/vouchers/view.html.php @@ -0,0 +1,76 @@ +checked_out && JFactory::getUser()->id != $row->checked_out; + $isInline = Redshop::getConfig()->getBool('INLINE_EDITING'); + $value = $row->{$config['dataCol']}; + + switch ($config['dataCol']) + { + case 'amount': + if (!$isCheckedOut && $isInline && $this->canEdit && $config['inline'] === true) + { + $display = RedshopHelperProductPrice::formattedPrice($value); + + return JHtml::_('redshopgrid.inline', $config['dataCol'], $value, $display, $row->id, 'number'); + } + + return RedshopHelperProductPrice::formattedPrice($value); + + case 'free_ship': + if ($value) + { + return ''; + } + + return ''; + + case 'start_date': + case 'end_date': + if ($value === '0000-00-00 00:00:00') + { + return ''; + } + + $tz = new \DateTimeZone(\JFactory::getConfig()->get('offset')); + $date = date_create_from_format('Y-m-d H:i:s', $value, new \DateTimeZone('UTC')); + + return $date->setTimezone($tz)->format(Redshop::getConfig()->get('DEFAULT_DATEFORMAT', 'd-m-Y')); + + default: + return parent::onRenderColumn($config, $index, $row); + } + } +} diff --git a/component/admin/views/wizard/index.html b/component/admin/views/wizard/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/wizard/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/wizard/tmpl/default.php b/component/admin/views/wizard/tmpl/default.php new file mode 100644 index 00000000000..3404a221438 --- /dev/null +++ b/component/admin/views/wizard/tmpl/default.php @@ -0,0 +1,10 @@ + diff --git a/component/admin/views/wizard/tmpl/finish.php b/component/admin/views/wizard/tmpl/finish.php new file mode 100644 index 00000000000..ba49e9dade0 --- /dev/null +++ b/component/admin/views/wizard/tmpl/finish.php @@ -0,0 +1,35 @@ +input->get('params', '', 'raw'); +?> +
    +
    + + + + + + + + + + +
    +
    +
    + + + + +
    +
    +
    diff --git a/component/admin/views/wizard/tmpl/general.php b/component/admin/views/wizard/tmpl/general.php new file mode 100644 index 00000000000..57dd3c1ab72 --- /dev/null +++ b/component/admin/views/wizard/tmpl/general.php @@ -0,0 +1,184 @@ +input->get('params', '', 'raw'); +?> + +
    +
    +
     
    +
    +
     
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + + + +
     
    + +
    + + + + +
     
    + +
    + + + + lists ['shop_country'];?> +
    + + + + lists ['default_shipping_country']; ?> +
     
    + +
    + + + lists ['country_list'];?>
     
    + +
    + + + + lists ['default_dateformat']; ?> +
     
    + +
    + + + lists ['invoice_mail_enable'];?>
    + + + lists ['invoice_mail_send_option'];?>
    + + + + +
    +
    +
    +
    + diff --git a/component/admin/views/wizard/tmpl/index.html b/component/admin/views/wizard/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/wizard/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/wizard/tmpl/price.php b/component/admin/views/wizard/tmpl/price.php new file mode 100644 index 00000000000..167f2818839 --- /dev/null +++ b/component/admin/views/wizard/tmpl/price.php @@ -0,0 +1,38 @@ +input->get('params', '', 'raw'); +?> + +
    +
    +
    +
    + + loadTemplate('price'); ?> +
    +
    + + loadTemplate('vat'); ?> +
    +
    +
    +
    + + loadTemplate('discount'); ?> +
    +
    +
    + + + + +
    diff --git a/component/admin/views/wizard/tmpl/price_discount.php b/component/admin/views/wizard/tmpl/price_discount.php new file mode 100644 index 00000000000..906333f2045 --- /dev/null +++ b/component/admin/views/wizard/tmpl/price_discount.php @@ -0,0 +1,103 @@ + +
    + +
    +
     
    +
    + + + + + + + + +
    + +
    + + + + lists ['discount_enable']; ?>
    +
    +
    + + + + + + + + +
    + +
    + + + lists ['coupons_enable'];?>
    +
    +
    + + + + + + + + +
    + +
    + + + lists ['vouchers_enable'];?>
    +
    +
    + + + + + + + + +
    + +
    + + + + lists ['discount_type'];?>
    +
    + +
    + + + + + + + + +
    + +
    + + + lists['shipping_after'];?>
    +
    diff --git a/component/admin/views/wizard/tmpl/price_price.php b/component/admin/views/wizard/tmpl/price_price.php new file mode 100644 index 00000000000..47db763df42 --- /dev/null +++ b/component/admin/views/wizard/tmpl/price_price.php @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    + +
    + + + + lists ['currency_data'];?> +
    + + + + +
     
    + +
    + + + + +
    + + + + +
    + + + + +
    diff --git a/component/admin/views/wizard/tmpl/price_vat.php b/component/admin/views/wizard/tmpl/price_vat.php new file mode 100644 index 00000000000..55664d3ee00 --- /dev/null +++ b/component/admin/views/wizard/tmpl/price_vat.php @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + lists ['default_vat_country']; + ?>
    + lists ['default_vat_state']; + ?>
    lists ['calculate_vat_on']; + ?> +
     
    + +
    + +
      +
      + taxrates); $i++) + { + $tax = $this->taxrates [$i]; + + $tax_rate_id = $tax->id; + $tax_country = $tax->tax_country; + $tax_rate = $tax->tax_rate; + $tax_group_id = $tax->tax_group_id; + + $rate_html = $tax_country . " (" . $tax_rate . ")"; + ?> +
    1. + + + + Remove +
    2. + + + +
    +
     
    + +
    lists ['apply_vat_on_discount']; + ?> +
    diff --git a/component/admin/views/wizard/tmpl/terms.php b/component/admin/views/wizard/tmpl/terms.php new file mode 100644 index 00000000000..c59d497928c --- /dev/null +++ b/component/admin/views/wizard/tmpl/terms.php @@ -0,0 +1,80 @@ +input->get('params', '', 'raw'); +?> +
    +
    + + + + + + + + + + + + + + + +
    + +
    + + + + temparray['TERMS_ARTICLE_ID']; + if ($article_id) + { + $article->load($article_id); + } + else + { + $article->title = JText::_('COM_REDSHOP_SELECT_AN_ARTICLE'); + } + $js = " + function jSelectArticle_terms_article_id(id, title, catid) { + document.getElementById('terms_article_id_id').value = id; + document.getElementById('terms_article_id_name').value = title; + SqueezeBox.close(); + }"; + $doc->addScriptDeclaration($js); + + $link = 'index.php?option=com_content&view=articles&layout=modal&tmpl=component&function=jSelectArticle_terms_article_id'; + JHtml::_('behavior.modal', 'a.joom-box'); + $html = "\n" . '
    '; + $html .= '' . "\n"; + $html .= "\n" . ''; + + echo $html; + ?> +
    + + + +
    + + + + +
    +
    +
    diff --git a/component/admin/views/wizard/tmpl/user.php b/component/admin/views/wizard/tmpl/user.php new file mode 100644 index 00000000000..9f51f83791e --- /dev/null +++ b/component/admin/views/wizard/tmpl/user.php @@ -0,0 +1,33 @@ +input->get('params', '', 'raw'); +?> +
    +
    + + + + + + + +
    +
    + + loadTemplate('registration');?> +
    +
    + + + + +
    +
    +
    diff --git a/component/admin/views/wizard/tmpl/user_registration.php b/component/admin/views/wizard/tmpl/user_registration.php new file mode 100644 index 00000000000..633000ce205 --- /dev/null +++ b/component/admin/views/wizard/tmpl/user_registration.php @@ -0,0 +1,107 @@ + +
     
    +
    + + + + + + + + +
    + +
    + + + + lists ['register_method']; ?> +
    +
    +
     
    +
    + + + + + + + + +
    + +
    + + : + + +
    +
    +get('ALLOW_CUSTOMER_REGISTER_TYPE') != 2) +{ + ?> +
     
    +
    + + + + + + + + +
    + +
    + + : + + +
    +
    +get('ALLOW_CUSTOMER_REGISTER_TYPE') != 1) +{ + ?> +
     
    +
    + + + + + + + + +
    + +
    + + : + + +
    +
    + diff --git a/component/admin/views/wizard/tmpl/user_shopper_group.php b/component/admin/views/wizard/tmpl/user_shopper_group.php new file mode 100644 index 00000000000..eb6aa814ff2 --- /dev/null +++ b/component/admin/views/wizard/tmpl/user_shopper_group.php @@ -0,0 +1,109 @@ +root(); +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + get('DEFAULT_PORTAL_LOGO'); ?> + + + +
    + lists ['portalshop']; + ?>
    + lists ['url_after_portal_login']; + ?>
    + lists ['url_after_portal_logout']; + ?>
    + +
    + lists ['shopper_group_default_private']; + + ?>
    + lists ['shopper_group_default_company']; + + ?>
    + +
    + + +
    diff --git a/component/admin/views/wizard/tmpl/welcome.php b/component/admin/views/wizard/tmpl/welcome.php new file mode 100644 index 00000000000..5cc52ed5249 --- /dev/null +++ b/component/admin/views/wizard/tmpl/welcome.php @@ -0,0 +1,48 @@ + +
    +
    + + website'; + $forum_link = 'redSHOP - redCOMPONENT Forum'; + $contact_link = 'redCOMPONENT'; + $learn_more_link = 'redcomponent.com'; + + ?> +
    +
     
    +
    +
     
    +
    + + + +
    +
    +
    + +
    + +
    +

    :

    + + + +
    + +
    + + +
    diff --git a/component/admin/views/wizard/view.html.php b/component/admin/views/wizard/view.html.php new file mode 100644 index 00000000000..805325db4f4 --- /dev/null +++ b/component/admin/views/wizard/view.html.php @@ -0,0 +1,299 @@ +get('redshop.wizard', false); + + // If it's not created than use distribute config file + if ($wizardConfig === false) + { + $config = JPATH_BASE . '/components/com_redshop/config/config.dist.php'; + + if (JFile::exists($config)) + { + // Only load this file if this class is not declared + if (!class_exists('RedshopConfig')) + { + require_once $config; + } + + $distConfig = new RedshopConfig; + $wizardConfig = get_object_vars($distConfig); + } + else + { + $wizardConfig = array(); + } + + // Save back to session + $session->set('redshop.wizard', $wizardConfig); + } + + // Set to view variable to use in tmpl files + $this->temparray = $wizardConfig; + + $uri = JUri::getInstance(); + $db = JFactory::getDbo(); + $config = Redconfiguration::getInstance(); + $model = $this->getModel(); + $document = JFactory::getDocument(); + + $document->setTitle(JText::_('COM_REDSHOP_CONFIG')); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.validation.min.js', false, true); + /** @scrutinizer ignore-deprecated */ + JHtml::stylesheet('com_redshop/redshop.min.css', array(), true); + /** @scrutinizer ignore-deprecated */ + JHtml::stylesheet('com_redshop/redshop.wizard.min.css', array(), true); + + // Shop country + $q = "SELECT country_3_code as value,country_name as text,country_jtext from #__redshop_country ORDER BY country_name ASC"; + $db->setQuery($q); + $countries = $db->loadObjectList(); + $countries = RedshopHelperUtility::convertLanguageString($countries); + + $lists['shop_country'] = JHtml::_('select.genericlist', $countries, 'shop_country', + 'class="inputbox" size="1" ', 'value', 'text', $this->temparray['SHOP_COUNTRY'] + ); + + // Shipping Country Start + $lists['default_shipping_country'] = JHtml::_('select.genericlist', $countries, 'default_shipping_country', + 'class="inputbox" size="1" ', 'value', 'text', $this->temparray['DEFAULT_SHIPPING_COUNTRY'] + ); + + // Date Formats + $default_dateformat = $config->getDateFormat(); + $lists['default_dateformat'] = JHtml::_('select.genericlist', $default_dateformat, 'default_dateformat', + 'class="inputbox" ', 'value', 'text', $this->temparray['DEFAULT_DATEFORMAT'] + ); + + // Country lists + $country_list = explode(',', $this->temparray['COUNTRY_LIST']); + $lists['country_list'] = JHtml::_('select.genericlist', $countries, 'country_list[]', + 'class="inputbox disableBootstrapChosen" multiple="multiple" size="5"', 'value', 'text', $country_list + ); + + // Invoice mail enable + $lists['invoice_mail_enable'] = JHtml::_('redshopselect.booleanlist', 'invoice_mail_enable', + 'class="inputbox" onchange="enableInvoice(this.value);"', $this->temparray['INVOICE_MAIL_ENABLE'] + ); + + // Invoice mail send type + $invoice_mail_send_option = array(); + $invoice_mail_send_option[0] = new stdClass; + $invoice_mail_send_option[0]->value = 0; + $invoice_mail_send_option[0]->text = JText::_('COM_REDSHOP_SELECT'); + + $invoice_mail_send_option[1] = new stdClass; + $invoice_mail_send_option[1]->value = 1; + $invoice_mail_send_option[1]->text = JText::_('COM_REDSHOP_ADMINISTRATOR'); + + $invoice_mail_send_option[2] = new stdClass; + $invoice_mail_send_option[2]->value = 2; + $invoice_mail_send_option[2]->text = JText::_('COM_REDSHOP_CUSTOMER'); + + $invoice_mail_send_option[3] = new stdClass; + $invoice_mail_send_option[3]->value = 3; + $invoice_mail_send_option[3]->text = JText::_('COM_REDSHOP_BOTH'); + + $lists['invoice_mail_send_option'] = JHtml::_('select.genericlist', $invoice_mail_send_option, 'invoice_mail_send_option', + 'class="inputbox" ', 'value', 'text', $this->temparray['INVOICE_MAIL_SEND_OPTION'] + ); + + // Registration methods + $register_methods = array(); + $register_methods[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_REGISTER_WITH_ACCOUNT_CREATION')); + $register_methods[] = JHtml::_('select.option', '1', JText::_('COM_REDSHOP_REGISTER_WITHOUT_ACCOUNT_CREATION')); + $register_methods[] = JHtml::_('select.option', '2', JText::_('COM_REDSHOP_REGISTER_ACCOUNT_OPTIONAL')); + $register_methods[] = JHtml::_('select.option', '3', JText::_('COM_REDSHOP_REGISTER_ACCOUNT_SILENT')); + $lists['register_method'] = JHtml::_('select.genericlist', $register_methods, 'register_method', + 'class="inputbox" id="register_method"', 'value', 'text', $this->temparray['REGISTER_METHOD'] + ); + unset($register_methods); + + // Currency data + $currency_data = $model->getCurrency(); + $lists['currency_data'] = JHtml::_('select.genericlist', $currency_data, 'currency_code', + 'class="inputbox" size="1" ', 'value', 'text', $this->temparray['CURRENCY_CODE'] + ); + + // Discount + $discount_type = array(); + + $discount_type[0] = new stdClass; + $discount_type[0]->value = 0; + $discount_type[0]->text = JText::_('COM_REDSHOP_SELECT'); + + $discount_type[1] = new stdClass; + $discount_type[1]->value = 1; + $discount_type[1]->text = JText::_('COM_REDSHOP_DISCOUNT_OR_VOUCHER_OR_COUPON'); + + $discount_type[2] = new stdClass; + $discount_type[2]->value = 2; + $discount_type[2]->text = JText::_('COM_REDSHOP_DISCOUNT_VOUCHER_OR_COUPON'); + + $discount_type[3] = new stdClass; + $discount_type[3]->value = 3; + $discount_type[3]->text = JText::_('COM_REDSHOP_DISCOUNT_VOUCHER_COUPON'); + + $discount_type[4] = new stdClass; + $discount_type[4]->value = 4; + $discount_type[4]->text = JText::_('COM_REDSHOP_DISCOUNT_VOUCHER_COUPON_MULTIPLE'); + + $lists['discount_type'] = JHtml::_('select.genericlist', $discount_type, 'discount_type', + 'class="inputbox" ', 'value', 'text', $this->temparray['DISCOUNT_TYPE'] + ); + $lists['discount_enable'] = JHtml::_('redshopselect.booleanlist', 'discount_enable', 'class="inputbox" ', $this->temparray['DISCOUNT_ENABLE']); + $lists['coupons_enable'] = JHtml::_('redshopselect.booleanlist', 'coupons_enable', 'class="inputbox" ', $this->temparray['COUPONS_ENABLE']); + $lists['vouchers_enable'] = JHtml::_('redshopselect.booleanlist', 'vouchers_enable', 'class="inputbox" ', $this->temparray['VOUCHERS_ENABLE']); + + // Discount after Shipping + $shipping_after = $this->temparray['SHIPPING_AFTER']; + $lists['shipping_after'] = RedshopHelperExtrafields::rsBooleanList('shipping_after', 'class="inputbox"', $shipping_after, + $yes = JText::_('COM_REDSHOP_TOTAL'), $no = JText::_('COM_REDSHOP_SUBTOTAL_LBL'), '', 'total', 'subtotal' + ); + + // Vat Country + $tmp = array(); + $tmp[] = JHtml::_('select.option', '', JText::_('COM_REDSHOP_SELECT')); + $default_vat_country = @array_merge($tmp, $countries); + $lists['default_vat_country'] = JHtml::_('select.genericlist', $default_vat_country, 'default_vat_country', + 'class="inputbox" onchange="changeStateList();"', 'value', 'text', $this->temparray['DEFAULT_VAT_COUNTRY'] + ); + + // VAT States + $country_list_name = 'default_vat_country'; + $state_list_name = 'default_vat_state'; + $selected_country_code = $this->temparray['DEFAULT_VAT_COUNTRY']; + $selected_state_code = $this->temparray['DEFAULT_VAT_STATE']; + + if (empty($selected_state_code)) + { + $selected_state_code = "originalPos"; + } + else + { + $selected_state_code = "'" . $selected_state_code . "'"; + } + + $db->setQuery("SELECT c.id, c.country_3_code, s.state_name, s.state_2_code + FROM #__redshop_country c + LEFT JOIN #__redshop_state s + ON c.id=s.country_id OR s.country_id IS NULL + ORDER BY c.id, s.state_name" + ); + + $states = $db->loadObjectList(); + + // Build the State lists for each Country + $script = ""; + $lists['default_vat_state'] = $script; + + $lists['apply_vat_on_discount'] = JHtml::_('redshopselect.booleanlist', 'apply_vat_on_discount', + 'class="inputbox" size="1"', $this->temparray['APPLY_VAT_ON_DISCOUNT'] + ); + + $calculate_vat_on = $this->temparray['CALCULATE_VAT_ON']; + $lists['calculate_vat_on'] = RedshopHelperExtrafields::rsBooleanList('calculate_vat_on', + 'class="inputbox"', $calculate_vat_on, + $yes = JText::_('COM_REDSHOP_BILLING_ADDRESS_LBL'), + $no = JText::_('COM_REDSHOP_SHIPPING_ADDRESS_LBL'), '', 'BT', 'ST' + ); + + $this->taxrates = $this->get('TaxRates'); + + $this->lists = $lists; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/wrapper/index.html b/component/admin/views/wrapper/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/wrapper/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/wrapper/tmpl/default.php b/component/admin/views/wrapper/tmpl/default.php new file mode 100644 index 00000000000..454da5cf40f --- /dev/null +++ b/component/admin/views/wrapper/tmpl/default.php @@ -0,0 +1,149 @@ +input->get('showall', '0'); +$tmpl = ''; + +$uri = JURI::getInstance(); +$url = $uri->root(); ?> + + +
    +
    + + + + +
    +
    +
    + +
    +
    +
    +
    +
    + + "> + +
    +
    +
    + + + + + + + + + + + + + + + data); $i++) + { + $row = $this->data[$i]; + $row->id = $row->wrapper_id; + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); + $row->published = $row->wrapper_use_to_all; + $enable_default = JHTML::_('grid.published', $row, $i, 'tick.png', 'publish_x.png', 'enable_default'); + + $link = JRoute::_('index.php?option=com_redshop&view=wrapper_detail&task=edit&product_id=' . $this->product_id . '&cid[]=' . $row->wrapper_id . $tmpl . '&showall=' . $showall); ?> + "> + + + + + + + + + + + + + +
    + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    pagination->getRowOffset($i); ?>id); ?>wrapper_name; ?> + + wrapper_image; + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . $wimage_path)) + { + ?> + + wrapper_image; ?> + + getProductFormattedPrice($row->wrapper_price);//CURRENCY_SYMBOL.number_format($row->wrapper_price,2,PRICE_SEPERATOR,THOUSAND_SEPERATOR); + ?>id; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + + + + + +
    diff --git a/component/admin/views/wrapper/tmpl/index.html b/component/admin/views/wrapper/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/wrapper/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/wrapper/view.html.php b/component/admin/views/wrapper/view.html.php new file mode 100644 index 00000000000..b23999a0892 --- /dev/null +++ b/component/admin/views/wrapper/view.html.php @@ -0,0 +1,65 @@ +input->get('product_id'); + + $document->setTitle(JText::_('COM_REDSHOP_WRAPPER')); + + $data = $this->get('Data'); + $pagination = $this->get('Pagination'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_WRAPPER'), 'redshop_wrapper48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $context = 'wrapper_id'; + $state = $this->get('State'); + $this->lists['order'] = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'wrapper_id'); + $this->lists['order_Dir'] = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + $this->filter = $state->get('filter'); + + $this->user = JFactory::getUser(); + $this->data = $data; + $this->product_id = $product_id; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/wrapper_detail/index.html b/component/admin/views/wrapper_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/wrapper_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/wrapper_detail/tmpl/default.php b/component/admin/views/wrapper_detail/tmpl/default.php new file mode 100644 index 00000000000..3d99a0923d3 --- /dev/null +++ b/component/admin/views/wrapper_detail/tmpl/default.php @@ -0,0 +1,120 @@ +input->get('showall', '0'); +$producthelper = productHelper::getInstance(); +?> + + +
    +
    + + +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + * + +
    + +
    lists['category_name']; ?>
    lists['product_name'];?> +
    + 'wrapper_image', + 'deleteid' => 'thumb_image_delete', + 'displayid' => 'thumb_image_display', + 'type' => 'wrapper', + 'image' => $this->detail->wrapper_image + ) + ); + ?> +
    : + lists['use_to_all']; ?>
    : + lists['published']; ?>
    +
    +
    +
    + + + + + + +
    diff --git a/component/admin/views/wrapper_detail/tmpl/index.html b/component/admin/views/wrapper_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/wrapper_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/wrapper_detail/view.html.php b/component/admin/views/wrapper_detail/view.html.php new file mode 100644 index 00000000000..51b539c85e2 --- /dev/null +++ b/component/admin/views/wrapper_detail/view.html.php @@ -0,0 +1,120 @@ +get('data'); + $model = $this->getModel('wrapper_detail'); + + $isNew = ($detail->wrapper_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_WRAPPER') . ': [ ' . $text . ' ]', 'redshop_wrapper48'); + + JToolBarHelper::apply(); + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $lists['published'] = JHTML::_('select.booleanlist', 'published', 'class="inputbox"', $detail->published); + $lists['use_to_all'] = JHTML::_('select.booleanlist', 'wrapper_use_to_all', 'class="inputbox"', $detail->wrapper_use_to_all); + $product_id = 0; + + $jinput = JFactory::getApplication()->input; + + $showall = $jinput->get('showall', '0'); + + if ($showall) + { + $product_id = $jinput->get('product_id'); + } + + $category = $model->getCategoryInfo(); + + if (count($detail) > 0) + { + $catid = explode(",", $detail->category_id); + } + + $lists['category_name'] = $model->getMultiselectBox("categoryid[]", $category, $catid, "id", "name", true); + + $product = $model->getProductInfo($product_id); + + $productData = $model->getProductInfowrapper($detail->product_id); + + if (count($productData) > 0) + { + $result_container = $productData; + } + else + { + $result_container = array(); + } + + $lists['product_name'] = JHTML::_('redshopselect.search', $result_container, 'container_product', + array( + 'select2.ajaxOptions' => array('typeField' => ', alert:"wrapper"'), + 'select2.options' => array('multiple' => true) + ) + ); + + $this->lists = $lists; + $this->detail = $detail; + $this->product = $product; + $this->product_id = $product_id; + $this->category = $category; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/xmlexport/index.html b/component/admin/views/xmlexport/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/xmlexport/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/xmlexport/tmpl/default.php b/component/admin/views/xmlexport/tmpl/default.php new file mode 100644 index 00000000000..feffd7a2431 --- /dev/null +++ b/component/admin/views/xmlexport/tmpl/default.php @@ -0,0 +1,103 @@ +lists;?> + +
    +
    + + + + + + + + + + + + + + + + data); $i < $n; $i++) + { + $row = $this->data[$i]; + $row->id = $row->xmlexport_id; + $link = JRoute::_('index.php?option=com_redshop&view=xmlexport_detail&task=edit&cid[]=' . $row->id); + + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); ?> + "> + + + + + + + + + + + + + + + +
    + + + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?>
    pagination->getRowOffset($i); ?>id); ?>display_filename; ?> + filename != "") + { + echo '' . $row->filename . ''; + }?>section_type;?>published = $row->auto_sync; + echo $auto_sync = JHTML::_('grid.published', $row, $i, 'tick.png', 'publish_x.png', 'auto_sync');?>published = $row->use_to_all_users; + echo $usetoall = JHTML::_('grid.published', $row, $i, 'tick.png', 'publish_x.png', 'usetoall');?>id; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + + + + +
    diff --git a/component/admin/views/xmlexport/tmpl/index.html b/component/admin/views/xmlexport/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/xmlexport/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/xmlexport/view.html.php b/component/admin/views/xmlexport/view.html.php new file mode 100644 index 00000000000..06b201e188f --- /dev/null +++ b/component/admin/views/xmlexport/view.html.php @@ -0,0 +1,48 @@ +setTitle(JText::_('COM_REDSHOP_xmlexport')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_XML_EXPORT_MANAGEMENT'), 'redshop_export48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'xmlexport_date'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', 'DESC'); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + + $data = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->lists = $lists; + $this->data = $data; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/xmlexport_detail/index.html b/component/admin/views/xmlexport_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/xmlexport_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/xmlexport_detail/tmpl/default.php b/component/admin/views/xmlexport_detail/tmpl/default.php new file mode 100644 index 00000000000..49903a61f2c --- /dev/null +++ b/component/admin/views/xmlexport_detail/tmpl/default.php @@ -0,0 +1,258 @@ +getModel('xmlexport_detail'); + +$orderstyle = "none"; +$productstyle = "none"; +switch ($this->detail->section_type) +{ + case "product": + $orderstyle = "none"; + $productstyle = ""; + break; + case "order": + $orderstyle = ""; + $productstyle = "none"; + break; +} +?> + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    : +
    : +
    :lists['section_type'];?>
    : + lists['auto_sync'];?>
    : + lists['sync_on_request'];?>
    : + lists['auto_sync_interval'];?>
    :lists['published']; ?>
    :detail->filename != "") + { + echo '' . JURI::root() . 'index.php?option=com_redshop&view=category&tmpl=component&task=download&file=' . $this->detail->filename . ''; + } ?> +
    : + detail->xmlexport_id . '" target="_black">' . JURI::root() . 'index.php?option=com_redshop&view=category&tmpl=component&task=generateXMLExportFile&xmlexport_id=' . $this->detail->xmlexport_id . ''; ?>
    +
    +
    +
    +
    + + + + + + + + + + iparray) > 0) + { + for ($i = 0; $i < count($this->iparray); $i++) + { + ?> + + + + + + + + + + +
    : + lists['use_to_all_users']; ?>
    +
    : + +
    : +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + +
    + <?php echo JText::_('COM_REDSHOP_ADD_ORDER_DETAIL'); ?> +
    + <?php echo JText::_('COM_REDSHOP_ADD_ORDER_USER_BILLING_INFORMATION'); ?> +
    + <?php echo JText::_('COM_REDSHOP_ADD_ORDER_USER_SHIPPING_INFORMATION'); ?> +
    + <?php echo JText::_('COM_REDSHOP_ADD_ORDERITEMDETAIL'); ?> +
    + + + + + + + + + + + + + + + + + + + + +columns);$i++) + { ?> + + + +
    lists['xmlexport_on_category'];?>
    + <?php echo JText::_('COM_REDSHOP_ADD_PRODUCT_DETAIL'); ?> +
    + <?php echo JText::_('COM_REDSHOP_ADD_PRODUCT_STOCK_DETAIL'); ?> +
    + <?php echo JText::_('COM_REDSHOP_ADD_PRODUCT_FIELD_DETAIL'); ?> +
    columns[$i]->Field ?>:
    +
    +
    +
    + + + + + + +
    diff --git a/component/admin/views/xmlexport_detail/tmpl/elementdetail.php b/component/admin/views/xmlexport_detail/tmpl/elementdetail.php new file mode 100644 index 00000000000..cad7bc44313 --- /dev/null +++ b/component/admin/views/xmlexport_detail/tmpl/elementdetail.php @@ -0,0 +1,68 @@ +input; +$section_type = $jinput->get('section_type'); +$parentsection = $jinput->get('parentsection'); +$model = $this->getModel('xmlexport_detail'); +$uri = JURI::getInstance(); +$url = $uri->root(); ?> + + +
    +
    + + + + + + + + + + columns); $i++) + { + ?> + + + + + + + + + +
    + : + +
    columns[$i]->Field; ?>:
     
    +
    + +
    + + + + + + +
    diff --git a/component/admin/views/xmlexport_detail/tmpl/index.html b/component/admin/views/xmlexport_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/xmlexport_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/xmlexport_detail/view.html.php b/component/admin/views/xmlexport_detail/view.html.php new file mode 100644 index 00000000000..a4345418c6b --- /dev/null +++ b/component/admin/views/xmlexport_detail/view.html.php @@ -0,0 +1,171 @@ +input; + $context = 'xmlexport_id'; + $layout = $jinput->getCmd('layout', ''); + $xmlhelper = new xmlHelper; + $session = JFactory::getSession(); + $childelement = $session->get('childelement'); + $document = JFactory::getDocument(); + $document->setTitle(JText::_('COM_REDSHOP_xmlexport')); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.xmlfunc.min.js', false, true); + + $uri = JUri::getInstance(); + $lists = array(); + $colvalue = array(); + $model = $this->getModel(); + $detail = $this->get('data'); + $parentsection = $jinput->get('parentsection', ''); + $detail->section_type = $jinput->get('section_type', $detail->section_type); + $isNew = ($detail->xmlexport_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_XML_EXPORT_MANAGEMENT') . ': [ ' . $text . ' ]', 'redshop_export48'); + JToolBarHelper::custom('xmlexport', 'redshop_export32.png', JText::_('COM_REDSHOP_XML_EXPORT'), JText::_('COM_REDSHOP_XML_EXPORT'), false, false); + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $section_typelist = $xmlhelper->getSectionTypeList(); + $auto_sync_interval = $xmlhelper->getSynchIntervalList(); + $columns = $xmlhelper->getSectionColumnList($detail->section_type, $parentsection); + $iparray = $xmlhelper->getXMLExportIpAddress($detail->xmlexport_id); + $dbfield = ""; + $dbchildname = ""; + + switch ($parentsection) + { + case "orderdetail": + case "productdetail": + if (isset($childelement[$parentsection])) + { + $detail->element_name = $childelement[$parentsection][0]; + $detail->xmlexport_filetag = $childelement[$parentsection][1]; + } + + $dbfield = $detail->xmlexport_filetag; + $dbchildname = $detail->element_name; + break; + case "stockdetail": + if (isset($childelement[$parentsection])) + { + $detail->stock_element_name = $childelement[$parentsection][0]; + $detail->xmlexport_stocktag = $childelement[$parentsection][1]; + } + + $dbfield = $detail->xmlexport_stocktag; + $dbchildname = $detail->stock_element_name; + break; + case "billingdetail": + if (isset($childelement[$parentsection])) + { + $detail->billing_element_name = $childelement[$parentsection][0]; + $detail->xmlexport_billingtag = $childelement[$parentsection][1]; + } + + $dbfield = $detail->xmlexport_billingtag; + $dbchildname = $detail->billing_element_name; + break; + case "shippingdetail": + if (isset($childelement[$parentsection])) + { + $detail->shipping_element_name = $childelement[$parentsection][0]; + $detail->xmlexport_shippingtag = $childelement[$parentsection][1]; + } + + $dbfield = $detail->xmlexport_shippingtag; + $dbchildname = $detail->shipping_element_name; + break; + case "orderitem": + if (isset($childelement[$parentsection])) + { + $detail->orderitem_element_name = $childelement[$parentsection][0]; + $detail->xmlexport_orderitemtag = $childelement[$parentsection][1]; + } + + $dbfield = $detail->xmlexport_orderitemtag; + $dbchildname = $detail->orderitem_element_name; + break; + case "prdextrafield": + if (isset($childelement[$parentsection])) + { + $detail->prdextrafield_element_name = $childelement[$parentsection][0]; + $detail->xmlexport_prdextrafieldtag = $childelement[$parentsection][1]; + } + + $dbfield = $detail->xmlexport_prdextrafieldtag; + $dbchildname = $detail->prdextrafield_element_name; + break; + } + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $tmpVal = $xmlhelper->getXMLFileTag($columns[$i]->Field, $dbfield); + $colvalue[] = $tmpVal[0]; + } + + $lists['auto_sync'] = JHTML::_('select.booleanlist', 'auto_sync', 'class="inputbox" size="1"', $detail->auto_sync); + $lists['sync_on_request'] = JHTML::_('select.booleanlist', 'sync_on_request', 'class="inputbox" size="1"', $detail->sync_on_request); + $lists['section_type'] = JHTML::_('select.genericlist', $section_typelist, 'section_type', + 'class="inputbox" size="1" onchange="setExportSectionType();" ', 'value', 'text', $detail->section_type + ); + $lists['auto_sync_interval'] = JHTML::_('select.genericlist', $auto_sync_interval, 'auto_sync_interval', + 'class="inputbox" size="1" ', 'value', 'text', $detail->auto_sync_interval + ); + $lists['published'] = JHTML::_('select.booleanlist', 'xmlpublished', 'class="inputbox"', $detail->published); + $lists['use_to_all_users'] = JHTML::_('select.booleanlist', 'use_to_all_users', 'class="inputbox"', $detail->use_to_all_users); + $categoryData = $model->getCategoryList(); + $detail->xmlexport_on_category = explode(',', $detail->xmlexport_on_category); + $lists['xmlexport_on_category'] = JHTML::_('select.genericlist', $categoryData, 'xmlexport_on_category[]', + 'class="inputbox" multiple="multiple" ', 'value', 'text', $detail->xmlexport_on_category + ); + + if ($layout != "") + { + $this->setlayout($layout); + } + else + { + $this->setlayout("default"); + } + + $this->lists = $lists; + $this->detail = $detail; + $this->columns = $columns; + $this->colvalue = $colvalue; + $this->childname = $dbchildname; + $this->iparray = $iparray; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/xmlimport/index.html b/component/admin/views/xmlimport/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/xmlimport/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/xmlimport/tmpl/default.php b/component/admin/views/xmlimport/tmpl/default.php new file mode 100644 index 00000000000..26771b11832 --- /dev/null +++ b/component/admin/views/xmlimport/tmpl/default.php @@ -0,0 +1,99 @@ +lists;?> + + +
    +
    + + + + + + + + + + + + + + + data); $i < $n; $i++) + { + $row = $this->data[$i]; + $row->id = $row->xmlimport_id; + $link = JRoute::_('index.php?option=com_redshop&view=xmlimport_detail&task=edit&cid[]=' . $row->id); + + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1);?> + "> + + + + + + + + + + + + + + +
    + + + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?> + lists['order_Dir'], $this->lists['order']); ?>
    pagination->getRowOffset($i); ?>id); ?>display_filename; ?> + filename;?>section_type;?>published = $row->auto_sync; + echo $auto_sync = JHTML::_('grid.published', $row, $i, 'tick.png', 'publish_x.png', 'auto_sync');?>id; ?>
    + =')): ?> +
    + pagination->getLimitBox(); ?> +
    + + pagination->getListFooter(); ?>
    +
    + + + + + + +
    diff --git a/component/admin/views/xmlimport/tmpl/index.html b/component/admin/views/xmlimport/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/xmlimport/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/xmlimport/view.html.php b/component/admin/views/xmlimport/view.html.php new file mode 100644 index 00000000000..00b5e353cf8 --- /dev/null +++ b/component/admin/views/xmlimport/view.html.php @@ -0,0 +1,48 @@ +setTitle(JText::_('COM_REDSHOP_xmlimport')); + + JToolBarHelper::title(JText::_('COM_REDSHOP_XML_IMPORT_MANAGEMENT'), 'redshop_import48'); + JToolbarHelper::addNew(); + JToolbarHelper::EditList(); + JToolBarHelper::deleteList(); + JToolBarHelper::publishList(); + JToolBarHelper::unpublishList(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'xmlimport_date'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', 'DESC'); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + + $data = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->lists = $lists; + $this->data = $data; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/xmlimport_detail/index.html b/component/admin/views/xmlimport_detail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/xmlimport_detail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/xmlimport_detail/tmpl/default.php b/component/admin/views/xmlimport_detail/tmpl/default.php new file mode 100644 index 00000000000..c54525596eb --- /dev/null +++ b/component/admin/views/xmlimport_detail/tmpl/default.php @@ -0,0 +1,594 @@ +getModel('xmlimport_detail'); +$uri = JURI::getInstance(); +$url = $uri->root(); + +$style = "none"; +$orderstyle = "none"; +$productstyle = "none"; +switch ($this->detail->section_type) +{ + case "product": + $orderstyle = "none"; + $productstyle = ""; + $style = ""; + break; + case "order": + $orderstyle = ""; + $productstyle = "none"; + $style = ""; + break; +} ?> + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    : +
    + : +
    :
    :lists['section_type'];?>
    + : + : +
    : + +
    : + +
    : + +
    : + +
    : + +
    : + lists['auto_sync'];?>
    : + lists['sync_on_request'];?>
    : + lists['auto_sync_interval'];?>
    :lists['xmlpublished']; ?>
    : + lists['override_existing'];?>
    : +
    +
    +
    detail->section_type != "") + { + ?> +
    +
    + + + + + + + + xmlfiletag) > 0) + { + if ($this->detail->section_type == "order") + { + ?> + + + + + detail->section_type == "product") + { + ?> + + + + + xmlfiletag); $i++) + { + $chk = ($this->updatefiletag[$i] == 1) ? "checked" : ""; + if ($this->xmlfiletag[$i] == "category_id") + { + ?> + + + + + + + + + xmlbillingtag) > 0) + { + ?> + + + + + xmlbillingtag); $i++) + { + $chk = ($this->updatebillingtag[$i] == 1) ? "checked" : ""; ?> + + + + + + xmlshippingtag) > 0) + { + ?> + + + + + xmlshippingtag); $i++) + { + $chk = ($this->updateshippingtag[$i] == 1) ? "checked" : ""; ?> + + + + + + xmlitemtag) > 0) + { + ?> + + + + + xmlitemtag); $i++) + { + $chk = ($this->updateitemtag[$i] == 1) ? "checked" : ""; ?> + + + + + + xmlstocktag) > 0) + { + ?> + + + + + xmlstocktag); $i++) + { + $chk = ($this->updatestocktag[$i] == 1) ? "checked" : ""; ?> + + + + + + xmlprdextrafieldtag) > 0) + { + ?> + + + + + xmlprdextrafieldtag); $i++) + { + $chk = ($this->updateprdexttag[$i] == 1) ? "checked" : ""; ?> + + + + + + +
    xmlfiletag[$i]; ?>:lists[$this->xmlfiletag[$i]];?> + />
     
    xmlbillingtag[$i]; ?>:lists["bill_" . $this->xmlbillingtag[$i]];?> + />
     
    xmlshippingtag[$i]; ?>:lists["shipp_" . $this->xmlshippingtag[$i]];?> + />
    xmlitemtag[$i]; ?>:lists["item_" . $this->xmlitemtag[$i]];?> + />
    xmlstocktag[$i]; ?>:lists["stock_" . $this->xmlstocktag[$i]];?> + + />
    xmlprdextrafieldtag[$i]; ?>:lists["prdext_" . $this->xmlprdextrafieldtag[$i]];?> + />
    +
    +
    +
    +
    + + + + + +
    +
    +
    +
    + + + + + + + +
    diff --git a/component/admin/views/xmlimport_detail/tmpl/index.html b/component/admin/views/xmlimport_detail/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/xmlimport_detail/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/xmlimport_detail/view.html.php b/component/admin/views/xmlimport_detail/view.html.php new file mode 100644 index 00000000000..5e60fc94bf1 --- /dev/null +++ b/component/admin/views/xmlimport_detail/view.html.php @@ -0,0 +1,262 @@ +setTitle(JText::_('COM_REDSHOP_xmlimport')); + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.xmlfunc.min.js', false, true); + + $uri = JUri::getInstance(); + $columns = array(); + $lists = array(); + $updateshippingtag = array(); + $resultarray = array(); + $xmlfiletag = array(); + $xmlbillingtag = array(); + $xmlshippingtag = array(); + $xmlitemtag = array(); + $xmlstocktag = array(); + $xmlprdextrafieldtag = array(); + $updatefiletag = array(); + $updatebillingtag = array(); + $updateprdexttag = array(); + $updateitemtag = array(); + $updatestocktag = array(); + $model = $this->getModel(); + + $detail = $this->get('data'); + $detail->section_type = JFactory::getApplication()->input->get('section_type', $detail->section_type); + + $xmlimport_url = $model->updateFile(); + + $detail->xmlimport_url = $model->getXMLImporturl(); + + $isNew = ($detail->xmlimport_id < 1); + $text = $isNew ? JText::_('COM_REDSHOP_NEW') : JText::_('COM_REDSHOP_EDIT'); + + JToolBarHelper::title(JText::_('COM_REDSHOP_XML_IMPORT_MANAGEMENT') . ': [ ' . $text . ' ]', 'redshop_import48'); + JToolBarHelper::custom('xmlimport', 'redshop_import_import32.png', JText::_('COM_REDSHOP_XML_IMPORT'), + JText::_('COM_REDSHOP_XML_IMPORT'), false, false + ); + JToolBarHelper::save(); + + if ($isNew) + { + JToolBarHelper::cancel(); + } + else + { + JToolBarHelper::cancel('cancel', JText::_('JTOOLBAR_CLOSE')); + } + + $section_type = $xmlhelper->getSectionTypeList(); + $auto_sync_interval = $xmlhelper->getSynchIntervalList(); + $lists['auto_sync'] = JHTML::_('select.booleanlist', 'auto_sync', 'class="inputbox" size="1"', $detail->auto_sync); + $lists['sync_on_request'] = JHTML::_('select.booleanlist', 'sync_on_request', 'class="inputbox" size="1"', $detail->sync_on_request); + $lists['auto_sync_interval'] = JHTML::_('select.genericlist', $auto_sync_interval, + 'auto_sync_interval', 'class="inputbox" size="1" ', 'value', 'text', $detail->auto_sync_interval + ); + $lists['override_existing'] = JHTML::_('select.booleanlist', 'override_existing', 'class="inputbox" size="1"', $detail->override_existing); + $lists['xmlpublished'] = JHTML::_('select.booleanlist', 'xmlpublished', 'class="inputbox"', $detail->published); + + if ($xmlimport_url != "") + { + $filedetail = $xmlhelper->readXMLImportFile($xmlimport_url, $detail); + $xmlfiletag = $filedetail['xmlsectionarray']; + $xmlbillingtag = $filedetail['xmlbillingarray']; + $xmlshippingtag = $filedetail['xmlshippingarray']; + $xmlitemtag = $filedetail['xmlorderitemarray']; + $xmlstocktag = $filedetail['xmlstockarray']; + $xmlprdextrafieldtag = $filedetail['xmlprdextarray']; + } + + $lists['section_type'] = JHTML::_('select.genericlist', $section_type, 'section_type', + 'class="inputbox" size="1" onchange="setExportSectionType();" ', 'value', 'text', $detail->section_type + ); + + if ($detail->section_type != "") + { + $cols = array(); + $columns = $xmlhelper->getSectionColumnList($detail->section_type); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $cols[$i] = new stdClass; + $cols[$i]->value = $columns[$i]->Field; + $cols[$i]->text = $columns[$i]->Field; + } + + $op = array(); + $op[0] = new stdClass; + $op[0]->value = ''; + $op[0]->text = JText::_('COM_REDSHOP_SELECT'); + $columns = array_merge($op, $cols); + + for ($i = 0, $in = count($xmlfiletag); $i < $in; $i++) + { + $colvalue = $xmlhelper->getXMLFileTag($xmlfiletag[$i], $detail->xmlimport_filetag); + $updatefiletag[$i] = $colvalue[1]; + $lists[$xmlfiletag[$i]] = JHTML::_('select.genericlist', $columns, $xmlfiletag[$i], 'class="inputbox" size="1" ', 'value', 'text', $colvalue[0]); + } + + if (count($xmlbillingtag) > 0) + { + $cols = array(); + $columns = $xmlhelper->getSectionColumnList($detail->section_type, "billingdetail"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $cols[$i] = new stdClass; + $cols[$i]->value = $columns[$i]->Field; + $cols[$i]->text = $columns[$i]->Field; + } + + $columns = array_merge($op, $cols); + + for ($i = 0, $in = count($xmlbillingtag); $i < $in; $i++) + { + $colvalue = $xmlhelper->getXMLFileTag($xmlbillingtag[$i], $detail->xmlimport_billingtag); + $updatebillingtag[$i] = $colvalue[1]; + $lists["bill_" . $xmlbillingtag[$i]] = JHTML::_('select.genericlist', $columns, "bill_" . $xmlbillingtag[$i], + 'class="inputbox" size="1" ', 'value', 'text', $colvalue[0] + ); + } + } + + if (count($xmlshippingtag) > 0) + { + $cols = array(); + $columns = $xmlhelper->getSectionColumnList($detail->section_type, "shippingdetail"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $cols[$i] = new stdClass; + $cols[$i]->value = $columns[$i]->Field; + $cols[$i]->text = $columns[$i]->Field; + } + + $columns = array_merge($op, $cols); + + for ($i = 0, $in = count($xmlshippingtag); $i < $in; $i++) + { + $colvalue = $xmlhelper->getXMLFileTag($xmlshippingtag[$i], $detail->xmlimport_shippingtag); + $updateshippingtag[$i] = $colvalue[1]; + $lists["shipp_" . $xmlshippingtag[$i]] = JHTML::_('select.genericlist', $columns, "shipp_" . $xmlshippingtag[$i], + 'class="inputbox" size="1" ', 'value', 'text', $colvalue[0] + ); + } + } + + if (count($xmlitemtag) > 0) + { + $cols = array(); + $columns = $xmlhelper->getSectionColumnList($detail->section_type, "orderitem"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $cols[$i] = new stdClass; + $cols[$i]->value = $columns[$i]->Field; + $cols[$i]->text = $columns[$i]->Field; + } + + $columns = array_merge($op, $cols); + + for ($i = 0, $in = count($xmlitemtag); $i < $in; $i++) + { + $colvalue = $xmlhelper->getXMLFileTag($xmlitemtag[$i], $detail->xmlimport_orderitemtag); + $updateitemtag[$i] = $colvalue[1]; + $lists["item_" . $xmlitemtag[$i]] = JHTML::_('select.genericlist', $columns, "item_" . $xmlitemtag[$i], + 'class="inputbox" size="1" ', 'value', 'text', $colvalue[0] + ); + } + } + + if (count($xmlstocktag) > 0) + { + $cols = array(); + $columns = $xmlhelper->getSectionColumnList($detail->section_type, "stockdetail"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $cols[$i]->value = $columns[$i]->Field; + $cols[$i]->text = $columns[$i]->Field; + } + + $columns = array_merge($op, $cols); + + for ($i = 0, $in = count($xmlstocktag); $i < $in; $i++) + { + $colvalue = $xmlhelper->getXMLFileTag($xmlstocktag[$i], $detail->xmlimport_stocktag); + $updatestocktag[$i] = $colvalue[1]; + $lists["stock_" . $xmlstocktag[$i]] = JHTML::_('select.genericlist', $columns, "stock_" . $xmlstocktag[$i], + 'class="inputbox" size="1" ', 'value', 'text', $colvalue[0] + ); + } + } + + if (count($xmlprdextrafieldtag) > 0) + { + $cols = array(); + $columns = $xmlhelper->getSectionColumnList($detail->section_type, "prdextrafield"); + + for ($i = 0, $in = count($columns); $i < $in; $i++) + { + $cols[$i]->value = $columns[$i]->Field; + $cols[$i]->text = $columns[$i]->Field; + } + + $columns = array_merge($op, $cols); + + for ($i = 0, $in = count($xmlprdextrafieldtag); $i < $in; $i++) + { + $colvalue = $xmlhelper->getXMLFileTag($xmlprdextrafieldtag[$i], $detail->xmlimport_prdextrafieldtag); + $updateprdexttag[$i] = $colvalue[1]; + $lists["prdext_" . $xmlprdextrafieldtag[$i]] = JHTML::_('select.genericlist', $columns, "prdext_" . $xmlprdextrafieldtag[$i], + 'class="inputbox" size="1" ', 'value', 'text', $colvalue[0] + ); + } + } + } + + $this->resultarray = $resultarray; + $this->lists = $lists; + $this->detail = $detail; + $this->columns = $columns; + $this->xmlfiletag = $xmlfiletag; + $this->xmlbillingtag = $xmlbillingtag; + $this->xmlshippingtag = $xmlshippingtag; + $this->xmlitemtag = $xmlitemtag; + $this->xmlstocktag = $xmlstocktag; + $this->xmlprdextrafieldtag = $xmlprdextrafieldtag; + $this->updatefiletag = $updatefiletag; + $this->updatebillingtag = $updatebillingtag; + $this->updateshippingtag = $updateshippingtag; + $this->updateitemtag = $updateitemtag; + $this->updatestocktag = $updatestocktag; + $this->updateprdexttag = $updateprdexttag; + $this->tmpxmlimport_url = $xmlimport_url; + $this->request_url = $uri->toString(); + + parent::display($tpl); + } +} diff --git a/component/admin/views/zip_import/index.html b/component/admin/views/zip_import/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/zip_import/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/zip_import/tmpl/confirmupdate.php b/component/admin/views/zip_import/tmpl/confirmupdate.php new file mode 100644 index 00000000000..3a76e5a2d30 --- /dev/null +++ b/component/admin/views/zip_import/tmpl/confirmupdate.php @@ -0,0 +1,52 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
     
     
     
    + + +
    diff --git a/component/admin/views/zip_import/tmpl/default.php b/component/admin/views/zip_import/tmpl/default.php new file mode 100644 index 00000000000..321e5bd9742 --- /dev/null +++ b/component/admin/views/zip_import/tmpl/default.php @@ -0,0 +1,9 @@ + diff --git a/component/admin/views/zip_import/tmpl/index.html b/component/admin/views/zip_import/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/zip_import/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/zip_import/view.html.php b/component/admin/views/zip_import/view.html.php new file mode 100644 index 00000000000..4c3775c40da --- /dev/null +++ b/component/admin/views/zip_import/view.html.php @@ -0,0 +1,31 @@ +input->getCmd('layout', ''); + + if ($layout == 'confirmupdate') + { + $this->setLayout('confirmupdate'); + } + else + { + $result = $this->get('Data'); + $this->result = $result; + } + + parent::display($tpl); + } +} diff --git a/component/admin/views/zipcode/index.html b/component/admin/views/zipcode/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/zipcode/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/zipcode/tmpl/edit.php b/component/admin/views/zipcode/tmpl/edit.php new file mode 100644 index 00000000000..f2642c00811 --- /dev/null +++ b/component/admin/views/zipcode/tmpl/edit.php @@ -0,0 +1,49 @@ +root(); + +echo RedshopLayoutHelper::render('view.edit.' . $this->formLayout, array('data' => $this)); +?> + + diff --git a/component/admin/views/zipcode/tmpl/index.html b/component/admin/views/zipcode/tmpl/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/admin/views/zipcode/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/admin/views/zipcode/view.html.php b/component/admin/views/zipcode/view.html.php new file mode 100644 index 00000000000..6a689c3b624 --- /dev/null +++ b/component/admin/views/zipcode/view.html.php @@ -0,0 +1,47 @@ +input; + $id = $input->getInt('id', ''); + + if ($id && $field->getAttribute('name') == 'zipcodeto') + { + return false; + } + + if ($field->getAttribute('name') == 'zipcode') + { + $this->form->setFieldAttribute('zipcode', 'label', JText::_('COM_REDSHOP_FROM')); + } + + return parent::prepareField($field); + } +} diff --git a/component/admin/views/zipcodes/index.html b/component/admin/views/zipcodes/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/views/zipcodes/tmpl/default.php b/component/admin/views/zipcodes/tmpl/default.php new file mode 100644 index 00000000000..334a950aac7 --- /dev/null +++ b/component/admin/views/zipcodes/tmpl/default.php @@ -0,0 +1,13 @@ + $this)); \ No newline at end of file diff --git a/component/admin/views/zipcodes/tmpl/index.html b/component/admin/views/zipcodes/tmpl/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/admin/views/zipcodes/view.html.php b/component/admin/views/zipcodes/view.html.php new file mode 100644 index 00000000000..1262a7bb26d --- /dev/null +++ b/component/admin/views/zipcodes/view.html.php @@ -0,0 +1,56 @@ + false); + + /** + * Column for render published state. + * + * @var array + * @since 2.0.6 + */ + protected $stateColumns = array(); + + /** + * Method for render column + * + * @param array $config Row config. + * @param int $index Row index. + * @param object $row Row data. + * + * @return string + * @throws Exception + * + * @since __DEPLOY_VERSION__ + */ + public function onRenderColumn($config, $index, $row) + { + switch ($config['dataCol']) + { + case 'country_code' : + return $row->country_name; + case 'state_code' : + return $row->state_name; + default: + return parent::onRenderColumn($config, $index, $row); + } + } +} \ No newline at end of file diff --git a/component/site/assets/document/catalog/index.html b/component/site/assets/document/catalog/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/document/catalog/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/document/category/thumb/index.html b/component/site/assets/document/category/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/document/category/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/document/consignor_label/index.html b/component/site/assets/document/consignor_label/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/component/site/assets/document/extrafields/index.html b/component/site/assets/document/extrafields/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/document/extrafields/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/document/gbase/index.html b/component/site/assets/document/gbase/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/document/gbase/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/document/index.html b/component/site/assets/document/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/document/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/document/invoice/index.html b/component/site/assets/document/invoice/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/document/invoice/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/document/product/index.html b/component/site/assets/document/product/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/document/product/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/document/product/thumb/index.html b/component/site/assets/document/product/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/document/product/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/download/product/index.html b/component/site/assets/download/product/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/download/product/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/account/business-icon.jpg b/component/site/assets/images/account/business-icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a6af965dd6e0aee731ce4af93655ac830ae5d5d GIT binary patch literal 1068 zcmex=C5UDGKfoZ!!63pQ$jm6nz$D1XEXer(2tyap z*~~ykA^;~N2N%RLgct({J1Zxf0MOSg%&aWjj8GXS7FI@PHg;hVQ3gRF4hbb?F>ysh z$H0q0i%ip3aB2zy)w2TCFtJ0`Gcqv?3bC-VF$gP)h_V}k)H?Yf(-TyzU$*ZpZXbp`e${vRQHUT`d4FSZ9K-W%{kZA?v~M{Gb(3wL~a*#EpBsS z+xF90QL9k76u<8q1qQNa!fN`>G0Y01jDqISLfUjvDzW^EY<6pQ&Fah(4z^DjhI~6 zl=YbJo7_4U)p{}b%~eaEsXG?9tP>RyN@Z|#P~!@zxnse^sVo0VSI*V>cDu&A?{Z}~ zj%M9j?li%9%0or1D0Qunvn$r6s5C0hVrgZV@;+nR)LEu0B1Nve-h4)KKQrfym{J38 z@yRZ1ijtEP&4i583_HYEY_GEYt^7$`&*R9)hxw)q(iyY!GAcOS;xAc=KRk0Y_WWnz za*%M&5wo|NW&AR7Cd#zXY zMq94c_4nA)ob=?yy_rw!Pnn!@S;$(XdSQgaqr-=?A@lF`wZRWvX*X3 zcdE7Ql8ten>Z+n4f6GImS=QIu=6vDDJ$vu$7GJq_XIof|uxGHt*SO2;WPdWRF;!}a zPCO7Dp;WRoGeEPEf7|Dub}MSk)C;b=)!aIH_tNM3Gq-zJf9+ja@oDXu2Ved(G=9H& zLo&zjKZE9!!v~JMH>jxi9sO^=231_!I-G5GAUu}E* z;@^X3*3X<@Rr})C~wzXkn%r<1>Zj+(|N z_wT&i`?SBC^yjNr?X8|YIs3}Ih};9mjQ%r7xJUmuexNw`cl^?K#hf>9&&z!|S!Z+M dtjt6?!9U7Nz5mMm+4yVkmcyT}o{#^369CM1ebN8` literal 0 HcmV?d00001 diff --git a/component/site/assets/images/account/coupon.jpg b/component/site/assets/images/account/coupon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6dfd8b684437b456976312f42b9aa9b9b3692647 GIT binary patch literal 1481 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 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/account/order.jpg b/component/site/assets/images/account/order.jpg new file mode 100644 index 0000000000000000000000000000000000000000..014a444ec293c0affe0dab815d572819848a3b74 GIT binary patch literal 1426 zcmex=C5UDGKfoZ!!63mP!OSSgz$D1XEXer(2tx(X zVL&$`0ZuMP24+-2b`DM^HUS1kRz?Pp)0iQuSs9s_S=iWth6)Rb7;>tJiUG}K1UiR_ z4W-jD_gctahs=|c3bQ}AD^yG$DS{;%lv-(P)*?3q(>5~Ig9ts)U4MLViCI~ zb*!~9Qk`vT&(u)1o>#X@?thq{G4oyUv187f6Jqk}O764n>D-a~<=ut%v4^8pZIs(p zGV>FE_K)S+QCl`uz523cn$-Mh&Q8zTE}FjR4L4dFt?%Kve7>F7mPtReLu)F2RDJZ{ z$uIb`PsC4oN@uao)@i|Vn6Fn zzf(%!mwF-AE0^P%{xiJ!aDH3extv}4_Or!e!WY}<=kuj!PCp(yVcp{0xyPGWm&|%! zB4c=N|NMtaSN^7V3V;2p{>JIGcuEORn~2o!g-`8L{M3uPKib)OF5-T{1_o@=EH?B@P1??MdWN+MXHDlTJ-os*hcybJb9J7wDxslYnQd;7g`hzPj z`TY~4?)S!bFBZEQ^~y8jRMxpqh6{OkBj?V3{4uF&btIo`eEZ;SYAN?9YC2eUV4u#`^urYdj5<_fFr@xoyktjys0e-f-|c{to8S zxY4?+;8*y%hM$?wzr{`TBEbzm)3g8EaO&Pcd5apP^@& zjsIn>NXxws^7?KF-+uKb%O>Zru0hT9IsIFum9i(^VO`(1=FQJ3F~>ghx9odbz?A#x znBAFcpTzz%)NJeG5jPiHTOa5A?L_E}S`$@`J!`E#?A+12F4;Qs$nx9w4@*{G``l{X z5^#5;aCEeB@P1KqlY~WPTe;lzpGoT3_ei!K3!1d!mfozpr?;m?r)^PtZ~snz$wi?m zm8bqQx2)Fry#HsYo1wI{#IdP4ISI!P-q?O8>&%;XN1se`x1Q%I^Xike(3#^w{tFf` p&Y9=;UcW3~pX0v6s#Q$KWwJCTx-`4=nJ!wy%OJOG$$y6bHvux_Kr#RT literal 0 HcmV?d00001 diff --git a/component/site/assets/images/account/personal-icon.jpg b/component/site/assets/images/account/personal-icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b005be711106216885e1e89ffacd56a7b1ed95ef GIT binary patch literal 1077 zcmex=C5UDGKfoZ!!63pQz|1Jfz$D1XEXer(2tyml zVL(SB00%o4BLfpNLIB8OsEUYZdF!fB#EUavd>>{FK9D+i^;t~vs%ABg| zl3YOJ8JSp^Svc6CDjAuWfeL_%8AR9>4V9c68;z7j#l$%R6AL%0n5atpzs0}r(>d`k=3ztvDY50cws%QWy0~#%$wWv z7fXguSNh~S?eu1ui(ylatyKtEmCJML-sC9m+S)%N_2*~qUe&wep6iVL-#KefwMMNx z!o96)UTT-xIfJ7`A(M{sT{N^=v2q5p*s3sWe&((<}*=H$z!YgTnU=nt7BR_T)H-mpP% zCQ}3REW%T;ER%Pc}&N{b(by831OI(^wzesxt+YC_@kJ3GUd#Ty1^gymPu9CXwbWlVe- z&d~Qc^z+;Ncgr2_R6noCjNMv^m$!iZTMcGaR05w%n?f8{o;ospGI(YM$}m@^_1~ zzpAe-$~-e6)u`&W!Q~hqmCU85UDoOp=}%qaklNWQa4T8C(z~Jh-M_4C>B-A>@4vfF zyYzXtMXi44*_WNycOHM8x32hf*UR5ucUJ8;Uu?DhVE$x&=~(!;k%#f7Yyi@u#mh%HuLWa@Di_ez)tr=-2(n_{{WAm1gOe&lJf0h_ksbZ@=(Xynfe=Jx6Dp&fj?d>Dql=-!FfA81};b q0{@!o;t4-z&;7CS$$y5`dA1u9A3v-C5UDGKfoZ!!63mP!OSSgz$D1XEXer(2ty+S z12ZGgkqE%S$;Hmdz=SHw&dJEe!6d-I$il?P!obQ3)xyNc%)-jXF36xL#GxdtEW&B% zxY0It&!&?E$QI+eqpWnjTd><98w!jF+BcesH2gk z6H~+Za^_ZMLtP!EL-G2O1y8QsTAZ}_PKr~7^(uXlw9U7pcP1Wv=267O8REY3$SE)P z7wcC9yj`^M(e4S4uRa%yi4M++E}HMnC%RBi_{N#W%WtDXH(vDPn>dmGw2GsukkXIf z?XMQ?-&Owh>ecPdeIg81l^LE!rxpmm?EB?gKk2o8W=V>)@8`9f*F3r&e7OC)WvQ5L zd92I3T^fN?x2?UVJ@vhHai71R>s4_+=V0IU%hs%%oe&qlCuPTy?W>FXweD;=wKG&B zGg@T=V^@d|U4&+}-JyZrlitFHEytE3q> zJUTVWrC!PLhOmGY^ZtxX#+rkte)#U$w4C$NoU+@wB2(G#)J|E;r|Quaa**Xzs{NiN zf&vU-zi!s6SvBWYGrn>wT)O3G@;1w9NA?`Zw$omnc22T&yQKbjJvo!y{`1oL zlad)+TW+;FPdX76vNhQ15|e|hxY0pR14ajz-a~c!{xi%MU-7lnbl$EzP4_-7;{TFz zXxFOLH%$MMHaNY_E$J88xxh}4b*Fr&$o>sV`pWa)&zBL=*r_c%ppC*M{f1Lat z{BRNQZ~K+}rhe_YSmWg{KgCos_q}q=W!=uPHq-FMcJ@al4! Lg75e3|9=wzsx;Bz literal 0 HcmV?d00001 diff --git a/component/site/assets/images/add-to-cart_blue.gif b/component/site/assets/images/add-to-cart_blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..0cb6cc1326d8e15a148270b0bf374b339258d666 GIT binary patch literal 2095 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 \ No newline at end of file diff --git a/component/site/assets/images/checkout/blue.jpg b/component/site/assets/images/checkout/blue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4db850c79b8f6c9d14782f46dbe57174015a04c4 GIT binary patch literal 4254 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 Z_)(=dWg0X_B&ON)3)5@{GSa3W{R19YX{Z1I literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/dinnersclub.jpg b/component/site/assets/images/checkout/dinnersclub.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fdc831da9ca582af30a09dcdf4b749c5ca00de35 GIT binary patch literal 4701 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 O`c`loFlm+xL;nEVd>0D< literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/discover.jpg b/component/site/assets/images/checkout/discover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b489053d6ff7d48aa41b56a6b0d549f029f5114 GIT binary patch literal 1978 zcma)0c{tPy7ykWbW5`-rZ^%BfRAU*0i)PTszAs@$mW(F*mUP9H=0QU#QIdVBEM;(I zWFK2MOCx(k*FK3NGT+?ie)ryg?|Yu}ob$ZzdCxiQG4?DVcn)WQ13(A>_;LbZuL446 zBZxsU00_WT8~`}`pqw}V1~-z62abS1VITlP;o#r&pB2Hy4MJf^9=IT< z2SFH|3yJ(o=ZwPcD-nnF6TA~ zg+L)lUie>DkaJxKCJaB0;5wyg>?2D!jMlo#Z5#5-X}clQJ6I>t#2eZ=NcK2z2nurk zh6({jz)P&L!a}=<-*7V2Q0n%W7N}8Bfs)iBp75*4C5fvjmAPIUbers7p0=mdrew*j zi(5fh=+Srv4$sZ9$U$O*t7rl!hG5Y_$DM$fj{A;I%&0!*?OXX@E&YmPE(b&hKYG>7 z$1Rad?3IvL>-`Z}$|ZAd?)KYRg$fzm5vTX?%ur_S2Nq-hD1TPbl|7{U1F^7WWzTTf zbG*3cNVR^6D$o6_a`Q0a9NJFmD4?W(;;Iz+aJkD~|C3(mJ=KNz*)ab3l;oW3VBzyB zaz>IK2-&_$#t5mYId>*mC6eFl6MtYkV=^X;G%)zO-MydHv8j4h%jGU&tz@mp^F`vj z>Q}_#x)x^^2Cqg%I~GQF2%F{XxD;#Het*hqTD^P^s~YJoSgu=!In#4^94(~JB{uhS zm0{5;tbbP5-p;LAFb;n=n5ySj^*BR9BXew1Y~@J35u8M;ZL1@#L{}?H zR-;1XxtM6>0s)w^>f}6}0%2eev4L4V9hOtc4w?Uew+4&doOa7zEXy*xU^l*hr zK{QmTH%8eGb_tSWn=VJTZ0xDYGXqU#$BiQ73Uj+LVIo#v>im7$5eu~Llske1UtYHJo70wGf%M5gF|fV(tCNB$ zPEF-fFc&TzEIS*$Kt(ive6W}?)O20EYr;mcI85IsWO`h7d9)VEV4GlXsbC9J9@x*z zyLu+7ua7F*nTFT@4Sv>9RJFeYZiC4*2ST)nqM}MV3MW~GnWRP!6)jy^1gHe0!vNYX_%!+a~3fiD&=C9imhZB~jli2`% zls>lVt{Xl&(l3(~JqQz|h{Yd=IvsT^8KGGeaTu80@N5O4gA1F%M5K-hgY+w_T(2? zdQn1-P?~y-eu<~)@}YU@%t+6^Fv2+A7?vTCZ|G@w%jn@0R&^pjcg<9U=iRuK)P|oy z3NzC(`H#XUC+7yZuL~*z4w)!)4Ww0v<)dOLAjUr*vS~V4upb*L)l=)U#Rhogq9@^P z1In1O$J4K``z(DtR%&5RZhO<6G`Uo|zqX9ndHX2>eWh#c>oDPW6K9Q+iRun_|1gEHeKZCTPfjtMGj+xC{Dy(Cmzw#HZhdl40Ba_5XV@EKkUKp;Ef*Z ziPdJ(9a>~!^G9g`yM+c>{;!w-Ve3CZ~>16oA#;;D-mqq>9H>V#Dj%M^h`?zGgkjAB|c$&I3X`Ke`xQX|9lLc z+!>oq=QsEw{Ud(btUhjoJiBwyoj&SrHn{IT-%Yx(xz{-^8XaHim49vg#?;={bpLh= z^ZT2XFD-6UipQQ=L_-=h+y#1l=H1Kf&Kn}YcfCr literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/jcb.jpg b/component/site/assets/images/checkout/jcb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6e25266cd217a3a72e783965de785fef21d23bd GIT binary patch literal 4591 zcmbW42{@Ep`@qlhJhK_Y%$Om&vCEbrd)8qPMRrO|GlQ`V#+IecD;1@vBoavrdTAZ% zZ6l>cqM|~*R9aMCrG4`~llN2q@4CM4|6Sib*PQ2f?sMPg+~>Z}bIqBlyHmq}GN0|m z1`rGY5B-3tmw@V)&W+Ck5WoNc=Ao*Gq);ywE7H&3m+j@_4j>2slBbVAm;_S*NED`t z{5@P5p<&?+d^doB6u=@`3<%AUX%|a%VA8Q6mZeE$AHY`_VN}xn<(%$6)-e z|8E~uZn7v10LTw@u;B4ixhUtOoRFE8EYVM(OkWl+VOX*cx(E#rWkm_cOtbM1n`w5I zFfUPvrT~`2oXkt)Nw@>$^%?1Wlo2143o-=!Oq6egrgK2AP!|>#1Ch*hJ zO#C?9c#eq2U?n9cbA(xFwSMeb;sxX+xn-b9wqn{^S(%udqUoQJ|2Q~f^`Ajf+i8o* zML%i=DRlkR{q+5*OR5FH<{g@wEkAY3b^_3{768S8pE{iy0Lb|Oh;RI|9|g&IiA_sO zwwp62Gc(gvz~`Du5;`OQufdGvzlUGeGnK42lRJhRKbn)Ckj9WCm7A21lrCbVCUdxa zhRMGk;{Vz4m#}_`!`Po6%@^^7=u*MxDH8}|&~giTf;2&rkRcHMy9)o0ZokAJ!Rd32 z0lphubl$_+X|UUdNsO&TCecB3QEOx=8>f`R1C3(Kpz+c!(bG=02AOn_yR!?9+H7* zkP@T;=|V=3Ib;JlLhg_cvpJ4>)n zlY&`^*@&sY9K?t*9hh5~5zGYUJ5~m(iZ#O8VZE@S*cfakwg6j(-H$ziy@>6@j$+^A za5x2=KF%8Fi3`KU;c{>raaFix+<9Ct?h)=C9*Z39W~n-oM_fZJCpHl;5{HPB($dme(zeozqy^HerOTxcOJ9~Ak^V%IBN>udq$Q+u zQZeZO={)HkX;MZ;Mo-3BCR`>>rdXz4=7P)vnUAtGSyNdrS)S}F*-BZl>`mEmvJ_dD z>_T2j&L)?UkCAVXUs9wfdK4CgLs?0wq@1MOp}eEgs7$IaHIcfJ+CaTReI|#O)010b0WdJ+A1dN+MSUQT|le6aj-`AYdS z^1}*^2^*Hry>SxuTYtS?tH3S;lG|p*^G2|I8j08qGqk}P_sjBIznXb7< zvs?3vmcCYyR-RU~)_rZFwvBeQ_BQQy?Fk(Xodr6%I*mF5x>C9}y0N-DbUSrF=;`Z) z=&jRh(R-$^sPCnpt>36WWFTYUWRPM|YjAruZnn+r_}NvndkkSiOT$>hO2ZpQu#uIK zz^KZo*BEPTYb-RbHNIm)GI24DvMT&*K>{L^5^cJd)Ja?xxjLrWxM4!D{Cu} zRg=|oYaQz->s{7&Z0I(AHXCg&+hT29ZCBZzw*6#hWtV1m)b1~P6Z?4k2K#68^yl&C z)y;e4pyj}E*yAwl$Z(8utZ^K6(sbfD)jB%1G{=HXW8*6l9m9^_u({(!B;j$t>lCp;`Yay-s^Vm-Y*OFZv*sd;g|>b)lB zThCuHzr&m49pGKz{m{qIN91#A0lZ-Tf~^aN7V0h(E^P4yzFxjteee6}`=$8(u?V-w zZ&Brs7hT0mq#L%{n$*TBtzgFyyC=|SzmkM<9o!c@XWlm6bG`$=l>ao^A-XjBS&T!>)|lt9PO)XNF9j?? zh2V9ZXIypMhj`!k1MyP{AqmZigv6-ClR`ORys#rlJ!yGTZ?aKxLGo~lUCQ>936ZyG ze=3w3k=mL@M=w)d=?3X*(?>EKGb%GaW(H>-TTWdrT;7#sn6)A6X*N51Uk)aRo70}F znY$);WQEI$Ju9J=%T~6p(q5InYIL>7>Vs>DYvR{j&oj#_&3pS>$Zx0e)$&*8KU(Xt zwy{9AKvZyNo&CD%^_ca7_1zmRHtgK+y^vRUwaBcftmx}T?#8Q|n48KsO%+EMcW<`Z zyn737i*QSSiBrkJQfg^->7%U+wu-kgwiRxByFGIIm9n{I)jNng(svA(`;@ot)Y-XZ z=huqZioQzM%I00FyEg3lP{pgdx!ZYnQ?*)kQT68)dCvuYSMs{-XWg4hRnnAM`)iQEy#e-=NyCxe;zmZ+w1e$)TR#-F|OvGHKe=tk7I^ z7#vPNJa#1NNdHmqqwU9Rjx`y6&*q<_{8_Sp8E>Ydkn_NLR#wp(tu zF5ULJeXVa{UvGa<|J^%F?hN1M-Ff^7Y`A=k?ls(mWTK~-a+3Dx(=RISK$3|ZyzxeX9;1%`N zu5p9$<9|8-)in`1G5T8cdg{%_Nu|jHZ|A;kf9Ln^!TZGbUp^FmRQh=Elg+2j&mo_m ze#!ib|62ZS_P0~ty}u7lB~DFEjRQRwUeYo?;GIYB0uTb^F$j(*1Ay!xdM^|MKsgEk z_0`lM$OkwK27|@muvnZF4*g0Ka5#cAiAaJ{gjXB88%;EKikJo*DRWVX7Ta2|x|#A`lh8R0yF$Qyt(qddWp^7?Qip--2Lq z7=VWW3?u(kNuCG>i$nisQ2@X}Skz}`45Gs57)4W#F3;4W>7sK(2#nyd|FnQ$Dv(1o zX-sX5%OcJiEpz{rlGm4s1cW>a=G(kRpnCO)K88{Kjwrbb8_7V6#XJ)EqmI9 z{TswRT?TO*X0cTCe;6PVgDoLL%sQQvhKhL>TrR7^yEC)A`Q(v&^~t4d^*l;$?@-8# z>o3oD+PWGwms1UAvq*jUQbILc3S3!>Ec44doOg3)04jDnF(LOeU&6ee}k%gv}0Q z#Wj?VEX)i~ir{^)G&kFF-;Me$IAQUUx)!~=`T@9_wAPy|_C>pMvCP!;oNG&c*E*{0 zzc&==`)1&qk#XWsaof_1e{5dCA7clc7S))H;OFO2BF7C^Yn4y$7otm`}`4uUttVxbA>WETyQ#~_xOs?Z_ zO;&*OkvP8m*wqxSV3S@$C;wzWUYTrn%fv-=@%i>kP19w8CDFjEON&*LS|dH3WoaPW zMGH&U@5#L?@UE@Rj+`!m#7f)LG-2KTB+E6Te#+qfTPd;i-`h6`x-+|ohC@>z`f=FN zZT+^dSKL57ex6YZ{-v%tV^ziGnY~jM*ZryG-DB?KxOL!i$>HAf15d&R@leMk3`H?B zrOl253PYh+6V#cE-=#*Z=WrP971D1Qda&k0w>e(mjrLf-APAluXbD|<>T&<{8 zJ`tszVZ8>bX$_5v%8KW#S$`f25 zV(cqf6_q*8QCv@L9UQ||1*N~;p_OE#Wyj>pItRw(ldZ_quCWx`RG$2yrqP$p?he;- I4@}+r2m8q22><{9 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/master.jpg b/component/site/assets/images/checkout/master.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca6601850d58378aa7e212e14eb731bdd39c0b12 GIT binary patch literal 4733 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 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/mastero.jpg b/component/site/assets/images/checkout/mastero.jpg new file mode 100644 index 0000000000000000000000000000000000000000..efb539c5e4105c577ef2b6e6399e141277003c23 GIT binary patch literal 4698 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 WBq&V%ktv_>es>t-@dNe$Zvp@;55wC4 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/one_on.jpg b/component/site/assets/images/checkout/one_on.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57c0886e5695dcefd4ddb19d3f4378635b951d18 GIT binary patch literal 1304 zcmex=C5UDGKfoZ!!63;X$;>Foz$D1XEXer(2*Vtp zvzZxzu7m>)RyIx+Mg}HkMr2`Db`~}cPG$iHMixe9pbLbd>X{gsSy~Nsw8P!Jgs5KF239lk63Wn0=qjlrTG1 zK4ly4*7__ChP!V*2(mdod@Jbka#KZibIkhE`@vJ+b;_=M9Jn*;WLRXV`~Jxr!yV`6 z&0X@W^ti-Mwa2^re0MA{%W>OZ5ebwJ;jj7IwTtI>$;U@(yEUIwcZi2wHL8@lv|767 z$eF%V+rq-_Hg(CIROVCJz4PK-i!T$GdYNQyF5VzhSREKLJ=bByon3FE#b0iFZ=2Pz z)@Gt-;^NlGU7<@8tdhfWrig1vZjqeh()_u0*X76+<&vwe1zg%?JI!P2?4?m|3@xnv zUegqW7hD$*s#I3>C<--NvqCW0!{xTpPH};YoAnNgr!3f^HP5a})b8iLy_J))w~N`m z`z85I{rl5ptmk*;ujTB^d|PeM`{i?m!IZzBtA8B*{w&z;^YZk2;`Z-0f4!V|`JP^V z-Tmul8}n7}m3=B#V=Q}P(>a?#J@0q^q?n?vC zYk&URO2$vwPmT)Lua^GAdt~3H@|U~n^eb-uEIs_Vd1qdn_dnhL3=t33Jl?UD*Nna4 z4kqepUEU@ zU0UnZch`5R7-yFXfqS>o1nbI9nwTef}v5vs4C8xtPNcVySJzcc^rs?2S{o4%HKO zZOPM`p!BQkeyE&pl;uyeXD$sM=G>O+f6jk$oxzet`7`TJ{>0t(zoP|2?<_3$jGh=2 z_`H0|mdI>Fr6*HL%a8J{R%vJQI=i-cf89Ra+CiRW>EpFWl$2`OKR~%6?r!?^bV`R2uR*ZdS8yMr|ig z=a&wPL4KZEqf*Zi{#zTN-NATj@%yh+mb1vB{jBKL<({ls6xc(JSA Y`LSJ1)$*?kzwQfeIW|*b@8kbB0amsBI{*Lx literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/three.jpg b/component/site/assets/images/checkout/three.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82508768dc0875254790d419c101522349b2ac3f GIT binary patch literal 691 zcmex=C5UDGKfoZ!!63;X$;>Foz$D1XEXer(2ty$Q z1JEp>E8&2RgO!t+g^Q69E&^o;Ffg(JEoSB5h6*q;F|)9-G6)K>D;f%mh<&+Ux92ukq??e|swAp0Zhg2gZX|2F|ugweSG literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/three_on.jpg b/component/site/assets/images/checkout/three_on.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dbdc12f66a8756d69284dc85481787864f078b26 GIT binary patch literal 1298 zcmex=C5UDGKfoZ!!63;X$;>Foz$D1XEXer(2*U!P zvzZwgfzE^h4i+{}W_CsfpcTl%tn6$YOw62&0t}2m8yQ)cgrORk7@1jE+1MEbg%k|~ zMK~Nq6Bk~5xJfvsrGW$>u7`Rk8c#;@im`Q%yzSA&Vop9 z39lD(mVDPQ(_W=IWnz8=i|w~}8lQc(Pc7!TSu~|3((A<3w@Ib!yIprJiuC&GH+hm? zNV{s#t6hy^CM~|}v`*}3>z!F3SmwpuwDR`-6~BL;d3n4-Zni=6hv$p-eOiAxS3~-z z&P$`Ud;Y9@%dqe7yDqPK%XR+>lRPm z%wRp9cw+hnro#KV@1iCuDt&$Q@`FmymyWk9)Lyi;?=tEWPuWwlF8=YK%N_f2Yp$}K zKbrHM&DB5Lrufc2|BCR>ucP{(#=bWw{&+U-$nNM}FSogVe7aqIdvkVC)PgGpOZje3 zeXM1E*Y9_8zBJ#jPbu4G_A-SAxpyr0nDWqC_CrZ@bo_@t^CQd4Hvi5y+I0JX->u7s zMII`sTW=S5V{i0mISR!NhDtYLgpJejxs(zjPlfJ*)FT7S7 zExb8t`xSkspu^Yx9pC;w^ZSG2%jVdz+Ic$pEG<4LvvSJCECww}tv`G$ubr$nmRxnH zR4mQ76RP0)DgO(+3;-Q^SiT?4(?Vl&GGq|*0=A-ENlJkoX?g{Q1oDt)0?qqme#Vpy*s{} z5<1St&i(XXO;$siEQ$kEd9g$gjwa>IWCzOono(+1^KO-`}%U=^JL>YtAskm z6|=NU;+FcEFnJeFGF)yjJ>je9t^)tLHg`+*fBoaX)%?qv>RBZ}D*i>Kf7*E2clY_< zQy>0Y_vG)ZvU$Jzzwea0R6Aw)w)*ewf0z8$4BgAJ;Hy~vRn?lq_Zdo(_><{b! literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/two.jpg b/component/site/assets/images/checkout/two.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de45c667a09154225cf6729c7f287ad16ea0a3d2 GIT binary patch literal 692 zcmex=C5UDGKfoZ!!63;X$;>Foz$D1XEXer(2tyGA z0}~@F(3Nn&#=*(V!phFY$OspLG6WbH*ce!t*w{It0*p*Rm23=xLhOpdhKYq2MMOV1 z22NDk91^5ltYR|Ntc*ht!;t^C75P zb`AFR3}%nsYw=!}x1K38F{DUR{Q&bs9!rkqi2{soWSH%rueaO#pW$7Q><^Aln{FJn zwq3yR@X+}reg7LXtK{x5zu#QE`y}g@TyrTuqt|Jx4cFe*s*c@mDz#+sx5>+AYCTlX z+$F|mb7taNHw(+2+3gF;{Y4c%wR@JzD6c%a_|v&Mo8uF<^UeA9=I#!5<#WxK{mYol zbhj;Ay8RC4;|Ywq$1crmIn~g}<9Ynyg5uXN4+y*eXIT8*OU-hNj@!39lM-gP)|5+p zcE4>-sZN$<>QugMkoD8-gt^b+={gLY%iA0quKDZc{83&k<|xy+>F1MGR-0IQlqawY t%B^Ak{9O0nhT0oUFW*0z7XPMrzQqq7H>T$Gmo5IV)C5UDGKfoZ!!63;X$;>Foz$D1XEXer(2*X04 zvzZwgfzE^h4i+{}R(3`PCRAZob`~}cW=;VHMxcd2EDBZ6#K_FT%ErzhD5NMX%3+wO zzK$3@{cZc19jW(GkPRv|V;L&v~GVUfZQ z8xJZ46>U;>o-AtGIMFD{IJkMUN(lS^TMRtRK*tC&3o_UQP0hY%^`L7w1>Id z@^>#?z_25$mxH2+lcvXb$nC5G%jeJAv3lu$hKkwl8rsuW9?cAu zn{qbkVHHQ|?ex^1b%(V6$m_4Z?#O!XpWxY7d0O+X?EBN7o_5bb`H}gj&SlG1dfq=@ zrRaH5T+4aV%Ft6+QK<>^PX?e_-1pV#gm82R&S-QO3Y zDW@K_`J8N6($qLH-$BUrfrD!Cm5{l)_b1gla9{q~oEz{tRG`@C?zD}nrCTf9r~jE= zQd?!$vEZ3jSa|JD%`3&?*KJ#EDp!3tHZfuLydOvEstmZThAyCHLTVPGuma99VGc&ZM)Fa zu4Ri)=LY7R`Wmcs4No^LTqMP@NIdpy zzt)P7S?-KZQXhRL^l!Q`;n0n{4W2AHN=8>xrJQ1UmnbsqVscx;u!xE64MXCzlin#h z)%VZ7{e7#ZB=bI>TuV8JP^$GTrc|93ssTA=C(U1H-Q0DFYjL=1=$2=#FHQX3C3HW# zAF6ZeknCA;)rEKT)gA^f{yP0ZgZa0mGqUI1kNVH>ZiRbQ@1t&m+a?{`zV4i(|4VhR zf6s=@DN?0Rb!UZGX!R=`NaOZzNl9t^Zn8jg#KNrL+mmV%SbMm;yl+MubqS#O^$=oBF`TEkUyq+ys6Rh5M@8Krx z(9F~vi{)Z6kxn2nBjJzR-aROB`p>ZcQSHn9OOx+hp1*wgW1c%Y`E7Tf|2_5LKSOv? z-B)Y>n&Y2$^;=Xa$zA`?FvtEmzl&?Wqk@g=>~Eg&2H%g!N-X|nyL`WF;Eyvu?+J7E L8Yz93|9=wz5?%9i literal 0 HcmV?d00001 diff --git a/component/site/assets/images/checkout/visa.jpg b/component/site/assets/images/checkout/visa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd72fd4af6d9c3475af7f5ab88e03eb93e244312 GIT binary patch literal 4332 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 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/cross.png b/component/site/assets/images/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3a95b4b4b057d36321cd3ec6e99da096e9614b GIT binary patch literal 1025 zcmaJ=PiWIn98O&~$J{_=$P{&tYzGfE|GF+Vw3e*tY{AUZRaQMMO=xHbQAb8N@puTi%=fN6yd4Kr6@Av(F@Aq!!XD$p4 zoEV@eYABag3S>SUjQ&3IAN|$P$aEZMN_ZAka7}X|B^#&=LC(?^U;%2z>hcGepr{^T z7E8FKUX*lXFN7EM}24%Ql+DZE7o3}JDjU+u6Q#sX1!>XCByKuHX zQ`GB=dfcE>=Rv}kh=2vL27GJD_9Q<^H+3bl4vtwGG$D8~N$;5|sd6nMlD{ zUvpTV;ewRfKvn%e)UrBg4;SFR-+u~w#Z?Eg1?Zs_S0@)&84E%=Qrd+YMs5+IrFIqb zRfLgOMGi>M#=x9u8>r?r(W)xtY!7R;4s%M9CVa*;4T;MLQAHHxxHu{Be1?-V+?2vi zi*Z>NI3+gG<|;^Ev7n9HTw|X*)s-7Gg5{9N3UtkD(3p0S1)2#zdm~q<4a4r)kNi)ArCNz3!5x-sGOA$b+cm6uIbsDepEKsh$i~q1Ns- zM&H5t?AGIBXAWNWPT%U?s>|W^uZ>rO^5@-AyMH~@c(xNxY&^Vrq;Gsj2tPgfk=lH@ zvwZ4KXnbV-`q9w$?d;ZC`1goWelVQ>bZEGje!rc)dsDemcr+g63mf-C2L`Fv^Ot_) SUVIx49%U{wqdb|Kzwrm;=xHbQAb8N@puTi%=fN6yd4Kr6@Av(F@Aq!!XD$p4 zoEV@eYABag3S>SUjQ&3IAN|$P$aEZMN_ZAka7}X|B^#&=LC(?^U;%2z>hcGepr{^T z7E8FKUX*lXFN7EM}24%Ql+DZE7o3}JDjU+u6Q#sX1!>XCByKuHX zQ`GB=dfcE>=Rv}kh=2vL27GJD_9Q<^H+3bl4vtwGG$D8~N$;5|sd6nMlD{ zUvpTV;ewRfKvn%e)UrBg4;SFR-+u~w#Z?Eg1?Zs_S0@)&84E%=Qrd+YMs5+IrFIqb zRfLgOMGi>M#=x9u8>r?r(W)xtY!7R;4s%M9CVa*;4T;MLQAHHxxHu{Be1?-V+?2vi zi*Z>NI3+gG<|;^Ev7n9HTw|X*)s-7Gg5{9N3UtkD(3p0S1)2#zdm~q<4a4r)kNi)ArCNz3!5x-sGOA$b+cm6uIbsDepEKsh$i~q1Ns- zM&H5t?AGIBXAWNWPT%U?s>|W^uZ>rO^5@-AyMH~@c(xNxY&^Vrq;Gsj2tPgfk=lH@ zvwZ4KXnbV-`q9w$?d;ZC`1goWelVQ>bZEGje!rc)dsDemcr+g63mf-C2L`Fv^Ot_) SUVIx49%U{wqdb|Kzwrm;c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?oc!Kqgt=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6N+U$v3I|BnFho_5UNX4xw z!3PDK37zG9ninxHIl;M>NarSA?1x~wXD zt8hx;lZdC5*MrVpnHgUMv>)(1ny#i7-p~7qQ=;&+h-P>$=PK)tBew$OT^?Eg7mv-g zT$8u%ef!~LQ-d!O%+62uA4)D<5>R_gY3{s5H}05vbj!0w2Ny*u%vEui8tY#A$x~@s z-dTyveM!m-HySxkcFwyi9_}lx{W)>=#5kQz`D^qqR;F$KBw+r|(JwmxV1>`bi5(r1 gvsX>A`@vzrVBQh?f0yF=9iURe)78&qol`;+0B7lpQ2+n{ literal 0 HcmV?d00001 diff --git a/component/site/assets/images/down.png b/component/site/assets/images/down.png new file mode 100644 index 0000000000000000000000000000000000000000..aad2d6f463290896d35b8e28f77d60fd6a5eb5e9 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^}!3HFmd}T9%lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAE`p$B>F!Exj9g8w_|@dXEU4X-MEHYf!Sjm^$%_0SnIr z!Hg9eXQU-HyJRe0YW+WXz^N@WgkMSwbz_XYd2o=AWe@;zBSBrc60+HL)GyZDKn|JqCi(L Nc)I$ztaD0e0stVBOKAWA literal 0 HcmV?d00001 diff --git a/component/site/assets/images/e-conomic.jpg b/component/site/assets/images/e-conomic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bceadf299b69e389913567b23693e8b3f28200c0 GIT binary patch literal 4030 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 PW4`#m!+QpB^7+32WJO5( literal 0 HcmV?d00001 diff --git a/component/site/assets/images/index.html b/component/site/assets/images/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/laegikurv.gif b/component/site/assets/images/laegikurv.gif new file mode 100644 index 0000000000000000000000000000000000000000..50b9a6c0b367d78afab17b695fe155749ee41710 GIT binary patch literal 839 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 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/leftarrow.jpg b/component/site/assets/images/leftarrow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8bf7a0177489742dc179912d97d1e3c6752cf656 GIT binary patch literal 488 zcmex=~-3+rp8NlZ%U&n^%&LPtsIH zPQ?@iOiWF6APgX-X{uuagqo%%dOA9KAU+W5X`1R80VQ=b_5L4V5aeJGVGw3!RAOKf zWMmd({C|W&l7WGV8R$kNz{1GJ&J2`N7hqsyVPaxrc5? z7B*f4DwJSkU

    >0f6e57=SX;f(*<+^AQrj5D{ehAf!0)|1Aa{puJ3j%z_N|4A)fO zqvG?!cw6=FqOwz7_(|$C%(<=l;KL%-uCE!L=WmM@Ne6`|u9>dpqgr}Y zrObLByVtfUdyBhXl`ej>e)FZ$CBK6Lo@lS##p&V^`ufd|)xSPY)hV1@EAXjg=cX5S zC#-J$WLzY$K4VAHuVs8@tE~MZW^9{gs~?eaewn4Pd9+j&{~q%cyGgE#{BNa8%YBm)dK6%ow>*61S!$!jYZvp@(SB2pK literal 0 HcmV?d00001 diff --git a/component/site/assets/images/loading.gif b/component/site/assets/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..704b875fa1b2854ddb00e6f8a7a5c5ff45e35f59 GIT binary patch literal 433 zcmZ?wbhEHb6k!lyn8?g<=FFMRn>W|j*Z=?jU-3V;pKD04vtxj(k)8oFBLf42;!hS< zE(T@>9UvR1L4<*U$!1Rf%G13{cbWob39$7tnDk`EJl9Pqo3OM~N%pf@q1Pc(TlH1@ z^mg7h{?o8??)q;=a_qYwUVPaQwJgM$5n&(;0}}%e0~^plu{pAZ-7C2d6nJ$AK3)@+ zQdu(nSOl_C4xmylAY@(@GWJg@Zp(fc$2$xj>%98hy5=GZe-tePX!W6+ZMRxs&_b-^6=wnrvT ztO$cyfQG`{YqFA|Y==aJMvLNY$!m|66~uZ}B_er^32v_V921ax{5ey9008fN{CIA2c literal 0 HcmV?d00001 diff --git a/component/site/assets/images/media/index.html b/component/site/assets/images/media/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/media/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/mergeImages/index.html b/component/site/assets/images/mergeImages/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/mergeImages/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/noimage.jpg b/component/site/assets/images/noimage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30133d33fdf2d5af0b948a228b3b1fd1b9a78eef GIT binary patch literal 1341 zcmex=>NsFlVV%7Bm!i}#C_Yi^qd*< zhaKsHU;mods`{(m%RiyDU|OMk{N?gX5J9a)oDhZ@M0Aw`s`OhIp>xWwf93u1d1SYL z+54rTeOKx|cngZ1XXSD1&~}<@Zr;7Yb}AF2i$+67hidT2^4XubR)yM3uiUS&s-a`o zO{XQ7f;*!wd`j)J7S4b3ZTr6kZx(%W|HKvaFk@B0Y?&H)an3TCsIN&E_vfwEp8V;p zvX)BYnc1!RU-JYj`4nz5R=-w`-FiQWKR8QY@&1X72#L6qJnct(xjhLMTc&frXAk`& zzOG^8t^Su;$FuC0$Y}1|6WjP^g~&??Ex@Jd!s6nnHP3s`{RyE#E1&E>`;#?BY-RT5LZ)Oy-%BZn~b|?0%BdYior|rzPjL zl_&3fa3{8G%VR#XZMU~a?%i)SJz49?P3`QLsXY%2ToqGxCr_9r_TrYsI`)r+TPvr` zG}bh6JnY&Qyuf)f}^59^rrfIa}dH7skZ17)7^q_HEFWn8n*Dru=8YhbRA>{siu_ zka!XE?M}PJ9RA77vDFbVg{|kNa@Fh(ZJ3xT^UW>d_??MIRF8MvwQ74HzULR0`HVZi zyvikRNgYbcJjAxZB*Q)Bm--gNFH_!SC^RHxN}1-|XnuZk`l~0)SIk}8NqQaB;YUmm#!*h*Jkg zM-w!GE)4~z*BNaeA2kQ2DekFQ2E+@lM0VuMX#%l^d6v!*{WTC#ka3;$&d%;^+Vp(t)7NE}*0!;^O%KCIFxe5heft literal 0 HcmV?d00001 diff --git a/component/site/assets/images/preloader.jpeg b/component/site/assets/images/preloader.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1b280653b881ab1d14cd152597ee7848476fc54b GIT binary patch literal 1404 zcma)%dsNbA7{_1uDW-PJpBDsXaZIy7!VIZ!cCm{d(`;C1UaI4~q!d}2%Pw{{8>_U- zR*Fk0wM-=Of{3Nkx~Qy7a2jH1oHSONArYyWml*8q(Ei(=_q^x*KF{}kpXc)$o*D*# z{pP^nK!891fG{p#=m$RnYZPh@3U-36oSf|7d1wsI35{{V*}G!!ct>Xp+I0cOeKCQE z!Fys|7T~?z+=*V^B$5l!H((i&O7bER5Y{#}c605p^X6fFJ@6jB1j161FPT6jkWArC zAef{t`R|NmDjF-s!?aBaiDbA3;5ncKlt74u00|=?7-47yUl{?BkO|cs7M4f|g|IT3 zRC|C#KoG*x($e}L8-au@U`q!#AIAWC+%Kr*2Y={tTIf-F-x*E$_E5I4PG@}Pf-r@- zpGg?o7!5ZV0U)EcfXpTW2|Kva9T)oOpny0-AD9and0+?zYr*ts^R53SEJ8-Z*grYP zHcS_IwuX++z1&)xTrc4ro3F^iWA=DYJihZuwe-`Qg5DN9$F@dY#AF@M7|6}4*jAg9 zk=8$4@cKv`KV0Fc(Q}WMZ^g&iDTsO^uE17DrVp=#dpsK|9()XoUDvs-dYO zYCo=*NzPW?qV0CgLb2ncyMlXT4#(RL7W4ZWqxEM-<=^e0l$|5qe;UA-H2U8Sb!fJU zQi=D!f6&SQl@{6|uXeYmvZy20`!e&=&yEdY4Zx}}j59XVc&EGI)W#joh2yflndG+H z+Dz7QTS3RPqYtc&%D(h$x@nwyozdtaDv;9*;Ert_YZoO)ph*UcO3c_cvfUB+C+TIE zScyX|rMEUK7L=l23ztaz59uktJy|k>8C_mD+*R(p?+`;MS^4-~s_aUZDE9Q|{8r5j zDS%C^73A?Hyspb!4qQ{ss!~r@U(`x9Gv_|=ZT3=9ywN(w$i#9*ULsS`@G4_Aq-8{bVAo zD<)6);_QK4*_9~*jc1Qy%L--0b_LU4%$ZGNoX|5=+N#SRW*iZ9F@M)8v@12_q)UBQSGslacae}uh)wgEvBz(Q(M1R7hG6BfbHyWlN|d4q<>?c z3jl;+utO(UA$wa|*W> z>IWWAbo!ODDPF2LlJz^a>c!5W20pL-*5K^B!J8=+oMd$ZRU*1>}Q{nF| zY~Sg!ogZIZM5*Iv1@~>Qie@m{Hy>mY(l^Pd?0oIy$D*|trXDtzTKR;H=*7gt2CLhknGl}HPs0WXCo=BWT^*u?w=mqP5b@CVH|5T9S* z1$&oI28wVNctjR6FmMZlFeAgPITAoY_7YEDSN5Actm3Rpjkj;T018Q#xJHyX=jZ08 z=9Mrw7o{eaq^2m8XO?6rxO@5rgg5eu0~O8oba4!kxcu~_BUh6HgTqDpM=M;nuFzQ` zpxOE2U-}AP$6RHnBNsfg@AfpU&AQH6b^3p+mQhGuw)|7shKcrxQfFE$WXsm-${x~S zQ}ER@*?Mr->N!udoY&hgxGuk;<9f)_Ls_q+u7CaU!78@rTEw3Z#}7{vO8#P=@z=?V zz3@(c^zpA9V%iLoUP~^H=Lk)C5_!vRwNS&u8|pLKAMu*aw)nfWOZW=VnGBw;elF{r G5}E+-&UXg@ literal 0 HcmV?d00001 diff --git a/component/site/assets/images/printer-icon.png b/component/site/assets/images/printer-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..23756d37e288af3790c5fe241d91d03b98469a48 GIT binary patch literal 1551 zcmV+q2JrcbP)auX+%fnTs*d^xH-`&cug>4b7p2)vIOUaju_$` z9%GuR={X48Gb(GrT%prp`ztxAy$|49QXvnecMSOUYNJ!2{xztse7pHMKz`Ao zfZ72;UYkq0RKn+}GRMj&j;;}V_v{A8(udxjF66BI5G&TLhk3xtDu+$}tUO{K7ay0a z(edcXo!ce36P|1G-Me>}dgPJ&Dzz3tYt<#ZH#rH)NEP@(F}tf(*NsD$D=|7M8kExv zzd;+EZa0Ji0fb^PKzAXtn6->A@&JA^zyHVYeYAkd&AR zl~M_TNQB?J94LJ3#4WuCe4_?|6~~Z>j$6ZksrkPc2Gmyq?_JmlE_pmssT3h0A&8BQ zMM_Ev6bc2xLPtR)6rtB>M00a9?$_6&t4oK}4cl-;CxfQC8WHU`VXZq422O-3qbr61 z_DR(=kf1tBSm zkv?w`Zj_Zmd;0{$vOvUgC+%jFy|*dbWN1Ih*q%ntQ&z%#*CC&Acv(rO9L&E1dA~HxGJbsLs z)2Fj)3YxtU3+K#)#xaOWDij09i{XA)?H#Z=stipPZ3hg6!<<2Qry# z>A?g0+Zr01PLu6}|204U&%lxU6iLGJGJ|Po{Ry5gKR~sIdJ_Nu002ovPDHLkV1jc@ B=g$BD literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/1262876429_redEVENT-box.jpg b/component/site/assets/images/product/1262876429_redEVENT-box.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2921a96b61db9f5ff4723f8f8b220b9d77052c5 GIT binary patch literal 14010 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 H`8xj}0!bO( literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/1262876675_redVMPRODUCTFINDER-box.jpg b/component/site/assets/images/product/1262876675_redVMPRODUCTFINDER-box.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9897e4c84e7f8b7930c3ceb5101076b08c2987ce GIT binary patch literal 14235 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 %dk9v>R&(>PXOSRMit&I$z=uyTwk!f*{Ulc20 zNK0{(%xkMd|6-;&=WcP^`3KN2J@+KjS~;zIaj(;BJtQehS^jIJjzxHXCDL)bTX=0V zHX-SUj^fq$S^TiFG0Lym)NM>otn0Z$*+{HDYB-QG))HGET?h9Pls4N#i`n;^mcORG ztM+uy(7fI6<+sSlayWT{=_@M|i@Y(~=0Rvu{=3NOPlAK)`2y9a9uEEv)?~O4z@*?R zE1ocacxF-cK}|?bmh*=6GA1yt*+s#{^@41izis*AsLkt_ORUPV1MrvPyA6~mH-v$0 zF-9>gs=N29;o<2UVrce#Tv*@|kd`f=J2`@v0ZiMM?-D-yZEBZP-uN1vk01jvY>5N! z86uWQUMq`zeu0M9T18eAvLRAoATmy^(Y=*4>n!VkNv9(k+Czh(XqD}w46HU=Bbyaga_{toyS}6ligDZuK!zU4|2MC0_ zX=h&;EKs2JHhuiVXRM@vC#+Pa8?Exs@S6~EX|5-sK78*?$SAiDq0xzADXvQvx=+9K zJ^_C8b9L}ROEn(MuF}by{wfWP5=) z???p1u~li_!q#=e1a_rA!YR`F%H2xNa>HzRq)K#P`g~28v{35ifzo8cJymPSFiCql zbE%Xp>3h?kIvps^yy0&=Tb;;r$Z@3q**!hi(S?N<)YJeq7Er)!cdwjCru`xQC z#{RTFk^p#yx0H3WLDpG@jx;rlX>C8@$_ZMj60wt03S8;6JJe63XB!O8yaGr);e?~8 zNV_pN@GRe}ZW2fF318qZ9}Kn!*12Gk$_hvPs(%)7!qscJ^^(v$olc{cW*WG8Np-xV zqw9kioKxcP(_k@bf!RfX*qQ-cOR_EJ6^^NoH~LCjw<<=6SEytaZc&EpBrJ6f)Gt_Il)x*7VO%#`|fktzT%0K88QQ`ck)7UPQufXnXL@`Hi(@FGEC zKnnjySE-}AUu-AOL4|CT1+fME0Km;%90eKpe{Rk|avXS-Z(j7EbFk&p6*o_{vO#+; zDYIVAo!+s(caO0eS9P6`&w))Sx7TG%4+{`o`<+MBgE/wtza$d=13=44l|bWmr- zkq~30^G(B>&u92(JcsT29KMiEA8Dbb)cDGg+*&@f^titQEHnSj-O~FxJn-MvmQDGL z`_yUe=WPo-`|0(tx-R#+JQ$Eo9y$@Vd$rwpxB1Vx$1uNqsuqp#!O*Wg_~%dEZslTr z=#RtZ`%%e{}2Emj1%v^&{i)qU?h4G3uV&wC173-!`{=?G?~cb;qBA zcX(YF>aY;lweku$-1=-i^MIi zgO{(F_u+ZuRJBK7jq<@K@1()`?9N)Lz_DBMTEy$0R^GMf;o*ui4p@(M-AAZr{keIs aknKNrmkd5bcUN+J-zNOwDaTQ-YyS)1G7Ap? literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/1262876737_redVMMASSCART-box.jpg b/component/site/assets/images/product/1262876737_redVMMASSCART-box.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9033a32c2ecee965befc9e1d3eed177a49e656b GIT binary patch literal 13600 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 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/1262876791_redPLUGINS-box.jpg b/component/site/assets/images/product/1262876791_redPLUGINS-box.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f89cef481a12742dd272b65db636793988bb5224 GIT binary patch literal 16493 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 sBli<))zmH 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 RfzZ|YQzPgc^zCise*t0?+^qlr literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/1265986712_globus.gif b/component/site/assets/images/product/1265986712_globus.gif new file mode 100644 index 0000000000000000000000000000000000000000..129b5e6b69a7bab2f325f38e3e30569f4e13d947 GIT binary patch literal 4904 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ð^9!?Ri#h|nDkIS{b=>&Yq^*0 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 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/1421054762_carpenter-demo-400-400.jpg b/component/site/assets/images/product/1421054762_carpenter-demo-400-400.jpg new file mode 100644 index 0000000000000000000000000000000000000000..06dbd7b9a668a7b6af5e93dba4ab1dfc2058c137 GIT binary patch literal 49261 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%0A#96~CzFI!l%^~*I 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 F_;cI6hWJx0-PA%#!?Cs#}0CG2@ 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

    OWONsP81oXlDkR4J%hfH9K|^qt$3 z8@x~ZmS~qD*HElwbK=FyTjknr(7rGqcC-Dgh}vJI;AfD{IxI9-&#o)1SRmv`nfQ;W zK@|74^`)OsOY`wj!j_d;7Ahsv^azTMvO=p5Uc!Rkm!QNoqBWnKOwq(BSJS%6och6s zg+(x3@w#RJu;Eba;Mec7areH(hxsKpF78ZWyap&yr*JDt20>r=<`hGeojXIc26H&A z=#qgwa^B@&=hVNW28sWL8i2Q`{s9`iTauV!;80P~{fm?=Fqxfk{|)7x9OnAUE}i46~HWrbjm zYL9|y?%)J8C*x7;+VMCrjY>S=B5=l&a3Co>u>ZY{UM59l!;GhR+rBg%(xzm*X*2Y zSsSRl)v9up;A|O{@7;u?B+8|8k2KTyx+i=}ri+^RI`Pwb(&)qXd+n=)1K-F+9Q9k} zD%Zg0yLDrStC@-Usvt!buSx1}|a zd-puWXZSk3S^;Klt-KofL9gT2-vHhlt&V#? zO4UDA^*3!+$w^RQu7!g?GfweX8>q9RDq4Y!`fe29F=a2~Jc6ZW^bFdqWTF@r>#la? z6`}lg@-%Uk7yCL~DFWi-{voe0vU@8z>mh*aH$fj0naSgYOAOr3JiEh2MGb%WLhi*o z@$p$HOM9l!m=(a;EpCftO=(`_j4qcn2c+33P745}la0Q4Y_ei?#I3GS+Aw{(As5$) zSq86G&pXMs9=***A6dY(=Xd6aQ$Z}YPd}_^vF-#UYo)Z9qZ^zq zRC_UW`0Z&fKm6H~G`L3z+#Rwb4F?2JQqs*Hw$yAW)m`FvKT^!Fy~Ey)Sw!mkzEjh9 zll#?fZ@2j$?M{8BG#)>-P6s|dQ;2Iktp-*UeA72=1J(xXN4Ru8@91=0(=DwAzpW`t zoE^4P%=`cst#8+?q{MJJEj#0RVQ*XM!5(G4u-VaKzc6RtG~2E1-i+Lmw*Img-BxPV zmsms~fh4RSvr_nZy(BXhg1zyP?rm`Cys#t93 z#BA8kw<_B2J-m*@V|M6x2FEE;=|=*5M~Ho)*nNGcgRBcUraD&-F9p1OE{{gUmm0T5 zmcGM%RQ%JM$6Jr}(u!VR9EyGzJO(&AYgPhmIO zqTFNDc*(z$Nl6z#Yl%!jl;i84H0@7NUYwk)`gSjmuXUz$DRE;t)3bxE-<>RleK`XZ zJ%V7XgIF!+P<4T1L9s-!g{$sHu`t)us|qV2=kWM&qBghpG0$q%V~g}&X}#g$y3zgp z*{NT;?8f={s3LOcaBs_$Kj>*@R@+BOzk|75weX8UxF9i=B)3Vxv$&UAu((4->2d$=gRX{&@Xdv?(k0cUL6SRHU{(Gqj(lO~n>JVfZO z+7h(=#oa z-_h69nyos$+Y+Ve`9+*J8G(e}?Mt|cVN|i(G48jI5tU;^hNx_~Z=eUz>B0GUXotgr zsM*@s;RZEkzaB`DX#@8BuLZ0RC?L4r+RrZH*Pr1TdLQUnVW$PqxMu2EL5G?++Bf}` zVJ+*g+oHEZKZ}AH+!j}d#}Yws9@jG+jkmJo1|pjZW}neMB+^=#L}0}w7+sUflcmaS zIQyys);2E5n|DC{dW2pBu76nVXEtxVup+mhgJKn1Dn8(27%1Ekc%vaN^WDO9 zI$HAQ1PHenOr~ck%Q@z6KB8azi%t_c?a}0!WK1(&=L(eKQ}{q7KApmy3K~`$DbdTj z_I*)+dPAn?AoA(v`lh3b_f>$4eNPYSixA$xHbPes3aF{6=|2BDCR~m3$F|VK$WhuR z6!lxG)Z`|6JS`hylpJ$*j%Jgr@z;4|Gaatv4({8&7rk_4qjmNuhKIcoE4@WaNpG6H zRFu32o74JhZ|CASW+zEfl{YaIARMbMHR2gBXH`CPccXxQQF9@W(gJ4tUd{Lm--Mw2 zFyjMOR@=Qarf2I6WOhvez7;^NythsC)^gT(;I92 zbe3>7Mv1Vny|R7==lQ!hJXP5Qu$p09P3)PAR&#=x%L1WvjyJ@Um z>(KZD8xm}mV%Q64A^uQscEgJ}5VeQZeAnEo$c*Cryn32nh*dJwpz@K#JL25Z>}`Gi zi*)&6n{^xVSIlN{&=KJaFrDWMFhD4Pdp#MLxH6Km(M3{bX)`jiEbP4faBchEeN(=r zZir4Js077AMW&t#qqJPdtY*gk+vh0yjOA-qV~v&F3)~E+Oe~M+*$#o^%p>^KRCql1 z4|&%bI4YRYteYml6~*X1joslfo5|uqN;UnCo|Hg(MWUX;26-D1WfYTktLGA&ub`d9 zSOt<~OK@JiD$U|Vv0a-YXwLLT&)o?>&cgjKl1k|qO8(XsE3tatHcurHw?;S2KSg&w zcn{*3uvVxv!o2OFkcKE^ zir8pBuFO{P6T=r%l3345qAFgRu7% zf6QgLAB)O?EoR#SY|EAaz7vLH3Pp+fcDmrN1 z+LjiAkq|0<0=n>RDT-$4!N1ynDR)*(W$@$-T0wHc|pYIN!G?@@B3lU|!7 zd6Fj``6fRI@x);}b5&kd*w0w`DFe&D*+LMr>?TSuuuCdvEZ&bHG%R>!w<5lpP~-Dz zxhqg{>X~(Q3|!|nF#wr0qB0aGzSP6Zl;hKQHF9G z{_yjuD@dxCW1i%>QK-sXypyWt+0n7iN%ql)wY_%KgOF;cWg5Cf?Wn{4BDHb`miIq= zGqyde{vVyaWmH^Uwlr9+Fjtq3x@2GS7`a6w%z?0sb$%aqr zOZ;L2Y!v zICW;Igwz|82 zw4PDpEOtAZRsA?lU7emjGPXwg?Cgbav;7y}*FM!`<3^S2Zw_;(J-KJ+4z&65aUxr+ zmv?_4Q?o+Ig~sqk`bdIg{p$oFS(`G=`flWyU%CAf@Lb@!*JznKN##}lr0v=^auBiM zhwtRXEuB-}MrbBbUT#oQ2J3~(2OR;so?olp9`sa7a2_x!VsGTmNs)VTNic0&)S>;@ z!!FPfM1;1}SY*5Bi2e@Vb8o$1>y?AiF-=8G@yp~kZ#?L5@J>JQmGpl#X>f5AujQ`u zmcSLYHuj(lu~+Bg__(deX^B4lGE$)3$N4?xHQbw$GBda6C0hO^*0Luqf!jzhE(x0j$F^E*md=N@m|vcW?nF-Vo~vO!~|H}*!5P;+%0Tf zTzftpio|V~Bg-gdq}seS+GM=cZl{sI?ag*`t(ug_Sli$KL^`Sh4fgWdNi($orV?#d zHRFu8D>G%l>8AMTq546kXP2nk0B2`W@~LzajUBlA{5A21c^m57CO42V4Txw#FOSEm z_Ntmmj#ns0ARFbi<;+hF$mhi6^FXrmT7ME{7E2%JWq8VQHE3+;E^Q?GSfjLz_kNZZ zU1Q|lJUg4p!2VtY*0!TB8qXVRil6JKUKe`f*xOZCNy`@N+1!Jlzr0y?UFM^BnUcXW ztiyj`(q;0zU$*7tH;2DvK1j2iJ`CaAQi#U&RTKFx3f#NUCl-6=uQ|5EESoac_?^GD zm_d*o+12=gMe1rNj>M|NQN``HO236{E;k~$<-X$d0h#>aC)Bh)fBedmwV<@Iy)DEC@ z%ur$}VL?M|J={Ml%q8`b)~c{wR*`9eL9_zVN$_8c{>0aa$JIrh=%3|hN!{GhCwtLW zsNo*&9Lf~aGxB^uYsfL=P#E%U88$HsyPv%UcTdjy0gqTVWcUWhR#BA23F#--CZ>dD-+AM?^fe`uV-{h& zb35t143pg7#ZnSB$p%qO&Rkqh6Gb$lxh`c*4AX(4#oU>C(8wZOMB++KvYjbo5z;l0ov*wDZ*G%%&=MOft*Kr?bUIGm~Na;Af z!hf%DoM6F7sD#>m*YLWR*MSBv*!-nk&<-5Tg`aX>%rlNp8z_H1A>;s=`U0#7w{g6! zQvP@);JT)`Beopnevs1`U*Ud&3sLhmD!LR9?vZmjXXdh|(91c58@xK+au8KQeiu2t zDiKjr#k3e1n>Gb#J|x2b5i5H>Kp||SR+vf#`9vk@k7pH%yl1`G>hiT;P(&P;W;*J( zgR>4>K6)id^obn>av&)m#<9N%P~`sB7=#0wk84*WGouL9x! zmB9HwIOqS#75T4F&3_d&{?Cw+|7GoJ;GU)U4PT!C4;cNnyQ4TZv?q!&Q%)WBbqh zSaRpEBItS2&{6D&ny#!;rdCyxEeepkHQ6FbE}U>69ZqE*iy}_=?feIilQrD)o2YA3 z@{Pmm_Lhgff#b;NkhtMd{E9l!5aon#Ap<>J<|%K-=$b9TtZzuaqVb#4VtleuWKm~uGC(KEeki+1Wj2G_T?$`(YiHvzmBFTaK}*${7i zP8AfwArQ0*lOl=#QV}(W?7BLGCl^0w7$!f;^k-JwGL6uG*oi)%6 z7%F$e27lCGHEz%a3D$gti|XEu6STw=*gW&B*3#Ue5gW zT?Gjk@AUS_5(WgN^_BG!m|AAP#yPP&mmQ$l!e>z+$`)j~0&>x0^aAcFfbkd`EFO&B z?rviHZzpo}tAPwd2Wlr{8~}6!6&gj^-9wP0N0JEsCTqU#l& z+?^sjsGcy7rwu7S;?Y9sSM7$TDvh>rRU8kM94^&e%%btdWJ7#w>1c%M{*3XCQ-*fx zo%)CA0t%EtP53vmr7)1o#^H){D$$_GFVGM-j^J@YHPAxISvXV*%K{-nkKvSlFckCiik(@YJ)s>s6n*t7S17csTS<=Rhv2Mx;BnAi?~m;UBuS9$y1 zl)iS?8|kCIMJXxkvGY&g*7HJ1O0aY^#z>_%%w-xku?Qhd&W-P5o-j7BdsOxq0M#S1 zPL=3LBPv^GABrV6QoBsT_eo+#vK%8ZRuB)nHSyr?27I7UlF5+dMxS!PLN1yCm>(}! z>u!Hc*s)jJY_{0@#H4AzLy5~`l44H4)Ho8qF*S<(rdlg%1$(rmHCX_l;yT!$YVU8h zd&%gU!<`r7NRBzQdH1Sl$&V?pcgVl>7JNcwx%?XDlT1eT|SoFc~snYu&LKyM^iCh06AI(EeRo z`KFnrJ^vt57eN`LV*VC&R$k9(PvEZw51RTUyquF7Jo-4E$SZ4mpJ76 zdB5IO^s7V%qA(LUR1EKD+3W<9qLhI8WQO|F8fw0z3}L+k3Pft%dFnny9{&(c_wGM$ zT2#k=k&9!jIa_cGS=nw$A4b&9l)_~=@(1~C5YWS5(EL~ z#!7n^*Slp%1^_?>?RKv78>9EwX;LRQAR8XFjv8bI*#08WS~#C-jUW)>oCy&Ag3FD7 zcAUFV*q0KgCw`DaZ>jo5pYnxLY4j?Ygw3B$ciHj~D6YG*@r$eW3yex9RrRbk9wHQ6 zx2a{sx!eyB{N_OJef)KqmKCREXP0P=e$Xaj;&)k{c|!(!As%Z1XAA@AyB?^m4?f zR8hVFju13$H7jhi!l_X-rT?qq{-3#0|4YgLKfFaxNnvEAo>j=CV|=CJi2158$(a%P z@IPW_{_W-Qe|)=VFmG^;-p=?Y6fVR5W*|&jIzdy9Asx*yB4wIRSjZ*-9k?b4J(S-4 zsZ}WCdT}78oj3xpgg~ku8ugiFNaF?C9Bec?5`bA}fK9L9=HpD&ICiIw1ElZW!P%`_ ze|vuhdlin(XlCl#>>PAaE4dVr6!tqD-lTKfzi*qj!@f5%NMcuEeJCTUF6I-k)Er0` z^XrgfBqy_S_>HdE9s$GH(!~waj<|?9PFmw}DPZr}SBRc9{%N2ke6MM6VZb6d-WPVz z2HqWX5Yp<%GFaBrKr!EcZjE;T9gV(HAh+{6QYW&3wW#i-wUKP;fIzk}-`3 zdvK{ALGz;aYd*h5Q)Rfbms*a^d3Bt@Kg&7_NquGaqYl`cWWWembv%T_?&Gr(#2<`eC)>gZE6F-PC z1Q=_n1wn~MH{t;FJ`wA&a%%`+meT*n$FCm#5bC_1r+n7TCnUsRl(JB)(1qYbqTfyu z-6r{K10#E1^&N7=5ZP$Fw^mVO`jg6OddSYzzda@8{SR$ zCM()Mw#=WFpY3G8PxrkF7jzs`kNU}+x5YBs0<`J;gYq_mT_I|9{+P*M1`B2o7a2dh z3r(M<&B&9IY&H2TIyT>SX*tM22);iXDs$~l3F$5&n5^Pu=S_z&dudbLp-LTFdq--Q zWp!8#4p)3=lpw%y4nB3+O^9mB74~u;Q88N*HmUf!P9V617S5hrP-iSl!#jmt^IMB} z?&Rm(T)|?p(jjQ<@rjvo)VE6CebtUSi!pQc141VFq0*dWvUbiT>0kdORCLX28tsvH zKy$`YIuGt)`hol;j>*-L4v^0(6?g-1M!T+%B}i+z3v=_&fHKg8 z*u3cLb%1J>uh)G^^SJ^ktKwtUOdK{-rJ2<7j=h(HFOJoxmso~wJ2jJJ+b2&q>c4Ax zrrkYwJjyNRXnS=@=LAVMo!JMXg7v)jnaPPvlAfmxhzQ&YpA*4FoFq;MqvWkycZXH* zDAps1DC>HZW6)K`KS+r4AZ24fIqU%vYwW8ru8hU*`7=``&7g^so_f$B29YWAc3@bj zj+^dWSfx*eK9&=|Aw#;hIzp3=TbB>Mq+C4Au3WXU2Cn9Xuy*{G;B!g=R=e%2PXM{| z;r-#P?1rV27IFGXU=BX4a@}C_1v@X{vK-@M*c-u)(uodr)qmgO?i!mP=?X%|Ta@Bq z{~+zU9OO{~hP3bT{J&=kH1CT;!K@B#No1NNfdI zgr_ZS0Hqyi^~%AJrJo;xw>WV$5a4sUdiFK_4*?UQBTtyBBU07C%Txgs|Pqs ziG+MW8jy~|!ukU99zcu`|NWb5u{K-QoVzZmH`*s(s9H-nY|5ic4xVtP6ToTy_wkI5 z$>{_niV(j=J|5WtqW3{ASV0dsX;7`nY5kG1+Z?vB>yfJqDbZR-$G#hm%XN7VyC~(b zNdsoGe|--b!yCoo zkAKGC5`T04u8sEZQOSu#p8a$Ad4Ro2U14l|PvZ`2J*y^v#(ysyA0gwwCVOAedk-8q zCki)vf5brl8Y35CONL@_lq^9Z}OO!c25VO+bOnqC^ocCIctrvX>%tY~UPMGc4~HHo$} zNYR|^Y1Z)TF9`kj?TFM1_l*CrNt~CQ0gsMa)$(FagL0p(gw3fVqjnXRuHGQPE1V44 zO3Kd>nYA&_kEqC`;TRD?)(g7pYXZMeFeR$n0u?sb)aEhz@Y0nb3bvF zWm=(woUxCR)x4sHsw-omf!y=tW+dV8Ne_%0N5xVrWv_}6{X@d%!h{YxSF$dAUL|N*I%8QosBrYq`&yq-p*c2*sx)Es* zHoM*6V>}4oqi^*khiBeVA7{>mV-8G1%>}%8QNdOTD^E%oT0R9b=BeWpbz4>$K#J z-#!&_)Y>2tKmQha@_b(q_$G?nv?0{7+s(60M3&g|w~BXsrH2ZL$QkCMB)rK28s1N` z41bX^_w9@8pW=h;&0n#gP8^#8e`NFs30d=2X!O`mD!n!0U^nj$x6%4z(3RXHSTEVdxUwXdTZsIQ9Rl%e#jiTD5)>Kb+2_54u3~i#y1dPH78e zzk{B5VnGT>MUfltjO!PrMPlw7LmZ;rF{74feuaJ3e(rC>`{DNk4<*?i=*W`#YO6>C z5c0RZDoi9l2=L-iwh%A}v#R%5B4-VcB!3sIp$oyg-7p|g-#YX@VzsgIy)?)Gr>IQ!UuXnXak+3cr_cDF z>j1%ScavSjsTUeXO;Y`bq%VL!50A1i%gx@d(0h;5md>qi#}ywF_KSu6O(n%T`5oG@ zdZ9~@nr)^r9+lE3*y^)Tz@BJNcfX(X-5GL9)ZA;Wj1Tdyl;;xY^ZJWBopy5`B(c3l zV^rJCou^ew^FiyQAhQ#n0SlKexvk(Qy}&;!qlPFkE<^^=gQydapujg%6fahpPz2LW zBg5-4v2w8B=iLmqWzj`ps(b)j-vN!0qq)oe9b&iQ8DVdc{Ylyt`q9|c!dLU~XecMX z#8b~Mzpy1k3_bR8j5*k^RYSr%>-0}oHfa<06*!vzKl`|kZgCnLN1m7oJj2aaw$Y9~ zgUSw)zh5t>(prVM*L&)8O*omf|7cn3E#C1r5tBS9$-}l}+9$i}^v5D?-cDcaFo|J^ zQkr(yr}`+v!JJE8i1CY9gGe=KjtcLs$X~Xk9lj39TN1F1m3HOI3_MnEI+v7z0yl3R zLoIHXWHsToO(vC={&+2~AhIea3`V=omaxienG-esdvYai(W^sH!I8*58#qI7+#wfp zk1vC(y-^;Qa$dnqDx?*mSIbQoD+U>myDOrIm}#1MeFIp913Yf7sB*a`*;>6mG$F9f z4Hqk)^ahlsIQIdB`FD28T}EGeqW38-u}xl`7JSY z#{URgw?icu#_0YEH+RW^{ylZ~YRb)(x92RvC8W!piLI6DZlrI|=(gI@KXfFGhRHE| z8+m&XHVX}e@=|Ad5*XH6FfGxlH6sd3{;o^ia8DY)>Nc)74xpIjH}BV&io|IPNOfF& z_HcL2B`XqF-r;Ug+;~C24j5>}?$RCteq1C?v_HEnNv>Zgcxr79deq;Ww zh0(^qSiH=Jzml!mzph+eQ2GoQukkN?lFbZHy*#QDyd6vAP*Quz5n|wr)r3g=g^2#} z{yf()yT;wU;qE2XkMXBR(*HP{q3%l$I|pyTj^!?FYWT-`IQT<7@CmQ&w8MjEFld;X9Ybm z+EGPtC#)i{GT9RH!_UM-Z6{lLjMP|szGRZ?X5F8xjXcq;fBJ~FA5Vzi;Fy&z!?5~k z@ixh+|N4ip>kw7q&l~25)bO5ND-r9y7j%*-FHW#uU?O-PKL4qi3L zM0};wmH!eXV?CGyh)}nVEm<*Aijepk+=su0XX!RwRwf=GDA+1i(xR^UatcQ428mPv zF$97$^|eQsuZQ_?Cer$c3!3Vq-K1|acdvmXgkO1UIYfONmT5)2GAVZM^$6b269|}> z4Ep4TF4}Gzx8&$_0N)%s51hppEs?qeQ3 z39+RBS~g)~GY6<^3U<1|0WV(4pqfqEe405|!kj#|fL5@TL=73xlZGi)O zaChW1mCw!C$sIzq{u}URy|!W_mLF>25};7U)X_l@#@d(nRK8d^wt922q%SKrk6(+n z9Ki)6#~gS69!3O zM9P%c%33!OoTwI6?t|Yi4D+YV+2z^G`A|!K+Sqwan2d>=Y|mcn$oSi5C(ZpYKk-0^ z2XFbTiG|7d2KLT5Jop=^}B`@L(N03=H9)pygChm=o53JwDU zONgz#i2~;`h3Lc7I;Q@xM5m@H1QurXlSj_)#5tzx#P4qg*FC8EjcM=EmguHBR`%S! z%2M%GTe-<+`YivEaF;~)f|+Jj-5KYI{+SVH5L;+{dmmenjs%f@3Rim zHkrwiY-T@ggke>t!=LT**puIegBed>Z25EuPwm}$0uJM*45(5FyEhJvE?{xIFEL%= z?I&q}mB+JNw=>PZn!}TUSBxKwx}2@Qi=&R@I*kpl2^ikHxptWlXY_Etw*5=hHDj4=hqk4h*IGje zbAPjkj}Fh90ks;2x+@Vwpa7@c@OQPV{nZ0g-+uXJ(l%;Uy)JRjEyvUI9owxto*E)V zDXHz4Ow^s=roS7a9`AuH zTU!wG1X4+&oK`B#K_ekX%aU2LWwGxe(;M9DK^dkwY3@St*Lfw+t4Q+5#Cho#K#saz z5e0aJ31EwM-?hPwX2oc+1Rz?E`Sn0blSt zWpB$h;Ma0E>m(3UgQ>dc`T^!2Gv63JF2>S-Nq^ zxQMrByQZ0UAT>8yhe~7PXSS@LG5S$*e9W3Z_sJy+ZC=oXmH|98R}*%gdR(eD`-KY` zH12}5ZJ6+DIZlhgp`#Q+u-ZA`=fPavx{r*2VsY~2U#{O(Oqt0VtE`n5abqd__9|%Q zI!bde715W2RB#XNYFG6g3uQ!bOA_u-f!O%}Wkd21 z-DMH=qp!gASt#q*3?s}Uy@lld4AnN5LuG%8r}a!)z0A~B6)IHAlgvJRE=--0nmMDE zZc!2keWw>=Dji5KDd#l+$H&{V#RI(P_zzN;YjX=iXP68@Wxl2G9oV#jE&9DyA^F?8 zktGNU4gTJj<1b~;Z)ECxYzcm@wDNl^wp_}|@C}a$7V@PWc^$*|G<-c0e6;-$!EODC z1mpbLm}N~ogd7%JFbnlMbo)`}t{@9-&pW=z=JFRhZZ&RKGKF_0|B1e{m!?&h1>;@W zbZ;xHyOG?!tUJ4sQa!BJAkZ~u(jQ@zQW@+RA8e!OG?= zsL25(%wQy+YDB1}%8L3}RE+G*O?nj?4UK+fzSZ;n6D?{KAI8t!Mg7`9kV2y?aq&Zk z=!4@7v<1)-cm4_u_{E<<0pRfSJ$fRmEpFb&lMN9c9DDgk$T7>E&HQVvQQOMU3?8m? zG|>c^ri=Gu7!{xC&piA@k~0om{7%qM$pDjP&{xi<4!4=dMe@`ru|fffx0h zQRLcG4*)2eU>jUfOTcr>Pcyw*{)(TamDYcOit2f`q}%7qu+Qo4+**nbh~sxx_RPvS zlW5yCPS3*&^N-^f2b*e>|6?6aaU%2S2q!){HJlQB-x4=EG&~^ul8Y%=bN>1rKuh+R zIhb0jk{v*;-(6phC)AlwHnta{MUcV*zS5ztY9m8Z^QGdVF%zb{FaG`quWj z>1}^&ZzO7@%Q1&EZ)UKq+KTqzw02ku;;weTxUNX#*`)}^cod*?>b|m_`(RPYvHq#< z$X^dk2|+X|E8b6UUTWZKyHI|?uIQ7DNpT|9le+eBntDTA?BLYIrfs%N=bone*RMyxTzZdg(5^!i{zykAmM3&854dArgF$bAc+nt zc0LNp?_Urc23TkIqQ|J``K_TOJc@bB7XMYo;gXk- zeqyw3PB`3Qwt4n;9Ps1!CRKUjs}FBY_p-u+1ZMJeILOVQ@fvCv!;rz{SB(zVhqc$) zP}(I5oZaa=S?8# z-U*qmfS;vzK5g|J84^#@y_ZT@asK?24>^DrXvsRK=c0-yC%umBW>`nl%S2!wE1hsa ztECn)$?*PY$&qgJX2A2$d3kUCiw1kN?E$*&q}AM1@edNPxMkNt*VGun|CCz9uawT9 zi0zb>Hp<0Aa7-l`q=rRUsGL0OXdS4(2L&(JliADQY3-6$H|^fEcFg*kP+x88v(jtV zWqkhErs%&c+3117g9R=;^xb{y{Esn^Sb0q;GtKQ(R3ZJbG^qvS#(i{pY?ZZ@IYCi11Gztn#6uxgH_`Y&vze@%7n zk9B{Y!kocpMxyyGLfz36P)hz{?;UtdU&z{u&Y0{$K8u?6Hw*!LnT%dYu2SLQBsn1E zFBNK4MVPJGLu&3{(W{Dp;K{d31}cJ-MT^aSOv{(=Mk5o1v=zMww16Y62q)F}!kGh& zHNmJT)aiv6$>57gJ2z-^kYSMVyda)+n4YJ^QU-vZM)(UTjdZ*4@S)aqO){I<7$e5G z?$7QrVrAZMInyDf2QZn89NNh9W16W0?G&rp(YEGwkNLYmWDAp&T1xS-q1&Wrt2cKRDF#BaU}7KgZxV5RwNqwl1_Y$Sa|~|i;>mn3uID=?~N!aBie!g z7%qLeB2h*YWT?Q5F$BD?vlkYS1QX!!}^$8k_gC`g} zou9|0qQ+I%%hw*E6^U&x^|Kd!}30{;5lyAcxdZ;ce7#bXi^X&GGX~UM)VIsIl;r_5wV%ITBfJ^(!aU(;9N;QQ{ z^o{(h0b_p>ihRp)8sQ=NeEDugUOc?bLNrwQ#E!l>8g|)n~Vy(`f?}#S=YhnT%#ip>IFOhCr-ZOjOml-wo8}EvGoW zD>gIO#deOz2ILi71UX34IwiYj9cQ`kzws;Yv!rG){aVqdCOpKA2onj6VsauZwjcs5UJe=4O? zXMS(qLW`5^-sJt;=Iw^k)y{ zB9xv7ETn?J(kP3>8PzQivdz1G`10mamh6<43T`+{zMnVraF6PV+py1u&I|{|l?xv# zo+~!5)>O0|yfTfkBYE++%|-_Gl|*~>$P~(B?SBQYtbNA_DcQdLO>W}Ac4*!JXPM{3 zP~a1A=zcPMb6Qwk-rbi;qFghcAXKxCEceUObIab*Og5aN?eVVo zcQ7*%2S10QVe*)w?wW=8iLL@|bDlJMIPDt;-lilY8$-JbS1jlVZ@GNZHDWq)QP`tW zSf9R19T9cu*h)>dQ=W{sQhidQQ% zgZ1p@n0S}IcSEBx{hcFCh0af~2mmz-c?^jZWLqX6!I=KdQRBSSO`67$Z1V}js=t|JTSe%NL%Vi;4#yYVY!7T*Z){LR~!VD2f?`PBH z==MqKU%REX3ZJqG?rN^W*Oa`z%p2>1zQXHV=QXnr?CC6044+-~9GK#Fycq36!n4MB zt49B{b0A-($)~x%=JXJ(m+xm>mykcIWosz_G0XdE`CkQYblO~}CXjbH2Q9A~z=LzA z?>+0b!FS)c$M7>>$)Ν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 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/1421055573_shoemaniac-demo-400-400.jpg b/component/site/assets/images/product/1421055573_shoemaniac-demo-400-400.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3d4c13e42bed69e471c215405e69d7ad3101bc6 GIT binary patch literal 44875 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 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/1421064966_appearance-top.png b/component/site/assets/images/product/1421064966_appearance-top.png new file mode 100644 index 0000000000000000000000000000000000000000..d91d9fbe46d433b3d6ed14f65fcda3c4ef6d4507 GIT binary patch literal 22695 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 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/redCOMPONENTS.jpg b/component/site/assets/images/product/redCOMPONENTS.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b53db23e56eb121cad12288c076b38465227c9b9 GIT binary patch literal 14260 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 sBli<))zmH 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 RfzZ|YQzPgc^zCise*t0?+^qlr literal 0 HcmV?d00001 diff --git a/component/site/assets/images/product/thumb/index.html b/component/site/assets/images/product/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/product/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/product_attributes/thumb/index.html b/component/site/assets/images/product_attributes/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/product_attributes/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/property/thumb/index.html b/component/site/assets/images/property/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/property/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/requestquote.png b/component/site/assets/images/requestquote.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d41fcff3a57e6e00fa51e19719d6d52eb1d56d GIT binary patch literal 2765 zcmV;;3NrPHP)HnBo!E(kon3qXcP{6kj4GKdk!6u(+hn;8k?rX3kwl_JV}n~PMs{l}xv3PzH{LcJ0PIMi3+(FHby-nwS_#9P@n_V~kOY0rjAjDtX0{&vF6iLcm49izFZ; zxKX%M;6=M%*VSIK5|0s$U)24QI|elPH1G|`rrW{wnxX#zlx0a%`zqT+@3spX^n%JuSjbz%4=n*8f= zQn>=f*@4>JS>WYWt7LJDB$B4c1IU>5>};I8xjF4630{(cXE7j=RFozr$?fhY_tNWs zq4O`lLdEH6N+^#(XA|cg8hn-+4Mq}4BMGV_+Cwtflvm}rFL1eFLC$vJcB|Y<6BFdV z{fl2x=DqjGLh@h(bVO#MWboYRyzxi+2O=d$(inUI9@vh5TFw-e7;J8;gPgWDKj!<- zG+Dp8_dZpbnW1>qqgDo9l3RjVuO8dgf^az!0rvKDy+}ChmKKWj_E78AkLecg>m#>w zJ-MZ8nd@1IX1m5N761YOm;1R~>G|qDN~F`_?`k$n)2|(+;s@imoQ)Ej)70~oec|u% zA3WRi94D2c&IgA=9Zmo780FqNb3?Hon9t)Zw>mpZm6>b0yi(;v)lP7{_wzgZl`irz z@W6KMwnMQ1g!F%8yv42sqb$WRH-aR0Y^T%%gH*|6XzJI)i}u@i@DbYb-6z7||J*&) zaDib_-o^a^K2tI$M(FIf4pEh_w_1X0U=E#ohUnaPo>)HdA=zNoOWd`ElG_I;apz`o zyE@4R=rlmh&PxE$az9rp7ryrtjUIS7G+g@IhcrXn3<5Brnao{J*0WI|!dRUT?pd@i z{?`BWQyLIhfY1#90k8oe{ZBu+s&i=DF+f{?{HzB1iii)aS1yx>qH?jwpG8uo^1?@E zOJ$c!y@?B+Nad-7*T^!^A!dKqv2kl8_W;qoBbge-_%PZ z-Om%wZjtSxuBR$xU1VPNlm3-3-D)Hja7TI$Jh8dAMnfZDH9|qin!twJUpO2Z^qyCS z^?5L?xHEi5e+bUOZ!x^-9)+b~#9gl+4X=;CiGfA={_i2(cjMO|*7t~U#1-PWd5!rD zHWa!^#ISM?wQf|#5w@TD&F}&@Yc9rmbE!99uqPVM5j{a~qEpe8%w5K6r27T29);ux3p|l} zF`yiCIy#mdgNhfyz2hFCLt%K_zsZdFJLb|%_lto~ms!vlc%iHHmce$b1*)aGT2T^K zmKp1aVC9*HK@bbqCd?r8kIc_p!AlVVKu<{WF;=Ps!A{U?W-5?su z2>^qvUlV#xxbU`!HBfjF@CdT<#M=iPUDWS${RH;$ExJ~BpapYdmY znVTvGQsuoA#SAi z;yF#WJS_!GABGLZ5W-3T2qqh6gTwXKl9!wxB9;FLe^@#DrFgQLDlp;)ak`hj>Ym{WdWDtq7gbf!|CW3%o zFNFR3=4HCL2QVS-Nfsuyp<^rolUW|Ar$e)xA|iT3xd=LHruzkMHWt@ARCF%EptCDg zvi^MVn`+{3$Elp1r380M*^YjK5xWIPejTir*Y8#UZ0vG_nu~43d^alt zBIapS8;fLhLuBB1Pf+^c zqm&x_RCte?K<30e8ibb-#Dmk9dczEm)0q^E>dut_j@bn9x z4mXz*)t2sVN)2qI-aVhEZVuz}@4RaTz@xgr6DeGoQj;f6()iJ1G(9>-MRvp3%tz&l zPBuKxi>w?;2)I}*Mow!hC3|~l-L|`F!)HECT@Tz(Et@t``RY}Rfk!6r{wu%$duY!p TE^!9G00000NkvXXu0mjfe^gE- literal 0 HcmV?d00001 diff --git a/component/site/assets/images/right.png b/component/site/assets/images/right.png new file mode 100644 index 0000000000000000000000000000000000000000..469a229064d16673e1fc125cc273f912acd9a6c4 GIT binary patch literal 946 zcmeAS@N?(olHy`uVBq!ia0vp^LO`s-!3-of8_&85q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfaxL_=LFr`t|Gg@84IhT>1O=@BRDtU%!5R_3G6_hYme? z^5omMZ%2+Cxp3ja*RNk6K79D`Ms5C8e|=fsH<*RNmSzkmPx_wT=a z`SRewgQG`}Ub}Yf&Ye4#E?ru>bm_#26Yt)=yI{eBd-v`gIB;Oko;|yF@18er-r~iJ zZ{50;o10r-U%zwb&hzKb&zUnPBO~L(hYv4bzPx<-@|!nrwr<^e`t)gcclV7OH>RYd zJbn7~*s){FmM#1I`Ezq~^S^)pJUu*q)el2^g<6o-U3d z6}Og52oGm+fz zmYFoQ%VH+S8MCjBTG^&ILcMRFxpL`slZ}tkVk3i$pSoTRmp&|g^@VB8o8sg{ky{Nc zCL6>=B_tg)^t9lA=sqbzd{(4EzTpwU26HWiVwd7LhN%-bsJ;j|*re?5&9Ws+=mYb& zl^<$7F3D;59+7Kv-_j=Ya>3DcLfy<=S5|&!3ypFT*eGB=#OSsw$WATExUS_wOyN%HQP$hFXPgs2`lG4{{Dw~UEqY3 zM*fRd)E&JZ{y${z^+(3%Om?7ck-SK}Gk81~;;<1(*YzXq5F7(8A5T-G@y GGywow**%Q_ literal 0 HcmV?d00001 diff --git a/component/site/assets/images/rightarrow.jpg b/component/site/assets/images/rightarrow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9dd8aaa98e281265502c3220a97e1ae312db8418 GIT binary patch literal 491 zcmex=mGlcB`0^0o$qMnOR3d;x(^m5ZpgAO%TJko z|98#h^XmQgo~+)U%NJd=*zA{;)6q}!9{g345?TvhCNu2n8oWa5sk!tpgp0+NfK zmaJIgoqu@Jr5N8E`;}i#He7r#@xY_VXAx$T9(Aqw6`zyLyu>(}>rb*|RQ~^)0NeGA A3IG5A literal 0 HcmV?d00001 diff --git a/component/site/assets/images/shopperlogo/thumb/index.html b/component/site/assets/images/shopperlogo/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/shopperlogo/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/shopping_cart.png b/component/site/assets/images/shopping_cart.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7cc24b33919d0660ebc2134b117a6af7167ace GIT binary patch literal 240 zcmVkQs;%193Z)&k4j!(PkY0b@;*r z?zvT#7FJCl1`e=igEy4XI$DIRM%+6Nuj;+lEbyfk43h qM^1Ry#E3Cy0uX-&;(UB!=l}rGX_RHnZ^=sl0000 z7#JA!_4VoL=_4Z}=H})kBqS9T74!4+A|fItCMFaV6!-V{`T6{8yhz_H?6I$TU%T2@9!WWARQeYH8nLMAtA%V z!>FjJ)6>&5G&JJk;@;lgPft(O)YPG&q0rFKK|w*HqM~JGWwEibq@<+q@bG$idPzx1 z)z#I;#>U9V$bWx-b8~Z)l$4j3mohRk^78W7*w~PekYi(GYinz`xVX#9%j)XtXlQ7N zh=|P0%#4hTtgNiz;o;oe+}+*X+S=ON+uPaM+0xR|Z*OnO$;raP!l0m_O-)Umot>VZ zo;^K1IyyRuiHSo)LoO~ZUteEhVq%Vtj$K_{41ejE#)j8SkH z2z@ChD2pCjcN_tI6A&GXWJo;+etmpj5Q;816&3`+YJ4q;UTgp#B7VU~W)z5gQ#KVC z2G)I2Dj7l$)@B_TTn*1<7re1=_00xIaRm9Gzt1^o!Yz;mSni5mC{ zGC)Wu!V5YjKI|~DOd`cWdgfI4fMGy^b{-S{slp=!iGc|^rWCYHAj(m54tJ4>}BC!wnpb`?yfO`h*4{anOo8D0+~D4lT~qu^>(cka&kk zdx$|KTpu4$kS9k00mK^~3VO83VlL5x6FK<2u)t-(5KW3CPq-ilO_~c67WGY`fx?Cj sD~icS(E&mZ4Om3b$O8>z5J3bPG~kE>4@h7NDv*Fe$%GVE=tv*{JH=v(>i_@% literal 0 HcmV?d00001 diff --git a/component/site/assets/images/skip-left-4.gif b/component/site/assets/images/skip-left-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..e74246c32ebf8940541cad06f1a79f255b280ec1 GIT binary patch literal 718 zcmchU$xGC67>D2Y{d~n84Hw47#07KIsSYiSw3(@mWie`IHbb<4OhgzWA_ZY;D!?-P7CG zKhR=##CO|=?P*@kUKBSve0cYTF0Jr*nXgmN8W|)zkY|$>-)1q*EiPvdUf29 zFo}p-sEr#iCWo0Evrkh)%n4%EtW%#8lR(Z-3-2Gg3{dXmyboUnGmJTg^NV$3i@Qt_ zXKne@<8n){i8lnMzmcYytl0tGSJt4{dxB;9wTe2uvGivC{j~!&dy}&_P&rpQQF^J+ z;O{c}Vos+!W^EtMSvf~@twHC{hKk5c^Y<$&f6}q?(mrC|h-^HWP_AiCc{Wrr_O>VE M)JSPkc`6bF(4oy4Gj$!7Z)BL z9uW}{8X6iB5)uIc0sZ~``}_O+{QM3M4)*r;<>lq~_xJet`0?@a?d|RL_4V%V?)mxo z=;-J&GBWb=^7Hfa@9*#Q^z^N*t)ru(>FMd(+S=^w>=YCfsi~>t%YIh=H}+l z&(GW2+wk!4rKP2Re}C%g>fYYo(b3UgUtgr8q~qh`+1c5~#>Ujt)F>z@ii(Qg-`|Oe ziNV3a*x1;Shr>BmNj=jCTva+(Os;X&eX>4q4aBy&;p`m(udd0=X$;ru( zkdV{U(@acETwGk1mXfAwY9ZczAf{=jU#2Zqm}y%*@Qq&CScp%MT9^6%`fw`uYF>0RR90A^8LW004ggEC2ui z02BZ?000O7fPaF6goTEOh>41ejE#0P5Q`701P28(Ar`2J5qt^+Ck7)XAAO*R5PS>-d;$O>Dj9u=$q5Vz0s&i68WXXH zeS9Ygd=d^wX)Q0h;Cu}ye0u?Y9bFtA8^?s<3k?nOe*6F!AtQvbLi`pikTB1Wg92GF zctaR(!5#z+{WPet;zfmBf5PqABO#lEfPN0dpny-GNRk*GoD66nPQimAEu(_sf5 z62HAHnGvOc9Y;V^5HvI!%BKhb)bYSnC()-U8w}{7Dd)(mSP>{e0fa-d&n z8aO)mD4e}mG@uzfOMb+i>-4DsE;fwhz(L|{NvsMAlo1hR%@Yl0F+$bC0|gNwqlO&mo zx#WY=0husI(Byc-;xx!`D9!kAQ$&cE8%jau3`iix5-dSl^zi*{A9Dd?Y!F$Y#{~)H zhWaRQ(4h<)CwKr+T|S3E-~|J6(2xfWIDq#NG8t5nf(s=~kwQ?3L{Py6Do{WH2O1cp xk0B5AF@XmffN((u1S%3i9~Mk7fdzetcgO<~KwwG)BQnw>B|ru#q#%I+06XZSuu}j4 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/skip-right-4.gif b/component/site/assets/images/skip-right-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..53042c0c595c082f6c4126ee299b7b487756d284 GIT binary patch literal 718 zcmc(c+e_1N9ELxKuQ-)u>VBrF;jy&ivQR^-k)Xf+j)*6+5`|$wTSV zp+YWcMgF7%njlkzlITW)5W1<0BCoQG$Zksiir&lj;&~rZL(I>JMwp)xO%V+<_cOmh9AKV7>=oh_Vn7I=5VMGLh@(U?#6*B%L@%?4+0RS> z3^2spx6ueui5O<~F}pV4h>b)MqB6wiL<)c=qPxu1M3;$1nd1N)LZ|?e0WuLY0PM_N zL;+^E5Lbv=h;A}#iEPY^01Jrw5aR)MAnJ&m%-4uqLYRmiFrOh(0z5&yN>qh-oB0-V z3P27(D^V$;g}DH6f+)xv%Ks;M>jD7`uy=EQ^Am{wYc^PI-FAo5<@R`e{y?y&x3B-6 zUvJ0?>WB4JL*eb)0%5)GXz4&$S9dDgH?BK|MU&Cvl1k&1C8_x2L64laNM#4ya_YNO zs9uUHmzPz$TypZtN@3<9r=0Zp%g)9UhphO%s@UK3EgHA>b1kpIF2}F`S-+5fqFWY< z?24X+#3Wm5oc^uc=FCoL#*lU@AElJ?ia?yO z*DW1&e$lyFIF{>vKOD(WME33W$ literal 0 HcmV?d00001 diff --git a/component/site/assets/images/slimbox/closelabel.gif b/component/site/assets/images/slimbox/closelabel.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d5e54736dc2a81b61790fb3b9d72c7e2e6b6eba GIT binary patch literal 1634 zcmV-o2A%ndP)F7;bNGTUrYp1%UzbHBbu3M5EcF0}>PYic?0=;AAs1!9*o-#7GE=(akK8nV1+g z#$;qB{+Njv!u;V6GYtb2%uvD)G%_FxQNEm(e%x|94+UcK5(I!sp=&H!y# zQUHtS3knL%6%`e6>({SO0g9|vYoT7R|4gkQisDm;!_hx5Fwlu84EFW)IRruQPESuS zfWyb&Uy7Jx(5I!P88>g<993FcnzColp6@Ld%U5c}w{PD{9*;+pnwlCEwGSUY{DufL zAriva*qHO(yLVoQ$pDEE&U+p(CnqOUSTj31I==Mzd}DqLuh%PGyLQdHW5*5`6dY>6 zK<9-E7rbt_TVivc-oJmp26<0GgraFpwzf7LsVOQd%2rZRl6mXatxE6-M0)SuJrSPG z6UkCQ9XOvnc_NYy)B75-G)8V(j9dp80c(DKe){?I=Sz{daZ+w;YxAOz7{T(Ox#!NE z6BP2RSFctkCMK?-wTVMraP*@GEU~e%iH8p#-ZnQk_q*aLBV94BT)E;UVia8uWH~?r zaWF29Q>qvtHss{wSWy^R(b3TrE|*I>c<`VHISzznDR9t9PU z9XobRn4FvxQIwxQeE6^$brT7(LG3Y-uYyuyb#?W&(b3Ug$;S6vt_vq`bGcw=XPK56_-GlMAh}v9UffGBO*oSRg|77jmq8V@x9y~B1XIk~5r%s)cbH11k@-NX7?bBg0nRsEJuh>pdk$SF>uRZjbi0EaNvNOwaiJ>L?dLS#G&3!er5@I;Xt9yo<4oLk1RTV z{I~%N@R}74YOB|;UzdyR#*G_~XJ==pAa)W5OZY9Z=5J3b_b`Tz!COAO+X}l(0~p zK-c-13_v4k$NubUZf+hTl$V!xBN`p_A3$?XkPg$`z}50l`+B% zq{DQrDo?rPFZ9d+1_NMJ!SJ7jB(_DofS`bViwx4z7y3{+GlD&p_fS1QgQOx+llj9D ggvZL~f@JyeFC_0tC@V3oP5=M^07*qoM6N<$f{XSAQ2+n{ literal 0 HcmV?d00001 diff --git a/component/site/assets/images/slimbox/loading.gif b/component/site/assets/images/slimbox/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..e552f291bb52810f9a64f99159d23c6e7aceb05d GIT binary patch literal 1588 zcmZXUdo+}39LJw|=h8cx)eNI%G&H0_GZJBR+1_#6A(u&mlFK-n8e^1ORN5LtGqTcb zDj6k_T-s1BF=CTTvR#oVxm4079Z_2yo!Yl;&+hEm=bz`F-+4a2@8vu{xVv#2!DztnwqMrsuBnU;D5*D%WQ8~!3Jk8-_^#-8jC>( zOg`f9I_S;%I{funfa@T4xR;uodwFZgN57c(K&D^;7teAxTHsXF-As7>X+)3x_`rb6 zBz+emyXM8C@AU=?RE|XQ$wD8~`jh6^<{_afhnZ(6njqxS+Qai|2Es0@Cu90VLlskQ zj-mVJ@4&8>d*b}GtRzj;+F}j$LQvD%1`zB}DYz7y*qnX6BeA%P zM6Vg;zv5^>4;8l=6}J?&AIESE6muor2)RGsKX1#)lA>BVYfHOF4dj`SLMa0J=T_nm zmOjm*;vi4=fZrD_!kE7er1AD|WWNBnSGS40{y5&tXqu>7g;ccsme6p8@6a=<#rx{4 z5zs|>;V5q#&2F3>qdOpw^$2}=JR;POF-F=MOQ~7(Zi#Tr(D?dQ^(kHJP54raJ{2uv z*p5PmyAj}EVj2{jKC-7VqUL7Hig=Sy_81f}x>zO}n`!sp+112ZVw35ymX=!FStyqd zC@43G+(Asw=R^uqn}-spCxpJv8a#Km_sdS>tliDdCk&)Z`}Lfq*cU&8tJgrKnMX#) z1M<_POPNQJs=8aaO2b!rBWCsuBEIzm^={wfE(KDdA0OQited~&6+sJ#NM=owsFl8e!^*J$JGCx1spjxcMn0TLVl!`2(lVas9Z5(Dn1`t~ruJO+9 z9d9e1NT{kW>|0k!+B#S+OEMtC@YKu%4o`@KXgP@ylz3FpKRx|MG)9TB8Xf>s|jjmc5W_n-h2;7hOxrJOw?m8G~WOz227jVHp$>4eCQ78rD~=>xX!@DPa0%#DqmBpKkgw$joOFIXvplG*NIFpy6 zbAx(R4T)krNF;*qgLi=g+gEkwJyRd!)a#ETPGYQ8H9r^OZhM}!lj!s8@Vi7D(a>n0 z6#*yG4jD#^^{vc-f0db|44>&ykBQv;)5Pfni6tzJY!09$hbaJZ5$^oA0XJ ziFKUu&EubQTo&nz^UU|a5s}qHAcd!(ih*v*zIVA!!V_;UTCb)fS8=dX=_zPwu|Di` z`r!LO`(-WQb$ChOufiwxaqKdO=hGBh!p`M{<{!^ddTh0L7yzS*eyy^=nrtd-{E+VG z^%*#Phe@NGhHdQ-Twt;8#77N%kdT~jO;--hsT~i~t(bEsZaIuAlJ)p@Q1j$iBoGQ~ z2;zez;{Hm%pB$%Ol@*_s&#Y12z-WO0fY1buP|y~%IvM%9^lWSfU5342j^xo!!^QX4 z509rKTqf0OUif6^!W5TX5JS*5D7=C5P~XbfK@={opgpu;lEuppl=p>G=Ii=SpCu#f gu7!9AZ)eplQSQ!veQ(-U8t1ylUG6?>KLxD%6X;S+F#rGn literal 0 HcmV?d00001 diff --git a/component/site/assets/images/slimbox/nextlabel.gif b/component/site/assets/images/slimbox/nextlabel.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c66121faf40ef2950abb16de34fd063dc3022de GIT binary patch literal 354 zcmV-o0iFIwNk%w1VLt#M0K^;sdU|@Qs;bV;&S7C;^Yio2(9pud!rR;1ZEbCyo}QeX zoK;m-hK7c=wzlWz=hoKNhlhvH&(FTTzWVz5!NI|jl9KuP`QP8)&CShna&k#YN&o-< zGcz*)0000000000A^8LW000~SEC2ui06zdA000HwAjfTFX`X1Rt}HsXa4gSsZQppV z?|kq7z@TtQEEDG5v(jwV}*VpRx<8<0-`pa5zlY#M)-oIr#d z2c`s`grTFXW2l%ts~e55DhLY)as;+YRV14WP@TyqTUm|6s>QTRW@y&52ql|}m&B;a zQeOnyC4;BkN$Kk86A=aP@b4HG>n#=(2KoB=5)bwN00RmfNU-3Gf-poNgb@M&I}o6s A+yDRo literal 0 HcmV?d00001 diff --git a/component/site/assets/images/slimbox/prevlabel.gif b/component/site/assets/images/slimbox/prevlabel.gif new file mode 100644 index 0000000000000000000000000000000000000000..064187672c20444b0d5e80282b40ddab59296748 GIT binary patch literal 371 zcmZ?wbhEHbv}aIYI3mTcapT68mX=GGF8%%cHz_G8H#hg?%a?cV+&O;y_^w^MX3d(_ z-`~G<>C!!W_T0UDx3aSG%a<=tpFZ8ad-ttdxBmV6w{6?D-@kvKIddjFJpBLv|Hj6~ z45&cyCkrD3gA{`fNEl=%1M7zbwZ4?hc^Ru_&DyrF;Lon2-1`;l-q*bUe_%m@hmKVL zi6?vwnMraS6F2WHNMX6W%%L%Jf|P{Agp~{i91_lK!3;AvTeQ_4lu66@2PxPd<8a|f z%w|;Psf$Qb<*$)sli+spsh4a_Dpuys>`+VS^a-p@O|Ow)VPs^T9>KbNxsm`2s}k#` ziGIr#EM?4K5GY!+Ryl@ms`DhZ=_yLH)hc*mvbIfDnJ&39>x>%z$_dBnPP7!YM3j_X zPLNn|>A{Tl$forhy*_{Wsw61P{_FQI=5N~KS}GDA28}G-|3d;K4s1v~+#;atHOFJ) OBLOL~;4K`C4Auad8=cVr literal 0 HcmV?d00001 diff --git a/component/site/assets/images/spacer.gif b/component/site/assets/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9 GIT binary patch literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/component/site/assets/images/stockroom/icon_lock.gif b/component/site/assets/images/stockroom/icon_lock.gif new file mode 100644 index 0000000000000000000000000000000000000000..00280a6509e3598c8ef90cc01b061b84dbaf4d16 GIT binary patch literal 1135 zcmeH`TTfaC0DzBru((xaZ5O-M7(i;8#x1n#LwD%{&b2nNiOaH=?u9;Wd)d0K+uUj$ z2*q_$r7DwFs&dte!a>BX)i{q_cDP>zK}ETPARvkts)=rW-e1`F`n`S0cjfBki|^hz z0h|DKg+M$WUs_rk9Ub-geBp378jWT$8GCx$ZnrB)ttgP(s?UpT@Oik?kQ3P)sSv$>*qxnfUqqwP@FC^q=BCnQ?|Iz2 zzP=ua#thNa#>Pf46bc4|QyOja1NQUD$)B3;@o{;s$ZIyPXOpc;7U>X#k2G({I$Jm9CDNL#<}As0qj7{$HGg+M=CtP*f~gi&-74;;sN zsP_udrwe&h3Q1E~Mg$oK5?6aKzm$LhZsvU?DZ+qA11V!Yda8s661!Vk@{XPY(3#qw zDfySq5wLzD \ No newline at end of file diff --git a/component/site/assets/images/subcolor/thumb/index.html b/component/site/assets/images/subcolor/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/subcolor/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/up.png b/component/site/assets/images/up.png new file mode 100644 index 0000000000000000000000000000000000000000..da8a177feac71acbbbd3f7c17bfabb34ad586946 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^}!3HFmd}T9%lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqHIqW$B>F!Nk9Jow`b;CzpB>sB3V2%)COzulMrCjHZV#cbM#Ybdlxo xx))N)4HfbN|Jfe#TNrrc*$cQgePLjcVDL(an*L340Ta+#22WQ%mvv4FO#m#*MIitH literal 0 HcmV?d00001 diff --git a/component/site/assets/images/update.png b/component/site/assets/images/update.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d451bc8baef229579e15a6ca1cf260f7b74527 GIT binary patch literal 1170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?oc!Kqgt=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6N+U$v3I|BnFho_5UNX4xw z!3PDK37zG9ninxHIl;M>NarSA?1x~wXD zt8hx;lZdC5*MrVpnHgUMv>)(1ny#i7-p~7qQ=;&+h-P>$=PK)tBew$OT^?Eg7mv-g zT$8u%ef!~LQ-d!O%+62uA4)D<5>R_gY3{s5H}05vbj!0w2Ny*u%vEui8tY#A$x~@s z-dTyveM!m-HySxkcFwyi9_}lx{W)>=#5kQz`D^qqR;F$KBw+r|(JwmxV1>`bi5(r1 gvsX>A`@vzrVBQh?f0yF=9iURe)78&qol`;+0B7lpQ2+n{ literal 0 HcmV?d00001 diff --git a/component/site/assets/images/watermarked/index.html b/component/site/assets/images/watermarked/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/watermarked/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/wrapper/index.html b/component/site/assets/images/wrapper/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/wrapper/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/images/wrapper/thumb/index.html b/component/site/assets/images/wrapper/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/images/wrapper/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/index.html b/component/site/assets/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/orders/index.html b/component/site/assets/orders/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/orders/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/video/category/thumb/index.html b/component/site/assets/video/category/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/video/category/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/video/index.html b/component/site/assets/video/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/video/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/video/product/thumb/index.html b/component/site/assets/video/product/thumb/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/video/product/thumb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/xmlfile/export/index.html b/component/site/assets/xmlfile/export/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/xmlfile/export/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/xmlfile/import/index.html b/component/site/assets/xmlfile/import/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/xmlfile/import/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/assets/xmlfile/index.html b/component/site/assets/xmlfile/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/assets/xmlfile/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/controller.php b/component/site/controller.php new file mode 100644 index 00000000000..cb40c09725b --- /dev/null +++ b/component/site/controller.php @@ -0,0 +1,20 @@ +getModel('account'); + + if ($model->editTag($app->input->post->getArray())) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_TAG_EDITED_SUCCESSFULLY')); + } + else + { + $app->enqueueMessage(JText::_('COM_REDSHOP_ERROR_EDITING_TAG')); + } + + $this->setRedirect( + JRoute::_('index.php?option=com_redshop&view=account&layout=mytags&Itemid=' . $app->input->getInt('Itemid'), false) + ); + } + + /** + * Method to send created wishlist + * + * @return void + * @throws Exception + */ + public function sendWishlist() + { + $input = JFactory::getApplication()->input->post; + $itemId = $input->get('Itemid'); + $wishListId = $input->get('wishlist_id'); + + if ($input->get('emailto') == "") + { + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_EMAIL_TO'); + } + elseif ($input->get('sender') == "") + { + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_SENDER_NAME'); + } + elseif ($input->get('email') == "") + { + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_SENDER_EMAIL'); + } + elseif ($input->get('subject') == "") + { + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_SUBJECT'); + } + elseif (Redshop\Account\Wishlist::send($input->getArray())) + { + $msg = JText::_('COM_REDSHOP_SEND_SUCCESSFULLY'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SENDING'); + } + + $url = 'index.php?option=com_redshop&view=account&layout=mywishlist&mail=0&window=1&tmpl=component' + . '&wishlist_id=' . $wishListId . '&Itemid' . $itemId; + + $this->setRedirect(JRoute::_($url, false), $msg); + } + + /** + * Method to subscribe newsletter + * + * @return void + * @throws Exception + */ + public function newsletterSubscribe() + { + RedshopHelperNewsletter::subscribe(0, array(), true); + + $itemId = JFactory::getApplication()->input->getInt('Itemid'); + $this->setRedirect( + JRoute::_("index.php?option=com_redshop&view=account&Itemid=" . $itemId, false), + JText::_('COM_REDSHOP_SUBSCRIBE_SUCCESS') + ); + } + + /** + * Method to unsubscribe newsletter + * + * @return void + * @throws Exception + */ + public function newsletterUnsubscribe() + { + $user = JFactory::getUser(); + $itemId = JFactory::getApplication()->input->getInt('Itemid'); + + RedshopHelperNewsletter::removeSubscribe($user->email); + $msg = JText::_('COM_REDSHOP_CANCLE_SUBSCRIPTION'); + + $this->setRedirect(JRoute::_("index.php?option=com_redshop&view=account&Itemid=" . $itemId, false), $msg); + } + + /** + * Method to delete account user + * + * @return void + * + * @since 2.1.2 + */ + public function deleteAccount() + { + $app = JFactory::getApplication(); + $userId = JFactory::getUser()->id; + + /** + * @var RedshopModelAccount $model; + */ + $model = $this->getModel('account'); + $itemId = JFactory::getApplication()->input->getInt('Itemid'); + + if ($model->deleteAccount($userId)) + { + // Prepare the logout options. + $options = array( + 'clientid' => $app->get('shared_session', '0') ? null : 0, + ); + + $app->logout(null, $options); + + $app->redirect(JRoute::_('index.php?option=com_users&view=login', false), JText::_('COM_REDSHOP_ACCOUNT_DELETED_SUCCESSFULLY')); + } + else + { + $this->setRedirect(JRoute::_("index.php?option=com_redshop&view=account&Itemid=" . $itemId, false), JText::_('COM_REDSHOP_ACCOUNT_DELETED_FAIL')); + } + } +} diff --git a/component/site/controllers/account_billto.php b/component/site/controllers/account_billto.php new file mode 100644 index 00000000000..58a803e1390 --- /dev/null +++ b/component/site/controllers/account_billto.php @@ -0,0 +1,154 @@ +registerTask('add', 'edit'); + $this->registerTask('', 'edit'); + $this->registerTask('display', 'edit'); + } + + /** + * Method to edit billing Address + * + * @return void + * @throws Exception + */ + public function edit() + { + $user = JFactory::getUser(); + $billingAddresses = RedshopHelperOrder::getBillingAddress($user->id); + + Redshop\User\Billing\Billing::setGlobal($billingAddresses); + + $task = JFactory::getApplication()->input->get('submit', 'post'); + + if ($task == 'Cancel') + { + $this->registerTask('save', 'cancel'); + } + + parent::display(); + } + + /** + * Method to save Billing Address + * + * @return void + * + * @since 1.0.0 + * + * @throws Exception + */ + public function save() + { + $app = JFactory::getApplication(); + $input = $app->input; + $user = JFactory::getUser(); + $post = $input->post->getArray(); + $itemId = $input->getInt('Itemid', 0); + $setExit = $input->getInt('setexit', 0); + $return = $input->getString('return', ''); + + $post['users_info_id'] = $input->post->getInt('cid', 0); + $post['id'] = $post['user_id']; + $post['address_type'] = "BT"; + $post['email'] = $post['email1']; + $post['password'] = $input->post->get('password1', '', 'RAW'); + $post['password2'] = $input->post->get('password2', '', 'RAW'); + + if (isset($user->username)) + { + $post['username'] = $user->username; + } + + /** @var RedshopModelAccount_billto $model */ + $model = $this->getModel('account_billto'); + $redshopUser = $model->store($post); + + $msg = $redshopUser ? JText::_('COM_REDSHOP_BILLING_INFORMATION_SAVE') + : JText::_('COM_REDSHOP_ERROR_SAVING_BILLING_INFORMATION'); + + if ($return != "") + { + if ($setExit) + { + $app->redirect( + JRoute::_( + 'index.php?option=com_redshop&view=account_billto&tmpl=component&is_edit=1&return=' . $return, + false + ), + $msg + ); + } + + $link = JRoute::_('index.php?option=com_redshop&view=' . $return . '&Itemid=' . $itemId, false); + } + else + { + $link = JRoute::_('index.php?option=com_redshop&view=account&Itemid=' . $itemId, false); + } + + $this->setRedirect($link, $msg); + } + + /** + * Method called when user pressed cancel button + * + * @return void + * @throws Exception + */ + public function cancel() + { + $input = JFactory::getApplication()->input; + $itemId = $input->get('Itemid'); + $msg = JText::_('COM_REDSHOP_BILLING_INFORMATION_EDITING_CANCELLED'); + $return = $input->get('return'); + $setexit = $input->getInt('setexit', 1); + + if ($return != "") + { + $link = JRoute::_('index.php?option=com_redshop&view=' . $return . '&Itemid=' . $itemId, false); + + if (!isset($setexit) || $setexit != 0) + { + ?> + + close(); + } + } + else + { + $link = 'index.php?option=com_redshop&view=account&Itemid=' . $itemId; + } + + $this->setRedirect($link, $msg); + } +} diff --git a/component/site/controllers/account_shipto.php b/component/site/controllers/account_shipto.php new file mode 100644 index 00000000000..58fd9f26a2e --- /dev/null +++ b/component/site/controllers/account_shipto.php @@ -0,0 +1,143 @@ +input; + $post = $input->post->getArray(); + $return = $input->getString('return', ''); + $itemId = $input->getInt('Itemid', 0); + $setExit = $input->getInt('setexit', 1); + + $post['users_info_id'] = $input->post->getInt('cid', 1); + $post['id'] = $post['user_id']; + $post['address_type'] = REDSHOP_ADDRESS_TYPE_SHIPPING; + + /** @var RedshopModelAccount_shipto $model */ + $model = $this->getModel('account_shipto'); + $redUser = $model->store($post); + + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_SHIPPING_INFORMATION'); + $link = JRoute::_('index.php?option=com_redshop&view=account_shipto&Itemid=' . $itemId, false); + + if (false !== $redUser) + { + $post['users_info_id'] = $redUser->users_info_id; + $msg = JText::_('COM_REDSHOP_SHIPPING_INFORMATION_SAVE'); + } + + if (!empty($return)) + { + $link = JRoute::_( + 'index.php?option=com_redshop&view=' . $return + . '&users_info_id=' . $post['users_info_id'] . '&Itemid=' . $itemId, + false + ); + + if (!isset($setExit) || $setExit != 0) + { + $app->redirect('index.php?option=com_redshop&view=account_shipto&tmpl=component&is_edit=1&return=' + . $return . '&Itemid=' . $itemId, $msg); + } + } + + $this->setRedirect($link, $msg); + } + + /** + * Method to delete shipping address + * + * @return void + * @throws Exception + */ + public function remove() + { + $input = JFactory::getApplication()->input; + $itemId = $input->get('Itemid'); + $infoId = $input->getInt('infoid', 0); + + /** @var RedshopModelAccount_shipto $model */ + $model = $this->getModel('account_shipto'); + + if (!$infoId) + { + JError::raiseError(500, JText::_('COM_REDSHOP_SELECT_AN_ITEM_TO_DELETE')); + } + + if (!$model->delete($infoId)) + { + echo "\n"; + } + + $msg = JText::_('COM_REDSHOP_ACCOUNT_SHIPPING_DELETED_SUCCESSFULLY'); + $return = $input->get('return'); + $link = JRoute::_('index.php?option=com_redshop&view=account_shipto&Itemid=' . $itemId, false); + + if (!empty($return)) + { + $link = JRoute::_('index.php?option=com_redshop&view=' . $return . '&Itemid=' . $itemId, false); + } + + $this->setRedirect($link, $msg); + } + + /** + * Method called when user pressed cancel button + * + * @return void + * @throws Exception + */ + public function cancel() + { + $input = JFactory::getApplication()->input; + $itemId = $input->getInt('Itemid'); + $return = $input->get('return'); + $message = JText::_('COM_REDSHOP_SHIPPING_INFORMATION_EDITING_CANCELLED'); + + if (empty($return)) + { + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=account_shipto&Itemid=' . $itemId, false), $message); + $this->redirect(); + } + + $setExit = $input->getInt('setexit', 1); + $link = JRoute::_( + 'index.php?option=com_redshop&view=' . $return . '&users_info_id=' . $input->getInt('cid') . '&Itemid=' . $itemId . '', + false + ); + + if ($setExit != 1) + { + $this->setRedirect($link, $message); + $this->redirect(); + } + ?> + + close(); + } +} diff --git a/component/site/controllers/ask_question.php b/component/site/controllers/ask_question.php new file mode 100644 index 00000000000..5a8dc01959a --- /dev/null +++ b/component/site/controllers/ask_question.php @@ -0,0 +1,129 @@ +input->post->get('jform', array(), 'array'); + $productId = $app->input->getInt('pid', 0); + $itemId = $app->input->getInt('Itemid', 0); + $ask = $app->input->getInt('ask', 0); + $categoryId = $app->input->getInt('category_id', 0); + + /** @var RedshopModelAsk_Question $model */ + $model = $this->getModel('ask_question'); + + if ($ask) + { + $link = 'index.php?option=com_redshop&view=product&pid=' . $productId . '&cid=' . $categoryId . '&Itemid=' . $itemId; + } + else + { + $link = 'index.php?option=com_redshop&view=ask_question&pid=' . $productId . '&tmpl=component&Itemid=' . $itemId; + } + + // Validate the posted data. + $form = $model->getForm(); + + if (!$form) + { + /** @scrutinizer ignore-deprecated */ JError::raiseError(500, $model->getError()); + $this->setRedirect(JRoute::_($link, false)); + + return false; + } + + // Save the data in the session. + $app->setUserState('com_redshop.ask_question.data', $data); + + // Check captcha only for guests + if (JFactory::getUser()->guest) + { + // Check exists captcha tag in question template form + $template = RedshopHelperTemplate::getTemplate('ask_question_template'); + + if (count($template) > 0 && strstr($template[0]->template_desc, '{captcha}') + && Redshop\Helper\Utility::checkCaptcha($data, false)) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_INVALID_SECURITY'), 'warning'); + $this->setRedirect(JRoute::_($link, false)); + + return false; + } + } + + $validate = $model->validate($form, $data); + + if ($validate === false) + { + // Get the validation messages. + $errors = /** @scrutinizer ignore-deprecated */ $model->getErrors(); + + foreach ($errors as $index => $error) + { + if ($error instanceof Exception) + { + $app->enqueueMessage($error->getMessage(), 'warning'); + } + else + { + $app->enqueueMessage($error, 'warning'); + } + + if ($index > 2) + { + break; + } + } + } + else + { + $data['product_id'] = $productId; + $data['Itemid'] = $itemId; + + if ($model->sendMailForAskQuestion($data)) + { + // Flush the data from the session + $app->setUserState('com_redshop.ask_question.data', null); + $app->enqueueMessage(JText::_('COM_REDSHOP_EMAIL_HAS_BEEN_SENT_SUCCESSFULLY')); + + if (!$ask) + { + $link .= '&questionSend=1'; + } + } + else + { + $app->enqueueMessage(/** @scrutinizer ignore-deprecated */ $model->getError(), 'warning'); + } + } + + $this->setRedirect(JRoute::_($link, false)); + } +} diff --git a/component/site/controllers/cart.php b/component/site/controllers/cart.php new file mode 100644 index 00000000000..e018291a151 --- /dev/null +++ b/component/site/controllers/cart.php @@ -0,0 +1,775 @@ +cartHelper = rsCarthelper::getInstance(); + } + + /** + * Method to add product in cart + * + * @return void + * @throws Exception + */ + public function add() + { + $app = JFactory::getApplication(); + $post = $app->input->post->getArray(); + $parentAccessoryProductId = $post['product_id']; + + // Invalid request then redirect to dashboard + if (empty($app->input->post->getInt('product_id')) || empty($app->input->post->getInt('quantity'))) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_CART_INVALID_REQUEST'), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_redshop')); + } + + $productHelper = productHelper::getInstance(); + $itemId = RedshopHelperRouter::getCartItemId(); + + // Call add method of modal to store product in cart session + $userfield = $app->input->get('userfield'); + + JPluginHelper::importPlugin('redshop_product'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $dispatcher->trigger('onBeforeAddProductToCart', array(&$post)); + + $isAjaxCartBox = Redshop::getConfig()->getBool('AJAX_CART_BOX'); + $result = Redshop\Cart\Cart::addProduct($post); + + if (!is_bool($result) || (is_bool($result) && !$result)) + { + $errorMessage = $result ? $result : JText::_("COM_REDSHOP_PRODUCT_NOT_ADDED_TO_CART"); + + // Set Error Message + $app->enqueueMessage($errorMessage, 'error'); + + if ($isAjaxCartBox) + { + echo '`0`' . $errorMessage; + $app->close(); + } + else + { + $itemData = $productHelper->getMenuInformation(0, 0, '', 'product&pid=' . $post['product_id']); + + if (count($itemData) > 0) + { + $prdItemid = $itemData->id; + } + else + { + $prdItemid = RedshopHelperRouter::getItemId($post['product_id'], RedshopProduct::getInstance($post['product_id'])->cat_in_sefurl); + } + + // Directly redirect if error found + $app->redirect( + JRoute::_( + 'index.php?option=com_redshop&view=product&pid=' . $post['product_id'] . '&cid=' + . $post['category_id'] . '&Itemid=' . $prdItemid, + false + ) + ); + } + } + + $session = JFactory::getSession(); + $cart = RedshopHelperCartSession::getCart(); + $isQuotationMode = Redshop::getConfig()->getBool('DEFAULT_QUOTATION_MODE'); + $isShowQuotationPrice = Redshop::getConfig()->getBool('SHOW_QUOTATION_PRICE'); + + if (isset($cart['AccessoryAsProduct']) && !empty($post['accessory_data'])) + { + $attArr = $cart['AccessoryAsProduct']; + + if (Redshop::getConfig()->get('ACCESSORY_AS_PRODUCT_IN_CART_ENABLE')) + { + $data['accessory_data'] = $attArr[0]; + $data['acc_quantity_data'] = $attArr[1]; + $data['acc_attribute_data'] = $attArr[2]; + $data['acc_property_data'] = $attArr[3]; + $data['acc_subproperty_data'] = $attArr[4]; + + if (isset($data['accessory_data']) && ($data['accessory_data'] != "" && $data['accessory_data'] != 0)) + { + $accessories = explode("@@", $data['accessory_data']); + $accessoriesQuantity = explode("@@", $data['acc_quantity_data']); + $accessoriesAttribute = explode("@@", $data['acc_attribute_data']); + $accessoriesProperty = explode("@@", $data['acc_property_data']); + $accessoriesSubProperty = explode("@@", $data['acc_subproperty_data']); + + foreach ($accessories as $i => $accessoryId) + { + $accessory = RedshopHelperAccessory::getProductAccessories($accessoryId); + $cartData = array(); + $cartData['parent_accessory_product_id'] = $parentAccessoryProductId; + $cartData['product_id'] = $accessory[0]->child_product_id; + $cartData['quantity'] = $accessoriesQuantity[$i]; + $cartData['category_id'] = 0; + $cartData['sel_wrapper_id'] = 0; + $cartData['attribute_data'] = $accessoriesAttribute[$i]; + $cartData['property_data'] = $accessoriesProperty[$i]; + $cartData['subproperty_data'] = $accessoriesSubProperty[$i]; + $cartData['accessory_id'] = $accessories[$i]; + + $result = Redshop\Cart\Cart::addProduct($cartData); + $cart = RedshopHelperCartSession::getCart(); + + if (!is_bool($result) || !$result) + { + $errorMessage = ($result) ? $result : JText::_("COM_REDSHOP_PRODUCT_NOT_ADDED_TO_CART"); + + $app->enqueueMessage($errorMessage, 'error'); + + if (/** @scrutinizer ignore-deprecated */JError::isError(/** @scrutinizer ignore-deprecated */JError::getError())) + { + $error = /** @scrutinizer ignore-deprecated */JError::getError(); + $errorMessage = $error->getMessage(); + $app->enqueueMessage(/** @scrutinizer ignore-deprecated */$this->getError(), 'error'); + } + + if ($isAjaxCartBox) + { + echo '`0`' . $errorMessage; + $app->close(); + } + + $itemData = $productHelper->getMenuInformation(0, 0, '', 'product&pid=' . $post['product_id']); + + if (count($itemData) > 0) + { + $prdItemid = $itemData->id; + } + else + { + $prdItemid = RedshopHelperRouter::getItemId($post['product_id']); + } + + $app->redirect( + JRoute::_( + 'index.php?option=com_redshop&view=product&pid=' . $post['product_id'] . '&Itemid=' . $prdItemid, + false + ) + ); + } + } + } + } + + if (!$isQuotationMode || ($isQuotationMode && $isShowQuotationPrice)) + { + RedshopHelperCart::addCartToDatabase(); + } + + RedshopHelperCart::cartFinalCalculation(); + unset($cart['AccessoryAsProduct']); + } + else + { + if (!$isQuotationMode || ($isQuotationMode && $isShowQuotationPrice)) + { + RedshopHelperCart::addCartToDatabase(); + } + + RedshopHelperCart::cartFinalCalculation(); + } + + $link = JRoute::_( + 'index.php?option=com_redshop&view=product&pid=' . $post['product_id'] . '&Itemid=' . $itemId, + false + ); + + if (!$userfield) + { + if ($isAjaxCartBox && isset($post['ajax_cart_box'])) + { + $link = JRoute::_( + 'index.php?option=com_redshop&view=cart&ajax_cart_box=' . $post['ajax_cart_box'] . '&tmpl=component&Itemid=' . $itemId, + false + ); + } + else + { + if (Redshop::getConfig()->getInt('ADDTOCART_BEHAVIOUR') === 1) + { + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . $itemId, false); + } + else + { + if (isset($cart['notice_message']) && !empty($cart['notice_message'])) + { + $this->setMessage($cart['notice_message'], 'warning'); + } + + $this->setMessage(JText::_('COM_REDSHOP_PRODUCT_ADDED_TO_CART'), 'message'); + $link = JRoute::_($_SERVER['HTTP_REFERER'], false); + } + } + } + + $userDocuments = $session->get('userDocument', array()); + + if (isset($userDocuments[$post['product_id']])) + { + unset($userDocuments[$post['product_id']]); + $session->set('userDocument', $userDocuments); + } + + $this->setRedirect($link); + } + + /** + * Method to add coupon code in cart for discount + * + * @return void + * @throws Exception + */ + public function coupon() + { + $itemId = RedshopHelperRouter::getCartItemId(); + $app = JFactory::getApplication(); + $ajax = $app->input->getInt('ajax', 0); + + /** @var RedshopModelCart $model */ + $model = $this->getModel('Cart'); + + // Call coupon method of model to apply coupon + $valid = $model->coupon(); + + $cart = RedshopHelperCartSession::getCart(); + $this->modifyCalculation($cart); + RedshopHelperCart::cartFinalCalculation(false); + + // Store cart entry in db + RedshopHelperCart::addCartToDatabase(); + + $message = null; + $messageType = null; + + // If coupon code is valid than apply to cart else raise error + if ($valid) + { + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . $itemId, false); + + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 1) + { + foreach ($cart as $index => $value) + { + if (!is_numeric($index)) + { + continue; + } + + $checkDiscountPro = RedshopHelperDiscount::getDiscountPriceBaseDiscountDate($value['product_id']); + } + + if ($checkDiscountPro != 0) + { + $message = JText::_('COM_REDSHOP_DISCOUNT_CODE_IS_VALID_NOT_APPLY_PRODUCTS_ON_SALE'); + $messageType = 'error'; + } + else + { + $message = JText::_('COM_REDSHOP_DISCOUNT_CODE_IS_VALID'); + $messageType = 'success'; + } + } + + if (Redshop::getConfig()->get('APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT') != 1) + { + $message = JText::_('COM_REDSHOP_DISCOUNT_CODE_IS_VALID_NOT_APPLY_PRODUCTS_ON_SALE'); + $messageType = 'warning'; + } + else + { + $message = JText::_('COM_REDSHOP_DISCOUNT_CODE_IS_VALID'); + + $this->setRedirect($link, JText::_('COM_REDSHOP_DISCOUNT_CODE_IS_VALID')); + } + } + else + { + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . $itemId, false); + + $message = JText::_('COM_REDSHOP_COUPON_CODE_IS_NOT_VALID'); + $messageType = 'error'; + } + + if ($ajax) + { + $carts = RedshopHelperCart::generateCartOutput(RedshopHelperCartSession::getCart()); + + echo json_encode(array($valid, $message, $carts[0])); + + $app->close(); + } + else + { + $this->setRedirect($link, $message, $messageType); + } + } + + /** + * Method for modify calculate cart + * + * @param array $cart Cart data. + * + * @return mixed + * @throws Exception + */ + public function modifyCalculation($cart) + { + $calArr = \Redshop\Cart\Helper::calculation($cart); + $cart['product_subtotal'] = $calArr[1]; + $discountAmount = 0; + $voucherDiscount = 0; + $couponDiscount = 0; + + if (Redshop::getConfig()->getInt('DISCOUNT_ENABLE') == 1) + { + $discountAmount = Redshop\Cart\Helper::getDiscountAmount($cart); + + if ($discountAmount > 0) + { + $cart = RedshopHelperCartSession::getCart(); + } + } + + $cart['cart_discount'] = $discountAmount; + + if (array_key_exists('voucher', $cart)) + { + $voucherDiscount = RedshopHelperDiscount::calculate('voucher', $cart['voucher']); + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 2) + { + $voucherDiscount = $voucherDiscount - $cart['voucher'][1]['voucher_value']; + } + } + + $cart['voucher_discount'] = $voucherDiscount; + + if (array_key_exists('coupon', $cart)) + { + $couponDiscount = RedshopHelperDiscount::calculate('coupon', $cart['coupon']); + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 2) + { + $couponDiscount = $couponDiscount - $cart['coupon'][1]['coupon_value']; + } + } + + $cart['coupon_discount'] = $couponDiscount; + $codeDsicount = $voucherDiscount + $couponDiscount; + $totaldiscount = $cart['cart_discount'] + $codeDsicount; + + $calArr = \Redshop\Cart\Helper::calculation($cart); + + $tax = $calArr[5]; + $discountVAT = 0; + $chktag = RedshopHelperCart::taxExemptAddToCart(); + + if ((float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') && !Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT') && !empty($chktag)) + { + if (isset($cart['discount_tax']) && !empty($cart['discount_tax'])) + { + $discountVAT = $cart['discount_tax']; + $calArr[1] = $calArr[1] - $cart['discount_tax']; + $tax = $tax - $discountVAT; + } + else + { + $vatData = RedshopHelperTax::getVatRates(); + + if (isset($vatData->tax_rate) && !empty($vatData->tax_rate)) + { + $productPriceExclVAT = $cart['product_subtotal_excl_vat']; + $productVAT = $cart['product_subtotal'] - $cart['product_subtotal_excl_vat']; + $avgVAT = (($productPriceExclVAT + $productVAT) / $productPriceExclVAT) - 1; + $discountVAT = ($avgVAT * $totaldiscount) / (1 + $avgVAT); + } + } + } + + $cart['total'] = $calArr[0] - $totaldiscount; + $cart['subtotal'] = $calArr[1] + $calArr[3] - $totaldiscount; + $cart['subtotal_excl_vat'] = $calArr[2] + ($calArr[3] - $calArr[6]) - ($totaldiscount - $discountVAT); + + if ($cart['total'] <= 0) + { + $cart['subtotal_excl_vat'] = 0; + } + + $cart['product_subtotal'] = $calArr[1]; + $cart['product_subtotal_excl_vat'] = $calArr[2]; + $cart['shipping'] = $calArr[3]; + $cart['tax'] = $tax; + $cart['sub_total_vat'] = $tax + $calArr[6]; + $cart['discount_vat'] = $discountVAT; + $cart['shipping_tax'] = $calArr[6]; + $cart['discount_ex_vat'] = $totaldiscount - $discountVAT; + $cart['mod_cart_total'] = Redshop\Cart\Module::calculate($cart); + + RedshopHelperCartSession::setCart($cart); + + return $cart; + } + + /** + * Method to add voucher code in cart for discount + * + * @return void + * @throws Exception + */ + public function voucher() + { + $itemId = RedshopHelperRouter::getCartItemId(); + + /** @var RedshopModelCart $model */ + $model = $this->getModel('Cart'); + + // Call voucher method of model to apply voucher to cart if f voucher code is valid than apply to cart else raise error + if ($model->voucher()) + { + $cart = RedshopHelperCartSession::getCart(); + $this->modifyCalculation($cart); + RedshopHelperCart::cartFinalCalculation(false); + + $link = JRoute::_('index.php?option=com_redshop&view=cart&seldiscount=voucher&Itemid=' . $itemId, false); + $message = null; + $messageType = null; + + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 1) + { + foreach ($cart as $index => $value) + { + if (!is_numeric($index)) + { + continue; + } + + $checkDiscountPro = RedshopHelperDiscount::getDiscountPriceBaseDiscountDate($value['product_id']); + } + + if ($checkDiscountPro != 0) + { + $message = JText::_('COM_REDSHOP_DISCOUNT_CODE_IS_VALID_NOT_APPLY_PRODUCTS_ON_SALE'); + $messageType = 'error'; + } + else + { + $message = JText::_('COM_REDSHOP_DISCOUNT_CODE_IS_VALID'); + $messageType = 'success'; + } + } + + if (Redshop::getConfig()->getInt('APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT') != 1) + { + $this->setRedirect($link, JText::_('COM_REDSHOP_DISCOUNT_CODE_IS_VALID_NOT_APPLY_PRODUCTS_ON_SALE'), 'warning'); + } + else + { + $this->setRedirect($link, JText::_('COM_REDSHOP_DISCOUNT_CODE_IS_VALID')); + } + } + else + { + $msg = JText::_('COM_REDSHOP_VOUCHER_CODE_IS_NOT_VALID'); + $link = JRoute::_('index.php?option=com_redshop&view=cart&msg=' . $msg . '&seldiscount=voucher&Itemid=' . $itemId, false); + $this->setRedirect($link, $msg, 'error'); + } + } + + /** + * Method to update product info in cart + * + * @return void + * @throws Exception + */ + public function update() + { + $post = JFactory::getApplication()->input->post->getArray(); + + /** @var RedshopModelCart $model */ + $model = $this->getModel('cart'); + + if (isset($post['checkQuantity'])) + { + unset($post['checkQuantity']); + } + + // Call update method of model to update product info of cart + $model->update($post); + + RedshopHelperCart::cartFinalCalculation(); + RedshopHelperCart::addCartToDatabase(); + + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . RedshopHelperRouter::getCartItemId(), false); + $this->setRedirect($link); + } + + /** + * Method to update all product info in cart + * + * @return void + * @throws Exception + */ + public function update_all() + { + $post = JFactory::getApplication()->input->post->getArray(); + + /** @var RedshopModelCart $model */ + $model = $this->getModel('cart'); + + // Call update_all method of model to update all products info of cart + $model->update_all($post); + + RedshopHelperCart::cartFinalCalculation(); + RedshopHelperCart::addCartToDatabase(); + + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . RedshopHelperRouter::getCartItemId(), false); + $this->setRedirect($link); + } + + /** + * Method to make cart empty + * + * @return void + */ + public function empty_cart() + { + /** @var RedshopModelCart $model */ + $model = $this->getModel('cart'); + + // Call empty_cart method of model to remove all products from cart + $model->emptyCart(); + $user = JFactory::getUser(); + + if ($user->id) + { + RedshopHelperCart::removeCartFromDatabase(0, $user->id, true); + } + + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . RedshopHelperRouter::getCartItemId(), false); + $this->setRedirect($link); + } + + /** + * Method to delete cart entry from session + * + * @return void + * @throws Exception + */ + public function delete() + { + $post = JFactory::getApplication()->input->post->getArray(); + $cartElement = $post['cart_index']; + + /** @var RedshopModelCart $model */ + $model = $this->getModel('cart'); + + $model->delete($cartElement); + RedshopHelperCart::cartFinalCalculation(); + RedshopHelperCart::addCartToDatabase(); + + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . RedshopHelperRouter::getCartItemId(), false); + $this->setRedirect($link); + } + + /** + * Method to delete cart entry from session by ajax + * + * @return void + * + * @throws Exception + */ + public function ajaxDeleteCartItem() + { + \Redshop\Helper\Ajax::validateAjaxRequest(); + + $app = JFactory::getApplication(); + $input = $app->input; + $cartElement = $input->post->getInt('idx'); + + /** @var RedshopModelCart $model */ + $model = $this->getModel('cart'); + + $input->set('ajax_cart_box', 1); + $model->delete($cartElement); + + RedshopHelperCart::addCartToDatabase(); + RedshopHelperCart::cartFinalCalculation(); + + $carts = RedshopHelperCart::generateCartOutput(RedshopHelperCartSession::getCart()); + + echo $carts[0]; + + $app->close(); + } + + /** + * discount calculator Ajax Function + * + * @return void + * @throws Exception + */ + public function discountCalculator() + { + ob_clean(); + $get = JFactory::getApplication()->input->get->getArray(/** @scrutinizer ignore-type */ 'GET'); + rsCarthelper::getInstance()->discountCalculator($get); + + JFactory::getApplication()->close(); + } + + /** + * Method to add multiple products by its product number using mod_redmasscart module. + * + * @return void + * @throws Exception + */ + public function redmasscart() + { + $app = JFactory::getApplication(); + $post = $app->input->post->getArray(); + + // Check for request forgeries. + if (!JSession::checkToken()) + { + $msg = JText::_('COM_REDSHOP_TOKEN_VARIFICATION'); + $rurl = base64_decode($post["rurl"]); + $app->redirect($rurl, $msg);; + } + + if ($post["numbercart"] == "") + { + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_PRODUCT_NUMBER'); + $rurl = base64_decode($post["rurl"]); + $app->redirect($rurl, $msg); + } + + /** @var RedshopModelCart $model */ + $model = $this->getModel('cart'); + $model->redmasscart($post); + + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . $app->input->getInt('Itemid'), false); + $this->setRedirect($link); + } + + /** + * Get Shipping rate function + * + * @return void + * @throws Exception + */ + public function getShippingrate() + { + echo Redshop\Shipping\Rate::calculate(); + + JFactory::getApplication()->close(); + } + + /** + * Change Attribute + * + * @return void + * @throws Exception + */ + public function changeAttribute() + { + $post = JFactory::getApplication()->input->post->getArray(); + + /** @var RedshopModelCart $model */ + $model = $this->getModel('cart'); + + $cart = \Redshop\Cart\Cart::modify($model->changeAttribute($post), JFactory::getUser()->id); + + RedshopHelperCartSession::setCart($cart); + RedshopHelperCart::cartFinalCalculation(); + + ?> + + input->getInt('Itemid'), false); ?> + + close(); + } + + /** + * Get product tax for ajax request + * + * @return void + * @throws Exception + */ + public function ajaxGetProductTax() + { + \Redshop\Helper\Ajax::validateAjaxRequest('get'); + + $app = JFactory::getApplication(); + + $productId = $app->input->getInt('id', 0); + $productPrice = $app->input->getFloat('price', 0); + $userId = $app->input->getInt('userId', 0); + $taxExempt = $app->input->getBool('taxExempt', false); + + $product = new Registry; + $product->set( + 'tax', + RedshopHelperProduct::getProductTax( + $productId, + $productPrice, + $userId, + /** @scrutinizer ignore-type */ $taxExempt + ) + ); + + ob_clean(); + echo $product; + + $app->close(); + } +} diff --git a/component/site/controllers/catalog.php b/component/site/controllers/catalog.php new file mode 100644 index 00000000000..33d6442fba2 --- /dev/null +++ b/component/site/controllers/catalog.php @@ -0,0 +1,95 @@ +input; + $post = $input->post->getArray(); + $itemId = $input->get('Itemid'); + + /** @var RedshopModelCatalog $model */ + $model = $this->getModel('catalog'); + + $post["registerDate"] = time(); + $post["email"] = $post["email_address"]; + $post["name"] = $post["name_2"]; + + $row = $model->catalogStore($post); + + if ($row) + { + Redshop\Mail\Catalog::sendRequest($row); + $msg = JText::_('COM_REDSHOP_CATALOG_SEND_SUCCSEEFULLY'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_CATALOG_SEND_SUCCSEEFULLY'); + } + + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=catalog&Itemid=' . $itemId, false), $msg); + } + + /** + * Method to send catalog sample + * + * @return void + * + * @throws Exception + */ + public function catalogsample_send() + { + $input = JFactory::getApplication()->input; + $post = $input->post->getArray(); + $itemId = $input->get('Itemid'); + + /** @var RedshopModelCatalog $model */ + $model = $this->getModel('catalog'); + + if (isset($post["sample_code"])) + { + $colourId = implode(",", $post["sample_code"]); + $post ['colour_id'] = $colourId; + } + + $post["registerdate"] = time(); + $post["email"] = $post["email_address"]; + $post["name"] = $post["name_2"]; + $row = $model->catalogSampleStore($post); + + if ($row) + { + RedshopHelperExtrafields::extraFieldSave($post, RedshopHelperExtrafields::SECTION_COLOR_SAMPLE, $post['request_id']); + $msg = JText::_('COM_REDSHOP_SAMPLE_SEND_SUCCSEEFULLY'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAMPLE_SEND_SUCCSEEFULLY'); + } + + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=catalog&layout=sample&Itemid=' . $itemId, false), $msg); + } +} diff --git a/component/site/controllers/category.php b/component/site/controllers/category.php new file mode 100644 index 00000000000..90cfec5bb12 --- /dev/null +++ b/component/site/controllers/category.php @@ -0,0 +1,345 @@ +input->getString('file', ''); + $db = JFactory::getDbo(); + $this->_table_prefix = "#__redshop_"; + + session_cache_limiter('public'); + + // To avoid an error notice of an undefined index. + if (empty($_SERVER['HTTP_REFERER'])) + { + $_SERVER['HTTP_REFERER'] = 'NoRef'; + } + + if (empty($_SERVER['REMOTE_ADDR'])) + { + return false; + } + + $query = "SELECT x.* FROM " . $this->_table_prefix . "xml_export AS x " + . "WHERE x.published=1 " + . "AND x.filename='" . $filename . "' "; + $db->setQuery($query); + $data = $db->loadObject(); + + if (count($data) > 0) + { + if (!$data->use_to_all_users && $_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']) + { + $query = "SELECT x.*,xl.*,xi.* FROM " . $this->_table_prefix . "xml_export AS x " + . "LEFT JOIN " . $this->_table_prefix . "xml_export_log AS xl ON x.xmlexport_id=xl.xmlexport_id " + . "LEFT JOIN " . $this->_table_prefix . "xml_export_ipaddress AS xi ON x.xmlexport_id=xi.xmlexport_id " + . "WHERE x.published=1 " + . "AND (x.filename=" . $db->quote((string) $filename) . " " + . "OR xl.xmlexport_filename=" . $db->quote((string) $filename) . ") " + . "AND xi.access_ipaddress=" . $db->quote((string) $_SERVER['REMOTE_ADDR']) . " " + . "ORDER BY xl.xmlexport_date DESC "; + $db->setQuery($query); + $data = $db->loadObject(); + + if (count($data) <= 0) + { + echo $msg = JText::_('COM_REDSHOP_YOU_ARE_NOT_AUTHORIZED_TO_ACCESS'); + + return false; + } + } + } + else + { + echo $msg = JText::_('COM_REDSHOP_XMLFILE_IS_UNPUBLISHED'); + + return false; + } + + // Clean them variables boys (always clean variables at the start of your script to prevent injection attacks. Always limit input to expected chars and patterns.) + if (preg_match('/^([A-Za-z0-9.?=_\-\/:\s(%20)]{1,255})$/', stripslashes($_SERVER['HTTP_REFERER']), $matchref)) + { + $tempvar = $matchref[0]; + } + else + { + $tempvar = 'NoRef'; + } + + define('HTTP_REF', $tempvar); + + if (preg_match('/^([0-9.]{7,24})$/', stripslashes($_SERVER['REMOTE_ADDR']), $matchadd)) + { + $tempvar = $matchadd[0]; + } + else + { + $tempvar = '1.1.1.1'; + } + + // Required for IE, otherwise Content-disposition is ignored + if (ini_get('zlib.output_compression')) + { + ini_set('zlib.output_compression', 'Off'); + } + + $filepath = '#'; + + if ($filename != "") + { + $filepath = JPATH_COMPONENT_SITE . "/assets/xmlfile/export/" . $filename; + + if (!JFile::exists($filepath)) + { + JError::raiseError(500, "Oops. File not found"); + JFactory::getApplication()->close(); + } + } + else + { + JError::raiseError(500, "File name not specified"); + } + + session_write_close(); + + // IE Bug in download name workaround + if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) + { + try + { + ini_set('zlib.output_compression', 'Off'); + } + catch (Exception $ex) + { + JFactory::getApplication()->enqueueMessage($ex->getMessage(), 'error'); + } + } + + if (!$this->downloadFile($filepath)) + { + JError::raiseError('', 'The file transfer failed'); + } + + die(); + } + + /** + * Logic for download + * + * @param string $fil path + * @param null $p null variable not used + * + * @return bool + */ + public function downloadFile($fil, $p = null) + { + ob_clean(); + + if (connection_status() != 0) + { + return (false); + } + + $fn = basename($fil); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + header("Expires: " . gmdate("D, d M Y H:i:s", mktime(date("H") + 2, date("i"), date("s"), date("m"), date("d"), date("Y"))) . " GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Content-Transfer-Encoding: binary"); + + // TODO: Not sure of this is working + if (function_exists('mime_content_type')) + { + $ctype = mime_content_type($fil); + } + elseif (function_exists('finfo_file')) + { + $finfo = finfo_open(FILEINFO_MIME); + $ctype = finfo_file($finfo, $fil); + finfo_close($finfo); + } + else + { + $ctype = "application/octet-stream"; + } + + header('Content-Type: ' . $ctype); + + if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) + { + // Workaround for IE filename bug with multiple periods / multiple dots in filename + // that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe + $iefilename = preg_replace('/\./', '%2e', $fn, substr_count($fn, '.') - 1); + header("Content-Disposition: attachment; filename=\"$iefilename\""); + } + else + { + header("Content-Disposition: attachment; filename=\"$fn\""); + } + + header("Accept-Ranges: bytes"); + + // Default to begining of file + $range = 0; + + // @ToDo make the download speed configurable + $size = filesize($fil); + + // Check if http_range is set. If so, change the range of the download to complete. + if (isset($_SERVER['HTTP_RANGE'])) + { + list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']); + str_replace($range, "-", $range); + $size2 = $size - 1; + $new_length = $size - $range; + header("HTTP/1.1 206 Partial Content"); + header("Content-Length: $new_length"); + header("Content-Range: bytes $range$size2/$size"); + } + else + { + $size2 = $size - 1; + header("HTTP/1.0 200 OK"); + header("Content-Range: bytes 0-$size2/$size"); + header("Content-Length: " . $size); + } + + // Check to ensure it is not an empty file so the feof does not get stuck in an infinte loop. + if ($size == 0) + { + JError::raiseError(500, 'ERROR.ZERO_BYE_FILE'); + JFactory::getApplication()->close(); + } + + if (version_compare(PHP_VERSION, '5.3.0', '<')) + { + // Disable magic quotes for older version of php + set_magic_quotes_runtime(0); + } + + // We should check to ensure the file really exits to ensure feof does not get stuck in an infite loop, but we do so earlier on, so no need here. + $fp = fopen("$fil", "rb"); + + // Go to the start of missing part of the file + fseek($fp, $range); + + if (function_exists("set_time_limit")) + set_time_limit(0); + + while (!feof($fp) && connection_status() == 0) + { + // Reset time limit for big files + if (function_exists("set_time_limit")) + { + set_time_limit(0); + } + + print(fread($fp, 1024 * 8)); + flush(); + ob_flush(); + } + + sleep(1); + fclose($fp); + + return ((connection_status() == 0) and !connection_aborted()); + } + + /** + * Autofill city name + * + * @return string + */ + public function autofillcityname() + { + $db = JFactory::getDbo(); + ob_clean(); + $mainzipcode = $this->input->getString('q', ''); + $sel_zipcode = "select city_name from #__redshop_zipcode where zipcode='" . $mainzipcode . "'"; + $db->setQuery($sel_zipcode); + echo $db->loadResult(); + JFactory::getApplication()->close(); + } + + /** + * Generate XML file. + * + * @return void + */ + public function generateXMLExportFile() + { + $app = JFactory::getApplication(); + $exportId = $this->input->getInt('xmlexport_id'); + + if ($exportId) + { + $xmlHelper = new xmlHelper; + $xmlHelper->writeXMLExportFile($exportId); + $row = $xmlHelper->getXMLExportInfo($exportId); + $link = JRoute::_(JURI::root() . 'index.php?option=com_redshop&view=category&tmpl=component&task=download&file=' . $row->filename); + $app->redirect($link); + } + } +} diff --git a/component/site/controllers/checkout.php b/component/site/controllers/checkout.php new file mode 100644 index 00000000000..fbba5e92b0c --- /dev/null +++ b/component/site/controllers/checkout.php @@ -0,0 +1,853 @@ +_order_functions = order_functions::getInstance(); + $this->_shippinghelper = shipping::getInstance(); + JFactory::getApplication()->input->set('layout', 'default'); + parent::__construct($default); + } + + /** + * Method to store user detail when user do checkout. + * + * @return void + * + * @throws Exception + */ + public function checkoutprocess() + { + $input = JFactory::getApplication()->input; + $post = $input->post->getArray(); + + /** @var RedshopModelCheckout $model */ + $model = $this->getModel('checkout'); + + if ($model->store($post)) + { + $this->setRedirect( + JRoute::_('index.php?option=com_redshop&view=checkout&Itemid=' . $input->get('Itemid'), false) + ); + } + else + { + $input->set('view', 'checkout'); + $input->set('task', ''); + parent::display('default'); + } + } + + /** + * Method for checkout second step. + * + * @return void + * + * @throws Exception + */ + public function checkoutnext() + { + $app = JFactory::getApplication(); + $input = $app->input; + $session = JFactory::getSession(); + $post = $input->post->getArray(); + $cart = RedshopHelperCartSession::getCart(); + + if (isset($post['extrafields0']) && isset($post['extrafields']) && count($cart) > 0) + { + if (count($post['extrafields0']) > 0 && count($post['extrafields']) > 0) + { + for ($r = 0, $countExtrafield = count($post['extrafields']); $r < $countExtrafield; $r++) + { + $post['extrafields_values'][$post['extrafields'][$r]] = $post['extrafields0'][$r]; + } + + $cart['extrafields_values'] = $post['extrafields_values']; + RedshopHelperCartSession::setCart($cart); + } + } + + $Itemid = $input->post->getInt('Itemid', 0); + $users_info_id = $input->post->getInt('users_info_id', 0); + $ccinfo = $input->post->getString('ccinfo', ''); + $rs_user = $session->get('rs_user'); + + if ($users_info_id) + { + $rs_user['rs_user_info_id'] = $users_info_id; + } + + $rs_user = $session->set('rs_user', $rs_user); + $chk = $this->chkvalidation($users_info_id); + + if (!empty($chk)) + { + if ($chk == 1) + { + $link = 'index.php?option=com_redshop&view=account_billto&return=checkout&setexit=0&Itemid=' . $Itemid; + } + else + { + $link = 'index.php?option=com_redshop&view=account_shipto&task=addshipping&setexit=0&return=checkout&infoid=' . $users_info_id . '&Itemid=' . $Itemid; + } + + $app->redirect(JRoute::_($link, false)); + } + + $errormsg = ""; + + if ($ccinfo == 1) + { + $errormsg = $this->setcreditcardInfo(); + + } + + if ($errormsg != "") + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid, false), $errormsg); + } + else + { + $view = $this->getView('checkout', 'next'); + parent::display(); + } + } + + /** + * Update GLS Location + * + * @return void + * + * @throws Exception + */ + public function updateGLSLocation() + { + $app = JFactory::getApplication(); + $input = $app->input; + JPluginHelper::importPlugin('redshop_shipping'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $usersInfoId = $input->getInt('users_info_id', 0); + $values = RedshopHelperUser::getUserInformation(0, '', $usersInfoId, false); + $values->zipcode = $input->get('zipcode', ''); + $ShopResponses = $dispatcher->trigger('GetNearstParcelShops', array($values)); + + if ($ShopResponses && isset($ShopResponses[0]) && $ShopResponses[0]) + { + if (is_array($ShopResponses[0])) + { + $ShopRespons = $ShopResponses[0]; + $shopList = array(); + + for ($i = 0, $c = count($ShopRespons); $i < $c; $i++) + { + $shopList[] = JHTML::_('select.option', $ShopRespons[$i]->shop_id, $ShopRespons[$i]->CompanyName . ", " . $ShopRespons[$i]->Streetname . ", " . $ShopRespons[$i]->ZipCode . ", " . $ShopRespons[$i]->CityName); + } + + echo JHTML::_('select.genericlist', $shopList, 'shop_id', 'class="inputbox" ', 'value', 'text', $ShopRespons[0]->shop_id); + } + else + { + echo $ShopResponses[0]; + } + } + + $app->close(); + } + + /** + * Get Shipping Information + * + * @return void + * + * @throws Exception + */ + public function getShippingInformation() + { + $app = JFactory::getApplication(); + $plugin = $app->input->getCmd('plugin', ''); + + JPluginHelper::importPlugin('redshop_shipping'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $dispatcher->trigger('on' . $plugin . 'AjaxRequest'); + + $app->close(); + } + + /** + * Check validation + * + * @param integer $users_info_id not used + * + * @return integer + * + * @throws Exception + */ + public function chkvalidation($users_info_id) + { + /** @var RedshopModelCheckout $model */ + $model = $this->getModel('checkout'); + $billingaddresses = $model->billingaddresses(); + $return = 0; + + if (!$billingaddresses->is_company) + { + if ($billingaddresses->firstname == '') + { + $return = 1; + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_FIRST_NAME'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + elseif ($billingaddresses->lastname == '') + { + $return = 1; + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_LAST_NAME'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + } + else + { + if ($billingaddresses->company_name == '') + { + $return = 1; + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_COMPANY_NAME'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + + if ($billingaddresses->firstname == '') + { + $return = 1; + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_FIRST_NAME'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + elseif ($billingaddresses->lastname == '') + { + $return = 1; + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_LAST_NAME'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + elseif (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1 && trim($billingaddresses->ean_number) != '') + { + RedshopEconomic::createUserInEconomic($billingaddresses); + + if (/** @scrutinizer ignore-deprecated */ JError::isError(/** @scrutinizer ignore-deprecated */ JError::getError())) + { + $return = 1; + $error = /** @scrutinizer ignore-deprecated */ JError::getError(); + $msg = $error->getMessage(); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + } + } + + if (!trim($billingaddresses->address)) + { + $return = 1; + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_ADDRESS'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + elseif (!$billingaddresses->country_code) + { + $return = 1; + $msg = JText::_('COM_REDSHOP_PLEASE_SELECT_COUNTRY'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + elseif (!$billingaddresses->zipcode) + { + $return = 1; + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_ZIPCODE'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + elseif (!$billingaddresses->phone) + { + $return = 1; + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_PHONE'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + + if ($billingaddresses->is_company == 1) + { + $extrafield_name = RedshopHelperExtrafields::CheckExtraFieldValidation( + RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS, $billingaddresses->users_info_id + ); + + if (!empty($extrafield_name)) + { + $return = 1; + $msg = $extrafield_name . JText::_('COM_REDSHOP_IS_REQUIRED'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + } + else + { + $extrafield_name = RedshopHelperExtrafields::CheckExtraFieldValidation( + RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS, $billingaddresses->users_info_id + ); + + if (!empty($extrafield_name)) + { + $return = 1; + $msg = $extrafield_name . JText::_('COM_REDSHOP_IS_REQUIRED'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + } + + if (Redshop::getConfig()->get('SHIPPING_METHOD_ENABLE') && $users_info_id != $billingaddresses->users_info_id) + { + if ($billingaddresses->is_company == 1) + { + $extrafield_name = RedshopHelperExtrafields::CheckExtraFieldValidation( + RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS, $users_info_id + ); + + if (!empty($extrafield_name)) + { + $return = 2; + $msg = $extrafield_name . JText::_('COM_REDSHOP_IS_REQUIRED'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + } + else + { + $extrafield_name = RedshopHelperExtrafields::CheckExtraFieldValidation( + RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS, $users_info_id + ); + + if (!empty($extrafield_name)) + { + $return = 2; + $msg = $extrafield_name . JText::_('COM_REDSHOP_IS_REQUIRED'); + /** @scrutinizer ignore-deprecated */ JError::raiseWarning('', $msg); + + return $return; + } + } + } + + return $return; + } + + /** + * Checkout final step function + * + * @return void + * + * @throws Exception + */ + public function checkoutfinal() + { + $app = JFactory::getApplication(); + $input = $app->input; + $dispatcher = RedshopHelperUtility::getDispatcher(); + $post = $input->post->getArray(); + $Itemid = $input->post->getInt('Itemid', 0); + + /** @var RedshopModelCheckout $model */ + $model = $this->getModel('checkout'); + $session = JFactory::getSession(); + $cart = $session->get('cart'); + $user = JFactory::getUser(); + $producthelper = productHelper::getInstance(); + $payment_method_id = $input->post->getString('payment_method_id', ''); + + if (isset($post['extrafields0']) && isset($post['extrafields']) && count($cart) > 0) + { + if (count($post['extrafields0']) > 0 && count($post['extrafields']) > 0) + { + for ($r = 0, $countExtrafield = count($post['extrafields']); $r < $countExtrafield; $r++) + { + $post['extrafields_values'][$post['extrafields'][$r]] = $post['extrafields0'][$r]; + } + + $cart['extrafields_values'] = $post['extrafields_values']; + RedshopHelperCartSession::setCart($cart); + } + } + + if (Redshop::getConfig()->get('SHIPPING_METHOD_ENABLE')) + { + $shipping_rate_id = $input->post->getString('shipping_rate_id', ''); + $shippingdetail = Redshop\Shipping\Rate::decrypt($shipping_rate_id); + + if (count($shippingdetail) < 4) + { + $shipping_rate_id = ""; + } + + if ($shipping_rate_id == '' && $cart['free_shipping'] != 1) + { + $msg = JText::_('LIB_REDSHOP_SELECT_SHIP_METHOD'); + $app->redirect(JRoute::_('index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid, false), $msg); + } + } + + if ($payment_method_id != '') + { + if (isset($cart['idx'])) + { + if ($cart['idx'] > 0) + { + $session->set('order_id', 0); + } + else + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . $Itemid, false)); + $app->close(); + } + } + + if (Redshop::getConfig()->get('ONESTEP_CHECKOUT_ENABLE')) + { + $users_info_id = $input->getInt('users_info_id'); + + if (empty($users_info_id)) + { + $userDetail = $model->store($post); + $users_info_id = $userDetail !== false ? $userDetail->users_info_id : 0; + } + + $chk = $this->chkvalidation($users_info_id); + + if (!empty($chk)) + { + if ($chk == 1) + { + $link = 'index.php?option=com_redshop&view=account_billto&return=checkout&setexit=0&Itemid=' . $Itemid; + } + else + { + $link = 'index.php?option=com_redshop&view=account_shipto&task=addshipping&setexit=0&return=checkout&infoid=' . $users_info_id . '&Itemid=' . $Itemid; + } + + $app->redirect(JRoute::_($link)); + + return; + } + + // Skip checks for free cart + if ($cart['total'] > 0) + { + $errormsg = $this->setcreditcardInfo(); + + if ($errormsg != "") + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid), $errormsg); + + return; + } + } + } + + $order_id = (int) $session->get('order_id'); + + // Import files for plugin + JPluginHelper::importPlugin('redshop_product'); + + if ($order_id === 0) + { + // Add plugin support + $dispatcher->trigger('beforeOrderPlace', array($cart)); + $orderresult = $model->orderplace(); + $order_id = $orderresult->order_id; + } + else + { + $input->set('order_id', $order_id); + } + + if ($order_id) + { + $billingaddresses = RedshopHelperOrder::getOrderBillingUserInfo($order_id); + + JPluginHelper::importPlugin('redshop_product'); + JPluginHelper::importPlugin('redshop_alert'); + $data = $dispatcher->trigger('getStockroomStatus', array($order_id)); + + $labelClass = ''; + + if ($orderresult->order_payment_status == 'Paid') + { + $labelClass = 'label-success'; + } + + $message = JText::sprintf('COM_REDSHOP_ALERT_ORDER_SUCCESSFULLY', $order_id, $billingaddresses->firstname . ' ' . $billingaddresses->lastname, $producthelper->getProductFormattedPrice($orderresult->order_total), $labelClass, $orderresult->order_payment_status); + $dispatcher->trigger('storeAlert', array($message)); + + $model->resetcart(); + + // Add Plugin support + $dispatcher->trigger('afterOrderPlace', array($cart, $orderresult)); + + JPluginHelper::importPlugin('system'); + $dispatcher->trigger('afterOrderCreated', array($orderresult)); + + // New checkout flow + /** + * change redirection + * The page will redirect to stand alon page where, payment extra infor code will execute. + * Note: ( Only when redirect payment gateway are in motion, not for credit card gateway) + * + */ + $paymentmethod = RedshopHelperOrder::getPaymentMethodInfo($payment_method_id); + $paymentmethod = $paymentmethod[0]; + $params = new \Joomla\Registry\Registry($paymentmethod->params); + $is_creditcard = $params->get('is_creditcard', 0); + $is_redirected = $params->get('is_redirected', 0); + + $session->clear('userDocument'); + + if ($is_creditcard && !$is_redirected) + { + $link = JRoute::_('index.php?option=com_redshop&view=order_detail&layout=receipt&oid=' . $order_id . '&Itemid=' . $Itemid, false); + $msg = JText::_('COM_REDSHOP_ORDER_PLACED'); + $this->setRedirect($link, $msg); + } + else + { + $link = JUri::root() . 'index.php?option=com_redshop&view=order_detail&layout=checkout_final&oid=' . $order_id . '&Itemid=' . $Itemid; + $link = JRoute::_($link, false); + $this->setRedirect($link); + } + } + else + { + $errorMsg = $model->getError(); + JError::raiseWarning(21, $errorMsg); + $app->redirect(JRoute::_('index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid, false)); + } + } + else + { + $msg = JText::_('COM_REDSHOP_SELECT_PAYMENT_METHOD'); + $app->redirect(JRoute::_('index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid, false), $msg, 'error'); + } + } + + /** + * Set credit Card info + * + * @return string + */ + public function setcreditcardInfo() + { + $input = JFactory::getApplication()->input; + $model = $this->getModel('checkout'); + $session = JFactory::getSession(); + $paymentMethodId = $input->post->getCmd('payment_method_id', ''); + $paymentMethod = RedshopHelperOrder::getPaymentMethodInfo($paymentMethodId); + $paymentParams = new JRegistry($paymentMethod[0]->params); + $isCreditcard = $paymentParams->get('is_creditcard', 0); + + if (!$isCreditcard) + { + return ""; + } + + $data = array(); + $data['order_payment_name'] = $input->post->getString('order_payment_name', ''); + $data['creditcard_code'] = $input->post->getString('creditcard_code', ''); + $data['order_payment_number'] = $input->post->getString('order_payment_number', ''); + $data['order_payment_expire_month'] = $input->post->getString('order_payment_expire_month', ''); + $data['order_payment_expire_year'] = $input->post->getString('order_payment_expire_year', ''); + $data['credit_card_code'] = $input->post->getString('credit_card_code', ''); + $data['selectedCardId'] = $input->post->getString('selectedCard', ''); + $session->set('ccdata', $data); + + $validPayment = $model->validatepaymentccinfo(); + + if ($validPayment[0]) + { + return ""; + } + + return $validPayment[1]; + } + + /** + * One Step checkout process + * + * @return void + * + * @throws Exception + */ + public function oneStepCheckoutProcess() + { + $app = JFactory::getApplication(); + $input = $app->input; + $session = JFactory::getSession(); + $redShopUser = $session->get('rs_user'); + $post = $input->post->getArray(); + $usersInfoId = $post['users_info_id']; + + if ($usersInfoId) + { + $redShopUser['rs_user_info_id'] = $usersInfoId; + } + elseif (!empty($post['anonymous'])) + { + if (!empty($post['anonymous']['BT'])) + { + $redShopUser['vatCountry'] = $post['anonymous']['BT']['country_code']; + $redShopUser['vatState'] = $post['anonymous']['BT']['state_code']; + } + + if (Redshop::getConfig()->getInt('VAT_BASED_ON') != 0 && Redshop::getConfig()->getString('CALCULATE_VAT_ON') == 'ST' + && !empty($post['anonymous']['ST'])) + { + $redShopUser['vatCountry'] = $post['anonymous']['ST']['country_code_ST']; + $redShopUser['vatState'] = $post['anonymous']['ST']['state_code_ST']; + } + } + + $session->set('rs_user', $redShopUser); + + $cartHelper = rsCarthelper::getInstance(); + + /** @var RedshopModelCheckout $model */ + $model = $this->getModel('checkout'); + $user = JFactory::getUser(); + + $cart = $session->get('cart'); + $shipping_box_id = $post['shipping_box_id']; + $shipping_rate_id = $post['shipping_rate_id']; + $customer_note = $post['customer_note']; + $req_number = $post['requisition_number']; + $customer_message = $post['rs_customer_message_ta']; + $referral_code = $post['txt_referral_code']; + + $payment_method_id = $post['payment_method_id']; + $order_total = $cart['total']; + $total_discount = $cart['cart_discount'] + $cart['voucher_discount'] + $cart['coupon_discount']; + $order_subtotal = (Redshop::getConfig()->get('SHIPPING_AFTER') == 'total') ? $cart['product_subtotal'] - $total_discount : $cart['product_subtotal_excl_vat']; + $Itemid = $post['Itemid']; + $objectName = $post['objectname']; + $rate_template_id = $post['rate_template_id']; + $cart_template_id = $post['cart_template_id']; + + $oneStepTemplateHtml = ""; + $rateTemplateHtml = ""; + + if ($objectName == "users_info_id" || $objectName == "shipping_box_id") + { + $shipping_template = RedshopHelperTemplate::getTemplate("redshop_shipping", $rate_template_id); + + if (count($shipping_template) > 0) + { + $rateTemplateHtml = $shipping_template[0]->template_desc; + } + + $return = $cartHelper->replaceShippingTemplate($rateTemplateHtml, $shipping_rate_id, $shipping_box_id, $user->id, $usersInfoId, $order_total, $order_subtotal, $post); + $rateTemplateHtml = $return['template_desc']; + $shipping_rate_id = $return['shipping_rate_id']; + } + + if ($shipping_rate_id != "") + { + $shipArr = $model->calculateShipping($shipping_rate_id); + $cart['shipping'] = $shipArr['order_shipping_rate']; + $cart['shipping_vat'] = $shipArr['shipping_vat']; + $cart = $cartHelper->modifyDiscount($cart); + } + + if ($cart_template_id != 0) + { + $templatelist = RedshopHelperTemplate::getTemplate("checkout", $cart_template_id); + $oneStepTemplateHtml = $templatelist[0]->template_desc; + + $oneStepTemplateHtml = $model->displayShoppingCart( + $oneStepTemplateHtml, $usersInfoId, $shipping_rate_id, $payment_method_id, $Itemid, $customer_note, $req_number, '', + $customer_message, $referral_code, '', $post + ); + } + + $display_shippingrate = '

    '; + $display_cart = '
    ' . $oneStepTemplateHtml . '
    '; + + $description = $display_shippingrate . $display_cart; + $lang = JFactory::getLanguage(); + $locale = $lang->getLocale(); + + if (in_array('ru', $locale)) + { + // Commented because redshop currency symbol has been changed because of ajax response + $description = html_entity_decode($description, ENT_QUOTES, 'KOI8-R'); + } + + $cart_total = RedshopHelperProductPrice::formattedPrice($cart['mod_cart_total']); + + echo eval("?>" . "`_`" . $description . "`_`" . $cart_total . "close(); + } + + /** + * Display Credit Card + * + * @return void + */ + public function displaycreditcard() + { + $app = JFactory::getApplication(); + $cart = JFactory::getSession()->get('cart'); + $carthelper = rsCarthelper::getInstance(); + + $creditcard = ""; + + if ($cart['total'] > 0) + { + $paymentMethodId = $app->input->getCmd('payment_method_id'); + + if ($paymentMethodId != "") + { + $creditcard = $carthelper->replaceCreditCardInformation($paymentMethodId); + } + + $creditcard = '
    ' . $creditcard . '
    '; + } + + ob_clean(); + echo $creditcard; + $app->close(); + } + + /** + * Display payment extra field + * + * @return void + */ + public function ajaxDisplayPaymentExtraField() + { + \Redshop\Helper\Ajax::validateAjaxRequest('get'); + + $app = JFactory::getApplication(); + $plugin = RedshopHelperPayment::info($app->input->getCmd('paymentMethod')); + + $layoutFile = new JLayoutFile('order.payment.extrafields'); + + // Append plugin JLayout path to improve view based on plugin if needed. + $layoutFile->addIncludePath(JPATH_SITE . '/plugins/' . $plugin->type . '/' . $plugin->name . '/layouts'); + + ob_clean(); + echo $layoutFile->render(array('plugin' => $plugin)); + $app->close(); + } + + /** + * Display shipping extra field + * + * @return void + */ + public function displayshippingextrafield() + { + ob_clean(); + $app = JFactory::getApplication(); + $shipping_rate_id = $app->input->post->getCmd('shipping_rate_id', ''); + $shippingmethod = RedshopHelperOrder::getShippingMethodInfo($shipping_rate_id); + $shippingparams = new JRegistry($shippingmethod[0]->params); + $extrafield_shipping = $shippingparams->get('extrafield_shipping', ''); + + $extrafield_total = ""; + $extrafield_hidden = ''; + + if (count($extrafield_shipping) > 0) + { + for ($ui = 0, $countExtrafield = count($extrafield_shipping); $ui < $countExtrafield; $ui++) + { + if ($extrafield_shipping[$ui] != "") + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($extrafield_shipping[$ui], 19, '', 0, 0, 0); + $extrafield_total .= $productUserFields[0] . " " . $productUserFields[1] . "
    "; + $extrafield_hidden .= ""; + } + } + + echo $extrafield_total . $extrafield_hidden; + $app->close(); + } + } + + /** + * Display payment method + * + * @return void + * + * @throws Exception + */ + public function ajaxDisplayPaymentAnonymous() + { + $app = JFactory::getApplication(); + $carthelper = rsCarthelper::getInstance(); + $post = $app->input->post->getArray(); + + $isCompany = $post['is_company']; + $eanNumber = $post['eanNumber']; + + $templates = RedshopHelperTemplate::getTemplate("redshop_payment"); + $templateHtml = !empty($templates) ? $templates[0]->template_desc : ''; + $templateHtml = $carthelper->replacePaymentTemplate($templateHtml, 0, $isCompany, $eanNumber); + + echo $templateHtml; + + $app->close(); + } +} diff --git a/component/site/controllers/epayrelay.php b/component/site/controllers/epayrelay.php new file mode 100644 index 00000000000..48185c824b8 --- /dev/null +++ b/component/site/controllers/epayrelay.php @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/component/site/controllers/login.php b/component/site/controllers/login.php new file mode 100644 index 00000000000..c8897132b32 --- /dev/null +++ b/component/site/controllers/login.php @@ -0,0 +1,142 @@ +input->getUsername('username', ''); + $password = $this->input->post->get('password', '', 'raw'); + $Itemid = $this->input->get('Itemid'); + $returnitemid = $this->input->get('returnitemid'); + $mywishlist = $this->input->get('mywishlist'); + $menu = JFactory::getApplication()->getMenu(); + $item = $menu->getItem($returnitemid); + + $redhelper = redhelper::getInstance(); + + $model = $this->getModel('login'); + + $shoppergroupid = $this->input->post->getInt('protalid', ''); + + $msg = ""; + + if ($shoppergroupid != 0) + { + $check = $model->CheckShopperGroup($username, $shoppergroupid); + $link = "index.php?option=com_redshop&view=login&layout=portal&protalid=" . $shoppergroupid; + + if ($check > 0) + { + $model->setlogin($username, $password); + $return = $this->input->get('return'); + } + else + { + $msg = JText::_("COM_REDSHOP_SHOPPERGROUP_NOT_MATCH"); + $return = ""; + } + } + else + { + $model->setlogin($username, $password); + $return = $this->input->get('return'); + } + + if ($mywishlist == 1) + { + $error = $model->setlogin($username, $password); + + if ($error == true) + { + $wishreturn = JRoute::_('index.php?loginwishlist=1&option=com_redshop&view=wishlist&Itemid=' . $Itemid, false); + } + else + { + $wishreturn = JRoute::_('index.php?loginwishlist=1&option=com_redshop&view=login&wishlist=1&Itemid=' . $Itemid, false); + } + $this->setRedirect($wishreturn); + } + else + { + if ($item) + { + $link = $item->link . '&Itemid=' . $returnitemid; + } + else + { + $error = $model->setlogin($username, $password); + + if ($error == true) + { + $link = JRoute::_('index.php?option=com_redshop&Itemid=' . $returnitemid, false); + } + else + { + $link = JRoute::_('index.php?option=com_redshop&view=login&Itemid=' . $Itemid, false); + } + } + + if (!empty($return)) + { + $s_Itemid = RedshopHelperRouter::getCheckoutItemId(); + $Itemid = $s_Itemid ? $s_Itemid : $Itemid; + $return = JRoute::_('index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid, false); + + $this->setRedirect($return); + } + else + { + $this->setRedirect($link, $msg); + } + } + + } + + /** + * logout function + * + * @return void + */ + public function logout() + { + $app = JFactory::getApplication(); + $params = $app->getParams('com_redshop'); + $logout_itemid = $this->input->get('logout'); + $menu = JFactory::getApplication()->getMenu(); + $item = $menu->getItem($logout_itemid); + + if ($item) + { + $link = JRoute::_($item->link . '&Itemid=' . $logout_itemid, false); + } + else + { + $link = JRoute::_('index.php?option=com_redshop', false); + } + + $app->logout(); + $this->setRedirect($link); + } +} diff --git a/component/site/controllers/manufacturers.php b/component/site/controllers/manufacturers.php new file mode 100644 index 00000000000..b3890884fba --- /dev/null +++ b/component/site/controllers/manufacturers.php @@ -0,0 +1,22 @@ +getModel('newsletter'); + $post = $this->input->post->getArray(); + $itemId = $this->input->get('Itemid'); + $newsletterId = $this->input->get('newsletteritemid'); + $menu = JFactory::getApplication()->getMenu(); + $item = $menu->getItem($newsletterId); + + if ($item) + { + $return = $item->link . '&Itemid=' . $newsletterId; + } + else + { + $return = "index.php?option=com_redshop&view=newsletter&layout=thankyou&Itemid=" . $itemId; + } + + // Check if user has already subscribe. + if ($model->checkSubscriptionByEmail($post['email'])) + { + $msg = JText::_('COM_REDSHOP_ALREADY_NEWSLETTER_SUBSCRIBER'); + } + else + { + if (RedshopHelperNewsletter::subscribe(0, $post, 1)) + { + if (Redshop::getConfig()->get('NEWSLETTER_CONFIRMATION')) + { + $msg = JText::_('COM_REDSHOP_SUBSCRIBE_SUCCESS'); + } + else + { + $msg = JText::_('COM_REDSHOP_NEWSLEETER_SUBSCRIBE_SUCCESS'); + } + } + else + { + $msg = JText::_('COM_REDSHOP_NEWSLEETER_SUBSCRIBE_FAIL'); + } + } + + $this->setRedirect($return, $msg); + } + + /** + * Method to unsubscribe newsletter + * + * @return void + * @throws Exception + */ + public function unsubscribe() + { + /** @var RedshopModelNewsletter $model */ + $model = $this->getModel('newsletter'); + $itemId = $this->input->get('Itemid'); + $email = $this->input->get('email'); + $newsletterId = $this->input->get('newsletteritemid'); + $menu = JFactory::getApplication()->getMenu(); + $item = $menu->getItem($newsletterId); + + if ($item) + { + $return = $item->link . '&Itemid=' . $newsletterId; + } + else + { + $return = "index.php?option=com_redshop&view=newsletter&layout=thankyou&Itemid=" . $itemId; + } + + // Check if user has subscribe or not. + if ($model->checkSubscriptionByEmail($email)) + { + if (RedshopHelperNewsletter::removeSubscribe($email)) + { + $msg = JText::_('COM_REDSHOP_CANCLE_SUBSCRIPTION'); + } + else + { + $msg = JText::_('COM_REDSHOP_CANCLE_SUBSCRIPTION_FAIL'); + } + } + else + { + $msg = JText::_('COM_REDSHOP_ALREADY_CANCLE_SUBSCRIPTION'); + } + + $this->setRedirect($return, $msg); + } + + /** + * Newsletter tracker to confirm email is read + * + * @return void + * @throws Exception + */ + public function tracker() + { + $db = JFactory::getDbo(); + + $trackerId = $this->input->getInt('tracker_id', 0); + + if (!$trackerId) + { + JError::raiseError(500, 'No Tracking Id found.'); + } + + // Mark Newsletter as read + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_newsletter_tracker')) + ->set($db->qn('read') . ' = 1') + ->where($db->qn('tracker_id') . ' = ' . (int) $trackerId); + + // Set the query and execute the update. + $db->setQuery($query)->execute(); + + // Set image header + header("Content-type: image/gif"); + readfile(JUri::root() . 'components/com_redshop/assets/images/spacer.gif'); + + JFactory::getApplication()->close(); + } +} diff --git a/component/site/controllers/order_detail.php b/component/site/controllers/order_detail.php new file mode 100644 index 00000000000..361a09fbd08 --- /dev/null +++ b/component/site/controllers/order_detail.php @@ -0,0 +1,461 @@ +_producthelper = productHelper::getInstance(); + $this->_redshopMail = redshopMail::getInstance(); + $this->_order_functions = order_functions::getInstance(); + $this->_extraField = extraField::getInstance(); + $this->_redhelper = redhelper::getInstance(); + $this->_userhelper = rsUserHelper::getInstance(); + $this->_carthelper = rsCarthelper::getInstance(); + } + + /** + * bookinvoice function + * + * @return void + */ + public function bookinvoice() + { + } + + /** + * Process payment function for creditcard payment. + * + * @return void + */ + public function process_payment() + { + $app = JFactory::getApplication(); + $session = JFactory::getSession(); + $model = $this->getModel('order_detail'); + $data = array(); + + $request = $this->input->getArray(); + + // Get Order Detail + $order = RedshopEntityOrder::getInstance((int) $request['order_id'])->getItem(); + + // Get Billing and Shipping Info + $billingaddresses = RedshopHelperOrder::getBillingAddress($order->user_id); + $data['billingaddress'] = $billingaddresses; + + $shippingaddresses = RedshopHelperOrder::getOrderShippingUserInfo($order->order_id); + $data['shippingaddress'] = $shippingaddresses; + + $Itemid = $this->input->getInt('Itemid'); + + if (isset($billingaddresses)) + { + if (isset($billingaddresses->country_code)) + { + $billingaddresses->country_2_code = RedshopHelperWorld::getCountryCode2($billingaddresses->country_code); + $data ["billingaddress"]->country_2_code = $billingaddresses->country_2_code; + } + + if (isset($billingaddresses->state_code)) + { + $billingaddresses->state_2_code = $billingaddresses->state_code; + $data ["billingaddress"]->state_2_code = $billingaddresses->state_2_code; + } + } + + if (isset($shippingaddresses)) + { + if (isset($shippingaddresses->country_code)) + { + $shippingaddresses->country_2_code = RedshopHelperWorld::getCountryCode2($shippingaddresses->country_code); + $data ["shippingaddress"]->country_2_code = $shippingaddresses->country_2_code; + } + + if (isset($shippingaddresses->state_code)) + { + $shippingaddresses->state_2_code = $shippingaddresses->state_code; + $data ["shippingaddress"]->state_2_code = $shippingaddresses->state_2_code; + } + } + + // Get data for credit card + $ccData = array(); + $ccData['order_payment_name'] = $request['order_payment_name']; + $ccData['creditcard_code'] = $request['creditcard_code']; + $ccData['order_payment_number'] = $request['order_payment_number']; + $ccData['order_payment_expire_month'] = $request['order_payment_expire_month']; + $ccData['order_payment_expire_year'] = $request['order_payment_expire_year']; + $ccData['credit_card_code'] = $request['credit_card_code']; + $ccData['selectedCardId'] = $this->input->getString('selectedCard'); + + // Create session + $session->set('ccdata', $ccData); + + $values = array(); + $values['order_shipping'] = $order->order_shipping; + $values['order_number'] = $request['order_id']; + $values['order_tax'] = $order->order_tax; + $values['shippinginfo'] = $data ["shippingaddress"]; + $values['billinginfo'] = $data ["billingaddress"]; + $values['order_total'] = $order->order_total; + $values['order_subtotal'] = $order->order_subtotal; + $values["order_id"] = $request['order_id']; + $values['payment_plugin'] = $request['payment_method_id']; + $values['order'] = $order; + + // Call payment plugin + JPluginHelper::importPlugin('redshop_payment'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + + $results = $dispatcher->trigger('onPrePayment_' . $values['payment_plugin'], array($values['payment_plugin'], $values)); + $paymentResponse = $results[0]; + + $paymentResponse->log = $paymentResponse->message; + $paymentResponse->msg = $paymentResponse->message; + + if ($paymentResponse->responsestatus == "Success" || $values['payment_plugin'] == "") + { + $paymentResponse->order_status_code = (isset($paymentResponse->status)) ? $paymentResponse->status : 'C'; + $paymentResponse->order_payment_status_code = (isset($paymentResponse->paymentStatus)) ? $paymentResponse->paymentStatus : 'Paid'; + $paymentResponse->order_id = $request['order_id']; + + // Change order status + RedshopHelperOrder::changeOrderStatus($paymentResponse); + } + + // Update order payment table with credit card details + $model->update_ccdata($request['order_id'], $paymentResponse->transaction_id); + $model->resetcart(); + + $link = 'index.php?option=com_redshop&view=order_detail&Itemid=' . $Itemid . '&oid=' . $request['order_id']; + $app->redirect(JRoute::_($link, false), $paymentResponse->message); + + } + + /** + * Notify payment function + * + * @return void + */ + public function notify_payment() + { + $request = $this->input->getArray(); + $Itemid = $this->input->getInt('Itemid'); + + JPluginHelper::importPlugin('redshop_payment'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + + $results = $dispatcher->trigger( + 'onNotifyPayment' . $request['payment_plugin'], + array( + $request['payment_plugin'], + $request + ) + ); + + $msg = $results[0]->msg; + $type = (!empty($results[0]->type)) ? $results[0]->type : ''; + + if ($results[0] === false) + { + $order_id = $this->input->getInt('orderid'); + } + elseif (array_key_exists("order_id_temp", $results[0])) + { + $order_id = $results[0]->order_id_temp; + } + else + { + $order_id = $results[0]->order_id; + } + + // Change Order Status based on resutls + RedshopHelperOrder::changeOrderStatus($results[0]); + + $model = $this->getModel('order_detail'); + $model->resetcart(); + + /* + * Plugin will trigger onAfterNotifyPayment + */ + $dispatcher->trigger( + 'onAfterNotifyPayment' . $request['payment_plugin'], + array( + $request['payment_plugin'], + $order_id + ) + ); + + JPluginHelper::importPlugin('system'); + $dispatcher->trigger('afterOrderNotify', array($results)); + + if ($request['payment_plugin'] == "rs_payment_payer") + { + echo "TRUE"; + JFactory::getApplication()->close(); + } + + if ($request['payment_plugin'] != "rs_payment_worldpay") + { + // New checkout flow + $redirect_url = JRoute::_( + JUri::base() . "index.php?option=com_redshop&view=order_detail&layout=receipt&Itemid=$Itemid&oid=" . $order_id, false + ); + + $this->setRedirect($redirect_url, $msg, $type); + } + } + + /** + * Copy Order Item to Cart + * + * @param array $row Order Item information if not empty + * @param boolean $redirect If true will redirect to cart else not. + * + * @return mixed void / boolean + */ + public function copyOrderItemToCart($row = array(), $redirect = true) + { + // Import redSHOP Product Plugin + JPluginHelper::importPlugin('redshop_product'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $app = JFactory::getApplication(); + + // If empty then load order item detail from order table + if (empty($row)) + { + $order_item_id = $this->input->getInt('order_item_id'); + + $orderItem = RedshopHelperOrder::getOrderItemDetail(0, 0, $order_item_id); + $row = (array) $orderItem[0]; + } + + // Event Trigger on reordering cart item + $dispatcher->trigger('onReorderCartItem', array(&$row)); + + $subscription_id = 0; + $row['quantity'] = $row['product_quantity']; + + if ($row['is_giftcard'] == 1) + { + $row['giftcard_id'] = $row['product_id']; + $row['reciver_name'] = $row['giftcard_user_name']; + $row['reciver_email'] = $row['giftcard_user_email']; + } + else + { + $product_data = $this->_producthelper->getProductById($row['product_id']); + + if ($product_data->product_type == 'subscription') + { + $productSubscription = $this->_producthelper->getUserProductSubscriptionDetail($row['order_item_id']); + + if ($productSubscription->subscription_id != "") + { + $subscription_id = $productSubscription->subscription_id; + } + } + + $generateAttributeCart = $this->_carthelper->generateAttributeFromOrder($row['order_item_id'], 0, $row['product_id'], $row['product_quantity']); + $generateAccessoryCart = $this->_carthelper->generateAccessoryFromOrder($row['order_item_id'], $row['product_id'], $row['product_quantity']); + + $row['cart_attribute'] = $generateAttributeCart; + $row['cart_accessory'] = $generateAccessoryCart; + $row['subscription_id'] = $subscription_id; + $row['sel_wrapper_id'] = $row['wrapper_id']; + $row['category_id'] = 0; + + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "orderMergeImages/" . $row['attribute_image'])) + { + $newMedia = JPATH_ROOT . '/components/com_redshop/assets/images/mergeImages/' . $row['attribute_image']; + $oldMedia = JPATH_ROOT . '/components/com_redshop/assets/images/orderMergeImages/' . $row['attribute_image']; + copy($oldMedia, $newMedia); + } + + $row['attributeImage'] = $row['attribute_image']; + + if (JFile::exists(JPATH_COMPONENT_SITE . "/assets/images/product_attributes/" . $row['attribute_image'])) + { + $row['hidden_attribute_cartimage'] = REDSHOP_FRONT_IMAGES_ABSPATH . "product_attributes/" . $row['attribute_image']; + } + } + + $result = Redshop\Cart\Cart::addProduct($row); + + if (is_bool($result) && $result) + { + // Set success message for product line + $app->enqueueMessage($row['order_item_name'] . ": " . JText::_("COM_REDSHOP_PRODUCT_ADDED_TO_CART")); + + if ($redirect) + { + // Do final cart calculations + RedshopHelperCart::cartFinalCalculation(); + + $app->redirect(JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . RedshopHelperRouter::getCartItemId(), false)); + } + } + else + { + $ItemData = $this->_producthelper->getMenuInformation(0, 0, '', 'product&pid=' . $row['product_id']); + + if (count($ItemData) > 0) + { + $Itemid = $ItemData->id; + } + else + { + $Itemid = RedshopHelperRouter::getItemId($row['product_id']); + } + + $errorMessage = ($result) ? $result : JText::_("COM_REDSHOP_PRODUCT_NOT_ADDED_TO_CART"); + + if (/** @scrutinizer ignore-deprecated */ JError::isError(/** @scrutinizer ignore-deprecated */ JError::getError())) + { + $errorMessage = JError::getError()->getMessage(); + } + + $app->redirect( + JRoute::_('index.php?option=com_redshop&view=product&pid=' . $row['product_id'] . '&Itemid=' . $Itemid, false), + $errorMessage + ); + } + } + + /** + * On Reorder Order + * + * @return void + */ + public function reorder() + { + $app = JFactory::getApplication(); + $orderId = $this->input->getInt('order_id'); + + if ($orderId) + { + // First Empty Cart and then oder it again + $cart = array(); + $cart['idx'] = 0; + JFactory::getSession()->set('cart', $cart); + + $orderItem = RedshopHelperOrder::getOrderItemDetail($orderId); + + for ($i = 0, $in = count($orderItem); $i < $in; $i++) + { + $row = (array) $orderItem[$i]; + + // Copy Order Item to cart + $this->copyOrderItemToCart($row, false); + } + + RedshopHelperCart::cartFinalCalculation(); + } + + $app->redirect(JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . RedshopHelperRouter::getCartItemId(), false)); + } + + /** + * payment function + * + * @return void + */ + public function payment() + { + $itemId = $this->input->getInt('Itemid'); + $orderId = $this->input->getInt('order_id'); + + $order = RedshopEntityOrder::getInstance($orderId)->getItem(); + $paymentInfo = RedshopEntityOrder::getInstance($orderId); + + if ($paymentInfo !== null) + { + $paymentInfo = $paymentInfo->getItem(); + } + + if ($paymentInfo) + { + $paymentMethod = RedshopHelperOrder::getPaymentMethodInfo($paymentInfo->payment_method_class); + + if (!empty($paymentMethod)) + { + $paymentParams = new JRegistry($paymentMethod[0]->params); + $isCreditcard = $paymentParams->get('is_creditcard', 0); + + if ($isCreditcard) + { + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.creditcard.min.js', false, true); + ?> + +
    + _carthelper->replaceCreditCardInformation($paymentInfo->payment_method_class); ?> +
    + + + + + + + + + +
    +
    + setRedirect($link); + } + } + } + } + + /** + * Get order payament status using ajax + */ + public function AjaxOrderPaymentStatusCheck() + { + $orderId = $this->input->post->getInt('id'); + + $orderPaymentStatus = RedshopEntityOrder::load($orderId)->get('order_payment_status'); + + $status = JText::_('COM_REDSHOP_PAYMENT_STA_UNPAID'); + + if ($orderPaymentStatus == 'Paid') + { + $status = JText::_('COM_REDSHOP_PAYMENT_STA_PAID'); + } + + ob_clean(); + echo $status; + } +} diff --git a/component/site/controllers/orders.php b/component/site/controllers/orders.php new file mode 100644 index 00000000000..99370a38e5a --- /dev/null +++ b/component/site/controllers/orders.php @@ -0,0 +1,22 @@ +input = JFactory::getApplication()->input; + + // Article frontpage Editor product proxying: + if ($this->input->get('layout') === 'element') + { + JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN')); + + $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR; + + $lang = JFactory::getLanguage(); + $lang->load('com_redshop', JPATH_ADMINISTRATOR); + + JHtml::_('behavior.framework'); + JHtml::_('redshopjquery.framework'); + + $document = JFactory::getDocument(); + + if (version_compare(JVERSION, '3.0', '>=')) + { + JHtml::_('formbehavior.chosen', 'select:not(".disableBootstrapChosen")', null, array('search_contains' => true)); + $document->addStyleSheet(JURI::root() . 'administrator/components/com_redshop/assets/css/j3ready.css'); + } + + $document->addStyleSheet(JURI::root() . 'administrator/components/com_redshop/assets/css/redshop.css'); + $this->input->set('layout', 'element'); + } + + parent::__construct($config); + } + + /** + * Typical view method for MVC based architecture + * + * This function is provide as a default implementation, in most cases + * you will need to override it in your own controllers. + * + * @param boolean $cachable If true, the view output will be cached + * @param array $urlparams An array of safe URL parameters and their variable types, for valid values see {@link JFilterInput::clean()}. + * + * @return JControllerLegacy A JControllerLegacy object to support chaining. + * + * @since 3.0 + */ + public function display($cachable = false, $urlparams = array()) + { + $urlparams['Itemid'] = 'INT'; + $urlparams['cid'] = 'INT'; + $urlparams['lang'] = 'STRING'; + $urlparams['pid'] = 'INT'; + $urlparams['view'] = 'STRING'; + $urlparams['layout'] = 'STRING'; + + parent::display(true, $urlparams); + + return $this; + } + + /** + * Display Product add price + * + * @return void + */ + public function displayProductaddprice() + { + ob_clean(); + + $get = $this->input->get->getArray(); + + $producthelper = productHelper::getInstance(); + $carthelper = rsCarthelper::getInstance(); + $total_attribute = 0; + + $product_id = $get['product_id']; + $quantity = $get['qunatity']; + + $data = array(); + $data['attribute_data'] = str_replace("::", "##", $get['attribute_data']); + $data['property_data'] = str_replace("::", "##", $get['property_data']); + $data['subproperty_data'] = str_replace("::", "##", $get['subproperty_data']); + $data['accessory_data'] = $get['accessory_data']; + $data['acc_quantity_data'] = $get['acc_quantity_data']; + $data['acc_attribute_data'] = str_replace("::", "##", $get['acc_attribute_data']); + $data['acc_property_data'] = str_replace("::", "##", $get['acc_property_data']); + $data['acc_subproperty_data'] = str_replace("::", "##", $get['acc_subproperty_data']); + $data['quantity'] = $quantity; + + $cartdata = Redshop\Cart\Helper::generateAttribute($data); + $retAttArr = $producthelper->makeAttributeCart($cartdata, $product_id, 0, '', $quantity); + + $ProductPriceArr = $producthelper->getProductNetPrice($product_id, 0, $quantity); + + $acccartdata = $carthelper->generateAccessoryArray($data); + $retAccArr = $producthelper->makeAccessoryCart($acccartdata, $product_id); + $accessory_price = $retAccArr[1]; + $accessory_vat = $retAccArr[2]; + + $product_price = (($retAttArr[1] + $retAttArr[2]) * $quantity) + $accessory_price + $accessory_vat; + $product_main_price = (($retAttArr[1] + $retAttArr[2]) * $quantity) + $accessory_price + $accessory_vat; + $product_old_price = $ProductPriceArr['product_old_price'] * $quantity; + $product_price_saving = $ProductPriceArr['product_price_saving'] * $quantity; + $product_discount_price = $ProductPriceArr['product_discount_price'] * $quantity; + $product_price_novat = ($retAttArr[1] * $quantity) + $accessory_price; + $product_price_incl_vat = ($ProductPriceArr['product_price_incl_vat'] * $quantity) + $accessory_price + $accessory_vat; + $price_excluding_vat = ($retAttArr[1] * $quantity) + $accessory_price; + $seoProductPrice = $ProductPriceArr['seoProductPrice'] * $quantity; + $seoProductSavingPrice = $ProductPriceArr['seoProductSavingPrice'] * $quantity; + + echo $product_price . ":" . $product_main_price . ":" . $product_old_price . ":" . $product_price_saving . ":" . $product_discount_price . ":" . $product_price_novat . ":" . $product_price_incl_vat . ":" . $price_excluding_vat . ":" . $seoProductPrice . ":" . $seoProductSavingPrice; + JFactory::getApplication()->close(); + } + + /** + * Display sub property + * + * @return string + */ + public function displaySubProperty() + { + $propid = $subpropid = array(); + $get = $this->input->get->getArray(); + $product_id = $get['product_id']; + $producthelper = productHelper::getInstance(); + $accessory_id = $get['accessory_id']; + $relatedprd_id = $get['relatedprd_id']; + $attribute_id = $get['attribute_id']; + $isAjaxBox = $get['isAjaxBox']; + $product = RedshopHelperProduct::getProductById($product_id); + + if (isset($get['property_id']) && $get['property_id']) + { + $propid = explode(",", $get['property_id']); + } + + if (isset($get['subproperty_id']) && $get['subproperty_id']) + { + $subpropid = explode(",", $get['subproperty_id']); + } + + $subatthtml = htmlspecialchars_decode(base64_decode($this->input->get->get('subatthtml', '', 'raw'))); + + $response = ""; + $producttemplate = RedshopHelperTemplate::getTemplate("product", $product->product_template); + $checkApplyVAT = \Redshop\Template\Helper::isApplyVat($producttemplate[0]->template_desc); + + $response .= ($checkApplyVAT != 1) ? '' : ''; + + for ($i = 0, $in = count($propid); $i < $in; $i++) + { + $property_id = $propid[$i]; + $response .= $producthelper->replaceSubPropertyData($product_id, $accessory_id, $relatedprd_id, $attribute_id, $property_id, $subatthtml, $isAjaxBox, $subpropid); + } + + echo $response; + JFactory::getApplication()->close(); + } + + /** + * Display addition image + * + * @return void + */ + public function displayAdditionImage() + { + $url = JURI::base(); + $get = $this->input->get->getArray(); + $producthelper = productHelper::getInstance(); + + $property_id = urldecode($get['property_id']); + $subproperty_id = urldecode($get['subproperty_id']); + + $product_id = $get['product_id']; + $accessory_id = $get['accessory_id']; + $relatedprd_id = $get['relatedprd_id']; + $main_imgwidth = $get['main_imgwidth']; + $main_imgheight = $get['main_imgheight']; + $redview = $get['redview']; + $redlayout = $get['redlayout']; + $pluginResults = array(); + + $dispatcher = RedshopHelperUtility::getDispatcher(); + JPluginHelper::importPlugin('redshop_product'); + $dispatcher->trigger('onBeforeImageLoad', array($get, &$pluginResults)); + + if (!empty($pluginResults)) + { + $mainImageResponse = $pluginResults['mainImageResponse']; + $result = RedshopHelperProductTag::displayAdditionalImage( + $product_id, + $accessory_id, + $relatedprd_id, + (int) $property_id, + (int) $subproperty_id + ); + + if (isset($pluginResults['attrbimg'])) + { + $result['attrbimg'] = $pluginResults['attrbimg']; + } + } + else + { + $result = RedshopHelperProductTag::displayAdditionalImage( + $product_id, + $accessory_id, + $relatedprd_id, + (int) $property_id, + (int) $subproperty_id, + $main_imgwidth, + $main_imgheight, + $redview, + $redlayout + ); + $mainImageResponse = $result['product_mainimg']; + } + + $response = $result['response']; + $aHrefImageResponse = $result['aHrefImageResponse']; + $aTitleImageResponse = $result['aTitleImageResponse']; + $stockamountSrc = $result['stockamountSrc']; + $stockamountTooltip = $result['stockamountTooltip']; + $ProductAttributeDelivery = $result['ProductAttributeDelivery']; + $attrbimg = $result['attrbimg']; + $pr_number = $result['pr_number']; + $productinstock = $result['productinstock']; + $stock_status = $result['stock_status']; + $ImageName = $result['ImageName']; + $notifyStock = $result['notifyStock']; + $product_availability_date_lbl = $result['product_availability_date_lbl']; + $product_availability_date = $result['product_availability_date']; + $additional_vids = $result['additional_vids']; + + echo "`_`" . $response + . "`_`" . $aHrefImageResponse + . "`_`" . $aTitleImageResponse + . "`_`" . $mainImageResponse + . "`_`" . $stockamountSrc + . "`_`" . $stockamountTooltip + . "`_`" . $ProductAttributeDelivery + . "`_`" . '' + . "`_`" . $pr_number + . "`_`" . $productinstock + . "`_`" . $stock_status + . "`_`" . $attrbimg + . "`_`" . $notifyStock + . "`_`" . $product_availability_date_lbl + . "`_`" . $product_availability_date + . "`_`" . $additional_vids; + JFactory::getApplication()->close(); + } + + /** + * Add to wishlist function + * + * @access public + * @return void + */ + public function addtowishlist() + { + $app = JFactory::getApplication(); + $extraField = extraField::getInstance(); + $productHelper = productHelper::getInstance(); + $user = JFactory::getUser(); + + ob_clean(); + $section = 12; + $row_data = $extraField->getSectionFieldList($section); + + // GetVariables + $cid = $this->input->getInt('cid', 0); + $Itemid = $this->input->getInt('Itemid', 0); + $ajaxOn = $this->input->getInt('ajaxon', 0); + $wishlistId = $this->input->getInt('wid', 0); + $attributeIds = $this->input->getString('attribute_id', ''); + $propertyIds = $this->input->getString('property_id', ''); + $subAttributeIds = $this->input->getString('subattribute_id', ''); + + if ($ajaxOn == 1 && ($wishlistId == 1 || $wishlistId == 2)) + { + $post = $this->input->post->getArray(); + + $post['product_id'] = $this->input->getInt('product_id', 0); + $proname = RedshopHelperProduct::getProductById($post['product_id']); + $post['view'] = $this->input->getCmd('view', ''); + $post['task'] = $this->input->getCmd('task', ''); + $index = 0; + + foreach ($row_data as $data) + { + $field_name = $data->field_name; + $type = $data->field_type; + + if (isset($post[$field_name])) + { + $data_txt = $post[$field_name]; + } + else + { + $data_txt = ''; + } + + $tmpstr = strpbrk($data_txt, '`'); + + if ($tmpstr) + { + $tmparray = explode('`', $data_txt); + $tmp = new stdClass; + $tmp = @array_merge($tmp, $tmparray); + + if (is_array($tmparray)) + { + $data_txt = implode(",", $tmparray); + } + } + + $post['productuserfield_' . $index] = $data_txt; + + $index++; + } + } + else + { + $post = $this->input->post->getArray(); + $proname = RedshopHelperProduct::getProductById($post['product_id']); + + for ($i = 0, $in = count($row_data); $i < $in; $i++) + { + $field_name = $row_data[$i]->field_name; + + $type = $row_data[$i]->field_type; + + if (isset($post[$field_name])) + { + $data_txt = $post[$field_name]; + } + else + { + $data_txt = ''; + } + + $tmpstr = strpbrk($data_txt, '`'); + + if ($tmpstr) + { + $tmparray = explode('`', $data_txt); + $tmp = new stdClass; + $tmp = @array_merge($tmp, $tmparray); + + if (is_array($tmparray)) + { + $data_txt = implode(",", $tmparray); + } + } + + $post['productuserfield_' . $i] = $data_txt; + } + } + + $rurl = ""; + + if (isset($post['rurl'])) + { + $rurl = base64_decode($post['rurl']); + } + + // Initialize variable + $post['user_id'] = $user->id; + $post['cdate'] = time(); + + if (!empty($attributeIds)) + { + $post['attribute_id'] = $attributeIds; + } + + if (!empty($propertyIds)) + { + $post['property_id'] = $propertyIds; + } + + if (!empty($subAttributeIds)) + { + $post['subattribute_id'] = $subAttributeIds; + } + + /** @var RedshopModelProduct $model */ + $model = $this->getModel('product'); + + if ($user->id && $ajaxOn != '1') + { + if ($model->checkWishlist($post['product_id']) == null) + { + if ($model->addToWishlist($post)) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_WISHLIST_SAVE_SUCCESSFULLY')); + } + else + { + $app->enqueueMessage(JText::_('COM_REDSHOP_ERROR_SAVING_WISHLIST')); + } + } + else + { + $app->enqueueMessage(JText::_('COM_REDSHOP_ALLREADY_ADDED_TO_WISHLIST')); + } + } + else + { + // User can store wishlist in session + if ($model->addtowishlist2session($post)) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_WISHLIST_SAVE_SUCCESSFULLY')); + } + else + { + $app->enqueueMessage(JText::_('COM_REDSHOP_ALLREADY_ADDED_TO_WISHLIST')); + } + } + + if ($ajaxOn == 1) + { + sleep(2); + $getproductimage = $productHelper->getProductById($post['product_id']); + $finalproductimgname = $getproductimage->product_full_image; + + if ($finalproductimgname != '') + { + $mainimg = "product/" . $finalproductimgname; + } + else + { + $mainimg = 'noimage.jpg'; + } + + echo "
    :-:" . $proname->product_name . ""; + JFactory::getApplication()->close(); + } + elseif ($wishlistId == 1) + { + $this->setRedirect('index.php?option=com_redshopwishlist=1&view=login&Itemid=' . $Itemid); + } + + if ($rurl != "") + { + $this->setRedirect($rurl); + } + + $this->setRedirect('index.php?option=com_redshop&view=product&pid=' . $post['product_id'] . '&cid=' . $cid . '&Itemid=' . $Itemid); + } + + /** + * Add product tag function + * + * @access public + * @return void + */ + + public function addProductTags() + { + $app = JFactory::getApplication(); + + // GetVariables + $cid = $this->input->getInt('cid'); + $Itemid = $this->input->get('Itemid'); + $post = $this->input->post->getArray(); + + // Initiallize variable + $tagnames = $post['tags_name']; + $productid = $post['product_id']; + $userid = $post['users_id']; + + $model = $this->getModel('product'); + + $tagnames = explode(" ", $tagnames); + + for ($i = 0, $in = count($tagnames); $i < $in; $i++) + { + $tagname = $tagnames[$i]; + + if ($model->checkProductTags($tagname, $productid) == null) + { + $tags = $model->getProductTags($tagname, $productid); + + if (count($tags) != 0) + { + foreach ($tags as $tag) + { + if ($tag->product_id == $productid) + { + if ($tag->users_id != $userid) + $counter = $tag->tags_counter + 1; + } + else + $counter = $tag->tags_counter + 1; + + $ntag['tags_id'] = $tag->tags_id; + $ntag['tags_name'] = $tag->tags_name; + $ntag['tags_counter'] = $counter; + $ntag['published'] = $tag->published; + $ntag['product_id'] = $productid; + $ntag['users_id'] = $userid; + } + } + else + { + $ntag['tags_id'] = 0; + $ntag['tags_name'] = $tagname; + $ntag['tags_counter'] = 1; + $ntag['published'] = 1; + $ntag['product_id'] = $productid; + $ntag['users_id'] = $userid; + } + + if ($tags = $model->addProductTags($ntag)) + { + $model->addProductTagsXref($ntag, $tags); + + $app->enqueueMessage($tagname . ' ' . JText::_('COM_REDSHOP_TAGS_ARE_ADDED')); + } + else + { + $app->enqueueMessage($tagname . ' ' . JText::_('COM_REDSHOP_ERROR_ADDING_TAGS')); + } + } + else + { + $app->enqueueMessage($tagname . ' ' . JText::_('COM_REDSHOP_ALLREADY_ADDED')); + } + } + + $this->setRedirect('index.php?option=com_redshop&view=product&pid=' . $post['product_id'] . '&cid=' . $cid . '&Itemid=' . $Itemid); + } + + /** + * Add to compare function + * + * @access public + * @return product compare list through ajax + */ + public function addToCompare() + { + $item = new stdClass; + + $item->productId = $this->input->getInt('pid', null); + + $product = RedshopHelperProduct::getProductById($item->productId); + + $item->categoryId = $this->input->getInt('cid', null); + + $item->categoriesId = implode(',', $product->categories); + + $compare = new RedshopProductCompare(); + + //ob_clean(); + + try + { + if ($this->input->getCmd('cmd') == 'add') + { + //$compare->deleteItem(); + $compare->addItem($item); + } + elseif ($this->input->getCmd('cmd') == 'remove') + { + $compare->deleteItem($item); + } + + $response = array( + 'success' => true, + 'html' => $compare->getAjaxResponse(), + 'total' => $compare->getItemsTotal() + ); + } + catch (Exception $e) + { + $response = array( + 'success' => false, + 'message' => $e->getMessage(), + 'html' => $compare->getAjaxResponse(), + 'total' => $compare->getItemsTotal() + ); + } + + echo json_encode($response); + } + + /** + * Remove compare from product list + * + * @access public + * @return void + */ + public function removeCompare() + { + $item = new stdClass; + + $item->productId = $this->input->getInt('pid', 0); + $item->categoryId = $this->input->getInt('cid', 0); + + $compare = new RedshopProductCompare(); + + if ($item->productId) + { + $compare->deleteItem($item); + } + // Remove All + else + { + $compare->deleteItem(); + } + + $Itemid = $this->input->getInt('Itemid', 0); + + $this->setRedirect( + JRoute::_('index.php?option=com_redshop&view=product&layout=compare&Itemid=' . $Itemid, false), + JText::_('COM_REDSHOP_PRODUCT_DELETED_FROM_COMPARE_SUCCESSFULLY') + ); + } + + /** + * Download Product function + * + * @access public + * @return void + */ + public function downloadProduct() + { + $Itemid = $this->input->get('Itemid'); + $model = $this->getModel('product'); + + $tid = $this->input->getCmd('download_id', ""); + + $data = $model->downloadProduct($tid); + + // Today at the end of the day + $today = time(); + + if (count($data) != 0) + { + $download_id = $data->download_id; + + // Download Product end date + $end_date = $data->end_date; + + if ($end_date == 0 || ($data->download_max != 0 && $today <= $end_date)) + { + $msg = JText::_("COM_REDSHOP_DOWNLOADABLE_THIS_PRODUCT"); + + $this->setRedirect("index.php?option=com_redshop&view=product&layout=downloadproduct&tid=" . $download_id . "&Itemid=" . $Itemid, $msg); + + } + else + { + $msg = JText::_("COM_REDSHOP_DOWNLOAD_LIMIT_OVER"); + $this->setRedirect("index.php?option=com_redshop&view=product&layout=downloadproduct&Itemid=" . $Itemid, $msg); + } + } + else + { + $msg = JText::_("COM_REDSHOP_TOKEN_VERIFICATION_FAIL"); + $this->setRedirect("index.php?option=com_redshop&view=product&layout=downloadproduct&Itemid=" . $Itemid, $msg); + } + + } + + /** + * Download function + * + * @access public + * @return void + */ + public function Download() + { + $post = $this->input->post->getArray(); + + $model = $this->getModel('product'); + + $tid = $post['tid']; + + $data = $model->downloadProduct($tid); + + $limit = $data->download_max; + + // Today at the end of the day + $today = time(); + + // Download Product end date + $end_date = $data->end_date; + + if ($end_date != 0 && ($limit == 0 || $today > $end_date)) + { + $msg = JText::_("COM_REDSHOP_DOWNLOAD_LIMIT_OVER"); + $this->setRedirect("index.php?option=com_redshop&view=product&layout=downloadproduct", $msg); + + } + elseif (isset($post['mainindex']) && isset($post['additional'])) + { + $task = $post['mainindex']; + + $id = $post['additional']; + + if ($task == "main") + { + $finalname = $model->AdditionaldownloadProduct($id, 0, 1); + + $name = $finalname[0]->media_name; + + } + elseif ($task == "additional") + { + $finalname = $model->AdditionaldownloadProduct(0, $id); + + $name = $finalname[0]->name; + } + } + else + { + $msg = JText::_('COM_REDSHOP_NO_FILE_SELECTED'); + $this->setRedirect('index.php?option=com_redshop&view=product&layout=downloadproduct&tid=' . $tid, $msg); + + return; + } + + if (isset($post['additional']) && $tid != "" && $end_date == 0 || ($limit != 0 && $today <= $end_date)) + { + if ($model->setDownloadLimit($tid)) + { + $baseURL = JURI::root(); + $tmp_name = JPATH_SITE . '/components/com_redshop/assets/download/product/' . $name; + + $tmp_type = strtolower(JFile::getExt($name)); + + $downloadname = substr(basename($name), 11); + + switch ($tmp_type) + { + case "pdf": + $ctype = "application/pdf"; + break; + case "psd": + $ctype = "application/psd"; + break; + case "exe": + $ctype = "application/octet-stream"; + break; + case "zip": + $ctype = "application/x-zip"; + break; + case "doc": + $ctype = "application/msword"; + break; + case "xls": + $ctype = "application/vnd.ms-excel"; + break; + case "ppt": + $ctype = "application/vnd.ms-powerpoint"; + break; + case "gif": + $ctype = "image/gif"; + break; + case "png": + $ctype = "image/png"; + break; + case "jpeg": + case "jpg": + $ctype = "image/jpg"; + break; + default: + $ctype = "application/force-download"; + } + + ob_clean(); + + header("Pragma: public"); + header('Expires: 0'); + header("Content-Type: $ctype", false); + header('Content-Length: ' . filesize($name)); + header('Content-Disposition: attachment; filename=' . $downloadname); + + // Red file using chunksize + $this->readfile_chunked($name); + JFactory::getApplication()->close(); + } + } + } + + /** + * File read function + * + * @param string $filename file name + * @param bool $retbytes retbytes + * + * @return bool|int + */ + public function readfile_chunked($filename, $retbytes = true) + { + // How many bytes per chunk + $chunksize = 10 * (1024 * 1024); + $buffer = ''; + $cnt = 0; + + $handle = fopen($filename, 'rb'); + + if ($handle === false) + { + return false; + } + + while (!feof($handle)) + { + $buffer = fread($handle, $chunksize); + echo $buffer; + ob_flush(); + flush(); + + if ($retbytes) + { + $cnt += strlen($buffer); + } + } + + $status = fclose($handle); + + if ($retbytes && $status) + { + // Return num. bytes delivered like readfile() does. + return $cnt; + } + + return $status; + + } + + /** + * ajax upload function + * + * @access public + * @return filename on successfull file upload + */ + public function ajaxupload() + { + $uploadDir = JPATH_COMPONENT_SITE . '/assets/document/product/'; + $productId = $this->input->getInt('product_id', 0); + $name = $this->input->getCmd('mname', ''); + + if (!empty($productId)) + { + $name = $name . '_' . $productId; + } + + if ($this->input->files) + { + $uploadFileData = $this->input->files->get($name); + $fileExtension = JFile::getExt($uploadFileData['name']); + $fileName = RedshopHelperMedia::cleanFileName($uploadFileData['name']); + + $uploadFilePath = JPath::clean($uploadDir . $fileName); + + $legalExts = explode(',', Redshop::getConfig()->get('MEDIA_ALLOWED_MIME_TYPE')); + + // If Extension is not legal than don't upload file + if (!in_array(strtolower($fileExtension), $legalExts)) + { + echo '
  • ' . JText::_('COM_REDSHOP_FILE_EXTENSION_NOT_ALLOWED') . '
  • '; + } + + if (JFile::upload($uploadFileData['tmp_name'], $uploadFilePath)) + { + $id = JFile::stripExt(JFile::getName($fileName)); + $sendData = array(); + $sendData['id'] = $id; + $sendData['product_id'] = $productId; + $sendData['uniqueOl'] = $this->input->getString('uniqueOl', ''); + $sendData['fieldName'] = $this->input->getString('fieldName', ''); + $sendData['ajaxFlag'] = $this->input->getString('ajaxFlag', ''); + $sendData['fileName'] = $fileName; + $sendData['action'] = JURI::root() . 'index.php?tmpl=component&option=com_redshop&view=product&task=removeAjaxUpload'; + $session = JFactory::getSession(); + $userDocuments = $session->get('userDocument', array()); + + if (!isset($userDocuments[$productId])) + { + $userDocuments[$productId] = array(); + } + + $userDocuments[$productId][$id] = $sendData; + $session->set('userDocument', $userDocuments); + + echo "
  • " + . "" . $fileName . "" + . " " . JText::_('COM_REDSHOP_DELETE') . "" + . "
  • "; + } + else + { + // WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE! + // Otherwise onSubmit event will not be fired + echo "error"; + } + } + else + { + echo '
  • ' . JText::_('COM_REDSHOP_NO_FILE_SELECTED') . '
  • '; + } + } + + /** + * Function to remove Extra Field AJAX upload data + * + * @return void + */ + public function removeAjaxUpload() + { + $id = $this->input->getString('id', ''); + $productId = $this->input->getInt('product_id', 0); + $session = JFactory::getSession(); + $userDocuments = $session->get('userDocument', array()); + $deleteFile = true; + + if (isset($userDocuments[$productId]) && array_key_exists($id, $userDocuments[$productId])) + { + if ($cart = $session->get('cart')) + { + for ($i = 0; $i < $cart['idx']; $i++) + { + $fieldName = $userDocuments[$productId][$id]['fieldName']; + $fileName = $userDocuments[$productId][$id]['fileName']; + + if (isset($cart[$i][$fieldName])) + { + $documents = explode(',', $cart[$i][$fieldName]); + + // File exists in cart, not delete then + if (in_array($fileName, $documents)) + { + $deleteFile = false; + break; + } + } + } + } + + $filePath = JPATH_SITE . '/components/com_redshop/assets/document/product/' . $userDocuments[$productId][$id]['fileName']; + unset($userDocuments[$productId][$id]); + $session->set('userDocument', $userDocuments); + + if ($deleteFile && JFile::exists($filePath)) + { + JFile::delete($filePath); + } + } + } + + /** + * ajax upload function + * + * @access public + * @return void + */ + public function downloadDocument() + { + $fileName = $this->input->getString('fname', ''); + $filePath = REDSHOP_FRONT_DOCUMENT_RELPATH . 'product/' . $fileName; + + if (!JFile::exists($filePath)) + { + return; + } + + $fileExt = strtolower(JFile::getExt($filePath)); + $contentType = Mime::getMimeFromExtension($fileExt); + + if ($contentType === false) + { + $contentType = 'application/force-download'; + } + + ob_clean(); + + header("Pragma: public"); + header('Expires: 0'); + header("Content-Type: $contentType", false); + header('Content-Length: ' . filesize($filePath)); + header('Content-Disposition: attachment; filename=' . $fileName); + + // Read file using chunksize + $this->readfile_chunked($filePath); + JFactory::getApplication()->close(); + } + + /** + * Go to child + * + * @return void + */ + public function gotochild() + { + $pid = $this->input->post->getInt('pid'); + $productHelper = productHelper::getInstance(); + $cid = $productHelper->getCategoryProduct($pid); + $ItemData = $productHelper->getMenuInformation(0, 0, '', 'product&pid=' . $pid); + $pItemid = RedshopHelperRouter::getItemId($pid, (int) $cid); + + if (!empty($ItemData)) + { + $pItemid = $ItemData->id; + } + + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $pid . '&cid=' . $cid . '&Itemid=' . $pItemid, false); + + $this->setRedirect($link); + } + + /** + * Go to nav Product + * + * @return void + */ + public function gotonavproduct() + { + $pid = $this->input->post->getInt('pid'); + $productHelper = productHelper::getInstance(); + $cid = $productHelper->getCategoryProduct($pid); + $ItemData = $productHelper->getMenuInformation(0, 0, '', 'product&pid=' . $pid); + $pItemid = RedshopHelperRouter::getItemId($pid, (int) $cid); + + if (!empty($ItemData)) + { + $pItemid = $ItemData->id; + } + + $this->setRedirect(JRoute::_('index.php?option=com_redshop&view=product&pid=' . $pid . '&cid=' . $cid . '&Itemid=' . $pItemid, false)); + } + + /** + * Add Notify stock + * + * @return void + */ + public function addNotifystock() + { + ob_clean(); + $post = $this->input->getArray(); + + $productId = $post['product_id']; + $propertyId = $post['property_id']; + $subPropertyId = $post['subproperty_id']; + $emailNotLogin = $post['email_not_login']; + + /** + * @var RedshopModelProduct $model + */ + $model = $this->getModel('product'); + + if ($model->addNotifystock($productId, $propertyId, $subPropertyId, $emailNotLogin)) + { + echo $message = JText::_("COM_REDSHOP_STOCK_NOTIFICATION_ADDED_SUCCESSFULLY"); + } + + JFactory::getApplication()->close(); + } +} diff --git a/component/site/controllers/product_mini.php b/component/site/controllers/product_mini.php new file mode 100644 index 00000000000..05a17bb6fe5 --- /dev/null +++ b/component/site/controllers/product_mini.php @@ -0,0 +1,43 @@ +setRedirect('index.php'); + } + + /** + * logic for display + * + * @access public + * @return void + */ + public function display() + { + parent::display(); + } +} diff --git a/component/site/controllers/product_rating.php b/component/site/controllers/product_rating.php new file mode 100644 index 00000000000..f98181d300e --- /dev/null +++ b/component/site/controllers/product_rating.php @@ -0,0 +1,183 @@ +input->post->get('jform', array(), 'array'); + $model = $this->getModel('product_rating'); + + $productId = $app->input->getInt('product_id', 0); + $Itemid = $app->input->getInt('Itemid', 0); + $modal = $app->input->getInt('modal', 0); + $category_id = $app->input->getInt('category_id', 0); + $user = JFactory::getUser(); + + if ($modal) + { + $link = 'index.php?option=com_redshop&view=product_rating&product_id=' . $productId . '&tmpl=component&Itemid=' . $Itemid; + } + else + { + $link = 'index.php?option=com_redshop&view=product&pid=' . $productId . '&cid=' . $category_id . '&Itemid=' . $Itemid; + } + + // Preform security checks + if (!$user->id && Redshop::getConfig()->get('RATING_REVIEW_LOGIN_REQUIRED')) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_ALERTNOTAUTH_REVIEW'), 'warning'); + $this->setRedirect(JRoute::_($link, false)); + + return false; + } + + // Validate the posted data. + $form = $model->getForm(); + + if (!$form) + { + JError::raiseError(500, $model->getError()); + $this->setRedirect(JRoute::_($link, false)); + + return false; + } + + // Save the data in the session. + $app->setUserState('com_redshop.edit.product_rating.' . $productId . '.data', $data); + + // Check captcha only for guests + if (JFactory::getUser()->guest) + { + if (!Redshop\Helper\Utility::checkCaptcha($data, false)) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_INVALID_SECURITY'), 'warning'); + $this->setRedirect($link); + + return false; + } + } + + if ($user->guest) + { + $data['userid'] = 0; + } + else + { + $data['userid'] = $user->id; + + if ($userInfo = RedshopHelperUser::getUserInformation($user->id)) + { + $data['username'] = $userInfo->firstname . " " . $userInfo->lastname; + $data['email'] = $userInfo->user_email; + + if ($userInfo->is_company) + { + $data['company_name'] = $userInfo->company_name; + } + } + else + { + $data['username'] = $user->name; + $data['email'] = $user->email; + } + } + + $validate = $model->validate($form, $data); + + if ($validate === false) + { + // Get the validation messages. + $errors = $model->getErrors(); + + // Push up to three validation messages out to the user. + for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) + { + if ($errors[$i] instanceof Exception) + { + $app->enqueueMessage($errors[$i]->getMessage(), 'warning'); + } + else + { + $app->enqueueMessage($errors[$i], 'warning'); + } + } + + $this->setRedirect($link); + + return false; + } + + if ((Redshop::getConfig()->get('RATING_REVIEW_LOGIN_REQUIRED') && $model->checkRatedProduct($productId, $user->id)) + || (!Redshop::getConfig()->get('RATING_REVIEW_LOGIN_REQUIRED') && $model->checkRatedProduct($productId, 0, $data['email']))) + { + if ($modal) + { + $link .= '&rate=1'; + } + + $app->enqueueMessage(JText::_('COM_REDSHOP_YOU_CAN_NOT_REVIEW_SAME_PRODUCT_AGAIN'), 'warning'); + $this->setRedirect($link); + + return false; + } + + $data['published'] = 0; + $data['favoured'] = 0; + $data['time'] = time(); + $data['product_id'] = $productId; + $data['Itemid'] = $Itemid; + + if ($model->sendMailForReview($data)) + { + // Flush the data from the session + $app->setUserState('com_redshop.edit.product_rating.' . $productId . '.data', null); + + if (Redshop::getConfig()->get('RATING_MSG')) + { + $msg = Redshop::getConfig()->get('RATING_MSG'); + } + else + { + $msg = JText::_('COM_REDSHOP_EMAIL_HAS_BEEN_SENT_SUCCESSFULLY'); + } + + $app->enqueueMessage($msg); + + if ($modal) + { + $link .= '&rate=1'; + } + } + else + { + $app->enqueueMessage($model->getError(), 'warning'); + } + + $this->setRedirect($link); + } +} diff --git a/component/site/controllers/quotation.php b/component/site/controllers/quotation.php new file mode 100644 index 00000000000..a7689149764 --- /dev/null +++ b/component/site/controllers/quotation.php @@ -0,0 +1,146 @@ +input->get('Itemid'); + $return = $app->input->get('return'); + $post = $app->input->post->getArray(); + + JPluginHelper::importPlugin('redshop_product'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + + if (!$post['user_email']) + { + $msg = JText::_('COM_REDSHOP_PLEASE_ENTER_VALID_EMAIL_ADDRESS'); + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=quotation&return=1&Itemid=' . $Itemid, $msg); + die(); + } + + /** @var RedshopModelQuotation $model */ + $model = $this->getModel('quotation'); + $session = JFactory::getSession(); + $cart = $session->get('cart'); + $cart['quotation_note'] = $post['quotation_note']; + + $dispatcher->trigger('onRedshopQuotationBeforeAdding', array(&$cart, &$post)); + + $row = $model->store($cart, $post); + + if ($row) + { + RedshopHelperExtrafields::extraFieldSave($post, RedshopHelperExtrafields::SECTION_QUOTATION, $row->quotation_id); + $dispatcher->trigger('onRedshopQuotationAfterAdded', array(&$cart, &$post, $row)); + + $sent = $model->sendQuotationMail($row->quotation_id); + + if ($sent) + { + $msg = JText::_('COM_REDSHOP_QUOTATION_DETAIL_SENT'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SENDING_QUOTATION_MAIL'); + } + + $session = JFactory::getSession(); + RedshopHelperCartSession::setCart(null); + $session->set('ccdata', null); + $session->set('issplit', null); + $session->set('userfield', null); + unset ($_SESSION ['ccdata']); + + if ($return != "") + { + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . $Itemid . '"emsg=' . $msg, false); + + ?> + + close(); + } + + $this->setRedirect('index.php?option=com_redshop&view=cart&Itemid=' . $Itemid, $msg); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_SAVING_QUOTATION_DETAIL'); + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=quotation&return=1&Itemid=' . $Itemid, $msg); + } + } + + /** + * user create function + * + * @access public + * @return void + */ + public function usercreate() + { + $input = JFactory::getApplication()->input; + $Itemid = $input->get('Itemid'); + $model = $this->getModel('quotation'); + $post = $input->post->getArray(); + + $model->usercreate($post); + + $msg = JText::_('COM_REDSHOP_QUOTATION_SENT_AND_USERNAME_PASSWORD_HAS_BEEN_MAILED'); + $this->setRedirect('index.php?tmpl=component&option=com_redshop&view=quotation&return=1&Itemid=' . $Itemid, $msg); + } + + /** + * cancel function + * + * @access public + * @return void + */ + public function cancel() + { + $app = JFactory::getApplication(); + $Itemid = $app->input->get('Itemid'); + $return = $app->input->get('return'); + + if ($return != "") + { + $link = JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . $Itemid, false); + + ?> + + close(); + } + else + { + $this->setRedirect('index.php?option=com_redshop&view=cart&Itemid=' . $Itemid); + } + } +} diff --git a/component/site/controllers/quotation_detail.php b/component/site/controllers/quotation_detail.php new file mode 100644 index 00000000000..ef78f4031bc --- /dev/null +++ b/component/site/controllers/quotation_detail.php @@ -0,0 +1,89 @@ +input->post->getArray(); + + $Itemid = $this->input->get('Itemid'); + $encr = $this->input->get('encr'); + $model = $this->getModel('quotation_detail'); + + // Update Status + RedshopHelperQuotation::updateQuotationStatus($post['quotation_id'], $post['quotation_status']); + + // Add Customer Note + $model->addQuotationCustomerNote($post); + + Redshop\Mail\Quotation::sendMail($post['quotation_id'], $post['quotation_status']); + + $msg = JText::_('COM_REDSHOP_QUOTATION_STATUS_UPDATED_SUCCESSFULLY'); + + $this->setRedirect('index.php?option=com_redshop&view=quotation_detail&quoid=' . $post['quotation_id'] . '&encr=' . $encr . '&Itemid=' . $Itemid, $msg); + } + + /** + * checkout function + * + * @access public + * @return void + * @throws Exception + */ + public function checkout() + { + $Itemid = $this->input->get('Itemid'); + $post = $this->input->post->getArray(); + $encr = $this->input->get('encr'); + + $model = $this->getModel('quotation_detail'); + $session = JFactory::getSession(); + + $cart = array(); + $cart['idx'] = 0; + RedshopHelperCartSession::setCart($cart); + + $quotationProducts = RedshopHelperQuotation::getQuotationProduct($post['quotation_id']); + + for ($q = 0, $qn = count($quotationProducts); $q < $qn; $q++) + { + $model->addtocart($quotationProducts[$q]); + } + + $cart = $session->get('cart'); + + $quotationDetail = RedshopHelperQuotation::getQuotationDetail($post['quotation_id']); + $cart['customer_note'] = $quotationDetail->quotation_note; + $cart['quotation_id'] = $quotationDetail->quotation_id; + $cart['cart_discount'] = $quotationDetail->quotation_discount; + $cart['quotation'] = 1; + RedshopHelperCartSession::setCart($cart); + + $model->modifyQuotation($quotationDetail->user_id); + $Itemid = RedshopHelperRouter::getCheckoutItemId(); + $this->setRedirect('index.php?option=com_redshop&view=checkout"ation=1&encr=' . $encr . '&Itemid=' . $Itemid); + } +} diff --git a/component/site/controllers/ratings.php b/component/site/controllers/ratings.php new file mode 100644 index 00000000000..104d5916460 --- /dev/null +++ b/component/site/controllers/ratings.php @@ -0,0 +1,22 @@ +input; + $post = $input->post->getArray(); + $itemId = $input->getInt('Itemid', 0); + $dispatcher = RedshopHelperUtility::getDispatcher(); + + /** @var RedshopModelRegistration $model */ + $model = $this->getModel('registration'); + $success = $model->store($post); + + if ($success) + { + $message = JText::sprintf('COM_REDSHOP_ALERT_REGISTRATION_SUCCESSFULLY', $post['username']); + JPluginHelper::importPlugin('redshop_alert'); + $dispatcher->trigger('storeAlert', array($message)); + + if ($post['mywishlist'] == 1) + { + $this->setRedirect(JRoute::_('index.php?loginwishlist=1&option=com_redshop&view=wishlist&Itemid=' . $itemId, false)); + } + else + { + $msg = Redshop::getConfig()->get('WELCOME_MSG'); + + if (Redshop::getConfig()->get('SHOP_NAME') != "") + { + $msg = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $msg); + } + + // Redirection settings + $link = JRoute::_('index.php?option=com_redshop&view=redshop&Itemid=' . $itemId); + + $menu = JFactory::getApplication()->getMenu(); + $retMenuItem = $menu->getItem($menu->getParams($itemId)->get('registrationredirect')); + + if (!empty($retMenuItem)) + { + $link = JRoute::_($retMenuItem->link . '&Itemid=' . $retMenuItem->id, false); + } + + // Redirection settings End + $this->setRedirect($link, $msg); + } + } + else + { + $this->display(); + } + } + + /** + * Method for search user detail by phone + * + * @return void + */ + public function searchUserdetailByPhone() + { + ob_clean(); + $app = JFactory::getApplication(); + $get = $app->input->get->getArray(); + $return = ""; + + JPluginHelper::importPlugin('telesearch'); + + $telephone = array('phone' => $get['phone']); + $accountHandle = RedshopHelperUtility::getDispatcher()->trigger('onSearchUserDetails', array($telephone)); + + if (count($accountHandle) > 0) + { + $response = $accountHandle[0]; + + if (count($response) > 0) + { + $return = implode("`_`", $response); + } + } + + echo $return; + + $app->close(); + } + + /** + * getCompanyOrCustomer + * + * @return void + * @throws Exception + */ + public function getCompanyOrCustomer() + { + $app = JFactory::getApplication(); + $get = $app->input->get->getArray(); + $templateId = $get['template_id']; + $isCompany = $get['is_company']; + $lists = array('isAjax' => 1); + + if ($isCompany == 1) + { + $lists['extra_field_company'] = Redshop\Fields\SiteHelper::renderFields(8); + $template = RedshopHelperTemplate::getTemplate("company_billing_template", $templateId); + + if (count($template) > 0 && $template[0]->template_desc != "") + { + $templateHtml = $template[0]->template_desc; + } + else + { + $templateHtml = '
    {email_lbl}:{email}*
    {retype_email_lbl}{retype_email}*
    {company_name_lbl}{company_name}*
    {vat_number_lbl}{vat_number}*
    {firstname_lbl}{firstname}*
    {lastname_lbl}{lastname}*
    {address_lbl}{address}*
    {zipcode_lbl}{zipcode}*
    {city_lbl}{city}*
    {country_lbl}{country}*
    {state_lbl}{state}*
    {phone_lbl}{phone}*
    {ean_number_lbl}{ean_number}
    {tax_exempt_lbl}{tax_exempt}
    {company_extrafield}
    '; + } + + $templateHtml = RedshopHelperBilling::replaceCompanyCustomer($templateHtml, $get, $lists); + } + else + { + $lists['extra_field_user'] = Redshop\Fields\SiteHelper::renderFields(7); + $template = RedshopHelperTemplate::getTemplate("private_billing_template", $templateId); + + if (count($template) > 0 && $template[0]->template_desc != "") + { + $templateHtml = $template[0]->template_desc; + } + else + { + $templateHtml = '
    {email_lbl}:{email}*
    {retype_email_lbl}{retype_email}*
    {firstname_lbl}{firstname}*
    {lastname_lbl}{lastname}*
    {address_lbl}{address}*
    {zipcode_lbl}{zipcode}*
    {city_lbl}{city}*
    {country_lbl}{country}*
    {state_lbl}{state}*
    {phone_lbl}{phone}*
    {private_extrafield}
    '; + } + + $templateHtml = RedshopHelperBilling::replacePrivateCustomer($templateHtml, $get, $lists); + } + + echo $return = '
    ' . $templateHtml . '
    '; + + $app->close(); + } + + /** + * Get Billing One Step checkout template + * + * @return void + * @throws Exception + */ + public function getBillingTemplate() + { + $app = JFactory::getApplication(); + $input = $app->input; + $isCompany = $input->post->getInt('isCompany'); + $type = $input->post->getString('type'); + $lists = array(); + $html = ""; + + if ($isCompany == 1 && $type == 'company') + { + $lists['extra_field_company'] = Redshop\Fields\SiteHelper::renderFields(RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS); + + $template = RedshopHelperTemplate::getTemplate("company_billing_template"); + + if (count($template) > 0 && $template[0]->template_desc != "") + { + $html = $template[0]->template_desc; + } + else + { + $html = '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '
    {email_lbl}:{email}' + . '*
    {retype_email_lbl}{retype_email}' + . '*
    {company_name_lbl}{company_name}' + . '*
    {vat_number_lbl}{vat_number}' + . '*
    {firstname_lbl}{firstname}' + . '*
    {lastname_lbl}{lastname}*
    {address_lbl}{address}' + . '*
    {zipcode_lbl}{zipcode}*
    {city_lbl}{city}*' + . '
    {country_lbl}{country}' + . '*
    {state_lbl}{state}' + . '*
    {phone_lbl}{phone}*
    ' + . '{ean_number_lbl}{ean_number}
    {tax_exempt_lbl}{tax_exempt}
    {company_extrafield}
    '; + } + + $html = RedshopHelperBilling::replaceCompanyCustomer($html, array(), $lists); + $html .= ''; + } + elseif ($isCompany == 0 && $type == 'private') + { + $lists['extra_field_user'] = Redshop\Fields\SiteHelper::renderFields(RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS); + + $template = RedshopHelperTemplate::getTemplate("private_billing_template"); + + if (count($template) > 0 && $template[0]->template_desc != "") + { + $html = $template[0]->template_desc; + } + else + { + $html = '
    {email_lbl}:{email}*
    {retype_email_lbl}{retype_email}*
    {firstname_lbl}{firstname}*
    {lastname_lbl}{lastname}*
    {address_lbl}{address}*
    {zipcode_lbl}{zipcode}*
    {city_lbl}{city}*
    {country_lbl}{country}*
    {state_lbl}{state}*
    {phone_lbl}{phone}*
    {private_extrafield}
    '; + } + + $html = RedshopHelperBilling::replacePrivateCustomer($html, array(), $lists); + $html .= ''; + } + + JPluginHelper::importPlugin('redshop_checkout'); + RedshopHelperUtility::getDispatcher()->trigger('onRenderBillingOneStepCheckout', array(&$html)); + + echo $html; + + $app->close(); + } + + public function ajaxValidateNewJoomlaUser() + { + $app = JFactory::getApplication(); + $return = true; + + $username = $app->input->getString('username', ''); + + if (!empty($username)) + { + if (!empty(RedshopHelperUser::validateUser($username))) + { + $return = false; + } + } + + ob_clean(); + echo json_encode($return); + + $app->close(); + } +} diff --git a/component/site/controllers/search.php b/component/site/controllers/search.php new file mode 100644 index 00000000000..e3a40f11d2d --- /dev/null +++ b/component/site/controllers/search.php @@ -0,0 +1,309 @@ +setRedirect('index.php'); + } + + /** + * loadProducts function + * + * @return + * + * @access public + */ + public function loadProducts() + { + $app = JFactory::getApplication(); + $get = $app->input->get->getArray(); + $taskId = $get['taskid']; + + /** @var RedshopModelSearch $model */ + $model = $this->getModel('search'); + + $brands = $model->loadCatProductsManufacturer($taskId); + + // Manufacturer Select Id + $manufacturer = $app->input->getInt('manufacture_id', 0); + + JLoader::import('joomla.application.module.helper'); + + $module = JModuleHelper::getModule('redshop_search'); + $params = new Registry($module->params); + $javaFun = $params->get('enableAjaxsearch') ? 'makeUrl();' : ''; + + if (count($brands) > 0) + { + $manufacturerOptions = array(); + $manufacturerOptions[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_SELECT_MANUFACTURE')); + $manufacturerOptions = @array_merge($manufacturerOptions, $brands); + + echo JText::_('COM_REDSHOP_SELECT_MANUFACTURE') . '
    ' + . JHtml::_( + 'select.genericlist', + $manufacturerOptions, + 'manufacture_id', 'class="inputbox span12" size="1" onChange="' . $javaFun . '" ', + 'value', + 'text', + $manufacturer + ); + } + + $app->close(); + } + + /** + * ajaxsearch function + * + * @access public + * + * @return void + */ + public function ajaxsearch() + { + /** @var RedshopModelSearch $model */ + $model = $this->getModel('Search'); + $detail = $model->getajaxData(); + + $encoded = json_encode($detail); + ob_clean(); + echo "{\"results\": " . $encoded . "}"; + + JFactory::getApplication()->close(); + } + + /** + * AJAX Task to get states list + * + * @return void + */ + public function getStatesAjax() + { + // Only verify token for frontend + \Redshop\Helper\Ajax::validateAjaxRequest('get'); + + $app = JFactory::getApplication(); + + ob_clean(); + + echo RedshopHelperWorld::getStatesAjax($app->input->getCmd('country')); + + $app->close(); + } + + /** + * AJAX Task to filter products + * + * @return void + */ + public function findProducts() + { + $app = JFactory::getApplication(); + $input = $app->input; + + /** @var RedshopModelSearch $model */ + $model = $this->getModel('Search'); + $post = $input->post->getArray(); + $data = $post['redform']; + + $model->setState('filter.data', $post); + $list = $model->getItem(); + $pagination = $model->getFilterPagination(); + $total = $model->getFilterTotal(); + $url = JRoute::_( + 'index.php?option=' . $post['option'] + . '&view=' . $post['view'] + . '&layout=' . $post['layout'] + . '&cid=' . $data['cid'] + . '&manufacturer_id=' . $data['mid'] + . '&Itemid=' . $post['Itemid'] + . '&categories=' . (isset($data['category']) ? implode(',', $data['category']) : '') + . '&manufacturers=' . (isset($data['manufacturer']) ? implode(',', $data['manufacturer']) : '') + . '&filterprice[min]=' . (isset($data['filterprice']) ? $data['filterprice']['min'] : '') + . '&filterprice[max]=' . (isset($data['filterprice']) ? $data['filterprice']['max'] : '') + . '&template_id=' . $data['template_id'] + . '&keyword=' . $data['keyword'] + . '&order_by=' . $post['order_by'] + . '&limit=' . $post['limit'] + . '&limitstart=' . $post['limitstart'] + ); + + if (!empty($data['custom_field'])) + { + foreach ($data['custom_field'] as $fieldId => $fieldValues) + { + $url .= '&custom_field[' . $fieldId . ']=' . implode(',', $fieldValues); + } + } + + // Get layout HTML + if (empty($list)) + { + echo JText::_('COM_REDSHOP_MSG_SORRY_NO_RESULT_FOUND'); + $app->close(); + } + + echo RedshopLayoutHelper::render( + 'filter.result', + array( + 'products' => $list, + 'model' => $model, + 'post' => $data, + 'pagination' => $pagination, + 'orderBy' => $post['order_by'], + 'total' => $total, + 'templateId' => $data['template_id'], + 'url' => $url, + 'keyword' => $data['keyword'] + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + + $app->close(); + } + + /** + * AJAX Task to restricted data + * + * @return void + */ + public function restrictedData() + { + JLoader::register('ModRedshopFilter', JPATH_SITE . '/modules/mod_redshop_filter/helper.php'); + + $app = JFactory::getApplication(); + $input = $app->input; + $params = new Registry($input->post->getString('params', '')); + $pids = explode(',', $input->post->getString('pids', '')); + $form = urldecode(stripslashes($input->post->get('form', '', 'RAW'))); + parse_str($form, $formData); + + $cid = $formData['redform']['cid']; + $mid = $formData['redform']['mid']; + $rootCategory = $params->get('root_category', 0); + $productFields = $params->get('product_fields', array()); + $manufacturers = array(); + $categories = array(); + $productList = array(); + + if (!empty($cid)) + { + $productList = RedshopHelperProduct::getProductsByIds($pids); + $manuList = array(); + $catList = array(); + + foreach ($productList as $k => $value) + { + $tmpCategories = is_array($value->categories) ? $value->categories : explode(',', $value->categories); + $catList = array_merge($catList, $tmpCategories); + + if ($value->manufacturer_id && $value->manufacturer_id != $mid) + { + $manuList[] = $value->manufacturer_id; + } + } + + $catList = array_unique($catList); + $manufacturers = ModRedshopFilter::getManufacturers(array_unique($manuList)); + $categories = ModRedshopFilter::getCategories($catList, $rootCategory, $cid); + $rangePrice = ModRedshopFilter::getRange($pids); + } + elseif (!empty($mid)) + { + $productList = RedshopHelperProduct::getProductsByIds($pids); + $manuList = array(); + $catList = array(); + + foreach ($productList as $k => $value) + { + $tmpCategories = is_array($value->categories) ? $value->categories : explode(',', $value->categories); + $catList = array_merge($catList, $tmpCategories); + + if ($value->manufacturer_id && $value->manufacturer_id != $mid) + { + $manuList[] = $value->manufacturer_id; + } + } + + $manufacturers = array(); + $pids = ModRedshopFilter::getProductByManufacturer($mid); + $categories = ModRedshopFilter::getCategorybyPids($pids, $rootCategory); + $rangePrice = ModRedshopFilter::getRange($pids); + } + elseif ($formData['view'] == 'search') + { + $productList = RedshopHelperProduct::getProductsByIds($pids); + $manuList = array(); + $catList = array(); + + foreach ($productList as $k => $value) + { + $tmpCategories = is_array($value->categories) ? $value->categories : explode(',', $value->categories); + $catList = array_merge($catList, $tmpCategories); + + if ($value->manufacturer_id && $value->manufacturer_id != $mid) + { + $manuList[] = $value->manufacturer_id; + } + } + + $manufacturers = ModRedshopFilter::getManufacturers(array_unique($manuList)); + $categories = ModRedshopFilter::getSearchCategories(array_unique($catList)); + $rangePrice = ModRedshopFilter::getRange($pids); + } + + $customFields = ModRedshopFilter::getCustomFields($pids, $productFields); + $rangeMin = $formData['redform']['filterprice']['min'] ? $formData['redform']['filterprice']['min'] : $rangePrice['min']; + $rangeMax = $formData['redform']['filterprice']['max'] ? $formData['redform']['filterprice']['max'] : $rangePrice['max']; + + echo RedshopLayoutHelper::render( + 'filter.restricted', + array( + "params" => $params->toObject(), + "manufacturers" => $manufacturers, + "categories" => $categories, + "rangeMin" => $rangeMin, + "rangeMax" => $rangeMax, + "customFields" => $customFields, + 'formData' => $formData, + "productList" => $productList + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + + $app->close(); + } +} diff --git a/component/site/controllers/send_friend.php b/component/site/controllers/send_friend.php new file mode 100644 index 00000000000..344e117c82a --- /dev/null +++ b/component/site/controllers/send_friend.php @@ -0,0 +1,44 @@ +input; + $yourName = $input->getString('your_name', ''); + $friendName = $input->getString('friends_name', ''); + $friendEmail = $input->getString('friends_email', ''); + $productId = $input->getInt('pid', 0); + + /** @var RedshopModelSend_Friend $model */ + $model = $this->getModel('send_friend'); + + $model->sendProductMailToFriend($yourName, $friendName, $productId, $friendEmail); + + JFactory::getApplication()->close(); + } +} diff --git a/component/site/controllers/wishlist.php b/component/site/controllers/wishlist.php new file mode 100644 index 00000000000..1d8ac8e11e9 --- /dev/null +++ b/component/site/controllers/wishlist.php @@ -0,0 +1,168 @@ +getModel("wishlist"); + $input = JFactory::getApplication()->input; + + $post = array(); + $post['wishlist_name'] = $input->post->getString('txtWishlistname', ''); + $post['user_id'] = $user->id; + $post['cdate'] = time(); + $post['product_id'] = $input->post->getInt('product_id', 0); + + if ($model->store($post)) + { + echo "
    " . JText::_('COM_REDSHOP_PRODUCT_SAVED_IN_WISHLIST_SUCCESSFULLY') . "
    "; + } + else + { + echo "
    " . JText::_('COM_REDSHOP_PRODUCT_NOT_SAVED_IN_WISHLIST') . "
    "; + } + + if ($input->getInt('loginwishlist', 0) == 1) + { + $return = JRoute::_('index.php?option=com_redshop&view=wishlist&task=viewwishlist&Itemid=' . $this->input->post->getInt('Itemid'), false); + $this->setRedirect($return); + } + else + { + ?> + + getModel("wishlist"); + + $data = JFactory::getApplication()->input->post->getArray(); + + if ($model->savewishlist($data)) + { + echo "
    " . JText::_('COM_REDSHOP_PRODUCT_SAVED_IN_WISHLIST_SUCCESSFULLY') . "
    "; + } + else + { + echo "
    " . JText::_('COM_REDSHOP_PRODUCT_NOT_SAVED_IN_WISHLIST') . "
    "; + } + + ?> + + getModel("wishlist"); + $Itemid = $app->input->get('Itemid'); + $post = $app->input->getArray(); + $link = JRoute::_("index.php?option=com_redshop&view=wishlist&task=viewwishlist&Itemid=" . $Itemid, false); + + if ($model->check_user_wishlist_authority($user->id, $post["wishlist_id"])) + { + if ($model->delwishlist($user->id, $post["wishlist_id"])) + { + $msg = JText::_('COM_REDSHOP_WISHLIST_DELETED_SUCCESSFULLY'); + } + else + { + $msg = JText::_('COM_REDSHOP_ERROR_IN_DELETING_WISHLIST'); + } + } + else + { + $msg = JText::_('COM_REDSHOP_YOU_ARE_NOT_AUTHORIZE_TO_DELETE'); + } + + $app->redirect($link, $msg); + } + + /** + * My sess del wish list + * + * @return void + */ + public function mysessdelwishlist() + { + $input = JFactory::getApplication()->input; + $post = array(); + $mydel = $input->get('mydel'); + $model = $this->getModel("wishlist"); + + $Itemid = $input->getInt('Itemid', 0); + $post['wishlist_id'] = $input->getInt('wishlist_id'); + + if (Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE')) + { + $post['attribute_id'] = $input->getInt('attribute_id', 0); + $post['property_id'] = $input->getInt('property_id', 0); + $post['subattribute_id'] = $input->getInt('subattribute_id', 0); + } + + $link = JRoute::_("index.php?mydel=1&option=com_redshop&view=wishlist&task=viewwishlist&Itemid=" . $Itemid, false); + + if (!empty($mydel)) + { + if ($model->mysessdelwishlist($post)) + { + $msg = JText::_('COM_REDSHOP_WISHLIST_DELETED_SUCCESSFULLY'); + } + + $this->setRedirect($link, $msg); + } + + $this->setRedirect($link); + } +} diff --git a/component/site/helpers/currency.json b/component/site/helpers/currency.json new file mode 100644 index 00000000000..c748776a0c7 --- /dev/null +++ b/component/site/helpers/currency.json @@ -0,0 +1,178 @@ +{ + "success": true, + "terms": "https://currencylayer.com/terms", + "privacy": "https://currencylayer.com/privacy", + "timestamp": 1493966346, + "source": "USD", + "quotes": { + "USDAED": 3.672298, + "USDAFN": 67.495659, + "USDALL": 122.400002, + "USDAMD": 484.269989, + "USDANG": 1.770176, + "USDAOA": 165.087006, + "USDARS": 15.30901, + "USDAUD": 1.352205, + "USDAWG": 1.79, + "USDAZN": 1.702098, + "USDBAM": 1.740414, + "USDBBD": 2, + "USDBDT": 81.470001, + "USDBGN": 1.789898, + "USDBHD": 0.376897, + "USDBIF": 1701.630005, + "USDBMD": 1, + "USDBND": 1.402098, + "USDBOB": 6.894926, + "USDBRL": 3.188099, + "USDBSD": 1, + "USDBTC": 0.000633, + "USDBTN": 64.150002, + "USDBWP": 10.4772, + "USDBYN": 1.879659, + "USDBYR": 20020, + "USDBZD": 1.997695, + "USDCAD": 1.37717, + "USDCDF": 1399.869995, + "USDCHF": 0.98766, + "USDCLF": 0.02515, + "USDCLP": 674.880005, + "USDCNY": 6.896102, + "USDCOP": 2980.699951, + "USDCRC": 552.809998, + "USDCUC": 1, + "USDCUP": 1.000112, + "USDCVE": 100.459999, + "USDCZK": 24.450802, + "USDDJF": 175.789993, + "USDDKK": 6.774303, + "USDDOP": 47.099998, + "USDDZD": 108.603996, + "USDEEK": 14.061033, + "USDEGP": 18.069964, + "USDERN": 15.279764, + "USDETB": 22.799999, + "USDEUR": 0.910699, + "USDFJD": 2.105001, + "USDFKP": 0.773902, + "USDGBP": 0.77319, + "USDGEL": 2.429899, + "USDGGP": 0.773148, + "USDGHS": 4.148501, + "USDGIP": 0.774096, + "USDGMD": 44.900002, + "USDGNF": 9213.799805, + "USDGTQ": 7.340495, + "USDGYD": 202.710007, + "USDHKD": 7.78289, + "USDHNL": 23.419913, + "USDHRK": 6.737102, + "USDHTG": 67.709999, + "USDHUF": 284.249746, + "USDIDR": 13342, + "USDILS": 3.605303, + "USDIMP": 0.773148, + "USDINR": 64.290001, + "USDIQD": 1181, + "USDIRR": 32442.999897, + "USDISK": 105.599998, + "USDJEP": 0.773148, + "USDJMD": 128.750207, + "USDJOD": 0.708499, + "USDJPY": 112.240997, + "USDKES": 102.849998, + "USDKGS": 67.608002, + "USDKHR": 4027.501632, + "USDKMF": 450.059998, + "USDKPW": 899.999939, + "USDKRW": 1138.079956, + "USDKWD": 0.303803, + "USDKYD": 0.819526, + "USDKZT": 318.079987, + "USDLAK": 8198.000097, + "USDLBP": 1506.699951, + "USDLKR": 152.229996, + "USDLRD": 91.999591, + "USDLSL": 13.640167, + "USDLTL": 3.048698, + "USDLVL": 0.62055, + "USDLYD": 1.409503, + "USDMAD": 9.872701, + "USDMDL": 18.77501, + "USDMGA": 3179.9998, + "USDMKD": 55.860001, + "USDMMK": 1349.000381, + "USDMNT": 2406.000046, + "USDMOP": 8.016104, + "USDMRO": 356.98999, + "USDMUR": 34.480118, + "USDMVR": 15.360297, + "USDMWK": 718.000177, + "USDMXN": 19.046898, + "USDMYR": 4.333992, + "USDMZN": 70.440002, + "USDNAD": 13.689746, + "USDNGN": 314.999864, + "USDNIO": 29.818297, + "USDNOK": 8.69405, + "USDNPR": 102.300003, + "USDNZD": 1.452397, + "USDOMR": 0.384901, + "USDPAB": 1, + "USDPEN": 3.280503, + "USDPGK": 3.177202, + "USDPHP": 49.950001, + "USDPKR": 104.779999, + "USDPLN": 3.849898, + "USDPYG": 5606.100098, + "USDQAR": 3.6408, + "USDRON": 4.138301, + "USDRSD": 112.760295, + "USDRUB": 58.765402, + "USDRWF": 819.289978, + "USDSAR": 3.749901, + "USDSBD": 7.825298, + "USDSCR": 13.506495, + "USDSDG": 6.6595, + "USDSEK": 8.83983, + "USDSGD": 1.40271, + "USDSHP": 0.774097, + "USDSLL": 7430.00024, + "USDSOS": 549.000006, + "USDSRD": 7.469674, + "USDSTD": 22321.400391, + "USDSVC": 8.722201, + "USDSYP": 514.97998, + "USDSZL": 13.639797, + "USDTHB": 34.589635, + "USDTJS": 8.499299, + "USDTMT": 3.41, + "USDTND": 2.3995, + "USDTOP": 2.3433, + "USDTRY": 3.566989, + "USDTTD": 6.689498, + "USDTWD": 30.174999, + "USDTZS": 2227.999861, + "USDUAH": 26.450001, + "USDUGX": 3619.99967, + "USDUSD": 1, + "USDUYU": 27.959999, + "USDUZS": 3730.000138, + "USDVEF": 9.97503, + "USDVND": 22729, + "USDVUV": 109.870003, + "USDWST": 2.603699, + "USDXAF": 597.119995, + "USDXAG": 0.060853, + "USDXAU": 0.000811, + "USDXCD": 2.701112, + "USDXDR": 0.730504, + "USDXOF": 601.380005, + "USDXPF": 108.602091, + "USDYER": 249.899994, + "USDZAR": 13.636598, + "USDZMK": 9.180327, + "USDZMW": 9.220133, + "USDZWL": 322.355011 + } +} \ No newline at end of file diff --git a/component/site/helpers/currency.xml b/component/site/helpers/currency.xml new file mode 100644 index 00000000000..c023b1aca97 --- /dev/null +++ b/component/site/helpers/currency.xml @@ -0,0 +1,46 @@ + + + Reference rates + + European Central Bank + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/component/site/helpers/currencyhelper.php b/component/site/helpers/currencyhelper.php new file mode 100644 index 00000000000..b45704785c6 --- /dev/null +++ b/component/site/helpers/currencyhelper.php @@ -0,0 +1,91 @@ +init(); + } + + /** + * Convert currency + * + * @param float $amountA Amount to convert + * @param string $currA Base Currency code + * @param string $currB Currency code in which need amount to be converted + * + * @return float Converted amount + * @throws Exception + * + * @deprecated 2.0.6 Use Redshop\Currency\Currency instead. + */ + public function convert($amountA, $currA = '', $currB = '') + { + if (Redshop::getConfig()->get('CURRENCY_LIBRARIES') == 1) + { + return CurrencyLayer::getInstance()->convert($amountA, $currA, $currB); + } + else + { + return Currency::getInstance()->convert($amountA, $currA, $currB); + } + } + + /** + * Method to get Currency Numeric code / ISO code + * + * @param string $code Currency Code + * + * @todo Add numeric code into table #_redshop_currency "redSHOP Currency Detail" + * + * @return string Currency Numeric Code + * + * @deprecated 2.0.6 Use Redshop\Currency\Currency instead. + */ + public function get_iso_code($code) + { + return Currency::getInstance()->getISOCode($code); + } +} diff --git a/component/site/helpers/extrafield.php b/component/site/helpers/extrafield.php new file mode 100644 index 00000000000..0df51d70f73 --- /dev/null +++ b/component/site/helpers/extrafield.php @@ -0,0 +1,208 @@ +getFieldValues(); + } + + /** + * Get Section Field List + * + * @param integer $section Section ID + * @param integer $front Field show in front + * @param integer $published Field show in front + * @param integer $required Field show in front + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperExtrafields::getSectionFieldList() instead + */ + public function getSectionFieldList($section = RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, $front = 1, $published = 1, $required = 0) + { + return RedshopHelperExtrafields::getSectionFieldList($section, $front, $published, $required); + } + + /** + * Method for get section field names. + * + * @param int $section Section ID + * @param int $front Is show on front? + * @param int $published Is published? + * @param int $required Is required? + * + * @return array List of field + * + * @deprecated 2.1.0 + * + * @see Redshop\Helper\ExtraFields::getSectionFieldNames + */ + public function getSectionFieldNameArray($section = RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, $front = 1, $published = 1, $required = 0) + { + return Redshop\Helper\ExtraFields::getSectionFieldNames($section, $front, $published, $required); + } + + /** + * Method for get section field names. + * + * @param int $section Section ID + * @param int $front Is show on front? + * @param int $published Is published? + * @param int $required Is required? + * + * @return array List of field + * + * @deprecated 2.0.6 Use RedshopHelperExtrafields::getSectionFieldList instead + */ + public function getSectionFieldIdArray($section = RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, $front = 1, $published = 1, $required = 0) + { + return RedshopHelperExtrafields::getSectionFieldList($section, $front, $published, $required); + } + + /** + * Get Section Field Data List + * + * @param int $fieldId Field id + * @param int $section Section + * @param int $sectionItem Section item + * + * @deprecated 1.6.1 Use RedshopHelperExtrafields::getData instead + * + * @return mixed|null + */ + public function getSectionFieldDataList($fieldId, $section = 0, $sectionItem = 0) + { + return RedshopHelperExtrafields::getData($fieldId, $section, $sectionItem); + } +} diff --git a/component/site/helpers/index.html b/component/site/helpers/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/helpers/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/helpers/producthelper.php b/component/site/helpers/producthelper.php new file mode 100644 index 00000000000..48734b96419 --- /dev/null +++ b/component/site/helpers/producthelper.php @@ -0,0 +1,4749 @@ +_db = JFactory::getDbo(); + $this->_table_prefix = '#__redshop_'; + $this->_userhelper = rsUserHelper::getInstance(); + $this->_session = JFactory::getSession(); + } + + /** + * Method for get Wishlist module base in element name + * + * @param string $elementName Element name + * + * @return object|null + * + * @since 1.6.0 + * + * @deprecated 2.0.6 Use RedshopHelperWishlist::getWishlistModule instead + */ + public function getWishlistModule($elementName) + { + return RedshopHelperWishlist::getWishlistModule($elementName); + } + + /** + * Method for get Wishlist user field data + * + * @param integer $wishlistId Wish list id + * @param integer $productId Product Id + * + * @return array + * + * @since 1.6.0 + * + * @deprecated 2.0.6 + */ + public function getwishlistuserfieldata($wishlistId, $productId) + { + return RedshopHelperWishlist::getUserFieldData($wishlistId, $productId); + } + + /** + * Get Main Product Query + * + * @param bool|JDatabaseQuery $query Get query or false + * @param int $userId User id + * + * @deprecated 1.5 Use RedshopHelperProduct::getMainProductQuery instead + * + * @return JDatabaseQuery + */ + public function getMainProductQuery($query = false, $userId = 0) + { + return RedshopHelperProduct::getMainProductQuery($query, $userId); + } + + /** + * Get product information + * + * @param int $productId Product id + * @param int $userId User id + * + * @deprecated 1.5 Use RedshopHelperProduct::getProductById instead + * + * @return mixed + */ + public function getProductById($productId, $userId = 0) + { + return RedshopHelperProduct::getProductById($productId, $userId); + } + + /** + * Set product array + * + * @param array $products Array product/s values + * + * @return void + * + * @deprecated 1.5 Use RedshopHelperProduct::setProduct instead + */ + public function setProduct($products) + { + RedshopHelperProduct::setProduct($products); + } + + /** + * Method for check country in EU area or not + * + * @param string $country Country code + * + * @return boolean + * + * @since 1.6.0 + * + * @deprecated 2.0.6 + */ + public function country_in_eu_common_vat_zone($country) + { + return RedshopHelperUtility::isCountryInEurope($country); + } + + /** + * Get Product Prices + * + * @param int $productId Product id + * @param int $userId User id + * @param int $quantity Quantity + * + * @return mixed + * @deprecated 2.1.0 + */ + public function getProductPrices($productId, $userId, $quantity = 1) + { + return RedshopHelperProduct::getProductPrices($productId, $userId, $quantity); + } + + /** + * Get Product Special Price + * + * @param float $productPrice Product price + * @param string $discountStringIds Discount ids + * @param int $productId Product id + * + * @return null|object + * + * @deprecated 2.0.7 Use RedshopHelperProductPrice::getProductSpecialPrice + */ + public function getProductSpecialPrice($productPrice, $discountStringIds, $productId = 0) + { + return RedshopHelperProductPrice::getProductSpecialPrice($productPrice, $discountStringIds, $productId); + } + + /** + * Get Product Special Id + * + * @param int $userId User Id + * + * @return string + */ + public function getProductSpecialId($userId) + { + if (array_key_exists($userId, self::$productSpecialIds)) + { + return self::$productSpecialIds[$userId]; + } + + $db = JFactory::getDbo(); + + if ($userId) + { + RedshopHelperUser::createUserSession($userId); + + $query = $db->getQuery(true) + ->select('ps.discount_product_id') + ->from($db->qn('#__redshop_discount_product_shoppers', 'ps')) + ->leftJoin($db->qn('#__redshop_users_info', 'ui') . ' ON ui.shopper_group_id = ps.shopper_group_id') + ->where('ui.user_id = ' . (int) $userId) + ->where('ui.address_type = ' . $db->q('BT')); + } + else + { + $userArr = $this->_session->get('rs_user'); + + if (empty($userArr)) + { + $userArr = RedshopHelperUser::createUserSession($userId); + } + + $shopperGroupId = isset($userArr['rs_user_shopperGroup']) ? + $userArr['rs_user_shopperGroup'] : RedshopHelperUser::getShopperGroup($userId); + + $query = $db->getQuery(true) + ->select('dps.discount_product_id') + ->from($db->qn('#__redshop_discount_product_shoppers', 'dps')) + ->where('dps.shopper_group_id =' . (int) $shopperGroupId); + } + + $result = $db->setQuery($query)->loadColumn(); + + self::$productSpecialIds[$userId] = '0'; + + if (!empty($result)) + { + self::$productSpecialIds[$userId] .= ',' . implode(',', $result); + } + + return self::$productSpecialIds[$userId]; + } + + /** + * Method for get product tax + * + * @param integer $productId Product Id + * @param integer $productPrice Product price + * @param integer $userId User ID + * @param integer $taxExempt Tax exempt + * + * @return integer + * + * @deprecated 2.0.6 + */ + public function getProductTax($productId = 0, $productPrice = 0, $userId = 0, $taxExempt = 0) + { + return RedshopHelperProduct::getProductTax($productId, $productPrice, $userId, $taxExempt); + } + + /** + * Method for replace tags about VAT information + * + * @param string $data Template data. + * + * @return string + * + * @deprecated 2.0.6 + * + * @see RedshopHelperTax::replaceVatInformation + */ + public function replaceVatinfo($data) + { + return RedshopHelperTax::replaceVatInformation($data); + } + + /** + * Check user for Tax Exemption approved + * + * @param integer $userId User Information Id - Login user id + * @param integer $isShowButtonAddToCart Display Add to cart button for tax exemption user + * + * @return boolean True if VAT applied else false + * + * @deprecated 2.0.6 + * + * @see RedshopHelperCart::taxExemptAddToCart + */ + public function taxexempt_addtocart($userId = 0, $isShowButtonAddToCart = 0) + { + return RedshopHelperCart::taxExemptAddToCart($userId, (boolean) $isShowButtonAddToCart); + } + + /** + * Get VAT User information + * + * @param integer $userId User ID + * + * @return object + * + * @deprecated 2.0.6 + */ + public function getVatUserinfo($userId = 0) + { + return RedshopHelperUser::getVatUserInformation($userId); + } + + /** + * get VAT rates from product or global + * + * @param int $productId Id current product + * @param int $userId Id current user + * + * @return object|null VAT rates information + * + * @deprecated 2.0.7 + * + * @see RedshopHelperTax::getVatRates + */ + public function getVatRates($productId = 0, $userId = 0) + { + return RedshopHelperTax::getVatRates($productId, $userId); + } + + /** + * Get ExtraFields For Current Template + * + * @param array $filedNames Field name list + * @param string $templateData Template data + * @param int $isCategoryPage Flag change extra fields in category page + * + * @return string + * + * @deprecated 2.0.6 + */ + public function getExtraFieldsForCurrentTemplate($filedNames = array(), $templateData = '', $isCategoryPage = 0) + { + return RedshopHelperTemplate::getExtraFieldsForCurrentTemplate($filedNames, $templateData, $isCategoryPage); + } + + /** + * Parse extra fields for template for according to section. + * + * @param array $fieldNames List of field names + * @param integer $productId ID of product + * @param integer $section Section + * @param string $templateContent Template content + * @param integer $categoryPage Argument for product section extra field for category page + * + * @return string + * + * @deprecated 2.0.7 + */ + public function getExtraSectionTag($fieldNames = array(), $productId = 0, $section = 0, $templateContent = '', $categoryPage = 0) + { + return RedshopHelperProductTag::getExtraSectionTag($fieldNames, $productId, $section, $templateContent, $categoryPage); + } + + /** + * Method for replace price. + * + * @param float $productPrice Product price + * + * @return string + * + * @deprecated 2.0.7 + */ + public function getPriceReplacement($productPrice) + { + return RedshopHelperProductPrice::priceReplacement($productPrice); + } + + /** + * Format Product Price + * + * @param float $productPrice Product price + * @param boolean $convert Decide to convert price in Multi Currency + * @param string $currencySymbol Product Formatted Price + * + * @return string Formatted Product Price + * + * @deprecated 2.0.7 + * + * @see RedshopHelperProductPrice::formattedPrice + */ + public function getProductFormattedPrice($productPrice, $convert = true, $currencySymbol = '_NON_') + { + return RedshopHelperProductPrice::formattedPrice($productPrice, $convert, $currencySymbol); + } + + /** + * Method for round product price + * + * @param float $productPrice Product price + * + * @return float + * + * @deprecated 2.0.7 + */ + public function productPriceRound($productPrice) + { + return RedshopHelperProductPrice::priceRound($productPrice); + } + + public function getProductparentImage($product_parent_id) + { + $result = RedshopHelperProduct::getProductById($product_parent_id); + + if ($result->product_full_image == '' && $result->product_parent_id > 0) + { + $result = $this->getProductparentImage($result->product_parent_id); + } + + return $result; + } + + /** + * Get Product image + * + * @param integer $product_id Product Id + * @param string $link Product link + * @param integer $width Product image width + * @param integer $height Product image height + * @param integer $Product_detail_is_light Product detail is light + * @param integer $enableHover Enable hover + * @param integer $suffixid Suffix id + * @param array $preselectedresult Preselected result + * + * @return string Product Image + * + * @deprecated 2.1.0 Use Redshop\Product\Image\Image::getImage() + * @see Redshop\Product\Image\Image::getImage + */ + public function getProductImage($product_id = 0, $link = '', $width, $height, $Product_detail_is_light = 2, $enableHover = 0, $suffixid = 0, $preselectedresult = array()) + { + return Redshop\Product\Image\Image::getImage($product_id, $link, $width, $height, $Product_detail_is_light, $enableHover, $suffixid, $preselectedresult); + } + + /** + * @param stdClass $product Product data + * @param string $imagename Image name + * @param string $linkimagename Link image name + * @param string $link Link + * @param integer $width Width + * @param integer $height Height + * @param integer $Product_detail_is_light Product detail is light + * @param integer $enableHover Enable hover or not + * @param array $preselectedResult Pre selected results + * @param integer $suffixid Suffix ID + * + * @return string Html content with replaced. + * @throws Exception + * + * @deprecated 2.1.0 Use Redshop\Product\Image\Render() + * @see Redshop\Product\Image\Render + */ + public function replaceProductImage($product, $imagename = "", $linkimagename = "", $link = "", $width, $height, $Product_detail_is_light = 2, $enableHover = 0, $preselectedResult = array(), $suffixid = 0) + { + return Redshop\Product\Image\Render::replace($product, $imagename, $linkimagename, $link, $width, $height, $Product_detail_is_light, $enableHover, $preselectedResult, $suffixid); + } + + public function getProductCategoryImage($product_id = 0, $category_img = '', $link = '', $width, $height) + { + $result = RedshopHelperProduct::getProductById($product_id); + $thum_image = ""; + $title = " title='" . $result->product_name . "' "; + $alt = " alt='" . $result->product_name . "' "; + + if ($category_img && file_exists(REDSHOP_FRONT_IMAGES_RELPATH . "category/" . $category_img)) + { + if (Redshop::getConfig()->get('PRODUCT_IS_LIGHTBOX') == 1) + { + $product_img = RedshopHelperMedia::watermark('category', $category_img, $width, $height, Redshop::getConfig()->get('WATERMARK_PRODUCT_IMAGE'), '0'); + RedshopHelperMedia::watermark('product', $category_img, Redshop::getConfig()->get('PRODUCT_HOVER_IMAGE_WIDTH'), Redshop::getConfig()->get('PRODUCT_HOVER_IMAGE_HEIGHT'), Redshop::getConfig()->get('WATERMARK_PRODUCT_IMAGE'), '0'); + $linkimage = RedshopHelperMedia::watermark('category', $category_img, '', '', Redshop::getConfig()->get('WATERMARK_PRODUCT_IMAGE'), '0'); + $thum_image = ""; + $thum_image .= ""; + + $thum_image .= ""; + } + else + { + $product_img = RedshopHelperMedia::watermark('category', $category_img, $width, $height, Redshop::getConfig()->get('WATERMARK_PRODUCT_IMAGE'), '0'); + RedshopHelperMedia::watermark('category', $category_img, Redshop::getConfig()->get('PRODUCT_HOVER_IMAGE_WIDTH'), Redshop::getConfig()->get('PRODUCT_HOVER_IMAGE_HEIGHT'), Redshop::getConfig()->get('WATERMARK_PRODUCT_IMAGE'), '0'); + $thum_image = ""; + $thum_image .= ""; + $thum_image .= ""; + } + } + + return $thum_image; + } + + public function getProductMinDeliveryTime($product_id = 0, $section_id = 0, $section = '', $loadDiv = 1) + { + // Initialiase variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + if (!$section_id && !$section) + { + $query + ->from($db->qn('#__redshop_product_stockroom_xref') . ' AS ps') + ->where($db->qn('ps.product_id') . ' = ' . (int) $product_id); + } + else + { + $query + ->from($db->qn('#__redshop_product_attribute_stockroom_xref') . ' AS ps') + ->where($db->qn('ps.section_id') . ' = ' . (int) $section_id) + ->where($db->qn('ps.section') . ' = ' . $db->q($section)); + } + + // Create the base select statement. + $query->select( + array( + 'min_del_time as deltime', + 's.max_del_time', + 's.delivery_time' + ) + ) + ->join('', $db->qn('#__redshop_stockroom') . ' AS s') + ->where($db->qn('ps.stockroom_id') . ' = ' . $db->qn('s.stockroom_id')) + ->where($db->qn('ps.quantity') . ' > 0 ') + ->order($db->qn('min_del_time') . ' ASC'); + + // Set the query and load the result. + $db->setQuery($query, 0, 1); + + try + { + $result = $db->loadObject(); + } + catch (RuntimeException $e) + { + throw new RuntimeException($e->getMessage(), $e->getCode()); + } + + $product_delivery_time = ''; + + if ($result) + { + // Append where clause to get Maximum Delivery time of Minimum Delivery stockroom + $query->where($db->qn('s.min_del_time') . ' = ' . (int) $result->deltime); + + // Set the query and load the row. + $db->setQuery($query, 0, 1); + + try + { + $row = $db->loadObject(); + } + catch (RuntimeException $e) + { + throw new RuntimeException($e->getMessage(), $e->getCode()); + } + + if ($row->deltime == 0 || $row->deltime == ' ') + { + $product_delivery_time = ''; + } + else + { + if ($row->delivery_time == "Days") + { + $duration = JText::_('COM_REDSHOP_DAYS'); + } + else + { + $row->deltime = $row->deltime / 7; + $row->max_del_time = $row->max_del_time / 7; + $duration = JText::_('COM_REDSHOP_WEEKS'); + } + + $product_delivery_time = (int) $row->deltime . "-" . (int) $row->max_del_time . " " . $duration; + } + } + + if ($product_delivery_time && $loadDiv) + { + $product_delivery_time = '
    ' . $product_delivery_time . '
    '; + } + + return $product_delivery_time; + } + + /** + * Method for get default quantity + * + * @param integer $product_id Product ID + * @param string $data_add Template html + * + * @return integer + * @throws Exception + * + * @deprecated 2.1.0 + * @see \Redshop\Cart\Helper::getDefaultQuantity + */ + public function GetDefaultQuantity($product_id = 0, $data_add = "") + { + return \Redshop\Cart\Helper::getDefaultQuantity($product_id, $data_add); + } + + /** + * Method for get product show price + * + * @param integer $productId Product ID + * @param string $templateHtml Template content + * @param string $seoTemplate SEO template + * @param int $userId User ID + * @param int $isRel Is Rel + * @param array $attributes Attributes + * + * @return mixed|string + * + * @deprecated 2.0.7 + * + * @see RedshopHelperProductPrice::getShowPrice() + */ + public function getProductShowPrice($productId, $templateHtml, $seoTemplate = "", $userId = 0, $isRel = 0, $attributes = array()) + { + return RedshopHelperProductPrice::getShowPrice($productId, $templateHtml, $seoTemplate, $userId, (boolean) $isRel, $attributes); + } + + /** + * Method for get product net price + * + * @param integer $productId ID of product + * @param integer $userId ID of user + * @param integer $quantity Quantity for get + * @param string $dataAdd Template data + * @param array $attributes Attributes list. + * + * @return array + * + * @deprecated 2.0.7 + */ + public function getProductNetPrice($productId, $userId = 0, $quantity = 1, $dataAdd = '', $attributes = array()) + { + return RedshopHelperProductPrice::getNetPrice($productId, $userId, $quantity, $dataAdd, $attributes); + } + + /** + * Get Layout product quantity price + * + * @param int $productId Product Id + * @param int $userId User Id + * + * @deprecated 1.5 Use RedshopHelperProduct::getProductQuantityPrice instead + * + * @return mixed Redshop Layout + */ + public function getProductQuantityPrice($productId, $userId) + { + return RedshopHelperProduct::getProductQuantityPrice($productId, $userId); + } + + /** + * Method for get discount + * + * @param integer $subTotal Sub-total amount + * @param integer $userId User ID + * + * @return mixed + * + * @deprecated 2.0.3 + * @see RedshopHelperDiscount::getDiscount + */ + public function getDiscountId($subTotal = 0, $userId = 0) + { + return RedshopHelperDiscount::getDiscount($subTotal, $userId); + } + + /** + * Method for get discount amount fromm cart + * + * @param array $cart Cart data + * @param integer $userId User ID + * + * @return float + * + * @deprecated 2.1.0 + */ + public function getDiscountAmount($cart = array(), $userId = 0) + { + return Redshop\Cart\Helper::getDiscountAmount($cart, $userId); + } + + /** + * Method for get price of product + * + * @param integer $product_id Product ID + * @param integer $show_price_with_vat True for include VAT. False for not include VAT + * @param integer $user_id User ID + * + * @return float + * @since 2.1.0 + */ + public function getProductPrice($product_id, $show_price_with_vat = 1, $user_id = 0) + { + return Redshop\Product\Price::getPrice($product_id, (boolean) $show_price_with_vat, $user_id); + } + + /** + * Method for get additional media images + * + * @param int $section_id Section Id + * @param string $section Section name + * @param string $mediaType Media type + * + * @return array + * + * @since 2.0.3 + * + * @deprecated 2.0.7 + */ + public function getAdditionMediaImage($section_id = 0, $section = "", $mediaType = "images") + { + return RedshopHelperMedia::getAdditionMediaImage($section_id, $section, $mediaType); + } + + /** + * Get alternative text for media + * + * @param string $mediaSection Media section + * @param int $sectionId Section i + * @param string $mediaName Media name + * @param int $mediaId Media id + * @param string $mediaType Media type + * + * @return string Alternative text from media + * + * @deprecated 2.0.7 + */ + public function getAltText($mediaSection, $sectionId, $mediaName = '', $mediaId = 0, $mediaType = 'images') + { + return RedshopHelperMedia::getAlternativeText($mediaSection, $sectionId, $mediaName, $mediaId, $mediaType); + } + + /** + * Get redshop user information + * + * @param int $userId Id joomla user + * @param string $addressType Type user address BT (Billing Type) or ST (Shipping Type) + * @param int $userInfoId Id redshop user + * + * @deprecated 1.5 Use RedshopHelperUser::getUserInformation instead + * + * @return object Redshop user information + */ + public function getUserInformation($userId = 0, $addressType = 'BT', $userInfoId = 0) + { + return RedshopHelperUser::getUserInformation($userId, $addressType, $userInfoId); + } + + /** + * Method for check if template apply VAT or not + * + * @param string $template Template content + * @param integer $userId User ID + * + * @return boolean + * + * @deprecated 2.1.0 + * @see \Redshop\Template\Helper::isApplyVat + */ + public function getApplyVatOrNot($template = "", $userId = 0) + { + return \Redshop\Template\Helper::isApplyVat($template, $userId); + } + + /** + * Method for check if template apply attribute VAT or not + * + * @param string $template Template content + * @param integer $userId User ID + * + * @return boolean + * + * @deprecated 2.1.0 + * @see \Redshop\Template\Helper::isApplyAttributeVat + */ + public function getApplyattributeVatOrNot($template = "", $userId = 0) + { + return \Redshop\Template\Helper::isApplyAttributeVat($template, $userId); + } + + /** + * Method for get default shopper group data + * + * @return array + * + * @deprecated 2.1.0 + */ + public function GetdefaultshopperGroupData() + { + return \Redshop\Helper\ShopperGroup::getDefault(); + } + + /** + * Get discount price from product with check discount date. + * + * @param int $productId Product id + * + * @return float + * + * @deprecated 2.0.7 + * + * @see RedshopHelperDiscount::getDiscountPriceBaseDiscountDate() + */ + public function checkDiscountDate($productId) + { + return RedshopHelperDiscount::getDiscountPriceBaseDiscountDate($productId); + } + + /** + * Method for get property price with discount + * + * @param integer $sectionId Section ID + * @param string $quantity Quantity + * @param string $section Section + * @param integer $userId User ID + * + * @return object + * + * @deprecated 2.0.3 Use RedshopHelperProduct_Attribute::getPropertyPrice() instead. + */ + public function getPropertyPrice($sectionId = 0, $quantity = '', $section = '', $userId = 0) + { + return RedshopHelperProduct_Attribute::getPropertyPrice($sectionId, $quantity, $section, $userId); + } + + /** + * Method for get property or sub object + * + * @param string $sectionId Section ID + * @param string $section Section + * + * @return object + * + */ + public function getProperty($sectionId, $section) + { + if ($section == 'property') + { + $properties = RedshopHelperProduct_Attribute::getAttributeProperties($sectionId); + + if (!empty($properties)) + { + $properties[0]->product_price = $properties[0]->property_price; + + return $properties[0]; + } + } + elseif ($section == 'subproperty') + { + $properties = RedshopHelperProduct_Attribute::getAttributeSubProperties($sectionId); + + if (!empty($properties)) + { + $properties[0]->product_price = $properties[0]->subattribute_color_price; + + return $properties[0]; + } + } + + return null; + } + + public function getWrapper($product_id, $wrapper_id = 0, $default = 1) + { + $usetoall = ""; + $and = ""; + + if ($wrapper_id != 0) + { + $and .= " AND wrapper_id='" . $wrapper_id . "' "; + } + + $query = "SELECT * FROM " . $this->_table_prefix . "product_category_xref " + . "WHERE product_id = '" . (int) $product_id . "' "; + $this->_db->setQuery($query); + $cat = $this->_db->loadObjectList(); + + for ($i = 0, $in = count($cat); $i < $in; $i++) + { + $usetoall .= " OR FIND_IN_SET(" . (int) $cat[$i]->category_id . ",category_id) "; + } + + if ($default != 0) + { + $usetoall .= " OR wrapper_use_to_all = 1 "; + } + + $query = "SELECT * FROM " . $this->_table_prefix . "wrapper " + . "WHERE published = 1 " + . "AND (FIND_IN_SET(" . (int) $product_id . ",product_id) " + . $usetoall . " )" + . $and; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectList(); + + return $list; + } + + /** + * Method for get list of pathway + * + * @param array $category List of category + * + * @return array List of pathway + * + * @deprecated 2.0.7 + */ + public function getBreadcrumbPathway($category = array()) + { + return RedshopHelperBreadcrumb::getPathway($category); + } + + public function getCategoryNavigationlist($category_id) + { + static $i = 0; + static $category_list = array(); + + $categorylist = RedshopEntityCategory::getInstance($category_id)->getItem(); + $category_parent_id = $this->getParentCategory($category_id); + + if (!empty($categorylist) && $categorylist->parent_id > 0) + { + $cItemid = RedshopHelperRouter::getCategoryItemid($categorylist->id); + + if ($cItemid != "") + { + $tmpItemid = $cItemid; + } + else + { + $tmpItemid = JFactory::getApplication()->input->get('Itemid'); + } + + $category_list[$i]['category_id'] = $categorylist->id; + $category_list[$i]['category_name'] = $categorylist->name; + $category_list[$i]['catItemid'] = $tmpItemid; + } + + if ($category_parent_id) + { + $i++; + array_merge($category_list, $this->getCategoryNavigationlist($category_parent_id)); + } + + return $category_list; + } + + /** + * Method for generate breadcrumb base on specific section + * + * @param integer $sectionId Section ID + * + * @return void + * @throws Exception + * + * @deprecated 2.0.7 + * + * @see RedshopHelperBreadcrumb::generate() + */ + public function generateBreadcrumb($sectionId = 0) + { + RedshopHelperBreadcrumb::generate($sectionId); + } + + /** + * Get section + * + * @param string $section Section name + * @param integer $id Section id + * + * @return mixed|null + * @deprecated 2.1.0 + */ + public function getSection($section = '', $id = 0) + { + // To avoid killing queries do not allow queries that get all the items + if ($id != 0 && $section != '') + { + switch ($section) + { + case 'product': + return RedshopHelperProduct::getProductById($id); + case 'category': + return RedshopHelperCategory::getCategoryById($id); + default: + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_' . $section)) + ->where($db->qn($section . '_id') . ' = ' . (int) $id); + + return $db->setQuery($query)->loadObject(); + } + } + + return null; + } + + /** + * Get menu detail + * + * @param string $link Link + * + * @return mixed|null + * @throws Exception + */ + public function getMenuDetail($link = '') + { + // Do not allow queries that load all the items + if ($link != '') + { + return JFactory::getApplication()->getMenu()->getItems('link', $link, true); + } + + return null; + } + + /** + * Get Menu Information + * + * @param int $Itemid Item id + * @param int $sectionId Section id + * @param string $sectionName Section name + * @param string $menuView Menu view + * @param bool $isRedshop Is redshop + * + * @return mixed|null + */ + public function getMenuInformation($Itemid = 0, $sectionId = 0, $sectionName = '', $menuView = '', $isRedshop = true) + { + $menu = JFactory::getApplication()->getMenu(); + $values = array(); + + if ($menuView != "") + { + if ($items = explode('&', $menuView)) + { + $values['view'] = $items[0]; + unset($items[0]); + + if (!empty($items)) + { + foreach ($items as $item) + { + $value = explode('=', $item); + $values[$value[0]] = $value[1]; + } + } + } + } + + if ($Itemid != 0) + { + return $menu->getItem($Itemid); + } + + if ($isRedshop) + { + $menuItems = RedshopHelperRouter::getRedshopMenuItems(); + } + else + { + $menuItems = $menu->getMenu(); + } + + foreach ($menuItems as $oneMenuItem) + { + if (!RedshopHelperRouter::checkMenuQuery($oneMenuItem, $values)) + { + break; + } + + if ($sectionName != '') + { + if ($sectionId != 0) + { + if ($oneMenuItem->params->get($sectionName) != $sectionId) + { + break; + } + } + else + { + if ($oneMenuItem->params->get($sectionName, false) !== false) + { + break; + } + } + } + + return $oneMenuItem; + } + + return null; + } + + /** + * Get Parent Category + * + * @param int $id + * + * @return null + * + * @deprecated Use please new function RedshopHelperCategory::getCategoryById + */ + public function getParentCategory($id = 0) + { + if ($result = RedshopHelperCategory::getCategoryById($id)) + { + return $result->parent_id; + } + + return null; + } + + /** + * Get Category Product + * + * @param int $productId Product id + * + * @return string + */ + public function getCategoryProduct($productId = 0) + { + if ($result = RedshopHelperProduct::getProductById($productId)) + { + if (!empty($result->categories)) + { + return is_array($result->categories) ? implode(',', $result->categories) : $result->categories; + } + + return $result->category_id; + } + + return ''; + } + + public function getProductCategory($id = 0) + { + $rsUserhelper = rsUserHelper::getInstance(); + $shopper_group_manufactures = $rsUserhelper->getShopperGroupManufacturers(); + $and = ''; + + if ($shopper_group_manufactures != "") + { + // Sanitize groups + $shopGroupsIds = explode(',', $shopper_group_manufactures); + $shopGroupsIds = Joomla\Utilities\ArrayHelper::toInteger($shopGroupsIds); + + $and .= " AND p.manufacturer_id IN (" . implode(',', $shopGroupsIds) . ") "; + } + + $query = "SELECT p.product_id FROM " . $this->_table_prefix . "product_category_xref pc" + . " LEFT JOIN " . $this->_table_prefix . "product AS p ON pc.product_id=p.product_id " + . " WHERE category_id = " . (int) $id . " " + . $and; + $this->_db->setQuery($query); + $res = $this->_db->loadObjectlist(); + + return $res; + } + + /** + * Method to check product is downloadable or else + * + * @param integer $productId Product Id + * @param boolean $return If yes, return object. False return number of download + * + * @return object|integer + * + * @deprecated 2.0.7 + * + * @see RedshopHelperProductDownload::checkDownload() + */ + public function checkProductDownload($productId, $return = false) + { + return RedshopHelperProductDownload::checkDownload($productId, $return); + } + + public function getProductMediaName($product_id) + { + $query = 'SELECT media_name FROM ' . $this->_table_prefix . 'media ' + . 'WHERE media_section = "product" ' + . 'AND media_type="download" ' + . 'AND published=1 AND section_id = ' . (int) $product_id; + $this->_db->setQuery($query); + $res = $this->_db->loadObjectList(); + + return $res; + } + + /** + * Method for get giftcard data + * + * @param integer $gid ID of giftcard + * + * @return object + * + * @deprecated 2.1.0 + */ + public function getGiftcardData($gid) + { + return RedshopEntityGiftcard::getInstance($gid)->getItem(); + } + + public function getValidityDate($period, $data) + { + $todate = mktime(0, 0, 0, (int) date('m'), (int) date('d') + $period, (int) date('Y')); + + $todate = RedshopHelperDatetime::convertDateFormat($todate); + $fromdate = RedshopHelperDatetime::convertDateFormat(strtotime(date('d M Y'))); + + $data = str_replace("{giftcard_validity_from}", JText::_('COM_REDSHOP_FROM') . " " . $fromdate, $data); + $data = str_replace("{giftcard_validity_to}", JText::_('COM_REDSHOP_TO') . " " . $todate, $data); + + return $data; + } + + /** + * Method for calculate accessory price + * + * @param integer $productId Product ID + * @param integer $accessoryPrice Accessory price + * @param integer $accessoryMainPrice Accessory main price + * @param integer $hasVAT Is include VAT? + * @param integer $userId User ID + * + * @return array + * + * @deprecated 2.1.0 + * @see \Redshop\Product\Accessory::getAccessoryPrice + */ + public function getAccessoryPrice($productId = 0, $accessoryPrice = 0, $accessoryMainPrice = 0, $hasVAT = 0, $userId = 0) + { + return \Redshop\Product\Accessory::getPrice($productId, $accessoryPrice, $accessoryMainPrice, $hasVAT, $userId); + } + + public function getuserfield($orderitemid = 0, $section_id = 12) + { + $resultArr = array(); + + $userfield = RedshopHelperOrder::getOrderUserFieldData($orderitemid, $section_id); + + if (!empty($userfield)) + { + $orderItem = RedshopHelperOrder::getOrderItemDetail(0, 0, $orderitemid); + $product_id = $orderItem[0]->product_id; + + $productdetail = RedshopHelperProduct::getProductById($product_id); + $productTemplate = RedshopHelperTemplate::getTemplate("product", $productdetail->product_template); + + $returnArr = $this->getProductUserfieldFromTemplate($productTemplate[0]->template_desc); + $userFieldTag = $returnArr[1]; + + for ($i = 0, $in = count($userFieldTag); $i < $in; $i++) + { + for ($j = 0, $jn = count($userfield); $j < $jn; $j++) + { + if ($userfield[$j]->name == $userFieldTag[$i]) + { + if ($userfield[$j]->type == 10) + { + $files = explode(",", $userfield[$j]->data_txt); + $data_txt = ""; + + for ($f = 0, $fn = count($files); $f < $fn; $f++) + { + $u_link = REDSHOP_FRONT_DOCUMENT_ABSPATH . "product/" . $files[$f]; + $data_txt .= "" . $files[$f] . " "; + } + + if (trim($data_txt) != "") + { + $resultArr[] = '' . $userfield[$j]->title + . ':' . stripslashes($data_txt) . ''; + } + } + else + { + if (trim($userfield[$j]->data_txt) != "") + { + $resultArr[] = '' . $userfield[$j]->title + . ' : ' . stripslashes($userfield[$j]->data_txt); + } + } + } + } + } + } + + $resultstr = ""; + + if (empty($resultArr)) + { + return $resultstr; + } + + return "
    " . JText::_("COM_REDSHOP_PRODUCT_USERFIELD") . "
    " . implode("
    ", $resultArr) . "
    "; + } + + public function getProductUserfieldFromTemplate($templatedata = "", $giftcard = 0) + { + $userfields = array(); + $userfields_lbl = array(); + $retArr = array(); + $template_middle = ""; + + if ($giftcard) + { + $template_start = explode("{if giftcard_userfield}", $templatedata); + + if (!empty($template_start)) + { + $template_end = explode("{giftcard_userfield end if}", $template_start[1]); + + if (!empty($template_end)) + { + $template_middle = $template_end[0]; + } + } + } + else + { + $template_start = explode("{if product_userfield}", $templatedata); + + if (count($template_start) > 1) + { + $template_end = explode("{product_userfield end if}", $template_start[1]); + + if (!empty($template_end)) + { + $template_middle = $template_end[0]; + } + } + } + + if ($template_middle != "") + { + $tmpArr = explode('}', $template_middle); + + for ($i = 0, $in = count($tmpArr); $i < $in; $i++) + { + $val = strpbrk($tmpArr[$i], "{"); + $value = str_replace("{", "", $val); + + if ($value != "") + { + if (strpos($template_middle, '{' . $value . '_lbl}') !== false) + { + $userfields_lbl[] = $value . '_lbl'; + $userfields[] = $value; + } + else + { + $userfields_lbl[] = ''; + $userfields[] = $value; + } + } + } + } + + $tmp = array(); + + for ($i = 0, $in = count($userfields); $i < $in; $i++) + { + if (!in_array($userfields[$i], $userfields_lbl)) + { + $tmp[] = $userfields[$i]; + } + } + + $userfields = $tmp; + $retArr[0] = $template_middle; + $retArr[1] = $userfields; + + return $retArr; + } + + public function GetProdcutUserfield($id = 'NULL', $section_id = 12) + { + $cart = RedshopHelperCartSession::getCart(); + $row_data = RedshopHelperExtrafields::getSectionFieldList($section_id, 1, 0); + + if ($section_id == 12) + { + $product_id = $cart[$id]['product_id']; + $productdetail = RedshopHelperProduct::getProductById($product_id); + $temp_name = "product"; + $temp_id = $productdetail->product_template; + $giftcard = 0; + } + else + { + $temp_name = "giftcard"; + $temp_id = 0; + $giftcard = 1; + } + + $productTemplate = RedshopHelperTemplate::getTemplate($temp_name, $temp_id); + + $returnArr = $this->getProductUserfieldFromTemplate($productTemplate[0]->template_desc, $giftcard); + $userFieldTag = $returnArr[1]; + + $resultArr = array(); + + for ($i = 0, $in = count($userFieldTag); $i < $in; $i++) + { + for ($j = 0, $jn = count($row_data); $j < $jn; $j++) + { + if (array_key_exists($userFieldTag[$i], $cart[$id]) && $cart[$id][$userFieldTag[$i]]) + { + if ($row_data[$j]->name == $userFieldTag[$i]) + { + $strtitle = ''; + + if ($row_data[$j]->title) + { + $strtitle = '' . $row_data[$j]->title . ':'; + } + + $resultArr[] = $strtitle . ' ' . $cart[$id][$userFieldTag[$i]] . ''; + } + } + } + } + + $resultstr = ""; + + if (empty($resultArr)) + { + return $resultstr; + } + + return "
    " . JText::_("COM_REDSHOP_PRODUCT_USERFIELD") . "
    " . implode("
    ", $resultArr) . "
    "; + } + + public function GetProdcutfield($id = 'NULL', $section_id = 1) + { + $cart = $this->_session->get('cart'); + $product_id = $cart[$id]['product_id']; + $row_data = RedshopHelperExtrafields::getSectionFieldList($section_id, 1, 0); + + $resultArr = array(); + + for ($j = 0, $jn = count($row_data); $j < $jn; $j++) + { + $main_result = RedshopHelperExtrafields::getData($row_data[$j]->id, $section_id, $product_id); + + if (isset($main_result->data_txt) && isset($row_data[$j]->display_in_checkout)) + { + if ($main_result->data_txt != "" && 1 == $row_data[$j]->display_in_checkout) + { + $resultArr[] = '' . $main_result->title . ': ' . $main_result->data_txt . ''; + } + } + } + + $resultstr = ""; + + if (empty($resultArr)) + { + return $resultstr; + } + + return implode("
    ", $resultArr); + } + + public function GetProdcutfield_order($orderitemid = 'NULL', $section_id = 1) + { + $orderItem = RedshopHelperOrder::getOrderItemDetail(0, 0, $orderitemid); + + $product_id = $orderItem[0]->product_id; + + $row_data = RedshopHelperExtrafields::getSectionFieldList($section_id, 1, 0); + + $resultArr = array(); + + for ($j = 0, $jn = count($row_data); $j < $jn; $j++) + { + $main_result = RedshopHelperExtrafields::getData($row_data[$j]->id, $section_id, $product_id); + + if (isset($main_result->data_txt) && isset($row_data[$j]->display_in_checkout)) + { + if ($main_result->data_txt != "" && 1 == $row_data[$j]->display_in_checkout) + { + $resultArr[] = '' . $main_result->title . ':' . $main_result->data_txt . ''; + } + } + } + + $resultstr = ""; + + if (count($resultArr) > 0) + { + $resultstr = implode("
    ", $resultArr); + } + + return $resultstr; + } + + public function insertProdcutUserfield($id = 'NULL', $cart = array(), $order_item_id = 0, $section_id = 12) + { + $db = JFactory::getDbo(); + + $row_data = RedshopHelperExtrafields::getSectionFieldList($section_id, 1); + + for ($i = 0, $in = count($row_data); $i < $in; $i++) + { + if (array_key_exists($row_data[$i]->name, $cart[$id]) && $cart[$id][$row_data[$i]->name]) + { + $user_fields = $cart[$id][$row_data[$i]->name]; + + if (trim($user_fields) != '') + { + $sql = "INSERT INTO " . $this->_table_prefix . "fields_data " + . "(fieldid,data_txt,itemid,section) " + . "value (" . (int) $row_data[$i]->id . "," . $db->quote(addslashes($user_fields)) . "," + . (int) $order_item_id . "," . $db->quote($section_id) . ")"; + $this->_db->setQuery($sql); + $this->_db->execute(); + } + } + } + + return; + } + + /** + * Get Product Attribute + * + * @param int $productId Product id + * @param int $attributeSetId Attribute set id + * @param int $attributeId Attribute id + * @param int $published Published attribute set + * @param int $attributeRequired Attribute required + * @param int $notAttributeId Not attribute id + * + * @return mixed + * + * @deprecated 2.0.3 Use RedshopHelperProduct_Attribute::getProductAttribute() instead. + */ + public function getProductAttribute($productId = 0, $attributeSetId = 0, $attributeId = 0, $published = 0, $attributeRequired = 0, + $notAttributeId = 0) + { + return RedshopHelperProduct_Attribute::getProductAttribute( + $productId, $attributeSetId, $attributeId, $published, $attributeRequired, $notAttributeId + ); + } + + /** + * Get Attribute Property + * + * @param int $propertyId Property id + * @param int $attributeId Attribute id + * @param int $productId Product id + * @param int $attributeSetId Attribute set id + * @param int $required Required + * @param int $notPropertyId Not property id + * + * @return mixed + * + * @deprecated 2.0.3 Use RedshopHelperProduct_Attribute::getAttributeProperties() instead. + * @see RedshopHelperProduct_Attribute::getAttributeProperties + */ + public function getAttibuteProperty($propertyId = 0, $attributeId = 0, $productId = 0, $attributeSetId = 0, $required = 0, $notPropertyId = 0) + { + return RedshopHelperProduct_Attribute::getAttributeProperties( + $propertyId, $attributeId, $productId, $attributeSetId, $required, $notPropertyId + ); + } + + /** + * Method for get attribute with stock + * + * @param array $property List of property + * + * @return array + * + * @deprecated 2.1.0 + * @see \Redshop\Helper\Stockroom::getAttributePropertyWithStock + */ + public function getAttibutePropertyWithStock($property = array()) + { + return \Redshop\Helper\Stockroom::getAttributePropertyWithStock($property); + } + + /** + * Method for get sub-attribute with stock + * + * @param array $subproperty List of property + * + * @return array + * + * @deprecated 2.1.0 + * @see \Redshop\Helper\Stockroom::getAttributeSubPropertyWithStock + */ + public function getAttibuteSubPropertyWithStock($subproperty) + { + return \Redshop\Helper\Stockroom::getAttributeSubPropertyWithStock($subproperty); + } + + /** + * Method for get sub properties + * + * @param int $subproperty_id Sub-Property ID + * @param int $property_id Property ID + * + * @return mixed List of sub-properties data. + * + * @deprecated 2.0.3 Use RedshopHelperProduct_Attribute::getAttributeSubProperties() instead + */ + public function getAttibuteSubProperty($subproperty_id = 0, $property_id = 0) + { + return RedshopHelperProduct_Attribute::getAttributeSubProperties($subproperty_id, $property_id); + } + + /** + * Method for get attribute template + * + * @param string $templateHtml Template html + * @param boolean $display Is display? + * + * @return object + * @throws \Exception + * + * @deprecated 2.1.0 + * @see \Redshop\Template\Helper::getAttribute + */ + public function getAttributeTemplate($templateHtml = '', $display = true) + { + return \Redshop\Template\Helper::getAttribute($templateHtml, $display); + } + + /** + * Method for get Product Accessories. + * + * @param string $accessory_id ID of accessory. + * @param string $product_id ID of product. + * @param int $child_product_id ID of child product. + * @param int $cid ID of category. + * + * @return array List of accessories. + * + * @deprecated 2.0.3 Use RedshopHelperAccessory::getProductAccessories() instead. + */ + public function getProductAccessory($accessory_id = '', $product_id = '', $child_product_id = 0, $cid = 0) + { + return RedshopHelperAccessory::getProductAccessories($accessory_id, $product_id, $child_product_id, $cid); + } + + /** + * Method for get add-to-cart template + * + * @param string $templateHtml Template HTML + * + * @return null|object + * @throws \Exception + * + * @deprecated 2.1.0 + * @see \Redshop\Template\Helper::getAddToCart + */ + public function getAddtoCartTemplate($templateHtml = '') + { + return \Redshop\Template\Helper::getAddToCart($templateHtml); + } + + /** + * Method for get accessory template + * + * @param string $templateHtml Template HTML + * + * @return object + * @throws \Exception + * + * @deprecated 2.1.0 + * @see \Redshop\Template\Helper::getAccessory + */ + public function getAccessoryTemplate($templateHtml = "") + { + return \Redshop\Template\Helper::getAccessory($templateHtml); + } + + /** + * Method for get add-to-cart template + * + * @param string $templateHtml Template HTML + * + * @return object + * @throws \Exception + * + * @deprecated 2.1.0 + * @see \Redshop\Template\Helper::getRelatedProduct + */ + public function getRelatedProductTemplate($templateHtml = '') + { + return \Redshop\Template\Helper::getRelatedProduct($templateHtml); + } + + /** + * @param integer $productId Product id + * @param integer $relatedId Related id + * + * @return mixed + * + * @since 2.1.0 + */ + public function getRelatedProduct($productId = 0, $relatedId = 0) + { + $and = ""; + $orderby = "ORDER BY p.product_id ASC "; + $orderby_related = ""; + + if (Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD')) + { + $orderby = "ORDER BY " . Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD'); + $orderby_related = ""; + } + + if ($productId != 0) + { + // Sanitize ids + $productIds = explode(',', $productId); + $productIds = Joomla\Utilities\ArrayHelper::toInteger($productIds); + + if (RedshopHelperUtility::isRedProductFinder()) + { + $q = "SELECT extrafield FROM #__redproductfinder_types where type_select='Productfinder_datepicker'"; + $this->_db->setQuery($q); + $finaltypetype_result = $this->_db->loadObject(); + } + else + { + $finaltypetype_result = array(); + } + + $and .= "AND r.product_id IN (" . implode(',', $productIds) . ") "; + + if (Redshop::getConfig()->get('TWOWAY_RELATED_PRODUCT')) + { + if (Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == "r.ordering ASC" || Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == "r.ordering DESC") + { + $orderby = ""; + $orderby_related = "ORDER BY " . Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD'); + } + + $query = "SELECT * FROM " . $this->_table_prefix . "product_related AS r " + . "WHERE r.product_id IN (" . implode(',', $productIds) . ") OR r.related_id IN (" . implode(',', $productIds) . ")" . $orderby_related . ""; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + $relatedArr = array(); + + for ($i = 0, $in = count($list); $i < $in; $i++) + { + if ($list[$i]->product_id == $productId) + { + $relatedArr[] = $list[$i]->related_id; + } + else + { + $relatedArr[] = $list[$i]->product_id; + } + } + + if (empty($relatedArr)) + { + return array(); + } + + // Sanitize ids + $relatedArr = Joomla\Utilities\ArrayHelper::toInteger($relatedArr); + $relatedArr = array_unique($relatedArr); + + $query = "SELECT " . $productId . " AS mainproduct_id,p.* " + . "FROM " . $this->_table_prefix . "product AS p " + . "WHERE p.published = 1 "; + $query .= ' AND p.product_id IN (' . implode(", ", $relatedArr) . ') '; + $query .= $orderby; + + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + } + + if ($relatedId != 0) + { + $and .= "AND r.related_id = " . (int) $relatedId . " "; + } + + if (count($finaltypetype_result) > 0 && $finaltypetype_result->extrafield != '' + && (Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == 'e.data_txt ASC' || Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == 'e.data_txt DESC')) + { + $add_e = ",e.*"; + } + else + { + $add_e = " "; + } + + $query = "SELECT r.product_id AS mainproduct_id,p.* " . $add_e . " " + . "FROM " . $this->_table_prefix . "product_related AS r " + . "LEFT JOIN " . $this->_table_prefix . "product AS p ON p.product_id = r.related_id "; + + if (!empty($finaltypetype_result) && !empty($finaltypetype_result->extrafield) + && (Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == 'e.data_txt ASC' + || Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == 'e.data_txt DESC')) + { + $query .= " LEFT JOIN " . $this->_table_prefix . "fields_data AS e ON p.product_id = e.itemid "; + } + + $query .= " WHERE p.published = 1 "; + + if (count($finaltypetype_result) > 0 && $finaltypetype_result->extrafield != '' + && (Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == 'e.data_txt ASC' || Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == 'e.data_txt DESC')) + { + $query .= " AND e.fieldid = " . (int) $finaltypetype_result->extrafield . " AND e.section=17 "; + } + + $query .= " $and GROUP BY r.related_id "; + + if ((Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == 'e.data_txt ASC' + || Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == 'e.data_txt DESC')) + { + if (Redshop::getConfig()->get('DEFAULT_RELATED_ORDERING_METHOD') == 'e.data_txt ASC') + { + $s = "STR_TO_DATE( e.data_txt, '%d-%m-%Y' ) ASC"; + } + else + { + $s = "STR_TO_DATE( e.data_txt, '%d-%m-%Y' ) DESC"; + } + + $query .= " ORDER BY " . $s; + } + else + { + $query .= " $orderby "; + } + + $this->_db->setQuery($query); + + $list = $this->_db->loadObjectlist(); + + return $list; + } + + public function makeTotalPriceByOprand($price = 0, $oprandArr = array(), $priceArr = array()) + { + $setEqual = true; + + for ($i = 0, $in = count($oprandArr); $i < $in; $i++) + { + $oprand = $oprandArr[$i]; + $subprice = $priceArr[$i]; + + if ($oprand == "-") + { + $price -= $subprice; + } + elseif ($oprand == "+") + { + $price += $subprice; + } + elseif ($oprand == "*") + { + $price *= $subprice; + } + elseif ($oprand == "/") + { + $price /= $subprice; + } + elseif ($oprand == "=") + { + $price = $subprice; + $setEqual = false; + break; + } + } + + $retArr = array(); + $retArr[0] = $setEqual; + $retArr[1] = $price; + + return $retArr; + } + + public function getProductOnSaleComment($product = array(), $data_add = "") + { + $redconfig = Redconfiguration::getInstance(); + + if (strpos($data_add, "{if product_on_sale}") && strpos($data_add, "{product_on_sale end if}") !== false) + { + if ($product->product_on_sale == 1 && (($product->discount_stratdate == 0 && $product->discount_enddate == 0) || ($product->discount_stratdate <= time() && $product->discount_enddate >= time()))) + { + $data_add = str_replace("{discount_start_date}", $redconfig->convertDateFormat($product->discount_stratdate), $data_add); + $data_add = str_replace("{discount_end_date}", $redconfig->convertDateFormat($product->discount_enddate), $data_add); + $data_add = str_replace("{if product_on_sale}", '', $data_add); + $data_add = str_replace("{product_on_sale end if}", '', $data_add); + } + else + { + $template_pd_sdata = strstr($data_add, '{if product_on_sale}', true); + $template_pd_edata = substr(strstr($data_add, '{product_on_sale end if}'), 24); + $data_add = $template_pd_sdata . $template_pd_edata; + } + + $data_add = str_replace("{discount_start_date}", '', $data_add); + $data_add = str_replace("{discount_end_date}", '', $data_add); + } + + return $data_add; + } + + public function getProductNotForSaleComment($product = array(), $data_add = "", $attributes = array(), $is_relatedproduct = 0, $seoTemplate = "") + { + $showPrice = true; + + if ($product->expired || $product->not_for_sale == 1) + { + $showPrice = false; + } + + if ($showPrice) + { + // Product show price without formatted + $applytax = \Redshop\Template\Helper::isApplyVat($data_add); + + if ($applytax) + { + $GLOBAL ['without_vat'] = false; + } + else + { + $GLOBAL ['without_vat'] = true; + } + + $data_add = RedshopHelperProductPrice::getShowPrice($product->product_id, $data_add, $seoTemplate, 0, $is_relatedproduct, $attributes); + } + else + { + $relPrefix = ($is_relatedproduct) ? 'rel' : ''; + $data_add = str_replace("{" . $relPrefix . "product_price_lbl}", "", $data_add); + $data_add = str_replace("{" . $relPrefix . "product_price}", "", $data_add); + $data_add = str_replace("{" . $relPrefix . "product_price_novat}", "", $data_add); + $data_add = str_replace("{" . $relPrefix . "price_excluding_vat}", "", $data_add); + $data_add = str_replace("{" . $relPrefix . "product_price_table}", "", $data_add); + $data_add = str_replace("{" . $relPrefix . "product_old_price}", "", $data_add); + $data_add = str_replace("{" . $relPrefix . "product_price_saving}", "", $data_add); + } + + return $data_add; + } + + public function getSpecialProductComment($product = array(), $data_add = "") + { + if (strpos($data_add, "{if product_special}") !== false && strpos($data_add, "{product_special end if}") !== false) + { + if ($product->product_special == 0) + { + $template_pd_sdata = explode('{if product_special}', $data_add); + $template_pd_edata = explode('{product_special end if}', $template_pd_sdata [1]); + $data_add = $template_pd_sdata[0] . $template_pd_edata[1]; + } + + $data_add = str_replace("{if product_special}", '', $data_add); + $data_add = str_replace("{product_special end if}", '', $data_add); + } + + return $data_add; + } + + /** + * Method for get ajax detail box template + * + * @param object $product Product data + * + * @return object + * @throws \Exception + * + * @deprecated 2.1.0 + * @see \Redshop\Template\Helper::getAjaxDetailBox + */ + public function getAjaxDetailboxTemplate($product) + { + return \Redshop\Template\Helper::getAjaxDetailBox($product); + } + + /** + * Method for replace accessory data. + * + * @param integer $product_id Product ID + * @param integer $relproduct_id Related product ID + * @param array $accessory Accessories data. + * @param string $data_add Template content + * @param boolean $isChilds True for accessory products is child. + * @param array $selectAcc Selected accessory. + * + * @return mixed|string + * + * @since 1.6.0 + * + * @deprecated 2.1.0 + * + * @throws Exception + */ + public function replaceAccessoryData($product_id = 0, $relproduct_id = 0, $accessory = array(), $data_add, $isChilds = false, $selectAcc = array()) + { + return RedshopHelperProductAccessory::replaceAccessoryData($product_id, $relproduct_id, $accessory, $data_add, $isChilds, $selectAcc); + } + + /** + * Method for replace attribute data with allow add to cart in template. + * + * @param int $productId Product ID + * @param int $accessoryId Accessory ID + * @param int $relatedProductId Related product ID + * @param array $attributes List of attribute data. + * @param string $templateContent HTML content of template. + * @param object $attributeTemplate List of attribute templates. + * @param bool $isChild Is child? + * @param bool $onlySelected True for just render selected / pre-selected attribute. False as normal. + * + * @return string HTML content with replaced data. + * + * @since 1.6.1 + * + * @deprecated 2.0.3 Use RedshopHelperAttribute::replaceAttributeWithCartData() instead + */ + public function replaceAttributewithCartData($productId = 0, $accessoryId = 0, $relatedProductId = 0, $attributes = array(), + $templateContent, $attributeTemplate = null, $isChild = false, $onlySelected = false) + { + return RedshopHelperAttribute::replaceAttributeWithCartData($productId, $accessoryId, $relatedProductId, $attributes, $templateContent, + $attributeTemplate, $isChild, $onlySelected); + } + + /** + * Method for get hidden attributes cart image + * + * @param integer $product_id Product Id + * @param integer $property_id Property Id + * @param integer $subproperty_id Sub-property Id + * + * @return string + * + * @deprecated 2.1.0 Use Redshop\Product\Image\Image::getHiddenAttributeCartImage + * @see Redshop\Product\Image\Image::getHiddenAttributeCartImage + */ + public function get_hidden_attribute_cartimage($product_id, $property_id, $subproperty_id) + { + return Redshop\Product\Image\Image::getHiddenAttributeCartImage($product_id, $property_id, $subproperty_id); + } + + /** + * Method for replace attribute data in template. + * + * @param int $productId Product ID + * @param int $accessoryId Accessory ID + * @param int $relatedProductId Related product ID + * @param array $attributes List of attribute data. + * @param string $templateContent HTML content of template. + * @param object $attributeTemplate List of attribute templates. + * @param bool $isChild Is child? + * @param array $selectedAttributes Preselected attribute list. + * @param int $displayIndCart Display in cart? + * @param bool $onlySelected True for just render selected / pre-selected attribute. False as normal. + * + * @return string + * + * @since 1.6.1 + * + * @deprecated 2.0.3 Use RedshopHelperAttribute::replaceAttributeData() instead. + */ + public function replaceAttributeData($productId = 0, $accessoryId = 0, $relatedProductId = 0, $attributes = array(), $templateContent, + $attributeTemplate = null, $isChild = false, $selectedAttributes = array(), $displayIndCart = 1, $onlySelected = false) + { + return RedshopHelperAttribute::replaceAttributeData($productId, $accessoryId, $relatedProductId, $attributes, $templateContent, + $attributeTemplate, $isChild, $selectedAttributes, $displayIndCart, $onlySelected); + } + + public function replaceSubPropertyData($product_id = 0, $accessory_id = 0, $relatedprd_id = 0, $attribute_id = 0, $property_id = 0, $subatthtml = "", $layout = "", $selectSubproperty = array()) + { + $attribute_table = ""; + $subproperty = array(); + + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.thumbscroller.min.js', false, true); + $chkvatArr = $this->_session->get('chkvat'); + $chktag = $chkvatArr['chkvat']; + + $preprefix = ""; + $isAjax = 0; + + if ($layout == "viewajaxdetail") + { + $preprefix = "ajax_"; + $isAjax = 1; + } + + if ($property_id != 0 && $attribute_id != 0) + { + $attributes = RedshopHelperProduct_Attribute::getProductAttribute(0, 0, $attribute_id); + $attributes = $attributes[0]; + $subproperty_all = RedshopHelperProduct_Attribute::getAttributeSubProperties(0, $property_id); + // filter Out of stock data + if (!Redshop::getConfig()->get('DISPLAY_OUT_OF_STOCK_ATTRIBUTE_DATA') && Redshop::getConfig()->get('USE_STOCKROOM')) + { + $subproperty = \Redshop\Helper\Stockroom::getAttributeSubPropertyWithStock($subproperty_all); + } + else + { + $subproperty = $subproperty_all; + } + + // Get stockroom and pre-order stockroom data. + $subPropertyIds = array_map( + function ($item) { + return $item->value; + }, + $subproperty + ); + $stockrooms = RedshopHelperStockroom::getMultiSectionsStock($subPropertyIds, 'subproperty'); + $preOrderStockrooms = RedshopHelperStockroom::getMultiSectionsPreOrderStock($subPropertyIds, 'subproperty'); + + foreach ($subproperty as $i => $item) + { + $subproperty[$i]->stock = isset($stockrooms[$item->value]) ? (int) $stockrooms[$item->value] : 0; + $subproperty[$i]->preorder_stock = isset($preOrderStockrooms[$item->value]) ? (int) $preOrderStockrooms[$item->value] : 0; + } + } + + if ($accessory_id != 0) + { + $prefix = $preprefix . "acc_"; + } + elseif ($relatedprd_id != 0) + { + $prefix = $preprefix . "rel_"; + } + else + { + $prefix = $preprefix . "prd_"; + } + + if ($relatedprd_id != 0) + { + $product_id = $relatedprd_id; + } + + $product = RedshopHelperProduct::getProductById($product_id); + $producttemplate = RedshopHelperTemplate::getTemplate("product", $product->product_template); + + if (strpos($producttemplate[0]->template_desc, "{more_images_3}") !== false) + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_3'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_3'); + } + elseif (strpos($producttemplate[0]->template_desc, "{more_images_2}") !== false) + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_2'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_2'); + } + elseif (strpos($producttemplate[0]->template_desc, "{more_images_1}") !== false) + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); + } + else + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); + } + + if ($subatthtml != "") + { + // Load plugin group + JPluginHelper::importPlugin('redshop_product'); + + if (count($subproperty) > 0) + { + $attribute_table = $subatthtml; + $attribute_table .= ''; + $commonid = $prefix . $product_id . '_' . $accessory_id . '_' . $attribute_id . '_' + . $property_id; + $subpropertyid = 'subproperty_id_' . $commonid; + $selectedsubproperty = 0; + $imgAdded = 0; + + $subproperty_woscrollerdiv = ""; + + if (strpos($subatthtml, "{subproperty_image_without_scroller}") !== false) + { + $attribute_table = str_replace("{subproperty_image_scroller}", "", $attribute_table); + $subproperty_woscrollerdiv .= "
    "; + } + + $subprop_Arry = array(); + $preselectSubPro = true; + + for ($i = 0, $in = count($subproperty); $i < $in; $i++) + { + if (count($selectSubproperty) > 0) + { + if (in_array($subproperty[$i]->value, $selectSubproperty)) + { + $selectedsubproperty = $subproperty[$i]->value; + } + } + else + { + if ($subproperty[$i]->setdefault_selected) + { + $selectedsubproperty = $subproperty[$i]->value; + } + } + + if (!empty($subproperty[$i]->subattribute_color_image)) + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "subcolor/" . $subproperty[$i]->subattribute_color_image)) + { + $borderstyle = ($selectedsubproperty == $subproperty[$i]->value) ? " 1px solid " : ""; + $thumbUrl = RedshopHelperMedia::getImagePath( + $subproperty[$i]->subattribute_color_image, + '', + 'thumb', + 'subcolor', + Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_WIDTH'), + Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $subprop_Arry[] = $thumbUrl; + $style = null; + + if ($subproperty[$i]->setdefault_selected && $preselectSubPro) + { + $style = ' style="border: 1px solid;"'; + $preselectSubPro = false; + } + + $subproperty_woscrollerdiv .= "
    "; + + $imgAdded++; + } + } + + $attributes_subproperty_vat_show = 0; + $attributes_subproperty_withoutvat = 0; + $attributes_subproperty_oldprice = 0; + + if ($subproperty [$i]->subattribute_color_price > 0) + { + $attributes_subproperty_oldprice = $subproperty [$i]->subattribute_color_price; + + $pricelist = $this->getPropertyPrice($subproperty[$i]->value, 1, 'subproperty'); + + if (count($pricelist) > 0) + { + $subproperty[$i]->subattribute_color_price = $pricelist->product_price; + } + + $attributes_subproperty_withoutvat = $subproperty [$i]->subattribute_color_price; + + if ($chktag) + { + $attributes_subproperty_vat_show = RedshopHelperProduct::getProductTax($product_id, $subproperty [$i]->subattribute_color_price); + + $attributes_subproperty_oldprice_vat = RedshopHelperProduct::getProductTax($product_id, $attributes_subproperty_oldprice); + } + + $attributes_subproperty_vat_show += $subproperty [$i]->subattribute_color_price; + $attributes_subproperty_oldprice += $attributes_subproperty_oldprice_vat; + + if (Redshop::getConfig()->get('SHOW_PRICE') && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) && (!$attributes->hide_attribute_price)) + { + $subproperty [$i]->text = urldecode($subproperty [$i]->subattribute_color_name) . " (" . $subproperty [$i]->oprand . strip_tags(RedshopHelperProductPrice::formattedPrice($attributes_subproperty_vat_show)) . ")"; + } + else + { + $subproperty [$i]->text = urldecode($subproperty [$i]->subattribute_color_name); + } + } + else + { + $subproperty [$i]->text = urldecode($subproperty [$i]->subattribute_color_name); + } + + $attribute_table .= ''; + $attribute_table .= ''; + $attribute_table .= ''; + $attribute_table .= ''; + $attribute_table .= ''; + $attribute_table .= ''; + $attribute_table .= ''; + } + + if (strpos($subatthtml, "{subproperty_image_without_scroller}") !== false) + { + $subproperty_woscrollerdiv .= "
    "; + } + + if (Redshop::getConfig()->get('USE_ENCODING')) + { + $displayPropertyName = mb_convert_encoding(urldecode($subproperty[0]->property_name), "ISO-8859-1", "UTF-8"); + + } + else + { + $displayPropertyName = urldecode($subproperty[0]->property_name); + } + + if ($subproperty[0]->subattribute_color_title != "") + { + if (Redshop::getConfig()->get('USE_ENCODING')) + { + $displayPropertyName = mb_convert_encoding( + urldecode($subproperty[0]->subattribute_color_title), + "ISO-8859-1", + "UTF-8" + ); + } + else + { + $displayPropertyName = urldecode($subproperty[0]->subattribute_color_title); + } + } + + // Run event when prepare sub-properties data. + RedshopHelperUtility::getDispatcher()->trigger('onPrepareProductSubProperties', array($product, &$subproperty)); + + $subproperties = array_merge( + array(JHtml::_('select.option', 0, JText::_('COM_REDSHOP_SELECT') . ' ' . $displayPropertyName)), + $subproperty + ); + $attDisplayType = (isset($subproperty[0]->setdisplay_type)) ? $subproperty[0]->setdisplay_type : 'radio'; + + // Init listing html-attributes + $chkListAttributes = array( + 'id' => $subpropertyid, + 'subpropName' => $displayPropertyName + ); + + // Only add required html-attibute if needed. + if ($subproperty[0]->setrequire_selected) + { + $chkListAttributes['required'] = 'true'; + } + + $scrollerFunction = ''; + + if ($imgAdded > 0 && strstr($attribute_table, "{subproperty_image_scroller}")) + { + $scrollerFunction = "isFlowers" . $commonid . ".scrollImageCenter(this.selectedIndex-1);"; + + if ('radio' == $attDisplayType) + { + $scrollerFunction = "isFlowers" . $commonid . ".scrollImageCenter(\"" . $chk . "\");"; + } + } + + // Prepare Javascript OnChange or OnClick function + $onChangeJSFunction = $scrollerFunction + . "calculateTotalPrice('" . $product_id . "','" . $relatedprd_id . "');" + . "displayAdditionalImage('" . $product_id . "','" . $accessory_id . "','" . $relatedprd_id . "','" . $property_id . "',this.value);"; + + // Radio or Checkbox + if ('radio' == $attDisplayType) + { + unset($subproperties[0]); + + $attributeListType = ($subproperty[0]->setmulti_selected) ? 'redshopselect.checklist' : 'redshopselect.radiolist'; + + $chkListAttributes['cssClassSuffix'] = ' no-group'; + $chkListAttributes['onClick'] = "javascript:" . $onChangeJSFunction; + } + // Dropdown list + else + { + $attributeListType = 'select.genericlist'; + $chkListAttributes['onchange'] = "javascript:" . $onChangeJSFunction; + } + + $lists['subproperty_id'] = JHTML::_( + $attributeListType, + $subproperties, + $subpropertyid . '[]', + $chkListAttributes, + 'value', + 'text', + $selectedsubproperty, + $subpropertyid + ); + + $subPropertyScroller = RedshopLayoutHelper::render( + 'product.subproperty_scroller', + array( + 'subProperties' => $subproperty, + 'commonId' => $commonid, + 'productId' => $product_id, + 'propertyId' => $property_id, + 'subPropertyId' => $subpropertyid, + 'accessoryId' => $accessory_id, + 'relatedProductId' => $relatedprd_id, + 'selectSubproperty' => $selectedsubproperty, + 'subPropertyArray' => $subprop_Arry, + 'width' => $mpw_thumb, + 'height' => $mph_thumb + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + + if ($imgAdded === 0 || $isAjax == 1) + { + $subPropertyScroller = ""; + } + + if ($subproperty[0]->setrequire_selected == 1) + { + $displayPropertyName = Redshop::getConfig()->get('ASTERISK_POSITION') > 0 ? $displayPropertyName . " * " : "* " . $displayPropertyName; + } + $attribute_table = str_replace("{property_title}", $displayPropertyName, $attribute_table); + $attribute_table = str_replace("{subproperty_dropdown}", $lists ['subproperty_id'], $attribute_table); + + if (strpos($subatthtml, "{subproperty_image_without_scroller}") !== false) + { + $attribute_table = str_replace("{subproperty_image_scroller}", "", $attribute_table); + $attribute_table = str_replace("{subproperty_image_without_scroller}", $subproperty_woscrollerdiv, $attribute_table); + } + elseif (strpos($subatthtml, "{subproperty_image_scroller}") !== false) + { + $attribute_table = str_replace("{subproperty_image_scroller}", $subPropertyScroller, $attribute_table); + $attribute_table = str_replace("{subproperty_image_without_scroller}", "", $attribute_table); + } + } + } + + return $attribute_table; + } + + /** + * Method for display attribute price + * + * @param integer $productId Product IID + * @param float $showPrice Show price + * @param string $templateHtml Template HTML + * @param integer $userId User ID + * @param integer $applyTax Is apply tax + * @param array $attributes Attributes data. + * + * @return float + * + * @deprecated 2.1.0 + * @see RedshopHelperProduct_Attribute::defaultAttributePrice + */ + public function defaultAttributeDataPrice($productId = 0, $showPrice = 0.0, $templateHtml = '', $userId = 0, $applyTax = 0, $attributes = array()) + { + return RedshopHelperProduct_Attribute::defaultAttributePrice($productId, $showPrice, $templateHtml, $userId, $applyTax, $attributes); + } + + /** + * Method for replace product properties add to cart + * + * @param integer $product_id Product ID + * @param integer $property_id Property ID + * @param integer $category_id Category ID + * @param string $commonid DOM ID + * @param integer $property_stock Property stock + * @param string $property_data Property Data + * @param array $cart_template Cart template + * @param string $data_add Template content + * + * @return mixed|string + * @throws \Exception + * + * @deprecated 2.1.0 Redshop\Product\Property::replaceAddToCart + * @see Redshop\Product\Property::replaceAddToCart + */ + public function replacePropertyAddtoCart($product_id = 0, $property_id = 0, $category_id = 0, $commonid = "", $property_stock = 0, $property_data = "", $cart_template = array(), $data_add = "") + { + return Redshop\Product\Property::replaceAddToCart($product_id, $property_id, $category_id, $commonid, $property_stock, $property_data, $cart_template, $data_add); + } + + /** + * Method for render cart, replace tag in template + * + * @param integer $product_id Product Id + * @param integer $category_id Category Id + * @param integer $accessory_id Accessory Id + * @param integer $relproduct_id Related product Id + * @param string $data_add Template content + * @param boolean $isChilds Is child product? + * @param array $userfieldArr User fields + * @param integer $totalatt Total attributes + * @param integer $totalAccessory Total accessories + * @param integer $count_no_user_field Total user fields + * @param integer $module_id Module Id + * @param integer $giftcard_id Giftcard Id + * + * @return mixed|string + * @throws \Exception + * + * @deprecated 2.1.0 Use Redshop\Cart\Render::render + * @see Redshop\Cart\Render::render + */ + public function replaceCartTemplate($product_id = 0, $category_id = 0, $accessory_id = 0, $relproduct_id = 0, $data_add = "", $isChilds = false, $userfieldArr = array(), $totalatt = 0, $totalAccessory = 0, $count_no_user_field = 0, $module_id = 0, $giftcard_id = 0) + { + return Redshop\Cart\Render::replace($product_id, $category_id, $accessory_id, $relproduct_id, $data_add, $isChilds, $userfieldArr, $totalatt, $totalAccessory, $count_no_user_field, $module_id, $giftcard_id); + } + + /** + * Method for replace wishlist tag in template. + * + * @param int $productId Product ID + * @param string $templateContent HTML data of template content + * + * @return string HTML data of replaced content. + * + * @since 1.5 + * + * @deprecated 2.0.3 Use RedshopHelperWishlist::replaceWishlistTag() instead + */ + public function replaceWishlistButton($productId = 0, $templateContent = '', $formId = '') + { + return RedshopHelperWishlist::replaceWishlistTag($productId, $templateContent, $formId); + } + + /** + * @param integer $productId Product ID + * @param integer $categoryId Category ID + * @param string $html Template HTML + * @param integer $isRelatedProduct Is related product. + * + * @return string + * + * @deprecated 2.1.0 + * @see Redshop\Product\Compare::replaceCompareProductsButton + */ + public function replaceCompareProductsButton($productId = 0, $categoryId = 0, $html = "", $isRelatedProduct = 0) + { + return Redshop\Product\Compare::replaceCompareProductsButton($productId, $categoryId, $html, $isRelatedProduct); + } + + public function makeAccessoryCart($attArr = array(), $product_id = 0, $user_id = 0) + { + $user = JFactory::getUser(); + + if ($user_id == 0) + { + $user_id = $user->id; + } + + $data = Cart::getCartTemplate(); + $chktag = \Redshop\Template\Helper::isApplyAttributeVat($data[0]->template_desc, $user_id); + $setPropEqual = true; + $setSubpropEqual = true; + $displayaccessory = ""; + $accessory_total_price = 0; + $accessory_vat_price = 0; + + if (count($attArr) > 0) + { + for ($i = 0, $in = count($attArr); $i < $in; $i++) + { + $acc_vat = 0; + + if ($attArr[$i]['accessory_price'] > 0) + { + $acc_vat = RedshopHelperProduct::getProductTax($product_id, $attArr[$i]['accessory_price'], $user_id); + } + + $accessory_price = $attArr[$i]['accessory_price']; + + if (!empty($chktag)) + { + $accessory_price = $attArr[$i]['accessory_price'] + $acc_vat; + $accessory_vat_price = $acc_vat; + } + + $attchildArr = $attArr[$i]['accessory_childs']; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $prooprand = array(); + $proprice = array(); + $provatprice = array(); + $provat = array(); + $subprooprand = array(); + $subproprice = array(); + $subprovatprice = array(); + $subprovat = array(); + + $propArr = $attchildArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $property_price = $propArr[$k]['property_price']; + $acc_vat = 0; + $acc_propvat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $acc_propvat = RedshopHelperProduct::getProductTax($product_id, $propArr[$k]['property_price'], $user_id); + } + + if (!empty($chktag)) + { + $property_price = $property_price + $acc_propvat; + $acc_vat = $acc_propvat; + } + + $prooprand[$k] = $propArr[$k]['property_oprand']; + $proprice[$k] = $propArr[$k]['property_price']; + $provatprice[$k] = $property_price; + $provat[$k] = $acc_vat; + + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $acc_vat = 0; + $acc_subpropvat = 0; + $subproperty_price = $subpropArr[$l]['subproperty_price']; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $acc_subpropvat = RedshopHelperProduct::getProductTax($product_id, $subpropArr[$l]['subproperty_price'], $user_id); + } + + if (!empty($chktag)) + { + $subproperty_price = $subproperty_price + $acc_subpropvat; + $acc_vat = $acc_subpropvat; + } + + + $subprooprand[$k][$l] = $subpropArr[$l]['subproperty_oprand']; + $subproprice[$k][$l] = $subpropArr[$l]['subproperty_price']; + $subprovatprice[$k][$l] = $subproperty_price; + $subprovat[$k][$l] = $acc_vat; + } + } + + /// FOR ACCESSORY PROPERTY AND SUBPROPERTY PRICE CALCULATION + if ($setPropEqual && $setSubpropEqual) + { + $accessory_priceArr = $this->makeTotalPriceByOprand($accessory_price, $prooprand, $provatprice); + $accessory_vatArr = $this->makeTotalPriceByOprand($accessory_vat_price, $prooprand, $provat); + //$setPropEqual = $accessory_priceArr[0]; + $accessory_price = $accessory_priceArr[1]; + $accessory_vat_price = $accessory_vatArr[1]; + } + + for ($t = 0, $tn = count($propArr); $t < $tn; $t++) + { + if ($setPropEqual && $setSubpropEqual && isset($subprovatprice[$t])) + { + $accessory_priceArr = $this->makeTotalPriceByOprand( + $accessory_price, + $subprooprand[$t], + $subprovatprice[$t] + ); + $accessory_vatArr = $this->makeTotalPriceByOprand( + $accessory_vat_price, + $subprooprand[$t], + $subprovat[$t] + ); + $accessory_price = $accessory_priceArr[1]; + $accessory_vat_price = $accessory_vatArr[1]; + } + } + + // FOR ACCESSORY PROPERTY AND SUBPROPERTY PRICE CALCULATION + } + + $accessory_total_price += ($accessory_price); + } + + $displayaccessory .= RedshopLayoutHelper::render( + 'product.product_accessory', + array( + 'accessories' => $attArr, + 'productId' => $product_id, + 'userId' => $user_id, + 'checkTag' => $chktag + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + } + + $accessory_total_price = $accessory_total_price - $accessory_vat_price; + + return array($displayaccessory, $accessory_total_price, $accessory_vat_price); + } + + /** + * Method for get cart template + * + * @return array + * @throws \Exception + * + * @deprecated 2.1.0 + * @see \Redshop\Template\Helper::getCart + */ + public function getCartTemplate() + { + return Cart::getCartTemplate(); + } + + public function makeAttributeCart($attributes = array(), $productId = 0, $userId = 0, $newProductPrice = 0, $quantity = 1, $data = '') + { + $user = JFactory::getUser(); + + if ($userId == 0) + { + $userId = $user->id; + } + + $sel = 0; + $selP = 0; + $applyVat = \Redshop\Template\Helper::isApplyAttributeVat($data, $userId); + $setPropEqual = true; + $setSubpropEqual = true; + $selectedAttributs = array(); + $selectedProperty = array(); + $productOldprice = 0; + $productVatPrice = 0; + + if ($newProductPrice != 0) + { + $productPrice = $newProductPrice; + + if ($productPrice > 0) + { + $productVatPrice = RedshopHelperProduct::getProductTax($productId, $productPrice, $userId); + } + } + else + { + $productPrices = RedshopHelperProductPrice::getNetPrice($productId, $userId, $quantity, $data); + + // Using price without vat to proceed with calcualtion - we will apply vat in the end. + $productPrice = $productPrices['product_price_novat']; + $productVatPrice = $productPrices['productVat']; + $productOldprice = $productPrices['product_old_price_excl_vat']; + } + + $isStock = RedshopHelperStockroom::isStockExists($productId); + $isPreorderStock = RedshopHelperStockroom::isPreorderStockExists($productId); + $displayAttribute = 0; + + for ($i = 0, $in = count($attributes); $i < $in; $i++) + { + $propertiesOperator = array(); + $propertiesPrice = array(); + $propertiesPriceWithVat = array(); + $propertiesVat = array(); + $subPropertiesOperator = array(); + $subPropertiesPrice = array(); + $subPropertiesPriceWithVat = array(); + $subPropertiesVat = array(); + + $properties = !empty($attributes[$i]['attribute_childs']) ? $attributes[$i]['attribute_childs'] : array(); + + if (count($properties) > 0) + { + $displayAttribute++; + } + + for ($k = 0, $kn = count($properties); $k < $kn; $k++) + { + $propertyVat = 0; + $propertyOperator = $properties[$k]['property_oprand']; + $propertyPriceWithoutVat = (isset($properties[$k]['property_price'])) ? $properties[$k]['property_price'] : 0; + $property = RedshopHelperProduct_Attribute::getAttributeProperties($properties[$k]['property_id']); + $propertyPrice = $propertyPriceWithoutVat; + + if ($propertyPriceWithoutVat > 0) + { + // Set property vat to 1 when price is 1. For * and / math rules. + if ($propertyPriceWithoutVat == 1 + && ($propertyOperator == '*' || $propertyOperator == '/')) + { + $propertyVat = 1; + } + + if ($propertyOperator != '*' && $propertyOperator != '/') + { + $propertyVat = RedshopHelperProduct::getProductTax($productId, $propertyPriceWithoutVat, $userId); + } + } + + $isStock = RedshopHelperStockroom::isStockExists($properties[$k]['property_id'], "property"); + $isPreorderStock = RedshopHelperStockroom::isPreorderStockExists($properties[$k]['property_id'], "property"); + + $propertiesOperator[$k] = $propertyOperator; + $propertiesPrice[$k] = $propertyPriceWithoutVat; + $propertiesPriceWithVat[$k] = $propertyPrice; + $propertiesVat[$k] = $propertyVat; + $subProperties = $properties[$k]['property_childs']; + + for ($l = 0, $ln = count($subProperties); $l < $ln; $l++) + { + if ($l == 0) + { + $selectedProperty[$selP++] = $properties[$k]['property_id']; + } + + // Continue if there is no subproperty id + if (!(int) $subProperties[$l]['subproperty_id']) + { + continue; + } + + $subPropertyVat = 0; + $subPropertyOperator = $subProperties[$l]['subproperty_oprand']; + $subPropertyPriceWithoutVat = $subProperties[$l]['subproperty_price']; + $subPropertyPrice = $subPropertyPriceWithoutVat; + + if ($subPropertyPriceWithoutVat > 0) + { + // Set property vat to 1 when price is 1. For * and / math rules. + if ($subPropertyPriceWithoutVat == 1 + && ($subPropertyOperator == '*' || $subPropertyOperator == '/')) + { + $subPropertyVat = 1; + } + + if ($subPropertyOperator != '*' && $subPropertyOperator != '/') + { + $subPropertyVat = RedshopHelperProduct::getProductTax($productId, $subPropertyPriceWithoutVat, $userId); + } + } + + $isStock = RedshopHelperStockroom::isStockExists( + $subProperties[$l]['subproperty_id'], + "subproperty" + ); + $isPreorderStock = RedshopHelperStockroom::isPreorderStockExists( + $subProperties[$l]['subproperty_id'], + "subproperty" + ); + + $subPropertiesOperator[$k][$l] = $subPropertyOperator; + $subPropertiesPrice[$k][$l] = $subPropertyPriceWithoutVat; + $subPropertiesPriceWithVat[$k][$l] = $subPropertyPrice; + $subPropertiesVat[$k][$l] = $subPropertyVat; + } + } + + // FOR PROPERTY AND SUBPROPERTY PRICE CALCULATION + $propertyPrices = $this->makeTotalPriceByOprand($productPrice, $propertiesOperator, $propertiesPriceWithVat); + $productPrice = $propertyPrices[1]; + + $propertyOldPriceVats = $this->makeTotalPriceByOprand($productOldprice, $propertiesOperator, $propertiesPrice); + $productOldprice = $propertyOldPriceVats[1]; + + for ($t = 0, $tn = count($properties); $t < $tn; $t++) + { + $selectedAttributs[$sel++] = $attributes[$i]['attribute_id']; + + if ($setPropEqual && $setSubpropEqual && isset($subPropertiesPriceWithVat[$t])) + { + $subPropertyPrices = $this->makeTotalPriceByOprand($productPrice, $subPropertiesOperator[$t], $subPropertiesPriceWithVat[$t]); + + $productPrice = $subPropertyPrices[1]; + + $subPropertyOldPriceVats = $this->makeTotalPriceByOprand($productOldprice, $subPropertiesOperator[$t], $subPropertiesPrice[$t]); + $productOldprice = $subPropertyOldPriceVats[1]; + } + } + } + + $displayattribute = RedshopLayoutHelper::render( + 'product.product_attribute', + array( + 'attributes' => $attributes, + 'data' => $data, + 'displayAttribute' => $displayAttribute + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + + $productVatOldPrice = 0; + + if ($productOldprice > 0) + { + $productVatOldPrice = RedshopHelperProduct::getProductTax($productId, $productOldprice, $userId); + } + + // Recalculate VAT if set to apply vat for attribute + if ($applyVat) + { + $productVatPrice = RedshopHelperProduct::getProductTax($productId, $productPrice, $userId); + } + + // Todo: For QA to check all cases. + /*if ($this->getApplyVatOrNot($data, $userId)) + { + $productPrice += $productVatPrice; + }*/ + + $data = array( + $displayattribute, + $productPrice, + $productVatPrice, + $selectedAttributs, + $isStock, + $productOldprice, + $productVatOldPrice, + $isPreorderStock, + $selectedProperty + ); + + JPluginHelper::importPlugin('redshop_product'); + RedshopHelperUtility::getDispatcher()->trigger('onMakeAttributeCart', array(&$data, $attributes, $productId)); + + return $data; + } + + /** + * Method for generate accessory of order. + * + * @param integer $orderItemId Order item ID. + * + * @return string + * + * @deprecated 2.0.7 Use Redshop\Order\Helper::generateAccessories() + */ + public function makeAccessoryOrder($orderItemId = 0) + { + return Redshop\Order\Helper::generateAccessories($orderItemId); + } + + public function makeAttributeOrder($order_item_id = 0, $is_accessory = 0, $parent_section_id = 0, $stock = 0, $export = 0, $data = '') + { + $chktag = \Redshop\Template\Helper::isApplyAttributeVat($data); + $product_attribute = ""; + $quantity = 0; + $stockroom_id = "0"; + $orderItemdata = RedshopHelperOrder::getOrderItemDetail(0, 0, $order_item_id); + $cartAttributes = array(); + + $products = RedshopHelperProduct::getProductById($orderItemdata[0]->product_id); + + if (count($orderItemdata) > 0 && $is_accessory != 1) + { + $product_attribute = $orderItemdata[0]->product_attribute; + $quantity = $orderItemdata[0]->product_quantity; + } + + $orderItemAttdata = RedshopHelperOrder::getOrderItemAttributeDetail($order_item_id, $is_accessory, "attribute", $parent_section_id); + + // Get Attribute middle template + $attribute_middle_template = \Redshop\Template\Helper::getAttributeTemplateLoop($data); + $attribute_final_template = ''; + + if (count($orderItemAttdata) > 0) + { + for ($i = 0, $in = count($orderItemAttdata); $i < $in; $i++) + { + $attribute = RedshopHelperProduct_Attribute::getProductAttribute(0, 0, $orderItemAttdata[$i]->section_id); + + // Assign Attribute middle template in tmp variable + $tmp_attribute_middle_template = $attribute_middle_template; + $tmp_attribute_middle_template = str_replace( + "{product_attribute_name}", urldecode($orderItemAttdata[$i]->section_name), $tmp_attribute_middle_template + ); + + $orderPropdata = RedshopHelperOrder::getOrderItemAttributeDetail( + $order_item_id, $is_accessory, "property", $orderItemAttdata[$i]->section_id + ); + + // Initialize attribute calculated price + $propertyCalculatedPriceSum = $orderItemdata[0]->product_item_old_price; + + for ($p = 0, $pn = count($orderPropdata); $p < $pn; $p++) + { + $property_price = $orderPropdata[$p]->section_price; + $productAttributeCalculatedPrice = 0; + + if ($stock == 1) + { + RedshopHelperStockroom::manageStockAmount($orderPropdata[$p]->section_id, $quantity, $orderPropdata[$p]->stockroom_id, "property"); + } + + $property = RedshopHelperProduct_Attribute::getAttributeProperties($orderPropdata[$p]->section_id); + + if (!empty($chktag)) + { + $property_price = $orderPropdata[$p]->section_price + $orderPropdata[$p]->section_vat; + } + + // Show actual productive price + if ($export == 0 && $property_price > 0) + { + $propertyOperand = $orderPropdata[$p]->section_oprand; + $productAttributeCalculatedPriceBase = RedshopHelperUtility::setOperandForValues( + $propertyCalculatedPriceSum, $propertyOperand, $property_price + ); + $productAttributeCalculatedPrice = $productAttributeCalculatedPriceBase - $propertyCalculatedPriceSum; + $propertyCalculatedPriceSum = $productAttributeCalculatedPriceBase; + } + + $disPrice = ''; + $hideAttributePrice = count($attribute) > 0 ? $attribute[0]->hide_attribute_price : 0; + + if (strpos($data, '{product_attribute_price}') !== false) + { + if ($export == 1) + { + $disPrice = ' (' . $orderPropdata[$p]->section_oprand . Redshop::getConfig()->get('CURRENCY_SYMBOL') . $property_price . ')'; + } + elseif (!$hideAttributePrice) + { + $disPrice = " (" . $orderPropdata[$p]->section_oprand . RedshopHelperProductPrice::formattedPrice($property_price) . ")"; + } + } + + // Replace attribute property price and value + $tmp_attribute_middle_template = str_replace("{product_attribute_value}", urldecode($orderPropdata[$p]->section_name), $tmp_attribute_middle_template); + $tmp_attribute_middle_template = str_replace("{product_attribute_value_price}", $disPrice, $tmp_attribute_middle_template); + + // Assign tmp variable to looping variable to get copy of all texts + $attribute_final_template .= $tmp_attribute_middle_template; + + // Initialize attribute child array + $attributeChilds = array( + 'property_id' => $orderPropdata[$p]->section_id, + 'property_name' => $orderPropdata[$p]->section_name, + 'property_oprand' => $orderPropdata[$p]->section_oprand, + 'property_price' => $property_price, + 'property_childs' => array() + ); + + $orderSubpropdata = RedshopHelperOrder::getOrderItemAttributeDetail($order_item_id, $is_accessory, "subproperty", $orderPropdata[$p]->section_id); + + for ($sp = 0, $countSubproperty = count($orderSubpropdata); $sp < $countSubproperty; $sp++) + { + $subproperty_price = $orderSubpropdata[$sp]->section_price; + + if ($stock == 1) + { + RedshopHelperStockroom::manageStockAmount($orderSubpropdata[$sp]->section_id, $quantity, $orderSubpropdata[$sp]->stockroom_id, "subproperty"); + } + + $subproperty = RedshopHelperProduct_Attribute::getAttributeSubProperties($orderSubpropdata[$sp]->section_id); + + if (!empty($chktag)) + { + $subproperty_price = $orderSubpropdata[$sp]->section_price + $orderSubpropdata[$sp]->section_vat; + } + + // Show actual productive price + if ($export == 0 && $subproperty_price > 0) + { + $subPropertyOperand = $orderSubpropdata[$sp]->section_oprand; + $productAttributeCalculatedPriceBase = RedshopHelperUtility::setOperandForValues( + $propertyCalculatedPriceSum, $subPropertyOperand, $subproperty_price + ); + $productAttributeCalculatedPrice = $productAttributeCalculatedPriceBase - $propertyCalculatedPriceSum; + $propertyCalculatedPriceSum = $productAttributeCalculatedPriceBase; + } + + $attributeChilds['property_childs'][] = array( + 'subproperty_id' => $orderSubpropdata[$sp]->section_id, + 'subproperty_name' => $orderSubpropdata[$sp]->section_name, + 'subproperty_oprand' => $orderSubpropdata[$sp]->section_oprand, + 'subattribute_color_title' => urldecode($subproperty[0]->subattribute_color_title), + 'subproperty_price' => $subproperty_price + ); + } + + // Format Calculated price using Language variable + $productAttributeCalculatedPrice = RedshopHelperProductPrice::formattedPrice($productAttributeCalculatedPrice); + $productAttributeCalculatedPrice = JText::sprintf('COM_REDSHOP_CART_PRODUCT_ATTRIBUTE_CALCULATED_PRICE', $productAttributeCalculatedPrice); + $tmp_attribute_middle_template = str_replace( + "{product_attribute_calculated_price}", + $productAttributeCalculatedPrice, + $tmp_attribute_middle_template + ); + + // Assign tmp variable to looping variable to get copy of all texts + $attribute_final_template = $tmp_attribute_middle_template; + + // Initialize attribute child array + $attribute[0]->attribute_childs[] = $attributeChilds; + } + + // Prepare cart type attribute array + $cartAttributes[] = get_object_vars($attribute[0]); + } + + $displayattribute = RedshopLayoutHelper::render( + 'product.order_attribute', + array( + 'orderItemAttdata' => $orderItemAttdata, + 'data' => $data, + 'orderItemId' => $order_item_id, + 'isAccessory' => $is_accessory, + 'chktag' => $chktag, + 'export' => $export + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + } + else + { + $displayattribute = $product_attribute; + } + + if (isset($products->use_discount_calc) && $products->use_discount_calc == 1) + { + $displayattribute = $displayattribute . $orderItemdata[0]->discount_calc_data; + } + + $data = new stdClass; + $data->product_attribute = $displayattribute; + $data->attribute_middle_template = $attribute_final_template; + $data->attribute_middle_template_core = $attribute_middle_template; + $data->cart_attribute = $cartAttributes; + + return $data; + } + + /** + * Method to get string between inputs + * + * @param string $start Starting string where you need to start search + * @param string $end Ending string where you need to end search + * @param string $string Target string from where need to search + * + * @return array Matched string array + * + * @deprecated 2.1.0 + */ + public function findStringBetween($start, $end, $string) + { + return \Redshop\Helper\Utility::findStringBetween($start, $end, $string); + } + + /** + * Method to get attribute template loop + * + * @param string $template Attribute Template data + * + * @return string Template middle data + * + * @deprecated 2.1.0 + * @see \Redshop\Template\Helper::getAttributeTemplateLoop + */ + public function getAttributeTemplateLoop($template) + { + return \Redshop\Template\Helper::getAttributeTemplateLoop($template); + } + + public function makeAccessoryQuotation($quotation_item_id = 0, $quotation_status = 2) + { + $displayaccessory = ""; + $Itemdata = RedshopHelperQuotation::getQuotationItemAccessoryDetail($quotation_item_id); + + if (count($Itemdata) > 0) + { + $displayaccessory .= "
    " . JText::_("COM_REDSHOP_ACCESSORY") . ":
    "; + + for ($i = 0, $in = count($Itemdata); $i < $in; $i++) + { + $displayaccessory .= "
    " . urldecode($Itemdata[$i]->accessory_item_name) . " "; + + if ($quotation_status != 1 || ($quotation_status == 1 && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE') == 1)) + { + $displayaccessory .= "(" . RedshopHelperProductPrice::formattedPrice($Itemdata[$i]->accessory_price + $Itemdata[$i]->accessory_vat) . ")"; + } + + $displayaccessory .= "
    "; + $displayaccessory .= $this->makeAttributeQuotation( + $quotation_item_id, + 1, + $Itemdata[$i]->accessory_id, + $quotation_status + ); + + } + } + else + { + $Itemdata = RedshopHelperQuotation::getQuotationProduct(0, $quotation_item_id); + $displayaccessory = $Itemdata[0]->product_accessory; + } + + return $displayaccessory; + } + + public function makeAttributeQuotation($quotation_item_id = 0, $is_accessory = 0, $parent_section_id = 0, $quotation_status = 2, $stock = 0) + { + $displayattribute = ""; + $product_attribute = ""; + $quantity = 0; + $stockroom_id = "0"; + $Itemdata = RedshopHelperQuotation::getQuotationProduct(0, $quotation_item_id); + + if (count($Itemdata) > 0 && $is_accessory != 1) + { + $product_attribute = $Itemdata[0]->product_attribute; + $quantity = $Itemdata[0]->product_quantity; + } + + $ItemAttdata = RedshopHelperQuotation::getQuotationItemAttributeDetail( + $quotation_item_id, + $is_accessory, + "attribute", + $parent_section_id + ); + + $displayattribute = RedshopLayoutHelper::render( + 'product.quotation_attribute', + array( + 'itemAttdata' => $ItemAttdata, + 'quotationItemId' => $quotation_item_id, + 'isAccessory' => $is_accessory, + 'quotationStatus' => $quotation_status, + 'parentSectionId' => $parent_section_id, + 'stock' => $stock + ), + '', + array( + 'client' => 0, + 'component' => 'com_redshop' + ) + ); + + return $displayattribute; + } + + /* + * load Products Under categoriesd ACL Sopper Group + * + * return : "," separated product string + */ + public function loadAclProducts() + { + $user = JFactory::getUser(); + $userArr = $this->_session->get('rs_user'); + + if (empty($userArr)) + { + $userArr = RedshopHelperUser::createUserSession($user->id); + } + + $shopperGroupId = $userArr['rs_user_shopperGroup']; + //$shopperGroupId = $this->_userhelper->getShopperGroup($user->id); + + if ($user->id > 0) + $catquery = "SELECT sg.shopper_group_categories FROM `#__redshop_shopper_group` as sg LEFT JOIN #__redshop_users_info as uf ON sg.`shopper_group_id` = uf.shopper_group_id WHERE uf.user_id = '" . $user->id . "' AND sg.shopper_group_portal=1 "; + else + $catquery = "SELECT sg.shopper_group_categories FROM `#__redshop_shopper_group` as sg WHERE sg.`shopper_group_id` = " . (int) $shopperGroupId . " AND sg.shopper_group_portal=1"; + + $this->_db->setQuery($catquery); + $category_ids_obj = $this->_db->loadObjectList(); + if (empty($category_ids_obj)) + { + return ""; + } + else + { + $category_ids = $category_ids_obj[0]->shopper_group_categories; + } + + // Sanitize ids + $catIds = explode(',', $category_ids); + $catIds = Joomla\Utilities\ArrayHelper::toInteger($catIds); + + $query = "SELECT product_id + FROM `#__redshop_product_category_xref` WHERE category_id IN (" . implode(',', $catIds) . ")"; + + $this->_db->setQuery($query); + $shopperprodata = $this->_db->loadObjectList(); + $aclProduct = array(); + + for ($i = 0, $in = count($shopperprodata); $i < $in; $i++) + { + $aclProduct[] = $shopperprodata[$i]->product_id; + } + + if (count($aclProduct) > 0) + $aclProduct = implode(",", $aclProduct); + else + $aclProduct = ""; + + return $aclProduct; + } + + /** + * Method for convert Unit + * + * @param string $globalUnit Base conversation unit + * @param string $calcUnit Unit ratio which to convert + * + * @return float Unit ratio + * + * @deprecated 2.1.0 + * @see \Redshop\Helper\Utility::getUnitConversation + */ + public function getUnitConversation($globalUnit, $calcUnit) + { + return \Redshop\Helper\Utility::getUnitConversation($globalUnit, $calcUnit); + } + + // Get Product subscription price + public function getProductSubscriptionDetail($product_id, $subscription_id) + { + $query = "SELECT * " + . " FROM " . $this->_table_prefix . "product_subscription" + . " WHERE " + . " product_id = " . (int) $product_id . " AND subscription_id = " . (int) $subscription_id; + $this->_db->setQuery($query); + + return $this->_db->loadObject(); + } + + // Get User Product subscription detail + public function getUserProductSubscriptionDetail($order_item_id) + { + $query = "SELECT * FROM " . $this->_table_prefix . "product_subscribe_detail AS p " + . "LEFT JOIN " . $this->_table_prefix . "product_subscription AS ps ON ps.subscription_id=p.subscription_id " + . "WHERE order_item_id = " . (int) $order_item_id; + $this->_db->setQuery($query); + $list = $this->_db->loadObject(); + + return $list; + } + + public function insertProductDownload($product_id, $user_id, $order_id, $media_name, $serial_number) + { + $db = JFactory::getDbo(); + + // download data + $downloadable_product = RedshopHelperProductDownload::checkDownload($product_id, true); //die(); + + $product_download_limit = ($downloadable_product->product_download_limit > 0) ? $downloadable_product->product_download_limit : Redshop::getConfig()->get('PRODUCT_DOWNLOAD_LIMIT'); + + $product_download_days = ($downloadable_product->product_download_days > 0) ? $downloadable_product->product_download_days : Redshop::getConfig()->get('PRODUCT_DOWNLOAD_DAYS'); + $product_download_clock = ($downloadable_product->product_download_clock > 0) ? $downloadable_product->product_download_clock : 0; + $product_download_clock_min = ($downloadable_product->product_download_clock_min > 0) ? $downloadable_product->product_download_clock_min : 0; + + $product_download_days = (date("H") > $product_download_clock && $product_download_days == 0) ? 1 : $product_download_days; + + $product_download_days_time = (time() + ($product_download_days * 24 * 60 * 60)); + + $endtime = mktime( + $product_download_clock, + $product_download_clock_min, + 0, + (int) date("m", $product_download_days_time), + (int) date("d", $product_download_days_time), + (int) date("Y", $product_download_days_time) + ); + + // if download product is set to infinit + $endtime = ($downloadable_product->product_download_infinite == 1) ? 0 : $endtime; + + // Generate Download Token + $token = md5(uniqid(mt_rand(), true)); + + $sql = "INSERT INTO " . $this->_table_prefix . "product_download " + . "(product_id,user_id,order_id, end_date, download_max, download_id, file_name,product_serial_number) " + . "VALUES(" . (int) $product_id . ", " . (int) $user_id . ", " . (int) $order_id . ", " + . (int) $endtime . ", " . (int) $product_download_limit . ", " + . $db->quote($token) . ", " . $db->quote($media_name) . "," . $db->quote($serial_number) . ")"; + $this->_db->setQuery($sql); + $this->_db->execute(); + + return true; + } + + /* + * Get serial number for downloadable product only retrive one number. + */ + + public function getProdcutSerialNumber($product_id, $is_used = 0) + { + $query = "SELECT * FROM " . $this->_table_prefix . "product_serial_number " + . "WHERE product_id = " . (int) $product_id . " " + . " AND is_used = " . (int) $is_used . " " + . " LIMIT 0,1"; + $this->_db->setQuery($query); + $rs = $this->_db->loadObject(); + + if (count($rs) > 0) + { + // Update serial number... + $this->updateProdcutSerialNumber($rs->serial_id); + } + else + { + $rs->serial_number = ""; + } + + return $rs; + } + + /* + * Update used seraial number status + */ + public function updateProdcutSerialNumber($serial_id) + { + $update_query = "UPDATE " . $this->_table_prefix . "product_serial_number " + . " SET is_used='1' WHERE serial_id = " . (int) $serial_id; + $this->_db->setQuery($update_query); + $this->_db->execute(); + } + + public function getSubscription($product_id = 0) + { + $query = "SELECT * FROM " . $this->_table_prefix . "product_subscription " + . "WHERE product_id = " . (int) $product_id . " " + . "ORDER BY subscription_id "; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + /** + * Function Get Question Answers + * + * @param int $questionId default 0 + * @param int $productId default 0 + * @param int $faq is FAQ + * @param int $front show in Front or Not + * + * @return array + */ + public function getQuestionAnswer($questionId = 0, $productId = 0, $faq = 0, $front = 0) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $and = ""; + + if ($questionId != 0) + { + if ($faq != 0) + { + $and .= " AND " . $db->qn('q.parent_id') . " = " . $db->q($questionId); + } + else + { + $and .= " AND " . $db->qn('q.id') . " = " . $db->q($questionId); + } + } + else + { + $and .= " AND " . $db->qn('q.product_id') . " = " . $db->q($productId) . " AND " . $db->q('q.parent_id') . " = 0 "; + } + + if ($front != 0) + { + $and .= " AND q.published='1' "; + } + + // Avoid db killing + if (!empty($and)) + { + $query->select( + $db->qn( + [ + 'q.id', 'q.parent_id', 'q.product_id', + 'q.question', 'q.user_id', 'q.user_name', + 'q.user_email', 'q.published', 'q.question_date', + 'q.ordering', 'q.telephone', 'q.address' + ] + ) + ) + ->from($db->qn('#__redshop_customer_question', 'q')) + ->where($db->qn('q.id') . ' > 0 ' . $and) + ->order($db->qn('q.ordering')); + + $db->setQuery($query); + + return $db->loadObjectList(); + } + + return null; + } + + /** + * Get Product Rating + * + * @param int $productId Product id + * + * @return string + * @deprecated 2.1.0 + */ + public function getProductRating($productId) + { + return Redshop\Product\Rating::getRating($productId); + } + + /** + * Get Product Review List + * + * @param int $productId Product id + * + * @return mixed + */ + public function getProductReviewList($productId) + { + // Initialize variables. + $db = JFactory::getDbo(); + + // Create the base select statement. + $query = $db->getQuery(true) + ->select('pr.*') + ->select($db->qn('ui.firstname')) + ->select($db->qn('ui.lastname')) + ->from($db->qn('#__redshop_product_rating', 'pr')) + ->leftjoin( + $db->qn('#__redshop_users_info', 'ui') + . ' ON ' + . $db->qn('ui.user_id') . '=' . $db->qn('pr.userid') + . ' AND ' . $db->qn('ui.address_type') . '=' . $db->q('BT') + ) + ->where($db->qn('pr.product_id') . ' = ' . (int) $productId) + ->where($db->qn('pr.published') . ' = 1') + ->where($db->qn('pr.email') . ' != ' . $db->q('')) + ->order($db->qn('pr.favoured') . ' DESC') + ->group($db->qn('pr.rating_id')); + + try + { + $reviews = $db->setQuery($query)->loadObjectList(); + } + catch (RuntimeException $e) + { + throw new RuntimeException($e->getMessage(), $e->getCode()); + } + + return $reviews; + } + + /** + * Method for calculate two price with oprand symbol + * + * @param float $firstPrice First price + * @param string $oprand Operation symbol + * @param float $secondPrice Second price + * + * @return float + * + * @deprecated 2.0.7 + */ + public function calOprandPrice($firstPrice, $oprand, $secondPrice) + { + return RedshopHelperUtility::setOperandForValues($firstPrice, $oprand, $secondPrice); + } + + /** + * Method for generate compare product + * + * @return string HTML layout of compare div + * + * @deprecated 2.1.0 + * @see Redshop\Product\Compare::generateCompareProduct + * + * @throws \Exception + */ + public function makeCompareProductDiv() + { + return Redshop\Product\Compare::generateCompareProduct(); + } + + /** + * Function which will return product tag array form given template + * + * @param integer $section Section field + * @param string $html Template HTML + * + * @return array + * + * @deprecated 2.1.0 + * @see Redshop\Helper\Utility::getProductTags() + */ + public function product_tag($section, $html) + { + return \Redshop\Helper\Utility::getProductTags($section, $html); + } + + public function getJcommentEditor($product = array(), $data_add = "") + { + $app = JFactory::getApplication(); + $product_reviews = ""; + $product_id = $product->product_id; + + if ($product_id && strpos($data_add, "{jcomments off}") === false && strpos($data_add, "{jcomments on}") !== false) + { + $comments = $app->getCfg('absolute_path') . '/components/com_jcomments/jcomments.php'; + + if (file_exists($comments)) + { + require_once $comments; + $product_reviews = JComments::showComments($product_id, 'com_redshop', $product->product_name); + } + + $data_add = str_replace("{jcomments on}", $product_reviews, $data_add); + } + + $data_add = str_replace("{jcomments on}", $product_reviews, $data_add); + $data_add = str_replace("{jcomments off}", "", $data_add); + + return $data_add; + } + + public function getSelectedAccessoryArray($data = array()) + { + $selectedAccessory = array(); + $selectedAccessoryQua = array(); + $selectedProperty = array(); + $selectedSubproperty = array(); + + if (!empty($data['accessory_data'])) + { + $accessoryData = explode("@@", $data['accessory_data']); + $accQuantityData = explode("@@", $data['acc_quantity_data']); + + for ($i = 0, $in = count($accessoryData); $i < $in; $i++) + { + if (empty($accessoryData[$i])) + { + continue; + } + + $selectedAccessory[] = $accessoryData[$i]; + $selectedAccessoryQua[] = $accQuantityData[$i]; + } + } + + if (!empty($data['acc_property_data'])) + { + $accessoryPropertyData = explode('@@', $data['acc_property_data']); + + for ($i = 0, $in = count($accessoryPropertyData); $i < $in; $i++) + { + $accessoryPropertyData1 = explode('##', $accessoryPropertyData[$i]); + $countAccessoryProperty = count($accessoryPropertyData1); + + if ($countAccessoryProperty == 0) + { + continue; + } + + for ($ia = 0; $ia < $countAccessoryProperty; $ia++) + { + $accessoryPropertyData2 = explode(',,', $accessoryPropertyData1[$ia]); + $countAccessoryProperty2 = count($accessoryPropertyData2); + + if ($countAccessoryProperty2 == 0) + { + continue; + } + + for ($ip = 0; $ip < $countAccessoryProperty2; $ip++) + { + if ($accessoryPropertyData2[$ip] == "") + { + continue; + } + + $selectedProperty[] = $accessoryPropertyData2[$ip]; + } + } + } + } + + if (!empty($data['acc_subproperty_data'])) + { + $accessorySubpropertyData = explode('@@', $data['acc_subproperty_data']); + + for ($i = 0, $in = count($accessorySubpropertyData); $i < $in; $i++) + { + $accessorySubpropertyData1 = explode('##', $accessorySubpropertyData[$i]); + $countAccessorySubroperty = count($accessorySubpropertyData1); + + if ($countAccessorySubroperty == 0) + { + continue; + } + + for ($ia = 0; $ia < $countAccessorySubroperty; $ia++) + { + $accessorySubpropertyData2 = explode(',,', $accessorySubpropertyData1[$ia]); + $countAccessorySubroperty2 = count($accessorySubpropertyData2); + + if ($countAccessorySubroperty2 == 0) + { + continue; + } + + for ($ip = 0; $ip < $countAccessorySubroperty2; $ip++) + { + $accessorySubpropertyData3 = explode('::', $accessorySubpropertyData2[$ip]); + $countAccessorySubroperty3 = count($accessorySubpropertyData3); + + if ($countAccessorySubroperty3 == 0) + { + continue; + } + + for ($isp = 0; $isp < $countAccessorySubroperty3; $isp++) + { + if ($accessorySubpropertyData3[$isp] == "") + { + continue; + } + + $selectedSubproperty[] = $accessorySubpropertyData3[$isp]; + } + } + } + } + } + + return array($selectedAccessory, $selectedProperty, $selectedSubproperty, $selectedAccessoryQua); + } + + public function getSelectedAttributeArray($data = array()) + { + $selectedProperty = array(); + $selectedsubproperty = array(); + + if (!empty($data['property_data'])) + { + $acc_property_data = explode('##', $data['property_data']); + + for ($ia = 0, $countProperty = count($acc_property_data); $ia < $countProperty; $ia++) + { + $acc_property_data1 = explode(',,', $acc_property_data[$ia]); + $countProperty1 = count($acc_property_data1); + + for ($ip = 0; $ip < $countProperty1; $ip++) + { + if ($acc_property_data1[$ip] != "") + { + $selectedProperty[] = $acc_property_data1[$ip]; + } + } + } + } + + if (!empty($data['subproperty_data'])) + { + $acc_subproperty_data = explode('##', $data['subproperty_data']); + $countSubproperty = count($acc_subproperty_data); + + for ($ia = 0; $ia < $countSubproperty; $ia++) + { + $acc_subproperty_data1 = @explode('::', $acc_subproperty_data[$ia]); + $countSubproperty1 = count($acc_subproperty_data1); + + for ($ip = 0; $ip < $countSubproperty1; $ip++) + { + $acc_subproperty_data2 = explode(',,', $acc_subproperty_data1[$ip]); + $countSubproperty2 = count($acc_subproperty_data2); + + for ($isp = 0; $isp < $countSubproperty2; $isp++) + { + if ($acc_subproperty_data2[$isp] != "") + { + $selectedsubproperty[] = $acc_subproperty_data2[$isp]; + } + } + } + } + } + + $ret = array($selectedProperty, $selectedsubproperty); + + return $ret; + } + + /** + * Method for replace instock tag + * + * @param integer $product_id Product id + * @param string $data_add Template content + * @param array $attributes Attributes + * @param array $attribute_template Attribute template + * + * @return mixed + * + * @deprecated 2.1.0 Redshop\Product\Stock::replaceInStock + * @see Redshop\Product\Stock::replaceInStock + */ + public function replaceProductInStock($product_id = 0, $data_add, $attributes = array(), $attribute_template = array()) + { + return Redshop\Product\Stock::replaceInStock($product_id, $data_add, $attributes, $attribute_template); + } + + /** + * Method for get child products of specific product + * + * @param integer $productId Product ID + * + * @return array + * @deprecated 2.1.0 + * @see RedshopHelperProduct::getChildProduct + */ + public function getChildProduct($productId = 0) + { + return RedshopHelperProduct::getChildProduct($productId); + } + + /* + * function to get products parent id + * + * @return: int + */ + public function getMainParentProduct($parent_id) + { + $query = "SELECT product_parent_id FROM " . $this->_table_prefix . "product " + . "WHERE published=1 " + . "AND product_id = " . (int) $parent_id; + $this->_db->setQuery($query); + $product_parent_id = $this->_db->loadResult(); + + if ($product_parent_id !== 0) + { + $parent_id = $this->getMainParentProduct($product_parent_id); + } + + return $parent_id; + } + + /** + * Get formatted number + * + * @param float $price Price amount + * @param boolean $convertSigned True for convert negative price to absolution price. + * + * @return string Formatted price. + */ + public function redpriceDecimal($price, $convertSigned = true) + { + $price = ($convertSigned == true) ? abs($price) : $price; + + return number_format($price, Redshop::getConfig()->get('PRICE_DECIMAL'), '.', ''); + } + + public function redunitDecimal($price) + { + if (Redshop::getConfig()->get('UNIT_DECIMAL') != "") + { + return number_format($price, Redshop::getConfig()->get('UNIT_DECIMAL'), '.', ''); + } + + return $price; + } + + public function isProductDateRange($userfieldArr, $product_id) + { + $isEnable = true; + + if (count($userfieldArr) <= 0) + { + $isEnable = false; + + return $isEnable; + } + + if (!array_key_exists('15', self::$productDateRange)) + { + $query = $this->_db->getQuery(true) + ->select('name, id') + ->from($this->_db->qn('#__redshop_fields')) + ->where('type = 15'); + $this->_db->setQuery($query); + self::$productDateRange['15'] = $this->_db->loadObject(); + } + + $fieldData = self::$productDateRange['15']; + + if (!$fieldData) + { + $isEnable = false; + + return $isEnable; + } + + $field_name = $fieldData->name; + + if (is_array($userfieldArr)) + { + if (in_array($field_name, $userfieldArr)) + { + $field_id = $fieldData->id; + $dateQuery = "select data_txt from " . $this->_table_prefix . "fields_data where fieldid = " . (int) $field_id . " AND itemid = " . (int) $product_id; + $this->_db->setQuery($dateQuery); + $datedata = $this->_db->loadObject(); + + if (count($datedata) > 0) + { + $data_txt = $datedata->data_txt; + $mainsplit_date_total = preg_split(" ", $data_txt); + $mainsplit_date = preg_split(":", $mainsplit_date_total[0]); + + $dateStart = mktime( + 0, + 0, + 0, + (int) date('m', $mainsplit_date[0]), + (int) date('d', $mainsplit_date[0]), + (int) date('Y', $mainsplit_date[0]) + ); + + $dateEnd = mktime( + 23, + 59, + 59, + (int) date('m', $mainsplit_date[1]), + (int) date('d', $mainsplit_date[1]), + (int) date('Y', $mainsplit_date[1]) + ); + + $todayStart = mktime( + 0, + 0, + 0, + (int) date('m'), + (int) date('d'), + (int) date('Y') + ); + + $todayEnd = mktime(23, 59, 59, (int) date('m'), (int) date('d'), (int) date('Y')); + + if ($dateStart <= $todayStart && $dateEnd >= $todayEnd) + { + // Show add to cart button + $isEnable = false; + } + } + else + { + // Show add to cart button + $isEnable = false; + } + } + else + { + // Show add to cart button + $isEnable = false; + } + } + else + { + // Show add to cart button + $isEnable = false; + } + + return $isEnable; + } + + public function getassociatetag($product_id = 0) + { + $query = " SELECT a.product_id,at.tag_id,rg.tag_name,ty.type_name FROM #__redproductfinder_associations as a left outer join #__redproductfinder_association_tag as at on a.id=at.association_id left outer join #__redproductfinder_tags as rg on at.tag_id=rg.id left outer join #__redproductfinder_types as ty on at.type_id=ty.id where a.product_id='" . $product_id . "' "; + $this->_db->setQuery($query); + $res = $this->_db->loadObjectlist(); + + return $res; + } + + /** + * Method for get category compare product template + * + * @param integer $cid Category ID + * + * @return integer + * + * @deprecated 2.1.0 + * @see Redshop\Product\Compare::getCategoryCompareTemplate + */ + public function getCategoryCompareTemplate($cid) + { + return Redshop\Product\Compare::getCategoryCompareTemplate($cid); + } + + public function getProductCaterories($productId, $displayLink = 0) + { + $prodCatsObjectArray = array(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('c.name')) + ->select($db->qn('c.id')) + ->from($db->qn('#__redshop_category')) + ->leftjoin($db->qn('#__redshop_product_category_xref', 'pcx') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pcx.category_id')) + ->where($db->qn('pcx.product_id') . ' = ' . $db->q((int) $productId)) + ->where($db->qn('c.published') . ' = 1'); + + $rows = $db->setQuery($query)->loadObjectList(); + + for ($i = 0, $in = count($rows); $i < $in; $i++) + { + $ppCat = $pCat = ''; + $row = $rows[$i]; + + $query = $db->getQuery(true) + ->select($db->qn('parent_id')) + ->select($db->qn('name')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('id') . ' = ' . $db->q((int) $row->id)); + + $parentCat = $db->setQuery($query)->loadObject(); + + if (!empty($parentCat) && $parentCat->parent_id) + { + $pCat = $parentCat->name; + + $query = $db->getQuery(true) + ->select($db->qn('parent_id')) + ->select($db->qn('name')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('id') . ' = ' . $db->q((int) $parentCat->parent_id)); + + $pparentCat = $db->setQuery($query)->loadObject(); + + if (!empty($pparentCat) && $pparentCat->parent_id) + { + $ppCat = $pparentCat->name; + } + } + + $spacediv = (isset($pCat) && $pCat) ? " > " : ""; + $pspacediv = (isset($ppCat) && $ppCat) ? " > " : ""; + $catlink = ''; + + if ($displayLink) + { + $redhelper = redhelper::getInstance(); + $catItem = RedshopHelperRouter::getCategoryItemid($row->id); + + if (!(boolean) $catItem) + { + $catItem = JFactory::getApplication()->input->getInt('Itemid'); + } + + $catlink = JRoute::_('index.php?option=com_redshop&view=category&layout=detail&cid=' + . $row->id . '&Itemid=' . $catItem); + } + + $prodCatsObject = new stdClass; + $prodCatsObject->name = $ppCat . $pspacediv . $pCat . $spacediv . $row->name; + $prodCatsObject->link = $catlink; + $prodCatsObjectArray[] = $prodCatsObject; + } + + return $prodCatsObjectArray; + } + + /** + * Method for get display main image + * + * @param integer $product_id Product Id + * @param integer $property_id Property Id + * @param integer $subproperty_id Sub-property Id + * @param integer $pw_thumb Width of thumb + * @param integer $ph_thumb Height of thumb + * @param string $redview Red view + * + * @return array + * @throws Exception + * + * @deprecated 2.1.0 Redshop\Product\Image\Image::getDisplayMain() + * @see Redshop\Product\Image\Image::getDisplayMain + */ + public function getdisplaymainImage($product_id = 0, $property_id = 0, $subproperty_id = 0, $pw_thumb = 0, $ph_thumb = 0, $redview = "") + { + return Redshop\Product\Image\Image::getDisplayMain($product_id, $property_id, $subproperty_id, $pw_thumb, $ph_thumb, $redview); + } + + /** + * Method for get additional images of product. + * + * @param integer $productId Id of product + * @param integer $accessoryId Accessory Id + * @param integer $relatedProductId Related product ID + * @param integer $propertyId Property ID + * @param integer $subPropertyId Sub-property ID + * @param integer $mainImgWidth Main image width + * @param integer $mainImgHeight Main image height + * @param string $redView redshop View + * @param string $redLayout redshop layout + * + * @return array + * @throws Exception + * + * @deprecated 2.0.7 + * + * @see RedshopHelperProductTag::displayAdditionalImage + */ + public function displayAdditionalImage( + $productId = 0, $accessoryId = 0, $relatedProductId = 0, $propertyId = 0, $subPropertyId = 0, $mainImgWidth = 0, + $mainImgHeight = 0, $redView = "", $redLayout = "" + ) + { + return RedshopHelperProductTag::displayAdditionalImage( + $productId, $accessoryId, $relatedProductId, $propertyId, $subPropertyId, $mainImgWidth, $mainImgHeight, $redView, $redLayout + ); + } + + public function getProductFinderDatepickerValue($templatedata = "", $productid = 0, $fieldsArray = array(), $giftcard = 0) + { + if (empty($fieldsArray)) + { + return $templatedata; + } + + foreach ($fieldsArray as $fieldArray) + { + $fieldValueArray = RedshopHelperExtrafields::getData($fieldArray->id, 17, $productid); + + if ($fieldValueArray->data_txt != "" + && $fieldArray->show_in_front == 1 + && $fieldArray->published == 1 + && $giftcard == 0) + { + $templatedata = str_replace('{' . $fieldArray->name . '}', $fieldValueArray->data_txt, $templatedata); + $templatedata = str_replace('{' . $fieldArray->name . '_lbl}', $fieldArray->title, $templatedata); + } + else + { + $templatedata = str_replace('{' . $fieldArray->name . '}', "", $templatedata); + $templatedata = str_replace('{' . $fieldArray->name . '_lbl}', "", $templatedata); + } + } + + return $templatedata; + } + + /** + * Parse related product template + * + * @param string $templateDesc Template Contents + * @param integer $product_id Product Id + * + * @todo Move this functionality to library helper and convert this code into JLayout + * + * @return string Parsed Template HTML + */ + public function getRelatedtemplateView($templateDesc, $product_id) + { + $relatedProduct = $this->getRelatedProduct($product_id); + $relatedTemplate = \Redshop\Template\Helper::getRelatedProduct($templateDesc); + $fieldArray = RedshopHelperExtrafields::getSectionFieldList(17, 0, 0); + + JPluginHelper::importPlugin('redshop_product'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + + if (null === $relatedTemplate) + { + $templateDesc = RedshopHelperText::replaceTexts($templateDesc); + + return $templateDesc; + } + + if (!empty($relatedProduct) + && strpos($relatedTemplate->template_desc, "{related_product_start}") !== false + && strpos($relatedTemplate->template_desc, "{related_product_end}") !== false) + { + $related_template_data = ''; + $product_start = explode("{related_product_start}", $relatedTemplate->template_desc); + $product_end = explode("{related_product_end}", $product_start [1]); + + $tempdata_div_start = $product_start [0]; + $tempdata_div_middle = $product_end [0]; + $tempdata_div_end = $product_end [1]; + + $attribute_template = \Redshop\Template\Helper::getAttribute($tempdata_div_middle); + + // Extra field display + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(1, 1, 1); + + for ($r = 0, $rn = count($relatedProduct); $r < $rn; $r++) + { + $related_template_data .= $tempdata_div_middle; + + $dispatcher->trigger('onPrepareRelatedProduct', array(&$related_template_data, $relatedProduct[$r])); + + $ItemData = $this->getMenuInformation(0, 0, '', 'product&pid=' . $relatedProduct[$r]->product_id); + + if (count($ItemData) > 0) + { + $pItemid = $ItemData->id; + } + else + { + $catidmain = $relatedProduct[$r]->cat_in_sefurl; + $pItemid = RedshopHelperRouter::getItemId($relatedProduct[$r]->product_id, $catidmain); + } + + $rlink = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $relatedProduct[$r]->product_id . '&cid=' . $relatedProduct[$r]->cat_in_sefurl . '&Itemid=' . $pItemid); + + if (strpos($related_template_data, "{relproduct_image_3}") !== false) + { + $rpimg_tag = '{relproduct_image_3}'; + $rph_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_HEIGHT_3'); + $rpw_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_WIDTH_3'); + } + elseif (strpos($related_template_data, "{relproduct_image_2}") !== false) + { + $rpimg_tag = '{relproduct_image_2}'; + $rph_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_HEIGHT_2'); + $rpw_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_WIDTH_2'); + } + elseif (strpos($related_template_data, "{relproduct_image_1}") !== false) + { + $rpimg_tag = '{relproduct_image_1}'; + $rph_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_HEIGHT'); + $rpw_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_WIDTH'); + } + else + { + $rpimg_tag = '{relproduct_image}'; + $rph_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_HEIGHT'); + $rpw_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_WIDTH'); + } + + $hidden_thumb_image = ""; + $relimage = Redshop\Product\Image\Image::getImage($relatedProduct [$r]->product_id, $rlink, $rpw_thumb, $rph_thumb); + $related_template_data = str_replace($rpimg_tag, $relimage . $hidden_thumb_image, $related_template_data); + + if (strpos($related_template_data, "{relproduct_link}") !== false) + { + $rpname = "" + . RedshopHelperUtility::maxChars($relatedProduct [$r]->product_name, Redshop::getConfig()->getInt('RELATED_PRODUCT_TITLE_MAX_CHARS'), Redshop::getConfig()->getString('RELATED_PRODUCT_TITLE_END_SUFFIX')) + . ""; + } + else + { + $rpname = RedshopHelperUtility::maxChars($relatedProduct [$r]->product_name, Redshop::getConfig()->getInt('RELATED_PRODUCT_TITLE_MAX_CHARS'), Redshop::getConfig()->getString('RELATED_PRODUCT_TITLE_END_SUFFIX')); + } + + $rpdesc = RedshopHelperUtility::maxChars($relatedProduct [$r]->product_desc, Redshop::getConfig()->getInt('RELATED_PRODUCT_DESC_MAX_CHARS'), Redshop::getConfig()->getString('RELATED_PRODUCT_DESC_END_SUFFIX')); + $rp_shortdesc = RedshopHelperUtility::maxChars($relatedProduct [$r]->product_s_desc, Redshop::getConfig()->getInt('RELATED_PRODUCT_SHORT_DESC_MAX_CHARS'), Redshop::getConfig()->getString('RELATED_PRODUCT_SHORT_DESC_END_SUFFIX')); + + $related_template_data = str_replace("{relproduct_link}", '', $related_template_data); + + if (strpos($related_template_data, "{relproduct_link}") !== false) + { + $related_template_data = str_replace("{relproduct_name}", "", $related_template_data); + } + else + { + $related_template_data = str_replace("{relproduct_name}", $rpname, $related_template_data); + } + + $related_template_data = str_replace("{relproduct_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER_LBL'), $related_template_data); + $related_template_data = str_replace("{relproduct_number}", $relatedProduct [$r]->product_number, $related_template_data); + $related_template_data = str_replace("{relproduct_s_desc}", $rp_shortdesc, $related_template_data); + $related_template_data = str_replace("{relproduct_desc}", $rpdesc, $related_template_data); + + // ProductFinderDatepicker Extra Field Start + $related_template_data = $this->getProductFinderDatepickerValue($related_template_data, $relatedProduct[$r]->product_id, $fieldArray); + + if (strpos($related_template_data, "{manufacturer_name}") !== false || strpos($related_template_data, "{manufacturer_link}") !== false) + { + $manufacturer = RedshopEntityManufacturer::getInstance($relatedProduct[$r]->manufacturer_id)->getItem(); + + if (!empty($manufacturer)) + { + $man_url = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $relatedProduct[$r]->manufacturer_id . '&Itemid=' . $pItemid); + $manufacturerLink = "" . JText::_("COM_REDSHOP_VIEW_ALL_MANUFACTURER_PRODUCTS") . ""; + $related_template_data = str_replace("{manufacturer_name}", $manufacturer->name, $related_template_data); + $related_template_data = str_replace("{manufacturer_link}", $manufacturerLink, $related_template_data); + } + else + { + $related_template_data = str_replace("{manufacturer_name}", '', $related_template_data); + $related_template_data = str_replace("{manufacturer_link}", '', $related_template_data); + } + } + + $rmore = '' + . JText::_('COM_REDSHOP_READ_MORE') + . ''; + $related_template_data = str_replace("{read_more}", $rmore, $related_template_data); + $related_template_data = str_replace("{read_more_link}", $rlink, $related_template_data); + + /* + * related product Required Attribute start + * this will parse only Required Attributes + */ + $relid = $relatedProduct [$r]->product_id; + $attributes_set = array(); + + if ($relatedProduct [$r]->attribute_set_id > 0) + { + $attributes_set = RedshopHelperProduct_Attribute::getProductAttribute(0, $relatedProduct [$r]->attribute_set_id); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($relid); + $attributes = array_merge($attributes, $attributes_set); + + $related_template_data = $this->replaceAttributeData($relatedProduct[$r]->mainproduct_id, 0, $relatedProduct[$r]->product_id, $attributes, $related_template_data, $attribute_template); + + // Check product for not for sale + $related_template_data = $this->getProductNotForSaleComment($relatedProduct[$r], $related_template_data, $attributes, 1); + + $related_template_data = Redshop\Cart\Render::replace($relatedProduct[$r]->mainproduct_id, 0, 0, $relatedProduct[$r]->product_id, $related_template_data, false, array(), count($attributes), 0, 0); + $related_template_data = Redshop\Product\Compare::replaceCompareProductsButton($relatedProduct[$r]->product_id, 0, $related_template_data, 1); + $related_template_data = Redshop\Product\Stock::replaceInStock($relatedProduct[$r]->product_id, $related_template_data); + + $related_template_data = $this->getProductOnSaleComment($relatedProduct[$r], $related_template_data); + $related_template_data = $this->getSpecialProductComment($relatedProduct[$r], $related_template_data); + + $isCategorypage = (JFactory::getApplication()->input->getCmd('view') == "category") ? 1 : 0; + + // Extra field display + $related_template_data = $this->getExtraSectionTag($extraFieldName, $relatedProduct[$r]->product_id, "1", $related_template_data, $isCategorypage); + + // Related product attribute price list + $related_template_data = $this->replaceAttributePriceList($relatedProduct[$r]->product_id, $related_template_data); + + if (strpos($related_template_data, "{wishlist_link}") !== false) + { + $wishlistLink = "
    " . $this->replaceWishlistButton($relatedProduct[$r]->product_id, '{wishlist_link}') . "
    "; + $related_template_data = str_replace("{wishlist_link}", $wishlistLink, $related_template_data); + } + + $childproduct = RedshopHelperProduct::getChildProduct($relatedProduct[$r]->product_id); + + if (count($childproduct) > 0) + { + $attributes = array(); + } + else + { + // Get attributes + $attributes_set = array(); + + if ($relatedProduct[$r]->attribute_set_id > 0) + { + $attributes_set = RedshopHelperProduct_Attribute::getProductAttribute(0, $relatedProduct[$r]->attribute_set_id, 0, 1); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($relatedProduct[$r]->product_id); + $attributes = array_merge($attributes, $attributes_set); + } + + $totalatt = count($attributes); + + $attributeproductStockStatus = array(); + + $productAvailabilityDate = strstr($related_template_data, "{product_availability_date}"); + $stockNotifyFlag = strstr($related_template_data, "{stock_notify_flag}"); + $stockStatus = strstr($related_template_data, "{stock_status"); + + if ($productAvailabilityDate || $stockNotifyFlag || $stockStatus) + { + $attributeproductStockStatus = $this->getproductStockStatus($relatedProduct[$r]->product_id, $totalatt); + } + + $related_template_data = \Redshop\Helper\Stockroom::replaceProductStockData( + $relatedProduct[$r]->product_id, + 0, + 0, + $related_template_data, + $attributeproductStockStatus + ); + + $dispatcher->trigger('onAfterDisplayRelatedProduct', array(&$related_template_data, $relatedProduct[$r])); + } + + $related_template_data = $tempdata_div_start . $related_template_data . $tempdata_div_end; + + $templateDesc = str_replace("{related_product:$relatedTemplate->name}", $related_template_data, $templateDesc); + $templateDesc = RedshopHelperTemplate::parseRedshopPlugin($templateDesc); + } + else + { + $templateDesc = str_replace("{related_product:$relatedTemplate->name}", "", $templateDesc); + } + + $templateDesc = RedshopHelperText::replaceTexts($templateDesc); + + return $templateDesc; + } + + /** + * replace related product attribute price list + * + * child product as related product concept is included + * New Tag : {relproduct_attribute_pricelist} = related product attribute price list + * + * @params: $id : product id + * @params: $templatedata : template data + */ + public function replaceAttributePriceList($id, $templatedata) + { + $output = ""; + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($id, 0, 0, 1); + + $k = 0; + + for ($i = 0, $in = count($attributes); $i < $in; $i++) + { + $attribute = $attributes[$i]; + $attribute_name = $attribute->text; + $attribute_id = $attribute->value; + $propertys = RedshopHelperProduct_Attribute::getAttributeProperties(0, $attribute_id); + + for ($p = 0, $pn = count($propertys); $p < $pn; $p++) + { + $property = $propertys[$p]; + + $property_id = $property->value; + $property_name = $property->text; + $proprty_price = $property->property_price; + $property_formated_price = RedshopHelperProductPrice::formattedPrice($proprty_price); + $proprty_oprand = $property->oprand; + + $output .= ''; + + $subpropertys = RedshopHelperProduct_Attribute::getAttributeSubProperties(0, $property_id); + + for ($s = 0, $sn = count($subpropertys); $s < $sn; $s++) + { + $subproperty = $subpropertys[$s]; + + $subproperty_id = $subproperty->value; + $subproperty_name = $subproperty->text; + $subproprty_price = $subproperty->subattribute_color_price; + $subproprty_oprand = $subproperty->oprand; + } + + $k++; + } + } + #$output = ($output!="") ? "
    ".$output."
    " : ""; + $templatedata = str_replace("{relproduct_attribute_pricelist}", $output, $templatedata); + + return $templatedata; + } + + public function getCategoryNameByProductId($pid) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('c.name')) + ->from($db->qn('#__redshop_product_category_xref', 'pcx')) + ->leftjoin($db->qn('#__redshop_category', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pcx.category_id')) + ->where($db->qn('pcx.product_id') . ' = ' . $db->q((int) $pid)) + ->where($db->qn('c.name') . ' IS NOT NULL') + ->order($db->qn('c.id') . ' ASC') + ->setLimit(0, 1); + + return $db->setQuery($query)->loadResult(); + } + + public function removeOutofstockProduct($products) + { + $filter_products = array(); + + for ($s = 0, $sn = count($products); $s < $sn; $s++) + { + $product = $products[$s]; + $pid = $product->product_id; + + $attributes_set = array(); + + if ($product->attribute_set_id > 0) + { + $attributes_set = RedshopHelperProduct_Attribute::getProductAttribute(0, $product->attribute_set_id, 0, 1); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($product->product_id); + $attributes = array_merge($attributes, $attributes_set); + $totalatt = count($attributes); + $stock_amount = RedshopHelperStockroom::getFinalStockofProduct($pid, $totalatt); + + if ($stock_amount) + { + $filter_products[] = $products[$s]; + } + } + + return $filter_products; + } + + /** + * @param integer $productId Product id + * @param integer $totalAttribute Total attribute + * @param integer $selectedPropertyId Selected property id + * @param integer $selectedsubpropertyId Selected sub property id + * + * @return array + * + * @since 2.1.0 + * @throws \Exception + */ + public function getproductStockStatus($productId = 0, $totalAttribute = 0, $selectedPropertyId = 0, $selectedsubpropertyId = 0) + { + return RedshopEntityProduct::getInstance($productId)->getStockstatus($totalAttribute, $selectedPropertyId, $selectedsubpropertyId); + } + + public function replaceProductStockdata($product_id, $property_id, $subproperty_id, $data_add, $stockStatusArray) + { + return \Redshop\Helper\Stockroom::replaceProductStockData($product_id, $property_id, $subproperty_id, $data_add, $stockStatusArray); + } + + /** + * Check already notified user + * + * @param int $user_id User id + * @param int $product_id Product id + * @param int $property_id Property id + * @param int $subproperty_id Sub property id + * + * @deprecated 1.5 Use RedshopHelperStockroom::isAlreadyNotifiedUser instead + * + * @return mixed + */ + public function isAlreadyNotifiedUser($user_id, $product_id, $property_id, $subproperty_id) + { + return RedshopHelperStockroom::isAlreadyNotifiedUser($user_id, $product_id, $property_id, $subproperty_id); + } + + /** + * @param array $cart + * @param integer $orderId + * @param integer $sectionId + * + * @return false|mixed|void + */ + public function insertPaymentShippingField($cart = array(), $orderId = 0, $sectionId = 18) + { + $fieldsList = RedshopHelperExtrafields::getSectionFieldList($sectionId, 1); + + if (empty($fieldsList)) + { + return; + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->insert($db->quoteName('#__redshop_fields_data')) + ->columns($db->quoteName(array('fieldid', 'data_txt', 'itemid', 'section'))); + + foreach ($fieldsList as $fieldList) + { + $userFields = ''; + + if (isset($cart['extrafields_values'])) + { + $userFields = $cart['extrafields_values'][$fieldList->name]; + } + + if (!empty(trim($userFields))) + { + $values = array( + (int) $fieldList->id, + $db->quote(addslashes($userFields)), + (int) $orderId, + $db->quote($sectionId) + ); + $query->values(implode(',', $values)); + } + } + + return $db->setQuery($query)->execute(); + } + + /** + * @param object $order Order object + * @param integer $sectionId Section Id + * + * @return string + */ + public function getPaymentandShippingExtrafields($order, $sectionId) + { + $fieldsList = RedshopHelperExtrafields::getSectionFieldList($sectionId, 1); + $resultArr = array(); + + foreach ($fieldsList as $field) + { + $result = RedshopHelperExtrafields::getData($field->id, $sectionId, $order->order_id); + + if (!is_null($result) && $result->data_txt != "" && $field->show_in_front == 1) + { + $resultArr[] = $result->title . " : " . $result->data_txt; + } + } + + $return = ""; + + if (!empty($resultArr)) + { + $return = implode("
    ", $resultArr); + } + + return $return; + } + + /** + * Return checked if product is in session of compare product cart else blank + * + * @param integer $productId Id of product + * + * @return string + * + * @deprecated 2.0.7 + */ + public function checkCompareProduct($productId) + { + $productId = (int) $productId; + + if (!$productId) + { + return ''; + } + + $compareProducts = $this->_session->get('compare_product'); + + if (!$compareProducts) + { + return ''; + } + + $idx = (int) ($compareProducts['idx']); + + foreach ($compareProducts[$idx] as $compareProduct) + { + if ($compareProduct["product_id"] == $productId) + { + return 'checked'; + } + } + + return ''; + } + + /** + * Get Max and Min of Product Price + * + * @param int $productId Product Id + * + * @return array + */ + public function getProductMinMaxPrice($productId) + { + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($productId); + $propertyIds = array(); + $subPropertyIds = array(); + $propertyPriceList = array(); + $subPropertyPriceList = array(); + + foreach ($attributes as $key => $attribute) + { + foreach ($attribute->properties as $property) + { + $propertyIds[] = $property->property_id; + $subProperties = RedshopHelperProduct_Attribute::getAttributeSubProperties(0, $property->property_id); + + foreach ($subProperties as $subProperty) + { + $subPropertyIds[] = $subProperty->value; + } + } + } + + $db = JFactory::getDbo(); + + if (!empty($productId)) + { + $productPriceList = \Redshop\Repositories\Product::getPrices((int) $productId); + } + + if (!empty($propertyIds)) + { + $query = $db->getQuery(true) + ->select($db->qn('product_price')) + ->from($db->qn('#__redshop_product_attribute_price')) + ->where($db->qn('section') . ' = ' . $db->q('property')) + ->where($db->qn('section_id') . ' IN (' . implode(',', $propertyIds) . ')'); + $propertyPriceList = $db->setQuery($query)->loadColumn(); + } + + if (!empty($subPropertyIds)) + { + $query = $db->getQuery(true) + ->select($db->qn('product_price')) + ->from($db->qn('#__redshop_product_attribute_price')) + ->where($db->qn('section') . ' = ' . $db->q('subproperty')) + ->where($db->qn('section_id') . ' IN (' . implode(',', $subPropertyIds) . ')'); + $subPropertyPriceList = $db->setQuery($query)->loadColumn(); + } + + $productPriceList = array_unique(array_merge($productPriceList, $propertyPriceList, $subPropertyPriceList)); + $productPrice['min'] = min($productPriceList); + $productPrice['max'] = max($productPriceList); + + return $productPrice; + } +} diff --git a/component/site/helpers/redhelper.php b/component/site/helpers/redhelper.php new file mode 100644 index 00000000000..6edd60d3b17 --- /dev/null +++ b/component/site/helpers/redhelper.php @@ -0,0 +1,552 @@ +_table_prefix = '#__redshop_'; + $this->_db = JFactory::getDbo(); + } + + /** + * Quote an array of values. + * + * @param array $values The values. + * @param string $nameQuote Name quote, can be possible q, quote, qn, quoteName + * + * @return array The quoted values + * + * @deprecated 2.0.6 Use RedshopHelperUtility::quote or RedshopHelperUtility::quoteName instead + */ + public static function quote(array $values, $nameQuote = 'q') + { + if ($nameQuote == 'q') + { + return RedshopHelperUtility::quote($values); + } + + return RedshopHelperUtility::quoteName($values); + } + + /** + * Set Operand For Values + * + * @param float $leftValue Left value + * @param string $operand Operand + * @param float $rightValue Right value + * + * @return float + * + * @deprecated 2.0.6 Use RedshopHelperUtility::setOperandForValues instead + */ + public static function setOperandForValues($leftValue, $operand, $rightValue) + { + return RedshopHelperUtility::setOperandForValues($leftValue, $operand, $rightValue); + } + + /** + * Get Redshop Menu Items + * + * @return array + * + * @deprecated 2.0.6 + */ + public function getRedshopMenuItems() + { + return RedshopHelperRouter::getRedshopMenuItems(); + } + + /** + * Add item to cart from db ... + * + * @return void + * + * @deprecated 2.0.6 Use RedshopHelperUtility::databaseToCart instead + */ + public function dbtocart() + { + RedshopHelperUtility::databaseToCart(); + } + + /** + * Delete shipping rate when shipping method is not available + * + * @return void + * + * @deprecated 2.0.6 + * @see Redshop\Shipping\Rate::removeShippingRate + */ + public function removeShippingRate() + { + Redshop\Shipping\Rate::removeShippingRate(); + } + + /** + * Get plugins + * + * @param string $folder Group of plugins + * @param string $enabled -1: All, 0: not enable, 1: enabled + * + * @return array + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getPlugins instead + */ + public function getPlugins($folder = 'redshop', $enabled = '1') + { + return RedshopHelperUtility::getPlugins($folder, $enabled); + } + + /** + * Method for get modules + * + * @param string $enabled [-1: All, 0: not enable, 1: enabled] + * + * @return array + * + * @since 2.0.6 + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getModules instead + */ + public function getModules($enabled = '1') + { + return RedshopHelperUtility::getModules($enabled); + } + + /** + * Get all plugins + * + * @param string $folder Group of plugins + * + * @return array + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getPlugins instead + */ + public function getallPlugins($folder = 'redshop') + { + return RedshopHelperUtility::getPlugins($folder); + } + + /** + * Method for check if order has this payment is update yet? + * + * @param object $dbConn DB connection + * @param integer $orderId Order ID + * @param mixed $tid Order payment transaction id + * + * @return boolean + * + * @deprecated 2.0.6 Use RedshopHelperPayment::orderPaymentNotYetUpdated instead + */ + public function orderPaymentNotYetUpdated($dbConn, $orderId, $tid) + { + return RedshopHelperPayment::orderPaymentNotYetUpdated($orderId, $tid); + } + + /** + * Check Menu Query + * + * @param object $oneMenuItem Values current menu item + * @param array $queryItems Name query check + * + * @return boolean + * + * @deprecated 2.0.6 Use RedshopHelperRouter::checkMenuQuery instead + */ + public function checkMenuQuery($oneMenuItem, $queryItems) + { + return RedshopHelperRouter::checkMenuQuery($oneMenuItem, $queryItems); + } + + /** + * Get RedShop Menu Item + * + * @param array $queryItems Values query + * + * @return mixed + * + * @deprecated 2.0.6 Use RedshopHelperRouter::getRedShopMenuItem instead + */ + public function getRedShopMenuItem($queryItems) + { + return RedshopHelperRouter::getRedShopMenuItem($queryItems); + } + + /** + * Get Item Id + * + * @param int $productId Product Id + * @param int $categoryId Category Id + * + * @return mixed + * + * @deprecated 2.0.6 Use RedshopHelperRouter::getItemid instead + */ + public function getItemid($productId = 0, $categoryId = 0) + { + return RedshopHelperRouter::getItemId($productId, $categoryId); + } + + /** + * Get Category Itemid + * + * @param int $categoryId Category id + * + * @return mixed + * + * @deprecated 2.0.6 Use RedshopHelperRouter::getCategoryItemid instead + */ + public function getCategoryItemid($categoryId = 0) + { + return RedshopHelperRouter::getCategoryItemid($categoryId); + } + + /** + * Method for convert array of string + * + * @param array $arr Language array + * + * @return mixed + * + * @deprecated 2.0.6 Use RedshopHelperUtility::convertLanguageString instead + */ + public function convertLanguageString($arr) + { + return RedshopHelperUtility::convertLanguageString($arr); + } + + /** + * Shopper Group portal info + * + * @return object Shopper Group Ids Object + * + * @deprecated 2.0.6 Use RedshopHelperShopper_Group::getShopperGroupPortal instead + */ + public function getShopperGroupPortal() + { + return RedshopHelperShopper_Group::getShopperGroupPortal(); + } + + /** + * Shopper Group category ACL + * + * @param int $cid Category id + * + * @return mixed + * + * @deprecated 2.0.6 Use RedshopHelperShopper_Group::getShopperGroupCategory instead + */ + public function getShopperGroupCategory($cid = 0) + { + return RedshopHelperShopper_Group::getShopperGroupCategory($cid); + } + + /** + * Check permission for Categories shopper group can access or can't access + * + * @param int $cid category id that need to be checked + * + * @return boolean + * + * @deprecated 2.0.3 Use RedshopHelperAccess::checkPortalCategoryPermission() instead. + */ + public function checkPortalCategoryPermission($cid = 0) + { + return RedshopHelperAccess::checkPortalCategoryPermission($cid); + } + + /** + * Check permission for Products shopper group can access or can't access + * + * @param int $pid Product id that need to be checked + * + * @return boolean + * + * @deprecated 2.0.6 Use RedshopHelperAccess::checkPortalProductPermission() instead + */ + public function checkPortalProductPermission($pid = 0) + { + return RedshopHelperAccess::checkPortalProductPermission($pid); + } + + /** + * Shopper Group product category ACL + * + * @param int $pid Category id + * + * @return mixed + * + * @deprecated 2.0.6 Use RedshopHelperShopper_Group::checkPortalProductPermission() instead + */ + public function getShopperGroupProductCategory($pid = 0) + { + return RedshopHelperShopper_Group::getShopperGroupProductCategory($pid); + } + + /** + * Method for get order by list + * + * @return array + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getOrderByList instead + */ + public function getOrderByList() + { + return RedshopHelperUtility::getOrderByList(); + } + + /** + * Prepare order by object for ordering from string. + * + * @param string $case Order By string generated in getOrderByList method + * + * @return object Parsed strings in ordering and direction object key. + * + * @deprecated 2.0.6 Use RedshopHelperUtility::prepareOrderBy instead + */ + public function prepareOrderBy($case) + { + return RedshopHelperUtility::prepareOrderBy($case); + } + + /** + * Method for get manufacturer order by list + * + * @return array List of order + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getManufacturerOrderByList instead + */ + public function getManufacturerOrderByList() + { + return RedshopHelperUtility::getManufacturerOrderByList(); + } + + /** + * Method for get product related order by list + * + * @return array List of order + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getRelatedOrderByList instead + */ + public function getRelatedOrderByList() + { + return RedshopHelperUtility::getRelatedOrderByList(); + } + + /** + * Method for get accessories order by list + * + * @return array List of order + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getAccessoryOrderByList instead + */ + public function getAccessoryOrderByList() + { + return RedshopHelperUtility::getAccessoryOrderByList(); + } + + /** + * Method for get pre-order by list + * + * @return array List of order + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getPreOrderByList instead + */ + public function getPreOrderByList() + { + return RedshopHelperUtility::getPreOrderByList(); + } + + /** + * Method for get child product order by list + * + * @return array List of order + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getChildProductOption instead + */ + public function getChildProductOption() + { + return RedshopHelperUtility::getChildProductOption(); + } + + /** + * Method for get child product order by list + * + * @return array List of order + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getStateAbbreviationsByList instead + */ + public function getStateAbbrivationByList() + { + return RedshopHelperUtility::getStateAbbreviationsByList(); + } + + /** + * Method for get menu item id of checkout page + * + * @return integer + * @throws Exception + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getCheckoutItemId instead + */ + public function getCheckoutItemId() + { + return RedshopHelperRouter::getCheckoutItemId(); + } + + /** + * Method for get menu item id of cart page + * + * @return integer + * + * @deprecated 2.0.6 Use RedshopHelperRouter::getCartItemId instead + */ + public function getCartItemId() + { + return RedshopHelperRouter::getCartItemId(); + } + + /** + * Generate thumb image + * + * @param string $section Image section + * @param string $imageName Image name + * @param string $thumbWidth Thumb width + * @param string $thumbHeight Thumb height + * @param integer $enableWatermark Enable watermark + * + * @return string + * + * @deprecated 2.0.6 Use RedshopHelperUtility::watermark instead + */ + public function watermark($section, $imageName = '', $thumbWidth = '', $thumbHeight = '', $enableWatermark = -1) + { + return RedshopHelperMedia::watermark($section, $imageName, $thumbWidth, $thumbHeight, $enableWatermark); + } + + /** + * Method for run process on order ID + * + * @param integer $order_id ID of order + * + * @return void + * + * @deprecated 2.0.6 Use RedshopHelperClickATell::clickatellSMS instead + */ + public function clickatellSMS($order_id) + { + RedshopHelperClickatell::clickatellSMS($order_id); + } + + /** + * Method for send message + * + * @param string $text Message text + * @param string $to Phone number for send + * + * @return void + * + * @deprecated 2.0.6 Use RedshopHelperClickATell::clickatellSMS instead + */ + public function sendmessage($text, $to) + { + RedshopHelperClickatell::sendMessage($text, $to); + } + + /** + * Method for replace message + * + * @param string $message Message text + * @param object $orderData Object data + * @param string $paymentName Name of payment + * + * @return mixed + * + * @deprecated 2.0.6 Use RedshopHelperClickATell::replaceMessage instead + */ + public function replaceMessage($message, $orderData, $paymentName) + { + return RedshopHelperClickatell::replaceMessage($message, $orderData, $paymentName); + } + + /** + * SSL link + * + * @param string $link Link + * @param integer $applySSL Apply ssl or not. + * + * @deprecated 1.6 Use RedshopHelperUtility::getSslLink($link, $applySSL) instead + * + * @return string Converted string + */ + public function sslLink($link, $applySSL = 1) + { + return RedshopHelperUtility::getSSLLink($link, $applySSL); + } + + /** + * Method for get Economic Account Group + * + * @param integer $accountGroupId Account group ID + * @param integer $front Is front or not + * + * @return array + * + * @deprecated 2.0.6 Use RedshopHelperUtility::getSslLink($link, $applySSL) instead + */ + public function getEconomicAccountGroup($accountGroupId = 0, $front = 0) + { + return RedshopHelperUtility::getEconomicAccountGroup($accountGroupId, $front); + } + + /** + * Method for check if ProductFinder is available or not. + * + * @return boolean + * + * @deprecated 2.0.6 Use RedshopHelperUtility::isRedProductFinder instead + */ + public function isredProductfinder() + { + return RedshopHelperUtility::isRedProductFinder(); + } +} diff --git a/component/site/helpers/route.php b/component/site/helpers/route.php new file mode 100644 index 00000000000..e612c194962 --- /dev/null +++ b/component/site/helpers/route.php @@ -0,0 +1,171 @@ + array((int) $id) + ); + + // Create the link + $link = 'index.php?option=com_redshop&view=product&pid=' . $id; + + if ((int) $catid > 0) + { + $link .= '&cid=' . $catid; + } + + // Find the menu item for the search + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $items = $menu->getItems( + 'link', + 'index.php?option=com_redshop&view=category&layout=detail&cid=' . $catid . '&manufacturer_id=' . $manufacturerId + ); + + if (isset($items[0])) + { + $link .= '&Itemid=' . $items[0]->id; + } + + if ($language && $language !== '*' && JLanguageMultilang::isEnabled()) + { + $link .= '&lang=' . $language; + } + + return $link; + } + + /** + * Find an item ID. + * + * @param array $needles An array of language codes. + * + * @return mixed The ID found or null otherwise. + * + * @since 1.5 + */ + protected static function findItem($needles = null) + { + $app = JFactory::getApplication(); + $menus = $app->getMenu('site'); + + // Prepare the reverse lookup array. + if (static::$lookup === null) + { + static::$lookup = array(); + $component = JComponentHelper::getComponent('com_redshop'); + $items = $menus->getItems('component_id', $component->id); + + foreach ($items as $item) + { + if (isset($item->query) && isset($item->query['view'])) + { + $view = $item->query['view']; + + if (!isset(static::$lookup[$view])) + { + static::$lookup[$view] = array(); + } + + // Some trickery to get the right link for products + if (isset(static::$type) && static::$type == 'product') + { + if (isset($item->query['pid'])) + { + static::$lookup[$view][$item->query['pid']] = $item->id; + } + elseif (isset($item->query['cid'])) + { + static::$lookup[$view][$item->query['cid']] = $item->id; + } + } + } + } + } + + if ($needles) + { + foreach ($needles as $view => $ids) + { + if (isset(static::$lookup[$view])) + { + foreach ($ids as $id) + { + if (isset(static::$lookup[$view][(int) $id])) + { + return static::$lookup[$view][(int) $id]; + } + } + } + } + } + else + { + $active = $menus->getActive(); + + if ($active && $active->component == 'com_redshop') + { + return $active->id; + } + } + + return null; + } +} diff --git a/component/site/helpers/rscarthelper.php b/component/site/helpers/rscarthelper.php new file mode 100644 index 00000000000..6cb6a19c40e --- /dev/null +++ b/component/site/helpers/rscarthelper.php @@ -0,0 +1,3090 @@ +_table_prefix = '#__redshop_'; + $this->_db = JFactory::getDBO(); + $this->_session = JFactory::getSession(); + $this->_order_functions = order_functions::getInstance(); + $this->_extra_field = extra_field::getInstance(); + $this->_extraFieldFront = extraField::getInstance(); + $this->_redhelper = redhelper::getInstance(); + $this->_producthelper = productHelper::getInstance(); + $this->_shippinghelper = shipping::getInstance(); + $this->input = JFactory::getApplication()->input; + } + + /** + * replace Conditional tag from Redshop tax + * + * @param string $data + * @param int $amount + * @param int $discount + * @param int $check + * @param int $quotationMode + * + * @return string + * + * @deprecated 2.0.7 Use RedshopHelperCartTag::replaceTax() instead. + */ + public function replaceTax($data = '', $amount = 0, $discount = 0, $check = 0, $quotationMode = 0) + { + return RedshopHelperCartTag::replaceTax($data, $amount, $discount, $check, $quotationMode); + } + + /** + * Calculate tax after Discount is apply + * + * @param float $tax Tax amount + * @param float $discount Discount amount. + * + * @return float Tax after apply discount. + * + * @deprecated 2.0.3 Use RedshopHelperCart::calculateTaxAfterDiscount() instead. + **/ + public function calculateTaxafterDiscount($tax = 0.0, $discount = 0.0) + { + return RedshopHelperCart::calculateTaxAfterDiscount($tax, $discount); + } + + /** + * replace Conditional tag from Redshop Discount + * + * @param string $template Template + * @param int $discount Discount + * @param int $subTotal Subtotal + * @param int $quotationMode Quotation mode + * + * @return string + * + * @deprecated 2.0.7 Use RedshopHelperCartTag::replaceDiscount() instead. + */ + public function replaceDiscount($template = '', $discount = 0, $subTotal = 0, $quotationMode = 0) + { + return RedshopHelperCartTag::replaceDiscount($template, $discount, $subTotal, $quotationMode); + } + + /** + * replace Conditional tag from Redshop payment Discount/charges + * + * @param string $data + * @param int $amount + * @param int $cart + * @param string $payment_oprand + * + * @return string + * + * @deprecated 2.0.7 + */ + public function replacePayment($data = '', $amount = 0, $cart = 0, $payment_oprand = '-') + { + return RedshopHelperPayment::replaceConditionTag($data, $amount, $cart, $payment_oprand); + } + + /** + * Calculate payment Discount/charges + * + * @param float $total Total + * @param object $paymentinfo Payment information + * @param float $finalAmount Final amount + * + * @return array + * + * @deprecated 2.1.0 + * + * @see RedshopHelperPayment::calculate() + */ + public function calculatePayment($total, $paymentinfo, $finalAmount) + { + return RedshopHelperPayment::calculate($total, $paymentinfo, $finalAmount); + } + + /** + * Method for replace Billing Address + * + * @param string $content Template content + * @param object $billingAddress Billing data + * @param boolean $sendMail Is in send mail? + * + * @return mixed + * @deprecated 2.0.7 + * + * @see RedshopHelperBillingTag::replaceBillingAddress() + */ + public function replaceBillingAddress($content, $billingAddress, $sendMail = false) + { + return RedshopHelperBillingTag::replaceBillingAddress($content, $billingAddress, $sendMail); + } + + /** + * Replace Shipping Address + * + * @param string $data Template content + * @param object $shippingAddress Shipping address + * @param boolean $sendMail Is in send mail + * + * @return string + * @throws Exception + * + * @deprecated 2.1.0 + * @see Redshop\Shipping\Tag::replaceShippingAddress + */ + public function replaceShippingAddress($data, $shippingAddress, $sendMail = false) + { + return Redshop\Shipping\Tag::replaceShippingAddress($data, $shippingAddress, $sendMail); + } + + /** + * Replace shipping method + * + * @param stdClass $shipping Shipping data + * @param string $content Template content + * + * @return string + * + * @deprecated 2.0.7 + * + * @see Redshop\Shipping\Tag::replaceShippingMethod() + */ + public function replaceShippingMethod($shipping, $content = '') + { + return Redshop\Shipping\Tag::replaceShippingMethod($shipping, $content); + } + + /** + * Method for replace cart item + * + * @param string $data Template Html + * @param array $cart Cart data + * @param boolean $replaceButton Is replace button? + * @param integer $quotationMode Is in Quotation Mode + * + * @return string + * @throws Exception + * + * @deprecated 2.1.0 + * @see RedshopHelperCartTag::replaceCartItem + */ + public function replaceCartItem($data, $cart = array(), $replaceButton, $quotationMode = 0) + { + return RedshopHelperCartTag::replaceCartItem($data, $cart, $replaceButton, $quotationMode); + } + + /** + * replace Order Items + * + * @param string $data template + * @param array $rowitem Order item list + * @param boolean $sendMail is send mail + * + * @return array + * @throws Exception + * + * @deprecated 2.1.0 Use Redshop\Order\Item::replaceItems + * @see Redshop\Order\Item::replaceItems + */ + public function repalceOrderItems($data, $rowitem = array(), $sendMail = false) + { + return Redshop\Order\Item::replaceItems($data, $rowitem, $sendMail); + } + + /** + * Method for replace label in template + * + * @param string $data Template content + * + * @return string + * + * @deprecated 2.1.0 Redshop\Cart\Render\Label::replace + * @see Redshop\Cart\Render\Label::replace + */ + public function replaceLabel($data) + { + return Redshop\Cart\Render\Label::replace($data); + } + + /** + * APPLY_VAT_ON_DISCOUNT = When the discount is a "fixed amount" the + * final price may vary, depending on if the discount affects "the price+VAT" + * or just "the price". This CONSTANT will define if the discounts needs to + * be applied BEFORE or AFTER the VAT is applied to the product price. + * + * @param array $cart Cart data + * @param integer $shipping Cart data + * @param integer $userId Current user ID + * + * @return array + * @throws \Exception + * + * @deprecated 2.1.0 + * @see \Redshop\Cart\Helper::calculation() + */ + public function calculation($cart, $shipping = 0, $userId = 0) + { + return \Redshop\Cart\Helper::calculation($cart, $userId); + } + + /** + * Get cart module calculate + * + * @param array $redArray Cart data + * + * @return float + * @throws Exception + * + * @deprecated 2.1.0 + * @see \Redshop\Cart\Module::calculate() + */ + public function GetCartModuleCalc($redArray) + { + return Redshop\Cart\Module::calculate($redArray); + } + + public function replaceTemplate($cart, $cart_data, $checkout = 1) + { + JPluginHelper::importPlugin('redshop_checkout'); + JPluginHelper::importPlugin('redshop_shipping'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $dispatcher->trigger('onBeforeReplaceTemplateCart', array(&$cart, &$cart_data, $checkout)); + + if (strpos($cart_data, "{product_loop_start}") !== false && strpos($cart_data, "{product_loop_end}") !== false) + { + $template_sdata = explode('{product_loop_start}', $cart_data); + $template_start = $template_sdata[0]; + $template_edata = explode('{product_loop_end}', $template_sdata[1]); + $template_end = $template_edata[1]; + $template_middle = $template_edata[0]; + $template_middle = RedshopHelperCartTag::replaceCartItem($template_middle, $cart, 1, Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE')); + $cart_data = $template_start . $template_middle . $template_end; + } + + $cart_data = Redshop\Cart\Render\Label::replace($cart_data); + $total = $cart ['total']; + $subtotal_excl_vat = $cart ['subtotal_excl_vat']; + $product_subtotal = $cart ['product_subtotal']; + $product_subtotal_excl_vat = $cart ['product_subtotal_excl_vat']; + $subtotal = $cart ['subtotal']; + $discount_ex_vat = $cart['discount_ex_vat']; + $discount_total = $cart['voucher_discount'] + $cart['coupon_discount']; + $discount_amount = $cart ["cart_discount"]; + $tax = $cart ['tax']; + $sub_total_vat = $cart ['sub_total_vat']; + $shipping = $cart ['shipping']; + $shippingVat = $cart ['shipping_tax']; + + if ($total <= 0) + { + $total = 0; + } + + if (isset($cart ['discount_type']) === false) + { + $cart ['discount_type'] = 0; + } + + $tmp_discount = $discount_total; + $discount_total = RedshopHelperProductPrice::formattedPrice($discount_total + $discount_amount, true); + + if (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) + { + if (strpos($cart_data, '{product_subtotal_lbl}') !== false) + { + $cart_data = str_replace("{product_subtotal_lbl}", JText::_('COM_REDSHOP_PRODUCT_SUBTOTAL_LBL'), $cart_data); + } + + if (strpos($cart_data, '{product_subtotal_excl_vat_lbl}') !== false) + { + $cart_data = str_replace("{product_subtotal_excl_vat_lbl}", JText::_('COM_REDSHOP_PRODUCT_SUBTOTAL_EXCL_LBL'), $cart_data); + } + + if (strpos($cart_data, '{shipping_with_vat_lbl}') !== false) + { + $cart_data = str_replace("{shipping_with_vat_lbl}", JText::_('COM_REDSHOP_SHIPPING_WITH_VAT_LBL'), $cart_data); + } + + if (strpos($cart_data, '{shipping_excl_vat_lbl}') !== false) + { + $cart_data = str_replace("{shipping_excl_vat_lbl}", JText::_('COM_REDSHOP_SHIPPING_EXCL_VAT_LBL'), $cart_data); + } + + if (strpos($cart_data, '{product_price_excl_lbl}') !== false) + { + $cart_data = str_replace("{product_price_excl_lbl}", JText::_('COM_REDSHOP_PRODUCT_PRICE_EXCL_LBL'), $cart_data); + } + + $cart_data = str_replace("{total}", "" . RedshopHelperProductPrice::formattedPrice($total, true) . "", $cart_data); + $cart_data = str_replace("{total_excl_vat}", "" . RedshopHelperProductPrice::formattedPrice($subtotal_excl_vat) . "", $cart_data); + + $chktag = \Redshop\Template\Helper::isApplyVat($cart_data); + + if (!empty($chktag)) + { + $cart_data = str_replace("{subtotal}", RedshopHelperProductPrice::formattedPrice($subtotal), $cart_data); + $cart_data = str_replace("{product_subtotal}", RedshopHelperProductPrice::formattedPrice($product_subtotal), $cart_data); + } + else + { + $cart_data = str_replace("{subtotal}", RedshopHelperProductPrice::formattedPrice($subtotal_excl_vat), $cart_data); + $cart_data = str_replace("{product_subtotal}", RedshopHelperProductPrice::formattedPrice($product_subtotal_excl_vat), $cart_data); + } + + if ((strpos($cart_data, "{discount_denotation}") !== false || strpos($cart_data, "{shipping_denotation}") !== false) && ($discount_total != 0 || $shipping != 0)) + { + $cart_data = str_replace("{denotation_label}", JText::_('COM_REDSHOP_DENOTATION_TXT'), $cart_data); + } + else + { + $cart_data = str_replace("{denotation_label}", "", $cart_data); + } + + if (strpos($cart_data, "{discount_excl_vat}") !== false) + { + $cart_data = str_replace("{discount_denotation}", "*", $cart_data); + } + else + { + $cart_data = str_replace("{discount_denotation}", "", $cart_data); + } + + $cart_data = str_replace("{subtotal_excl_vat}", RedshopHelperProductPrice::formattedPrice($subtotal_excl_vat), $cart_data); + $cart_data = str_replace("{product_subtotal_excl_vat}", RedshopHelperProductPrice::formattedPrice($product_subtotal_excl_vat), $cart_data); + $cart_data = str_replace("{sub_total_vat}", RedshopHelperProductPrice::formattedPrice($sub_total_vat), $cart_data); + $cart_data = str_replace("{discount_excl_vat}", RedshopHelperProductPrice::formattedPrice($discount_ex_vat), $cart_data); + + $rep = true; + + if (!$checkout) + { + if (!Redshop::getConfig()->get('SHOW_SHIPPING_IN_CART') || !Redshop::getConfig()->get('SHIPPING_METHOD_ENABLE')) + { + $rep = false; + } + } + else + { + if (!Redshop::getConfig()->get('SHIPPING_METHOD_ENABLE')) + { + $rep = false; + } + } + + if (!empty($rep)) + { + if (strpos($cart_data, "{shipping_excl_vat}") !== false) + { + $cart_data = str_replace("{shipping_denotation}", "*", $cart_data); + } + else + { + $cart_data = str_replace("{shipping_denotation}", "", $cart_data); + } + + $cart_data = str_replace("{order_shipping}", RedshopHelperProductPrice::formattedPrice($shipping, true), $cart_data); + $cart_data = str_replace("{shipping_excl_vat}", "" . RedshopHelperProductPrice::formattedPrice($shipping - $cart['shipping_tax'], true) . "", $cart_data); + $cart_data = str_replace("{shipping_lbl}", JText::_('COM_REDSHOP_CHECKOUT_SHIPPING_LBL'), $cart_data); + $cart_data = str_replace("{shipping}", "" . RedshopHelperProductPrice::formattedPrice($shipping, true) . "", $cart_data); + $cart_data = str_replace("{tax_with_shipping_lbl}", JText::_('COM_REDSHOP_CHECKOUT_SHIPPING_LBL'), $cart_data); + $cart_data = str_replace("{vat_shipping}", RedshopHelperProductPrice::formattedPrice($shippingVat), $cart_data); + } + else + { + $cart_data = str_replace("{order_shipping}", '', $cart_data); + $cart_data = str_replace("{shipping_excl_vat}", '', $cart_data); + $cart_data = str_replace("{shipping_lbl}", '', $cart_data); + $cart_data = str_replace("{shipping}", '', $cart_data); + $cart_data = str_replace("{tax_with_shipping_lbl}", '', $cart_data); + $cart_data = str_replace("{vat_shipping}", '', $cart_data); + $cart_data = str_replace("{shipping_denotation}", "", $cart_data); + } + } + else + { + $cart_data = str_replace("{total}", "", $cart_data); + $cart_data = str_replace("{shipping_excl_vat}", "", $cart_data); + $cart_data = str_replace("{order_shipping}", "", $cart_data); + $cart_data = str_replace("{shipping_lbl}", '', $cart_data); + $cart_data = str_replace("{shipping}", "", $cart_data); + $cart_data = str_replace("{subtotal}", "", $cart_data); + $cart_data = str_replace("{tax_with_shipping_lbl}", '', $cart_data); + $cart_data = str_replace("{vat_shipping}", '', $cart_data); + $cart_data = str_replace("{subtotal_excl_vat}", "", $cart_data); + $cart_data = str_replace("{shipping_excl_vat}", "", $cart_data); + $cart_data = str_replace("{subtotal_excl_vat}", "", $cart_data); + $cart_data = str_replace("{product_subtotal_excl_vat}", "", $cart_data); + $cart_data = str_replace("{product_subtotal}", "", $cart_data); + $cart_data = str_replace("{sub_total_vat}", "", $cart_data); + $cart_data = str_replace("{discount_excl_vat}", "", $cart_data); + $cart_data = str_replace("{discount_denotation}", "", $cart_data); + $cart_data = str_replace("{shipping_denotation}", "", $cart_data); + $cart_data = str_replace("{denotation_label}", "", $cart_data); + $cart_data = str_replace("{total_excl_vat}", "", $cart_data); + } + + if (!Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT')) + { + $total_for_discount = $subtotal_excl_vat; + } + else + { + $total_for_discount = $subtotal; + } + + $cart_data = RedshopHelperCartTag::replaceDiscount($cart_data, $discount_amount + $tmp_discount, $total_for_discount, Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE')); + + if ($checkout) + { + $cart_data = RedshopHelperPayment::replaceConditionTag($cart_data, $cart['payment_amount'], 0, $cart['payment_oprand']); + } + else + { + $paymentOprand = (isset($cart['payment_oprand'])) ? $cart['payment_oprand'] : '-'; + $cart_data = RedshopHelperPayment::replaceConditionTag($cart_data, 0, 1, $paymentOprand); + } + + $cart_data = RedshopHelperCartTag::replaceTax( + $cart_data, + $tax + $shippingVat, + $discount_amount + $tmp_discount, + 0, + Redshop::getConfig()->getBool('DEFAULT_QUOTATION_MODE') + ); + + $dispatcher->trigger('onAfterReplaceTemplateCart', array(&$cart_data, $checkout)); + + return $cart_data; + } + + /** + * Method for replace template order + * + * @param object $row Order data. + * @param string $ReceiptTemplate Template content. + * @param boolean $sendMail In send mail + * + * @return string + * + * @throws Exception + * + * @deprecated 2.1.0 + * @see Redshop\Order\Template::replaceTemplate + */ + public function replaceOrderTemplate($row, $ReceiptTemplate, $sendMail = false) + { + return Redshop\Order\Template::replaceTemplate($row, $ReceiptTemplate, $sendMail); + } + + /** + * Method for render cart. + * + * @param array $cart Cart data + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperCart::generateCartOutput() instead. + */ + public function makeCart_output($cart) + { + return RedshopHelperCart::generateCartOutput($cart); + } + + /** + * Method for get parameters of module cart + * + * @return Registry + * + * @since 2.1.0 + * @see \Redshop\Cart\Module::getParams() + */ + public function GetCartParameters() + { + return \Redshop\Cart\Module::getParams(); + } + + /** + * Method for modify cart data. + * + * @param array $cartArr Cart data. + * @param integer $user_id User ID + * + * @return array + * + * @deprecated 2.1.0 + * @see \Redshop\Cart\Cart::modify + */ + public function modifyCart($cartArr, $user_id) + { + return \Redshop\Cart\Cart::modify($cartArr, $user_id); + } + + public function replaceShippingBoxTemplate($box_template_desc = "", $shipping_box_post_id = 0) + { + // Get shipping boxes HTML + $shippingBoxes = RedshopHelperShipping::getShippingBox(); + + $box_template_desc = str_replace("{shipping_box_heading}", JText::_('COM_REDSHOP_SHIPPING_BOXES'), $box_template_desc); + + if (count($shippingBoxes) == 1 || (count($shippingBoxes) > 0 && $shipping_box_post_id == 0)) + { + $shipping_box_post_id = $shippingBoxes[0]->shipping_box_id; + } + + $shipping_box_list = JText::_('COM_REDSHOP_NO_SHIPPING_BOX'); + + if (count($shippingBoxes) > 0) + { + $shipping_box_list = ""; + + for ($i = 0, $in = count($shippingBoxes); $i < $in; $i++) + { + $shipping_box_id = $shippingBoxes[$i]->shipping_box_id; + + // Previous priority + if ($i > 0) + { + $shipping_box_priority_pre = $shippingBoxes[$i - 1]->shipping_box_priority; + } + + // Current priority + $shipping_box_priority = $shippingBoxes[$i]->shipping_box_priority; + $checked = ($shipping_box_post_id == $shipping_box_id) ? "checked='checked'" : ""; + + if ($i == 0 || ($shipping_box_priority == $shipping_box_priority_pre)) + { + $shipping_box_list .= "
    "; + } + } + } + + $box_template_desc = str_replace("{shipping_box_list}", $shipping_box_list, $box_template_desc); + $style = 'none'; + + $shippingmethod = RedshopHelperOrder::getShippingMethodInfo(); + + for ($s = 0, $sn = count($shippingmethod); $s < $sn; $s++) + { + if ($shippingmethod[$s]->element == 'bring' || $shippingmethod[$s]->element == 'ups' || $shippingmethod[$s]->element == 'uspsv4') + { + $style = 'block'; + } + } + + if (count($shippingBoxes) <= 1 || count($shippingmethod) <= 1) + { + $style = 'none'; + } + + $box_template_desc = "
    " . $box_template_desc . "
    "; + + return $box_template_desc; + } + + public function replaceShippingTemplate($template_desc = "", $shipping_rate_id = 0, $shipping_box_post_id = 0, $user_id = 0, $users_info_id = 0, $ordertotal = 0, $order_subtotal = 0, $post = array()) + { + $shippingmethod = RedshopHelperOrder::getShippingMethodInfo(); + $rateExist = 0; + $d = array(); + $d['user_id'] = $user_id; + $d['users_info_id'] = $users_info_id; + $d['shipping_box_id'] = $shipping_box_post_id; + $d['ordertotal'] = $ordertotal; + $d['order_subtotal'] = $order_subtotal; + $d['post'] = $post; + $template_desc = str_replace("{shipping_heading}", JText::_('COM_REDSHOP_SHIPPING_METHOD'), $template_desc); + $extrafield_total = ""; + + if (strpos($template_desc, "{shipping_method_loop_start}") !== false && strpos($template_desc, "{shipping_method_loop_end}") !== false) + { + $template1 = explode("{shipping_method_loop_start}", $template_desc); + $template1 = explode("{shipping_method_loop_end}", $template1[1]); + $template_middle = $template1[0]; + + $template_rate_middle = ""; + + if (strpos($template_middle, "{shipping_rate_loop_start}") !== false && strpos($template_middle, "{shipping_rate_loop_end}") !== false) + { + $template1 = explode("{shipping_rate_loop_start}", $template_middle); + $template1 = explode("{shipping_rate_loop_end}", $template1[1]); + $template_rate_middle = $template1[0]; + } + + $rate_data = ""; + + if ($template_middle != "" && count($shippingmethod) > 0) + { + JPluginHelper::importPlugin('redshop_shipping'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $shippingrate = $dispatcher->trigger('onListRates', array(&$d)); + + for ($s = 0, $sn = count($shippingmethod); $s < $sn; $s++) + { + if (isset($shippingrate[$s]) === false) + { + continue; + } + + $rate = $shippingrate[$s]; + + if (!empty($rate)) + { + if (empty($shipping_rate_id)) + { + $shipping_rate_id = $rate[0]->value; + } + + $rs = $shippingmethod[$s]; + $classname = $rs->element; + $rate_data .= $template_middle; + $rate_data = str_replace("{shipping_method_title}", JText::_($rs->name), $rate_data); + + if ($template_rate_middle != "") + { + $data = ""; + $mainlocation = ""; + + for ($i = 0, $in = count($rate); $i < $in; $i++) + { + $checked = ''; + $data .= $template_rate_middle; + + $displayrate = (trim($rate[$i]->rate) > 0) ? " (" . RedshopHelperProductPrice::formattedPrice((double) trim($rate[$i]->rate)) . " )" : ""; + + if ((isset($rate[$i]->checked) && $rate[$i]->checked) || $rateExist == 0) + { + $checked = "checked"; + } + + if ($checked == "checked") + { + $shipping_rate_id = $rate[$i]->value; + } + + $shipping_rate_name = ''; + + $shipping_rate_short_desc = ''; + + if (isset($rate[$i]->shortdesc) === true) + { + $shipping_rate_short_desc = html_entity_decode($rate[$i]->shortdesc); + } + + $shipping_rate_desc = ''; + + if (isset($rate[$i]->longdesc) === true) + { + $shipping_rate_desc = html_entity_decode($rate[$i]->longdesc); + } + + $rateExist++; + $data = str_replace("{shipping_rate_name}", $shipping_rate_name, $data); + $data = str_replace("{shipping_rate_short_desc}", $shipping_rate_short_desc, $data); + $data = str_replace("{shipping_rate_desc}", $shipping_rate_desc, $data); + $data = str_replace("{shipping_rate}", $displayrate, $data); + + if (strpos($data, "{shipping_location}") !== false) + { + $shippinglocation = RedshopHelperOrder::getShippingLocationInfo($rate[$i]->text); + + for ($k = 0, $kn = count($shippinglocation); $k < $kn; $k++) + { + if ($shippinglocation[$k] != '') + { + $mainlocation = $shippinglocation[$k]->shipping_location_info; + } + } + + $data = str_replace("{shipping_location}", $mainlocation, $data); + } + + $dispatcher->trigger('onReplaceShippingTemplate', array($d, &$data, $classname, $checked)); + + $data = str_replace("{gls_shipping_location}", "", $data); + } + + $rate_data = str_replace("{shipping_rate_loop_start}", "", $rate_data); + $rate_data = str_replace("{shipping_rate_loop_end}", "", $rate_data); + $rate_data = str_replace($template_rate_middle, $data, $rate_data); + } + } + + if (strpos($rate_data, "{shipping_extrafields}") !== false) + { + $paymentparams_new = new JRegistry($shippingmethod[$s]->params); + $extrafield_payment = $paymentparams_new->get('extrafield_shipping'); + + $extrafield_hidden = ""; + + if (!empty($extrafield_payment)) + { + $countExtrafield = count($extrafield_payment); + + for ($ui = 0; $ui < $countExtrafield; $ui++) + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($extrafield_payment[$ui], 19, '', 0, 0, 0); + $extrafield_total .= $productUserFields[0] . " " . $productUserFields[1] . "
    "; + $extrafield_hidden .= ""; + } + + $rate_data = str_replace("{shipping_extrafields}", "
    " . $extrafield_total . "
    ", $rate_data); + } + else + { + $rate_data = str_replace("{shipping_extrafields}", "", $rate_data); + } + } + } + } + + $template_desc = str_replace("{shipping_method_loop_start}", "", $template_desc); + $template_desc = str_replace("{shipping_method_loop_end}", "", $template_desc); + $template_desc = str_replace($template_middle, $rate_data, $template_desc); + } + + if ($rateExist == 0) + { + $template_desc = "
    "; + } + + JPluginHelper::importPlugin('redshop_checkout'); + JDispatcher::getInstance()->trigger('onRenderShippingMethod', array(&$template_desc)); + + $returnarr = array("template_desc" => $template_desc, "shipping_rate_id" => $shipping_rate_id); + + return $returnarr; + } + + /** + * Display credit card form based on payment method + * + * @param integer $payment_method_id Payment Method ID for which form needs to be prepare + * + * @return string Credit Card form display data in HTML + */ + public function replaceCreditCardInformation($payment_method_id = 0) + { + if (empty($payment_method_id)) + { + JFactory::getApplication()->enqueueMessage( + JText::_('COM_REDSHOP_PAYMENT_NO_CREDIT_CARDS_PLUGIN_LIST_FOUND'), + 'error' + ); + + return ''; + } + + $paymentmethod = RedshopHelperOrder::getPaymentMethodInfo($payment_method_id); + $paymentmethod = $paymentmethod[0]; + + $cardinfo = ""; + + if (file_exists(JPATH_SITE . '/plugins/redshop_payment/' . $paymentmethod->element . '/' . $paymentmethod->element . '.php')) + { + $paymentparams = new Registry($paymentmethod->params); + $acceptedCredictCard = $paymentparams->get("accepted_credict_card", array()); + + if ($paymentparams->get('is_creditcard', 0) + && !empty($acceptedCredictCard)) + { + $cardinfo = RedshopLayoutHelper::render( + 'order.payment.creditcard', + array( + 'pluginParams' => $paymentparams, + ) + ); + } + else + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_PAYMENT_CREDIT_CARDS_NOT_FOUND'), 'error'); + } + } + + return $cardinfo; + } + + /** + * Replace Payment Methods + * + * @param string $templateDesc Template Content + * @param integer $paymentMethodId Payment Method Id + * @param integer $isCompany Is Company? + * @param integer $eanNumber Ean Number + * + * @return string + * + * @since 2.1.0 + * + * @throws Exception + */ + public function replacePaymentTemplate($templateDesc = "", $paymentMethodId = 0, $isCompany = 0, $eanNumber = 0) + { + $userId = JFactory::getUser()->id; + + $paymentMethods = RedshopHelperPayment::info(); + + // Get common payment methods of product in this cart + $commonPaymentMethods = RedshopHelperPayment::getPaymentMethodInCheckOut($paymentMethods); + + if (!empty($commonPaymentMethods)) + { + $templateDesc = str_replace("{payment_heading}", JText::_('COM_REDSHOP_PAYMENT_METHOD'), $templateDesc); + + if (strpos($templateDesc, "{split_payment}") !== false) + { + $templateDesc = str_replace("{split_payment}", "", $templateDesc); + } + + if (strpos($templateDesc, "{payment_loop_start}") !== false && strpos($templateDesc, "{payment_loop_end}") !== false) + { + $template1 = explode("{payment_loop_start}", $templateDesc); + $template1 = explode("{payment_loop_end}", $template1[1]); + $templateMiddle = $template1[0]; + $shopperGroupId = RedshopHelperUser::getShopperGroup($userId); + $paymentDisplay = ""; + $hasCreditCard = false; + + // Filter payment gateways array for shopperGroups + $paymentMethods = array_filter( + $paymentMethods, + function ($paymentMethod) use ($shopperGroupId) + { + $paymentFilePath = JPATH_SITE + . '/plugins/redshop_payment/' + . $paymentMethod->name . '/' . $paymentMethod->name . '.php'; + + if (!JFile::exists($paymentFilePath)) + { + return false; + } + + $shopperGroups = $paymentMethod->params->get('shopper_group_id', array()); + + if (!is_array($shopperGroups)) + { + $shopperGroups = array($shopperGroups); + } + + $shopperGroups = ArrayHelper::toInteger($shopperGroups); + + if (in_array((int) $shopperGroupId, $shopperGroups) || (!isset($shopperGroups[0]) || 0 == $shopperGroups[0])) + { + return true; + } + + return false; + } + ); + + $totalPaymentMethod = count($paymentMethods); + + if ($totalPaymentMethod > 0) + { + foreach ($paymentMethods as $index => $oneMethod) + { + if (in_array($oneMethod->name, $commonPaymentMethods)) + { + $cardInformation = ""; + $displayPayment = ""; + include_once JPATH_SITE . '/plugins/redshop_payment/' . $oneMethod->name . '/' . $oneMethod->name . '.php'; + + $lang = JFactory::getLanguage(); + $lang->load('plg_redshop_payment_' . $oneMethod->name, JPATH_ADMINISTRATOR, $lang->getTag(), true); + + $privatePerson = $oneMethod->params->get('private_person', ''); + $business = $oneMethod->params->get('business', ''); + $isCreditCard = (boolean) $oneMethod->params->get('is_creditcard', 0); + $checked = $paymentMethodId === $oneMethod->name || $totalPaymentMethod <= 1; + + $paymentRadioOutput = RedshopLayoutHelper::render( + 'checkout.payment_radio', + array( + 'oneMethod' => $oneMethod, + 'paymentMethodId' => $paymentMethodId, + 'index' => $index, + 'totalPaymentMethod' => $totalPaymentMethod, + 'checked' => $checked, + 'isCompany' => $isCompany, + 'eanNumber' => $eanNumber + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + + $isSubscription = false; + + // Check for bank transfer payment type plugin - `rs_payment_banktransfer` suffixed + $isBankTransferPaymentType = RedshopHelperPayment::isPaymentType($oneMethod->name); + + if ($oneMethod->name == 'rs_payment_eantransfer' || $isBankTransferPaymentType) + { + if ($isCompany == 0 && $privatePerson == 1) + { + $displayPayment = $paymentRadioOutput; + } + else + { + if ($isCompany == 1 && $business == 1 && + ($oneMethod->name != 'rs_payment_eantransfer' + || ($oneMethod->name == 'rs_payment_eantransfer' && $eanNumber != 0))) + { + $displayPayment = $paymentRadioOutput; + } + } + } + elseif ($isSubscription) + { + $displayPayment = '
    '; + + $displayPayment .= '
    ' + . JText::_('COM_REDSHOP_SUBSCRIPTION_PLAN') + . '' . $this->getSubscriptionPlans() + . '
    '; + } + else + { + $displayPayment = $paymentRadioOutput; + } + + if ($isCreditCard) + { + $cardInformation = '
    '; + + $cart = JFactory::getSession()->get('cart'); + + if ($checked && Redshop::getConfig()->get('ONESTEP_CHECKOUT_ENABLE') && $cart['total'] > 0) + { + $cardInformation .= $this->replaceCreditCardInformation($oneMethod->name); + } + + $cardInformation .= '
    '; + + $hasCreditCard = true; + } + + $templateMiddle1 = str_replace( + '
    ', + '
    ', + $templateMiddle + ); + + $paymentDisplay .= $templateMiddle1; + $paymentDisplay = str_replace("{payment_method_name}", $displayPayment, $paymentDisplay); + $paymentDisplay = str_replace("{creditcard_information}", $cardInformation, $paymentDisplay); + + if (strpos($paymentDisplay, "{payment_extrafields}") !== false) + { + $paymentExtraFieldsHtml = ''; + + if ($checked) + { + $layoutFile = new JLayoutFile('order.payment.extrafields'); + + // Append plugin JLayout path to improve view based on plugin if needed. + $layoutFile->addIncludePath(JPATH_SITE . '/plugins/' . $oneMethod->type . '/' . $oneMethod->name . '/layouts'); + $paymentExtraFieldsHtml = $layoutFile->render(array('plugin' => $oneMethod)); + } + + $paymentDisplay = str_replace( + '{payment_extrafields}', + '
    ' . $paymentExtraFieldsHtml . '
    ', + $paymentDisplay + ); + } + } + } + } + + $templateDesc = str_replace("{payment_loop_start}", "", $templateDesc); + $templateDesc = str_replace("{payment_loop_end}", "", $templateDesc); + $templateDesc = str_replace($templateMiddle, $paymentDisplay, $templateDesc); + + if (count($paymentMethods) == 1 && !$hasCreditCard) + { + $templateDesc = "
    " . $templateDesc . "
    "; + } + } + } + else + { + //clear + $templateDesc = str_replace("{creditcard_information}", "", $templateDesc); + $templateDesc = str_replace("{payment_loop_start}", "", $templateDesc); + $templateDesc = str_replace("{payment_loop_end}", "", $templateDesc); + //new template + $templateDesc = str_replace("{payment_heading}", JText::_('COM_REDSHOP_PAYMENT_METHOD_CONFLICT'), $templateDesc); + $templateDesc = str_replace( + "{payment_method_name}", + RedshopHelperPayment::displayPaymentMethodInCheckOut($paymentMethods), + $templateDesc + ); + } + + return $templateDesc; + } + + public function replaceTermsConditions($template_desc = "", $Itemid = 1) + { + if (strpos($template_desc, "{terms_and_conditions") !== false) + { + $user = JFactory::getUser(); + $session = JFactory::getSession(); + $auth = $session->get('auth'); + $list = array(); + + if ($user->id) + { + $query = "SELECT u.* FROM " . $this->_table_prefix . "users_info AS u " + . "WHERE u.user_id='" . $user->id . "' " + . "AND address_type='BT' "; + $this->_db->setQuery($query); + $list = $this->_db->loadObject(); + } + elseif (isset($auth['users_info_id']) && $auth['users_info_id'] > 0) + { + $query = "SELECT u.* FROM " . $this->_table_prefix . "users_info AS u " + . "WHERE u.users_info_id='" . $auth['users_info_id'] . "' " + . "AND address_type='BT' "; + $this->_db->setQuery($query); + $list = $this->_db->loadObject(); + } + + $terms_left_final = ""; + + if (strpos($template_desc, "{terms_and_conditions:") !== false && strpos($template_desc, "}") !== false) + { + $terms_left_one = explode("{terms_and_conditions:", $template_desc); + $terms_left_two = explode("}", $terms_left_one[1]); + $terms_left_three = explode(":", $terms_left_two[0]); + $terms_left_final = $terms_left_three[0]; + } + + $finaltag = ($terms_left_final != "") ? "{terms_and_conditions:$terms_left_final}" : "{terms_and_conditions}"; + $termscondition = ''; + + if (Redshop::getConfig()->get('SHOW_TERMS_AND_CONDITIONS') == 0 || (Redshop::getConfig()->get('SHOW_TERMS_AND_CONDITIONS') == 1 && ((count($list) > 0 && $list->accept_terms_conditions == 0) || count($list) == 0))) + { + $finalwidth = "500"; + $finalheight = "450"; + + if ($terms_left_final != "") + { + $dimension = explode(" ", $terms_left_final); + + if (count($dimension) > 0) + { + if (strpos($dimension[0], "width") !== false) + { + $width = explode("width=", $dimension[0]); + $finalwidth = (isset($width[1])) ? $width[1] : "500"; + } + else + { + $height = explode("height=", $dimension[0]); + $finalheight = (isset($height[1])) ? $height[0] : "450"; + } + + if (strpos($dimension[1], "height") !== false) + { + $height = explode("height=", $dimension[1]); + $finalheight = (isset($height[1])) ? $height[1] : "450"; + } + else + { + $width = explode("width=", $dimension[1]); + $finalwidth = (isset($width[1])) ? $width[1] : "500"; + } + } + } + + $url = JURI::base(); + $article_link = $url . "index.php?option=com_content&view=article&id=" . Redshop::getConfig()->get('TERMS_ARTICLE_ID') . "&Itemid=" . $Itemid . "&tmpl=component"; + $termscondition = ''; + } + + $template_desc = str_replace($finaltag, $termscondition, $template_desc); + } + + return $template_desc; + } + + public function replaceNewsletterSubscription($template_desc = "", $onchange = 0) + { + $db = JFactory::getDbo(); + + if (strpos($template_desc, "{newsletter_signup_chk}") !== false) + { + $Itemid = $this->input->get('Itemid'); + $newslettersignup = ""; + $newslettersignup_lbl = ""; + $link = ""; + + if (Redshop::getConfig()->get('DEFAULT_NEWSLETTER') != 0) + { + $user = JFactory::getUser(); + $query = "SELECT subscription_id FROM " . $this->_table_prefix . "newsletter_subscription" + . " WHERE user_id=" . (int) $user->id . " AND email=" . $db->quote($user->email); + $this->_db->setQuery($query); + $subscribe = $this->_db->loadResult(); + + if ($subscribe == 0) + { + if ($onchange) + { + $link = " onchange='window.location.href=\"" . JURI::root() . "index.php?option=com_redshop&view=account&task=newsletterSubscribe&tmpl=component&Itemid=" . $Itemid . "\""; + + } + + $newslettersignup = ""; + $newslettersignup_lbl = JText::_('COM_REDSHOP_SIGN_UP_FOR_NEWSLETTER'); + } + } + + $template_desc = str_replace("{newsletter_signup_chk}", $newslettersignup, $template_desc); + $template_desc = str_replace("{newsletter_signup_lbl}", $newslettersignup_lbl, $template_desc); + $template_desc = str_replace("{newsletter_unsubscribe}", "", $template_desc); + } + + return $template_desc; + } + + public function getCartProductPrice($product_id, $cart) + { + $productArr = array(); + $affected_product_idArr = array(); + $idx = $cart['idx']; + $product_price = 0; + $product_price_excl_vat = 0; + $quantity = 0; + $product_idArr = explode(',', $product_id); + $product_idArr = Joomla\Utilities\ArrayHelper::toInteger($product_idArr); + + for ($v = 0; $v < $idx; $v++) + { + if (in_array($cart[$v]['product_id'], $product_idArr) || $this->_globalvoucher) + { + // Set Quantity based on discount type - i.e Multiple or Single. + $p_quantity = (Redshop::getConfig()->get('DISCOUNT_TYPE') == 4) ? $cart[$v]['quantity'] : 1; + + $product_price += ($cart[$v]['product_price'] * $p_quantity); + $product_price_excl_vat += $cart[$v]['product_price_excl_vat'] * $p_quantity; + $affected_product_idArr[] = $cart[$v]['product_id']; + + $quantity += $p_quantity; + } + } + + $productArr['product_ids'] = implode(',', $affected_product_idArr); + $productArr['product_price'] = $product_price; + $productArr['product_price_excl_vat'] = $product_price_excl_vat; + $productArr['product_quantity'] = $p_quantity; + + return $productArr; + } + + /** + * Method for apply coupon to cart. + * + * @param array $cartData Cart data + * + * @return array|bool + * + * @deprecated 2.0.7 + * + * @see RedshopHelperCartDiscount::applyCoupon() + * + * @throws Exception + */ + public function coupon($cartData = array()) + { + return RedshopHelperCartDiscount::applyCoupon($cartData); + } + + /** + * Method for apply voucher to cart. + * + * @param array $cartData Cart data + * + * @return array|bool + * + * @deprecated 2.0.7 + * + * @throws Exception + * + * @see RedshopHelperCartDiscount::applyVoucher() + */ + public function voucher($cartData = array()) + { + return RedshopHelperCartDiscount::applyVoucher($cartData); + } + + /** + * Re-calculate the Voucher/Coupon value when the product is already discount + * + * @param float $value Voucher/Coupon value + * @param array $cart Cart array + * + * @return float Voucher/Coupon value + * + * @deprecated 2.1.0 + * + * @see RedshopHelperDiscount::calculateAlreadyDiscount() + */ + public function calcAlreadyDiscount($value, $cart) + { + return RedshopHelperDiscount::calculateAlreadyDiscount($value, $cart); + } + + public function rs_multi_array_key_exists($needle, $haystack) + { + foreach ($haystack as $key => $value) + { + if ($needle === $key) + { + return true; + } + + if (is_array($value)) + { + if ($this->rs_multi_array_key_exists($needle, $value)) + { + return true; + } + } + } + + return false; + } + + public function rs_recursiveArraySearch($haystack, $needle, $index = null) + { + $aIt = new RecursiveArrayIterator($haystack); + $it = new RecursiveIteratorIterator($aIt); + + while ($it->valid()) + { + if (((isset($index) AND ($it->key() == $index)) OR (!isset($index))) AND ($it->current() == $needle)) + { + return true; + } + + $it->next(); + } + + return false; + } + + /** + * Method for calculate discount. + * + * @param string $type Type of discount + * @param array $types List of type + * + * @return float + * + * @deprecated 2.1.0 + * + * @see RedshopHelperDiscount::calculate() + */ + public function calculateDiscount($type, $types) + { + return RedshopHelperDiscount::calculate($type, $types); + } + + public function getVoucherData($voucher_code) + { + $db = JFactory::getDbo(); + + $user = JFactory::getUser(); + $voucher = array(); + $current_time = JFactory::getDate()->toSql(); + $globalVouchers = $this->globalvoucher($voucher_code); + + if ($this->_globalvoucher != 1) + { + if ($user->id) + { + $subQuery = $db->getQuery(true) + ->select('GROUP_CONCAT(DISTINCT pv.product_id SEPARATOR ' . $db->quote(', ') . ') AS product_id') + ->from($db->qn('#__redshop_product_voucher_xref', 'pv')) + ->where('v.id = pv.voucher_id'); + + $query = $db->getQuery(true) + ->select( + array('vt.transaction_voucher_id', 'vt.amount AS total', 'vt.product_id', 'v.*', '(' . $subQuery . ') AS nproduct') + ) + ->from($db->qn('#__redshop_voucher', 'v')) + ->leftJoin($db->qn('#__redshop_product_voucher_transaction', 'vt') . ' ON vt.voucher_id = v.id') + ->where('vt.voucher_code = ' . $db->quote($voucher_code)) + ->where('vt.amount > 0') + ->where('v.type = ' . $db->quote('Total')) + ->where('v.published = 1') + ->where( + '(' + . '(' . $db->qn('v.start_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('v.start_date') . ' <= ' . $db->quote($current_time) . ')' + . ' AND (' . $db->qn('v.end_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('v.end_date') . ' >= ' . $db->quote($current_time) . ')' + . ')' + ) + ->where('vt.user_id = ' . (int) $user->id) + ->order('vt.transaction_voucher_id DESC'); + + $voucher = $db->setQuery($query)->loadObject(); + + if (count($voucher) > 0) + { + return false; + } + } + + if (count($voucher) <= 0) + { + $subQuery = $db->getQuery(true) + ->select('GROUP_CONCAT(DISTINCT pv.product_id SEPARATOR ' . $db->quote(', ') . ') AS product_id') + ->from($db->qn('#__redshop_product_voucher_xref', 'pv')) + ->where($db->qn('v.id') . ' = ' . $db->qn('pv.voucher_id')); + + $query = $db->getQuery(true) + ->select( + array( + '(' . $subQuery . ') AS nproduct', 'v.amount AS total', 'v.type', + 'v.free_ship', 'v.id', 'v.code', 'v.voucher_left') + ) + ->from($db->qn('#__redshop_voucher', 'v')) + ->where($db->qn('v.published') . ' = 1') + ->where($db->qn('v.code') . ' = ' . $db->quote($voucher_code)) + ->where('(' + . '(' . $db->qn('v.start_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('v.start_date') . ' <= ' . $db->quote($current_time) . ')' + . ' AND (' . $db->qn('v.end_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('v.end_date') . ' >= ' . $db->quote($current_time) . ')' + . ')') + ->where($db->qn('v.voucher_left') . ' > 0'); + + return $db->setQuery($query)->loadObject(); + } + } + + return $globalVouchers; + } + + public function globalvoucher($voucherCode) + { + $db = JFactory::getDbo(); + + $currentTime = JFactory::getDate()->toSql(); + + $query = $db->getQuery(true) + ->select($db->qn('pv.product_id')) + ->select('v.*') + ->from($db->qn('#__redshop_product_voucher_xref', 'pv')) + ->leftJoin($db->qn('#__redshop_voucher', 'v') . ' ON ' . $db->qn('v.id') . ' = ' . $db->qn('pv.voucher_id')) + ->where($db->qn('v.published') . ' = 1') + ->where($db->qn('v.code') . ' = ' . $db->quote($voucherCode)) + ->where('(' + . '(' . $db->qn('v.start_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('v.start_date') . ' <= ' . $db->quote($currentTime) . ')' + . ' AND (' . $db->qn('v.end_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('v.end_date') . ' >= ' . $db->quote($currentTime) . ')' + . ')') + ->where($db->qn('v.voucher_left') . ' > 0'); + + $voucher = $this->_db->setQuery($query)->loadObject(); + + if ($voucher) + { + return $voucher; + } + + $this->_globalvoucher = 1; + + $query->clear() + ->select('v.*') + ->select($db->qn('v.amount', 'total')) + ->from($db->qn('#__redshop_voucher', 'v')) + ->where($db->qn('v.published') . ' = 1') + ->where($db->qn('v.code') . ' = ' . $db->quote($voucherCode)) + ->where('(' + . '(' . $db->qn('v.start_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('v.start_date') . ' <= ' . $db->quote($currentTime) . ')' + . ' AND (' . $db->qn('v.end_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('v.end_date') . ' >= ' . $db->quote($currentTime) . ')' + . ')') + ->where($db->qn('v.voucher_left') . ' > 0'); + + return $this->_db->setQuery($query)->loadObject(); + } + + /** + * @param string $couponCode Coupon code + * @param integer $subtotal Subtotal + * + * @return array|mixed + */ + public function getCouponData($couponCode, $subtotal = 0) + { + $db = JFactory::getDbo(); + + $today = JFactory::getDate()->toSql(); + $user = JFactory::getUser(); + $coupon = array(); + + // Create the base select statement. + $query = $db->getQuery(true) + ->select('c.*') + ->from($db->qn('#__redshop_coupons', 'c')) + ->where($db->qn('c.published') . ' = 1') + ->where( + '(' + . '(' . $db->qn('c.start_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('c.start_date') . ' <= ' . $db->quote($today) . ')' + . ' AND (' . $db->qn('c.end_date') . ' = ' . $db->quote($db->getNullDate()) + . ' OR ' . $db->qn('c.end_date') . ' >= ' . $db->quote($today) . ')' + . ')' + ); + + if ($user->id) + { + $userQuery = clone($query); + $userQuery->select( + array( + $db->qn('ct.coupon_value', 'coupon_value'), + $db->qn('ct.userid'), + $db->qn('ct.transaction_coupon_id') + ) + ) + ->leftjoin( + $db->qn('#__redshop_coupons_transaction', 'ct') + . ' ON ' . $db->qn('ct.coupon_id') . ' = ' . $db->qn('c.id') + ) + ->where($db->qn('ct.coupon_value') . ' > 0') + ->where($db->qn('ct.coupon_code') . ' = ' . $db->quote($couponCode)) + ->where($db->qn('ct.userid') . ' = ' . (int) $user->id) + ->order($db->qn('ct.transaction_coupon_id') . ' DESC'); + + $db->setQuery($userQuery, 0, 1); + $coupon = $db->loadObject(); + + if (count($coupon) > 0) + { + $this->_c_remain = 1; + } + } + + if (count($coupon) <= 0) + { + $query->where($db->qn('c.code') . ' = ' . $db->quote($couponCode)) + + ->where($db->qn('c.amount_left') . ' > 0') + ->where( + '(' + . $db->quote($subtotal) . ' >= ' . $db->qn('c.subtotal') + . ' OR ' . $db->qn('c.subtotal') . ' = 0' + . ')' + ); + + $db->setQuery($query, 0, 1); + $coupon = $db->loadObject(); + } + + return $coupon; + } + + /** + * Method for modify discount + * + * @param array $cart Cart data. + * + * @return mixed + * + * @throws Exception + */ + public function modifyDiscount($cart) + { + $calArr = \Redshop\Cart\Helper::calculation($cart); + $cart['product_subtotal'] = $calArr[1]; + $cart['product_subtotal_excl_vat'] = $calArr[2]; + + $couponIndex = !empty($cart['coupon']) && is_array($cart['coupon']) ? count($cart['coupon']) : 0; + $voucherIndex = !empty($cart['voucher']) && is_array($cart['voucher']) ? count($cart['voucher']) : 0; + + $discountAmount = 0; + + if (Redshop::getConfig()->getBool('DISCOUNT_ENABLE')) + { + $discountAmount = Redshop\Cart\Helper::getDiscountAmount($cart); + + if ($discountAmount > 0) + { + $cart = RedshopHelperCartSession::getCart(); + } + } + + if (!isset($cart['quotation_id']) || (isset($cart['quotation_id']) && !$cart['quotation_id'])) + { + $cart['cart_discount'] = $discountAmount; + } + + // Calculate voucher discount + $voucherDiscount = 0; + + if (array_key_exists('voucher', $cart)) + { + if (count($cart['voucher']) > 1) + { + foreach ($cart['voucher'] as $cartVoucher) + { + $voucherDiscount += $cartVoucher['voucher_value']; + } + } + else + { + if (!empty($cart['voucher'][0]['voucher_value'])) + { + $voucherDiscount = $cart['voucher'][0]['voucher_value']; + } + else + { + for ($v = 0; $v < $voucherIndex; $v++) + { + $voucherCode = $cart['voucher'][$v]['voucher_code']; + + unset($cart['voucher'][$v]); + + $cart = RedshopHelperCartDiscount::applyVoucher($cart, $voucherCode); + } + + $voucherDiscount = RedshopHelperDiscount::calculate('voucher', $cart['voucher']); + + empty($voucherDiscount) ? $voucherDiscount = $cart['voucher_discount'] : $voucherDiscount; + } + } + } + + $cart['voucher_discount'] = $voucherDiscount; + + // Calculate coupon discount + $couponDiscount = 0; + + if (array_key_exists('coupon', $cart)) + { + if (count($cart['coupon']) > 1) + { + foreach ($cart['coupon'] as $cartCoupon) + { + $couponDiscount += $cartCoupon['coupon_value']; + } + } + else + { + if (!empty($cart['coupon'][0]['coupon_value']) && !Redshop::getConfig()->get('DISCOUNT_TYPE') == 2) + { + $couponDiscount = $cart['coupon'][0]['coupon_value']; + } + else + { + for ($c = 0; $c < $couponIndex; $c++) + { + $couponCode = $cart['coupon'][$c]['coupon_code']; + + unset($cart['coupon'][$c]); + + $cart = RedshopHelperCartDiscount::applyCoupon($cart, $couponCode); + } + + $couponDiscount = RedshopHelperDiscount::calculate('coupon', $cart['coupon']); + + empty($couponDiscount) ? $couponDiscount = $cart['coupon_discount'] : $couponDiscount; + } + } + } + + $cart['coupon_discount'] = $couponDiscount; + + $codeDiscount = $voucherDiscount + $couponDiscount; + $totalDiscount = $cart['cart_discount'] + $codeDiscount; + + $calArr = \Redshop\Cart\Helper::calculation((array) $cart); + $tax = $calArr[5]; + $discountVAT = 0; + $chktag = RedshopHelperCart::taxExemptAddToCart(); + + if (Redshop::getConfig()->getFloat('VAT_RATE_AFTER_DISCOUNT') && !empty($chktag) + && !Redshop::getConfig()->getBool('APPLY_VAT_ON_DISCOUNT')) + { + $vatData = RedshopHelperUser::getVatUserInformation(); + + if (!empty($vatData->tax_rate)) + { + $productPriceExclVAT = (float) $cart['product_subtotal_excl_vat']; + $productVAT = (float) $cart['product_subtotal'] - $cart['product_subtotal_excl_vat']; + + if ($productPriceExclVAT > 0) + { + $avgVAT = (($productPriceExclVAT + $productVAT) / $productPriceExclVAT) - 1; + $discountVAT = ($avgVAT * $totalDiscount) / (1 + $avgVAT); + } + } + } + + $cart['total'] = $calArr[0] - $totalDiscount; + $cart['total'] = $cart['total'] < 0 ? 0 : $cart['total']; + + $cart['subtotal'] = $calArr[1] + $calArr[3] - $totalDiscount; + $cart['subtotal'] = $cart['subtotal'] < 0 ? 0 : $cart['subtotal']; + + $cart['subtotal_excl_vat'] = $calArr[2] + ($calArr[3] - $calArr[6]) - ($totalDiscount - $discountVAT); + $cart['subtotal_excl_vat'] = $cart['total'] <= 0 ? 0 : $cart['subtotal_excl_vat']; + + $cart['product_subtotal'] = $calArr[1]; + $cart['product_subtotal_excl_vat'] = $calArr[2]; + $cart['shipping'] = $calArr[3]; + $cart['tax'] = $tax; + $cart['sub_total_vat'] = $tax + $calArr[6]; + $cart['discount_vat'] = $discountVAT; + $cart['shipping_tax'] = $calArr[6]; + $cart['discount_ex_vat'] = $totalDiscount - $discountVAT; + $cart['mod_cart_total'] = Redshop\Cart\Module::calculate((array) $cart); + + $this->_session->set('cart', $cart); + + return $cart; + } + + public function getWrapperPriceArr($cartArr = array()) + { + $wrapper = $this->_producthelper->getWrapper($cartArr['product_id'], $cartArr['wrapper_id']); + $wrapper_vat = 0; + $wrapperArr = array(); + + if (count($wrapper) > 0) + { + if ($wrapper[0]->wrapper_price > 0) + { + $wrapper_vat = RedshopHelperProduct::getProductTax($cartArr['product_id'], $wrapper[0]->wrapper_price); + } + + $wrapper_price = $wrapper[0]->wrapper_price; + } + + $wrapperArr['wrapper_vat'] = $wrapper_vat; + $wrapperArr['wrapper_price'] = $wrapper_price; + + return $wrapperArr; + } + + public function checkQuantityInStock($data = array(), $newquantity = 1, $minQuantity = 0) + { + JPluginHelper::importPlugin('redshop_product'); + $result = RedshopHelperUtility::getDispatcher()->trigger('onCheckQuantityInStock', array(&$data, &$newquantity, &$minQuantity)); + + if (in_array(true, $result, true)) + { + return $newquantity; + } + + $productData = RedshopHelperProduct::getProductById($data['product_id']); + $productPreOrder = $productData->preorder; + + if ($productData->min_order_product_quantity > 0 && $productData->min_order_product_quantity > $newquantity) + { + $msg = $productData->product_name . " " . JText::_('COM_REDSHOP_WARNING_MSG_MINIMUM_QUANTITY'); + $msg = sprintf($msg, $productData->min_order_product_quantity); + /** @scrutinizer ignore-deprecated */ + JError::raiseWarning('', $msg); + $newquantity = $productData->min_order_product_quantity; + } + + if (!Redshop::getConfig()->getBool('USE_STOCKROOM')) + { + return $newquantity; + } + + $productStock = 0; + $allowPreOrder = Redshop::getConfig()->getBool('ALLOW_PRE_ORDER'); + + if (($productPreOrder == 'global' && !$allowPreOrder) + || $productPreOrder == 'no' + || ($productPreOrder == "" && !$allowPreOrder)) + { + $productStock = RedshopHelperStockroom::getStockroomTotalAmount($data['product_id']); + } + + if (($productPreOrder == "global" && $allowPreOrder) + || $productPreOrder == "yes" + || ($productPreOrder == "" && $allowPreOrder)) + { + $productStock = RedshopHelperStockroom::getStockroomTotalAmount($data['product_id']); + $productStock += RedshopHelperStockroom::getPreorderStockroomTotalAmount($data['product_id']); + } + + $ownProductReserveStock = RedshopHelperStockroom::getCurrentUserReservedStock($data['product_id']); + $attArr = $data['cart_attribute']; + + if (count($attArr) <= 0) + { + if ($productStock >= 0) + { + if ($newquantity > $ownProductReserveStock && $productStock < ($newquantity - $ownProductReserveStock)) + { + $newquantity = $productStock + $ownProductReserveStock; + } + } + else + { + $newquantity = $productStock + $ownProductReserveStock; + } + + if ($productData->max_order_product_quantity > 0 && $productData->max_order_product_quantity < $newquantity) + { + $msg = $productData->product_name . " " . JText::_('COM_REDSHOP_WARNING_MSG_MAXIMUM_QUANTITY'); + $msg = sprintf($msg, $productData->max_order_product_quantity); + /** @scrutinizer ignore-deprecated */ + JError::raiseWarning('', $msg); + $newquantity = $productData->max_order_product_quantity; + } + + if (array_key_exists('quantity', $data)) + { + $productReservedQuantity = $ownProductReserveStock + $newquantity - $data['quantity']; + } + else + { + $productReservedQuantity = $newquantity; + } + + RedshopHelperStockroom::addReservedStock($data['product_id'], $productReservedQuantity, 'product'); + } + else + { + for ($i = 0, $in = count($attArr); $i < $in; $i++) + { + $propArr = $attArr[$i]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + // Get subproperties from add to cart tray. + $subpropArr = $propArr[$k]['property_childs']; + $totalSubProperty = count($subpropArr); + $ownReservePropertyStock = RedshopHelperStockroom::getCurrentUserReservedStock($propArr[$k]['property_id'], 'property'); + $property_stock = 0; + + if (($productPreOrder == "global" && !Redshop::getConfig()->get('ALLOW_PRE_ORDER')) || ($productPreOrder == "no") || ($productPreOrder == "" && !Redshop::getConfig()->get('ALLOW_PRE_ORDER'))) + { + $property_stock = RedshopHelperStockroom::getStockroomTotalAmount($propArr[$k]['property_id'], "property"); + } + + if (($productPreOrder == "global" && Redshop::getConfig()->get('ALLOW_PRE_ORDER')) || ($productPreOrder == "yes") || ($productPreOrder == "" && Redshop::getConfig()->get('ALLOW_PRE_ORDER'))) + { + $property_stock = RedshopHelperStockroom::getStockroomTotalAmount($propArr[$k]['property_id'], "property"); + $property_stock += RedshopHelperStockroom::getPreorderStockroomTotalAmount($propArr[$k]['property_id'], "property"); + } + + // Get Property stock only when SubProperty is not in cart + if ($totalSubProperty <= 0) + { + if ($property_stock >= 0) + { + if ($newquantity > $ownReservePropertyStock && $property_stock < ($newquantity - $ownReservePropertyStock)) + { + $newquantity = $property_stock + $ownReservePropertyStock; + } + } + else + { + $newquantity = $property_stock + $ownReservePropertyStock; + } + + if ($productData->max_order_product_quantity > 0 && $productData->max_order_product_quantity < $newquantity) + { + $newquantity = $productData->max_order_product_quantity; + } + + if (array_key_exists('quantity', $data)) + { + $propertyReservedQuantity = $ownReservePropertyStock + $newquantity - $data['quantity']; + $newProductQuantity = $ownProductReserveStock + $newquantity - $data['quantity']; + } + else + { + $propertyReservedQuantity = $newquantity; + $newProductQuantity = $ownProductReserveStock + $newquantity; + } + + RedshopHelperStockroom::addReservedStock($propArr[$k]['property_id'], $propertyReservedQuantity, "property"); + RedshopHelperStockroom::addReservedStock($data['product_id'], $newProductQuantity, 'product'); + } + else + { + // Get SubProperty Stock here. + for ($l = 0; $l < $totalSubProperty; $l++) + { + $subproperty_stock = 0; + + if (($productPreOrder == "global" && !Redshop::getConfig()->get('ALLOW_PRE_ORDER')) || ($productPreOrder == "no") || ($productPreOrder == "" && !Redshop::getConfig()->get('ALLOW_PRE_ORDER'))) + { + $subproperty_stock = RedshopHelperStockroom::getStockroomTotalAmount($subpropArr[$l]['subproperty_id'], "subproperty"); + } + + if (($productPreOrder == "global" && Redshop::getConfig()->get('ALLOW_PRE_ORDER')) || ($productPreOrder == "yes") || ($productPreOrder == "" && Redshop::getConfig()->get('ALLOW_PRE_ORDER'))) + { + $subproperty_stock = RedshopHelperStockroom::getStockroomTotalAmount($subpropArr[$l]['subproperty_id'], "subproperty"); + $subproperty_stock += RedshopHelperStockroom::getPreorderStockroomTotalAmount($subpropArr[$l]['subproperty_id'], "subproperty"); + } + + $ownSubPropReserveStock = RedshopHelperStockroom::getCurrentUserReservedStock($subpropArr[$l]['subproperty_id'], "subproperty"); + + if ($subproperty_stock >= 0) + { + if ($newquantity > $ownSubPropReserveStock && $subproperty_stock < ($newquantity - $ownSubPropReserveStock)) + { + $newquantity = $subproperty_stock + $ownSubPropReserveStock; + } + } + else + { + $newquantity = $subproperty_stock + $ownSubPropReserveStock; + } + + if ($productData->max_order_product_quantity > 0 && $productData->max_order_product_quantity < $newquantity) + { + $newquantity = $productData->max_order_product_quantity; + } + + if (array_key_exists('quantity', $data)) + { + $subPropertyReservedQuantity = $ownSubPropReserveStock + $newquantity - $data['quantity']; + $newPropertyQuantity = $ownReservePropertyStock + $newquantity - $data['quantity']; + $newProductQuantity = $ownProductReserveStock + $newquantity - $data['quantity']; + } + else + { + $subPropertyReservedQuantity = $newquantity; + $newPropertyQuantity = $ownReservePropertyStock + $newquantity; + $newProductQuantity = $ownProductReserveStock + $newquantity; + } + + RedshopHelperStockroom::addReservedStock($subpropArr[$l]['subproperty_id'], $subPropertyReservedQuantity, 'subproperty'); + RedshopHelperStockroom::addReservedStock($propArr[$k]['property_id'], $newPropertyQuantity, 'property'); + RedshopHelperStockroom::addReservedStock($data['product_id'], $newProductQuantity, 'product'); + } + } + } + } + } + + return $newquantity; + } + + /** + * Method for calculate final price of cart. + * + * @param bool $callmodify Is modify cart? + * + * @return array + * + * @deprecated 2.0.3 Use RedshopHelperCart::cartFinalCalculation() instead. + * + * @throws Exception + */ + public function cartFinalCalculation($callmodify = true) + { + return RedshopHelperCart::cartFinalCalculation($callmodify); + } + + /** + * Store Cart to Database + * + * @param array $cart Cart + * + * @return null + * @throws Exception + * + * @deprecated 2.0.3 Use RedshopHelperCart::addCartToDatabase() instead. + */ + public function carttodb($cart = array()) + { + return RedshopHelperCart::addCartToDatabase($cart); + } + + /** + * Store Cart Attribute to Database + * + * @param array $attribute Cart attribute data. + * @param int $cart_item_id Cart item ID + * @param int $product_id Cart product ID. + * @param boolean $isAccessary Is this accessory? + * + * @return boolean True on success. False otherwise. + * + * @deprecated 2.0.3 Use RedshopHelperCart::addCartToDatabase() instead. + */ + public function attributetodb($attribute = array(), $cart_item_id = 0, $product_id = 0, $isAccessary = false) + { + return RedshopHelperCart::addCartAttributeToDatabase($attribute, $cart_item_id, $product_id, $isAccessary); + } + + /** + * Remove cart entry from table + * + * @param int $cart_id #__redshop_usercart table key id + * @param int $userid user information id - joomla #__users table key id + * @param bool $delCart remove cart from #__redshop_usercart table + * + * @return bool + * + * @deprecated 2.0.3 Use edshopHelperCart::removeCartFromDatabase() instead. + */ + public function removecartfromdb($cart_id = 0, $userid = 0, $delCart = false) + { + return RedshopHelperCart::removeCartFromDatabase($cart_id, $userid, $delCart); + } + + /** + * Method for convert data from database to cart. + * + * @param int $userId ID of user. + * + * @deprecated 2.0.3 Use RedshopHelperCart::databaseToCart() instead. + */ + public function dbtocart($userId = 0) + { + RedshopHelperCart::databaseToCart($userId); + } + + /** + * Method for generate attribute from cart. + * + * @param int $cart_item_id ID of cart item. + * @param int $is_accessory Is accessory? + * @param int $parent_section_id ID of parent section + * @param int $quantity Quantity of product. + * + * @return array + * + * @deprecated 2.0.3 + */ + public function generateAttributeFromCart($cart_item_id = 0, $is_accessory = 0, $parent_section_id = 0, $quantity = 1) + { + return RedshopHelperCart::generateAttributeFromCart($cart_item_id, $is_accessory, $parent_section_id, $quantity); + } + + public function generateAccessoryFromCart($cart_item_id = 0, $product_id = 0, $quantity = 1) + { + $generateAccessoryCart = array(); + + $cartItemdata = $this->getCartItemAccessoryDetail($cart_item_id); + + for ($i = 0, $in = count($cartItemdata); $i < $in; $i++) + { + $accessory = RedshopHelperAccessory::getProductAccessories($cartItemdata[$i]->product_id); + $accessorypricelist = \Redshop\Product\Accessory::getPrice($product_id, $accessory[0]->newaccessory_price, $accessory[0]->accessory_main_price, 1); + $accessory_price = $accessorypricelist[0]; + + $generateAccessoryCart[$i]['accessory_id'] = $cartItemdata[$i]->product_id; + $generateAccessoryCart[$i]['accessory_name'] = $accessory[0]->product_name; + $generateAccessoryCart[$i]['accessory_oprand'] = $accessory[0]->oprand; + $generateAccessoryCart[$i]['accessory_price'] = $accessory_price; + $generateAccessoryCart[$i]['accessory_childs'] = RedshopHelperCart::generateAttributeFromCart($cart_item_id, 1, $cartItemdata[$i]->product_id, $quantity); + } + + return $generateAccessoryCart; + } + + public function getCartItemAccessoryDetail($cart_item_id = 0) + { + $list = null; + + if ($cart_item_id != 0) + { + $query = "SELECT * FROM " . $this->_table_prefix . "usercart_accessory_item " + . "WHERE cart_item_id=" . (int) $cart_item_id; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + } + + return $list; + } + + public function getCartItemAttributeDetail($cart_item_id = 0, $is_accessory = 0, $section = "attribute", $parent_section_id = 0) + { + $db = JFactory::getDbo(); + + $and = ""; + + if ($cart_item_id != 0) + { + $and .= " AND cart_item_id=" . (int) $cart_item_id . " "; + } + + if ($parent_section_id != 0) + { + $and .= " AND parent_section_id=" . (int) $parent_section_id . " "; + } + + $query = "SELECT * FROM " . $this->_table_prefix . "usercart_attribute_item " + . "WHERE is_accessory_att=" . (int) $is_accessory . " " + . "AND section=" . $db->quote($section) . " " + . $and; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + /** + * Add GiftCard To Cart + * + * @param array $cartItem Cart item + * @param array $data User cart data + * + * @return void + * + * @deprecated 2.1.0 + * + * @see RedshopHelperDiscount::addGiftCardToCart() + */ + public function addGiftCardToCart(&$cartItem, $data) + { + RedshopHelperDiscount::addGiftCardToCart($cartItem, $data); + } + + /** + * Method for add product to cart + * + * @param array $data Product data + * + * @return mixed + * @throws Exception + * + * @deprecated 2.1.0 + * @see Redshop\Cart\Cart::addProduct + */ + public function addProductToCart($data = array()) + { + return Redshop\Cart\Cart::addProduct($data); + } + + public function userfieldValidation($data, $data_add, $section = 12) + { + $returnArr = $this->_producthelper->getProductUserfieldFromTemplate($data_add); + $userfieldArr = $returnArr[1]; + + $msg = ""; + + if (count($userfieldArr) > 0) + { + $req_fields = RedshopHelperExtrafields::getSectionFieldList($section, 1, 1, 1); + + for ($i = 0, $in = count($req_fields); $i < $in; $i++) + { + if (in_array($req_fields[$i]->name, $userfieldArr)) + { + if (!isset($data[$req_fields[$i]->name]) || (isset($data[$req_fields[$i]->name]) && $data[$req_fields[$i]->name] == "")) + { + $msg .= $req_fields[$i]->title . " " . JText::_('COM_REDSHOP_IS_REQUIRED') . "
    "; + } + } + } + } + + return $msg; + } + + /** + * @param array $data + * @param int $user_id + * + * @return array|bool + * + * @throws Exception + */ + public function generateAccessoryArray($data, $user_id = 0) + { + $generateAccessoryCart = array(); + + if (!empty($data['accessory_data'])) + { + $accessoryData = explode("@@", $data['accessory_data']); + $accQuantityData = array(); + + if (isset($data['acc_quantity_data'])) + { + $accQuantityData = explode("@@", $data['acc_quantity_data']); + } + + for ($i = 0, $in = count($accessoryData); $i < $in; $i++) + { + $accessory = RedshopHelperAccessory::getProductAccessories($accessoryData[$i]); + $accessoryPriceList = \Redshop\Product\Accessory::getPrice( + $data['product_id'], $accessory[0]->newaccessory_price, $accessory[0]->accessory_main_price, 1, $user_id + ); + $accessory_price = $accessoryPriceList[0]; + $acc_quantity = (isset($accQuantityData[$i]) && $accQuantityData[$i]) ? $accQuantityData[$i] : $data['quantity']; + + $generateAccessoryCart[$i]['accessory_id'] = $accessoryData[$i]; + $generateAccessoryCart[$i]['accessory_name'] = $accessory[0]->product_name; + $generateAccessoryCart[$i]['accessory_oprand'] = $accessory[0]->oprand; + $generateAccessoryCart[$i]['accessory_price'] = $accessory_price * $acc_quantity; + $generateAccessoryCart[$i]['accessory_quantity'] = $acc_quantity; + + $accAttributeCart = array(); + + if (!empty($data['acc_attribute_data'])) + { + $acc_attribute_data = explode('@@', $data['acc_attribute_data']); + + if ($acc_attribute_data[$i] != "") + { + $acc_attribute_data = explode('##', $acc_attribute_data[$i]); + $countAccessoryAttribute = count($acc_attribute_data); + + for ($ia = 0; $ia < $countAccessoryAttribute; $ia++) + { + $accPropertyCart = array(); + $attribute = RedshopHelperProduct_Attribute::getProductAttribute(0, 0, $acc_attribute_data[$ia]); + $accAttributeCart[$ia]['attribute_id'] = $acc_attribute_data[$ia]; + $accAttributeCart[$ia]['attribute_name'] = $attribute[0]->text; + + if ($attribute[0]->text != "" && !empty($data['acc_property_data'])) + { + $acc_property_data = explode('@@', $data['acc_property_data']); + $acc_property_data = explode('##', $acc_property_data[$i]); + + if (empty($acc_property_data[$ia]) && $attribute[0]->attribute_required == 1) + { + return array(); + } + + if (!empty($acc_property_data[$ia])) + { + $acc_property_data = explode(',,', $acc_property_data[$ia]); + $countAccessoryProperty = count($acc_property_data); + + for ($ip = 0; $ip < $countAccessoryProperty; $ip++) + { + $accSubpropertyCart = array(); + $property_price = 0; + $property = RedshopHelperProduct_Attribute::getAttributeProperties($acc_property_data[$ip]); + $pricelist = RedshopHelperProduct_Attribute::getPropertyPrice($acc_property_data[$ip], $data['quantity'], 'property', $user_id); + + if (count($pricelist) > 0) + { + $property_price = $pricelist->product_price; + } + else + { + $property_price = $property[0]->property_price; + } + + $accPropertyCart[$ip]['property_id'] = $acc_property_data[$ip]; + $accPropertyCart[$ip]['property_name'] = $property[0]->text; + $accPropertyCart[$ip]['property_oprand'] = $property[0]->oprand; + $accPropertyCart[$ip]['property_price'] = $property_price; + + if (!empty($data['acc_subproperty_data'])) + { + $acc_subproperty_data = explode('@@', $data['acc_subproperty_data']); + $acc_subproperty_data = @explode('##', $acc_subproperty_data[$i]); + $acc_subproperty_data = @explode(',,', $acc_subproperty_data[$ia]); + + + if (!empty($acc_subproperty_data[$ip])) + { + $acc_subproperty_data = explode('::', $acc_subproperty_data[$ip]); + $countAccessorySubproperty = count($acc_subproperty_data); + + for ($isp = 0; $isp < $countAccessorySubproperty; $isp++) + { + $subproperty = RedshopHelperProduct_Attribute::getAttributeSubProperties($acc_subproperty_data[$isp]); + $pricelist = RedshopHelperProduct_Attribute::getPropertyPrice($acc_subproperty_data[$isp], $data['quantity'], 'subproperty', $user_id); + + if (count($pricelist) > 0) + { + $subproperty_price = $pricelist->product_price; + } + else + { + $subproperty_price = $subproperty[0]->subattribute_color_price; + } + + $accSubpropertyCart[$isp]['subproperty_id'] = $acc_subproperty_data[$isp]; + $accSubpropertyCart[$isp]['subproperty_name'] = $subproperty[0]->text; + $accSubpropertyCart[$isp]['subproperty_oprand'] = $subproperty[0]->oprand; + $accSubpropertyCart[$isp]['subproperty_price'] = $subproperty_price; + } + } + } + + $accPropertyCart[$ip]['property_childs'] = $accSubpropertyCart; + } + } + } + + $accAttributeCart[$ia]['attribute_childs'] = $accPropertyCart; + } + } + } + else + { + $attribute_set_id = $this->getAttributeSetId($accessory[0]->child_product_id); + $attributes_acc_set = array(); + + if ($attribute_set_id > 0) + { + $attributes_acc_set = $this->getProductAccAttribute($accessory[0]->child_product_id, $attribute_set_id, 0, 0, 1); + } + + $requireAttribute = RedshopHelperProduct_Attribute::getProductAttribute($accessory[0]->child_product_id, 0, 0, 0, 1); + $requireAttribute = array_merge($requireAttribute, $attributes_acc_set); + + if (count($requireAttribute) > 0) + { + $requied_attributeArr = array(); + + for ($re = 0, $countAttribute = count($requireAttribute); $re < $countAttribute; $re++) + { + $requied_attributeArr[$re] = urldecode($requireAttribute[$re]->attribute_name); + } + + $requied_attribute_name = implode(", ", $requied_attributeArr); + + // Throw an error as first attribute is required + $msg = urldecode($requied_attribute_name) . " " . JText::_('IS_REQUIRED'); + JFactory::getApplication()->enqueueMessage($msg); + + return false; + } + } + + $generateAccessoryCart[$i]['accessory_childs'] = $accAttributeCart; + } + } + + return $generateAccessoryCart; + } + + public function getProductAccAttribute($product_id = 0, $attribute_set_id = 0, $attribute_id = 0, $published = 0, $attribute_required = 0, $notAttributeId = 0) + { + $and = ""; + $astpublished = ""; + + if ($product_id != 0) + { + // Secure productsIds + if ($productsIds = explode(',', $product_id)) + { + $productsIds = Joomla\Utilities\ArrayHelper::toInteger($productsIds); + + $and .= "AND p.product_id IN (" . implode(',', $productsIds) . ") "; + } + } + + if ($attribute_set_id != 0) + { + $and .= "AND a.attribute_set_id=" . (int) $attribute_set_id . " "; + } + + if ($published != 0) + { + $astpublished = " AND ast.published=" . (int) $published . " "; + } + + if ($attribute_required != 0) + { + $and .= "AND a.attribute_required=" . (int) $attribute_required . " "; + } + + if ($notAttributeId != 0) + { + // Secure notAttributeId + if ($notAttributeIds = explode(',', $notAttributeId)) + { + $notAttributeIds = Joomla\Utilities\ArrayHelper::toInteger($notAttributeIds); + + $and .= "AND a.attribute_id NOT IN (" . implode(',', $notAttributeIds) . ") "; + } + } + + $query = "SELECT a.attribute_id AS value,a.attribute_name AS text,a.*,ast.attribute_set_name " + . "FROM " . $this->_table_prefix . "product_attribute AS a " + . "LEFT JOIN " . $this->_table_prefix . "attribute_set AS ast ON ast.attribute_set_id=a.attribute_set_id " + . "LEFT JOIN " . $this->_table_prefix . "product AS p ON p.attribute_set_id=a.attribute_set_id " . $astpublished + . "WHERE a.attribute_name!='' " + . $and + . " and attribute_published=1 ORDER BY a.ordering ASC "; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + public function getAttributeSetId($pid) + { + return RedshopEntityProduct::getInstance($pid)->get('attribute_set_id'); + } + + /** + * Method for generate attribute array + * + * @param array $data Data of attributes + * @param integer $userId ID of user + * + * @return array + * + * @deprecated 2.1.0 + * @see Redshop\Cart\Helper::generateAttribute + */ + public function generateAttributeArray($data, $userId = 0) + { + return Redshop\Cart\Helper::generateAttribute($data, $userId); + } + + public function getSelectedCartAttributeArray($attArr = array()) + { + $selectedproperty = array(); + $selectedsubproperty = array(); + + for ($i = 0, $in = count($attArr); $i < $in; $i++) + { + $propArr = $attArr[$i]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $selectedproperty[] = $propArr[$k]['property_id']; + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $selectedsubproperty[] = $subpropArr[$l]['subproperty_id']; + } + } + } + + $ret = array($selectedproperty, $selectedsubproperty); + + return $ret; + } + + public function getSelectedCartAccessoryArray($attArr = array()) + { + $selectedAccessory = array(); + $selectedproperty = array(); + $selectedsubproperty = array(); + + for ($i = 0, $in = count($attArr); $i < $in; $i++) + { + $selectedAccessory[] = $attArr[$i]['accessory_id']; + $attchildArr = $attArr[$i]['accessory_childs']; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $propArr = $attchildArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $selectedproperty[] = $propArr[$k]['property_id']; + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $selectedsubproperty[] = $subpropArr[$l]['subproperty_id']; + } + } + } + } + + $ret = array($selectedAccessory, $selectedproperty, $selectedsubproperty); + + return $ret; + } + + /** + * @param int $order_item_id + * @param int $is_accessory + * @param int $parent_section_id + * @param int $quantity + * + * @return array + */ + public function generateAttributeFromOrder($order_item_id = 0, $is_accessory = 0, $parent_section_id = 0, $quantity = 1) + { + $generateAttributeCart = array(); + + $orderItemAttdata = RedshopHelperOrder::getOrderItemAttributeDetail($order_item_id, $is_accessory, "attribute", $parent_section_id); + + for ($i = 0, $in = count($orderItemAttdata); $i < $in; $i++) + { + $accPropertyCart = array(); + $generateAttributeCart[$i]['attribute_id'] = $orderItemAttdata[$i]->section_id; + $generateAttributeCart[$i]['attribute_name'] = $orderItemAttdata[$i]->section_name; + + $orderPropdata = RedshopHelperOrder::getOrderItemAttributeDetail($order_item_id, $is_accessory, "property", $orderItemAttdata[$i]->section_id); + + for ($p = 0, $pn = count($orderPropdata); $p < $pn; $p++) + { + $accSubpropertyCart = array(); + $property = RedshopHelperProduct_Attribute::getAttributeProperties($orderPropdata[$p]->section_id); + $pricelist = RedshopHelperProduct_Attribute::getPropertyPrice($orderPropdata[$p]->section_id, $quantity, 'property'); + + if (count($pricelist) > 0) + { + $property_price = $pricelist->product_price; + } + else + { + $property_price = $property[0]->property_price; + } + + $accPropertyCart[$p]['property_id'] = $orderPropdata[$p]->section_id; + $accPropertyCart[$p]['property_name'] = $property[0]->text; + $accPropertyCart[$p]['property_oprand'] = $property[0]->oprand; + $accPropertyCart[$p]['property_price'] = $property_price; + + $orderSubpropdata = RedshopHelperOrder::getOrderItemAttributeDetail($order_item_id, $is_accessory, "subproperty", $orderPropdata[$p]->section_id); + + for ($sp = 0, $countSubproperty = count($orderSubpropdata); $sp < $countSubproperty; $sp++) + { + $subproperty = RedshopHelperProduct_Attribute::getAttributeSubProperties($orderSubpropdata[$sp]->section_id); + $pricelist = RedshopHelperProduct_Attribute::getPropertyPrice($orderSubpropdata[$sp]->section_id, $quantity, 'subproperty'); + + if (count($pricelist) > 0) + { + $subproperty_price = $pricelist->product_price; + } + else + { + $subproperty_price = $subproperty[0]->subattribute_color_price; + } + + $accSubpropertyCart[$sp]['subproperty_id'] = $orderSubpropdata[$sp]->section_id; + $accSubpropertyCart[$sp]['subproperty_name'] = $subproperty[0]->text; + $accSubpropertyCart[$sp]['subproperty_oprand'] = $subproperty[0]->oprand; + $accSubpropertyCart[$sp]['subproperty_price'] = $subproperty_price; + } + + $accPropertyCart[$p]['property_childs'] = $accSubpropertyCart; + } + + $generateAttributeCart[$i]['attribute_childs'] = $accPropertyCart; + } + + return $generateAttributeCart; + } + + public function generateAccessoryFromOrder($order_item_id = 0, $product_id = 0, $quantity = 1) + { + $generateAccessoryCart = array(); + + $orderItemdata = RedshopHelperOrder::getOrderItemAccessoryDetail($order_item_id); + + foreach ($orderItemdata as $index => $orderItem) + { + $accessory = RedshopHelperAccessory::getProductAccessories($orderItem->product_id); + $accessorypricelist = \Redshop\Product\Accessory::getPrice($product_id, $accessory[0]->newaccessory_price, $accessory[0]->accessory_main_price, 1); + $accessory_price = $accessorypricelist[0]; + + $generateAccessoryCart[$index]['accessory_id'] = $orderItem->product_id; + $generateAccessoryCart[$index]['accessory_name'] = $accessory[0]->product_name; + $generateAccessoryCart[$index]['accessory_oprand'] = $accessory[0]->oprand; + $generateAccessoryCart[$index]['accessory_price'] = $accessory_price; + $generateAccessoryCart[$index]['accessory_quantity'] = $orderItem->product_quantity; + $generateAccessoryCart[$index]['accessory_childs'] = $this->generateAttributeFromOrder($order_item_id, 1, $orderItem->product_id, $quantity); + } + + return $generateAccessoryCart; + } + + public function discountCalculatorData($product_data, $data) + { + $use_discount_calculator = $product_data->use_discount_calc; + $discount_calc_method = $product_data->discount_calc_method; + $use_range = $product_data->use_range; + $calc_output_array = array(); + + if ($use_discount_calculator) + { + $discount_cal = $this->discountCalculator($data); + + $calculator_price = $discount_cal['product_price']; + $product_price_tax = $discount_cal['product_price_tax']; + + $discountArr = array(); + if ($calculator_price) + { + $calc_output = "Type : " . $discount_calc_method . "
    "; + $calc_output_array['type'] = $discount_calc_method; + + if ($use_range) + { + $calcHeight = @$data['calcHeight']; + $calcWidth = @$data['calcWidth']; + $calcDepth = @$data['calcDepth']; + $calcRadius = @$data['calcRadius']; + $calcPricePerPiece = ""; + $totalPiece = ""; + } + else + { + $calcHeight = @$product_data->product_height; + $calcWidth = @$product_data->product_width; + $calcDepth = @$product_data->product_length; + $calcRadius = @$data['calcRadius']; + $calcPricePerPiece = @$discount_cal['price_per_piece']; + $totalPiece = @$discount_cal['total_piece']; + } + + switch ($discount_calc_method) + { + case "volume": + + $calc_output .= JText::_('COM_REDSHOP_DISCOUNT_CALC_HEIGHT') . " " . $calcHeight . "
    "; + $calc_output_array['calcHeight'] = $calcHeight; + $calc_output .= JText::_('COM_REDSHOP_DISCOUNT_CALC_WIDTH') . " " . $calcWidth . "
    "; + $calc_output_array['calcWidth'] = $calcWidth; + $calc_output .= JText::_('COM_REDSHOP_DISCOUNT_CALC_LENGTH') . " " . $calcDepth . "
    "; + $calc_output_array['calcDepth'] = $calcDepth; + + if ($calcPricePerPiece != "") + { + $calc_output .= JText::_('COM_REDSHOP_PRICE_PER_PIECE') . " " . $calcPricePerPiece . "
    "; + $calc_output_array['calcPricePerPiece'] = $calcDepth; + } + + if ($totalPiece != "") + { + $calc_output .= JText::_('COM_REDSHOP_TOTAL_PIECE') . " " . $totalPiece . "
    "; + $calc_output_array['totalPiece'] = $totalPiece; + } + + break; + + case "area": + + $calc_output .= JText::_('COM_REDSHOP_DISCOUNT_CALC_DEPTH') . " " . $calcDepth . "
    "; + $calc_output_array['calcDepth'] = $calcDepth; + $calc_output .= JText::_('COM_REDSHOP_DISCOUNT_CALC_WIDTH') . " " . $calcWidth . "
    "; + $calc_output_array['calcWidth'] = $calcWidth; + + if ($calcPricePerPiece != "") + { + $calc_output .= JText::_('COM_REDSHOP_PRICE_PER_PIECE') . " " . $calcPricePerPiece . "
    "; + $calc_output_array['calcPricePerPiece'] = $calcDepth; + } + + if ($totalPiece != "") + { + $calc_output .= JText::_('COM_REDSHOP_TOTAL_PIECE') . " " . $totalPiece . "
    "; + $calc_output_array['totalPiece'] = $totalPiece; + } + + break; + + case "circumference": + + $calc_output .= JText::_('COM_REDSHOP_DISCOUNT_CALC_RADIUS') . " " . $calcRadius . "
    "; + $calc_output_array['calcRadius'] = $calcRadius; + + if ($calcPricePerPiece != "") + { + $calc_output .= JText::_('COM_REDSHOP_PRICE_PER_PIECE') . " " . $calcPricePerPiece . "
    "; + $calc_output_array['calcPricePerPiece'] = $calcDepth; + } + + if ($totalPiece != "") + { + $calc_output .= JText::_('COM_REDSHOP_TOTAL_PIECE') . " " . $totalPiece . "
    "; + $calc_output_array['totalPiece'] = $totalPiece; + } + break; + } + + $calc_output .= JText::_('COM_REDSHOP_DISCOUNT_CALC_UNIT') . " " . $data['calcUnit']; + $calc_output_array['calcUnit'] = $data['calcUnit']; + + // Extra selected value data + $calc_output .= "
    " . $discount_cal['pdcextra_data']; + + // Extra selected value ids + $calc_output_array['calcextra_ids'] = $discount_cal['pdcextra_ids']; + + $discountArr[] = $calc_output; + $discountArr[] = $calc_output_array; + $discountArr[] = $calculator_price; + $discountArr[] = $product_price_tax; + + return $discountArr; + } + else + { + return array(); + } + } + } + + /** + * Discount calculator Ajax Function + * + * @param array $get + * + * @return array + */ + public function discountCalculator($get) + { + $productId = (int) $get['product_id']; + + $discount_cal = array(); + + $productPrice = RedshopHelperProductPrice::getNetPrice($productId); + + $product_price = $productPrice['product_price_novat']; + + $data = RedshopHelperProduct::getProductById($productId); + + // Default calculation method + $calcMethod = $data->discount_calc_method; + + // Default calculation unit + $globalUnit = "m"; + + // Use range or not + $use_range = $data->use_range; + + $calcHeight = $get['calcHeight']; + $calcWidth = $get['calcWidth']; + $calcLength = $get['calcDepth']; + $calcRadius = $get['calcRadius']; + $calcUnit = trim($get['calcUnit']); + + $calcHeight = str_replace(",", ".", $calcHeight); + $calcWidth = str_replace(",", ".", $calcWidth); + $calcLength = str_replace(",", ".", $calcLength); + $calcRadius = $cart_mdata = str_replace(",", ".", $calcRadius); + $calcUnit = $cart_mdata = str_replace(",", ".", $calcUnit); + + // Convert unit using helper function + $unit = \Redshop\Helper\Utility::getUnitConversation($globalUnit, $calcUnit); + + $calcHeight *= $unit; + $calcWidth *= $unit; + $calcLength *= $unit; + $calcRadius *= $unit; + + $product_unit = 1; + + if (!$use_range) + { + $product_unit = \Redshop\Helper\Utility::getUnitConversation($globalUnit, Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT')); + + $product_height = $data->product_height * $product_unit; + $product_width = $data->product_width * $product_unit; + $product_length = $data->product_length * $product_unit; + $product_diameter = $data->product_diameter * $product_unit; + } + + $Area = 0; + + switch ($calcMethod) + { + case "volume": + + $Area = $calcHeight * $calcWidth * $calcLength; + + if (!$use_range) + $product_area = $product_height * $product_width * $product_length; + break; + + case "area": + $Area = $calcLength * $calcWidth; + + if (!$use_range) + $product_area = $product_length * $product_width; + break; + + case "circumference": + + $Area = 2 * PI * $calcRadius; + + if (!$use_range) + $product_area = PI * $product_diameter; + break; + } + + $finalArea = $Area; + + if ($use_range) + { + $finalArea = number_format($finalArea, 8, '.', ''); + + // Calculation prices as per various area + $discount_calc_data = $this->getDiscountCalcData($finalArea, $productId); + + } + else + { + // Shandard size of product + $final_product_Area = $product_area; + + // Total sheet calculation + if ($final_product_Area <= 0) + $final_product_Area = 1; + $total_sheet = $finalArea / $final_product_Area; + + // Returns the next highest integer value by rounding up value if necessary. + if (isset($data->allow_decimal_piece) && $data->allow_decimal_piece) + { + $total_sheet = ceil($total_sheet); + } + + // If sheet is less than 0 or equal to 0 than + if ($total_sheet <= 0) + $total_sheet = 1; + + // Product price of all sheets + $product_price_total = $total_sheet * $product_price; + + $discount_calc_data = array(); + $discount_calc_data[0] = new stdClass; + + // Generating array + $discount_calc_data[0]->area_price = $product_price; + $discount_calc_data[0]->discount_calc_unit = $product_unit; + $discount_calc_data[0]->price_per_piece = $product_price_total; + } + + $area_price = 0; + $pricePerPieceTax = 0; + + if (count($discount_calc_data)) + { + $area_price = $discount_calc_data[0]->area_price; + + // Discount calculator extra price enhancement + $pdcextraid = $get['pdcextraid']; + $pdcstring = $pdcids = array(); + + if (trim($pdcextraid) != "") + { + $pdcextradatas = $this->getDiscountCalcDataExtra($pdcextraid); + + for ($pdc = 0, $countExtrafield = count($pdcextradatas); $pdc < $countExtrafield; $pdc++) + { + $pdcextradata = $pdcextradatas[$pdc]; + $option_name = $pdcextradata->option_name; + $pdcprice = $pdcextradata->price; + $pdcoprand = $pdcextradata->oprand; + $pdcextra_id = $pdcextradata->pdcextra_id; + + $pdcstring[] = $option_name . ' (' . $pdcoprand . ' ' . $pdcprice . ' )'; + $pdcids[] = $pdcextra_id; + + switch ($pdcoprand) + { + case "+": + $area_price += $pdcprice; + break; + case "-": + $area_price -= $pdcprice; + break; + case "%": + $area_price *= 1 + ($pdcprice / 100); + break; + } + } + } + + // Applying TAX + $chktag = \Redshop\Template\Helper::isApplyAttributeVat(); + + if ($use_range) + { + $display_final_area = $finalArea / ($unit * $unit); + $price_per_piece = $area_price; + + $pricePerPieceTax = RedshopHelperProduct::getProductTax($productId, $price_per_piece, 0, 1); + + echo $display_final_area . "\n"; + + echo $area_price . "\n"; + + echo $price_per_piece . "\n"; + + echo JText::_('COM_REDSHOP_TOTAL_AREA') . "\n"; + + echo JText::_('COM_REDSHOP_PRICE_PER_AREA') . "\n"; + + echo JText::_('COM_REDSHOP_PRICE_PER_PIECE') . "\n"; + + echo JText::_('COM_REDSHOP_PRICE_TOTAL') . "\n"; + + echo $pricePerPieceTax . "\n"; + echo $chktag . "\n"; + } + else + { + $price_per_piece = $discount_calc_data[0]->price_per_piece; + + $pricePerPieceTax = RedshopHelperProduct::getProductTax($productId, $price_per_piece, 0, 1); + + echo $Area . "
    " . JText::_('COM_REDSHOP_TOTAL_PIECE') . $total_sheet . "\n"; + + echo $area_price . "\n"; + + echo $price_per_piece . "\n"; + + echo JText::_('COM_REDSHOP_TOTAL_AREA') . "\n"; + + echo JText::_('COM_REDSHOP_PRICE_PER_PIECE') . "\n"; + + echo JText::_('COM_REDSHOP_PRICE_OF_ALL_PIECE') . "\n"; + + echo JText::_('COM_REDSHOP_PRICE_TOTAL') . "\n"; + + echo $pricePerPieceTax . "\n"; + echo $chktag . "\n"; + } + } + else + { + $price_per_piece = false; + echo "fail"; + } + + $discount_cal['product_price'] = $price_per_piece; + $discount_cal['product_price_tax'] = $pricePerPieceTax; + $discount_cal['pdcextra_data'] = ""; + + if (isset($pdcstring) && count($pdcstring) > 0) + { + $discount_cal['pdcextra_data'] = implode("
    ", $pdcstring); + } + + $discount_cal['pdcextra_ids'] = ''; + + if (isset($pdcids) && (count($pdcids) > 0)) + { + $discount_cal['pdcextra_ids'] = implode(",", $pdcids); + } + + if (isset($total_sheet)) + { + $discount_cal['total_piece'] = $total_sheet; + } + + $discount_cal['price_per_piece'] = $area_price; + + return $discount_cal; + } + + /** + * Funtion get Discount calculation data + * + * @param number $area default value is 0 + * @param number $pid default value can be null + * @param number $areabetween default value is 0 + * + * @return object|mixed + */ + public function getDiscountCalcData($area = 0, $pid = 0, $areabetween = 0) + { + $query = $this->_db->getQuery(true) + ->select("*") + ->from($this->_db->quoteName("#__redshop_product_discount_calc")) + ->where($this->_db->quoteName("product_id") . "=" . (int) $pid) + ->order("id ASC"); + + if ($areabetween) + { + $query->where((floatval($area)) . " BETWEEN `area_start` AND `area_end` "); + } + + if ($area) + { + $query->where($this->_db->quoteName("area_start_converted") . "<=" . floatval($area)) + ->where($this->_db->quoteName("area_end_converted") . ">=" . floatval($area)); + } + + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + /** + * @param string $pdcextraids + * @param int $productId + * + * @return mixed + */ + public function getDiscountCalcDataExtra($pdcextraids = "", $productId = 0) + { + return RedshopHelperCartDiscount::getDiscountCalcDataExtra($pdcextraids, $productId); + } + + /** + * Handle required attribute before add in to cart messages + * + * @param array $data cart data + * @param string $attributeTemplate Attribute added data + * @param array $selectedAttrId Selected attribute id for add to cart + * @param array $selectedPropId Selected Property Id for Add to cart + * @param array $notselectedSubpropId Not selected subproperty ids during add to cart + * + * @return string Error Message if found otherwise return null. + * @throws Exception + */ + public function handleRequiredSelectedAttributeCartMessage($data, $attributeTemplate, $selectedAttrId, $selectedPropId, $notselectedSubpropId) + { + if (Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE')) + { + return; + } + + // Check if required attribute is filled or not ... + $attributeTemplateArray = \Redshop\Template\Helper::getAttribute($attributeTemplate); + + if (!empty($attributeTemplateArray)) + { + $selectedAttributId = 0; + + if (count($selectedAttrId) > 0) + { + $selectedAttributId = implode(",", $selectedAttrId); + } + + $requiredAttribute = RedshopHelperProduct_Attribute::getProductAttribute( + $data['product_id'], + 0, + 0, + 0, + 1, + $selectedAttributId + ); + + if (!empty($requiredAttribute)) + { + $requiredAttributeArray = array(); + + for ($re = 0, $countAttribute = count($requiredAttribute); $re < $countAttribute; $re++) + { + $requiredAttributeArray[$re] = urldecode($requiredAttribute[$re]->attribute_name); + } + + $requiredAttributeName = implode(", ", $requiredAttributeArray); + + // Error message if first attribute is required + return $requiredAttributeName . " " . JText::_('COM_REDSHOP_IS_REQUIRED'); + } + + $selectedPropertyId = 0; + + if (!empty($selectedPropId)) + { + $selectedPropertyId = implode(",", $selectedPropId); + } + + $notselectedSubpropertyId = 0; + + if (count($notselectedSubpropId) > 0) + { + $notselectedSubpropertyId = implode(",", $notselectedSubpropId); + } + + $requiredProperty = RedshopHelperProduct_Attribute::getAttributeProperties( + /** @scrutinizer ignore-type */ $selectedPropertyId, + /** @scrutinizer ignore-type */ $selectedAttributId, + $data['product_id'], + 0, + 1, + /** @scrutinizer ignore-type */ $notselectedSubpropertyId + ); + + if (!empty($requiredProperty)) + { + $requiredSubAttributeArray = array(); + + for ($re1 = 0, $countProperty = count($requiredProperty); $re1 < $countProperty; $re1++) + { + $requiredSubAttributeArray[$re1] = urldecode($requiredProperty[$re1]->property_name); + } + + $requiredSubAttributeName = implode(",", $requiredSubAttributeArray); + + // Give error as second attribute is required + if ($data['reorder'] != 1) + { + return $requiredSubAttributeName . " " . JText::_('COM_REDSHOP_SUBATTRIBUTE_IS_REQUIRED'); + } + } + } + + return; + } +} diff --git a/component/site/helpers/rsuserhelper.php b/component/site/helpers/rsuserhelper.php new file mode 100644 index 00000000000..7901f36c754 --- /dev/null +++ b/component/site/helpers/rsuserhelper.php @@ -0,0 +1,418 @@ +enqueueMessage($error, 'error'); + } +} diff --git a/component/site/helpers/statistic.php b/component/site/helpers/statistic.php new file mode 100644 index 00000000000..0fc221a42fa --- /dev/null +++ b/component/site/helpers/statistic.php @@ -0,0 +1,77 @@ +get('STATISTICS_ENABLE')) + { + RedshopHelperStatistic::recordVisitor(); + RedshopHelperStatistic::recordPage(); + } + } + + /** + * Method for store view of page. + * + * @return bool True on success. False otherwise. + * + * @deprecated 2.0.3 Use RedshopHelperStatistic::recordVisitor() instead. + */ + public function reshop_visitors() + { + return RedshopHelperStatistic::recordVisitor(); + } + + /** + * Method for store view of page. + * + * @return bool True on success. False otherwise. + * + * @deprecated 2.0.3 Use RedshopHelperStatistic::recordPage() instead. + */ + public function reshop_pageview() + { + return RedshopHelperStatistic::recordPage(); + } +} diff --git a/component/site/index.html b/component/site/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/language/en-GB/en-GB.com_redshop.ini b/component/site/language/en-GB/en-GB.com_redshop.ini new file mode 100755 index 00000000000..5f902deaeb7 --- /dev/null +++ b/component/site/language/en-GB/en-GB.com_redshop.ini @@ -0,0 +1,1046 @@ +; version 1.4.0 +; package Joomla.Site +; subpackage com_redshop +; author redWEB Aps +; translation en-GB source redWEB Aps +; copyright com_redshop (C) 2008 - 2017 redCOMPONENT.com +; license GNU/GPL, see LICENSE.php + +COM_REDSHOP_PLEASE_ENTER_EAN_NUMBER="Please enter EAN number" +COM_REDSHOP_EAN_NUMBER="EAN Number" +COM_REDSHOP_REQUISITION_NUMBER="Requisition Number" +COM_REDSHOP_PLEASE_ENTER_REQUISITION_NUMBER="Please enter requisition number" +COM_REDSHOP_COPY_TO_CART="Copy To Cart" +COM_REDSHOP_COPY_ORDERITEM_LBL="Action" +COM_REDSHOP_MINIMUM_QUANTITY_SHOULD_BE="Minimum Quantity should be" +COM_REDSHOP_MAXIMUM_QUANTITY_SHOULD_BE="Maximum Quantity should be" +COM_REDSHOP_DETAIL_ERROR_MESSAGE_LBL="Detail Error message from e-conomic" +COM_REDSHOP_PRODUCT_PRICE_ASC="Product Price Ascending" +COM_REDSHOP_PRODUCT_PRICE_DESC="Product Price Descending" +COM_REDSHOP_LOGIN_NEWWISHLIST="Please login or create an account!" +COM_REDSHOP_LOGIN_PROMPTWISHLIST="You have to login in order to add items to your wishlist" +COM_REDSHOP_ADD_TO_LOGINWISHLIST="Add To Login" +COM_REDSHOP_CREATE_LOGINACCOUNT="Create Account" +COM_REDSHOP_USERNAME_ALREADY_EXISTS="Username already exists" +COM_REDSHOP_EMAIL_ALREADY_EXISTS="Email already exists" +COM_REDSHOP_SUBATTRIBUTE_IS_REQUIRED="Please Select Sub Attribute" +COM_REDSHOP_YES="Yes" +COM_REDSHOP_NO="No" +COM_REDSHOP_NO_DISCOUNT_AVAILABLE="No Discount Available" +COM_REDSHOP_PRINT_LBL="Print" +COM_REDSHOP_BACK="Back" +COM_REDSHOP_DELETE_LBL="Delete" +COM_REDSHOP_EDIT_LBL="Edit" +COM_REDSHOP_CLICK_HERE="Click Here" +COM_REDSHOP_ATTRIBUTE="Attribute(s):" +COM_REDSHOP_MORE="More" +COM_REDSHOP_ORDER_LIST="Order List" +COM_REDSHOP_CREATE_ACCOUNT="Create Account" +COM_REDSHOP_ACCOUNT_MAINTAINANCE="Account Maintenance" +COM_REDSHOP_ACCOUNT_INFORMATION="Account Information" +COM_REDSHOP_ACCOUNT_LAYOUT_CARDS="Credit Cards List" +COM_REDSHOP_ACCOUNT_LAYOUT_CARDS_DESC="This view will show user's credit cards stored in payment gateway. For example: if site has paypal credit card plugin and vault is enabled then it will show list of all the credit cards." +COM_REDSHOP_SHIPPING_INFO="Shipping Information" +COM_REDSHOP_FILL_BILLING_ADDRESS="Fill out billing address" +COM_REDSHOP_FILL_SHIPPING_ADDRESS="Fill out shipping address" +COM_REDSHOP_UPDATE_SHIPPING_INFO="Add/Edit Addresses" +COM_REDSHOP_ORDER_INFORMATION="Order Information" +COM_REDSHOP_ORDER_TRANSACTION_FEE_LABEL="Order Transaction Fee" +COM_REDSHOP_SHIPPING_ADDRESSES="Shipping Addresses" +COM_REDSHOP_DEFAULT_SHIPPING_ADDRESS="Default (Same as Billing)" +COM_REDSHOP_COUPON_INFO="Coupon Information" +COM_REDSHOP_COUPON_CODE="Coupon code" +COM_REDSHOP_COUPON_VALUE="Coupon Value" +COM_REDSHOP_TOTAL_PRODUCT="Total Product" +COM_REDSHOP_TOTAL="Total" +COM_REDSHOP_NEWSLETTER_NAME="Newsletter Name" +COM_REDSHOP_SUBSCRIPTION="Subscription" +COM_REDSHOP_RESERVED_DISCOUNT_LBL="Remaining Discount" +COM_REDSHOP_LOGIN_USER_IS_NOT_REDSHOP_USER="The user logged in is not a redSHOP user, so please enter other required user detail" +COM_REDSHOP_STATUS="Status" +COM_REDSHOP_LOGOUT="Log out" +COM_REDSHOP_ALERTNOTAUTH_ACCOUNT="To access the private area of this site, please log in." +COM_REDSHOP_ORDER_ENCKEY_FAILURE="Order URL provided is not valid" +COM_REDSHOP_EDIT_ACCOUNT_INFORMATION="Edit Account Information" +COM_REDSHOP_DELETE_ACCOUNT="Delete Account" +COM_REDSHOP_DO_YOU_WANT_TO_DELETE="Do you really want to delete?" +COM_REDSHOP_ACCOUNT_DELETED_SUCCESSFULLY="Account Deleted Successfully" +COM_REDSHOP_ACCOUNT_DELETED_FAIL="Account Deleted Fail" +COM_REDSHOP_ORDER_DETAILS="Order Details" +COM_REDSHOP_CUSTOMER_FULLNAME="Full Name" +COM_REDSHOP_CUSTOMER_STATE="State" +COM_REDSHOP_CUSTOMER_COUNTRY="Country" +COM_REDSHOP_CUSTOMER_VATNUMBER="Tax number" +COM_REDSHOP_CUSTOMER_EMAIL="E-mail" +COM_REDSHOP_ORDER_NUM="Order #" +COM_REDSHOP_DETAILS="Details" +COM_REDSHOP_ADDRESS_INFORMATION="Address Information" +COM_REDSHOP_NO_ORDERS_PLACED_YET="No orders placed yet" +COM_REDSHOP_NO_QUOTATION_PLACED_YET="No Quote placed yet" +COM_REDSHOP_NO_COUPONS="No coupons available" +COM_REDSHOP_ORDER_DETAIL="Details" +COM_REDSHOP_ORDER_MAIL="Follow this link to view order details" +COM_REDSHOP_PAY_REMAINING="Pay Remaining" +COM_REDSHOP_MY_WISHLIST="My Wishlist" +COM_REDSHOP_MY_SERIALS="My Serials" +COM_REDSHOP_CREATE_NEWWISHLIST="Create New Wishlist" +COM_REDSHOP_PRODUCT_SAVED_IN_WISHLIST_SUCCESSFULLY="Product added to wishlist successfully" +COM_REDSHOP_WISHLIST_PRODUCT_DELETED_SUCCESSFULLY="Product Deleted From Wishlist Successfully" +COM_REDSHOP_WISHLIST_DELETED_SUCCESSFULLY="Wishlist Deleted Successfully" +COM_REDSHOP_ERROR_IN_DELETING_WISHLIST="Error while deleting Wishlist" +COM_REDSHOP_YOU_ARE_NOT_AUTHORIZE_TO_DELETE="You are not authorize to delete this wishlist" +COM_REDSHOP_MY_TAGS="My Tags" +COM_REDSHOP_TIP_TAGS="Use spaces to separate tags. Use single quotes (') for phrases." +COM_REDSHOP_SHOW_TAG="Show Tag(s)" +COM_REDSHOP_SHOW_WISHLIST_PRODUCTS="Show Wishlist" +COM_REDSHOP_WISHLIST_SAVE_SUCCESSFULLY="Product Added To Wishlist" +COM_REDSHOP_ALLREADY_ADDED_TO_WISHLIST="Already Added To Wishlist" +COM_REDSHOP_ADD_TO_WISHLIST="Add to Wishlist" +COM_REDSHOP_PRODUCT_TAGS="Product Tag(s)" +COM_REDSHOP_ADD_YOUR_TAGS="Add Your Tag(s)" +COM_REDSHOP_TAG_NAME="Tag Name" +COM_REDSHOP_ADD_TAGS="Add Tags" +COM_REDSHOP_TAGS_ARE_ADDED="Tag Is Added" +COM_REDSHOP_ALLREADY_ADDED="Already Added" +COM_REDSHOP_ERROR_SAVING_WISHLIST="Error Saving Wishlist" +COM_REDSHOP_ERROR_ADDING_TAGS="Error Adding Tag" +COM_REDSHOP_ERROR_DELETING_WISHLIST_PRODUCT="Error Deleting Wishlist Product" +COM_REDSHOP_TAG_EDITED_SUCCESSFULLY="Tag Edited Successfully" +COM_REDSHOP_ERROR_EDITING_TAG="Error Editing Tag" +COM_REDSHOP_ERROR_DELETING_TAG="Error Deleting Tag" +COM_REDSHOP_TAG_DELETED_SUCCESSFULLY="Tag Deleted Successfully" +COM_REDSHOP_REMOVE_TAG="Remove Tag" +COM_REDSHOP_EDIT_TAG="Edit Tags" +COM_REDSHOP_NO_TAGS_AVAILABLE="No Tag(s) Available" +COM_REDSHOP_NO_PRODUCTS_IN_WISHLIST="No Products In Wishlist" +COM_REDSHOP_NO_PRODUCTS_TO_COMPARE="No Products to Compare" +COM_REDSHOP_ADD_ONE_MORE_PRODUCT_TO_COMPARE="Add one more product to compare" +COM_REDSHOP_NO_PRODUCTS_IN_TAGS="No Products in This tag" +COM_REDSHOP_AVAILABLE_TAGS="Available Tag(s)" +COM_REDSHOP_BACK_TO_TAG_LIST="Back To Tag List" +COM_REDSHOP_BACK_TO_MYACCOUNT="Back To My account" +COM_REDSHOP_PROCEED="Proceed" +COM_REDSHOP_SELECT="Select" +COM_REDSHOP_PARTIAL_PAYMENT_DONE="Remaining payment done successfully" +COM_REDSHOP_PARTIAL_PAYMENT_FAILURE="Remaining payment failure" +COM_REDSHOP_REMAINING_AMOUNT_TOBE_PAID_BEFORE_DEL="Remaining amount to be paid before delivery" +COM_REDSHOP_REMOVE_ALL_PRODUCT_FROM_COMPARE_LIST="Remove all Items" +COM_REDSHOP_REMOVE_PRODUCT_FROM_COMPARE_LIST="Remove Product From Compare List" +COM_REDSHOP_COMPARE_PRODUCTS="Compare Products" +COM_REDSHOP_DESCRIPTION="Description" +COM_REDSHOP_SHORT_DESCRIPTION="Short Description" +COM_REDSHOP_LIMIT_CROSS_TO_COMPARE="Your Limit of Adding Products to Compare List is Over" +COM_REDSHOP_ADD_TO_COMPARE="Add to Compare" +COM_REDSHOP_SHOW_PRODUCTS_TO_COMPARE="Show Products To Compare" +COM_REDSHOP_PRODUCT_DELETED_FROM_COMPARE_SUCCESSFULLY="Product Deleted From Compare Successfully" +COM_REDSHOP_ERROR_DELETING_PRODUCT_FROM_COMPARE="Error Deleting Product From Compare List" +COM_REDSHOP_ERROR_ADDING_PRODUCT_TO_COMPARE="You can only compare products of the same category" +COM_REDSHOP_ERROR_REQUIRE_UNIQUE_PRODUCT_ID_TO_COMPARE="Items with unique product id are required" +COM_REDSHOP_ALLREADY_ADDED_TO_COMPARE="Already Added To Compare" +COM_REDSHOP_REMAININGTOPAY="Remaining to pay" +COM_REDSHOP_PRODUCT_NAME="Name" +COM_REDSHOP_QUESTION_PRODUCT_NAME="Product Name" +COM_REDSHOP_PRODUCT_PRICE="Product Price" +COM_REDSHOP_NEWEST="Newest" +COM_REDSHOP_ORDERING="Default Order" +COM_REDSHOP_REGULAR_PRICE="Regular Price:" +COM_REDSHOP_WEEKS="weeks" +COM_REDSHOP_DAYS="Days" +COM_REDSHOP_DAY="Day" +COM_REDSHOP_DELIVERY_TIME="Delivery Time :" +COM_REDSHOP_READ_MORE="Read more" +COM_REDSHOP_ADD_TO_CART="Add to cart" +COM_REDSHOP_PRE_ORDER="Pre Order" +COM_REDSHOP_PRODUCT_ID_LBL="Product Id:" +COM_REDSHOP_PRODUCT_NUMBER_LBL="Product Number:" +COM_REDSHOP_ACCESSORY_ADD_CHKBOX_LBL="Add" +COM_REDSHOP_PRODUCT_IN_STOCK_LBL="Total no of product in stock" +COM_REDSHOP_PRODUCT_WEIGHT_LBL="Product weight" +COM_REDSHOP_PRODUCT_VOLUME_LBL="Product volume" +COM_REDSHOP_PRODUCT_VOLUME_UNIT="m3" +COM_REDSHOP_PRODUCT_OLD_PRICE_LBL="Product old price" +COM_REDSHOP_PRODUCT_PRICE_SAVING_LBL="Product saving price" +COM_REDSHOP_PRODUCT_PRICE_SAVING_PERCENTAGE_LBL="You are saving %s" +COM_REDSHOP_SELECT_ORDER_BY="Order By:" +COM_REDSHOP_SELECT_FILTER_BY="Filter By:" +COM_REDSHOP_CATEGORY_IS_NOT_PUBLISHED="%s(%s) is not Published" +COM_REDSHOP_CATEGORY_NOT_FOUND="No category found." +COM_REDSHOP_CUSTOMER_INFORMATION="Customer Information" +COM_REDSHOP_BILL_TO_INFORMATION="Bill to information" +COM_REDSHOP_FIRSTNAME="First name" +COM_REDSHOP_LASTNAME="Last name" +COM_REDSHOP_ADDRESS="Address" +COM_REDSHOP_CITY="City" +COM_REDSHOP_PHONE="Phone" +COM_REDSHOP_ZIP="Postal code" +COM_REDSHOP_COMPANY_NAME="Company name" +COM_REDSHOP_VAT_NUMBER="Tax number" +COM_REDSHOP_TAX_EXEMPT="Tax exempt" +COM_REDSHOP_TAX_NO="No" +COM_REDSHOP_TAX_YES="Yes" +COM_REDSHOP_USERNAME="Username" +COM_REDSHOP_EMAIL="E-mail" +COM_REDSHOP_PASSWORD="Password" +COM_REDSHOP_CONFIRM_PASSWORD="Confirm password" +COM_REDSHOP_STATE="State" +COM_REDSHOP_COUNTRY="Country" +COM_REDSHOP_EMPTY_USERNAME="No username typed in - please try again" +COM_REDSHOP_EMPTY_EMAIL="No e-mail typed in - please try again" +COM_REDSHOP_PLEASE_ENTER_EMAIL_ADDRESS="Please enter email address" +COM_REDSHOP_PLEASE_ENTER_VALID_EMAIL_ADDRESS="Please enter valid email address" +COM_REDSHOP_PLEASE_ENTER_AMOUNT="Please enter valid amount" +COM_REDSHOP_PLEASE_ENTER_USERNAME="Please enter username" +COM_REDSHOP_PLEASE_ENTER_PASSWORD="Please enter password" +COM_REDSHOP_PASSWORD_NOT_MATCH="Password not match" +COM_REDSHOP_PLEASE_ENTER_FIRST_NAME="Please enter first name" +COM_REDSHOP_PLEASE_ENTER_LAST_NAME="Please enter last name" +COM_REDSHOP_PLEASE_ENTER_ADDRESS="Please enter address" +COM_REDSHOP_PLEASE_SELECT_COUNTRY="Please select country" +COM_REDSHOP_PLEASE_ENTER_ZIPCODE="Please enter postal code" +COM_REDSHOP_PLEASE_ENTER_CITY="Please enter city" +COM_REDSHOP_PLEASE_ENTER_PHONE="Please enter phone number" +COM_REDSHOP_PLEASE_ENTER_COMPANY_NAME="Please enter company name" +COM_REDSHOP_ADD_ADDRESS="Add address" +COM_REDSHOP_BILLING_INFORMATION_SAVE="Billing information saved" +COM_REDSHOP_ERROR_SAVING_BILLING_INFORMATION="Error in saving billing information" +COM_REDSHOP_BILLING_INFORMATION_EDITING_CANCELLED="Billing information editing cancelled" +COM_REDSHOP_SHIPPING_INFORMATION_SAVE="Shipping information saved" +COM_REDSHOP_ERROR_SAVING_SHIPPING_INFORMATION="Error in saving shipping information" +COM_REDSHOP_SHIPPING_INFORMATION_EDITING_CANCELLED="Shipping information editing cancelled" +COM_REDSHOP_ACCOUNT_SHIPPING_DELETED_SUCCESSFULLY="Shipping deleted successfully" +COM_REDSHOP_LOGIN_DESCRIPTION="To access the private area of this site, please log in." +COM_REDSHOP_LOGOUT_DESCRIPTION="You are currently logged in to the private area of this site." +COM_REDSHOP_CREATE_USER_LINK="New User Registration" +COM_REDSHOP_FORGOT_PWD_LINK="Forgot Password" +COM_REDSHOP_RELATED_PRODUCT="Related product" +COM_REDSHOP_ACCESSORY="Accessory:" +COM_REDSHOP_ATTRIBUTE_IS_REQUIRED="Please select" +COM_REDSHOP_REQUIRED="Required" +COM_REDSHOP_CHILD_PRODUCTS="Child Product" +COM_REDSHOP_PRODUCT_IS_NOT_PUBLISHED="%s(%s) is not Published" +COM_REDSHOP_ALERTNOTAUTH_REVIEW="Please login to write a review" +COM_REDSHOP_YOU_CAN_NOT_REVIEW_SAME_PRODUCT_AGAIN="You can not review the same product again." +COM_REDSHOP_PLEASE_RATE_THE_PRODUCT="Please rate the product" +COM_REDSHOP_PLEASE_COMMENT_ON_PRODUCT="Please comment on product" +COM_REDSHOP_RATING_TITLE="Title" +COM_REDSHOP_WRITE_REVIEW="Write review" +COM_REDSHOP_USER_FULLNAME="Full name" +COM_REDSHOP_SHOW_ALL_REVIEWS="Show All Reviews" +COM_REDSHOP_SEND_REVIEW="Send Review" +COM_REDSHOP_EXCELLENT="Excellent" +COM_REDSHOP_GOOD="Good" +COM_REDSHOP_RATING="Rating" +COM_REDSHOP_COMMENT="Your Comments" +COM_REDSHOP_WRITE_REVIEWFORM_HEADER_TEXT="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book." +COM_REDSHOP_WRITE_REVIEWFORM_FOOTER_TEXT="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book." +COM_REDSHOP_AVG_RATINGS_1="Average based on" +COM_REDSHOP_AVG_RATINGS_2="customer review(s)." +COM_REDSHOP_SELECT_SHIP_ADDRESS="Please enter or select your shipping address" +COM_REDSHOP_RETURNING_CUSTOMERS="Returning Customers: Please Log In" +COM_REDSHOP_NEW_CUSTOMERS="New customer? Please Provide Your Billing Information" +COM_REDSHOP_SEND_REGISTRATION="Sign Up" +COM_REDSHOP_BTN_CHECKOUTNEXT="Checkout: next step" +COM_REDSHOP_BTN_CHECKOUTFINAL="Checkout: final step" +COM_REDSHOP_ADD="Add" +COM_REDSHOP_CARD_INFORMATION="Credit Card Information" +COM_REDSHOP_NAME_ON_CARD="Card Holder Name" +COM_REDSHOP_CARD_NUM="Card Number" +COM_REDSHOP_EXPIRY_DATE="Expiration Date" +COM_REDSHOP_CARD_SECURITY_CODE="Card Security Number" +COM_REDSHOP_ORDERTOTAL="Order Total" +COM_REDSHOP_ORDER_RECEIPT="Order Receipt" +COM_REDSHOP_EMPTY_CART="Empty cart" +COM_REDSHOP_EMPTY="Empty cart" +COM_REDSHOP_PAYMENT="Payment" +COM_REDSHOP_RECEIPT="Receipt" +COM_REDSHOP_SHIPPING_METHOD="Shipping Method" +COM_REDSHOP_PAYMENT_METHOD="Payment Method" +COM_REDSHOP_PAYMENT_METHOD_CONFLICT="Payment Method Is Conflict" +COM_REDSHOP_PAYMENT_CREDIT_CARDS_NOT_FOUND="No credit card option found, please check your payment plugin params." +COM_REDSHOP_PAYMENT_NO_CREDIT_CARDS_PLUGIN_LIST_FOUND="No credit card plugins available." +COM_REDSHOP_SHIPPING_SAME_AS_BILLING="Shipping address same as billing" +COM_REDSHOP_CHECKOUT_ERR_NO_CCDATA="There is no CreditCard data..." +COM_REDSHOP_CHECKOUT_ERR_NO_CCNR_FOUND="Credit Card Number not found!" +COM_REDSHOP_CHECKOUT_ERR_NO_MON_FOUND="Credit card expiration month not found!" +COM_REDSHOP_CHECKOUT_ERR_NO_UNKNOWN_CCTYPE="Unknown card type" +COM_REDSHOP_CHECKOUT_ERR_NO_CARD_PROVIDED="No card number provided" +COM_REDSHOP_CHECKOUT_ERR_NO_CARD_INVALIDFORMAT="Credit card number has invalid format" +COM_REDSHOP_CHECKOUT_ERR_NO_CARD_INVALIDNUMBER="Credit card number is invalid" +COM_REDSHOP_CHECKOUT_ERR_NO_CARD_WRONGLENGTH="Credit card number is wrong length" +COM_REDSHOP_CHECKOUT_VAT_LBL="Tax :" +COM_REDSHOP_CHECKOUT_DISCOUNT_LBL="Discount :" +COM_REDSHOP_CHECKOUT_SHIPPING_LBL="Shipping :" +COM_REDSHOP_SELECT_PAYMENT_STATUS="Select Payment Status" +COM_REDSHOP_PAYMENT_STA_PAID="Paid" +COM_REDSHOP_PAYMENT_STA_UNPAID="Unpaid" +COM_REDSHOP_PAYMENT_STA_PARTIAL_PAID="Partial Paid" +COM_REDSHOP_RECEIPT_PARTIALLY_PAID_AMOUNT="Partially Paid Amount" +COM_REDSHOP_REMAINING_PARTIALLY_AMOUNT="Amount Remaining to pay" +COM_REDSHOP_EPAY_PAYMENT_TRANSACTION_SUCCESS="The payment has been processed. You can review your order details here" +COM_REDSHOP_PLEASE_SELECT_TEMS_CONDITIONS="Please accept Terms and conditions before clicking in the Checkout button." +COM_REDSHOP_TERMS_AND_CONDITIONS_LBL="Accept Terms & conditions" +COM_REDSHOP_TERMS_AND_CONDITIONS_FOR_LBL="For Webshop" +COM_REDSHOP_SELECT_PAYMENT_METHOD="Select Payment Method" +COM_REDSHOP_EMPTY_PASSWORD="Please enter a password" +COM_REDSHOP_ORDER_NUMBER_LBL="Order Number" +COM_REDSHOP_ORDER_ID_LBL="Order ID" +COM_REDSHOP_USER_REGISTRATION="Private Person" +COM_REDSHOP_COMPANY_REGISTRATION="Business" +COM_REDSHOP_REGISTRATION_HEADING="Registration" +COM_REDSHOP_COMPANY_IS_NOT_VAT_EXEMPTED="Company is not tax exempted" +COM_REDSHOP_COMPANY_IS_VAT_EXEMPTED="Company is tax exempted" +COM_REDSHOP_BUSINESS_NUMBER="Business Number" +COM_REDSHOP_SIGN_UP_FOR_NEWSLETTER="Yes, Sign me up for the newsletter" +COM_REDSHOP_DELETE_PRODUCT_FROM_CART_LBL="Delete product in cart" +COM_REDSHOP_UPDATE_PRODUCT_FROM_CART_LBL="Update product in cart" +COM_REDSHOP_CHECKOUT="Checkout" +COM_REDSHOP_VOUCHER_CODE="Voucher code" +COM_REDSHOP_COUPEN_CODE="Coupon Code" +COM_REDSHOP_SHOP_MORE="Continue" +COM_REDSHOP_UPDATE="Update" +COM_REDSHOP_SUBMIT_CODE="Submit" +COM_REDSHOP_DISCOUNT_TEXT="If you order for %s more, you will get at least %s DISCOUNT( %s )" +COM_REDSHOP_CART_TOTAL_PURCHASE_TBL="Total purchases" +COM_REDSHOP_CART_COUPON_CODE_TBL="GIFT CODE" +COM_REDSHOP_CART_DISCOUNT_CODE_TBL="Discount Code" +COM_REDSHOP_CART_CHECKOUT="Checkout" +COM_REDSHOP_PRODUCT_OUTOFSTOCK_MESSAGE="Sorry, This product is out of stock...." +COM_REDSHOP_VIEW_CART="View Cart" +COM_REDSHOP_CONTINUE_SHOPPING="Continue Shopping" +COM_REDSHOP_CART_SAVE="Display Cart" +COM_REDSHOP_CART_PRODUCT_ATTRIBUTE_CALCULATED_PRICE="(+ %s)" +COM_REDSHOP_SHOW_CART_TEXT="Your product(s) has been added to your cart" +COM_REDSHOP_IS_REQUIRED="is Required." +COM_REDSHOP_ENTER_NUMBER="Please Enter Numbers" +COM_REDSHOP_MINIMUM_ORDER_TOTAL_HAS_TO_BE_MORE_THAN="Minimum order total has to be more than" +COM_REDSHOP_NAME="Name" +COM_REDSHOP_SEND_TO_FRIEND="Send to Friend" +COM_REDSHOP_SEND_FRIEND="Send Friend" +COM_REDSHOP_YOUR_NAME="Your Name" +COM_REDSHOP_FRIENDS_NAME="Friend's name" +COM_REDSHOP_FRIENDS_EMAIL="Friend's email" +COM_REDSHOP_PLEASE_ENTER_NAME="Please enter your name." +COM_REDSHOP_PLEASE_ENTER_FRIENDS_NAME="Please enter your friend's name." +COM_REDSHOP_PLEASE_ENTER_FRIENDS_EMAIL_ADDRESS="Please enter your friend's email address." +COM_REDSHOP_EMAIL_HAS_BEEN_SENT_SUCCESSFULLY="Email has been sent successfully" +COM_REDSHOP_EMAIL_HAS_NOT_BEEN_SENT_SUCCESSFULLY="Email has not been sent successfully" +COM_REDSHOP_FILTER="Filter" +COM_REDSHOP_ORDER_ID="Order ID" +COM_REDSHOP_FULLNAME="Full Name" +COM_REDSHOP_ORDER_STATUS="Order Status" +COM_REDSHOP_ORDER_DATE="Order Date" +COM_REDSHOP_ORDER_TOTAL="Order Total" +COM_REDSHOP_ORDER="Order" +COM_REDSHOP_INCLUDE_COMMENT_MSG="Include this comment?" +COM_REDSHOP_NOTIFY_CUSTOMER_MSG="Notify Customer?" +COM_REDSHOP_ORDER_PRODUCT_NOTE="Note" +COM_REDSHOP_PRODUCT_QTY="Quantity" +COM_REDSHOP_TOTAL_PRICE="Total Price" +COM_REDSHOP_ORDER_SUBTOTAL="Order Subtotal" +COM_REDSHOP_ORDER_TAX="TAX" +COM_REDSHOP_ORDER_DISCOUNT="Discount" +COM_REDSHOP_ORDER_SHIPPING="Shipping" +COM_REDSHOP_ORDER_NUMBER="Order Number" +COM_REDSHOP_BILLING_ADDRESS_INFORMATION="Billing Address Information" +COM_REDSHOP_SHIPPING_ADDRESS_INFORMATION="Shipping Address Information" +COM_REDSHOP_RESET="Reset" +COM_REDSHOP_ORDER_DATE_LBL="Order Date" +COM_REDSHOP_ORDER_STAUS_LBL="Order Status" +COM_REDSHOP_PAYMENT_STAUS_LBL="Payment Status" +COM_REDSHOP_ORDER_INFORMATION_LBL="Order Information" +COM_REDSHOP_BILLING_ADDRESS_INFORMATION_LBL="Billing Address Information" +COM_REDSHOP_SHIPPING_ADDRESS_INFO_LBL="Shipping Address Information" +COM_REDSHOP_ORDER_DETAIL_LBL="Order Details" +COM_REDSHOP_PRODUCT_NAME_LBL="Name" +COM_REDSHOP_NOTE_LBL="Note" +COM_REDSHOP_PRICE_LBL="Price" +COM_REDSHOP_QUANTITY_LBL="Quantity" +COM_REDSHOP_TOTAL_PRICE_LBL="Total Price" +COM_REDSHOP_ORDER_SUBTOTAL_LBL="Order Subtotal" +COM_REDSHOP_TOTAL_LBL="Total" +COM_REDSHOP_CART_LBL="Shopping Cart" +COM_REDSHOP_MINIMUM_DELIVERY_TIME="Minimum Delivery Time" +COM_REDSHOP_MAXIMUM_DELIVERY_TIME="Maximum Delivery Time" + +COM_REDSHOP_QUANTITY="Quantity" +COM_REDSHOP_VOLUME="Volume" + +COM_REDSHOP_SUBSCRIBE_SUCCESS="Please, check your emails for newsletter confirmation message" +COM_REDSHOP_MESSAGE_CONFIRMED_SUBSCRIBE="please, confirm your email for newsletter." +COM_REDSHOP_ALREADY_NEWSLETTER_SUBSCRIBER="Newsletter was correctly confirmed/email address match/or similar" +COM_REDSHOP_CANCLE_SUBSCRIPTION="Cancel Subscription" +COM_REDSHOP_CANCLE_SUBSCRIPTION_FAIL="Cancel Subscription Fail" +COM_REDSHOP_NEWSLETTER_SUBSCRIPTION="Newsletter Subscription" +COM_REDSHOP_SUBSCRIBE="Subscribe" +COM_REDSHOP_UNSUBSCRIBE="Unsubscribe" +COM_REDSHOP_NEWSLETTER="Newsletter" +COM_REDSHOP_ENTER_AN_EMAIL_ADDRESS="Enter an E-mail Address." +COM_REDSHOP_EMAIL_ADDRESS_NOT_VALID="Enter Valid E-mail Address." +COM_REDSHOP_PRODUCT_ON_SALE="Product On Sale" +COM_REDSHOP_ORDER_ITEM="Order Item" +COM_REDSHOP_ORDER_NOT_FOUND="Order Not Found" +COM_REDSHOP_SHIPPING_NAME="Shipping Method Name" +COM_REDSHOP_SHIPPING_CLASS="Shipping Class" +COM_REDSHOP_SHIPPING_METHOD_MUST_HAVE_A_NAME="Shipping Method Must Have a Name." +COM_REDSHOP_SHIPPING_RATE_NAME="Shipping Rate Name" +COM_REDSHOP_SHIPPING_RATE_VOLUME_START="Volume Start" +COM_REDSHOP_SHIPPING_RATE_VOLUME_END="Volume End" +COM_REDSHOP_SHIPPING_RATE_ORDERTOTAL_START="Order Total Start" +COM_REDSHOP_SHIPPING_RATE_ORDERTOTAL_END="Order Total End" +COM_REDSHOP_SHIPPING_RATE_ZIP_START="Zip code start" +COM_REDSHOP_SHIPPING_RATE_ZIP_END="Zip code end" +COM_REDSHOP_SHIPPING_RATE_VALUE="Shipping Rate" +COM_REDSHOP_SHIPPING_RATE_PRIORITY="Shipping Priority" +COM_REDSHOP_SHIPPING_RATE_NAME_MUST_HAVE_A_NAME="Shipping Rate Name Must Have a Name." +COM_REDSHOP_SHIPPING_RATE_SAVED="Shipping Rate Saved" +COM_REDSHOP_SEARCH="Search" +COM_REDSHOP_GO="Go" +COM_REDSHOP_MSG_SORRY_NO_RESULT_FOUND="Sorry, No Result Found." +COM_REDSHOP_SAMPLE_SEND_SUCCSEEFULLY="Sample Sent Successfully" +COM_REDSHOP_VIEW_ALL_MANUFACTURER_PRODUCTS="View All Manufacturer Products" +COM_REDSHOP_SPECIAL_PRICE="Special Price:" +COM_REDSHOP_EPAY_PAYMENT_ERROR="Error in online payment - try again" +COM_REDSHOP_PHPSHOP_PAYMENT_ERROR="Error in online payment - try again" +COM_REDSHOP_PAY="Pay" +COM_REDSHOP_ALPHABETICALLY="Alphabetically" +COM_REDSHOP_EMAIL_TO_FRIEND="Send E-Mail to Friend" +COM_REDSHOP_EMAIL_TO="Your Friend E-Mail" +COM_REDSHOP_SENDER="Sender" +COM_REDSHOP_SUBJECT="Subject" +COM_REDSHOP_SEND="Send" +COM_REDSHOP_PLEASE_ENTER_EMAIL_TO="Please enter your friend's address" +COM_REDSHOP_PLEASE_ENTER_SENDER_NAME="Please enter Your Name" +COM_REDSHOP_PLEASE_ENTER_SENDER_EMAIL="Please enter Your E-Mail" +COM_REDSHOP_PLEASE_ENTER_SUBJECT="Please enter E-mail Subject" +COM_REDSHOP_SEND_SUCCESSFULLY="Send Successfully" +COM_REDSHOP_ERROR_SENDING="Error Sending E-Mail" +COM_REDSHOP_REMOVE_PRODUCT_FROM_WISHLIST="Remove Product" +COM_REDSHOP_SELECT_MANUFACTURE="Select Manufacturer" +COM_REDSHOP_CATALOG_SEND_SUCCSEEFULLY="Catalogue Sent Successfully" +COM_REDSHOP_SELECT_WRAPPER="Select wrapping" +COM_REDSHOP_ADD_WRAPPER="Add Wrapping" +COM_REDSHOP_WRAPPER="Wrapping" +COM_REDSHOP_JANUARY="January" +COM_REDSHOP_FEBRUARY="February" +COM_REDSHOP_MARCH="March" +COM_REDSHOP_APRIL="April" +COM_REDSHOP_MAY="May" +COM_REDSHOP_JUNE="June" +COM_REDSHOP_JULY="July" +COM_REDSHOP_AUGUST="August" +COM_REDSHOP_SEPTEMBER="September" +COM_REDSHOP_OCTOBER="October" +COM_REDSHOP_NOVEMBER="November" +COM_REDSHOP_DECEMBER="December" +COM_REDSHOP_JAN="Jan" +COM_REDSHOP_FEB="Feb" +COM_REDSHOP_MAR="Mar" +COM_REDSHOP_APR="Apr" +COM_REDSHOP_JUN="Jun" +COM_REDSHOP_JUL="Jul" +COM_REDSHOP_AUG="Aug" +COM_REDSHOP_SEP="Sep" +COM_REDSHOP_OCT="Oct" +COM_REDSHOP_NOV="Nov" +COM_REDSHOP_DEC="Dec" +COM_REDSHOP_MONDAY="Monday" +COM_REDSHOP_TUESDAY="Tuesday" +COM_REDSHOP_WEDNESDAY="Wednesday" +COM_REDSHOP_THURSDAY="Thursday" +COM_REDSHOP_FRIDAY="Friday" +COM_REDSHOP_SATURDAY="Saturday" +COM_REDSHOP_SUNDAY="Sunday" +COM_REDSHOP_MON="Mon" +COM_REDSHOP_TUE="Tue" +COM_REDSHOP_WED="Wed" +COM_REDSHOP_THU="Thu" +COM_REDSHOP_FRI="Fri" +COM_REDSHOP_SAT="Sat" +COM_REDSHOP_SUN="Sun" +COM_REDSHOP_SHIPPING_METHOD_LBL="Shipping Method Name" +COM_REDSHOP_CUSTOMER_NOTE_LBL="Customer Note" +COM_REDSHOP_PAYMENT_DISCOUNT_LBL="Payment Discount" +COM_REDSHOP_PAYMENT_CHARGES_LBL="Payment Charges" +COM_REDSHOP_THIRDPARTY_EMAIL_LBL="Third-party Email" +COM_REDSHOP_TEMPLATE_SELECTOR_CATEGORY_LBL="Switch Layout" +COM_REDSHOP_PRODUCT_NUMBER="Product Number" +COM_REDSHOP_PRODUCT_QUANTITY="Product Quantity" +COM_REDSHOP_ASK_QUESTION_ABOUT_PRODUCT="Ask Question About Product" +COM_REDSHOP_YOUR_EMAIL="Your Email" +COM_REDSHOP_YOUR_QUESTION="Your Question" +COM_REDSHOP_NO_PRODUCT_FOUND="No Product Found." +COM_REDSHOP_LOADING="Loading" +COM_REDSHOP_SAVE_WISHLIST="Save Wishlist" +COM_REDSHOP_WISHLIST_NAME="Wishlist Name" +COM_REDSHOP_CREATE_SAVE="Save" +COM_REDSHOP_PLEASE_ENTER_WISHLIST_NAME="Please Enter Wishlist Name" +COM_REDSHOP_CREATE_NEW_WISHLIST="Create New Wishlist" +COM_REDSHOP_PLEASE_SELECT_WISHLIST="Please Select Wishlist" +COM_REDSHOP_YOU_DONT_HAVE_ACCESS_TO_DELETE_THIS_PRODUCT="You don't have access to delete this product" +COM_REDSHOP_TOKEN_VARIFICATION="Token Verification" +COM_REDSHOP_DOWNLOAD_PRODUCTS="Downloadable Product Types" +COM_REDSHOP_TOKEN_ID="Token ID" +COM_REDSHOP_SUBMIT_TOKEN="Verify Token" +COM_REDSHOP_FILE_EXTENSION_NOT_ALLOWED="File extension is not legal." +COM_REDSHOP_NO_FILE_SELECTED="No file is Selected" +COM_REDSHOP_DOWNLOAD_LIMIT_OVER="Download Limit is Over" +COM_REDSHOP_DOWNLOADABLE_THIS_PRODUCT="Your Products for Download" +COM_REDSHOP_TOKEN_VERIFICATION_FAIL="Your Token is not Valid" +COM_REDSHOP_AREA="Area" +COM_REDSHOP_MILLIMETER="Millimetre" +COM_REDSHOP_CENTIMETER="Centimetre" +COM_REDSHOP_METER="Meter" +COM_REDSHOP_CIRCUMFERENCE="Circumference" +COM_REDSHOP_SAGEPAY_AUTHORISED="AUTHORISED - The transaction was successfully authorised with the bank." +COM_REDSHOP_SAGEPAY_MALFORMED="MALFORMED - The StatusDetail was malformed" +COM_REDSHOP_SAGEPAY_INVALID="INVALID - The StatusDetail was invalid" +COM_REDSHOP_SAGEPAY_DECLINED="DECLINED - The transaction was not authorised by the bank." +COM_REDSHOP_SAGEPAY_REJECTED="REJECTED - The transaction was failed by your 3D-Secure or AVS/CV2 rule-bases." +COM_REDSHOP_SAGEPAY_AUTHENTICATED="AUTHENTICATED - The transaction was successfully 3D-Secure Authenticated and can now be Authorised." +COM_REDSHOP_SAGEPAY_REGISTERED="REGISTERED - The transaction was could not be 3D-Secure Authenticated, but has been registered to be Authorised." +COM_REDSHOP_SAGEPAY_ERROR="ERROR - There was an error during the payment process." +COM_REDSHOP_SAGEPAY_UNKNOWN="UNKNOWN - An unknown status was returned from Sage Pay." +COM_REDSHOP_UPLOAD="Upload" +COM_REDSHOP_UPLOADING="Uploading" +COM_REDSHOP_UPLOADED_FILE="Uploaded File" +COM_REDSHOP_PLEASE_ENTER_PRODUCT_NUMBER="Please Enter Product Number" +COM_REDSHOP_SHIPPING_CALCULATOR="Shipping Calculator" +COM_REDSHOP_REQUEST_QUOTATION="Request a Quote" +COM_REDSHOP_REQUESTED="Requested" +COM_REDSHOP_REPLIED="Replied" +COM_REDSHOP_ACCEPTED="Accepted" +COM_REDSHOP_REJECTED="Rejected" +COM_REDSHOP_ORDERED="Ordered" +COM_REDSHOP_ACCEPT="Accept" +COM_REDSHOP_REJECT="Reject" +COM_REDSHOP_QUOTATION="Quotation" +COM_REDSHOP_VIEW_QUOTATION="View Quotation" +COM_REDSHOP_QUOTATION_ID="Quotation ID" +COM_REDSHOP_QUOTATION_STATUS="Quotation Status" +COM_REDSHOP_QUOTATION_DATE="Quotation Date" +COM_REDSHOP_QUOTATION_DETAIL="Quotation Detail" +COM_REDSHOP_QUOTATION_MANAGEMENT="Quotation Management" +COM_REDSHOP_QUOTATION_INFORMATION="Quotation Information" +COM_REDSHOP_QUOTATION_NUMBER="Quotation Number" +COM_REDSHOP_QUOTATION_IPADDRESS="Quotation IP Address" +COM_REDSHOP_QUOTATION_NOTE="Quotation Note" +COM_REDSHOP_QUOTATION_CUSTOMER_NOTE="Customer Note:" +COM_REDSHOP_QUOTATION_DETAILS="Quotation Details" +COM_REDSHOP_ERROR_SAVING_QUOTATION_DETAIL="Error Saving Quotation Detail" +COM_REDSHOP_ERROR_SENDING_QUOTATION_MAIL="Error sending Quotation mail" +COM_REDSHOP_QUOTATION_DETAIL_SENT="Quotation detail has been sent successfully" +COM_REDSHOP_CONFIRM_SEND_QUOTATION="Are you sure you want to submit Quotation?" +COM_REDSHOP_QUOTATION_SUBTOTAL="Quotation SubTotal" +COM_REDSHOP_QUOTATION_TAX="Quotation Tax" +COM_REDSHOP_QUOTATION_TOTAL="Quotation Total" +COM_REDSHOP_QUOTATION_ENCKEY_FAILURE="URL provided for Quote is not valid or Quotation is not existed" +COM_REDSHOP_QUOTATION_STATUS_UPDATED_SUCCESSFULLY="Quotation Status updated successfully" +COM_REDSHOP_NOACCESS_QUOTATION="You are not authorised to access this Quotation" +COM_REDSHOP_QUOTATION_DETAIL_SAVED="Quotation detail saved" +COM_REDSHOP_QUOTATION_DETAIL_EDITING_CANCELLED="Quotation detail editing cancelled" +COM_REDSHOP_QUOTATION_SENT_AND_USERNAME_PASSWORD_HAS_BEEN_MAILED="Quotation has been sent & username, password has been sent in your mail" +COM_REDSHOP_UNIT="Unit" +COM_REDSHOP_RADIUS="Radius" +COM_REDSHOP_HEIGHT="Height" +COM_REDSHOP_WIDTH="Width" +COM_REDSHOP_LENGTH="Length" +COM_REDSHOP_CALCULATE="Calculate" +COM_REDSHOP_TOTAL_PIECE="Total Piece:" +COM_REDSHOP_TOTAL_AREA="Total Area:" +COM_REDSHOP_PRICE_PER_PIECE="Price Per Piece:" +COM_REDSHOP_PRICE_OF_ALL_PIECE="Price of all Piece:" +COM_REDSHOP_PRICE_TOTAL="Total Price:" +COM_REDSHOP_PRICE_PER_AREA="Price Per Area:" +COM_REDSHOP_SHIPPING_BOXES="Shipping Boxes" +COM_REDSHOP_NO_SHIPPING_BOX="No Shipping Box" +COM_REDSHOP_YOU_ARE_NOT_AUTHORIZED_TO_ACCESS="Sorry, You are not authorised to access this file." +COM_REDSHOP_XMLFILE_IS_UNPUBLISHED="Sorry, XML file is unpublished." +COM_REDSHOP_AUTHENTICATIONFAIL="Shopper Group has no access to this page" +COM_REDSHOP_PRICE_INCLUDING_TAX="(price including tax)" +COM_REDSHOP_PRICE_EXCLUDING_TAX="(price excluding tax)" +COM_REDSHOP_STOCK_AMOUNT="Stock Amount" +COM_REDSHOP_COUPON_CODE_IS_NOT_VALID="The discount code is not valid" +COM_REDSHOP_VOUCHER_CODE_IS_NOT_VALID="The voucher discount code is note valid" +COM_REDSHOP_DISCOUNT_CODE_IS_VALID="The discount code is valid" +COM_REDSHOP_DISCOUNT_CODE_IS_VALID_NOT_APPLY_PRODUCTS_ON_SALE="The discount code is valid. Please notice that discount code do not apply to products on sale" +COM_REDSHOP_PLEASE_SELECT_DISCOUNT_TYPE="Please select a discount type" +COM_REDSHOP_ORDER_NOT_PLACED="Order not placed yet." +COM_REDSHOP_ORDER_PLACED="Order placed." +COM_REDSHOP_DEFAULT_SHOPPER_GROUP_SHIPPING="Default Shopper Group Shipping" +COM_REDSHOP_TRANSACTION_APPROVED="This transaction has been approved." +COM_REDSHOP_TRANSACTION_DECLINE="This transaction has been declined." +COM_REDSHOP_CAPTCHA="Captcha" +COM_REDSHOP_FRONT_IMAGE="Front Image" +COM_REDSHOP_BACK_IMAGE="Back Image" +COM_REDSHOP_NO_ATTRIBUTE_TO_CHANGE="No Attribute to change" +COM_REDSHOP_CHANGE_ATTRIBUTE="Change Attribute" +COM_REDSHOP_SELECT_PRODUCT_SUBSCRIPTION="Select product subscription" +COM_REDSHOP_PRODUCT_USERFIELD="Product Userfield" +COM_REDSHOP_CONFIRM_CART_EMPTY="Are you sure want to reorder? It will empty Current cart." +COM_REDSHOP_REORDER="Reorder" +COM_REDSHOP_FILE_NOT_AVAILABLE_IN_DB="File not available in database" +COM_REDSHOP_PLEASE_SELECT_YOUR="Please select your" +COM_REDSHOP_RETYPE_CUSTOMER_EMAIL="Retype Email Address" +COM_REDSHOP_ACCESSORY_QUANTITY_LBL="Accessory Quantity" +COM_REDSHOP_PRODUCT_ADDED_TO_CART="Product has been added to your cart." +COM_REDSHOP_USER_REQUEST_TAX_EXEMPT_LBL="User requested Tax exempt" +COM_REDSHOP_TOOLTIP_USER_REQUEST_TAX_EXEMPT="User requested Tax exempt" +COM_REDSHOP_PROPERTY_IMAGE_LBL="Property Image" +COM_REDSHOP_VIRTUAL_NUMBER_LBL="Virtual Number" +COM_REDSHOP_PROPERTY_NAME_LBL="Property Name" +COM_REDSHOP_PROPERTY_PRICE_LBL="Property Price" +COM_REDSHOP_PROPERTY_STOCK_LBL="Property Stock" +COM_REDSHOP_ADD_TO_CART_LBL="Add To Cart" +COM_REDSHOP_IN_STOCK="In Stock" +COM_REDSHOP_NOT_IN_STOCK="Not In Stock" +COM_REDSHOP_PRODUCT_DATE_FIELD_EXPIRED="Product Date Expired" +COM_REDSHOP_PRODUCT_DIAMETER_LBL="Diameter" +COM_REDSHOP_USER_TAX_EXEMPT_REQUEST_LBL="User tax exempt Request" +COM_REDSHOP_SUBTOTAL_EXCL_VAT_LBL="Subtotal Excluding Tax" +COM_REDSHOP_NEWSLETTER_NOT_AVAILABLE="Newsletter is not available" +COM_REDSHOP_USER_INFORMATION_NOT_MATCH="User country, state, zipcode might not be matched..." +COM_REDSHOP_PRODUCT_DETAIL_NOT_MATCH="Product or product category might not be shipped into this county." +COM_REDSHOP_CART_DIMENTION_NOT_MATCH="Cart volume(weight,height,length), order total might not be matched...." +COM_REDSHOP_VIEW_MANUFACTURER="View Manufacturer" +COM_REDSHOP_ADD_TO_CART_TOOLTIP="Add To Cart" +COM_REDSHOP_REQUEST_A_QUOTE_TOOLTIP="Request a Quote" +COM_REDSHOP_REQUEST_A_QUOTE="Request a Quote" +COM_REDSHOP_YOU_NEED_TO_LOGIN_TO_POST_A_REVIEW="You need to log in to write review" +COM_REDSHOP_YOUR_MUST_PROVIDE_A_ADDRESS="Please enter address" +COM_REDSHOP_YOUR_MUST_PROVIDE_A_ZIP="Please enter post code" +COM_REDSHOP_YOUR_MUST_PROVIDE_A_CITY="Please enter city" +COM_REDSHOP_YOUR_MUST_PROVIDE_A_PHONE="Please enter the phone" +COM_REDSHOP_YOUR_MUST_PROVIDE_A_FIRSTNAME="Please enter first name" +COM_REDSHOP_YOUR_MUST_PROVIDE_A_LASTNAME="Please enter last name" +COM_REDSHOP_YOU_MUST_PROVIDE_LOGIN_NAME="Please enter username" +COM_REDSHOP_PROVIDE_EMAIL_ADDRESS="Please enter email address" +COM_REDSHOP_EMAIL_NOT_MATCH="Email address do not match" +COM_REDSHOP_THIS_FIELD_IS_REQUIRED="This field is required" +COM_REDSHOP_DENOTATION_TXT="* Values denoted are vat exempt and will be calculated accordingly." +COM_REDSHOP_SHIPPING_TEXT_LBL="If you order for %s more, you will get free shipping" +COM_REDSHOP_FREE_SHIPPING_RATE_IS_IN_USED="Free shipping rate is in used" +COM_REDSHOP_NO_SHIPPING_RATE_AVAILABLE="No Free shipping rate is available." +COM_REDSHOP_OUT_OF_STOCK="Out of Stock." +COM_REDSHOP_AVAILABLE_STOCK="In Stock." +COM_REDSHOP_BACK_BUTTON="Back" +COM_REDSHOP_PRODUCT_SUBTOTAL_LBL="Subtotal" +COM_REDSHOP_PRODUCT_SUBTOTAL_EXCL_LBL="Subtotal excl vat" +COM_REDSHOP_SHIPPING_WITH_VAT_LBL="Shipping with vat" +COM_REDSHOP_SHIPPING_EXCL_VAT_LBL="Shipping excl vat" +COM_REDSHOP_PRODUCT_PRICE_EXCL_LBL="Price excl" +COM_REDSHOP_NO_SHIPPING_RATE_AVAILABLE_WHEN_NOPRODUCT_IN_CART="No free shipping rate is available since there is no product in cart" +COM_REDSHOP_NOT_AVAILABLE="Not Available" +COM_REDSHOP_GO_BACK="Go Back" +COM_REDSHOP_DISCOUNT_CALC_HEIGHT="Height:" +COM_REDSHOP_DISCOUNT_CALC_WIDTH="Width:" +COM_REDSHOP_DISCOUNT_CALC_LENGTH="Length:" +COM_REDSHOP_DISCOUNT_CALC_RADIUS="Radius:" +COM_REDSHOP_DISCOUNT_CALC_UNIT="Unit:" +COM_REDSHOP_DISCOUNT_CALC_DEPTH="Depth:" +COM_REDSHOP_PLEASE_INSERT_HEIGHT="Please Insert Height" +COM_REDSHOP_PLEASE_INSERT_WIDTH="Please Insert Width" +COM_REDSHOP_PLEASE_INSERT_DEPTH="Please Insert Depth" +COM_REDSHOP_PLEASE_INSERT_RADIUS="Please Insert Radius" +COM_REDSHOP_PLEASE_INSERT_UNIT="Please Insert Unit" +COM_REDSHOP_SELECT_SUBSCRIPTION_PLAN="Please Select Your Subscription Plan" +COM_REDSHOP_VIEW_FULL_SIZE_IMAGE_LBL="View Full-Size Image" +COM_REDSHOP_WARNING_MSG_MAXIMUM_QUANTITY="Product is not available more than %s amount." +COM_REDSHOP_WARNING_MSG_MINIMUM_QUANTITY="Product is not available less than %s amount." +COM_REDSHOP_CHECKOUT_ERR_NO_CCNM_FOUND="Numeric value not accepted in card name." +COM_REDSHOP_CHECKOUT_ERR_NO_CCNR_NUM_FOUND="Only numeric value accepted in card number." +COM_REDSHOP_PRODUCT_IS_EXPIRED="%s(%s) is Expired" +COM_REDSHOP_PROVIDE_CORRECT_EMAIL_ADDRESS="Please enter a valid email address." +COM_REDSHOP_RELATED_PRODUCT_LIST_IN_LIGHTBOX="Related Product List" +COM_REDSHOP_NEWSLEETER_SUBSCRIBE_SUCCESS="You are successfully subscribed for newsletter." +COM_REDSHOP_PREORDER_PRODUCT_OUTOFSTOCK_MESSAGE="Sorry.... Pre-order Stock is out of Order." +COM_REDSHOP_SUBSCRIPTION_PERIOD="Subscription Period" +COM_REDSHOP_SUBSCRIPTION_PRICE="Subscription Price" +COM_REDSHOP_DEBITOR_NUMBER="Debtor Number" +COM_REDSHOP_PASSWORD_MIN_CHARACTER_LIMIT="Your password must be at least 5 characters long" +COM_REDSHOP_PRODUCT_NOT_ADDED_TO_CART="Product was not added to cart" +COM_REDSHOP_ERROR_CATALOG_SEND_SUCCSEEFULLY="Error Sending Catalogue Successfully" +COM_REDSHOP_SHOPPERGROUP_NOT_MATCH="Shopper group not match" +COM_REDSHOP_ERROR_SAMPLE_SEND_SUCCSEEFULLY="Error Sample Send Successfully" +COM_REDSHOP_PRODUCT_NOT_SAVED_IN_WISHLIST="Product was not saved in wishlist" +COM_REDSHOP_DOWNLOAD_TOKEN="Download Token" +COM_REDSHOP_DOWNLOAD_LEFT="Download(s) Left" +COM_REDSHOP_DOWNLOAD_ENDDATE="Download End Date" +COM_REDSHOP_ON="On" +COM_REDSHOP_FROM="From" +COM_REDSHOP_DOWNLOAD_LOG="Download Log" +COM_REDSHOP_QUOTATION_DISCOUNT_LBL="Quote Discount" +COM_REDSHOP_MONTH="Month" +COM_REDSHOP_PLEASE_SELECT_YOUR_SUBSCRIPTION_PLAN="Please select your subscription plan" +COM_REDSHOP_PRODUCT_NAME_ASC="Sort by product name asc" +COM_REDSHOP_PRODUCT_NAME_DESC="Sort by product name desc" +COM_REDSHOP_PRODUCT_NUMBER_ASC="Sort by product number asc" +COM_REDSHOP_PRODUCT_NUMBER_DESC="Sort by product number desc" +COM_REDSHOP_ORDERING_ASC="Sort order by asc" +COM_REDSHOP_ORDERING_DESC="Sort order by desc" +COM_REDSHOP_DATEPICKER_ASC="Date picker Asc" +COM_REDSHOP_DATEPICKER_DESC="Date picker Desc" +COM_REDSHOP_PRODUCT_ID_ASC="Sort by product ID asc" +COM_REDSHOP_PRODUCT_ID_DESC="Sort by product ID desc" +COM_REDSHOP_ACCESSORY_ID_ASC="Sort Accessories by ID Asc" +COM_REDSHOP_ACCESSORY_ID_DESC="Sort Accessories by ID Desc" +COM_REDSHOP_ACCESSORY_PRICE_ASC="Sort Accessories by Price Asc" +COM_REDSHOP_ACCESSORY_PRICE_DESC="Sort Accessories by Price Desc" +COM_REDSHOP_GLOBAL="Global" +COM_REDSHOP_CHILD_PRODUCT_NAME="Child Product Name" +COM_REDSHOP_CHILD_PRODUCT_NUMBER="Child Product Number" +COM_REDSHOP_TWO_LETTER_ABBRIVATION="Two Letter Abbreviation" +COM_REDSHOP_THREE_LETTER_ABBRIVATION="Three Letter Abbreviation" +COM_REDSHOP_NONE="None" +COM_REDSHOP_PRICE="Price" +COM_REDSHOP_TO="To" +COM_REDSHOP_COMPARE="Compare" +COM_REDSHOP_DELETE="Delete" +COM_REDSHOP_PASSWORDS_DO_NOT_MATCH="Passwords do not match" +COM_REDSHOP_ACCESS_FORBIDDEN="Access Forbidden" +COM_REDSHOP_INVALID_SECURITY="Sorry, you have provided an invalid security code." +COM_REDSHOP_SECURITY_CODE="Security Code :" +COM_REDSHOP_PRODUCT_IS_NOT_FOR_SALE="%s(%s) is Not For Sale" +COM_REDSHOP_ZIPCODE="ZIP code" +COM_REDSHOP_REG_COMPLETE_ACTIVATE="Registration Complete Activate" +COM_REDSHOP_REG_COMPLETE="Registration complete" +COM_REDSHOP_SEARCH_RESULT="Search results" +COM_REDSHOP_CLEAR_ALL="Clear All" +COM_REDSHOP_SEARCH_CRITERIA="Search criteria" +COM_REDSHOP_BULK_ORDER_LINK="Bulk order link" +COM_REDSHOP_BULK_ORDER="Bulk order" +COM_REDSHOP_CANCEL="Cancel" +COM_REDSHOP_SAVE="Save" +COM_REDSHOP_="Redshop" +COM_REDSHOP_ALERTNOTAUTH="Alert: You are not authorised" +COM_REDSHOP_PLEASE_ENTER_YOUR_NAME="Please enter your name" +COM_REDSHOP_APPLY="Apply" +COM_REDSHOP_EDIT="Edit" +COM_REDSHOP_TEMPLATE_NOT_EXISTS="Template not exists" +COM_REDSHOP_CUSTOMER_QUANTITY_LBL="Quantity" +COM_REDSHOP_CUSTOMER_AMOUNT_LBL="Amount" +COM_REDSHOP_REDSHOP="redSHOP" +COM_REDSHOP_LOGIN="Log in" +COM_REDSHOP_LOGOUT_SUCCESS="Logout success" +COM_REDSHOP_MANUFACTURER="Manufacturer" +COM_REDSHOP_MANUFACTURER_DETAIL="Manufacturer Details" +COM_REDSHOP_MANUFACTURER_PRODUCTS="Manufacturer Products" +COM_REDSHOP_ENTER_A_NAME="Enter a name" +COM_REDSHOP_PRODCUT_PRICE_YOU_SAVED="Product Price You Saved" +COM_REDSHOP_CATEGORY="Category" +COM_REDSHOP_NUM="Num" +COM_REDSHOP_PRODUCT="Product" +COM_REDSHOP_ACCOUNT_CREATION="Account Creation" +COM_REDSHOP_SUBMIT="Submit" +COM_REDSHOP_REGISTRATION_INTROTEXT="Registration intro text" +COM_REDSHOP_REGISTRATION_COMPANY_INTROTEXT="Company registration intro text" + +COM_REDSHOP_COUNTRY_AFGHANISTAN="Afghanistan" +COM_REDSHOP_COUNTRY_ALBANIA="Albania" +COM_REDSHOP_COUNTRY_ALGERIA="Algeria" +COM_REDSHOP_COUNTRY_ANDORRA="Andorra" +COM_REDSHOP_COUNTRY_ANGOLA="Angola" +COM_REDSHOP_COUNTRY_ANGUILLA="Anguilla" +COM_REDSHOP_COUNTRY_ANTARCTICA="Antarctica" +COM_REDSHOP_COUNTRY_ARGENTINA="Argentina" +COM_REDSHOP_COUNTRY_ARMENIA="Armenia" +COM_REDSHOP_COUNTRY_ARUBA="Aruba" +COM_REDSHOP_COUNTRY_AUSTRALIA="Australia" +COM_REDSHOP_COUNTRY_AUSTRIA="Austria" +COM_REDSHOP_COUNTRY_AZERBAIJAN="Azerbaijan" +COM_REDSHOP_COUNTRY_BAHAMAS="Bahamas" +COM_REDSHOP_COUNTRY_BAHRAIN="Bahrain" +COM_REDSHOP_COUNTRY_BANGLADESH="Bangladesh" +COM_REDSHOP_COUNTRY_BARBADOS="Barbados" +COM_REDSHOP_COUNTRY_BELARUS="Belarus" +COM_REDSHOP_COUNTRY_BELGIUM="Belgium" +COM_REDSHOP_COUNTRY_BELIZE="Belize" +COM_REDSHOP_COUNTRY_BENIN="Benin" +COM_REDSHOP_COUNTRY_BERMUDA="Bermuda" +COM_REDSHOP_COUNTRY_BHUTAN="Bhutan" +COM_REDSHOP_COUNTRY_BOLIVIA="Bolivia" +COM_REDSHOP_COUNTRY_BOTSWANA="Botswana" +COM_REDSHOP_COUNTRY_BRAZIL="Brazil" +COM_REDSHOP_COUNTRY_BRUNEI="Brunei Darussalam" +COM_REDSHOP_COUNTRY_BULGARIA="Bulgaria" +COM_REDSHOP_COUNTRY_BURUNDI="Burundi" +COM_REDSHOP_COUNTRY_CAMBODIA="Cambodia" +COM_REDSHOP_COUNTRY_CAMEROON="Cameroon" +COM_REDSHOP_COUNTRY_CANADA="Canada" +COM_REDSHOP_COUNTRY_CHAD="Chad" +COM_REDSHOP_COUNTRY_CHILE="Chile" +COM_REDSHOP_COUNTRY_CHINA="China" +COM_REDSHOP_COUNTRY_COLOMBIA="Colombia" +COM_REDSHOP_COUNTRY_CONGO="The Democratic Republic of Congo" +COM_REDSHOP_COUNTRY_CROATIA="Croatia" +COM_REDSHOP_COUNTRY_CUBA="Cuba" +COM_REDSHOP_COUNTRY_CYPRUS="Cyprus" +COM_REDSHOP_COUNTRY_DENMARK="Denmark" +COM_REDSHOP_COUNTRY_DJIBOUTI="Djibouti" +COM_REDSHOP_COUNTRY_DOMINICA="Dominica" +COM_REDSHOP_COUNTRY_ECUADOR="Ecuador" +COM_REDSHOP_COUNTRY_EGYPT="Egypt" +COM_REDSHOP_COUNTRY_ERITREA="Eritrea" +COM_REDSHOP_COUNTRY_ESTONIA="Estonia" +COM_REDSHOP_COUNTRY_ETHIOPIA="Ethiopia" +COM_REDSHOP_COUNTRY_FIJI="Fiji" +COM_REDSHOP_COUNTRY_FINLAND="Finland" +COM_REDSHOP_COUNTRY_FRANCE="France" +COM_REDSHOP_COUNTRY_GABON="Gabon" +COM_REDSHOP_COUNTRY_GAMBIA="Gambia" +COM_REDSHOP_COUNTRY_GEORGIA="Georgia" +COM_REDSHOP_COUNTRY_GERMANY="Germany" +COM_REDSHOP_COUNTRY_GHANA="Ghana" +COM_REDSHOP_COUNTRY_GIBRALTAR="Gibraltar" +COM_REDSHOP_COUNTRY_GREECE="Greece" +COM_REDSHOP_COUNTRY_GREENLAND="Greenland" +COM_REDSHOP_COUNTRY_GRENADA="Grenada" +COM_REDSHOP_COUNTRY_GUADELOUPE="Guadeloupe" +COM_REDSHOP_COUNTRY_GUAM="Guam" +COM_REDSHOP_COUNTRY_GUATEMALA="Guatemala" +COM_REDSHOP_COUNTRY_GUERNSEY="Guernsey" +COM_REDSHOP_COUNTRY_GUINEA="Guinea" +COM_REDSHOP_COUNTRY_GUYANA="Guyana" +COM_REDSHOP_COUNTRY_HAITI="Haiti" +COM_REDSHOP_COUNTRY_HONDURAS="Honduras" +COM_REDSHOP_COUNTRY_HUNGARY="Hungary" +COM_REDSHOP_COUNTRY_ICELAND="Iceland" +COM_REDSHOP_COUNTRY_INDIA="India" +COM_REDSHOP_COUNTRY_INDONESIA="Indonesia" +COM_REDSHOP_COUNTRY_IRAN="Iran (Islamic Republic of)" +COM_REDSHOP_COUNTRY_IRAQ="Iraq" +COM_REDSHOP_COUNTRY_IRELAND="Ireland" +COM_REDSHOP_COUNTRY_ISRAEL="Israel" +COM_REDSHOP_COUNTRY_ITALY="Italy" +COM_REDSHOP_COUNTRY_JAMAICA="Jamaica" +COM_REDSHOP_COUNTRY_JAPAN="Japan" +COM_REDSHOP_COUNTRY_JERSEY="Jersey" +COM_REDSHOP_COUNTRY_JORDAN="Jordan" +COM_REDSHOP_COUNTRY_KAZAKHSTAN="Kasakhstan" +COM_REDSHOP_COUNTRY_KENYA="Kenya" +COM_REDSHOP_COUNTRY_KIRIBATI="Kiribati" +COM_REDSHOP_COUNTRY_KUWAIT="Kuwait" +COM_REDSHOP_COUNTRY_KYRGYZSTAN="Kyrgyzstan" +COM_REDSHOP_COUNTRY_LAO="Lao People's Democratic Republic" +COM_REDSHOP_COUNTRY_LATVIA="Latvia" +COM_REDSHOP_COUNTRY_LEBANON="Lebanon" +COM_REDSHOP_COUNTRY_LESOTHO="Lesotho" +COM_REDSHOP_COUNTRY_LIBERIA="Liberia" +COM_REDSHOP_COUNTRY_LIBYA="Libya" +COM_REDSHOP_COUNTRY_LIECHTENSTEIN="Liechtenstein" +COM_REDSHOP_COUNTRY_LITHUANIA="Lithuania" +COM_REDSHOP_COUNTRY_LUXEMBOURG="Luxembourg" +COM_REDSHOP_COUNTRY_MACAU="Macau" +COM_REDSHOP_COUNTRY_MACEDONIA="Macedonia (Former Yugoslav Republic of)" +COM_REDSHOP_COUNTRY_MADAGASCAR="Madagascar" +COM_REDSHOP_COUNTRY_MALAWI="Malawi" +COM_REDSHOP_COUNTRY_MALAYSIA="Malaysia" +COM_REDSHOP_COUNTRY_MALDIVES="Maldives" +COM_REDSHOP_COUNTRY_MALI="Mali" +COM_REDSHOP_COUNTRY_MALTA="Malta" +COM_REDSHOP_COUNTRY_MARTINIQUE="Martinique" +COM_REDSHOP_COUNTRY_MAURITANIA="Mauritania" +COM_REDSHOP_COUNTRY_MAURITIUS="Mauritius" +COM_REDSHOP_COUNTRY_MAYOTTE="Mayotte" +COM_REDSHOP_COUNTRY_MEXICO="Mexico" +COM_REDSHOP_COUNTRY_MICRONESIA="Micronesia (Federated States of)" +COM_REDSHOP_COUNTRY_MOLDOVA="Moldova (Republic of)" +COM_REDSHOP_COUNTRY_MONACO="Monaco" +COM_REDSHOP_COUNTRY_MONGOLIA="Mongolia" +COM_REDSHOP_COUNTRY_MONTENEGRO="Montenegro" +COM_REDSHOP_COUNTRY_MONTSERRAT="Montserrat" +COM_REDSHOP_COUNTRY_MOROCCO="Morocco" +COM_REDSHOP_COUNTRY_MOZAMBIQUE="Mozambique" +COM_REDSHOP_COUNTRY_MYANMAR="Myanmar, Burma" +COM_REDSHOP_COUNTRY_NAMIBIA="Namibia" +COM_REDSHOP_COUNTRY_NAURU="Nauru" +COM_REDSHOP_COUNTRY_NEPAL="Nepal" +COM_REDSHOP_COUNTRY_NETHERLANDS="Holland" +COM_REDSHOP_COUNTRY_NICARAGUA="Nicaragua" +COM_REDSHOP_COUNTRY_NIGER="Niger" +COM_REDSHOP_COUNTRY_NIGERIA="Nigeria" +COM_REDSHOP_COUNTRY_NIUE="Niue" +COM_REDSHOP_COUNTRY_NORWAY="Norway" +COM_REDSHOP_COUNTRY_OMAN="Oman" +COM_REDSHOP_COUNTRY_PAKISTAN="Pakistan" +COM_REDSHOP_COUNTRY_PALAU="Palau" +COM_REDSHOP_COUNTRY_PANAMA="Panama" +COM_REDSHOP_COUNTRY_PARAGUAY="Paraguay" +COM_REDSHOP_COUNTRY_PERU="Peru" +COM_REDSHOP_COUNTRY_PHILIPPINES="Philippines" +COM_REDSHOP_COUNTRY_PITCAIRN="Pitcairn" +COM_REDSHOP_COUNTRY_POLAND="Poland" +COM_REDSHOP_COUNTRY_PORTUGAL="Portugal" +COM_REDSHOP_COUNTRY_QATAR="Qatar" +COM_REDSHOP_COUNTRY_ROMANIA="Romania" +COM_REDSHOP_COUNTRY_RUSSIA="Russian Federation" +COM_REDSHOP_COUNTRY_RWANDA="Rwanda" +COM_REDSHOP_COUNTRY_SAMOA="Samoa" +COM_REDSHOP_COUNTRY_SENEGAL="Senegal" +COM_REDSHOP_COUNTRY_SERBIA="Serbia" +COM_REDSHOP_COUNTRY_SEYCHELLES="Seychelles" +COM_REDSHOP_COUNTRY_SINGAPORE="Singapore" +COM_REDSHOP_COUNTRY_SLOVAKIA="Slovakia (Slovak Republic)" +COM_REDSHOP_COUNTRY_SLOVENIA="Slovenia" +COM_REDSHOP_COUNTRY_SOMALIA="Somalia" +COM_REDSHOP_COUNTRY_SPAIN="Spain" +COM_REDSHOP_COUNTRY_ST_BARTHELEMY="St. Barthelemy" +COM_REDSHOP_COUNTRY_ST_EUSTATIUS="St. Eustatius" +COM_REDSHOP_COUNTRY_ST_HELENA="St. Helena" +COM_REDSHOP_COUNTRY_SUDAN="Sudan" +COM_REDSHOP_COUNTRY_SVALBARD="Svalbard and Jan Mayen Islands" +COM_REDSHOP_COUNTRY_SWAZILAND="Swaziland" +COM_REDSHOP_COUNTRY_SWEDEN="Sweden" +COM_REDSHOP_COUNTRY_SWITZERLAND="Switzerland" +COM_REDSHOP_COUNTRY_SYRIA="Syrian Arab Republic" +COM_REDSHOP_COUNTRY_TAIWAN="Taiwan" +COM_REDSHOP_COUNTRY_TAJIKISTAN="Tadsjikistan" +COM_REDSHOP_COUNTRY_TANZANIA="Tanzania" +COM_REDSHOP_COUNTRY_THAILAND="Thailand" +COM_REDSHOP_COUNTRY_TOGO="Togo" +COM_REDSHOP_COUNTRY_TOKELAU="Tokelau" +COM_REDSHOP_COUNTRY_TONGA="Tonga" +COM_REDSHOP_COUNTRY_TUNISIA="Tunisia" +COM_REDSHOP_COUNTRY_TURKEY="Turkey" +COM_REDSHOP_COUNTRY_TURKMENISTAN="Turkmenistan" +COM_REDSHOP_COUNTRY_TUVALU="Tuvalu" +COM_REDSHOP_COUNTRY_UGANDA="Uganda" +COM_REDSHOP_COUNTRY_UKRAINE="Ukraine" +COM_REDSHOP_COUNTRY_URUGUAY="Uruguay" +COM_REDSHOP_COUNTRY_UZBEKISTAN="Uzbekistan" +COM_REDSHOP_COUNTRY_VANUATU="Vanuatu" +COM_REDSHOP_COUNTRY_VENEZUELA="Venezuela" +COM_REDSHOP_COUNTRY_VIETNAM="Vietnam" +COM_REDSHOP_COUNTRY_YEMEN="Yemen" +COM_REDSHOP_COUNTRY_YUGOSLAVIA="Yugoslavia" +COM_REDSHOP_COUNTRY_ZAMBIA="Zambia" +COM_REDSHOP_COUNTRY_ZIMBABWE="Zimbabwe" +COM_REDSHOP_DAY_FRI="Fri" +COM_REDSHOP_DAY_FRIDAY="Friday" +COM_REDSHOP_DAY_MON="Mon" +COM_REDSHOP_DAY_MONDAY="Monday" +COM_REDSHOP_DAY_SAT="Sat" +COM_REDSHOP_DAY_SATURDAY="Saturday" +COM_REDSHOP_DAY_SUN="Sun" +COM_REDSHOP_DAY_SUNDAY="Sunday" +COM_REDSHOP_DAY_THU="Thu" +COM_REDSHOP_DAY_THURSDAY="Thursday" +COM_REDSHOP_DAY_TUE="Tue" +COM_REDSHOP_DAY_TUESDAY="Tuesday" +COM_REDSHOP_DAY_WED="Wed" +COM_REDSHOP_DAY_WEDNESDAY="Wednesday" +COM_REDSHOP_DEBITOR_MONEY_TRANSFER_NUMBER="Debtor Money Transfer Number" +COM_REDSHOP_DOWNLOAD="Download" +COM_REDSHOP_MOBILE_PHONE="Mobile Phone" +COM_REDSHOP_MONTH_APR="Apr" +COM_REDSHOP_MONTH_APRIL="April" +COM_REDSHOP_MONTH_AUG="Aug" +COM_REDSHOP_MONTH_AUGUST="August" +COM_REDSHOP_MONTH_DEC="Dec" +COM_REDSHOP_MONTH_DECEMBER="December" +COM_REDSHOP_MONTH_FEB="Feb" +COM_REDSHOP_MONTH_FEBRUARY="February" +COM_REDSHOP_MONTH_JAN="Jan" +COM_REDSHOP_MONTH_JANUARY="January" +COM_REDSHOP_MONTH_JUL="Jul" +COM_REDSHOP_MONTH_JULY="July" +COM_REDSHOP_MONTH_JUN="Jun" +COM_REDSHOP_MONTH_JUNE="June" +COM_REDSHOP_MONTH_MAR="Mar" +COM_REDSHOP_MONTH_MARCH="March" +COM_REDSHOP_MONTH_MAY="May" +COM_REDSHOP_MONTH_NOV="Nov" +COM_REDSHOP_MONTH_NOVEMBER="November" +COM_REDSHOP_MONTH_OCT="Oct" +COM_REDSHOP_MONTH_OCTOBER="October" +COM_REDSHOP_MONTH_SEP="Sep" +COM_REDSHOP_MONTH_SEPTEMBER="September" +COM_REDSHOP_NEW="New" +COM_REDSHOP_ORDERS="Orders" +COM_REDSHOP_SELECT_MANUFACTURER="Select Manufacturer" +COM_REDSHOP_SHIPPING_BOX="Shipping Box" +COM_REDSHOP_TXT_READ_MORE="Read More" +COM_REDSHOP_UPDATE_STATUS_BUTTON="Update Status" +COM_REDSHOP_ORDER_DETAIL_LINK_LBL="Order Detail Link" +COM_REDSHOP_USERNAME_REGISTER="Select Username" +COM_REDSHOP_PASSWORD_REGISTER="Select Password" +COM_REDSHOP_MANUFACTURER_PRODUCT="Products of" +COM_REDSHOP_PRODUCT_CUSTOM_FIELD="Product Custom Field" +COM_REDSHOP_GET_ADDRESS_BY_PHONE="Get Address By Phone" +COM_REDSHOP_NO_RESULT_FOUND_BY_SEARCHPHONE="Sorry, No result found by phone" +COM_REDSHOP_TOTAL_PRICE_EXEL_LBL="Total Price excl" +COM_REDSHOP_CUSTOMER_MESSAGE_LBL="Customer message" +COM_REDSHOP_REFERRAL_CODE_LBL="Referral code" +COM_REDSHOP_MANUFACTURER_LINK_LBL="Read more about manufacturer" +COM_REDSHOP_MANUFACTURER_ALLPRODUCTSLINK_LBL="See all manufacturer Products" +COM_REDSHOP_TELEPHONE="Your Phone No." +COM_REDSHOP_AVAILABLE_STOCK_MESSAGE="Products are available for this item." +COM_REDSHOP_META_BUY="Buy" +COM_REDSHOP_META_AT_ONLY="at only" +COM_REDSHOP_META_SAVE="save" +COM_REDSHOP_PREORDER_BTN="PreOrder" +COM_REDSHOP_PROVIDE_ZIPCODE_TO_PICKUP_PARCEL="Zipcode" +COM_REDSHOP_SELECT_GLS_LOCATION="Pickup location" +COM_REDSHOP_ENTER_GLS_MOBILE="Mobile" +COM_REDSHOP_GLS_UPDATE="Update" +COM_REDSHOP_INVOICE="Invoice" +COM_REDSHOP_SHOPPER_GROUP_PORTAL_IS_DISABLE="Access denied" +COM_REDSHOP_SUBSCRIPTION_PLAN="Select Subscription Plan" +COM_REDSHOP_USERNAME_MIN_CHARACTER_LIMIT="Your username must consist of at least 2 characters" +COM_REDSHOP_YOUR_MUST_PROVIDE_A_VALID_PHONE="Please specify a valid phone number" +COM_REDSHOP_UNUSED_COUPON_LBL="Unused Amount" +COM_REDSHOP_ALREADY_REQUESTED_FOR_NOTIFICATION="You have requested for notification when product back in stock" +COM_REDSHOP_USER_PHONE_LBL="User Phone" +COM_REDSHOP_USER_ADDRESS_LBL="User Address" +COM_REDSHOP_ORDER_PAYMENT_EXTRA_FILEDS="Additional Payment data" +COM_REDSHOP_ORDER_SHIPPING_EXTRA_FILEDS="Additional Shipping data" +COM_REDSHOP_USER_EMAIL="User E-mail" +COM_REDSHOP_NAME_LBL="Name/Username" +COM_REDSHOP_EMAIL_LBL="E-mail" +COM_REDSHOP_CATALOG_SEND="Send" +COM_REDSHOP_SAMPLE_SEND="Send" +COM_REDSHOP_PER_PRODUCT_TOTAL="Minimum Per Product Total" +COM_REDSHOP_ALL_CATEGORY_VIEW_NO_RESULT_TEXT="No category found." +COM_REDSHOP_EAN_MIN_CHARACTER_LIMIT="Enter only 13 digits without spaces" +COM_REDSHOP_SPECIAL_DISCOUNT="Special discount" +COM_REDSHOP_ACCOUNT_LINK="Account Link" +COM_REDSHOP_NOTIFY_STOCK_LBL="You can requested notification when product back in stock" +COM_REDSHOP_NOTIFY_STOCK_BUTTON="Notify me" +COM_REDSHOP_STOCK_NOTIFICATION_ADDED_SUCCESSFULLY="Notification added" +COM_REDSHOP_THERE_ARE_NO_CATEGORIES_TO_SHOW="There are no categories to show" +COM_REDSHOP_VALIDATE_EXTRA_FIELD_IS_REQUIRED="Select %s" +COM_REDSHOP_ALERT_REGISTRATION_SUCCESSFULLY="%s registered successfully" +COM_REDSHOP_ALERT_ORDER_SUCCESSFULLY="%s ordered for %s %s" +COM_REDSHOP_ALERT_STOCKROOM_BELOW_AMOUNT_NUMBER_MAIN_SUBJECT="Product has stockroom below amount number" +COM_REDSHOP_ALERT_STOCKROOM_BELOW_AMOUNT_NUMBER="Product: %s SKU: %s has remaining %s in stockroom %s." + +; Library +COM_REDSHOP_ERROR_INVALID_PRODUCT_ID="Invalid product ID" +COM_REDSHOP_UPLOAD_FILE_TOO_BIG="File upload too big" +COM_REDSHOP_MEDIA_ERROR_FILE_UPLOAD_INVALID="File upload invalid!" +COM_REDSHOP_QUANTITY_START_LBL="Quantity start" +COM_REDSHOP_QUANTITY_END_LBL="Quantity end" +COM_REDSHOP_ORDER_STATUS_LOG="Order status log" +COM_REDSHOP_ORDER_STATUS_CHANGE_TO="Status has been changed to" +COM_REDSHOP_ORDER_PAYMENT_STATUS_CHANGE_TO="Payment status has been changed to" + +; Extra fields Layout +COM_REDSHOP_PUBLISHED_DATE="Publish Date" +COM_REDSHOP_ENTER_AVAILABLE_DATE="Enter Available Date" +COM_REDSHOP_ADD_VALUE="Add Value" +COM_REDSHOP_VALUE="Value" +COM_REDSHOP_OPTION_VALUE="Option Value" +COM_REDSHOP_REMOVE_MEDIA="Remove media" + +COM_REDSHOP_ORDER_TRACKING_NUMBER="Tracking number" +COM_REDSHOP_TRACK_LINK_LBL="Tracking URL" +COM_REDSHOP_ACCESSORY_HAS_REQUIRED_ATTRIBUTES="Accessory that you selected has required attributes" + +; Registration +COM_REDSHOP_REGISTRATION_MISSING_VAT_NUMBER="Enter VAT number" +COM_REDSHOP_REGISTRATION_INVALID_VAT_NUMBER="You entered an invalid VAT number" + +; Cart +COM_REDSHOP_CART_INVALID_REQUEST="Invalid request" + +; Newsletter +COM_REDSHOP_ALREADY_CANCLE_SUBSCRIPTION="Newsletter subscription cancelled" \ No newline at end of file diff --git a/component/site/language/en-GB/index.html b/component/site/language/en-GB/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/language/en-GB/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/language/index.html b/component/site/language/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/language/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/layouts/assets.php b/component/site/layouts/assets.php new file mode 100644 index 00000000000..643c35395c5 --- /dev/null +++ b/component/site/layouts/assets.php @@ -0,0 +1,35 @@ + "auto", "dropdownAutoWidth" => "auto")); + +/** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.attribute.min.js', false, true); +/** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.common.min.js', false, true); +/** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.redbox.min.js', false, true); +/** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/bootstrap.min.js', false, true); + +$app = JFactory::getApplication(); +$doc = new RedshopHelperDocument; + +$doc->addBottomStylesheet(JURI::root() . 'media/com_redshop/css/bootstrap-grid.min.css'); + +if (Redshop::getConfig()->getBool('LOAD_REDSHOP_STYLE', true)) +{ + $doc->addBottomStylesheet(JURI::root() . 'media/com_redshop/css/redshop.min.css'); +} + +// Use different CSS for print layout +if ($app->input->getCmd('print', '')) +{ + $doc->addBottomStylesheet(JURI::root() . 'media/com_redshop/css/redshop.print.min.css'); +} diff --git a/component/site/layouts/cart/billing.php b/component/site/layouts/cart/billing.php new file mode 100644 index 00000000000..66819280d86 --- /dev/null +++ b/component/site/layouts/cart/billing.php @@ -0,0 +1,133 @@ +is_company == 1) ? + RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS : RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS; +?> + +
    + is_company == 1) : ?> +
    + +
    company_name; ?>
    +
    + + +
    + +
    firstname; ?>
    +
    + +
    + +
    lastname; ?>
    +
    + + address)) : ?> +
    + +
    address; ?>
    +
    + + + zipcode)) : ?> +
    + +
    zipcode; ?>
    +
    + + + city)) : ?> +
    + +
    city; ?>
    +
    + + + country_code)): ?> +
    + +
    country_code)) ?>
    +
    + + + state_code, $billingAddresses->country_code); ?> + +
    + +
    +
    + + + phone)) : ?> +
    + +
    phone; ?>
    +
    + + + user_email)) : ?> +
    + +
    user_email ? $billingAddresses->user_email : $user->email; ?>
    +
    + + + is_company == 1) : ?> + + ean_number)) : ?> +
    + +
    ean_number; ?>
    +
    + + requisition_number)) : ?> +
    + +
    requisition_number ?>
    +
    + + + get('USE_TAX_EXEMPT') == 1) : ?> +
    + +
    vat_number; ?>
    +
    + + + get('SHOW_TAX_EXEMPT_INFRONT')) : ?> + tax_exempt == 1) + { + $tax_exempt = JText::_('COM_REDSHOP_TAX_YES'); + } + else + { + $tax_exempt = JText::_('COM_REDSHOP_TAX_NO'); + } + ?> + +
    + +
    +
    + + + users_info_id) ?> +
    diff --git a/component/site/layouts/cart/cart.php b/component/site/layouts/cart/cart.php new file mode 100644 index 00000000000..58e4662cb52 --- /dev/null +++ b/component/site/layouts/cart/cart.php @@ -0,0 +1,136 @@ + 0) +{ + $total = $cart['mod_cart_total']; +} + +if ($displayData['cartOutput'] == 'simple'): ?> +
    + + + +
    + +
    + + rs_multi_array_key_exists('giftcard_id', $cart[$i]) && $cart[$i]['giftcard_id']) + { + $giftCardData = RedshopEntityGiftcard::getInstance($cart[$i]['giftcard_id'])->getItem(); + $name = $giftCardData->giftcard_name; + } + else + { + $productDetail = RedshopHelperProduct::getProductById($cart[$i]['product_id']); + $name = $productDetail->product_name; + } + ?> +
    +
    + +
    + get('DEFAULT_QUOTATION_MODE') || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))): + if ($displayData['showWithVat']) + { + $price = $cart[$i]['product_price']; + } + else + { + $price = $cart[$i]['product_price_excl_vat']; + } + ?> +
    + getProductFormattedPrice($price, true); ?> +
    + +
    + +
    +
    + + +
    + + +get('DEFAULT_QUOTATION_MODE') || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) && $displayData['totalQuantity']): ?> +
    + +
    + : +
    +
    + getProductFormattedPrice($shippingValue); ?> +
    +
    + + + 0) : + ?> +
    + : +
    +
    + getProductFormattedPrice($discountValue); ?> +
    +
    + + + +
    + +
    +
    + getProductFormattedPrice($total); ?> +
    +
    + +
    + + + diff --git a/component/site/layouts/cart/index.html b/component/site/layouts/cart/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/cart/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/layouts/cart/shipping.php b/component/site/layouts/cart/shipping.php new file mode 100644 index 00000000000..12a221e814d --- /dev/null +++ b/component/site/layouts/cart/shipping.php @@ -0,0 +1,80 @@ +is_company == 1) ? + RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS : RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS; +?> + +
    + is_company == 1) : ?> +
    + +
    company_name; ?>
    +
    + + +
    + +
    firstname; ?>
    +
    + +
    + +
    lastname; ?>
    +
    + + address != "") : ?> +
    + +
    address; ?>
    +
    + + + zipcode != "") : ?> +
    + +
    zipcode; ?>
    +
    + + + city != "") : ?> +
    + +
    city; ?>
    +
    + + + country_code != "") : ?> +
    + +
    country_code)) ?>
    +
    + + + state_code, $shippingaddresses->country_code); ?> + +
    + +
    +
    + + + phone != "") : ?> +
    + +
    phone; ?>
    +
    + + + users_info_id) ?> +
    diff --git a/component/site/layouts/cart/wizard.php b/component/site/layouts/cart/wizard.php new file mode 100644 index 00000000000..a44e70ce76b --- /dev/null +++ b/component/site/layouts/cart/wizard.php @@ -0,0 +1,30 @@ + + + diff --git a/component/site/layouts/checkout/login.php b/component/site/layouts/checkout/login.php new file mode 100644 index 00000000000..ce29ae68df7 --- /dev/null +++ b/component/site/layouts/checkout/login.php @@ -0,0 +1,37 @@ + + +
    +
    + + +
    +
    + + +
    + + + + + + + + + + + diff --git a/component/site/layouts/checkout/onestep/billing.php b/component/site/layouts/checkout/onestep/billing.php new file mode 100644 index 00000000000..05d4d025fad --- /dev/null +++ b/component/site/layouts/checkout/onestep/billing.php @@ -0,0 +1,90 @@ +getInt('REGISTER_METHOD'); + +if (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') == 0) +{ + $company = ""; + $customer = ""; +} +elseif (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') == 1) +{ + $openToStretcher = 0; +} +elseif (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') == 2) +{ + $openToStretcher = 1; +} + +$isCompany = $openToStretcher == 1 ? 1 : 0; + +$lists['shipping_customer_field'] = Redshop\Fields\SiteHelper::renderFields(RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS); +$lists['shipping_company_field'] = Redshop\Fields\SiteHelper::renderFields(RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS); + +$input = JFactory::getApplication()->input; +?> + + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + +
    + + + trigger('onRenderOnstepCheckout'); ?> +
    +
    diff --git a/component/site/layouts/checkout/payment_radio.php b/component/site/layouts/checkout/payment_radio.php new file mode 100644 index 00000000000..a5e59a95ca5 --- /dev/null +++ b/component/site/layouts/checkout/payment_radio.php @@ -0,0 +1,44 @@ +load('plg_redshop_payment_rs_payment_banktransfer', JPATH_ADMINISTRATOR, 'en-GB', true); +$lang->load('plg_redshop_payment_rs_payment_paypal', JPATH_ADMINISTRATOR, 'en-GB', true); +?> + +
    + +
    diff --git a/component/site/layouts/checkout/register.php b/component/site/layouts/checkout/register.php new file mode 100644 index 00000000000..0a2a2692204 --- /dev/null +++ b/component/site/layouts/checkout/register.php @@ -0,0 +1,82 @@ + + +
    + get('REGISTER_METHOD') == 2) : + $checked_style = (Redshop::getConfig()->get('CREATE_ACCOUNT_CHECKBOX') == 1) ? 'checked="checked"' : "''"; + ?> +
    + +
    + + +
    + + + get('OPTIONAL_SHIPPING_ADDRESS'), 1, Redshop::getConfig()->get('CREATE_ACCOUNT_CHECKBOX')); ?> +
    + + get('SHIPPING_METHOD_ENABLE')) : ?> + + 0) + { + if (isset($post['billisship']) && $post['billisship'] == 1) + { + $billingisshipping = "style='display:none'"; + } + } + elseif (Redshop::getConfig()->get('OPTIONAL_SHIPPING_ADDRESS')) + { + $billingisshipping = "style='display:none'"; + } + ?> + +
    > +
    + + getShippingTable($post, $isCompany, $this->lists); ?> +
    +
    + + + + + +
    + + +
    + +
    + + + + + + + + + \ No newline at end of file diff --git a/component/site/layouts/fields/display.php b/component/site/layouts/fields/display.php new file mode 100644 index 00000000000..1b63564c902 --- /dev/null +++ b/component/site/layouts/fields/display.php @@ -0,0 +1,20 @@ + + +
    + + + required == 1) : ?> + * + + desc) != '') : ?> + desc, '', 'tooltip.png', '', '', false); + ?> + +
    diff --git a/component/site/layouts/fields/index.html b/component/site/layouts/fields/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/fields/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/layouts/fields/mail.php b/component/site/layouts/fields/mail.php new file mode 100644 index 00000000000..704ee0cc920 --- /dev/null +++ b/component/site/layouts/fields/mail.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/component/site/layouts/filter/restricted.php b/component/site/layouts/filter/restricted.php new file mode 100644 index 00000000000..5d8aca377be --- /dev/null +++ b/component/site/layouts/filter/restricted.php @@ -0,0 +1,138 @@ + +
    +
    + category == 1 && !empty($categories)): ?> +
    +

    +
      + $cat) : ?> +
    • + +
    • + +
    +
    + +
    + manufacturer == 1 && !empty($manufacturers)): ?> +
    + +
    + + +
    +
      + + + $manu) : ?> +
    • + +
    • + + +
    +
    + +
    + custom_field == 1 && !empty($customFields)): ?> +
    +

    +
      + $fields) : ?> +

      + $name) : ?> +
    • + +
    • + + +
    +
    + +
    + price == 1) : ?> +
    +
    +
    +
    +
    +
    get('CURRENCY_CODE') ?>
    + +
    +
    +
    get('CURRENCY_CODE') ?>
    + +
    +
    +
    + + +
    + + + + + + + + + + + + + + + diff --git a/component/site/layouts/filter/result.php b/component/site/layouts/filter/result.php new file mode 100755 index 00000000000..fe0b12dda26 --- /dev/null +++ b/component/site/layouts/filter/result.php @@ -0,0 +1,932 @@ +input; + +/** @var RedshopModelCategory $categoryModel */ +$categoryModel = JModelLegacy::getInstance('Category', 'RedshopModel'); +$categoryModel->setId($cid); +$categoryData = $categoryModel->getData(); +$mainCategory = $categoryModel->_loadCategory(); + +RedshopHelperUtility::defineDynamicVariables(); +$productHelper = productHelper::getInstance(); +$objHelper = redhelper::getInstance(); +$extraField = extraField::getInstance(); +$stockroomHelper = rsstockroomhelper::getInstance(); +$redTemplate = Redtemplate::getInstance(); +$redconfiguration = Redconfiguration::getInstance(); + +$list = array( + JHtml::_('select.option', '', JText::_('COM_REDSHOP_SELECT')), + JHtml::_('select.option', 'p.product_price', JText::_('COM_REDSHOP_PRODUCT_PRICE_ASC')), + JHtml::_('select.option', 'p.product_price desc', JText::_('COM_REDSHOP_PRODUCT_PRICE_DESC')), + JHtml::_('select.option', 'p.product_id', JText::_('COM_REDSHOP_NEWEST')) +); + +$orderBy = JHtml::_( + 'select.genericlist', + $list, 'orderBy', + 'class="inputbox form-control" size="1" onchange="setSliderMinMax(this);" ', + 'value', + 'text', + $displayData['orderBy'] +); + +$productData = ''; + +JPluginHelper::importPlugin('redshop_product'); + +$dispatcher = RedshopHelperUtility::getDispatcher(); +$params = $app->getParams('com_redshop'); +$itemId = $input->get('Itemid', 0, "int"); +$fieldArray = RedshopHelperExtrafields::getSectionFieldList(17, 0, 0); +$extraFieldProduct = Redshop\Helper\ExtraFields::getSectionFieldNames(1, 1, 1); +$extraFieldCategory = Redshop\Helper\ExtraFields::getSectionFieldNames(2, 1, 1); + +$templateArray = RedshopHelperTemplate::getTemplate("category", $templateId); +$templateDesc = $templateArray[0]->template_desc; +$attributeTemplate = \Redshop\Template\Helper::getAttribute($templateDesc); + +// Begin replace template +$templateDesc = str_replace("{total_product_lbl}", JText::_('COM_REDSHOP_TOTAL_PRODUCT'), $templateDesc); +$templateDesc = str_replace("{total_product}", $displayData['total'], $templateDesc); +$categoryDetail = RedshopHelperCategory::getCategoryById($cid); + +if (strpos($templateDesc, "{template_selector_category}") !== false) +{ + $categoryTemplate = $categoryDetail->template . ',' . $categoryDetail->more_template; + $template = RedshopHelperTemplate::getTemplate('category', $categoryTemplate); + + $renderTemplate = JHtml::_( + 'select.genericlist', + $template, + 'category_template', + 'class="inputbox" size="1" onchange="loadTemplate(this);"', + 'id', + 'name', + $templateId + ); + + if ($renderTemplate != "") + { + $templateDesc = str_replace("{template_selector_category_lbl}", JText::_('COM_REDSHOP_TEMPLATE_SELECTOR_CATEGORY_LBL'), $templateDesc); + $templateDesc = str_replace("{template_selector_category}", $renderTemplate, $templateDesc); + } + + $templateDesc = str_replace("{template_selector_category_lbl}", "", $templateDesc); + $templateDesc = str_replace("{template_selector_category}", "", $templateDesc); +} + +$templateDesc = $productHelper->getExtraSectionTag($extraFieldCategory, $cid, "2", $templateDesc); + +if (strpos($templateDesc, "{load_more}") !== false) +{ + $loadMore = ''; + $templateDesc = str_replace("{load_more}", $loadMore, $templateDesc); +} + +// Replace Sub Category +if (strpos($templateDesc, "{category_loop_start}") !== false && strpos($templateDesc, "{category_loop_end}") !== false) +{ + $templateD1 = explode("{category_loop_start}", $templateDesc); + $templateD2 = explode("{category_loop_end}", $templateD1[1]); + $subcatTemplate = $templateD2[0]; + + if (strpos($subcatTemplate, '{category_thumb_image_2}') !== false) + { + $tag = '{category_thumb_image_2}'; + $hThumb = Redshop::getConfig()->get('THUMB_HEIGHT_2'); + $wThumb = Redshop::getConfig()->get('THUMB_WIDTH_2'); + } + elseif (strpos($subcatTemplate, '{category_thumb_image_3}') !== false) + { + $tag = '{category_thumb_image_3}'; + $hThumb = Redshop::getConfig()->get('THUMB_HEIGHT_3'); + $wThumb = Redshop::getConfig()->get('THUMB_WIDTH_3'); + } + elseif (strpos($subcatTemplate, '{category_thumb_image_1}') !== false) + { + $tag = '{category_thumb_image_1}'; + $hThumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $wThumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + else + { + $tag = '{category_thumb_image}'; + $hThumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $wThumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + + $catDetail = ""; + $extraFieldsForCurrentTemplate = RedshopHelperTemplate::getExtraFieldsForCurrentTemplate($extraFieldCategory, $subcatTemplate); + + for ($i = 0, $nc = count($categoryData); $i < $nc; $i++) + { + $row = $categoryData[$i]; + + // Filter categories based on Shopper group category ACL + $checkCid = RedshopHelperAccess::checkPortalCategoryPermission($row->id); + $sgportal = RedshopHelperShopper_Group::getShopperGroupPortal(); + $portal = 0; + + if (count($sgportal) > 0) + { + $portal = $sgportal->shopper_group_portal; + } + + if (!$checkCid && (Redshop::getConfig()->get('PORTAL_SHOP') == 1 || $portal == 1)) + { + continue; + } + + $dataAdd = $subcatTemplate; + + $categoryItemId = RedshopHelperRouter::getCategoryItemid($row->id); + + $link = JRoute::_( + 'index.php?option=com_redshop&view=category&cid=' + . $row->id . '&manufacturer_id=' + . $categoryModel->getState('manufacturer_id') . '&layout=detail&Itemid=' + . $categoryItemId + ); + + $middlePath = REDSHOP_FRONT_IMAGES_RELPATH . 'category/'; + $title = " title='" . $row->name . "' "; + $alt = " alt='" . $row->name . "' "; + $productImage = REDSHOP_FRONT_IMAGES_ABSPATH . "noimage.jpg"; + $linkImage = $productImage; + + if ($row->category_full_image && JFile::exists($middlePath . $row->category_full_image)) + { + $categoryFullImage = $row->category_full_image; + $productImage = RedshopHelperMedia::watermark( + 'category', + $row->category_full_image, + $wThumb, + $hThumb, + Redshop::getConfig()->get('WATERMARK_CATEGORY_THUMB_IMAGE'), + '0' + ); + + $linkImage = RedshopHelperMedia::watermark( + 'category', + $row->category_full_image, + '', + '', + Redshop::getConfig()->get('WATERMARK_CATEGORY_IMAGE'), + '0' + ); + } + elseif (Redshop::getConfig()->get('CATEGORY_DEFAULT_IMAGE') && JFile::exists($middlePath . Redshop::getConfig()->get('CATEGORY_DEFAULT_IMAGE'))) + { + $categoryFullImage = Redshop::getConfig()->get('CATEGORY_DEFAULT_IMAGE'); + $productImage = RedshopHelperMedia::watermark( + 'category', + Redshop::getConfig()->get('CATEGORY_DEFAULT_IMAGE'), + $wThumb, + $hThumb, + Redshop::getConfig()->get('WATERMARK_CATEGORY_THUMB_IMAGE'), + '0' + ); + + $linkImage = RedshopHelperMedia::watermark( + 'category', + Redshop::getConfig()->get('CATEGORY_DEFAULT_IMAGE'), + '', + '', + Redshop::getConfig()->get('WATERMARK_CATEGORY_IMAGE'), + '0' + ); + } + + if (Redshop::getConfig()->get('CAT_IS_LIGHTBOX')) + { + $catThumb = ""; + } + else + { + $catThumb = ""; + } + + $catThumb .= ""; + $catThumb .= ""; + $dataAdd = str_replace($tag, $catThumb, $dataAdd); + + if (strpos($dataAdd, '{category_name}') !== false) + { + $catName = '' . $row->name . ''; + $dataAdd = str_replace("{category_name}", $catName, $dataAdd); + } + + if (strpos($dataAdd, '{category_readmore}') !== false) + { + $catName = '' . JText::_('COM_REDSHOP_READ_MORE') . ''; + $dataAdd = str_replace("{category_readmore}", $catName, $dataAdd); + } + + if (strpos($dataAdd, '{category_description}') !== false) + { + $catDesc = $redconfiguration->maxchar( + $row->description, + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_MAX_CHARS'), + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_END_SUFFIX') + ); + + $dataAdd = str_replace("{category_description}", $catDesc, $dataAdd); + } + + if (strpos($dataAdd, '{category_short_desc}') !== false) + { + $catShortDesc = $redconfiguration->maxchar( + $row->short_description, + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_MAX_CHARS'), + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_END_SUFFIX') + ); + + $dataAdd = str_replace("{category_short_desc}", $catShortDesc, $dataAdd); + } + + if (strpos($dataAdd, '{category_total_product}') !== false) + { + $totalprd = $productHelper->getProductCategory($row->id); + $dataAdd = str_replace("{category_total_product}", count($totalprd), $dataAdd); + $dataAdd = str_replace("{category_total_product_lbl}", JText::_('COM_REDSHOP_TOTAL_PRODUCT'), $dataAdd); + } + + /* + * Category template extra field + * "2" argument is set for category + */ + if ($extraFieldsForCurrentTemplate) + { + $dataAdd = Redshop\Helper\ExtraFields::displayExtraFields(2, $row->id, $extraFieldsForCurrentTemplate, $dataAdd); + } + + $catDetail .= $dataAdd; + } + + $templateDesc = str_replace("{category_loop_start}", "", $templateDesc); + $templateDesc = str_replace("{category_loop_end}", "", $templateDesc); + $templateDesc = str_replace($subcatTemplate, $catDetail, $templateDesc); +} + +if (strpos($templateDesc, "{if subcats}") !== false && strpos($templateDesc, "{subcats end if}") !== false) +{ + $templateD1 = explode("{if subcats}", $templateDesc); + $templateD2 = explode("{subcats end if}", $templateD1[1]); + + if (count($categoryData) > 0) + { + $templateDesc = str_replace("{if subcats}", "", $templateDesc); + $templateDesc = str_replace("{subcats end if}", "", $templateDesc); + } + else + { + $templateDesc = $templateD1[0] . $templateD2[1]; + } +} + +// End replace sub category + +// Replace Main Category +if (strpos($templateDesc, '{category_main_description}') !== false) +{ + $mainCategoryDesc = $redconfiguration->maxchar( + $mainCategory->description, + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_MAX_CHARS'), + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_END_SUFFIX') + ); + + $templateDesc = str_replace("{category_main_description}", $mainCategoryDesc, $templateDesc); +} + +if (strpos($templateDesc, '{category_main_short_desc}') !== false) +{ + $mainCategoryShortDesc = $redconfiguration->maxchar( + $mainCategory->short_description, + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_MAX_CHARS'), + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_END_SUFFIX') + ); + + $templateDesc = str_replace("{category_main_short_desc}", $mainCategoryShortDesc, $templateDesc); +} + +$mainCategoryName = ""; + +if (strpos($templateDesc, '{category_main_name}') !== false) +{ + $mainCategoryName = $redconfiguration->maxchar( + $mainCategory->name, + Redshop::getConfig()->get('CATEGORY_TITLE_MAX_CHARS'), + Redshop::getConfig()->get('CATEGORY_TITLE_END_SUFFIX') + ); + + $templateDesc = str_replace("{category_main_name}", $mainCategoryName, $templateDesc); +} + +if (strpos($templateDesc, '{category_main_thumb_image_2}') !== false) +{ + $cTag = '{category_main_thumb_image_2}'; + $chThumb = Redshop::getConfig()->get('THUMB_HEIGHT_2'); + $cwThumb = Redshop::getConfig()->get('THUMB_WIDTH_2'); +} +elseif (strpos($templateDesc, '{category_main_thumb_image_3}') !== false) +{ + $cTag = '{category_main_thumb_image_3}'; + $chThumb = Redshop::getConfig()->get('THUMB_HEIGHT_3'); + $cwThumb = Redshop::getConfig()->get('THUMB_WIDTH_3'); +} +elseif (strpos($templateDesc, '{category_main_thumb_image_1}') !== false) +{ + $cTag = '{category_main_thumb_image_1}'; + $chThumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $cwThumb = Redshop::getConfig()->get('THUMB_WIDTH'); +} +else +{ + $cTag = '{category_main_thumb_image}'; + $chThumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $cwThumb = Redshop::getConfig()->get('THUMB_WIDTH'); +} + +$catMainThumb = ""; + +if ($mainCategory->category_full_image && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'category/' . $mainCategory->category_full_image)) +{ + $waterCatImg = RedshopHelperMedia::watermark( + 'category', + $mainCategory->category_full_image, + $cwThumb, + $chThumb, + Redshop::getConfig()->get('WATERMARK_CATEGORY_THUMB_IMAGE'), + '0' + ); + + $catMainThumb = "" . $mainCategoryName . ""; +} + +$templateDesc = str_replace($cTag, $catMainThumb, $templateDesc); + +if (strpos($templateDesc, "{include_product_in_sub_cat}") !== false) +{ + $templateDesc = str_replace("{include_product_in_sub_cat}", '', $templateDesc); +} + +// End replace Main Category + +// Replace Products +if (strpos($templateDesc, "{product_loop_start}") !== false && strpos($templateDesc, "{product_loop_end}") !== false) +{ + // Get only Product template + $templateD1 = explode("{product_loop_start}", $templateDesc); + $templateD2 = explode("{product_loop_end}", $templateD1[1]); + $templateProduct = $templateD2[0]; + + $attributeTemplate = \Redshop\Template\Helper::getAttribute($templateProduct); + $products = RedshopHelperProduct::getProductsByIds($products); + $productIds = array(); + + // Loop product lists + foreach ($products as $product) + { + $catid = $product->category_id; + $productIds[] = $product->product_id; + + // Count accessory + $accessorylist = RedshopHelperAccessory::getProductAccessories(0, $product->product_id); + $totacc = count($accessorylist); + $netPrice = $productHelper->getProductNetPrice($product->product_id); + $productPrice = $netPrice['productPrice']; + + $dataAdd = $templateProduct; + + // ProductFinderDatepicker Extra Field Start + $dataAdd = $productHelper->getProductFinderDatepickerValue($dataAdd, $product->product_id, $fieldArray); + $itemData = $productHelper->getMenuInformation(0, 0, '', 'product&pid=' . $product->product_id); + $pItemid = count($itemData) > 0 ? $itemData->id : RedshopHelperRouter::getItemId($product->product_id, $cid); + + $dataAdd = str_replace("{product_price}", $productHelper->getProductFormattedPrice($productPrice), $dataAdd); + $dataAdd = str_replace("{product_id_lbl}", JText::_('COM_REDSHOP_PRODUCT_ID_LBL'), $dataAdd); + $dataAdd = str_replace("{product_id}", $product->product_id, $dataAdd); + $dataAdd = str_replace("{product_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER_LBL'), $dataAdd); + + $productNumberOutput = '' . $product->product_number . ''; + $dataAdd = str_replace("{product_number}", $productNumberOutput, $dataAdd); + + // Replace VAT information + $dataAdd = RedshopHelperTax::replaceVatInformation($dataAdd); + + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $product->product_id . '&cid=' . $catid . '&Itemid=' . $pItemid); + + $productName = RedshopHelperUtility::maxChars( + $product->product_name, + Redshop::getConfig()->get('CATEGORY_PRODUCT_TITLE_MAX_CHARS'), + Redshop::getConfig()->get('CATEGORY_PRODUCT_TITLE_END_SUFFIX') + ); + + if (!empty($keyword)) + { + $productName = preg_replace("/($keyword)/i", "$1", $productName); + } + + if (strstr($dataAdd, '{product_name_nolink}')) + { + $dataAdd = str_replace("{product_name_nolink}", $productName, $dataAdd); + } + + if (strstr($dataAdd, '{product_name}')) + { + $productName = "" . $productName . ""; + $dataAdd = str_replace("{product_name}", $productName, $dataAdd); + } + + if (strstr($dataAdd, '{category_product_link}')) + { + $dataAdd = str_replace("{category_product_link}", $link, $dataAdd); + } + + if (strstr($dataAdd, '{read_more}')) + { + $rmore = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $dataAdd = str_replace("{read_more}", $rmore, $dataAdd); + } + + if (strstr($dataAdd, '{read_more_link}')) + { + $dataAdd = str_replace("{read_more_link}", $link, $dataAdd); + } + + if (strstr($dataAdd, '{product_s_desc}')) + { + $productShortDesc = RedshopHelperUtility::maxChars( + $product->product_s_desc, + Redshop::getConfig()->get('CATEGORY_PRODUCT_SHORT_DESC_MAX_CHARS'), + Redshop::getConfig()->get('CATEGORY_PRODUCT_SHORT_DESC_END_SUFFIX') + ); + + if (!empty($keyword)) + { + $productShortDesc = preg_replace("/($keyword)/i", "$1", $productShortDesc); + } + + $dataAdd = str_replace("{product_s_desc}", $productShortDesc, $dataAdd); + } + + if (strstr($dataAdd, '{product_desc}')) + { + $productDesc = RedshopHelperUtility::maxChars( + $product->product_desc, + Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_MAX_CHARS'), + Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_END_SUFFIX') + ); + + if (!empty($keyword)) + { + $productDesc = preg_replace("/($keyword)/i", "$1", $productDesc); + } + + $dataAdd = str_replace("{product_desc}", $productDesc, $dataAdd); + } + + if (strstr($dataAdd, '{product_rating_summary}')) + { + // Product Review/Rating Fetching reviews + $finalAvgReviewData = Redshop\Product\Rating::getRating($product->product_id); + $dataAdd = str_replace("{product_rating_summary}", $finalAvgReviewData, $dataAdd); + } + + if (strstr($dataAdd, '{manufacturer_link}')) + { + $manufacturerLinkHref = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=detail&mid=' . $product->manufacturer_id . '&Itemid=' . $itemId); + $manufacturerLink = ''; + + if ($product->manufacturer_name != '') + { + $manufacturerLink = '' . $product->manufacturer_name . ''; + } + + $dataAdd = str_replace("{manufacturer_link}", $manufacturerLink, $dataAdd); + + if (strstr($dataAdd, "{manufacturer_link}")) + { + $dataAdd = str_replace("{manufacturer_name}", "", $dataAdd); + } + } + + if (strstr($dataAdd, '{manufacturer_product_link}')) + { + $manufacturerPLink = "manufacturer_id . '&Itemid=' . $itemId) . "'>" . JText::_("COM_REDSHOP_VIEW_ALL_MANUFACTURER_PRODUCTS") . " " . $product->manufacturer_name . ""; + $dataAdd = str_replace("{manufacturer_product_link}", $manufacturerPLink, $dataAdd); + } + + if (strstr($dataAdd, '{manufacturer_name}')) + { + if ($product->manufacturer_name != "") + { + $dataAdd = str_replace("{manufacturer_name}", $product->manufacturer_name, $dataAdd); + } + else + { + $dataAdd = str_replace("{manufacturer_name}", "", $dataAdd); + } + } + + $extraFieldsForCurrentTemplate = RedshopHelperTemplate::getExtraFieldsForCurrentTemplate($extraFieldProduct, $templateProduct, 1); + + /* + * Product loop template extra field + * lat arg set to "1" for identify parsing data for product tag loop in category + * last arg will parse {producttag:NAMEOFPRODUCTTAG} nameing tags. + * "1" is for section as product + */ + if ($extraFieldsForCurrentTemplate) + { + $dataAdd = Redshop\Helper\ExtraFields::displayExtraFields( + 1, + $product->product_id, + $extraFieldsForCurrentTemplate, + $dataAdd, + true + ); + } + + if (strstr($dataAdd, "{product_thumb_image_3}")) + { + $pImgTag = '{product_thumb_image_3}'; + $phThumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_3'); + $pwThumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_3'); + } + elseif (strstr($dataAdd, "{product_thumb_image_2}")) + { + $pImgTag = '{product_thumb_image_2}'; + $phThumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_2'); + $pwThumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_2'); + } + elseif (strstr($dataAdd, "{product_thumb_image_1}")) + { + $pImgTag = '{product_thumb_image_1}'; + $phThumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $pwThumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + else + { + $pImgTag = '{product_thumb_image}'; + $phThumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $pwThumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + + $hiddenThumbImage = ""; + $thumbImage = Redshop\Product\Image\Image::getImage($product->product_id, $link, $pwThumb, $phThumb, 2, 1); + + // Product image flying addwishlist time start + $thumbImage = "" . Redshop\Product\Image\Image::getImage($product->product_id, $link, $pwThumb, $phThumb, 2, 1) . ""; + + // Product image flying addwishlist time end + $dataAdd = str_replace($pImgTag, $thumbImage . $hiddenThumbImage, $dataAdd); + + // Front-back image tag + if (strstr($dataAdd, "{front_img_link}") || strstr($dataAdd, "{back_img_link}")) + { + if ($this->_data->product_thumb_image) + { + $mainsrcPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $product->product_thumb_image; + } + else + { + $mainsrcPath = $url . "components/com_redshop/helpers/thumb.php?filename=product/" . $product->product_full_image . "&newxsize=" . $pwThumb . "&newysize=" . $phThumb . "&swap=" . Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + } + + if ($this->_data->product_back_thumb_image) + { + $backsrcPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $product->product_back_thumb_image; + } + else + { + $backsrcPath = $url . "components/com_redshop/helpers/thumb.php?filename=product/" . $product->product_back_full_image . "&newxsize=" . $pwThumb . "&newysize=" . $phThumb . "&swap=" . Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + } + + $aHrefPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $product->product_full_image; + $aHrefBackPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $product->product_back_full_image; + + $productFrontImageLink = "" . JText::_('COM_REDSHOP_FRONT_IMAGE') . ""; + $productBackImageLink = "" . JText::_('COM_REDSHOP_BACK_IMAGE') . ""; + + $dataAdd = str_replace("{front_img_link}", $productFrontImageLink, $dataAdd); + $dataAdd = str_replace("{back_img_link}", $productBackImageLink, $dataAdd); + } + else + { + $dataAdd = str_replace("{front_img_link}", "", $dataAdd); + $dataAdd = str_replace("{back_img_link}", "", $dataAdd); + } + + // Front-back image tag end + + + // Product preview image. + if (strstr($dataAdd, '{product_preview_img}')) + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $product->product_preview_image)) + { + $previewsrcPath = $url . "components/com_redshop/helpers/thumb.php?filename=product/" + . $product->product_preview_image . "&newxsize=" . Redshop::getConfig()->get('CATEGORY_PRODUCT_PREVIEW_IMAGE_WIDTH') + . "&newysize=" . Redshop::getConfig()->get('CATEGORY_PRODUCT_PREVIEW_IMAGE_HEIGHT') + . "&swap=" . Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + $previewImg = ""; + $dataAdd = str_replace("{product_preview_img}", $previewImg, $dataAdd); + } + else + { + $dataAdd = str_replace("{product_preview_img}", "", $dataAdd); + } + } + + // Product preview image end. + + // Front-back preview image tag... + if (strstr($dataAdd, "{front_preview_img_link}") || strstr($dataAdd, "{back_preview_img_link}")) + { + if ($product->product_preview_image) + { + $mainPreviewSrcPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $product->product_preview_image + . "&newxsize=" . Redshop::getConfig()->get('CATEGORY_PRODUCT_PREVIEW_IMAGE_WIDTH') . "&newysize=" + . Redshop::getConfig()->get('CATEGORY_PRODUCT_PREVIEW_IMAGE_HEIGHT') + . "&swap=" . Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + } + + if ($product->product_preview_back_image) + { + $backPreviewSrcPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" + . $product->product_preview_back_image . "&newxsize=" . Redshop::getConfig()->get('CATEGORY_PRODUCT_PREVIEW_IMAGE_WIDTH') + . "&newysize=" . Redshop::getConfig()->get('CATEGORY_PRODUCT_PREVIEW_IMAGE_HEIGHT') + . "&swap=" . Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + } + + $productFrontImageLink = "" . JText::_('COM_REDSHOP_FRONT_IMAGE') . ""; + $productBackImageLink = "" . JText::_('COM_REDSHOP_BACK_IMAGE') . ""; + + $dataAdd = str_replace("{front_preview_img_link}", $productFrontImageLink, $dataAdd); + $dataAdd = str_replace("{back_preview_img_link}", $productBackImageLink, $dataAdd); + } + else + { + $dataAdd = str_replace("{front_preview_img_link}", "", $dataAdd); + $dataAdd = str_replace("{back_preview_img_link}", "", $dataAdd); + } + + // Front-back preview image tag end + + $dataAdd = $productHelper->getJcommentEditor($product, $dataAdd); + + /* + * Conditional tag + * if product on discount : Yes + * {if product_on_sale} This product is on sale {product_on_sale end if} // OUTPUT : This product is on sale + * NO : // OUTPUT : Display blank + */ + $dataAdd = $productHelper->getProductOnSaleComment($product, $dataAdd); + + // Replace Wishlist Button + $dataAdd = RedshopHelperWishlist::replaceWishlistTag($product->product_id, $dataAdd); + + // Replace compare product button + $dataAdd = Redshop\Product\Compare::replaceCompareProductsButton($product->product_id, $catid, $dataAdd); + + if (strstr($dataAdd, "{stockroom_detail}")) + { + $dataAdd = RedshopHelperStockroom::replaceStockroomAmountDetail($dataAdd, $product->product_id); + } + + // Checking for child products + $childProducts = RedshopHelperProduct::getChildProduct($product->product_id); + + if (count($childProducts) > 0) + { + if (Redshop::getConfig()->get('PURCHASE_PARENT_WITH_CHILD') == 1) + { + $isChilds = false; + + // Get attributes + $attributesSet = array(); + + if ($product->attribute_set_id > 0) + { + $attributesSet = RedshopHelperProduct_Attribute::getProductAttribute( + 0, + $product->attribute_set_id, + 0, + 1 + ); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($product->product_id); + $attributes = array_merge($attributes, $attributesSet); + } + else + { + $isChilds = true; + $attributes = array(); + } + } + else + { + $isChilds = false; + + // Get attributes + $attributesSet = array(); + + if ($product->attribute_set_id > 0) + { + $attributesSet = RedshopHelperProduct_Attribute::getProductAttribute( + 0, + $product->attribute_set_id, + 0, + 1 + ); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($product->product_id); + $attributes = array_merge($attributes, $attributesSet); + } + + $returnArr = $productHelper->getProductUserfieldFromTemplate($dataAdd); + $userfieldArr = $returnArr[1]; + + // Product attribute Start + $totalatt = count($attributes); + + // Check product for not for sale + $dataAdd = $productHelper->getProductNotForSaleComment($product, $dataAdd, $attributes); + + $dataAdd = Redshop\Product\Stock::replaceInStock( + $product->product_id, + $dataAdd, + $attributes, + $attributeTemplate + ); + + $dataAdd = RedshopHelperAttribute::replaceAttributeData( + $product->product_id, + 0, + 0, + $attributes, + $dataAdd, + $attributeTemplate, + $isChilds + ); + + // Replace attribute with null value if it exist + if (!empty($attributeTemplate)) + { + $templateAttribute = "{attributeTemplate:" . $attributeTemplate->name . "}"; + + if (strstr($dataAdd, $templateAttribute)) + { + $dataAdd = str_replace($templateAttribute, "", $dataAdd); + } + } + + // Get cart template + $dataAdd = Redshop\Cart\Render::replace( + $product->product_id, + $catid, + 0, + 0, + $dataAdd, + $isChilds, + $userfieldArr, + $totalatt, + $totacc + ); + + $dataAdd = $productHelper->getExtraSectionTag($extraFieldProduct, $product->product_id, "1", $dataAdd); + + $results = $dispatcher->trigger('onPrepareProduct', array(&$dataAdd, &$params, $product)); + + $productData .= $dataAdd; + } + + $productTmpl = $productData; + + if (strstr($templateDesc, "{pagination}")) + { + $pagination = $displayData["pagination"]; + $templateDesc = str_replace("{pagination}", $pagination->getPaginationLinks('pagination.customize'), $templateDesc); + } + + $usePerPageLimit = false; + + if (strstr($templateDesc, "perpagelimit:")) + { + $usePerPageLimit = true; + $perpage = explode('{perpagelimit:', $templateDesc); + $perpage = explode('}', $perpage[1]); + $templateDesc = str_replace("{perpagelimit:" . intval($perpage[0]) . "}", "", $templateDesc); + } + + if (strstr($templateDesc, "{product_display_limit}")) + { + if ($usePerPageLimit == false) + { + $limitBox = ''; + } + else + { + $limitBox = $pagination->getLimitBox(); + } + + $templateDesc = str_replace("{product_display_limit}", $limitBox, $templateDesc); + } + + if (strpos($templateDesc, '{filter_by}') !== false) + { + /** @var JApplicationSite $app */ + $app = JFactory::getApplication(); + $data = $app->input->get('redform', array(), 'ARRAY'); + $min = isset($data['filterprice']['min']) ? (float) $data['filterprice']['min'] : 0.0; + $max = isset($data['filterprice']['max']) ? (float) $data['filterprice']['max'] : 0.0; + $templateId = isset($data['template_id']) ? (int) $data['template_id'] : 0; + + if (isset($data['cid'])) + { + $app->input->set('cid', $data['cid']); + } + + $temps = array( + (object) array( + 'id' => 0, + 'name' => JText::_('COM_REDSHOP_SELECT_MANUFACTURE') + ) + ); + + $manufacturers = array_merge($temps, $categoryModel->getManufacturer()); + $manufacturers = JHtml::_( + 'select.genericlist', + $manufacturers, + 'manufacturer_id', + 'class="inputbox form-control" onchange="javascript:setSliderMinMaxForManufactur();" ', + 'id', + 'name', + $categoryModel->getState('manufacturer_id') + ); + + $filterByForm = "
    "; + $filterByForm .= $manufacturers; + $filterByForm .= ""; + $filterByForm .= ""; + $filterByForm .= ""; + $filterByForm .= ''; + $filterByForm .= ""; + $filterByForm .= ""; + + $templateDesc = str_replace( + array('{filter_by_lbl}', '{filter_by}'), + array(JText::_('COM_REDSHOP_SELECT_FILTER_BY'), $filterByForm), + $templateDesc + ); + } + + $templateDesc = str_replace("{order_by_lbl}", JText::_('COM_REDSHOP_SELECT_ORDER_BY'), $templateDesc); + $templateDesc = str_replace("{order_by}", $orderBy, $templateDesc); + $templateDesc = str_replace("{filter_by_lbl}", '', $templateDesc); + $templateDesc = str_replace("{product_loop_start}", "", $templateDesc); + $templateDesc = str_replace("{product_loop_end}", "", $templateDesc); + $templateDesc = str_replace("{category_main_name}", $categoryDetail->name, $templateDesc); + $templateDesc = str_replace("{category_main_description}", '', $templateDesc); + $templateDesc = str_replace($templateProduct, $productTmpl, $templateDesc); + $templateDesc = str_replace("{with_vat}", "", $templateDesc); + $templateDesc = str_replace("{without_vat}", "", $templateDesc); + $templateDesc = str_replace("{attribute_price_with_vat}", "", $templateDesc); + $templateDesc = str_replace("{attribute_price_without_vat}", "", $templateDesc); + $templateDesc = str_replace("{redproductfinderfilter_formstart}", "", $templateDesc); + $templateDesc = str_replace("{product_price_slider1}", "", $templateDesc); + $templateDesc = str_replace("{redproductfinderfilter_formend}", "", $templateDesc); + $templateDesc = str_replace("{redproductfinderfilter:rp_myfilter}", "", $templateDesc); + + // Trigger plugin for content redshop + $templateDesc = RedshopHelperTemplate::parseRedshopPlugin($templateDesc); + $templateDesc = RedshopHelperText::replaceTexts($templateDesc); + $templateDesc .= ''; + $templateDesc .= ''; +} + +// End Replace Products +echo $templateDesc; diff --git a/component/site/layouts/general/print.php b/component/site/layouts/general/print.php new file mode 100644 index 00000000000..d15d3abc70a --- /dev/null +++ b/component/site/layouts/general/print.php @@ -0,0 +1,17 @@ + + title=""> + <?php echo JText::_('COM_REDSHOP_PRINT_LBL'); ?> + \ No newline at end of file diff --git a/component/site/layouts/index.html b/component/site/layouts/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/layouts/joomla/index.html b/component/site/layouts/joomla/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/joomla/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/layouts/joomla/pagination/index.html b/component/site/layouts/joomla/pagination/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/joomla/pagination/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/layouts/joomla/pagination/link.php b/component/site/layouts/joomla/pagination/link.php new file mode 100644 index 00000000000..f759eb24fed --- /dev/null +++ b/component/site/layouts/joomla/pagination/link.php @@ -0,0 +1,101 @@ +text; + +switch ((string) $item->text) +{ + // Check for "Start" item + case JText::_('JLIB_HTML_START'): + $icon = "icon-backward"; + break; + + // Check for "Prev" item + case $item->text == JText::_('JPREV'): + $item->text = JText::_('JPREVIOUS'); + $icon = "icon-step-backward"; + break; + + // Check for "Next" item + case JText::_('JNEXT'): + $icon = "icon-step-forward"; + break; + + // Check for "End" item + case JText::_('JLIB_HTML_END'): + $icon = "icon-forward"; + break; + + default: + $icon = null; + break; +} + +if ($icon !== null) +{ + $display = ''; +} + +if ($displayData['active']) +{ + if ($item->base > 0) + { + $limit = 'limitstart.value=' . $item->base; + } + else + { + $limit = 'limitstart.value=0'; + } + + $cssClasses = array(); + + $title = ''; + + if (!is_numeric($item->text)) + { + JHtml::_('bootstrap.tooltip'); + $cssClasses[] = 'hasTooltip'; + $title = ' title="' . $item->text . '" '; + } + + $onClick = ''; + $href = $item->link; + + // Still using javascript approach in backend + if (JFactory::getApplication()->isAdmin()) + { + $onClick = 'onclick="document.adminForm.' . $item->prefix . 'limitstart.value=' . ($item->base > 0 ? $item->base : '0') . '; Joomla.submitform();return false;"'; + $href = '#'; + } +} +else +{ + $class = (property_exists($item, 'active') && $item->active) ? 'active' : 'disabled'; +} +?> + +
  • + + + + href="" + > + + +
  • + +
  • + +
  • +is_company == 1) ? + RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS : RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS; +?> + +
    + is_company == 1) : ?> + + + + + + + + + + + + + + + + + address != "") : ?> + + + + + + + zipcode != "") : ?> + + + + + + + city != "") : ?> + + + + + + + country_code != "") : ?> + + + + + + + state_code, $billingAddresses->country_code); ?> + + + + + + + + phone != "") : ?> + + + + + + + user_email != "") : ?> + + + + + + + is_company == 1) : ?> + + ean_number != "") : ?> + + + + + + + + + + + + + + + + + + + get('SHOW_TAX_EXEMPT_INFRONT')) : ?> + tax_exempt == 1) + { + $tax_exempt = JText::_('COM_REDSHOP_TAX_YES'); + } + else + { + $tax_exempt = JText::_('COM_REDSHOP_TAX_NO'); + } + ?> + + + + + + + + + + users_info_id, 0, "", "", true); ?> +
    :company_name;?>
    :firstname;?>
    :lastname;?>
    :address;?>
    :zipcode;?>
    :city;?>
    :country_code));?>
    :
    :phone;?>
    :user_email ? $billingAddresses->user_email : $user->email;?>
    :ean_number;?>
    :requisition_number;?>
    :vat_number;?>
    :
    diff --git a/component/site/layouts/mail/index.html b/component/site/layouts/mail/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/mail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/layouts/mail/shipping.php b/component/site/layouts/mail/shipping.php new file mode 100644 index 00000000000..8a027c6d840 --- /dev/null +++ b/component/site/layouts/mail/shipping.php @@ -0,0 +1,84 @@ +is_company == 1) ? + RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS : RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS; +?> + + + is_company == 1) : ?> + + + + + + + + + + + + + + + + + address != "") : ?> + + + + + + + zipcode != "") : ?> + + + + + + + city != "") : ?> + + + + + + + country_code != "") : ?> + + + + + + + state_code, $shippingaddresses->country_code); ?> + + + + + + + + phone != "") : ?> + + + + + + + users_info_id, 0, "", "", true); + ?> +
    :company_name;?>
    :firstname;?>
    :lastname;?>
    :address;?>
    :zipcode;?>
    :city;?>
    :country_code));?>
    :
    :phone;?>
    + diff --git a/component/site/layouts/order/index.html b/component/site/layouts/order/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/order/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/layouts/order/payment/creditcard.php b/component/site/layouts/order/payment/creditcard.php new file mode 100644 index 00000000000..d518d9d5e93 --- /dev/null +++ b/component/site/layouts/order/payment/creditcard.php @@ -0,0 +1,168 @@ +get('ccdata'); + +$url = JURI::base(true); +$creditCardList = array(); +$creditCardList['VISA'] = new stdClass; +$creditCardList['VISA']->img = 'visa.jpg'; +$creditCardList['MC'] = new stdClass; +$creditCardList['MC']->img = 'master.jpg'; +$creditCardList['amex'] = new stdClass; +$creditCardList['amex']->img = 'blue.jpg'; +$creditCardList['maestro'] = new stdClass; +$creditCardList['maestro']->img = 'mastero.jpg'; +$creditCardList['jcb'] = new stdClass; +$creditCardList['jcb']->img = 'jcb.jpg'; +$creditCardList['diners'] = new stdClass; +$creditCardList['diners']->img = 'dinnersclub.jpg'; +$creditCardList['discover'] = new stdClass; +$creditCardList['discover']->img = 'discover.jpg'; + +$months = array(); +$months[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_MONTH')); +$months[] = JHtml::_('select.option', '01', 1); +$months[] = JHtml::_('select.option', '02', 2); +$months[] = JHtml::_('select.option', '03', 3); +$months[] = JHtml::_('select.option', '04', 4); +$months[] = JHtml::_('select.option', '05', 5); +$months[] = JHtml::_('select.option', '06', 6); +$months[] = JHtml::_('select.option', '07', 7); +$months[] = JHtml::_('select.option', '08', 8); +$months[] = JHtml::_('select.option', '09', 9); +$months[] = JHtml::_('select.option', '10', 10); +$months[] = JHtml::_('select.option', '11', 11); +$months[] = JHtml::_('select.option', '12', 12); + +?> +trigger('onListCreditCards', array('selectable' => true)); +?> +
    + + + + +
    +
    +
    + get("accepted_credict_card", array()); + + for ($ic = 0, $nic = count($creditCard); $ic < $nic; $ic++) + { + $url = REDSHOP_FRONT_IMAGES_ABSPATH . 'checkout/' . $creditCardList[$creditCard[$ic]]->img; + $text = ''; + $cardTypes[] = JHtml::_('select.option', $creditCard[$ic], $text); + } + + echo JHtml::_('redshopselect.radiolist', $cardTypes, 'creditcard_code', array('cssClassSuffix' => ''), 'value', 'text', $creditCardData['creditcard_code']); + ?> +
    +
    +
    + +
    + + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +
    +
    diff --git a/component/site/layouts/order/payment/extrafields.php b/component/site/layouts/order/payment/extrafields.php new file mode 100644 index 00000000000..3f1925bef1c --- /dev/null +++ b/component/site/layouts/order/payment/extrafields.php @@ -0,0 +1,34 @@ +params->get('extrafield_payment', array()); +?> + 0) : ?> +
    + + "; + echo ''; + ?> + +
    + diff --git a/component/site/layouts/order/payment/index.html b/component/site/layouts/order/payment/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/order/payment/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/layouts/order/status_log.php b/component/site/layouts/order/status_log.php new file mode 100644 index 00000000000..51e81dfff33 --- /dev/null +++ b/component/site/layouts/order/status_log.php @@ -0,0 +1,97 @@ + +
    +
    +
    +
    +

    +
    +
    +
      + + $log): ?> + +
    • + date_changed) ?> +
    • + +
    • + +
      +

      +
      +

      : order_status_name ?> +

      + order_payment_status)): ?> +

      : +

      + + order_payment_status))); ?> +

      : +

      + +

      customer_note ?>

      +
      +
      +
    • + + order_status != $nextLog->order_status): ?> +
    • + +
      +
      +  order_status_name ?> +
      +
      +
    • + + order_payment_status != $nextLog->order_payment_status && $log->order_payment_status): ?> + order_payment_status))); ?> +
    • + +
      +
      +   +
      +
      +
    • + + customer_note) && $log->customer_note != $nextLog->customer_note): ?> +
    • + +
      +
      + customer_note ?> +
      +
      +
    • + + + +
    +
    +
    +
    +
    diff --git a/component/site/layouts/pagination/customize.php b/component/site/layouts/pagination/customize.php new file mode 100755 index 00000000000..46d011ac8af --- /dev/null +++ b/component/site/layouts/pagination/customize.php @@ -0,0 +1,77 @@ +get('showLimitBox', true); +$showPagesLinks = $options->get('showPagesLinks', true); +$showLimitStart = $options->get('showLimitStart', true); + +// Calculate to display range of pages +$currentPage = 1; +$range = 1; +$step = 1; + +if (!empty($pages['pages'])) +{ + foreach ($pages['pages'] as $k => $page) + { + if (!$page['active']) + { + $currentPage = $k; + } + } +} + +if ($currentPage >= $step) +{ + if ($currentPage % $step == 0) + { + $range = ceil($currentPage / $step) + 1; + } + else + { + $range = ceil($currentPage / $step); + } +} +?> + +
    + +
    + + + +
      + + $page) : ?> + + + + + ).*?()#', '$1...$2', $output); ?> + + + + + + +
    + diff --git a/component/site/layouts/pagination/customize_link.php b/component/site/layouts/pagination/customize_link.php new file mode 100755 index 00000000000..58756e3354d --- /dev/null +++ b/component/site/layouts/pagination/customize_link.php @@ -0,0 +1,96 @@ +text; + +switch ((string) $item->text) +{ + // Check for "Start" item + case JText::_('JLIB_HTML_START') : + $icon = "pagenav icon-backward icon-first"; + $text = JText::_('JLIB_HTML_START'); + $class = "pagination-start"; + break; + + // Check for "Prev" item + case $item->text == JText::_('JPREV') : + $item->text = JText::_('JPREVIOUS'); + $icon = "pagenav icon-step-backward icon-previous"; + $text = JText::_('JPREVIOUS'); + $class = "pagination-prev"; + break; + + // Check for "Next" item + case JText::_('JNEXT') : + $icon = "icon-step-forward icon-next"; + $text = JText::_('JNEXT'); + $class = "pagination-next"; + break; + + // Check for "End" item + case JText::_('JLIB_HTML_END') : + $icon = "icon-forward icon-last"; + $text = JText::_('JLIB_HTML_END'); + $class = "pagination-end"; + break; + + default: + $icon = null; + break; +} + +if ($icon !== null) +{ + $display = $text; +} + +if ($displayData['active']) +{ + if ($item->base > 0) + { + $limit = 'limitstart.value=' . $item->base; + } + else + { + $limit = 'limitstart.value=0'; + } + + $cssClasses = array(); + + $title = ''; + + if (!is_numeric($item->text)) + { + JHtml::_('bootstrap.tooltip'); + $cssClasses[] = 'hasTooltip'; + $title = ' title="' . $item->text . '" '; + } + + $onClick = 'pagination(' . ($item->base > 0 ? $item->base : '0') . ');'; +} +else +{ + $class = (property_exists($item, 'active') && $item->active) ? 'pagenav' : $class; +} +?> + +
  • + href="javascript:void(0);" onclick=""> + + +
  • + +
  • + +
  • + \ No newline at end of file diff --git a/component/site/layouts/product/ask_question.php b/component/site/layouts/product/ask_question.php new file mode 100644 index 00000000000..365e34712ee --- /dev/null +++ b/component/site/layouts/product/ask_question.php @@ -0,0 +1,82 @@ +id) +{ + $form->setValue('your_name', null, $form->getValue('your_name', null, $user->name)); + $form->setValue('your_email', null, $form->getValue('your_email', null, $user->email)); +} + +$menuItemId = $app->input->getInt('Itemid', 0); +$pid = $app->input->getInt('pid', 0); +$categoryId = $app->input->getInt('category_id', 0); +$template = RedshopHelperTemplate::getTemplate('ask_question_template'); + +if (count($template) > 0 && $template[0]->template_desc != "") +{ + $templateContent = $template[0]->template_desc; +} +else +{ + $templateContent = '
    {user_name_lbl}{user_name}
    {user_email_lbl}{user_email}
    {user_question_lbl}{user_question}
    {send_button}
    '; +} + +?> + +
    + getLabel('your_name'), $templateContent); + $templateContent = str_replace('{user_email_lbl}', $form->getLabel('your_email'), $templateContent); + $templateContent = str_replace('{user_question_lbl}', $form->getLabel('your_question'), $templateContent); + $templateContent = str_replace('{user_telephone_lbl}', $form->getLabel('telephone'), $templateContent); + $templateContent = str_replace('{user_address_lbl}', $form->getLabel('address'), $templateContent); + $templateContent = str_replace('{user_name}', $form->getInput('your_name'), $templateContent); + $templateContent = str_replace('{user_email}', $form->getInput('your_email'), $templateContent); + $templateContent = str_replace('{user_question}', $form->getInput('your_question'), $templateContent); + $templateContent = str_replace('{user_address}', $form->getInput('address'), $templateContent); + $templateContent = str_replace('{user_telephone}', $form->getInput('telephone'), $templateContent); + $templateContent = str_replace('{send_button}', '', $templateContent); + + $captcha = ''; + + if ($user->guest) + { + $captcha = RedshopLayoutHelper::render('registration.captcha'); + } + + $templateContent = str_replace('{captcha}', $captcha, $templateContent); + + echo eval('?>' . $templateContent . ' + + + + + + +
    diff --git a/component/site/layouts/product/compare.php b/component/site/layouts/product/compare.php new file mode 100644 index 00000000000..e8c96bae58e --- /dev/null +++ b/component/site/layouts/product/compare.php @@ -0,0 +1,26 @@ + 'com_redshop', + 'view' => 'product', + 'layout' => 'compare' + ) +); + +$compareLink = JRoute::_('index.php?option=com_redshop&view=product&layout=compare&Itemid=' . $itemId); +?> + +
    + +
    +
    diff --git a/component/site/layouts/product/compare_ajax.php b/component/site/layouts/product/compare_ajax.php new file mode 100644 index 00000000000..b7fc19e56e6 --- /dev/null +++ b/component/site/layouts/product/compare_ajax.php @@ -0,0 +1,63 @@ +input->get('cmd'); +$total = $compare->getItemsTotal(); +?> +getItems()) > 0) : ?> +
      + getItems() as $data) : ?> + productId; + $categoryId = $data['item']->categoryId; + $product = RedshopHelperProduct::getProductById($productId); + + $ItemData = $productHelper->getMenuInformation(0, 0, '', 'product&pid=' . $product->product_id); + $catidmain = $product->cat_in_sefurl; + + if (count($ItemData) > 0) + { + $pItemid = $ItemData->id; + } + else + { + $pItemid = RedshopHelperRouter::getItemId($product->product_id, $catidmain); + } + + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $productId . '&cid=' . $categoryId . '&Itemid=' . $pItemid); + ?> +
    • + + product_name ?> + + + + + + +
    • + +
    + + diff --git a/component/site/layouts/product/index.html b/component/site/layouts/product/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/product/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/layouts/product/order_attribute.php b/component/site/layouts/product/order_attribute.php new file mode 100644 index 00000000000..2710c076188 --- /dev/null +++ b/component/site/layouts/product/order_attribute.php @@ -0,0 +1,117 @@ + + + + getProductAttribute(0, 0, $orderItemAttdata[$i]->section_id); ?> + + 0) : ?> + hide_attribute_price; ?> + + + section_name)) : ?> +
    + section_name); ?> +
    + + section_number)) : ?> +
    + section_number); ?> +
    + + + section_id); ?> + + section_id, $orderPropdata[$p]->parent_section_id, 0, 0, 0, 0, false); ?> + + + section_price + $orderPropdata[$p]->section_vat; ?> + + + section_oprand . Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . $propertyPrice . ")"; ?> + + + + section_oprand . $productHelper->getProductFormattedPrice($propertyPrice) . ")"; ?> + + section_oprand; ?> + + + + + + + +
    + section_name)) : ?> +
    + section_name) . $disPrice; ?> +
    + + property_number)) : ?> +
    + property_number) . $disPrice; ?> +
    + + property_number)) :?> +
    + property_number; ?> +
    + +
    + section_id); ?> + section_id)) : ?> + + section_price; ?> + section_id, $orderSubpropdata[$sp]->parent_section_id, false); ?> + + section_price + $orderSubpropdata[$sp]->section_vat; ?> + + + section_oprand . Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . $subPropertyPrice . ")"; ?> + + + + section_oprand . $productHelper->getProductFormattedPrice($subPropertyPrice) . ")"; ?> + + section_oprand; ?> + + + + + + + + + subattribute_color_title)) : ?> +
    + subattribute_color_title); ?> +
    + + + subattribute_color_name)) : ?> +
    + subattribute_color_name); ?> +
    + + subattribute_color_number)) : ?> +
    + subattribute_color_number); ?> +
    + + + + + \ No newline at end of file diff --git a/component/site/layouts/product/product_accessory.php b/component/site/layouts/product/product_accessory.php new file mode 100644 index 00000000000..91e4b157758 --- /dev/null +++ b/component/site/layouts/product/product_accessory.php @@ -0,0 +1,113 @@ + + +
    + +
    + $accessory): ?> + + + 0): ?> + getProducttax($productId, $accessoryPrice, $userId); ?> + + + + + getProductFormattedPrice($accessoryPrice) . ")"; ?> + get('DEFAULT_QUOTATION_MODE') && !Redshop::getConfig()->get('SHOW_QUOTATION_PRICE')): ?> + + +
    + +
    + + + + + + getProductAttribute(0, 0, $attributes['attribute_id']); ?> + + 0): ?> + hide_attribute_price; ?> + +
    + : +
    + + + + 0): ?> + getProducttax($productId, $propertyPrice, $userId); ?> + + + + + getProductFormattedPrice($propertyPrice) . ")"; ?> + get('DEFAULT_QUOTATION_MODE') && !Redshop::getConfig()->get('SHOW_QUOTATION_PRICE') || $hideAttribute): ?> + + + + + 0 && $property[0]->property_number) : ?> + " . $property[0]->property_number + . ""; ?> + +
    +
    + +
    + +
    + + + + + 0): ?> + getProducttax($productId, $subPropertyPrice, $userId); ?> + + + + + getProductFormattedPrice($subPropertyPrice) . ")"; ?> + get('DEFAULT_QUOTATION_MODE') && !Redshop::getConfig()->get('SHOW_QUOTATION_PRICE') || $hideAttribute): ?> + + + + + 0 && $subProperty[0]->subattribute_color_number) : ?> + [" . $subProperty[0]->subattribute_color_number + . "]"; ?> + +
    +
    + +
    + +
    + + + + + + + diff --git a/component/site/layouts/product/product_attribute.php b/component/site/layouts/product/product_attribute.php new file mode 100644 index 00000000000..28bbca066d1 --- /dev/null +++ b/component/site/layouts/product/product_attribute.php @@ -0,0 +1,95 @@ + + 0) : ?> +
    + + + + getProductAttribute(0, 0, $attributes[$i]['attribute_id']); ?> + + hide_attribute_price; ?> + + 0) : ?> +
    + +
    + + + getProductFormattedPrice($propertyPrice) . ")"; + ?> + get('DEFAULT_QUOTATION_MODE') && !Redshop::getConfig()->get('SHOW_QUOTATION_PRICE')) || $hideAttributePrice): ?> + + + + + + + 0 && $property[0]->property_number): ?> + " . $property[0]->property_number . ""; ?> + + + + +
    +
    + +
    + +
    + + 0): ?> +
    + +
    + + + + + getProductFormattedPrice($subPropertyPrice) . ")"; ?> + get('DEFAULT_QUOTATION_MODE') && !Redshop::getConfig()->get('SHOW_QUOTATION_PRICE')) || $hideAttributePrice): ?> + + + + + + + 0 && $subProperties[0]->subattribute_color_number): ?> + " . $subProperties[0]['subattribute_color_number'] . ""; ?> + + + + +
    +
    + +
    + +
    + + + + + + + + + + $value): ?> + discount_price != 0 && $value->discount_start_date != 0 && $value->discount_end_date != 0 && $value->discount_start_date <= time() && $value->discount_end_date >= time()) : ?> + product_price = $value->discount_price; ?> + + getProductTax($productId, $value->product_price, $userId); + $price = $productHelper->getProductFormattedPrice($value->product_price + $tax); + ?> + + + + + +
    price_quantity_start; ?> - price_quantity_end; ?>
    \ No newline at end of file diff --git a/component/site/layouts/product/product_rating.php b/component/site/layouts/product/product_rating.php new file mode 100644 index 00000000000..230d9079236 --- /dev/null +++ b/component/site/layouts/product/product_rating.php @@ -0,0 +1,115 @@ +input->getInt('Itemid', 0); +$category_id = $app->input->getInt('cid', 0); + +JHtml::_('behavior.keepalive'); +JHtml::_('behavior.formvalidation'); +JHtml::_('redshopjquery.radiobutton'); + +$user = JFactory::getUser(); +$userHelper = rsUserHelper::getInstance(); + +if ($user->id) +{ + if ($userInfo = RedshopHelperUser::getUserInformation($user->id)) + { + $username = $userInfo->firstname . " " . $userInfo->lastname; + } + else + { + $username = $user->name; + } + + $form->setValue('username', null, $form->getValue('username', null, $username)); + $form->setFieldAttribute('username', 'disabled', 'true', null); + $form->setFieldAttribute('username', 'required', 'false', null); + $form->setFieldAttribute('email', 'required', 'false', null); +} +?> + +
    + +

    +
    +
    + +
    +
    +
    +
    getInput('user_rating'); ?>
    +
    +
    +
    +
    + +
    + +
    getInput('username'); ?>
    +
    + + guest): ?> +
    + +
    getInput('email'); ?>
    +
    + + +
    + +
    getInput('title'); ?>
    +
    + +
    + +
    getInput('comment'); ?>
    +
    + + guest): ?> + + +
    + +
    + +
    + +

    + + + + + + + + + +
    diff --git a/component/site/layouts/product/quotation_attribute.php b/component/site/layouts/product/quotation_attribute.php new file mode 100644 index 00000000000..9428c274cf1 --- /dev/null +++ b/component/site/layouts/product/quotation_attribute.php @@ -0,0 +1,71 @@ + + +
    + section_name ?> + + section_id + ); + ?> + + +
    + section_name ?> + + get('SHOW_QUOTATION_PRICE') == 1)) : ?> + section_oprand; + $propertyPrice = $productHelper->getProductFormattedPrice($property->section_price); + $propertyPriceWithVat = $productHelper->getProductFormattedPrice($property->section_price + $property->section_vat); + + echo "(" . $propertyOprand . " " . $propertyPrice . " excl. vat / " . $propertyPriceWithVat . ")"; + ?> + +
    + + section_id + ); + ?> + + +
    + section_name ?> + + get('SHOW_QUOTATION_PRICE') == 1)) : ?> + section_oprand; + $subpropertyPrice = $productHelper->getProductFormattedPrice($subProperty->section_price); + $subpropertyPriceWithVat = $productHelper->getProductFormattedPrice($subProperty->section_price + $subProperty->section_vat); + + echo "(" . $subpropertyOprand . " " . $subpropertyPrice . " excl. vat / " . $subpropertyPriceWithVat . ")"; + ?> + +
    + + +
    + \ No newline at end of file diff --git a/component/site/layouts/product/rating.php b/component/site/layouts/product/rating.php new file mode 100644 index 00000000000..89b3e4e27ca --- /dev/null +++ b/component/site/layouts/product/rating.php @@ -0,0 +1,18 @@ + + + + +stock_amount_image, + '', + 'thumb', + 'stockroom', + Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_WIDTH'), + Redshop::getConfig()->get('DEFAULT_STOCKAMOUNT_THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') +); +?> + + + <?php echo $stockamountImage->stock_amount_image_tooltip ?> + diff --git a/component/site/layouts/product/stockroom_detail.php b/component/site/layouts/product/stockroom_detail.php new file mode 100644 index 00000000000..68ea67520ab --- /dev/null +++ b/component/site/layouts/product/stockroom_detail.php @@ -0,0 +1,23 @@ + + + 0) : ?> +
    + +
    + stockroom_name ?>:quantity ?> +
    + +
    + diff --git a/component/site/layouts/registration/captcha.php b/component/site/layouts/registration/captcha.php new file mode 100644 index 00000000000..bc677dcc435 --- /dev/null +++ b/component/site/layouts/registration/captcha.php @@ -0,0 +1,31 @@ +get('captcha'); + +if ($app->isSite()) +{ + $default = $app->getParams()->get('captcha', JFactory::getConfig()->get('captcha')); +} +?> + + + 'redshop')); ?> + + +
    + display('security_code', 'security_code', 'required'); ?> +
    + + + diff --git a/component/site/layouts/registration/index.html b/component/site/layouts/registration/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/component/site/layouts/registration/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/component/site/models/account.php b/component/site/models/account.php new file mode 100755 index 00000000000..f956ecb6b97 --- /dev/null +++ b/component/site/models/account.php @@ -0,0 +1,630 @@ +_table_prefix = '#__redshop_'; + } + + /** + * Get user Account information + * + * @param integer $uid User ID + * + * @return object|boolean + */ + public function getUserAccountInfo($uid) + { + $user = JFactory::getUser(); + $session = JFactory::getSession(); + $auth = $session->get('auth'); + $list = new stdClass; + + if ($user->id) + { + $list = RedshopHelperOrder::getBillingAddress($user->id); + } + elseif ($auth['users_info_id']) + { + $uid = -$auth['users_info_id']; + $list = RedshopHelperOrder::getBillingAddress($uid); + } + + if (!empty($list)) + { + $list->email = $list->user_email; + } + + return $list; + } + + /** + * Method for get user coupons + * + * @param integer $uid User ID + * + * @return array + */ + public function getUserCoupons($uid) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from('#__redshop_coupons') + ->where('published = 1') + ->where('userid = ' . (int) $uid) + ->where('end_date >= ' . JFactory::getDate()->toSql()) + ->where($db->qn('amount_left') . ' > 0'); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Method for get current account detail + * + * @return null|object[] + * @throws Exception + */ + public function getMyDetail() + { + /** @var JApplicationSite $app */ + $app = JFactory::getApplication(); + + $start = $app->input->getInt('limitstart', 0); + $limit = $app->getParams()->get('maxcategory'); + + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + + if ($query) + { + $this->_data = $this->_getList($query, $start, $limit); + } + } + + return $this->_data; + } + + /** + * Method for build query + * + * @return JDatabaseQuery|boolean + * + * @throws Exception + */ + public function _buildQuery() + { + $app = JFactory::getApplication(); + $layout = $app->input->getCmd('layout', ''); + + if ($layout !== 'mytags' && $layout !== 'mywishlist') + { + return false; + } + + $tagId = $app->input->getInt('tagid', 0); + $wishListId = $app->input->getInt('wishlist_id', 0); + $userId = JFactory::getUser(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + // Layout: mytags + if ($layout == 'mytags') + { + if ($tagId != 0) + { + $query->select(array('ptx.product_id', 'p.*')) + ->leftJoin( + $db->qn('#__redshop_product', 'p') + . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('ptx.product_id') + ) + ->where($db->qn('pt.tags_id') . ' = ' . (int) $tagId); + } + + $query->select('DISTINCT pt.*') + ->from($db->qn('#__redshop_product_tags', 'pt')) + ->leftJoin( + $db->qn('#__redshop_product_tags_xref', 'ptx') + . ' ON ' . $db->qn('pt.tags_id') . ' = ' . $db->qn('ptx.tags_id') + ) + ->where($db->qn('ptx.users_id') . ' = ' . (int) $userId) + ->where($db->qn('pt.published') . ' = 1'); + + return $query; + } + + // Layout: mywishlist + if ($userId && $wishListId) + { + $query->select('DISTINCT(' . $db->qn('w.wishlist_id') . ')') + ->select(array('w.*', 'p.*')) + ->from($db->qn('#__redshop_wishlist', 'w')) + ->leftJoin($db->qn('#__redshop_wishlist_product', 'pw') . ' ON w.wishlist_id = pw.wishlist_id') + ->leftJoin($db->qn('#__redshop_product', 'p') . ' ON p.product_id = pw.product_id') + ->where('w.user_id = ' . (int) $userId->id) + ->where('w.wishlist_id = ' . (int) $wishListId) + ->where('pw.wishlist_id = ' . (int) $wishListId); + + return $query; + } + + // Add this code to send wishlist while user is not logged in ... + $productIds = array(); + + if (isset($_SESSION["no_of_prod"])) + { + for ($index = 1; $index <= $_SESSION["no_of_prod"]; $index++) + { + if ($_SESSION['wish_' . $index]->product_id != '') + { + $productIds[] = (int) $_SESSION['wish_' . $index]->product_id; + } + } + + $productIds[] = (int) $_SESSION['wish_' . $index]->product_id; + } + + if (!empty($productIds)) + { + $query->select('p.*') + ->from($db->quoteName('#__redshop_product', 'p')) + ->where('p.product_id IN (' . implode(',', $productIds) . ')'); + } + + return $query; + } + + /** + * Method for get pagination + * + * @return JPagination + * @throws Exception + */ + public function getPagination() + { + /** @var JApplicationSite $app */ + $app = JFactory::getApplication(); + $start = $app->input->getInt('limitstart', 0); + $limit = $app->getParams()->get('maxcategory', 5); + + if (empty($this->_pagination)) + { + JLoader::import('joomla.html.pagination'); + + $this->_pagination = new JPagination($this->getTotal(), $start, $limit); + } + + return $this->_pagination; + } + + /** + * Get total data + * + * @return integer + * @throws Exception + */ + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = 0; + + if ($query) + { + $this->_total = $this->_getListCount($query); + } + } + + return $this->_total; + } + + /** + * Count my tags + * + * @return integer + * @throws Exception + */ + public function countMyTags() + { + $userId = JFactory::getUser()->id; + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('COUNT(pt.tags_id)') + ->from($db->quoteName('#__redshop_product_tags', 'pt')) + ->leftJoin($db->quoteName('#__redshop_product_tags_xref', 'ptx') . ' ON pt.tags_id = ptx.tags_id') + ->where('ptx.users_id = ' . (int) $userId) + ->where('pt.published = 1'); + + return (int) $db->setQuery($query)->loadResult(); + } + + /** + * Get number of wishlist + * + * @return integer + * + * @since 2.0.2 + */ + public function countMyWishlist() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from($db->quoteName('#__redshop_wishlist', 'pw')) + ->where('pw.user_id = ' . (int) JFactory::getUser()->id); + + return $db->setQuery($query)->loadResult(); + } + + /** + * Remove product from wishlist + * + * @return void + * @throws Exception + */ + public function removeWishlistProduct() + { + $app = JFactory::getApplication(); + $db = JFactory::getDbo(); + + $itemId = $app->input->getInt('Itemid', 0); + $wishlistId = $app->input->getInt('wishlist_id', 0); + $pid = $app->input->getInt('pid', 0); + $wishlistProductId = $app->input->getInt('wishlist_product_id', 0); + + $user = JFactory::getUser(); + + // Check is user have access to wishlist + $query = $db->getQuery(true) + ->select('wishlist_id') + ->from($db->quoteName('#__redshop_wishlist')) + ->where('user_id = ' . (int) $user->id) + ->where('wishlist_id = ' . (int) $wishlistId); + + echo "
    ";
    +
    +		$list = $db->setQuery($query)->loadResult();
    +
    +		if (count($list) > 0)
    +		{
    +			$query->clear()
    +				->delete($db->quoteName('#__redshop_wishlist_product'))
    +				->where('product_id = ' . (int) $pid)
    +				->where('wishlist_id = ' . (int) $wishlistId);
    +
    +			if ($wishlistProductId)
    +			{
    +				$query->where($db->qn('wishlist_product_id') . ' = ' . $wishlistProductId);
    +			}
    +
    +			$db->setQuery($query);
    +
    +			if ($db->execute())
    +			{
    +				$app->enqueueMessage(JText::_('COM_REDSHOP_WISHLIST_PRODUCT_DELETED_SUCCESSFULLY'));
    +			}
    +			else
    +			{
    +				$app->enqueueMessage(JText::_('COM_REDSHOP_ERROR_DELETING_WISHLIST_PRODUCT'));
    +			}
    +		}
    +		else
    +		{
    +			$app->enqueueMessage(JText::_('COM_REDSHOP_YOU_DONT_HAVE_ACCESS_TO_DELETE_THIS_PRODUCT'));
    +		}
    +
    +		$app->redirect(
    +			JRoute::_(
    +				'index.php?option=com_redshop&wishlist_id=' . $wishlistId . '&view=account&layout=mywishlist&Itemid=' . $itemId,
    +				false
    +			)
    +		);
    +	}
    +
    +	/**
    +	 * Method for remove tag
    +	 *
    +	 * @return  void
    +	 * @throws Exception
    +	 */
    +	public function removeTag()
    +	{
    +		$app = JFactory::getApplication();
    +
    +		$itemId = $app->input->getInt('Itemid', 0);
    +		$tagId  = $app->input->getInt('tagid', 0);
    +
    +		if ($this->removeTags($tagId))
    +		{
    +			$app->enqueueMessage(JText::_('COM_REDSHOP_TAG_DELETED_SUCCESSFULLY'));
    +		}
    +		else
    +		{
    +			$app->enqueueMessage(JText::_('COM_REDSHOP_ERROR_DELETING_TAG'));
    +		}
    +
    +		$app->redirect(JRoute::_('index.php?option=com_redshop&view=account&layout=mytags&Itemid=' . $itemId));
    +	}
    +
    +	/**
    +	 * Method for remove tags
    +	 *
    +	 * @param   integer $tagId Tag ID
    +	 *
    +	 * @return  boolean
    +	 * @throws  Exception
    +	 */
    +	public function removeTags($tagId)
    +	{
    +		$user  = JFactory::getUser();
    +		$db    = JFactory::getDbo();
    +		$query = $db->getQuery(true)
    +			->delete($db->quoteName('#__redshop_product_tags_xref'))
    +			->where('tags_id = ' . (int) $tagId)
    +			->where('users_id = ' . (int) $user->id);
    +
    +		if (!$db->setQuery($query)->execute())
    +		{
    +			return false;
    +		}
    +
    +		$query->clear()
    +			->select('COUNT(tags_id)')
    +			->from($db->quoteName('#__redshop_product_tags_xref'))
    +			->where('tags_id =' . (int) $tagId);;
    +
    +		// If this tag still have reference with other products. Return
    +		if ($db->setQuery($query)->loadResult() > 0)
    +		{
    +			return true;
    +		}
    +
    +		// Delete this tags if not have any reference
    +		$query->clear()
    +			->delete($db->quoteName('#__redshop_product_tags'))
    +			->where('tags_id = ' . (int) $tagId);
    +
    +		return $db->setQuery($query)->execute();
    +	}
    +
    +	/**
    +	 * Method for get my tag
    +	 *
    +	 * @param   integer $tagId Tag Id
    +	 *
    +	 * @return  integer
    +	 */
    +	public function getMyTag($tagId)
    +	{
    +		$db    = JFactory::getDbo();
    +		$query = $db->getQuery(true)
    +			->select('tags_name')
    +			->from($db->quoteName('#__redshop_product_tags'))
    +			->where('tags_id = ' . (int) $tagId);
    +
    +		return $db->setQuery($query)->loadResult();
    +	}
    +
    +	/**
    +	 * Method for update tag
    +	 *
    +	 * @param   array $post Tag Id
    +	 *
    +	 * @return  boolean
    +	 */
    +	public function editTag($post)
    +	{
    +		if (empty($post) || empty($post['tag_id']))
    +		{
    +			return false;
    +		}
    +
    +		/** @var Tableproduct_tags $table */
    +		$table = RedshopTable::getInstance('product_tags', 'Table');
    +
    +		if (!$table->load($post['tag_id']))
    +		{
    +			return false;
    +		}
    +
    +		$table->tags_name = $post['tags_name'];
    +
    +		return $table->store();
    +	}
    +
    +	/**
    +	 * Get compare products
    +	 *
    +	 * @return  array
    +	 * @deprecated 2.1.0
    +	 */
    +	public function getCompare()
    +	{
    +		$db    = JFactory::getDbo();
    +		$query = $db->getQuery(true)
    +			->select($db->qn('pc.compare_id'))
    +			->select($db->qn('pc.user_id'))
    +			->select('p.*')
    +			->from($db->qn('#__redshop_product_compare', 'pc'))
    +			->leftJoin($db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('pc.product_id'))
    +			->where($db->qn('pc.user_id') . ' = ' . (int) JFactory::getUser()->id);
    +
    +		return $this->_getList($query);
    +	}
    +
    +	/**
    +	 * Method for remove compare
    +	 *
    +	 * @return void
    +	 *
    +	 * @throws Exception
    +	 */
    +	public function removeCompare()
    +	{
    +		$app       = JFactory::getApplication();
    +		$itemId    = $app->input->get('Itemid');
    +		$productId = $app->input->getInt('pid', 0);
    +		$db        = $this->getDbo();
    +
    +		$query = $db->getQuery(true)
    +			->delete($db->qn('#__redshop_product_compare'))
    +			->where($db->qn('product_id') . ' = ' . $productId)
    +			->where($db->qn('user_id') . ' = ' . JFactory::getUser()->id);
    +
    +		if ($db->setQuery($query)->execute())
    +		{
    +			$app->enqueueMessage(JText::_('COM_REDSHOP_PRODUCT_DELETED_FROM_COMPARE_SUCCESSFULLY'));
    +		}
    +		else
    +		{
    +			$app->enqueueMessage(JText::_('COM_REDSHOP_ERROR_DELETING_PRODUCT_FROM_COMPARE'));
    +		}
    +
    +		$app->redirect(JRoute::_('index.php?option=com_redshop&view=account&layout=compare&Itemid=' . $itemId, false));
    +	}
    +
    +	/**
    +	 * Method for send wishlist
    +	 *
    +	 * @param   array $post Data
    +	 *
    +	 * @return  boolean
    +	 * @throws  Exception
    +	 *
    +	 * @deprecated 2.1.0 Redshop\Account\Wishlist::send
    +	 * @see        Redshop\Account\Wishlist::send
    +	 */
    +	public function sendWishlist($post)
    +	{
    +		return Redshop\Account\Wishlist::send($post);
    +	}
    +
    +	/**
    +	 * Method for get reserve discount
    +	 *
    +	 * @return  integer
    +	 * @deprecated 2.1.0 Redshop\Account\Helper::getReserveDiscount
    +	 * @see        Redshop\Account\Helper::getReserveDiscount
    +	 */
    +	public function getReserveDiscount()
    +	{
    +		return Redshop\Account\Helper::getReserveDiscount();
    +	}
    +
    +	/**
    +	 * Method for get list of downloadable product on specific user
    +	 *
    +	 * @param   integer $user_id User ID
    +	 *
    +	 * @return  array
    +	 *
    +	 * @deprecated 2.1.0 Redshop\Account\Helper::getDownloadProductList
    +	 * @see        Redshop\Account\Helper::getDownloadProductList
    +	 */
    +	public function getdownloadproductlist($user_id)
    +	{
    +		return Redshop\Account\Helper::getDownloadProductList($user_id);
    +	}
    +
    +	/**
    +	 * Method for get remaining coupon amount of specific user
    +	 *
    +	 * @param   integer $user_id      User Id
    +	 * @param   string  $coupone_code Coupon code
    +	 *
    +	 * @return  float
    +	 *
    +	 * @deprecated 2.1.0 Redshop\Account\Helper::getUnusedCouponAmount
    +	 * @see        Redshop\Account\Helper::getUnusedCouponAmount
    +	 */
    +	public function unused_coupon_amount($user_id, $coupone_code)
    +	{
    +		return Redshop\Account\Helper::getUnusedCouponAmount($user_id, $coupone_code);
    +	}
    +
    +	/**
    +	 * Function to delete account user
    +	 *
    +	 * @param   int $userId User Id
    +	 *
    +	 * @return  boolean
    +	 *
    +	 * @since   2.1.2
    +	 */
    +	public function deleteAccount($userId)
    +	{
    +		$db    = JFactory::getDbo();
    +		$query = $db->getQuery(true)
    +			->delete($db->qn('#__users'))
    +			->where($db->qn('id') . ' = ' . $userId);
    +
    +		if (!$db->setQuery($query)->execute())
    +		{
    +			return false;
    +		}
    +
    +		$query->clear()
    +			->delete($db->qn('#__redshop_order_users_info'))
    +			->where($db->qn('user_id') . ' = ' . $userId);
    +
    +		if (!$db->setQuery($query)->execute())
    +		{
    +			return false;
    +		}
    +
    +		$query->clear()
    +			->delete($db->qn('#__redshop_users_info'))
    +			->where($db->qn('user_id') . ' = ' . $userId);
    +
    +		return (boolean) $db->setQuery($query)->execute();
    +	}
    +}
    diff --git a/component/site/models/account_billto.php b/component/site/models/account_billto.php
    new file mode 100644
    index 00000000000..f2dea64a5f0
    --- /dev/null
    +++ b/component/site/models/account_billto.php
    @@ -0,0 +1,122 @@
    +get('auth');
    +
    +			if (isset($auth['users_info_id']) && $auth['users_info_id'])
    +			{
    +				$detail = RedshopHelperOrder::getBillingAddress(-$auth['users_info_id']);
    +
    +				if (!isset($detail->user_id))
    +				{
    +					$detail->user_id = -$auth['users_info_id'];
    +				}
    +			}
    +			else
    +			{
    +				// Toggle settings
    +				$isCompany = (Redshop::getConfig()->get('DEFAULT_CUSTOMER_REGISTER_TYPE') == 2) ? 1 : 0;
    +
    +				// Allow registration type settings
    +				if (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') == 1)
    +				{
    +					$isCompany = 0;
    +				}
    +				elseif (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') == 2)
    +				{
    +					$isCompany = 1;
    +				}
    +
    +				$user   = JFactory::getUser();
    +				$detail = new stdClass;
    +
    +				$detail->users_info_id         = 0;
    +				$detail->user_id               = $user->id;
    +				$detail->id                    = $user->id;
    +				$detail->name                  = $user->name;
    +				$detail->username              = $user->username;
    +				$detail->email                 = $user->email;
    +				$detail->user_email            = $user->email;
    +				$detail->password              = null;
    +				$detail->is_company            = $isCompany;
    +				$detail->firstname             = null;
    +				$detail->lastname              = null;
    +				$detail->address_type          = 'BT';
    +				$detail->company_name          = null;
    +				$detail->vat_number            = null;
    +				$detail->tax_exempt            = 0;
    +				$detail->country_code          = null;
    +				$detail->state_code            = null;
    +				$detail->shopper_group_id      = null;
    +				$detail->published             = 1;
    +				$detail->address               = null;
    +				$detail->city                  = null;
    +				$detail->zipcode               = null;
    +				$detail->phone                 = null;
    +				$detail->requesting_tax_exempt = 0;
    +				$detail->tax_exempt_approved   = 0;
    +				$detail->approved              = 1;
    +			}
    +
    +			return $detail;
    +		}
    +
    +		return null;
    +	}
    +
    +	/**
    +	 * Method for store billing address
    +	 *
    +	 * @param   array  $post  Data
    +	 *
    +	 * @return  boolean|Tableuser_detail
    +	 * @throws  Exception
    +	 */
    +	public function store($post)
    +	{
    +		$post['billisship']    = 1;
    +		$post['createaccount'] = (isset($post['username']) && $post['username'] != "") ? 1 : 0;
    +
    +		$joomlaUser = RedshopHelperJoomla::updateJoomlaUser($post);
    +
    +		if (!$joomlaUser)
    +		{
    +			return false;
    +		}
    +
    +		return RedshopHelperUser::storeRedshopUser($post, $joomlaUser->id);
    +	}
    +}
    diff --git a/component/site/models/account_shipto.php b/component/site/models/account_shipto.php
    new file mode 100644
    index 00000000000..f4683f703b7
    --- /dev/null
    +++ b/component/site/models/account_shipto.php
    @@ -0,0 +1,167 @@
    +_table_prefix = '#__redshop_';
    +		$infoid              = JFactory::getApplication()->input->getInt('infoid');
    +
    +		$this->setId($infoid);
    +	}
    +
    +	/**
    +	 * Method for set Id
    +	 *
    +	 * @param   integer $id ID
    +	 *
    +	 * @return  void
    +	 */
    +	public function setId($id)
    +	{
    +		$this->_id   = $id;
    +		$this->_data = null;
    +	}
    +
    +	/**
    +	 * Method for get data
    +	 *
    +	 * @return mixed|null
    +	 */
    +	public function &getData()
    +	{
    +		if (!$this->_loadData())
    +		{
    +			$this->_initData();
    +		}
    +
    +		return $this->_data;
    +	}
    +
    +	/**
    +	 * Method for init data
    +	 *
    +	 * @return  boolean
    +	 */
    +	public function _initData()
    +	{
    +		if (empty($this->_data))
    +		{
    +			$detail = new stdClass;
    +
    +			$detail->users_info_id = 0;
    +			$detail->user_id       = 0;
    +			$detail->firstname     = null;
    +			$detail->lastname      = null;
    +			$detail->company_name  = null;
    +			$detail->address       = null;
    +			$detail->state_code    = null;
    +			$detail->country_code  = null;
    +			$detail->city          = null;
    +			$detail->zipcode       = null;
    +			$detail->phone         = 0;
    +
    +			$this->_data = $detail;
    +
    +			return true;
    +		}
    +
    +		return true;
    +	}
    +
    +	/**
    +	 * Method for load data
    +	 *
    +	 * @param   integer $userInfoId User infor Id
    +	 *
    +	 * @return  mixed
    +	 */
    +	public function _loadData($userInfoId = 0)
    +	{
    +		if ($userInfoId)
    +		{
    +			return RedshopEntityUser::getInstance((int) $userInfoId)->getItem();
    +		}
    +
    +		if (empty($this->_data))
    +		{
    +			$this->_data = RedshopEntityUser::getInstance((int) $this->_id)->getItem();
    +
    +			return $this->_data;
    +		}
    +
    +		return true;
    +	}
    +
    +	/**
    +	 * Method for delete shipping data
    +	 *
    +	 * @param   integer  $infoid  Infor data
    +	 *
    +	 * @return  boolean
    +	 */
    +	public function delete($infoid)
    +	{
    +		// Init variables.
    +		$db    = JFactory::getDbo();
    +		$query = $db->getQuery(true)
    +			->delete($db->qn('#__redshop_users_info'))
    +			->where($db->qn('users_info_id') . ' = ' . (int) $infoid);
    +
    +		// Set the query and execute the delete.
    +		return $db->setQuery($query)->execute();
    +	}
    +
    +	/**
    +	 * Method for store shipping data
    +	 *
    +	 * @param   array  $post  Infor data
    +	 *
    +	 * @return  boolean|Tableuser_detail
    +	 * @throws  Exception
    +	 */
    +	public function store($post)
    +	{
    +		$post['user_email'] = $post['email1'] = $post['email'];
    +
    +		return RedshopHelperUser::storeRedshopUserShipping($post);
    +	}
    +}
    diff --git a/component/site/models/ask_question.php b/component/site/models/ask_question.php
    new file mode 100644
    index 00000000000..0bfe1b62066
    --- /dev/null
    +++ b/component/site/models/ask_question.php
    @@ -0,0 +1,145 @@
    +loadForm('com_redshop.ask_question', 'ask_question', array('control' => 'jform', 'load_data' => $loadData));
    +
    +		if (empty($form))
    +		{
    +			return false;
    +		}
    +
    +		return $form;
    +	}
    +
    +	/**
    +	 * Method to get the data that should be injected in the form.
    +	 *
    +	 * @return  array    The default data is an empty array.
    +	 * @throws  Exception
    +	 *
    +	 * @since   1.5
    +	 */
    +	protected function loadFormData()
    +	{
    +		$data = (array) JFactory::getApplication()->getUserState('com_redshop.ask_question.data', array());
    +
    +		return $data;
    +	}
    +
    +	/**
    +	 * Method to store the records
    +	 *
    +	 * @param   array $data array of data
    +	 *
    +	 * @return  boolean
    +	 * @throws  Exception
    +	 */
    +	public function store($data)
    +	{
    +		$user                  = JFactory::getUser();
    +		$data['user_id']       = $user->id;
    +		$data['user_name']     = $data['your_name'];
    +		$data['user_email']    = $data['your_email'];
    +		$data['question']      = $data['your_question'];
    +		$data['published']     = 1;
    +		$data['question_date'] = time();
    +
    +		$row = $this->getTable('Question');
    +
    +		$data['ordering'] = $this->maxOrdering();
    +
    +		if (!$row->bind($data))
    +		{
    +			$this->setError($this->_db->getErrorMsg());
    +
    +			return false;
    +		}
    +
    +		if (!$row->store())
    +		{
    +			$this->setError($this->_db->getErrorMsg());
    +
    +			return false;
    +		}
    +
    +		return true;
    +	}
    +
    +	/**
    +	 * Method to get max ordering
    +	 *
    +	 * @access public
    +	 *
    +	 * @return boolean
    +	 */
    +	public function maxOrdering()
    +	{
    +		$db    = JFactory::getDbo();
    +		$query = $db->getQuery(true)
    +			->select('MAX(ordering)+1')
    +			->from($db->qn('#__redshop_customer_question'))
    +			->where('parent_id = 0');
    +
    +		return $db->setQuery($query)->loadResult();
    +	}
    +
    +	/**
    +	 * Send Mail For Ask Question
    +	 *
    +	 * @param   array $data Question data
    +	 *
    +	 * @return  boolean
    +	 * @throws  Exception
    +	 */
    +	public function sendMailForAskQuestion($data)
    +	{
    +		if (!$this->store($data))
    +		{
    +			return false;
    +		}
    +
    +		if (!Redshop\Mail\AskQuestion::sendAskQuestion($data))
    +		{
    +			$this->setError(JText::_('COM_REDSHOP_EMAIL_HAS_NOT_BEEN_SENT_SUCCESSFULLY'));
    +
    +			return false;
    +		}
    +
    +		return true;
    +	}
    +}
    diff --git a/component/site/models/cart.php b/component/site/models/cart.php
    new file mode 100644
    index 00000000000..dbb714eddbb
    --- /dev/null
    +++ b/component/site/models/cart.php
    @@ -0,0 +1,933 @@
    +_table_prefix = '#__redshop_';
    +
    +		$this->_producthelper = productHelper::getInstance();
    +		$this->_carthelper    = rsCarthelper::getInstance();
    +		$this->_userhelper    = rsUserHelper::getInstance();
    +		$this->_objshipping   = shipping::getInstance();
    +		$user                 = JFactory::getUser();
    +
    +		// Remove expired products from cart
    +		$this->emptyExpiredCartProducts();
    +
    +		$cart = RedshopHelperCartSession::getCart();
    +
    +		if (!empty($cart))
    +		{
    +			if (!$cart)
    +			{
    +				$cart        = array();
    +				$cart['idx'] = 0;
    +			}
    +
    +			$user_id        = $user->id;
    +			$usersess       = JFactory::getSession()->get('rs_user');
    +			$shopperGroupId = RedshopHelperUser::getShopperGroup($user_id);
    +
    +			if (array_key_exists('user_shopper_group_id', $cart))
    +			{
    +				$userArr = RedshopHelperUser::getVatUserInformation($user_id);
    +
    +				// Removed due to discount issue $usersess['vatCountry']
    +				if ($cart['user_shopper_group_id'] != $shopperGroupId
    +					|| (!isset($usersess['vatCountry']) || !isset($usersess['vatState']) || $usersess['vatCountry'] != $userArr->country_code || $usersess['vatState'] != $userArr->state_code)
    +				)
    +				{
    +					$cart                          = \Redshop\Cart\Cart::modify($cart, $user_id);
    +					$cart['user_shopper_group_id'] = $shopperGroupId;
    +
    +					$task = JFactory::getApplication()->input->getCmd('task');
    +
    +					if ($task != 'coupon' && $task != 'voucher')
    +					{
    +						$cart = $this->_carthelper->modifyDiscount($cart);
    +					}
    +				}
    +			}
    +
    +			RedshopHelperCartSession::setCart((array) $cart);
    +		}
    +	}
    +
    +	/**
    +	 * @return  void
    +	 *
    +	 * @since   1.0
    +	 */
    +	public function emptyExpiredCartProducts()
    +	{
    +		if (Redshop::getConfig()->get('IS_PRODUCT_RESERVE') && Redshop::getConfig()->get('USE_STOCKROOM'))
    +		{
    +			$session     = JFactory::getSession();
    +			$db          = JFactory::getDbo();
    +			$query       = $db->getQuery(true);
    +			$sessionId   = session_id();
    +			$carttimeout = (int) Redshop::getConfig()->get('CART_TIMEOUT');
    +			$time        = time() - ($carttimeout * 60);
    +
    +			$query->select($db->quoteName('product_id'))
    +				->from($db->quoteName('#__redshop_cart'))
    +				->where($db->quoteName('session_id') . ' = ' . $db->quote($sessionId))
    +				->where($db->quoteName('section') . ' = ' . $db->quote('product'));
    +			$db->setQuery($query);
    +			$includedrs = $db->loadColumn();
    +
    +			$query->where($db->quoteName('time') . ' < ' . $db->quote($time));
    +
    +			$db->setQuery($query);
    +			$deletedrs = $db->loadColumn();
    +
    +			$cart = $session->get('cart');
    +
    +			if ($cart)
    +			{
    +				$idx = (int) (isset($cart['idx']) ? $cart['idx'] : 0);
    +
    +				for ($j = 0; $j < $idx; $j++)
    +				{
    +					if (count($deletedrs) > 0 && in_array($cart[$j]['product_id'], $deletedrs))
    +					{
    +						$this->delete($j);
    +					}
    +
    +					if (count($includedrs) > 0 && !in_array($cart[$j]['product_id'], $includedrs))
    +					{
    +						$this->delete($j);
    +					}
    +				}
    +			}
    +
    +			RedshopHelperStockroom::deleteExpiredCartProduct();
    +		}
    +	}
    +
    +	/**
    +	 * Empty cart
    +	 *
    +	 * @return  boolean
    +	 *
    +	 * @since   2.0.6
    +	 */
    +	public function emptyCart()
    +	{
    +		return RedshopHelperCart::emptyCart();
    +	}
    +
    +	/**
    +	 *
    +	 * @return  array|null
    +	 *
    +	 * @since   2.0.6
    +	 */
    +	public function getData()
    +	{
    +		if (empty($this->_data))
    +		{
    +			if (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE'))
    +			{
    +				$this->_data = RedshopHelperTemplate::getTemplate("quotation_cart");
    +			}
    +			else
    +			{
    +				if (!Redshop::getConfig()->get('USE_AS_CATALOG'))
    +				{
    +					$this->_data = RedshopHelperTemplate::getTemplate("cart");
    +				}
    +				else
    +				{
    +					$this->_data = RedshopHelperTemplate::getTemplate("catalogue_cart");
    +				}
    +			}
    +		}
    +
    +		return $this->_data;
    +	}
    +
    +	/**
    +	 * Update cart.
    +	 *
    +	 * @param   array $data data in cart
    +	 */
    +	public function update($data)
    +	{
    +		$cart = RedshopHelperCartSession::getCart();
    +		$user = JFactory::getUser();
    +
    +		$cartElement = $data['cart_index'];
    +		$newQuantity = intval(abs($data['quantity']) > 0 ? $data['quantity'] : 1);
    +		$oldQuantity = intval($cart[$cartElement]['quantity']);
    +
    +		$calculator_price = 0;
    +		$wrapper_price    = 0;
    +		$wrapper_vat      = 0;
    +
    +		if ($newQuantity <= 0)
    +		{
    +			$newQuantity = 1;
    +		}
    +
    +		if ($newQuantity != $oldQuantity)
    +		{
    +			if (isset($cart[$cartElement]['giftcard_id']) && $cart[$cartElement]['giftcard_id'])
    +			{
    +				$cart[$cartElement]['quantity'] = $newQuantity;
    +			}
    +			else
    +			{
    +				if (array_key_exists('checkQuantity', $data))
    +				{
    +					$cart[$cartElement]['quantity'] = $data['checkQuantity'];
    +				}
    +				else
    +				{
    +					$cart[$cartElement]['quantity'] = $this->_carthelper->checkQuantityInStock($cart[$cartElement], $newQuantity);
    +				}
    +
    +				if ($newQuantity > $cart[$cartElement]['quantity'])
    +				{
    +					$cart['notice_message'] = $cart[$cartElement]['quantity'] . " " . JTEXT::_('COM_REDSHOP_AVAILABLE_STOCK_MESSAGE');
    +				}
    +				else
    +				{
    +					$cart['notice_message'] = "";
    +				}
    +
    +				$cart[$cartElement]['cart_accessory'] = $this->updateAccessoryPriceArray($cart[$cartElement], $cart[$cartElement]['quantity']);
    +				$cart[$cartElement]['cart_attribute'] = $this->updateAttributePriceArray($cart[$cartElement], $cart[$cartElement]['quantity']);
    +
    +				// Discount calculator
    +				if (!empty($cart[$cartElement]['discount_calc']))
    +				{
    +					$calcdata               = $cart[$cartElement]['discount_calc'];
    +					$calcdata['product_id'] = $cart[$cartElement]['product_id'];
    +
    +					$discount_cal = $this->_carthelper->discountCalculator($calcdata);
    +
    +					$calculator_price  = $discount_cal['product_price'];
    +					$product_price_tax = $discount_cal['product_price_tax'];
    +				}
    +
    +				// Attribute price
    +				$retAttArr                  = $this->_producthelper->makeAttributeCart($cart[$cartElement]['cart_attribute'], $cart[$cartElement]['product_id'], $user->id, $calculator_price, $cart[$cartElement]['quantity']);
    +				$product_price              = $retAttArr[1];
    +				$product_vat_price          = $retAttArr[2];
    +				$product_old_price          = $retAttArr[5] + $retAttArr[6];
    +				$product_old_price_excl_vat = $retAttArr[5];
    +
    +				// Accessory price
    +				$retAccArr             = $this->_producthelper->makeAccessoryCart($cart[$cartElement]['cart_accessory'], $cart[$cartElement]['product_id']);
    +				$accessory_total_price = $retAccArr[1];
    +				$accessory_vat_price   = $retAccArr[2];
    +
    +				if ($cart[$cartElement]['wrapper_id'])
    +				{
    +					$wrapperArr    = $this->_carthelper->getWrapperPriceArr(array('product_id' => $cart[$cartElement]['product_id'], 'wrapper_id' => $cart[$cartElement]['wrapper_id']));
    +					$wrapper_vat   = $wrapperArr['wrapper_vat'];
    +					$wrapper_price = $wrapperArr['wrapper_price'];
    +				}
    +
    +				if (isset($cart[$cartElement]['subscription_id']) && $cart[$cartElement]['subscription_id'] != "")
    +				{
    +					$subscription_vat    = 0;
    +					$subscription_detail = $this->_producthelper->getProductSubscriptionDetail($cart[$cartElement]['product_id'], $cart[$cartElement]['subscription_id']);
    +					$subscription_price  = $subscription_detail->subscription_price;
    +
    +					if ($subscription_price)
    +					{
    +						$subscription_vat = $this->_producthelper->getProductTax($cart[$cartElement]['product_id'], $subscription_price);
    +					}
    +
    +					$product_vat_price += $subscription_vat;
    +					$product_price     = $product_price + $subscription_price;
    +
    +					$product_old_price_excl_vat += $subscription_price;
    +				}
    +
    +				$cart[$cartElement]['product_price']              = $product_price + $product_vat_price + $accessory_total_price + $accessory_vat_price + $wrapper_price + $wrapper_vat;
    +				$cart[$cartElement]['product_old_price']          = $product_old_price + $accessory_total_price + $accessory_vat_price + $wrapper_price + $wrapper_vat;
    +				$cart[$cartElement]['product_old_price_excl_vat'] = $product_old_price_excl_vat + $accessory_total_price + $wrapper_price;
    +				$cart[$cartElement]['product_price_excl_vat']     = $product_price + $accessory_total_price + $wrapper_price;
    +				$cart[$cartElement]['product_vat']                = $product_vat_price + $accessory_vat_price + $wrapper_vat;
    +				JPluginHelper::importPlugin('redshop_product');
    +				$dispatcher = RedshopHelperUtility::getDispatcher();
    +				$dispatcher->trigger('onAfterCartUpdate', array(&$cart, $cartElement, $data));
    +			}
    +		}
    +
    +		RedshopHelperCartSession::setCart($cart);
    +	}
    +
    +	public function update_all($data)
    +	{
    +		JPluginHelper::importPlugin('redshop_product');
    +		$dispatcher    = RedshopHelperUtility::getDispatcher();
    +		$productHelper = productHelper::getInstance();
    +
    +		$cart = RedshopHelperCartSession::getCart();
    +		$user = JFactory::getUser();
    +
    +		if (empty($cart))
    +		{
    +			$cart        = array();
    +			$cart['idx'] = 0;
    +			RedshopHelperCartSession::setCart($cart);
    +			$cart        = RedshopHelperCartSession::getCart();
    +		}
    +
    +		$idx           = (int) ($cart['idx']);
    +		$quantity_all  = $data['quantity_all'];
    +		$quantity      = explode(",", $quantity_all);
    +		$totalQuantity = array_sum($quantity);
    +
    +		for ($i = 0; $i < $idx; $i++)
    +		{
    +			if ($quantity[$i] < 0)
    +			{
    +				$quantity[$i] = $cart[$i]['quantity'];
    +			}
    +
    +			$quantity[$i] = intval(abs($quantity[$i]) > 0 ? $quantity[$i] : 1);
    +
    +			if ($quantity[$i] != $cart[$i]['quantity'])
    +			{
    +				if (isset($cart[$i]['giftcard_id']) && $cart[$i]['giftcard_id'])
    +				{
    +					$cart[$i]['quantity'] = $quantity[$i];
    +				}
    +				else
    +				{
    +					// Reinit price
    +					$productPriceInit = 0;
    +
    +					// Accessory price fix during update
    +					$accessoryAsProdut           = RedshopHelperAccessory::getAccessoryAsProduct($cart['AccessoryAsProduct']);
    +					$accessoryAsProdutWithoutVat = false;
    +
    +					if (isset($accessoryAsProdut->accessory)
    +						&& isset($accessoryAsProdut->accessory[$cart[$i]['product_id']])
    +						&& isset($cart[$i]['accessoryAsProductEligible'])
    +					)
    +					{
    +						$accessoryAsProdutWithoutVat = '{without_vat}';
    +						$accessoryPrice              = (float) $accessoryAsProdut->accessory[$cart[$i]['product_id']]->newaccessory_price;
    +
    +						$productPriceInit                   = $productHelper->productPriceRound($accessoryPrice);
    +						$cart[$i]['product_vat']            = 0;
    +						$cart[$i]['product_price_excl_vat'] = $productHelper->productPriceRound($accessoryPrice);
    +					}
    +
    +					$cart[$i]['quantity'] = $this->_carthelper->checkQuantityInStock($cart[$i], $quantity[$i]);
    +
    +					$cart[$i]['cart_accessory'] = $this->updateAccessoryPriceArray($cart[$i], $cart[$i]['quantity']);
    +					$cart[$i]['cart_attribute'] = $this->updateAttributePriceArray($cart[$i], $cart[$i]['quantity']);
    +
    +					// Discount calculator
    +					if (!empty($cart[$i]['discount_calc']))
    +					{
    +						$calcdata               = $cart[$i]['discount_calc'];
    +						$calcdata['product_id'] = $cart[$i]['product_id'];
    +
    +						$discount_cal = $this->_carthelper->discountCalculator($calcdata);
    +
    +						$calculator_price = $discount_cal['product_price'];
    +					}
    +
    +					$dispatcher->trigger('onBeforeCartItemUpdate', array(&$cart, $i, &$calculator_price));
    +
    +					// Attribute price
    +					$retAttArr = $this->_producthelper->makeAttributeCart(
    +						$cart[$i]['cart_attribute'],
    +						$cart[$i]['product_id'],
    +						$user->id,
    +						$productPriceInit,
    +						$totalQuantity,    // Total Quantity based discount applied here
    +						$accessoryAsProdutWithoutVat
    +					);
    +
    +					$accessoryAsProductZero     = (count($retAttArr[8]) == 0 && $productPriceInit == 0 && ($accessoryAsProdutWithoutVat !== false));
    +					$product_price              = ($accessoryAsProductZero) ? 0 : $retAttArr[1];
    +					$product_vat_price          = ($accessoryAsProductZero) ? 0 : $retAttArr[2];
    +					$product_old_price          = ($accessoryAsProductZero) ? 0 : $retAttArr[5] + $retAttArr[6];
    +					$product_old_price_excl_vat = ($accessoryAsProductZero) ? 0 : $retAttArr[5];
    +
    +					// Accessory price
    +					$retAccArr             = $this->_producthelper->makeAccessoryCart(
    +						$cart[$i]['cart_accessory'],
    +						$cart[$i]['product_id']
    +					);
    +					$accessory_total_price = $retAccArr[1];
    +					$accessory_vat_price   = $retAccArr[2];
    +
    +					$wrapper_price = 0;
    +					$wrapper_vat   = 0;
    +
    +					if ($cart[$i]['wrapper_id'])
    +					{
    +						$wrapperArr    = $this->_carthelper->getWrapperPriceArr(array('product_id' => $cart[$i]['product_id'], 'wrapper_id' => $cart[$i]['wrapper_id']));
    +						$wrapper_vat   = $wrapperArr['wrapper_vat'];
    +						$wrapper_price = $wrapperArr['wrapper_price'];
    +					}
    +
    +					$subscription_vat = 0;
    +
    +					if (isset($cart[$i]['subscription_id']) && $cart[$i]['subscription_id'] != "")
    +					{
    +						$product_id          = $cart[$i]['product_id'];
    +						$subscription_detail = $this->_producthelper->getProductSubscriptionDetail($product_id, $cart[$i]['subscription_id']);
    +						$subscription_price  = $subscription_detail->subscription_price;
    +
    +						if ($subscription_price)
    +						{
    +							$subscription_vat = $this->_producthelper->getProductTax($product_id, $subscription_price);
    +						}
    +
    +						$product_vat_price += $subscription_vat;
    +						$product_price     = $product_price + $subscription_price;
    +
    +						$product_old_price_excl_vat += $subscription_price;
    +					}
    +
    +					$cart[$i]['product_price']              = $product_price + $product_vat_price + $accessory_total_price + $accessory_vat_price + $wrapper_price + $wrapper_vat;
    +					$cart[$i]['product_old_price']          = $product_old_price + $accessory_total_price + $accessory_vat_price + $wrapper_price + $wrapper_vat;
    +					$cart[$i]['product_old_price_excl_vat'] = $product_old_price_excl_vat + $accessory_total_price + $wrapper_price;
    +					$cart[$i]['product_price_excl_vat']     = $product_price + $accessory_total_price + $wrapper_price;
    +					$cart[$i]['product_vat']                = $product_vat_price + $accessory_vat_price + $wrapper_vat;
    +
    +					$dispatcher->trigger('onAfterCartItemUpdate', array(&$cart, $i, $data));
    +				}
    +			}
    +		}
    +
    +		unset($cart[$idx]);
    +
    +		RedshopHelperCartSession::setCart($cart);
    +	}
    +
    +	public function delete($cartElement)
    +	{
    +		$stockroomhelper = rsstockroomhelper::getInstance();
    +		$cart            = RedshopHelperCartSession::getCart();
    +
    +		if (array_key_exists($cartElement, $cart))
    +		{
    +			if (array_key_exists('cart_attribute', $cart[$cartElement]))
    +			{
    +				foreach ($cart[$cartElement]['cart_attribute'] as $cartAttribute)
    +				{
    +					if (array_key_exists('attribute_childs', $cartAttribute))
    +					{
    +						foreach ($cartAttribute['attribute_childs'] as $attributeChilds)
    +						{
    +							if (array_key_exists('property_childs', $attributeChilds))
    +							{
    +								foreach ($attributeChilds['property_childs'] as $propertyChilds)
    +								{
    +									RedshopHelperStockroom::deleteCartAfterEmpty($propertyChilds['subproperty_id'], 'subproperty', $cart[$cartElement]['quantity']);
    +								}
    +							}
    +
    +							RedshopHelperStockroom::deleteCartAfterEmpty($attributeChilds['property_id'], 'property', $cart[$cartElement]['quantity']);
    +						}
    +					}
    +				}
    +			}
    +
    +			$db = JFactory::getDbo();
    +			$query   = $db->getQuery(true)
    +				->select('voucher_id')
    +				->from($db->qn('#__redshop_product_voucher_xref'))
    +				->where($db->qn('product_id') . ' = ' . $db->q((int) $cart[$cartElement]['product_id']));
    +			$voucherId = $db->setQuery($query)->loadResult();
    +
    +			if (!empty($voucherId))
    +			{
    +				$countVoucher = count($cart['voucher']);
    +				if ($countVoucher > 1)
    +				{
    +					for ($i = 0; $i < $countVoucher; $i ++)
    +					{
    +						if ($cart['voucher'][$i]['voucher_id'] == $voucherId)
    +						{
    +							unset($cart['voucher'][$i]);
    +						}
    +					}
    +				}
    +				else
    +				{
    +					for ($i = 0; $i < $countVoucher; $i ++)
    +					{
    +						if ($cart['voucher'][$i]['voucher_id'] == $voucherId)
    +						{
    +							unset($cart['voucher']);
    +						}
    +					}
    +				}
    +			}
    +
    +			RedshopHelperStockroom::deleteCartAfterEmpty($cart[$cartElement]['product_id'], 'product', $cart[$cartElement]['quantity']);
    +			unset($cart[$cartElement]);
    +			$cart = array_merge(array(), $cart);
    +
    +			$Index = $cart['idx'] - 1;
    +
    +			if ($Index > 0)
    +			{
    +				$cart['idx'] = $Index;
    +			}
    +			else
    +			{
    +				$cart        = array();
    +				$cart['idx'] = 0;
    +			}
    +		}
    +
    +		RedshopHelperCartSession::setCart($cart);
    +	}
    +
    +	public function coupon()
    +	{
    +		return RedshopHelperCartDiscount::applyCoupon();
    +	}
    +
    +	public function voucher()
    +	{
    +		return RedshopHelperCartDiscount::applyVoucher();
    +	}
    +
    +	public function redmasscart($post)
    +	{
    +		$data            = array();
    +		$products_number = explode("\n", $post["numbercart"]);
    +		$db              = JFactory::getDbo();
    +
    +		foreach ($products_number as $productNumber)
    +		{
    +			$productNumber = trim($productNumber);
    +
    +			if ($productNumber === '')
    +			{
    +				continue;
    +			}
    +
    +			$query   = $db->getQuery(true)
    +				->select('product_id, published, not_for_sale, expired, product_name')
    +				->from($db->qn('#__redshop_product'))
    +				->where('product_number = ' . $db->quote($productNumber));
    +			$product = $db->setQuery($query)->loadObject();
    +
    +			if (!$product)
    +			{
    +				continue;
    +			}
    +
    +			$product_id = $product->product_id;
    +
    +			if ($product->published == 0)
    +			{
    +				$msg = sprintf(JText::_('COM_REDSHOP_PRODUCT_IS_NOT_PUBLISHED'), $product->product_name, $product_id);
    +				/** @scrutinizer ignore-deprecated */ JError::raiseWarning(20, $msg);
    +				continue;
    +			}
    +
    +			if ($product->not_for_sale > 0)
    +			{
    +				$msg = sprintf(JText::_('COM_REDSHOP_PRODUCT_IS_NOT_FOR_SALE'), $product->product_name, $product_id);
    +				/** @scrutinizer ignore-deprecated */ JError::raiseWarning(20, $msg);
    +				continue;
    +			}
    +
    +			if ($product->expired == 1)
    +			{
    +				$msg = sprintf(JText::_('COM_REDSHOP_PRODUCT_IS_EXPIRED'), $product->product_name, $product_id);
    +				/** @scrutinizer ignore-deprecated */ JError::raiseWarning(20, $msg);
    +				continue;
    +			}
    +
    +			$data["product_id"] = $product_id;
    +
    +			if (isset($post["mod_quantity"]) && $post["mod_quantity"] !== "")
    +			{
    +				$data["quantity"] = $post["mod_quantity"];
    +			}
    +			else
    +			{
    +				$data["quantity"] = 1;
    +			}
    +
    +			Redshop\Cart\Cart::addProduct($data);
    +			RedshopHelperCart::cartFinalCalculation();
    +		}
    +	}
    +
    +	/**
    +	 * check if attribute tag is present in product template.
    +	 *
    +	 * @param   int $product_id Product ID
    +	 *
    +	 * @return  boolean
    +	 *
    +	 * @since   2.0.6
    +	 */
    +	public function checkifTagAvailable($product_id)
    +	{
    +		$db    = JFactory::getDbo();
    +		$query = $db->getQuery(true);
    +		$query->select($db->quoteName('product_template'))
    +			->from($db->quoteName('#__redshop_product'))
    +			->where($db->quoteName('product_id') . ' = ' . (int) $product_id);
    +
    +		$productTemplate = $db->setQuery($query)->loadResult();
    +
    +		$template              = RedshopHelperTemplate::getTemplate("product", $productTemplate);
    +		$product_template_desc = $template[0]->template_desc;
    +
    +		return strpos($product_template_desc, "{attribute_template:") !== false;
    +	}
    +
    +	/**
    +	 * shipping rate calculator
    +	 *
    +	 * @return   string
    +	 *
    +	 * @since    2.0.6
    +	 */
    +	public function shippingrate_calc()
    +	{
    +		JHtml::_('redshopjquery.framework');
    +		/** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.common.min.js', false, true);
    +
    +		$countryarray         = RedshopHelperWorld::getCountryList();
    +		$post['country_code'] = $countryarray['country_code'];
    +		$country              = $countryarray['country_dropdown'];
    +
    +		$statearray = RedshopHelperWorld::getStateList($post);
    +		$state      = $statearray['state_dropdown'];
    +
    +		$shipping_calc = "
    "; + $shipping_calc .= "
    "; + $shipping_calc .= $country; + $shipping_calc .= "
    "; + $shipping_calc .= "
    " . $state . "
    "; + $shipping_calc .= "
    "; + $shipping_calc .= "
    "; + $shipping_calc .= ""; + $shipping_calc .= "
    "; + $shipping_calc .= ""; + $shipping_calc .= "
    "; + + return $shipping_calc; + } + + public function updateAccessoryPriceArray($data = array(), $newquantity = 1) + { + $attArr = $data['cart_accessory']; + + for ($i = 0, $in = count($attArr); $i < $in; $i++) + { + $attchildArr = $attArr[$i]['accessory_childs']; + + $attArr[$i]['accessory_quantity'] = $newquantity; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $propArr = $attchildArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $pricelist = $this->_producthelper->getPropertyPrice($propArr[$k]['property_id'], $newquantity, 'property'); + + if (count($pricelist) > 0) + { + $propArr[$k]['property_price'] = $pricelist->product_price; + } + else + { + $pricelist = $this->_producthelper->getProperty($propArr[$k]['property_id'], 'property'); + $propArr[$k]['property_price'] = $pricelist->product_price; + } + + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $pricelist = $this->_producthelper->getPropertyPrice($subpropArr[$l]['subproperty_id'], $newquantity, 'subproperty'); + + if (count($pricelist) > 0) + { + $subpropArr[$l]['subproperty_price'] = $pricelist->product_price; + } + else + { + $pricelist = $this->_producthelper->getProperty($subpropArr[$l]['subproperty_id'], 'subproperty'); + $subpropArr[$k]['subproperty_price'] = $pricelist->product_price; + } + } + + $propArr[$k]['property_childs'] = $subpropArr; + } + + $attchildArr[$j]['attribute_childs'] = $propArr; + } + + $attArr[$i]['accessory_childs'] = $attchildArr; + } + + return $attArr; + } + + public function updateAttributePriceArray($data = array(), $newquantity = 1) + { + $attArr = $data['cart_attribute']; + + for ($i = 0, $in = count($attArr); $i < $in; $i++) + { + $propArr = $attArr[$i]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $pricelist = $this->_producthelper->getPropertyPrice($propArr[$k]['property_id'], $newquantity, 'property'); + + if (count($pricelist) > 0) + { + $propArr[$k]['property_price'] = $pricelist->product_price; + } + else + { + $pricelist = $this->_producthelper->getProperty($propArr[$k]['property_id'], 'property'); + $propArr[$k]['property_price'] = $pricelist->product_price; + } + + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $pricelist = $this->_producthelper->getPropertyPrice($subpropArr[$l]['subproperty_id'], $newquantity, 'subproperty'); + + if (count($pricelist) > 0) + { + $subpropArr[$l]['subproperty_price'] = $pricelist->product_price; + } + else + { + $pricelist = $this->_producthelper->getProperty($subpropArr[$l]['subproperty_id'], 'subproperty'); + $subpropArr[$k]['subproperty_price'] = $pricelist->product_price; + } + } + + $propArr[$k]['property_childs'] = $subpropArr; + } + + $attArr[$i]['attribute_childs'] = $propArr; + } + + return $attArr; + } + + public function getCartProductPrice($product_id, $cart, $voucher_left) + { + $productArr = array(); + $affected_product_idArr = array(); + $idx = $cart['idx']; + $product_price = 0; + $product_price_excl_vat = 0; + $p_quantity = 0; + + $product_idArr = explode(',', $product_id); + + for ($v = 0; ($v < $idx) && ($voucher_left > 0); $v++) + { + if ($voucher_left < $cart[$v]['quantity'] && $voucher_left) + { + $cart[$v]['quantity'] = $voucher_left; + } + + if (in_array($cart[$v]['product_id'], $product_idArr) || $this->_globalvoucher) + { + $product_price += $cart[$v]['product_price'] * $cart[$v]['quantity']; + $p_quantity += $cart[$v]['quantity']; + $product_price_excl_vat += $cart[$v]['product_price_excl_vat'] * $cart[$v]['quantity']; + $affected_product_idArr[] = $cart[$v]['product_id']; + $voucher_left = $voucher_left - $cart[$v]['quantity']; + } + } + + $productArr['product_ids'] = implode(',', $affected_product_idArr); + $productArr['product_price'] = $product_price; + $productArr['product_price_excl_vat'] = $product_price_excl_vat; + $productArr['product_quantity'] = $p_quantity; + + return $productArr; + } + + /** + * @param array $data Data + * + * @return array + * + * @since 2.0.6 + */ + public function changeAttribute($data) + { + $imagename = ''; + $type = ''; + $cart = RedshopHelperCartSession::getCart(); + + $generateAttributeCart = array(); + $product_id = $data['product_id']; + $idx = $data['cart_index']; + + if (isset($data['attribute_id_prd_' . $product_id . '_0'])) + { + $attribute_data = $data['attribute_id_prd_' . $product_id . '_0']; + + for ($ia = 0, $countAttribute = count($attribute_data); $ia < $countAttribute; $ia++) + { + $accPropertyCart = array(); + $attribute = RedshopHelperProduct_Attribute::getProductAttribute(0, 0, $attribute_data[$ia]); + $generateAttributeCart[$ia]['attribute_id'] = $attribute_data[$ia]; + $generateAttributeCart[$ia]['attribute_name'] = $attribute[0]->text; + + if ($attribute[0]->text != "" && isset($data['property_id_prd_' . $product_id . '_0_' . $attribute_data[$ia]])) + { + $acc_property_data = $data['property_id_prd_' . $product_id . '_0_' . $attribute_data[$ia]]; + + for ($ip = 0, $countProperty = count($acc_property_data); $ip < $countProperty; $ip++) + { + if ($acc_property_data[$ip] != 0) + { + $accSubpropertyCart = array(); + $property_price = 0; + $property = RedshopHelperProduct_Attribute::getAttributeProperties($acc_property_data[$ip]); + $pricelist = RedshopHelperProduct_Attribute::getPropertyPrice($acc_property_data[$ip], $cart[$idx]['quantity'], 'property'); + + if (count($pricelist) > 0) + { + $property_price = $pricelist->product_price; + } + else + { + $property_price = $property[0]->property_price; + } + + if (count($property) > 0 && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product_attributes/" . $property[0]->property_image)) + { + $type = 'product_attributes'; + $imagename = $property[0]->property_image; + } + + $accPropertyCart[$ip]['property_id'] = $acc_property_data[$ip]; + $accPropertyCart[$ip]['property_name'] = $property[0]->text; + $accPropertyCart[$ip]['property_oprand'] = $property[0]->oprand; + $accPropertyCart[$ip]['property_price'] = $property_price; + + if (isset($data['subproperty_id_prd_' . $product_id . '_0_' . $attribute_data[$ia] . '_' . $acc_property_data[$ip]])) + { + $acc_subproperty_data = $data['subproperty_id_prd_' . $product_id . '_0_' . $attribute_data[$ia] . '_' . $acc_property_data[$ip]]; + $countSubProperty = count($acc_subproperty_data); + + for ($isp = 0; $isp < $countSubProperty; $isp++) + { + if ($acc_subproperty_data[$isp] != 0) + { + $subproperty_price = 0; + $subproperty = RedshopHelperProduct_Attribute::getAttributeSubProperties($acc_subproperty_data[$isp]); + $pricelist = RedshopHelperProduct_Attribute::getPropertyPrice($acc_subproperty_data[$isp], $cart[$idx]['quantity'], 'subproperty'); + + if (count($pricelist) > 0) + { + $subproperty_price = $pricelist->product_price; + } + else + { + $subproperty_price = $subproperty[0]->subattribute_color_price; + } + + if (count($subproperty) > 0 && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "subcolor/" . $subproperty[0]->subattribute_color_image)) + { + $type = 'subcolor'; + $imagename = $subproperty[0]->subattribute_color_image; + } + + $accSubpropertyCart[$isp]['subproperty_id'] = $acc_subproperty_data[$isp]; + $accSubpropertyCart[$isp]['subproperty_name'] = $subproperty[0]->text; + $accSubpropertyCart[$isp]['subproperty_oprand'] = $subproperty[0]->oprand; + $accSubpropertyCart[$isp]['subattribute_color_title'] = $subproperty[0]->subattribute_color_title; + $accSubpropertyCart[$isp]['subproperty_price'] = $subproperty_price; + } + } + } + + $accPropertyCart[$ip]['property_childs'] = $accSubpropertyCart; + } + } + } + + $generateAttributeCart[$ia]['attribute_childs'] = $accPropertyCart; + } + } + + $cart[$idx]['cart_attribute'] = $generateAttributeCart; + + if (!empty($imagename) && !empty($type)) + { + $cart[$idx]['hidden_attribute_cartimage'] = REDSHOP_FRONT_IMAGES_ABSPATH . $type . "/" . $imagename; + } + + // @TODO Do we need setCart back ? + + return $cart; + } +} diff --git a/component/site/models/catalog.php b/component/site/models/catalog.php new file mode 100644 index 00000000000..0c13de80277 --- /dev/null +++ b/component/site/models/catalog.php @@ -0,0 +1,150 @@ +_table_prefix = '#__redshop_'; + } + + /** + * Method for store catalog + * + * @param array $data Data + * + * @return boolean + * @throws Exception + */ + public function catalogStore($data) + { + /** @var Tablecatalog_request $row */ + $row = $this->getTable('catalog_request'); + + if (!$row->bind($data)) + { + /** @scrutinizer ignore-deprecated */$this->setError(/** @scrutinizer ignore-deprecated */$this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */$this->setError(/** @scrutinizer ignore-deprecated */$this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + /** + * Method for store catalog sample + * + * @param array $data Data + * + * @return boolean + * @throws Exception + */ + public function catalogSampleStore($data) + { + /** @var Tablesample_request $row */ + $row = $this->getTable('sample_request'); + + if (!$row->bind($data)) + { + /** @scrutinizer ignore-deprecated */$this->setError(/** @scrutinizer ignore-deprecated */$this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */$this->setError(/** @scrutinizer ignore-deprecated */$this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + /** + * Method for get catalog list + * + * @return array + */ + public function getCatalogList() + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('c.*') + ->select($db->qn('c.catalog_id', 'value')) + ->select($db->qn('c.catalog_name', 'text')) + ->from($db->qn('#__redshop_catalog', 'c')) + ->where($db->qn('c.published') . ' = 1'); + + return $this->_getList($query); + } + + /** + * Method for get catalog sample list + * + * @return array + */ + public function getCatalogSampleList() + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('c.*') + ->from($db->qn('#__redshop_catalog_sample', 'c')) + ->where($db->qn('c.published') . ' = 1'); + + return $this->_getList($query); + } + + /** + * Method for get catalog sample color list + * + * @param integer $sampleId Sample Id + * + * @return array + */ + public function getCatalogSampleColorList($sampleId = 0) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('c.*') + ->from($db->qn('#__redshop_catalog_colour', 'c')); + + if ($sampleId) + { + $query->where($db->qn('c.sample_id') . ' = ' . (int) $sampleId); + } + + return $this->_getList($query); + } +} diff --git a/component/site/models/category.php b/component/site/models/category.php new file mode 100644 index 00000000000..464d5ff5c2a --- /dev/null +++ b/component/site/models/category.php @@ -0,0 +1,928 @@ +input; + $params = $app->getParams('com_redshop'); + $layout = $input->getCmd('layout', 'detail'); + $print = $input->getCmd('print', ''); + $Id = $input->getInt('cid', 0); + + if (!$print && !$Id) + { + $Id = (int) $params->get('cid'); + } + + // Different context depending on the view + if (empty($this->context)) + { + $this->context = strtolower('com_redshop.category.' . $this->getName() . '.' . $layout . '.' . $Id); + } + + parent::__construct(); + $this->producthelper = productHelper::getInstance(); + + $this->setId((int) $Id); + } + + /** + * Method to auto-populate the model state. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @note Calling getState in this method will result in recursion. + */ + protected function populateState($ordering = '', $direction = '') + { + $app = JFactory::getApplication(); + $params = $app->getParams('com_redshop'); + $selectedTemplate = Redshop::getConfig()->get('DEFAULT_CATEGORYLIST_TEMPLATE'); + $layout = $app->input->getCmd('layout', 'detail'); + + if ($this->_id) + { + $selectedTemplate = (int) $params->get('category_template', 0); + $mainCat = $this->_loadCategory(); + + if (!$selectedTemplate && isset($mainCat->template)) + { + $selectedTemplate = $mainCat->template; + } + } + + $categoryTemplate = $app->getUserStateFromRequest($this->context . '.category_template', 'category_template', $selectedTemplate, 'int'); + $this->setState('category_template', $categoryTemplate); + + $filterData = $app->getUserStateFromRequest($this->context . '.filter_data', 'filterform', '', 'array'); + $this->setState('filterform', $filterData); + + if ($_POST) + { + $manufacturerId = $app->input->post->getInt('manufacturer_id', 0); + + if ($manufacturerId != $app->getUserState($this->context . '.manufacturer_id', $app->input->get->getInt('manufacturer_id', 0))) + { + $app->redirect( + JRoute::_( + 'index.php?option=com_redshop&view=category&layout=' . $layout . '&cid=' . $this->_id . '&manufacturer_id=' . $manufacturerId + . '&Itemid=' . $app->input->getInt('Itemid', 0), + true + ) + ); + } + } + else + { + $manufacturerId = $app->input->getInt('manufacturer_id', 0); + $app->setUserState($this->context . '.manufacturer_id', $manufacturerId); + } + + $this->setState('manufacturer_id', $manufacturerId); + + // Get default ordering + $orderBySelect = $params->get('order_by', Redshop::getConfig()->get('DEFAULT_PRODUCT_ORDERING_METHOD')); + $editTimestamp = $params->get('editTimestamp', 0); + $userTimestamp = $app->getUserState($this->context . '.editTimestamp', 0); + + if ($editTimestamp > $userTimestamp) + { + $app->setUserState($this->context . '.order_by', $orderBySelect); + } + + $app->setUserState($this->context . '.editTimestamp', time()); + + $orderByMethod = $app->getUserStateFromRequest($this->context . '.order_by', 'order_by', $orderBySelect); + $orderBy = RedshopHelperUtility::prepareOrderBy($orderByMethod); + + $this->setState('list.ordering', $orderBy->ordering); + $this->setState('list.direction', $orderBy->direction); + + $this->loadCategoryTemplate($categoryTemplate); + + if (isset($this->_template[0]->template_desc) + && strstr($this->_template[0]->template_desc, "{show_all_products_in_category}")) + { + $limit = 0; + } + elseif (isset($this->_template[0]->template_desc) + && strpos($this->_template[0]->template_desc, "{show_all_products_in_category}") === false + && strpos($this->_template[0]->template_desc, "{pagination}") !== false + && strpos($this->_template[0]->template_desc, "perpagelimit:") !== false) + { + $perpage = explode('{perpagelimit:', $this->_template[0]->template_desc); + $perpage = explode('}', $perpage[1]); + $limit = intval($perpage[0]); + } + else + { + $limit = 0; + + if ($this->_id) + { + $item = $app->getMenu()->getActive(); + + if (isset($this->_template[0]->template_desc) && strstr($this->_template[0]->template_desc, "{product_display_limit}")) + { + $limit = $app->getUserStateFromRequest($this->context . '.limit', 'limit', 0, 'int'); + } + + if (!$limit && $item) + { + $limit = (int) $item->params->get('maxproduct', 0); + } + + if (!$limit) + { + $limit = $this->_maincat->products_per_page; + } + } + + if (!$limit) + { + $limit = Redshop::getConfig()->get('MAXCATEGORY'); + } + } + + $this->setState('list.limit', $limit); + $value = $app->input->get('limitstart', 0, 'int'); + $limitstart = ($limit != 0 ? (floor($value / $limit) * $limit) : 0); + $this->setState('list.start', $limitstart); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + /** + * Build a query + * + * @return JDatabaseQuery + */ + public function _buildQuery() + { + $db = $this->getDbo(); + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $item = $menu->getActive(); + $manufacturer_id = (isset($item)) ? intval($item->params->get('manufacturer_id')) : 0; + $manufacturer_id = $app->input->getInt('manufacturer_id', $manufacturer_id, '', 'int'); + $layout = $app->input->getCmd('layout'); + + $query = $db->getQuery(true); + $query->select( + array( + 'DISTINCT(' . $db->qn('c.id') . ')', + 'c.*' + ) + ) + ->from($db->qn('#__redshop_category', 'c')) + ->where($db->qn('c.published') . ' = 1'); + + if ($this->_id > 0) + { + $query->where($db->qn('c.parent_id') . ' = ' . (int) $this->_id); + } + else + { + $query->where($db->qn('c.parent_id') . ' = ' . (int) RedshopHelperCategory::getRootId()); + } + + if ($layout != 'categoryproduct') + { + $query->order($this->_buildContentOrderBy()); + } + + if ($manufacturer_id) + { + $query->leftJoin($db->qn('#__redshop_product_category_xref', 'pcx') . ' ON ' . $db->qn('pcx.category_id') . ' = ' . $db->qn('c.id')) + ->leftJoin($db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('pcx.product_id')) + ->leftJoin($db->qn('#__redshop_manufacturer', 'm') . ' ON ' . $db->qn('m.id') . ' = ' . $db->qn('p.manufacturer_id')) + ->where($db->qn('m.id') . ' = ' . (int) $manufacturer_id) + ->group($db->qn('c.id')); + } + + return $query; + } + + public function _buildContentOrderBy() + { + if (Redshop::getConfig()->get('DEFAULT_CATEGORY_ORDERING_METHOD')) + { + $orderby = Redshop::getConfig()->get('DEFAULT_CATEGORY_ORDERING_METHOD'); + } + else + { + $orderby = "c.ordering"; + } + + return $orderby; + } + + public function _loadCategory() + { + $this->_maincat = RedshopHelperCategory::getCategoryById($this->_id); + + return $this->_maincat; + } + + public function getCategorylistProduct($categoryId = 0) + { + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $item = $menu->getActive(); + $limit = (isset($item)) ? intval($item->params->get('maxproduct')) : 0; + $db = $this->getDbo(); + $orderBySelect = (isset($item)) ? $item->params->get('order_by', 'p.product_name ASC') : 'p.product_name ASC'; + $orderByMethod = $app->getUserStateFromRequest($this->context . '.order_by', 'order_by', $orderBySelect); + $orderBy = RedshopHelperUtility::prepareOrderBy($orderByMethod); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_product', 'p')) + ->leftjoin($db->qn('#__redshop_product_category_xref', 'pc') . ' ON ' . $db->qn('pc.product_id') . ' = ' . $db->qn('p.product_id')) + ->leftjoin($db->qn('#__redshop_category', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pc.category_id')) + ->leftjoin($db->qn('#__redshop_manufacturer', 'm') . ' ON ' . $db->qn('m.id') . ' = ' . $db->qn('p.manufacturer_id')) + ->where($db->qn('p.published') . ' = 1') + ->where($db->qn('p.expired') . ' = 0') + ->where($db->qn('pc.category_id') . ' = ' . $db->q((int) $categoryId)) + ->where($db->qn('p.product_parent_id') . ' = 0') + ->order($orderBy->ordering . ' ' . $orderBy->direction) + ->setLimit(0, $limit); + + $this->_product = $this->_getList($query); + + return $this->_product; + } + + /** + * Method get Product of Category + * + * @param int $minmax default variable is 0 + * @param bool $isSlider default variable is false + * + * @return mixed + * + * @since 2.1.0 + */ + public function getCategoryProduct($minmax = 0, $isSlider = false) + { + JPluginHelper::importPlugin('redshop_product'); + + $db = JFactory::getDbo(); + $user = JFactory::getUser(); + $orderBy = $this->buildProductOrderBy(); + + if ($minmax && !(strpos($orderBy, "p.product_price ASC") !== false || strpos($orderBy, "p.product_price DESC") !== false)) + { + $orderBy = "p.product_price ASC"; + } + + $query = $db->getQuery(true); + + $manufacturerId = $this->getState('manufacturer_id'); + $endlimit = $this->getState('list.limit'); + $limitstart = $this->getState('list.start'); + $sort = ""; + + // Shopper group - choose from manufactures Start + $shopperGroupManufactures = RedshopHelperShopper_Group::getShopperGroupManufacturers(); + + if ($shopperGroupManufactures != "") + { + $shopperGroupManufactures = explode(',', $shopperGroupManufactures); + $shopperGroupManufactures = \Joomla\Utilities\ArrayHelper::toInteger($shopperGroupManufactures); + $shopperGroupManufactures = implode(',', $shopperGroupManufactures); + $query->where('p.manufacturer_id IN (' . $shopperGroupManufactures . ')'); + } + + // Shopper group - choose from manufactures End + + if ($manufacturerId && $manufacturerId > 0) + { + $query->where('p.manufacturer_id = ' . (int) $manufacturerId); + } + + $query->select('DISTINCT(p.product_id)') + ->from($db->qn('#__redshop_product', 'p')) + ->leftJoin($db->qn('#__redshop_product_category_xref', 'pc') . ' ON ' . $db->qn('pc.product_id') . ' = ' . $db->qn('p.product_id')) + ->where($db->qn('p.published') . ' = 1') + ->where($db->qn('p.expired') . ' = 0') + ->where($db->qn('p.product_parent_id') . ' = 0') + ->group($db->qn('p.product_id')) + ->order($orderBy); + + $filterIncludeProductFromSubCat = $this->getState('include_sub_categories_products', false); + $categories = array($this->_id); + + if ($filterIncludeProductFromSubCat === true) + { + $tmpCategories = RedshopHelperCategory::getCategoryTree($this->_id); + + if (!empty($tmpCategories)) + { + foreach ($tmpCategories as $child) + { + $categories[] = $child->id; + } + } + } + + $query->where($db->qn('pc.category_id') . ' IN (' . implode(',', $categories) . ')'); + + $finderCondition = $this->getredproductfindertags(); + + if ($finderCondition != '') + { + $finderCondition = str_replace("AND", "", $finderCondition); + $query->where($finderCondition); + } + + // First steep get product ids + if ($minmax != 0 || $isSlider) + { + $db->setQuery($query); + } + else + { + $db->setQuery($query, $limitstart, $endlimit); + } + + RedshopHelperUtility::getDispatcher()->trigger('onQueryCategoryProduct', array(&$query)); + + $productFilters = $this->getState('filterform'); + + if (!empty($productFilters)) + { + $query->clear(); + $query = RedshopHelperCategory::buildQueryFilterProduct($this->_id, $categories, $productFilters); + $db->setQuery($query, $limitstart, $endlimit); + } + + $queryCount = clone $query; + $queryCount->clear('select')->clear('group')->clear('limit') + ->select('COUNT(DISTINCT(p.product_id))'); + + $this->_product = array(); + + $productIds = $db->loadColumn(); + + if (!empty($productIds)) + { + // Third steep get all product relate info + $query->clear() + ->where('p.product_id IN (' . implode(',', $productIds) . ')') + ->order('FIELD(p.product_id, ' . implode(',', $productIds) . ')'); + + $query = RedshopHelperProduct::getMainProductQuery($query, $user->id) + ->select( + array( + 'pc.ordering', 'c.*', 'm.*', + 'CONCAT_WS(' . $db->q('.') . ', p.product_id, ' . (int) $user->id . ') AS concat_id' + ) + ) + ->leftJoin('#__redshop_category AS c ON c.id = pc.category_id') + ->leftJoin('#__redshop_manufacturer AS m ON m.id = p.manufacturer_id') + ->where('pc.category_id IN (' . implode(',', $categories) . ')'); + + $products = $db->setQuery($query)->loadObjectList('concat_id'); + + if (!empty($products)) + { + RedshopHelperProduct::setProduct($products); + $this->_product = array_values($products); + } + } + + if (empty($this->_product)) + { + $this->_total = 0; + + return $this->_product; + } + + $priceSort = false; + $count = count($this->_product); + + if (strpos($orderBy, "p.product_price ASC") !== false) + { + $priceSort = true; + + for ($i = 0; $i < $count; $i++) + { + $productPrices = RedshopHelperProductPrice::getNetPrice($this->_product[$i]->product_id); + + $this->_product[$i]->productPrice = $productPrices['product_price']; + } + + $this->_product = $this->columnSort($this->_product, 'productPrice', 'ASC'); + } + elseif (strpos($orderBy, "p.product_price DESC") !== false) + { + $priceSort = true; + $sort = "DESC"; + + for ($i = 0; $i < $count; $i++) + { + $productPrices = RedshopHelperProductPrice::getNetPrice($this->_product[$i]->product_id); + + $this->_product[$i]->productPrice = $productPrices['product_price']; + } + + $this->_product = $this->columnSort($this->_product, 'productPrice', 'DESC'); + } + + if ($minmax > 0) + { + $min = 0; + + if (!empty($priceSort) && !empty($this->_product)) + { + if ($sort == "DESC") + { + $max = $this->_product[0]->productPrice + 100; + $min = $this->_product[count($this->_product) - 1]->productPrice; + } + else + { + $min = $this->_product[0]->productPrice; + $max = $this->_product[count($this->_product) - 1]->productPrice + 100; + } + } + else + { + $productPrices = RedshopHelperProductPrice::getNetPrice($this->_product[0]->product_id); + $min = $productPrices['product_price']; + $productPrices = RedshopHelperProductPrice::getNetPrice($this->_product[count($this->_product) - 1]->product_id); + $max = $productPrices['product_price']; + + if ($min >= $max) + { + $min = $this->_product[0]->product_price; + $max = $max + 100; + } + } + + $this->setState('minprice', floor($min)); + $this->setState('maxprice', ceil($max)); + $this->setMaxMinProductPrice(array(floor($min), ceil($max))); + } + elseif ($isSlider) + { + $newProduct = array(); + + for ($i = 0, $cp = count($this->_product); $i < $cp; $i++) + { + $productPrices = RedshopHelperProductPrice::getNetPrice($this->_product[$i]->product_id); + + $this->_product[$i]->sliderprice = $productPrices['product_price']; + + if ($this->_product[$i]->sliderprice >= $this->minmaxArr[0] && $this->_product[$i]->sliderprice <= $this->minmaxArr[1]) + { + $newProduct[] = $this->_product[$i]; + } + } + + $this->_total = count($newProduct); + $this->_product = array_slice($newProduct, $limitstart, $endlimit); + } + else + { + $db->setQuery($queryCount); + $this->_total = $db->loadResult(); + } + + return $this->_product; + } + + public function columnSort($unsorted, $column, $sort) + { + $sorted = $unsorted; + + if ($sort == "ASC") + { + for ($i = 0; $i < count($sorted) - 1; $i++) + { + for ($j = 0; $j < count($sorted) - 1 - $i; $j++) + { + if ($sorted[$j]->$column > $sorted[$j + 1]->$column) + { + $tmp = $sorted[$j]; + $sorted[$j] = $sorted[$j + 1]; + $sorted[$j + 1] = $tmp; + } + } + } + } + else + { + for ($i = 0; $i < count($sorted) - 1; $i++) + { + for ($j = 0; $j < count($sorted) - 1 - $i; $j++) + { + if ($sorted[$j]->$column < $sorted[$j + 1]->$column) + { + $tmp = $sorted[$j]; + $sorted[$j] = $sorted[$j + 1]; + $sorted[$j + 1] = $tmp; + } + } + } + } + + return $sorted; + } + + /** + * Method get string order by of product when choose category + * + * @return string + */ + public function buildProductOrderBy() + { + $orderBy = RedshopHelperUtility::prepareOrderBy(Redshop::getConfig()->get('DEFAULT_PRODUCT_ORDERING_METHOD')); + $filterOrder = $this->getState('list.ordering', $orderBy->ordering); + $filterOrderDir = $this->getState('list.direction', $orderBy->direction); + + return JFactory::getDbo()->escape($filterOrder . ' ' . $filterOrderDir); + } + + public function getData() + { + $app = JFactory::getApplication(); + $endlimit = $this->getState('list.limit'); + $limitstart = $this->getState('list.start'); + $layout = $app->input->getCmd('layout'); + $query = $this->_buildQuery(); + + if ($layout == "categoryproduct") + { + $menu = $app->getMenu(); + $item = $menu->getActive(); + $endlimit = (isset($item)) ? intval($item->params->get('maxcategory')) : 0; + $this->_data = $this->_getList($query, $limitstart, $endlimit); + + return $this->_data; + } + + if ($this->_id) + { + $this->_data = $this->_getList($query); + } + else + { + if (strpos($this->_template[0]->template_desc, "{show_all_products_in_category}") === false && strpos($this->_template[0]->template_desc, "{pagination}") !== false) + { + $this->_data = $this->_getList($query, $limitstart, $endlimit); + } + else + { + if (strpos($this->_template[0]->template_desc, "{show_all_products_in_category}") !== false) + { + $this->_data = $this->_getList($query); + } + else + { + $this->_data = $this->_getList($query, 0, Redshop::getConfig()->get('MAXCATEGORY')); + } + } + } + + return $this->_data; + } + + public function getCategoryPagination() + { + $endlimit = $this->getState('list.limit'); + $limitstart = $this->getState('list.start'); + $this->_pagination = new JPagination($this->getTotal(), $limitstart, $endlimit); + + return $this->_pagination; + } + + public function getCategoryProductPagination() + { + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $item = $menu->getActive(); + $endlimit = (isset($item)) ? intval($item->params->get('maxcategory')) : 0; + + $limitstart = $this->getState('list.start'); + $this->_pagination = new JPagination($this->getTotal(), $limitstart, $endlimit); + + return $this->_pagination; + } + + public function getTotal() + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + + return $this->_total; + } + + public function getCategoryTemplate() + { + $category_template = $this->getState('category_template'); + + if ($this->_id) + { + $selected_template = $this->_maincat->template; + + if (isset($category_template) && $category_template != '') + { + $selected_template .= "," . $category_template; + } + + if ($this->_maincat->more_template != "") + { + $selected_template .= "," . $this->_maincat->more_template; + } + + $alltemplate = RedshopHelperTemplate::getTemplate("category", $selected_template); + } + else + { + $alltemplate = RedshopHelperTemplate::getTemplate("frontpage_category"); + } + + return $alltemplate; + } + + /** + * Load Category Template + * + * @param int $category_template Category template id + * + * @return array|null + */ + public function loadCategoryTemplate($category_template = null) + { + $selected_template = Redshop::getConfig()->get('DEFAULT_CATEGORYLIST_TEMPLATE'); + $template_section = "frontpage_category"; + + if ($this->_id) + { + $template_section = "category"; + + if (!empty($category_template)) + { + $selected_template = $category_template; + } + elseif (isset($this->_maincat->category_template)) + { + $selected_template = $this->_maincat->category_template; + } + } + + $this->_template = RedshopHelperTemplate::getTemplate($template_section, $selected_template); + + return $this->_template; + } + + public function getManufacturer($mid = 0) + { + $cid = JFactory::getApplication()->input->getInt('cid', 0); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('DISTINCT (' . $db->qn('m.id') . ')') + ->select('m.*') + ->from($db->qn('#__redshop_manufacturer', 'm')) + ->leftjoin($db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('m.id') . ' = ' . 'p.manufacturer_id') + ->where($db->qn('p.manufacturer_id') . ' != 0') + ->where($db->qn('m.published') . ' = 1') + ->order($db->qn('ordering') . ' ASC'); + + if ($mid != 0) + { + $query->where($db->qn('m.id') . ' = ' . $db->qn((int) $mid)); + } + + if ($cid != 0) + { + $query->leftjoin($db->qn('#__redshop_product_category_xref', 'pcx') . ' ON ' . $db->qn('p.product_id') . ' = ' . 'pcx.product_id') + ->where($db->qn('pcx.category_id') . ' = ' . $db->q((int) $cid)); + } + + return $db->setQuery($query)->loadObjectList(); + } + + public function setMaxMinProductPrice($minmax = array(0, 0)) + { + $this->minmaxArr = $minmax; + } + + public function getMaxMinProductPrice() + { + return $this->minmaxArr; + } + + /** + * Function to get Product List Array with searched Letter + * + * @return array + */ + public function getAllproductArrayListwithfirst($letter, $fieldid) + { + $endlimit = $this->getState('list.limit'); + + $limitstart = $this->getState('list.start'); + $query = $this->_buildfletterQuery($letter, $fieldid); + + if (strpos($this->_template[0]->template_desc, "{pagination}") !== false) + { + $product_lists = $this->_getList($query, $limitstart, $endlimit); + } + else + { + $product_lists = $this->_getList($query, $limitstart, $endlimit); + } + + return $product_lists; + } + + public function _buildfletterQuery($letter, $fieldId) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('p.*') + ->select('fd.*') + ->from($db->qn('#__redshop_product', 'p')) + ->leftjoin($db->qn('#__redshop_fields_data', 'fd') . ' ON ' . $db->qn('fd.itemid') . ' = ' . $db->qn('p.product_id')) + ->where($db->qn('fd.txt') . ' LIKE ' . $db->q($letter . '%')) + ->where($db->qn('fd.fieldid') . ' = ' . $db->q((int) $fieldId)) + ->where($db->qn('fd.section') . ' = 1') + ->where($db->qn('p.published') . ' = 1') + ->order($db->qn('p.product_name')); + + return $query; + } + + public function getfletterPagination($letter, $fieldid) + { + $endlimit = $this->getState('list.limit'); + $limitstart = $this->getState('list.start'); + $this->_pagination = new JPagination($this->getfletterTotal($letter, $fieldid), $limitstart, $endlimit); + + return $this->_pagination; + } + + public function getfletterTotal($letter, $fieldid) + { + if (empty ($this->_total)) + { + $query = $this->_buildfletterQuery($letter, $fieldid); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getredproductfindertags() + { + global $context; + + $app = JFactory::getApplication(); + + $setproductfinder = RedshopHelperUtility::isRedProductFinder(); + $finder_condition = ""; + + if ($setproductfinder) + { + $query = "SELECT id FROM #__redproductfinder_filters WHERE published=1"; + $this->_db->setQuery($query); + $rs_filters = $this->_db->loadColumn(); + + if (count($rs_filters) > 0) + { + $this->_is_filter_enable = true; + } + + $tag = array(); + + for ($f = 0, $fn = count($rs_filters); $f < $fn; $f++) + { + $tmp_tag = $app->getUserStateFromRequest($context . 'tag' . $rs_filters[$f], 'tag' . $rs_filters[$f], ''); + + if (is_array($tmp_tag)) + { + $tag = $tmp_tag; + } + elseif ($tmp_tag != "" && $tmp_tag != "0") + { + $tag[] = $tmp_tag; + } + } + + $finder_condition = ""; + + if ($tag) + { + if (count($tag) > 1 || $tag[0] != 0) + { + $finder_query = "SELECT product_id FROM #__redproductfinder_associations AS a,#__redproductfinder_association_tag AS at "; + $finder_where = array(); + + if (count($tag) > 1) + { + $i = 1; + + for ($t = 1, $tn = count($tag); $t < $tn; $t++) + { + $finder_query .= " LEFT JOIN #__redproductfinder_association_tag AS at" . $t . " ON at" . $t . ".association_id=at.association_id"; + $finder_where[] = " at" . $t . ".tag_id = " . (int) $tag[$t] . " "; + $i++; + } + } + + $finder_query .= " WHERE a.id = at.association_id AND at.tag_id = " . (int) $tag[0] . " "; + $finder_where_str = ""; + + if (!empty($finder_where)) + { + $finder_where_str = " AND " . implode(" AND ", $finder_where); + } + + $finder_query .= $finder_where_str; + $this->_db->setQuery($finder_query); + $rs = $this->_db->loadColumn(); + $finder_products = ""; + + if (!empty($rs)) + { + // Sanitise ids + $rs = Joomla\Utilities\ArrayHelper::toInteger($rs); + + $finder_products = implode("','", $rs); + } + + $finder_condition = " AND p.product_id IN('" . $finder_products . "')"; + $this->_is_filter_enable = true; + } + + if (count($tag) == 1 && $tag[0] == 0) + { + $finder_condition = ""; + } + } + } + + return $finder_condition; + } +} diff --git a/component/site/models/checkout.php b/component/site/models/checkout.php new file mode 100644 index 00000000000..e2e1a5fa4a2 --- /dev/null +++ b/component/site/models/checkout.php @@ -0,0 +1,2207 @@ +_table_prefix = '#__redshop_'; + $session = JFactory::getSession(); + + $this->_carthelper = rsCarthelper::getInstance(); + $this->_userhelper = rsUserHelper::getInstance(); + $this->_shippinghelper = shipping::getInstance(); + $this->_producthelper = productHelper::getInstance(); + $this->_order_functions = order_functions::getInstance(); + $this->_redshopMail = redshopMail::getInstance(); + + $user = JFactory::getUser(); + $cart = $session->get('cart'); + + if (!empty($cart)) + { + if (!$cart) + { + $cart = array(); + $cart['idx'] = 0; + } + elseif (isset($cart['idx']) === false) + { + $cart['idx'] = 0; + } + } + + $noOFGIFTCARD = 0; + $idx = 0; + + if (isset($cart['idx'])) + { + $idx = $cart['idx']; + } + + for ($i = 0; $i < $idx; $i++) + { + if (isset($cart[$i]['giftcard_id']) === true) + { + if (!is_null($cart[$i]['giftcard_id']) && $cart[$i]['giftcard_id'] != 0) + { + $noOFGIFTCARD++; + } + } + } + + if (isset($cart['free_shipping']) === false) + { + $cart['free_shipping'] = 0; + } + + if ($noOFGIFTCARD == $idx) + { + $cart['free_shipping'] = 1; + } + elseif ($cart['free_shipping'] != 1) + { + $cart['free_shipping'] = 0; + } + + if ($user->id) + { + $cart = \Redshop\Cart\Cart::modify($cart, $user->id); + } + + RedshopHelperCartSession::setCart($cart); + RedshopHelperCart::addCartToDatabase(); + } + + /** + * @param array $data Data for storing + * + * @return boolean|Tableuser_detail + * + * @throws Exception + */ + public function store($data) + { + if (empty($data)) + { + return false; + } + + // Disable check captcha if in One Step Checkout mode. + if (!Redshop::getConfig()->get('ONESTEP_CHECKOUT_ENABLE') && !Redshop\Helper\Utility::checkCaptcha((string) $data)) + { + return false; + } + + return $this->storeRedshopUser($data, $this->storeJoomlaUser($data)); + } + + /** + * @param array $data Array of data + * + * @return boolean|JUser|stdClass + * + * @since 2.1.0 + * @throws Exception + */ + protected function storeJoomlaUser($data) + { + if (isset($data['user_id']) && $data['user_id']) + { + return RedshopHelperJoomla::updateJoomlaUser($data); + } + + return RedshopHelperJoomla::createJoomlaUser($data); + } + + /** + * @param array $data Array of data + * @param object|boolean $joomlaUser Joomla! user objecet + * + * @return boolean|Tableuser_detail + * + * @since 2.1.0 + * @throws Exception + */ + protected function storeRedshopUser($data, $joomlaUser) + { + if (!$joomlaUser) + { + return false; + } + + return RedshopHelperUser::storeRedshopUser($data, $joomlaUser->id); + } + + /** + * @return boolean|Tableorder_detail + * + * @throws Exception + */ + public function orderplace() + { + $app = JFactory::getApplication(); + $input = $app->input; + $post = $input->post->getArray(); + $Itemid = $input->post->getInt('Itemid', 0); + $shop_id = $input->post->getString('shop_id', ""); + $gls_zipcode = $input->post->getString('gls_zipcode', ""); + $gls_mobile = $input->post->getString('gls_mobile', ""); + $customer_message = $input->post->getString('rs_customer_message_ta', ""); + $referral_code = $input->post->getString('txt_referral_code', ""); + + if ($gls_mobile) + { + $shop_id .= '###' . $gls_mobile; + } + + if ($gls_zipcode) + { + $shop_id .= '###' . $gls_zipcode; + } + + $user = JFactory::getUser(); + $session = JFactory::getSession(); + $auth = $session->get('auth'); + $userId = $user->id; + + if (!$user->id && $auth['users_info_id']) + { + $userId = -$auth['users_info_id']; + } + + $isSplit = $session->get('issplit'); + + // If user subscribe for the newsletter + if (isset($post['newsletter_signup']) && $post['newsletter_signup'] == 1) + { + RedshopHelperNewsletter::subscribe(); + } + + // If user unsubscribe for the newsletter + + if (isset($post['newsletter_signoff']) && $post['newsletter_signoff'] == 1) + { + RedshopHelperNewsletter::removeSubscribe(); + } + + $orderPaymentStatus = 'Unpaid'; + $users_info_id = $input->getInt('users_info_id'); + $shippingaddresses = $this->shipaddress($users_info_id); + $billingaddresses = $this->billingaddresses(); + + if (isset($shippingaddresses)) + { + $d ["shippingaddress"] = $shippingaddresses; + $d ["shippingaddress"]->country_2_code = RedshopHelperWorld::getCountryCode2($d ["shippingaddress"]->country_code); + $d ["shippingaddress"]->state_2_code = RedshopHelperWorld::getStateCode2($d ["shippingaddress"]->state_code); + + $shippingaddresses->country_2_code = $d ["shippingaddress"]->country_2_code; + $shippingaddresses->state_2_code = $d ["shippingaddress"]->state_2_code; + } + + if (isset($billingaddresses)) + { + $d["billingaddress"] = $billingaddresses; + + if (isset($billingaddresses->country_code)) + { + $d["billingaddress"]->country_2_code = RedshopHelperWorld::getCountryCode2($billingaddresses->country_code); + $billingaddresses->country_2_code = $d["billingaddress"]->country_2_code; + } + + if (isset($billingaddresses->state_code)) + { + $d["billingaddress"]->state_2_code = RedshopHelperWorld::getStateCode2($billingaddresses->state_code); + $billingaddresses->state_2_code = $d["billingaddress"]->state_2_code; + } + } + + $cart = $session->get('cart'); + + if ($cart['idx'] < 1) + { + $msg = JText::_('COM_REDSHOP_EMPTY_CART'); + $app->redirect(JRoute::_('index.php?option=com_redshop&Itemid=' . $Itemid), $msg); + } + + $shipping_rate_id = ''; + + if ($cart['free_shipping'] != 1) + { + $shipping_rate_id = $input->post->getString('shipping_rate_id', ""); + } + + $payment_method_id = $input->post->getString('payment_method_id', ""); + + if ($shipping_rate_id && $cart['free_shipping'] != 1) + { + $shipArr = $this->calculateShipping($shipping_rate_id); + $cart['shipping'] = $shipArr['order_shipping_rate']; + $cart['shipping_vat'] = $shipArr['shipping_vat']; + } + + $cart = $this->_carthelper->modifyDiscount($cart); + + // Get Payment information + $paymentMethod = RedshopHelperOrder::getPaymentMethodInfo($payment_method_id); + $paymentMethod = $paymentMethod[0]; + + // Se payment method plugin params + $paymentMethod->params = new JRegistry($paymentMethod->params); + + // Prepare payment Information Object for calculations + $paymentInfo = new stdclass; + $paymentInfo->payment_price = $paymentMethod->params->get('payment_price', ''); + $paymentInfo->payment_oprand = $paymentMethod->params->get('payment_oprand', ''); + $paymentInfo->payment_discount_is_percent = $paymentMethod->params->get('payment_discount_is_percent', ''); + $paymentAmount = $cart ['total']; + + if (Redshop::getConfig()->get('PAYMENT_CALCULATION_ON') == 'subtotal') + { + $paymentAmount = $cart ['product_subtotal']; + } + + $paymentArray = RedshopHelperPayment::calculate($paymentAmount, $paymentInfo, $cart['total']); + $cart['total'] = $paymentArray[0]; + RedshopHelperCartSession::setCart($cart); + + $order_shipping = Redshop\Shipping\Rate::decrypt($shipping_rate_id); + $order_status = 'P'; + $order_subtotal = $cart ['product_subtotal']; + $cdiscount = $cart ['coupon_discount']; + $order_tax = $cart ['tax']; + $d['order_tax'] = $order_tax; + + $dispatcher = RedshopHelperUtility::getDispatcher(); + + // Add plugin support + JPluginHelper::importPlugin('redshop_checkout'); + $dispatcher->trigger('onBeforeOrderSave', array(&$cart, &$post, &$order_shipping)); + + $tax_after_discount = 0; + + if (isset($cart ['tax_after_discount'])) + { + $tax_after_discount = $cart ['tax_after_discount']; + } + + $odiscount = $cart['coupon_discount'] + $cart['voucher_discount'] + $cart['cart_discount']; + $odiscount_vat = $cart['discount_vat']; + + $d["order_payment_trans_id"] = ''; + $d['discount'] = $odiscount; + $order_total = $cart['total']; + + if ($isSplit) + { + $order_total = $order_total / 2; + } + + $input->set('order_ship', $order_shipping[3]); + + $paymentElementName = $paymentMethod->element; + + // Check for bank transfer payment type plugin - suffixed using `rs_payment_banktransfer` + $isBankTransferPaymentType = RedshopHelperPayment::isPaymentType($paymentMethod->element); + + if ($isBankTransferPaymentType || $paymentMethod->element == "rs_payment_eantransfer") + { + $order_status = $paymentMethod->params->get('verify_status', ''); + $orderPaymentStatus = trim("Unpaid"); + } + + $paymentMethod->element = $paymentElementName; + + $payment_amount = 0; + + if (isset($cart['payment_amount'])) + { + $payment_amount = $cart['payment_amount']; + } + + $payment_oprand = ""; + + if (isset($cart['payment_oprand'])) + { + $payment_oprand = $cart['payment_oprand']; + } + + $economic_payment_terms_id = $paymentMethod->params->get('economic_payment_terms_id'); + $economic_design_layout = $paymentMethod->params->get('economic_design_layout'); + $is_creditcard = $paymentMethod->params->get('is_creditcard', ''); + $is_redirected = $paymentMethod->params->get('is_redirected', 0); + + $input->set('payment_status', $orderPaymentStatus); + + $d['order_shipping'] = $order_shipping [3]; + Redshop\User\Billing\Billing::setGlobal($billingaddresses); + $timestamp = time(); + + $order_status_log = ''; + + // For credit card payment gateway page will redirect to order detail page from plugin + if ($is_creditcard == 1 && $is_redirected == 0 && $cart['total'] > 0) + { + $order_number = RedshopHelperOrder::generateOrderNumber(); + + JPluginHelper::importPlugin('redshop_payment'); + + $values['order_shipping'] = $d['order_shipping']; + $values['order_number'] = $order_number; + $values['order_tax'] = $d['order_tax']; + $values['shippinginfo'] = $d['shippingaddress']; + $values['billinginfo'] = $d['billingaddress']; + $values['order_total'] = $order_total; + $values['order_subtotal'] = $order_subtotal; + $values["order_id"] = $app->input->get('order_id', 0); + $values['payment_plugin'] = $paymentMethod->element; + $values['odiscount'] = $odiscount; + $paymentResponses = $dispatcher->trigger('onPrePayment_' . $values['payment_plugin'], array($values['payment_plugin'], $values)); + $paymentResponse = $paymentResponses[0]; + + if ($paymentResponse->responsestatus == "Success") + { + $d ["order_payment_trans_id"] = $paymentResponse->transaction_id; + $order_status_log = $paymentResponse->message; + + if (!isset($paymentResponse->status)) + { + $paymentResponse->status = 'C'; + } + + $order_status = $paymentResponse->status; + + if (!isset($paymentResponse->paymentStatus)) + { + $paymentResponse->paymentStatus = 'Paid'; + } + + $orderPaymentStatus = $paymentResponse->paymentStatus; + } + else + { + if ($values['payment_plugin'] != 'rs_payment_localcreditcard') + { + $errorMsg = $paymentResponse->message; + $this->setError($errorMsg); + + return false; + } + } + } + + // Get the IP Address + $ip = Environment::getUserIp(); + + /** @var Tableorder_detail $row */ + $row = $this->getTable('order_detail'); + + if (!$row->bind($post)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $shippingVatRate = 0; + + if (array_key_exists(6, $order_shipping)) + { + $shippingVatRate = $order_shipping [6]; + } + + // Start code to track duplicate order number checking + $order_number = RedshopHelperOrder::generateOrderNumber(); + + $random_gen_enc_key = \Redshop\Crypto\Helper\Encrypt::generateCustomRandomEncryptKey(35); + $users_info_id = $billingaddresses->users_info_id; + $row->user_id = $userId; + $row->order_number = $order_number; + $row->user_info_id = $users_info_id; + $row->order_total = $order_total; + $row->order_subtotal = $order_subtotal; + $row->order_tax = $order_tax; + $row->tax_after_discount = $tax_after_discount; + $row->order_tax_details = ''; + $row->analytics_status = 0; + $row->order_shipping = $order_shipping [3]; + $row->order_shipping_tax = $shippingVatRate; + $row->coupon_discount = $cdiscount; + $row->shop_id = $shop_id; + $row->customer_message = $customer_message; + $row->referral_code = $referral_code; + $db = JFactory::getDbo(); + + if ($order_total <= 0) + { + $order_status = $paymentMethod->params->get('verify_status', ''); + $orderPaymentStatus = 'Paid'; + } + + if (Redshop::getConfig()->get('USE_AS_CATALOG')) + { + $order_status = 'P'; + $orderPaymentStatus = 'Unpaid'; + } + + $dispatcher->trigger('onOrderStatusChange', array($post, &$order_status)); + + // For barcode generation + $row->order_discount = $odiscount; + $row->order_discount_vat = $odiscount_vat; + $row->payment_discount = $payment_amount; + $row->payment_oprand = $payment_oprand; + $row->order_status = $order_status; + $row->order_payment_status = $orderPaymentStatus; + $row->cdate = $timestamp; + $row->mdate = $timestamp; + $row->ship_method_id = $shipping_rate_id; + $row->customer_note = $post['customer_note']; + $row->requisition_number = $post['requisition_number']; + $row->ip_address = $ip; + $row->encr_key = $random_gen_enc_key; + $row->discount_type = $this->discount_type; + $row->order_id = $app->input->getInt('order_id', 0); + $row->barcode = null; + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + // Start code to track duplicate order number checking + $this->deleteOrdernumberTrack(); + + return false; + } + + // Start code to track duplicate order number checking + $this->deleteOrdernumberTrack(); + + // Generate Invoice Number for confirmed credit card payment or for free order + if (((boolean) Redshop::getConfig()->get('INVOICE_NUMBER_FOR_FREE_ORDER') || $is_creditcard) + && ('C' == $row->order_status && 'Paid' == $row->order_payment_status)) + { + RedshopHelperOrder::generateInvoiceNumber($row->order_id); + } + + $orderId = $row->order_id; + + $this->coupon($cart); + $this->voucher($cart, $orderId); + + $query = "UPDATE `#__redshop_orders` SET discount_type = " . $db->quote($this->discount_type) . " where order_id = " . (int) $orderId; + $db->setQuery($query); + $db->execute(); + + if (Redshop::getConfig()->get('SHOW_TERMS_AND_CONDITIONS') == 1 && isset($post['termscondition']) && $post['termscondition'] == 1) + { + RedshopHelperUser::updateUserTermsCondition($users_info_id, 1); + } + + // Place order id in quotation table if it Quotation + if (array_key_exists("quotation_id", $cart) && $cart['quotation_id']) + { + RedshopHelperQuotation::updateQuotationWithOrder($cart['quotation_id'], $row->order_id); + } + + if ($row->order_status == Redshop::getConfig()->get('CLICKATELL_ORDER_STATUS')) + { + RedshopHelperClickatell::clickatellSMS($orderId); + } + + $session->set('order_id', $orderId); + + // Add order status log + $rowOrderStatus = $this->getTable('order_status_log'); + $rowOrderStatus->order_id = $orderId; + $rowOrderStatus->order_status = $order_status; + $rowOrderStatus->date_changed = time(); + $rowOrderStatus->customer_note = $order_status_log; + $rowOrderStatus->store(); + + $input->set('order_id', $row->order_id); + $input->set('order_number', $row->order_number); + + if (!isset($order_shipping [5])) + { + $order_shipping [5] = ""; + } + + $product_delivery_time = $this->_producthelper->getProductMinDeliveryTime($cart[0]['product_id']); + $input->set('order_delivery', $product_delivery_time); + + $idx = $cart ['idx']; + + for ($i = 0; $i < $idx; $i++) + { + $is_giftcard = 0; + $product_id = $cart [$i] ['product_id']; + $product = RedshopHelperProduct::getProductById($product_id); + + /** @var Tableorder_item_detail $rowitem */ + $rowitem = $this->getTable('order_item_detail'); + + if (!$rowitem->bind($post)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + $rowitem->delivery_time = ''; + + if (isset($cart [$i] ['giftcard_id']) && $cart [$i] ['giftcard_id']) + { + $is_giftcard = 1; + } + + // Product stockroom update + if (!$is_giftcard) + { + $updatestock = RedshopHelperStockroom::updateStockroomQuantity($product_id, $cart [$i] ['quantity']); + $stockroom_id_list = $updatestock['stockroom_list']; + $stockroom_quantity_list = $updatestock['stockroom_quantity_list']; + $rowitem->stockroom_id = $stockroom_id_list; + $rowitem->stockroom_quantity = $stockroom_quantity_list; + } + + // End product stockroom update + + $vals = explode('product_attributes/', $cart[$i]['hidden_attribute_cartimage']); + + if (!empty($cart[$i]['attributeImage']) && file_exists(JPATH_ROOT . '/components/com_redshop/assets/images/mergeImages/' . $cart[$i]['attributeImage'])) + { + $rowitem->attribute_image = $orderId . $cart[$i]['attributeImage']; + $old_media = JPATH_ROOT . '/components/com_redshop/assets/images/mergeImages/' . $cart[$i]['attributeImage']; + $new_media = JPATH_ROOT . '/components/com_redshop/assets/images/orderMergeImages/' . $rowitem->attribute_image; + copy($old_media, $new_media); + } + elseif (!empty($vals[1])) + { + $rowitem->attribute_image = $vals[1]; + } + + $wrapper_price = 0; + + if (@$cart[$i]['wrapper_id']) + { + $wrapper_price = $cart[$i]['wrapper_price']; + } + + if ($is_giftcard == 1) + { + $giftcardData = RedshopEntityGiftcard::getInstance($cart[$i]['giftcard_id'])->getItem(); + $rowitem->product_id = $cart [$i] ['giftcard_id']; + $rowitem->order_item_name = $giftcardData->giftcard_name; + $rowitem->product_item_old_price = $cart [$i] ['product_price']; + } + else + { + $rowitem->product_id = $product_id; + $rowitem->product_item_old_price = $cart [$i] ['product_old_price']; + $rowitem->supplier_id = $product->manufacturer_id; + $rowitem->order_item_sku = $product->product_number; + $rowitem->order_item_name = $product->product_name; + } + + $rowitem->product_item_price = $cart [$i] ['product_price']; + $rowitem->product_quantity = $cart [$i] ['quantity']; + $rowitem->product_item_price_excl_vat = $cart [$i] ['product_price_excl_vat']; + $rowitem->product_final_price = ($cart [$i] ['product_price'] * $cart [$i] ['quantity']); + $rowitem->is_giftcard = $is_giftcard; + + $retAttArr = $this->_producthelper->makeAttributeCart($cart [$i] ['cart_attribute'], $product_id, 0, 0, $cart [$i] ['quantity']); + $cart_attribute = $retAttArr[0]; + + // For discount calc data + $cart_calc_data = ""; + + if (isset($cart[$i]['discount_calc_output'])) + { + $cart_calc_data = $cart[$i]['discount_calc_output']; + } + + $retAccArr = $this->_producthelper->makeAccessoryCart($cart[$i]['cart_accessory'], $product_id); + $cart_accessory = $retAccArr[0]; + $rowitem->order_id = $orderId; + $rowitem->user_info_id = $users_info_id; + $rowitem->order_item_currency = Redshop::getConfig()->get('REDCURRENCY_SYMBOL'); + $rowitem->order_status = $order_status; + $rowitem->cdate = $timestamp; + $rowitem->mdate = $timestamp; + $rowitem->product_attribute = $cart_attribute; + $rowitem->discount_calc_data = $cart_calc_data; + $rowitem->product_accessory = $cart_accessory; + $rowitem->wrapper_price = $wrapper_price; + + if (!empty($cart[$i]['wrapper_id'])) + { + $rowitem->wrapper_id = $cart[$i]['wrapper_id']; + } + + if (!empty($cart[$i]['reciver_email'])) + { + $rowitem->giftcard_user_email = $cart[$i]['reciver_email']; + } + + if (!empty($cart[$i]['reciver_name'])) + { + $rowitem->giftcard_user_name = $cart[$i]['reciver_name']; + } + + if (RedshopHelperProductDownload::checkDownload($rowitem->product_id)) + { + $medianame = $this->_producthelper->getProductMediaName($rowitem->product_id); + + for ($j = 0, $jn = count($medianame); $j < $jn; $j++) + { + $product_serial_number = $this->_producthelper->getProdcutSerialNumber($rowitem->product_id); + $this->_producthelper->insertProductDownload($rowitem->product_id, $user->id, $rowitem->order_id, $medianame[$j]->media_name, $product_serial_number->serial_number); + } + } + + // Import files for plugin + JPluginHelper::importPlugin('redshop_product'); + + if (!$rowitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + // Add plugin support + $dispatcher->trigger('afterOrderItemSave', array($cart, $rowitem, $i)); + + // End + + if (isset($cart [$i] ['giftcard_id']) && $cart [$i] ['giftcard_id']) + { + $section_id = 13; + } + else + { + $section_id = 12; + } + + $this->_producthelper->insertProdcutUserfield($i, $cart, $rowitem->order_item_id, $section_id); + + // My accessory save in table start + if (count($cart [$i] ['cart_accessory']) > 0) + { + $setPropEqual = true; + $setSubpropEqual = true; + $attArr = $cart [$i] ['cart_accessory']; + + for ($a = 0, $an = count($attArr); $a < $an; $a++) + { + $accessory_vat_price = 0; + $accessory_attribute = ""; + + $accessory_id = $attArr[$a]['accessory_id']; + $accessory_name = $attArr[$a]['accessory_name']; + $accessory_price = $attArr[$a]['accessory_price']; + $accessory_quantity = $attArr[$a]['accessory_quantity']; + $accessory_org_price = $accessory_price; + + if ($accessory_price > 0) + { + $accessory_vat_price = $this->_producthelper->getProductTax($rowitem->product_id, $accessory_price); + } + + $attchildArr = $attArr[$a]['accessory_childs']; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $prooprand = array(); + $proprice = array(); + + $propArr = $attchildArr[$j]['attribute_childs']; + $totalProperty = count($propArr); + + if ($totalProperty) + { + + $attribute_id = $attchildArr[$j]['attribute_id']; + $accessory_attribute .= urldecode($attchildArr[$j]['attribute_name']) . ":
    "; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $accessory_id; + $rowattitem->section_name = $attchildArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 1; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + + for ($k = 0; $k < $totalProperty; $k++) + { + $prooprand[$k] = $propArr[$k]['property_oprand']; + $proprice[$k] = $propArr[$k]['property_price']; + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = $this->_producthelper->getProducttax($rowitem->product_id, $propArr[$k]['property_price']); + } + + $property_id = $propArr[$k]['property_id']; + $accessory_attribute .= urldecode($propArr[$k]['property_name']) . " (" . $propArr[$k]['property_oprand'] . RedshopHelperProductPrice::formattedPrice($propArr[$k]['property_price'] + $section_vat) . ")
    "; + $subpropArr = $propArr[$k]['property_childs']; + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + for ($l = 0, $nl = count($subpropArr); $l < $nl; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = RedshopHelperProduct::getProductTax($rowitem->product_id, $subpropArr[$l]['subproperty_price']); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + $accessory_attribute .= urldecode($subpropArr[$l]['subproperty_name']) . " (" . $subpropArr[$l]['subproperty_oprand'] . RedshopHelperProductPrice::formattedPrice($subpropArr[$l]['subproperty_price'] + $section_vat) . ")
    "; + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + + // FOR ACCESSORY PROPERTY AND SUBPROPERTY PRICE CALCULATION + if ($setPropEqual && $setSubpropEqual) + { + $accessory_priceArr = $this->_producthelper->makeTotalPriceByOprand($accessory_price, $prooprand, $proprice); + $setPropEqual = $accessory_priceArr[0]; + $accessory_price = $accessory_priceArr[1]; + } + + for ($t = 0, $countProperty = count($propArr), $tn = $countProperty; $t < $tn; $t++) + { + $subprooprand = array(); + $subproprice = array(); + $subElementArr = $propArr[$t]['property_childs']; + + for ($tp = 0, $countElement = count($subElementArr); $tp < $countElement; $tp++) + { + $subprooprand[$tp] = $subElementArr[$tp]['subproperty_oprand']; + $subproprice[$tp] = $subElementArr[$tp]['subproperty_price']; + } + + if ($setPropEqual && $setSubpropEqual) + { + $accessory_priceArr = $this->_producthelper->makeTotalPriceByOprand($accessory_price, $subprooprand, $subproprice); + $setSubpropEqual = $accessory_priceArr[0]; + $accessory_price = $accessory_priceArr[1]; + } + } + } + + $accdata = $this->getTable('accessory_detail'); + + if ($accessory_id > 0) + { + $accdata->load($accessory_id); + } + + $accProductinfo = $this->_producthelper->getProductById($accdata->child_product_id); + $rowaccitem = $this->getTable('order_acc_item'); + $rowaccitem->order_item_acc_id = 0; + $rowaccitem->order_item_id = $rowitem->order_item_id; + $rowaccitem->product_id = $accessory_id; + $rowaccitem->order_acc_item_sku = $accProductinfo->product_number; + $rowaccitem->order_acc_item_name = $accessory_name; + $rowaccitem->order_acc_price = $accessory_org_price; + $rowaccitem->order_acc_vat = $accessory_vat_price; + $rowaccitem->product_quantity = $accessory_quantity; + $rowaccitem->product_acc_item_price = $accessory_price; + $rowaccitem->product_acc_final_price = ($accessory_price * $accessory_quantity); + $rowaccitem->product_attribute = $accessory_attribute; + + if ($accessory_id > 0) + { + if (!$rowaccitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + + // Storing attribute in database + if (count($cart [$i] ['cart_attribute']) > 0) + { + $attchildArr = $cart [$i] ['cart_attribute']; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $propArr = $attchildArr[$j]['attribute_childs']; + $totalProperty = count($propArr); + + if ($totalProperty > 0) + { + $attribute_id = $attchildArr[$j]['attribute_id']; + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $rowitem->product_id; + $rowattitem->section_name = $attchildArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 0; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + for ($k = 0; $k < $totalProperty; $k++) + { + $section_vat = 0; + + if ($propArr[$k]['property_price'] > 0) + { + $section_vat = $this->_producthelper->getProducttax($rowitem->product_id, $propArr[$k]['property_price']); + } + + $property_id = $propArr[$k]['property_id']; + + // Product property STOCKROOM update start + $updatestock_att = RedshopHelperStockroom::updateStockroomQuantity($property_id, $cart [$i] ['quantity'], "property", $product_id); + $stockroom_att_id_list = $updatestock_att['stockroom_list']; + $stockroom_att_quantity_list = $updatestock_att['stockroom_quantity_list']; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 0; + $rowattitem->stockroom_id = $stockroom_att_id_list; + $rowattitem->stockroom_quantity = $stockroom_att_quantity_list; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $nl = count($subpropArr); $l < $nl; $l++) + { + $section_vat = 0; + + if ($subpropArr[$l]['subproperty_price'] > 0) + { + $section_vat = $this->_producthelper->getProducttax($rowitem->product_id, $subpropArr[$l]['subproperty_price']); + } + + $subproperty_id = $subpropArr[$l]['subproperty_id']; + + // Product subproperty STOCKROOM update start + $updatestock_subatt = RedshopHelperStockroom::updateStockroomQuantity($subproperty_id, $cart [$i] ['quantity'], "subproperty", $product_id); + $stockroom_subatt_id_list = $updatestock_subatt['stockroom_list']; + $stockroom_subatt_quantity_list = $updatestock_subatt['stockroom_quantity_list']; + + $rowattitem = $this->getTable('order_attribute_item'); + $rowattitem->order_att_item_id = 0; + $rowattitem->order_item_id = $rowitem->order_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 0; + $rowattitem->stockroom_id = $stockroom_subatt_id_list; + $rowattitem->stockroom_quantity = $stockroom_subatt_quantity_list; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + } + } + + // Store user product subscription detail + if ($product->product_type == 'subscription') + { + $subscribe = $this->getTable('product_subscribe_detail'); + $subscription_detail = $this->_producthelper->getProductSubscriptionDetail($product_id, $cart[$i]['subscription_id']); + + $add_day = $subscription_detail->period_type == 'days' ? $subscription_detail->subscription_period : 0; + $add_month = $subscription_detail->period_type == 'month' ? $subscription_detail->subscription_period : 0; + $add_year = $subscription_detail->period_type == 'year' ? $subscription_detail->subscription_period : 0; + $subscribe->order_id = $orderId; + $subscribe->order_item_id = $rowitem->order_item_id; + $subscribe->product_id = $product_id; + $subscribe->subscription_id = $cart[$i]['subscription_id']; + $subscribe->user_id = $user->id; + $subscribe->start_date = time(); + $subscribe->end_date = mktime(0, 0, 0, date('m') + $add_month, date('d') + $add_day, date('Y') + $add_year); + + if (!$subscribe->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + + /** @var Tableorder_payment $rowpayment */ + $rowpayment = $this->getTable('order_payment'); + + if (!$rowpayment->bind($post)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $rowpayment->order_id = $orderId; + $rowpayment->payment_method_id = $payment_method_id; + + $ccdata = $session->get('ccdata'); + + if (!isset($ccdata['creditcard_code'])) + { + $ccdata['creditcard_code'] = 0; + } + + if (!isset($ccdata['order_payment_number'])) + { + $ccdata['order_payment_number'] = 0; + } + + if (!isset($ccdata['order_payment_expire_month'])) + { + $ccdata['order_payment_expire_month'] = 0; + } + + if (!isset($ccdata['order_payment_expire_year'])) + { + $ccdata['order_payment_expire_year'] = 0; + } + + $rowpayment->order_payment_code = $ccdata['creditcard_code']; + $rowpayment->order_payment_cardname = base64_encode($ccdata['order_payment_name']); + $rowpayment->order_payment_number = base64_encode($ccdata['order_payment_number']); + + // This is ccv code + $rowpayment->order_payment_ccv = base64_encode($ccdata['credit_card_code']); + $rowpayment->order_payment_amount = $order_total; + $rowpayment->order_payment_expire = $ccdata['order_payment_expire_month'] . $ccdata['order_payment_expire_year']; + $rowpayment->order_payment_name = $paymentMethod->name; + $rowpayment->payment_method_class = $paymentMethod->element; + $rowpayment->order_payment_trans_id = $d ["order_payment_trans_id"]; + $rowpayment->authorize_status = ""; + + if (!$rowpayment->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + // For authorize status + JPluginHelper::importPlugin('redshop_payment'); + JDispatcher::getInstance()->trigger('onAuthorizeStatus_' . $paymentMethod->element, array($paymentMethod->element, $orderId)); + + // Add billing Info + $userrow = $this->getTable('user_detail'); + $userrow->load($billingaddresses->users_info_id); + $userrow->thirdparty_email = $post['thirdparty_email']; + $orderuserrow = $this->getTable('order_user_detail'); + + if (!$orderuserrow->bind($userrow)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $orderuserrow->order_id = $orderId; + $orderuserrow->address_type = 'BT'; + + JPluginHelper::importPlugin('redshop_shipping'); + $dispatcher->trigger('onBeforeUserBillingStore', array(&$orderuserrow)); + + if (!$orderuserrow->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + // Add shipping Info + $userrow = $this->getTable('user_detail'); + + if (isset($shippingaddresses->users_info_id)) + { + $userrow->load($shippingaddresses->users_info_id); + } + elseif (!empty($GLOBALS['shippingaddresses'])) + { + $userrow = $GLOBALS['shippingaddresses']; + } + else + { + $userrow->load($billingaddresses->users_info_id); + } + + $orderuserrow = $this->getTable('order_user_detail'); + + if (!$orderuserrow->bind($userrow)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $orderuserrow->order_id = $orderId; + $orderuserrow->address_type = 'ST'; + + $dispatcher->trigger('onBeforeUserShippingStore', array(&$orderuserrow)); + + if (!$orderuserrow->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (isset($cart['extrafields_values'])) + { + if (count($cart['extrafields_values']) > 0) + { + $this->_producthelper->insertPaymentShippingField($cart, $orderId, 18); + $this->_producthelper->insertPaymentShippingField($cart, $orderId, 19); + } + } + + RedshopHelperStockroom::deleteCartAfterEmpty(); + + // Economic Integration start for invoice generate and book current invoice + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1 && Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT') != 2) + { + $economicdata['economic_payment_terms_id'] = $economic_payment_terms_id; + $economicdata['economic_design_layout'] = $economic_design_layout; + $economicdata['economic_is_creditcard'] = $is_creditcard; + $payment_name = $paymentMethod->element; + $paymentArr = explode("rs_payment_", $paymentMethod->element); + + if (count($paymentArr) > 0) + { + $payment_name = $paymentArr[1]; + } + + $economicdata['economic_payment_method'] = $payment_name; + RedshopEconomic::createInvoiceInEconomic($row->order_id, $economicdata); + + if (Redshop::getConfig()->getInt('ECONOMIC_INVOICE_DRAFT') == 0) + { + $checkOrderStatus = ($isBankTransferPaymentType) ? 0 : 1; + + $bookinvoicepdf = RedshopEconomic::bookInvoiceInEconomic($row->order_id, $checkOrderStatus); + + if (JFile::exists($bookinvoicepdf)) + { + Redshop\Mail\Invoice::sendEconomicBookInvoiceMail($row->order_id, $bookinvoicepdf); + } + } + } + + // Send the Order mail before payment + if (!Redshop::getConfig()->get('ORDER_MAIL_AFTER') || (Redshop::getConfig()->get('ORDER_MAIL_AFTER') && $row->order_payment_status == "Paid")) + { + Redshop\Mail\Order::sendMail($row->order_id); + } + elseif (Redshop::getConfig()->get('ORDER_MAIL_AFTER') == 1) + { + // If Order mail set to send after payment then send mail to administrator only. + Redshop\Mail\Order::sendMail($row->order_id, true); + } + + if ($row->order_status == "C" && $row->order_payment_status == "Paid") + { + RedshopHelperOrder::sendDownload($row->order_id); + } + + return $row; + } + + /** + * Method for send giftcard email to customer. + * + * @param int $orderId ID of order. + * + * @return void + * + * @throws Exception + */ + public function sendGiftCard($orderId) + { + \Redshop\Mail\Giftcard::sendMail($orderId); + } + + /** + * Method for return billing address. + * + * @return object + */ + public function billingaddresses() + { + $user = JFactory::getUser(); + $session = JFactory::getSession(); + $auth = $session->get('auth'); + $billingAddress = new stdClass; + + if ($user->id) + { + $billingAddress = RedshopHelperOrder::getBillingAddress($user->id); + } + elseif ($auth['users_info_id']) + { + $billingAddress = RedshopHelperOrder::getBillingAddress(-$auth['users_info_id']); + } + + if ($billingAddress === false || $billingAddress === null) + { + return new stdClass; + } + + return $billingAddress; + } + + public function shipaddress($userInfoId) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from('#__redshop_users_info') + ->where($db->quoteName('users_info_id') . ' = ' . (int) $userInfoId); + + return $db->setQuery($query)->loadObject(); + } + + public function shippingaddresses() + { + $user = JFactory::getUser(); + $session = JFactory::getSession(); + $auth = $session->get('auth'); + + if ($user->id) + { + return RedshopHelperOrder::getShippingAddress($user->id); + } + + $uid = -$auth['users_info_id']; + + return RedshopHelperOrder::getShippingAddress($uid); + } + + public function getpaymentmethod() + { + $user = JFactory::getUser(); + $shopper_group = RedshopHelperOrder::getBillingAddress($user->id); + $query = "SELECT * FROM " . $this->_table_prefix . "payment_method WHERE published = '1' AND (FIND_IN_SET('" . (int) $shopper_group->shopper_group_id . "', shopper_group) OR shopper_group = '') ORDER BY ordering ASC"; + $this->_db->setQuery($query); + + return $this->_db->loadObjectlist(); + } + + public function validatepaymentccinfo() + { + $session = JFactory::getSession(); + $ccdata = $session->get('ccdata'); + + $validpayment [0] = 1; + $validpayment [1] = ''; + + if ($ccdata['selectedCardId'] != '') + { + return $validpayment; + } + + // The Data should be in the session. + if (!isset($ccdata)) + { + $validpayment [0] = 0; + $validpayment [1] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_CCDATA'); + + return $validpayment; + } + + if (isset($ccdata['order_payment_name'])) + { + if (preg_match("/[0-9]+/", $ccdata['order_payment_name']) == true) + { + $validpayment [0] = 0; + $validpayment [1] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_CCNM_FOUND'); + + return $validpayment; + } + } + + if (!$ccdata['order_payment_number']) + { + $validpayment [0] = 0; + $validpayment [1] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_CCNR_FOUND'); + + return $validpayment; + } + + if ($ccdata['order_payment_number']) + { + if (!is_numeric($ccdata['order_payment_number'])) + { + $validpayment [0] = 0; + $validpayment [1] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_CCNR_NUM_FOUND'); + + return $validpayment; + } + } + + if (!$ccdata['order_payment_expire_month']) + { + $validpayment [0] = 0; + $validpayment [1] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_MON_FOUND'); + + return $validpayment; + } + + $ccerror = ''; + $ccerrortext = ''; + + if (!$this->checkCreditCard($ccdata['order_payment_number'], $ccdata['creditcard_code'], $ccerror, $ccerrortext)) + { + $validpayment [0] = 0; + $validpayment [1] = $ccerrortext; + + return $validpayment; + } + + return $validpayment; + } + + public function checkCreditCard($cardnumber, $cardname, &$errornumber, &$errortext) + { + /** + * Define the cards we support. You may add additional card types. + * + * Name: As in the selection box of the form - must be same as user's + * Length: List of possible valid lengths of the card number for the card + * Prefixes: List of possible prefixes for the card + * + * Checkdigit Boolean to say whether there is a check digit + * Don't forget - all but the last array definition needs a comma separator! + */ + + $cards = array( + + // American Express + array( + 'name' => 'amex', + 'length' => '15', + 'prefixes' => '34,37', + 'checkdigit' => true + ), + array( + 'name' => 'Diners Club Carte Blanche', + 'length' => '14', + 'prefixes' => '300,301,302,303,304,305', + 'checkdigit' => true + ), + + // Diners Club + array( + 'name' => 'diners', + 'length' => '14,16', + 'prefixes' => '36,54,55', + 'checkdigit' => true + ), + array( + 'name' => 'Discover', + 'length' => '16', + 'prefixes' => '6011,622,64,65', + 'checkdigit' => true + ), + array( + 'name' => 'Diners Club Enroute', + 'length' => '15', + 'prefixes' => '2014,2149', + 'checkdigit' => true + ), + array( + 'name' => 'JCB', + 'length' => '16', + 'prefixes' => '35', + 'checkdigit' => true + ), + array( + 'name' => 'Maestro', + 'length' => '12,13,14,15,16,18,19', + 'prefixes' => '5018,5020,5038,6304,6759,6761', + 'checkdigit' => true + ), + + // MasterCard + array( + 'name' => 'MC', + 'length' => '16', + 'prefixes' => '51,52,53,54,55', + 'checkdigit' => true + ), + array( + 'name' => 'Solo', + 'length' => '16,18,19', + 'prefixes' => '6334,6767', + 'checkdigit' => true + ), + array( + 'name' => 'Switch', + 'length' => '16,18,19', + 'prefixes' => '4903,4905,4911,4936,564182,633110,6333,6759', + 'checkdigit' => true + ), + array( + 'name' => 'Visa', + 'length' => '13,16', + 'prefixes' => '4', + 'checkdigit' => true + ), + array( + 'name' => 'Visa Electron', + 'length' => '16', + 'prefixes' => '417500,4917,4913,4508,4844', + 'checkdigit' => true + ), + array( + 'name' => 'LaserCard', + 'length' => '16,17,18,19', + 'prefixes' => '6304,6706,6771,6709', + 'checkdigit' => true + ) + ); + + $ccErrors [0] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_UNKNOWN_CCTYPE'); + $ccErrors [1] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_CARD_PROVIDED'); + $ccErrors [2] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_CARD_INVALIDFORMAT'); + $ccErrors [3] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_CARD_INVALIDNUMBER'); + $ccErrors [4] = JText::_('COM_REDSHOP_CHECKOUT_ERR_NO_CARD_WRONGLENGTH'); + + // Establish card type + $cardType = -1; + + for ($i = 0, $in = count($cards); $i < $in; $i++) + { + // See if it is this card (ignoring the case of the string) + if (strtolower($cardname) == strtolower($cards [$i] ['name'])) + { + $cardType = $i; + break; + } + } + + // If card type not found, report an error + if ($cardType == -1) + { + $errornumber = 0; + $errortext = $ccErrors [$errornumber]; + + return false; + } + + // Ensure that the user has provided a credit card number + if (strlen($cardnumber) == 0) + { + $errornumber = 1; + $errortext = $ccErrors [$errornumber]; + + return false; + } + + // Remove any spaces from the credit card number + $cardNo = str_replace(' ', '', $cardnumber); + + // Check that the number is numeric and of the right sort of length. + if (!preg_match("/^[0-9]{13,19}$/i", $cardNo)) + { + $errornumber = 2; + $errortext = $ccErrors [$errornumber]; + + return false; + } + + // Now check the modulus 10 check digit - if required + if ($cards [$cardType] ['checkdigit']) + { + // Running checksum total + $checksum = 0; + + // Next char to process + $mychar = ""; + + // Takes value of 1 or 2 + $j = 1; + + // Process each digit one by one starting at the right + for ($i = strlen($cardNo) - 1; $i >= 0; $i--) + { + // Extract the next digit and multiply by 1 or 2 on alternative digits. + $calc = $cardNo{$i} * $j; + + // If the result is in two digits add 1 to the checksum total + if ($calc > 9) + { + $checksum++; + $calc = $calc - 10; + } + + // Add the units element to the checksum total + $checksum = $checksum + $calc; + + // Switch the value of j + if ($j == 1) + { + $j = 2; + } + else + { + $j = 1; + } + } + + // All done - if checksum is divisible by 10, it is a valid modulus 10. + // If not, report an error. + if ($checksum % 10 != 0) + { + $errornumber = 3; + $errortext = $ccErrors [$errornumber]; + + return false; + } + } + + // The following are the card-specific checks we undertake. + + // Load an array with the valid prefixes for this card + $prefix = explode(',', $cards[$cardType]['prefixes']); + + // Now see if any of them match what we have in the card number + + $PrefixValid = false; + + for ($i = 0, $in = count($prefix); $i < $in; $i++) + { + $exp = '/^' . $prefix [$i] . '/'; + + if (preg_match($exp, $cardNo)) + { + $PrefixValid = true; + break; + } + } + + // If it isn't a valid prefix there's no point at looking at the length + if (!$PrefixValid) + { + $errornumber = 3; + $errortext = $ccErrors [$errornumber]; + + return false; + } + + // See if the length is valid for this card + $LengthValid = false; + $lengths = explode(',', $cards[$cardType]['length']); + + for ($j = 0, $jn = count($lengths); $j < $jn; $j++) + { + if (strlen($cardNo) == $lengths [$j]) + { + $LengthValid = true; + break; + } + } + + // See if all is OK by seeing if the length was valid. + if (!$LengthValid) + { + $errornumber = 4; + $errortext = $ccErrors [$errornumber]; + + return false; + } + + // The credit card is in the required format. + return true; + } + + /** + * @param string $creditcardNumber Credit card number + * @param string $type Type + * + * @since 2.1.0 + */ + public function validateCC($creditcardNumber, $type) + { + echo \Redshop\Validation\Creditcard::isValid($creditcardNumber, $type); + } + + public function resetcart() + { + $session = JFactory::getSession(); + setcookie("redSHOPcart", "", time() - 3600, "/"); + RedshopHelperCartSession::setCart(null); + $session->set('ccdata', null); + $session->set('issplit', null); + $session->set('userfield', null); + $user = JFactory::getUser(); + RedshopHelperCart::removeCartFromDatabase($cart_id = 0, $user->id, $delCart = true); + } + + /** + * Method for get coupon price + * + * @return float + */ + public function getCouponPrice() + { + $cart = RedshopHelperCartSession::getCart(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn(array('value', 'type'))) + ->from($db->qn('#__redshop_coupons')) + ->where($db->qn('id') . ' = ' . (int) $cart['coupon_id']) + ->where($db->qn('code') . ' = ' . $db->quote($cart['coupon_code'])); + + $row = $db->setQuery($query)->loadObject(); + + if (!$row) + { + return 0; + } + + return $row->type == 1 ? (float) (($cart['product_subtotal'] * $row->value) / 100) : (float) $row->value; + } + + public function getCategoryNameByProductId($pid) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('c.name')) + ->from($db->qn('#__redshop_product_category_xref', 'pcx')) + ->leftjoin($db->qn('#__redshop_category', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pcx.category_id')) + ->where($db->qn('pcx.product_id') . ' = ' . $db->q((int) $pid)) + ->where($db->qn('c.name') . ' IS NOT NULL') + ->order($db->qn('c.id') . ' ASC') + ->setLimit(0, 1); + + return $db->setQuery($query)->loadResult(); + } + + public function voucher($cart, $order_id) + { + if (!isset($cart['voucher'])) + { + return; + } + + if ($this->discount_type) + { + $this->discount_type .= '@'; + } + + $user = JFactory::getUser(); + $voucherType = array(); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + foreach ($cart['voucher'] as $voucher) + { + $voucherId = $voucher['voucher_id']; + $voucherVolume = $voucher['used_voucher']; + $transactionVoucherId = 0; + $voucherType[] = 'v:' . $voucher['voucher_code']; + + $query->clear(); + $query->update($db->quoteName('#__redshop_voucher')) + ->set($db->quoteName('voucher_left') . ' = ' . $db->quoteName('voucher_left') . ' - ' . (int) $voucherVolume) + ->where($db->quoteName('id') . ' = ' . (int) $voucherId); + + $db->setQuery($query)->execute(); + + if ($voucher['remaining_voucher_discount'] <= 0) + { + continue; + } + + $table = $this->getTable('transaction_voucher_detail'); + + if (!$table->bind($cart)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + } + + if ($voucher['transaction_voucher_id']) + { + $transactionVoucherId = $voucher['transaction_voucher_id']; + } + + $table->transaction_voucher_id = $transactionVoucherId; + $table->amount = $voucher['remaining_voucher_discount']; + $table->voucher_code = $voucher['voucher_code']; + $table->user_id = $user->id; + $table->order_id = $order_id; + $table->voucher_id = $voucherId; + $table->trancation_date = mktime(0, 0, 0, date('m'), date('d'), date('Y')); + $table->product_id = $voucher['product_id']; + $table->published = 1; + + if (!$table->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + } + + $this->discount_type .= implode('@', $voucherType); + } + + public function coupon($cart) + { + $user = JFactory::getUser(); + $db = JFactory::getDbo(); + $couponType = array(); + + if (isset($cart['coupon'])) + { + if ($this->discount_type) + { + $this->discount_type .= '@'; + } + + foreach ($cart['coupon'] as $coupon) + { + $coupon_id = $coupon['coupon_id']; + $coupon_volume = $coupon['used_coupon']; + $transaction_coupon_id = 0; + $couponType[] = 'c:' . $coupon['coupon_code']; + + $sql = "UPDATE " . $this->_table_prefix . "coupons SET amount_left = amount_left - " . (int) $coupon_volume . " " + . "WHERE id = " . (int) $coupon_id; + $db->setQuery($sql)->execute(); + + if ($coupon['remaining_coupon_discount'] <= 0) + { + continue; + } + + $rowcoupon = $this->getTable('transaction_coupon_detail'); + + if (!$rowcoupon->bind($cart)) + { + $this->setError($this->_db->getErrorMsg()); + } + + if ($coupon['transaction_coupon_id']) + { + $transaction_coupon_id = $coupon['transaction_coupon_id']; + } + + $rowcoupon->transaction_coupon_id = $transaction_coupon_id; + $rowcoupon->coupon_value = $coupon['remaining_coupon_discount']; + $rowcoupon->coupon_code = $coupon['coupon_code']; + $rowcoupon->userid = $user->id; + $rowcoupon->coupon_id = $coupon_id; + $rowcoupon->trancation_date = mktime(0, 0, 0, date('m'), date('d'), date('Y')); + $rowcoupon->published = 1; + + if (!$rowcoupon->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $this->discount_type = implode('@', $couponType); + } + + return true; + } + + /** + * @param string $shippingRateId Shipping rate + * + * @return array + * + * @since 2.1.0 + */ + public function calculateShipping($shippingRateId) + { + $shipArr = array(); + $order_shipping = Redshop\Shipping\Rate::decrypt($shippingRateId); + + if (!isset($order_shipping[3])) + { + return $shipArr; + } + + $shipArr['order_shipping_rate'] = $order_shipping[3]; + + if (array_key_exists(6, $order_shipping)) + { + $shipArr['shipping_vat'] = $order_shipping [6]; + } + + return $shipArr; + } + + public function displayShoppingCart($templateDesc = "", $users_info_id, $shipping_rate_id = 0, $payment_method_id, $Itemid, $customerNote = "", $req_number = "", $thirdparty_email = "", $customer_message = "", $referral_code = "", $shop_id = "", $post = array()) + { + $session = JFactory::getSession(); + $cart = RedshopHelperCartSession::getCart(); + $usersess = $session->get('rs_user'); + $usersess['rs_user_info_id'] = $users_info_id; + unset($cart['shipping']); + $session->set('rs_user', $usersess); + $cart = \Redshop\Cart\Cart::modify($cart, JFactory::getUser()->id); + + if ($shipping_rate_id && $cart['free_shipping'] != 1) + { + $shipArr = $this->calculateShipping($shipping_rate_id); + $cart['shipping'] = $shipArr['order_shipping_rate']; + $cart['shipping_vat'] = (!isset($shipArr['shipping_vat'])) ? 0 : $shipArr['shipping_vat']; + } + + $cart = $this->_carthelper->modifyDiscount($cart); + + // Plugin support: Process the shipping cart + JPluginHelper::importPlugin('redshop_product'); + JPluginHelper::importPlugin('redshop_checkout'); + RedshopHelperUtility::getDispatcher()->trigger( + 'onDisplayShoppingCart', array(&$cart, &$templateDesc, $users_info_id, $shipping_rate_id, $payment_method_id, $post) + ); + + $paymentMethod = RedshopHelperOrder::getPaymentMethodInfo($payment_method_id); + $paymentMethod = $paymentMethod[0]; + + $paymentMethod->params = new Registry($paymentMethod->params); + $is_creditcard = $paymentMethod->params->get('is_creditcard', ''); + $payment_oprand = $paymentMethod->params->get('payment_oprand', ''); + $payment_discount_is_percent = $paymentMethod->params->get('payment_discount_is_percent', ''); + $payment_price = $paymentMethod->params->get('payment_price', ''); + $accepted_credict_card = $paymentMethod->params->get("accepted_credict_card"); + + $paymentInfo = new stdClass; + $paymentInfo->payment_price = $payment_price; + $paymentInfo->is_creditcard = $is_creditcard; + $paymentInfo->payment_oprand = $payment_oprand; + $paymentInfo->payment_discount_is_percent = $payment_discount_is_percent; + $paymentInfo->accepted_credict_card = $accepted_credict_card; + + if (Redshop::getConfig()->get('PAYMENT_CALCULATION_ON') == 'subtotal') + { + $paymentAmount = $cart['product_subtotal']; + } + else + { + $paymentAmount = $cart['total']; + } + + $paymentArray = RedshopHelperPayment::calculate($paymentAmount, $paymentInfo, $cart['total']); + $cart['total'] = $paymentArray[0]; + $payment_amount = $paymentArray[1]; + + if (isset($cart['discount']) === false) + { + $cart['discount'] = 0; + } + + $cart['payment_oprand'] = $payment_oprand; + $cart['payment_amount'] = $payment_amount; + + $templateDesc = $this->_carthelper->replaceTemplate($cart, $templateDesc, 1); + + $thirdparty_emailvalue = ""; + + if ($thirdparty_email != "") + { + $thirdparty_emailvalue = $thirdparty_email; + } + elseif (isset($cart['thirdparty_email'])) + { + $thirdparty_emailvalue = $cart['thirdparty_email']; + } + + if (strstr($templateDesc, "{thirdparty_email}")) + { + $thirdpartyemail = ''; + $templateDesc = str_replace("{thirdparty_email}", $thirdpartyemail, $templateDesc); + $templateDesc = str_replace("{thirdparty_email_lbl}", JText::_('COM_REDSHOP_THIRDPARTY_EMAIL_LBL'), $templateDesc); + } + + $customerNoteValue = $customerNote;; + + if (empty($customerNote) && isset($cart['customer_note'])) + { + $customerNoteValue = $cart['customer_note']; + } + + $requisitionNumber = $req_number; + + if (empty($req_number) && isset($cart['requisition_number'])) + { + $requisitionNumber = $cart['requisition_number']; + } + + if (strstr($templateDesc, "{customer_note}")) + { + $customerNoteHtml = ''; + $templateDesc = str_replace("{customer_note}", $customerNoteHtml, $templateDesc); + $templateDesc = str_replace("{customer_note_lbl}", JText::_('COM_REDSHOP_CUSTOMER_NOTE_LBL'), $templateDesc); + } + + $templateDesc = str_replace("{customer_message_chk_lbl}", JText::_('COM_REDSHOP_CUSTOMER_MESSAGE_LBL'), $templateDesc); + $customer_message_chk = " "; + $customer_message = ""; + $templateDesc = str_replace("{customer_message_chk}", $customer_message_chk, $templateDesc); + $templateDesc = str_replace("{customer_message}", $customer_message, $templateDesc); + $templateDesc = str_replace("{referral_code_lbl}", JText::_('COM_REDSHOP_REFERRAL_CODE_LBL'), $templateDesc); + $referral_code = ""; + $templateDesc = str_replace("{referral_code}", $referral_code, $templateDesc); + + if (strstr($templateDesc, "{requisition_number}")) + { + $req_number_lbl = JText::_('COM_REDSHOP_REQUISITION_NUMBER'); + $req_number = ''; + + $templateDesc = str_replace("{requisition_number}", $req_number, $templateDesc); + $templateDesc = str_replace("{requisition_number_lbl}", $req_number_lbl, $templateDesc); + } + + if (strstr($templateDesc, "{shop_more}")) + { + if (Redshop::getConfig()->get('CONTINUE_REDIRECT_LINK') != '') + { + $shopMoreLink = JRoute::_(Redshop::getConfig()->get('CONTINUE_REDIRECT_LINK')); + } + elseif ($catItemId = RedshopHelperRouter::getCategoryItemid()) + { + $shopMoreLink = JRoute::_('index.php?option=com_redshop&view=category&Itemid=' . $catItemId); + } + else + { + $shopMoreLink = JRoute::_('index.php'); + } + + $shop_more = ''; + $templateDesc = str_replace("{shop_more}", $shop_more, $templateDesc); + } + + if (strstr($templateDesc, "{checkout_back_button}")) + { + $checkout_back = ''; + $templateDesc = str_replace("{checkout_back_button}", $checkout_back, $templateDesc); + } + + // CalculatePayment + $templateDesc = RedshopHelperPayment::replaceConditionTag($templateDesc, $payment_amount, 0, $payment_oprand); + + $shippinPrice = ''; + $shippinPriceWithVat = ''; + + if (!empty($shipping_rate_id) && Redshop::getConfig()->get('SHIPPING_METHOD_ENABLE')) + { + $shippinPriceWithVat = RedshopHelperProductPrice::formattedPrice($cart ['shipping']); + $shippinPrice = RedshopHelperProductPrice::formattedPrice($cart ['shipping'] - $cart['shipping_vat']); + } + else + { + $templateDesc = str_replace("{shipping_lbl}", '', $templateDesc); + $templateDesc = str_replace("{tax_with_shipping_lbl}", '', $templateDesc); + } + + $templateDesc = $this->_carthelper->replaceTermsConditions($templateDesc, $Itemid); + $templateDesc = $this->_carthelper->replaceNewsletterSubscription($templateDesc); + + $checkoutOnClick = 'if(validation()){checkout_disable(\'checkout_final\');}'; + + $checkout = '
    '; + $checkout .= ''; + $checkout .= ''; + $checkout .= ''; + $checkout .= ''; + $checkout .= ''; + $checkout .= ''; + $checkout .= ''; + + if (!Redshop::getConfig()->get('ONESTEP_CHECKOUT_ENABLE')) + { + $checkout .= ''; + $checkout .= ''; + $checkout .= ''; + } + + $checkout .= '
    '; + + $templateDesc = str_replace("{checkout}", $checkout, $templateDesc); + $templateDesc = str_replace("{checkout_button}", $checkout, $templateDesc); + + $qlink = JRoute::_('index.php?option=com_redshop&view=quotation&tmpl=component&return=1&Itemid=' . $Itemid); + $quotation_request = ''; + $templateDesc = str_replace("{quotation_request}", $quotation_request, $templateDesc); + + if (strstr($templateDesc, "{coupon_code_lbl}")) + { + $coupon = ''; + + if (isset($cart["coupon_code"])) + { + $coupon_price = $this->getCouponPrice(); + $coupon = '' . JText::_('COM_REDSHOP_CART_COUPON_CODE_TBL') . '
    ' . $cart['coupon_code'] . ' ' . $coupon_price . '
    '; + } + + $templateDesc = str_replace("{coupon_code_lbl}", $coupon, $templateDesc); + } + + $templateDesc = Redshop\Cart\Render\Label::replace($templateDesc); + $templateDesc = str_replace("{print}", '', $templateDesc); + + RedshopHelperCartSession::setCart((array) $cart); + + return $templateDesc; + } + + /** + * Delete order number track + * + * @return boolean + * + * @since 2.1.0 + */ + public function deleteOrdernumberTrack() + { + $db = JFactory::getDbo(); + $query = 'TRUNCATE TABLE ' . $db->quoteName('#__redshop_ordernumber_track'); + + if (!$db->setQuery($query)->execute()) + { + $msg = /** @scrutinizer ignore-deprecated */ + $db->getErrorMsg(); + /** @scrutinizer ignore-deprecated */ + $this->setError($msg); + + return false; + } + + return true; + } + + /** + * Count order number track + * + * @return mixed + * + * @since 2.1.0 + */ + public function getOrdernumberTrack() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('trackdatetime')) + ->where($db->quoteName('#__redshop_ordernumber_track')); + + return $db->setQuery($query)->loadResult(); + } + + /** + * Insert order number track + * + * @return boolean + * + * @since 2.1.0 + */ + public function insertOrdernumberTrack() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->insert($db->quoteName('#__redshop_ordernumber_track')) + ->columns($db->quoteName('trackdatetime')) + ->values('NOW()'); + + if (!$db->setQuery($query)->execute()) + { + $msg = /** @scrutinizer ignore-deprecated */ + $db->getErrorMsg(); + + /** @scrutinizer ignore-deprecated */ + $this->setError($msg); + + return false; + } + + return true; + } + + /** + * Get Unique order number + * + * @return integer + * + * @since 2.1.0 + */ + public function getOrdernumber() + { + $trackIdTime = $this->getOrdernumberTrack(); + + if (!empty($trackIdTime)) + { + $toTime = strtotime(date('Y-m-d H:i:s')); + $fromTime = strtotime($trackIdTime); + $totalMinutes = round(abs($toTime - $fromTime) / 60, 2); + + if ($totalMinutes > 1) + { + $this->deleteOrdernumberTrack(); + $trackIdTime = ""; + } + } + + if (!empty($trackIdTime)) + { + return $this->getOrdernumber(); + } + + $this->insertOrdernumberTrack(); + $order_number = RedshopHelperOrder::generateOrderNumber(); + + return $order_number; + } +} diff --git a/component/site/models/forms/ask_question.xml b/component/site/models/forms/ask_question.xml new file mode 100644 index 00000000000..b51b5791a84 --- /dev/null +++ b/component/site/models/forms/ask_question.xml @@ -0,0 +1,36 @@ + +
    +
    + + + + + +
    +
    diff --git a/component/site/models/forms/index.html b/component/site/models/forms/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/models/forms/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/models/forms/product_rating.xml b/component/site/models/forms/product_rating.xml new file mode 100644 index 00000000000..ec70261b85d --- /dev/null +++ b/component/site/models/forms/product_rating.xml @@ -0,0 +1,59 @@ + +
    +
    + + + + + + + + + + + + + +
    +
    diff --git a/component/site/models/giftcard.php b/component/site/models/giftcard.php new file mode 100644 index 00000000000..f96805bc6b3 --- /dev/null +++ b/component/site/models/giftcard.php @@ -0,0 +1,93 @@ +_table_prefix = '#__redshop_'; + $Id = JFactory::getApplication()->input->getInt('gid', 0); + + $this->setId((int) $Id); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function _buildQuery() + { + $and = ""; + + if ($this->_id) + { + $and .= "AND giftcard_id = " . (int) $this->_id . " "; + } + + $query = "SELECT * FROM " . $this->_table_prefix . "giftcard " + . "WHERE published = 1 " + . $and; + + return $query; + } + + public function getData() + { + if (empty ($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query); + } + + return $this->_data; + } + + public function getGiftcardTemplate() + { + if (!$this->_id) + { + $carttemplate = RedshopHelperTemplate::getTemplate("giftcard_list"); + } + else + { + $carttemplate = RedshopHelperTemplate::getTemplate("giftcard"); + } + + return $carttemplate; + } +} diff --git a/component/site/models/index.html b/component/site/models/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/models/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/models/login.php b/component/site/models/login.php new file mode 100644 index 00000000000..1406c1907a5 --- /dev/null +++ b/component/site/models/login.php @@ -0,0 +1,76 @@ +login($credentials); + + if ($error instanceof JException && !empty($error->getMessage())) + { + $msg = "" . JText::_('COM_REDSHOP_FORGOT_PWD_LINK') . ""; + $app->enqueueMessage($msg); + } + + return $error; + } + + public function ShopperGroupDetail($sid = 0) + { + $user = JFactory::getUser(); + + if ($sid == 0) + { + $query = "SELECT sg.* FROM #__redshop_shopper_group as sg " + . " LEFT JOIN #__redshop_users_info as ui on sg.`shopper_group_id`= ui.shopper_group_id WHERE ui.user_id = " . (int) $user->id; + } + else + { + $query = "SELECT sg.* FROM #__redshop_shopper_group as sg WHERE sg.`shopper_group_id`= " . (int) $sid; + } + + $this->_db->setQuery($query); + + return $this->_db->loadObjectList(); + } + + public function CheckShopperGroup($username, $shoppergroupid) + { + $db = JFactory::getDbo(); + $query = "SELECT sg.`shopper_group_id` FROM (`#__redshop_shopper_group` as sg " + . " LEFT JOIN #__redshop_users_info as ui on sg.`shopper_group_id`= ui.shopper_group_id) LEFT JOIN #__users as u on ui.user_id = u.id WHERE u.username = " + . $db->quote($username) . " AND ui.shopper_group_id =" . (int) $shoppergroupid . " AND sg.shopper_group_portal = 1"; + $db->setQuery($query); + + return $db->loadResult(); + } +} diff --git a/component/site/models/manufacturers.php b/component/site/models/manufacturers.php new file mode 100644 index 00000000000..325a0e4973a --- /dev/null +++ b/component/site/models/manufacturers.php @@ -0,0 +1,391 @@ +context = 'com_redshop.' . $app->input->getCmd('view') . '.' . $app->input->getCmd('layout', 'default'); + + // @ToDo In fearure, when class Manufacturers extends RedshopModelList, replace filter_fields in constructor + + $this->filter_fields_products = array( + 'p.product_name ASC', 'product_name ASC', + 'p.product_name DESC', 'product_name DESC', + 'p.product_price ASC', 'product_price ASC', + 'p.product_price DESC', 'product_price DESC', + 'p.product_number ASC', 'product_number ASC', + 'p.product_number DESC', 'product_number DESC', + 'p.product_id DESC', 'product_id DESC', + 'pc.ordering ASC', 'ordering ASC', + 'pc.ordering DESC', 'ordering DESC' + ); + + $this->filter_fields_manufacturer = array( + 'mn.name ASC', 'manufacturer_name ASC', + 'mn.id DESC', 'manufacturer_id DESC', + 'mn.ordering ASC', 'ordering ASC' + ); + + parent::__construct(); + + $this->_table_prefix = '#__redshop_'; + $params = $app->getParams('com_redshop'); + + if ($params->get('manufacturerid') != "") + { + $manid = $params->get('manufacturerid'); + } + else + { + $manid = (int) $app->input->getInt('mid', 0); + } + + $this->setId($manid); + + $limit = $app->getUserStateFromRequest($this->context . 'limit', 'limit', $params->get('maxmanufacturer'), 5); + + $limitstart = $app->input->getInt('limitstart', 0); + + // In case limit has been changed, adjust it + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + + $this->setState($this->context . 'limit', $limit); + $this->setState($this->context . 'limitstart', $limitstart); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function setProductLimit($limit) + { + $this->_productlimit = $limit; + } + + public function getProductLimit() + { + return $this->_productlimit; + } + + public function _buildQuery() + { + $orderby = $this->_buildContentOrderBy(); + $and = ""; + + // Shopper group - choose from manufactures Start + $shopper_group_manufactures = RedshopHelperShopper_Group::getShopperGroupManufacturers(); + + if (!empty($shopper_group_manufactures)) + { + $shopper_group_manufactures = explode(',', $shopper_group_manufactures); + $shopper_group_manufactures = Joomla\Utilities\ArrayHelper::toInteger($shopper_group_manufactures); + $shopper_group_manufactures = implode(',', $shopper_group_manufactures); + $and .= " AND mn.id IN (" . $shopper_group_manufactures . ") "; + } + + // Shopper group - choose from manufactures End + + if ($this->_id) + { + $and .= " AND mn.id = " . (int) $this->_id . " "; + } + + $query = "SELECT mn.* FROM " . $this->_table_prefix . "manufacturer AS mn " + . "WHERE mn.published = 1 " + . $and + . $orderby; + + return $query; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getData() + { + $layout = JFactory::getApplication()->input->getCmd('layout'); + $query = $this->_buildQuery(); + + if ($layout == "products") + { + $this->_data = $this->_getList($query); + } + else + { + $this->_data = $this->_getList($query, $this->getState($this->context . 'limitstart'), $this->getState($this->context . 'limit')); + } + + return $this->_data; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + $app = JFactory::getApplication(); + $layout = $app->input->getCmd('layout', ''); + $params = $app->getParams('com_redshop'); + + if ($app->input->getString('order_by', '') != null) + { + $order_by = urldecode($app->input->getString('order_by', '')); + $app->setUserState('com_redshop.manufacturers.default.order_state', $order_by); + } + elseif ($app->getUserState('com_redshop.manufacturers.default.order_state') != null) + { + $order_by = $app->getUserState('com_redshop.manufacturers.default.order_state'); + } + else + { + $order_by = $params->get('order_by', Redshop::getConfig()->get('DEFAULT_MANUFACTURER_ORDERING_METHOD')); + } + + if ($layout == 'products') + { + $filter_order = 'mn.id'; + } + else + { + if (in_array($order_by, $this->filter_fields_manufacturer)) + { + $filter_order = $order_by; + } + + // User can get not allowed order_by, when url contain Itemid from another view, so it need check here + elseif (in_array($params->get('order_by', Redshop::getConfig()->get('DEFAULT_MANUFACTURER_ORDERING_METHOD')), $this->filter_fields_manufacturer)) + { + $filter_order = $params->get('order_by', Redshop::getConfig()->get('DEFAULT_MANUFACTURER_ORDERING_METHOD')); + } + else + { + $filter_order = Redshop::getConfig()->get('DEFAULT_MANUFACTURER_ORDERING_METHOD'); + } + } + + $orderby = " ORDER BY " . $db->escape($filter_order) . ' '; + + return $orderby; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + $this->_pagination = new JPagination($this->getTotal(), $this->getState($this->context . 'limitstart'), $this->getState($this->context . 'limit')); + } + + return $this->_pagination; + } + + public function getCategoryList() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('c.id', 'value')) + ->select($db->qn('c.name', 'text')) + ->from($db->qn('#__redshop_category', 'c')) + ->leftjoin($db->qn('#__redshop_product_category_xref', 'pcx') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pcx.category_id')) + ->leftjoin($db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('pcx.product_id')) + ->where($db->qn('p.manufacturer_id') . ' = ' . $db->q((int) $this->_id)) + ->where($db->qn('c.published') . ' = 1') + ->order($db->qn('c.name') . ' ASC'); + + return $db->setQuery($query)->loadObjectlist(); + } + + public function getManufacturerProducts($template_data = '') + { + $limit = $this->getProductLimit(); + $limitstart = JFactory::getApplication()->input->getInt('limitstart', 0); + $query = $this->_buildProductQuery($template_data); + $this->products = $this->_getList($query, $limitstart, $limit); + + return $this->products; + } + + /** + * @param string $template_data Template content + * + * @return JDatabaseQuery + */ + public function _buildProductQuery($template_data = '') + { + $filterBy = JFactory::getApplication()->input->get('filter_by', 0); + $orderBy = $this->_buildProductOrderBy($template_data); + + // Shopper group - choose from manufactures Start + $shopperGroupManufactures = RedshopHelperShopper_Group::getShopperGroupManufacturers(); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('p.*') + ->select($db->qn('c.id')) + ->select($db->qn('c.name')) + ->from($db->qn('#__redshop_product', 'p')) + ->leftjoin($db->qn('#__redshop_product_category_xref', 'pcx') . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('pcx.product_id')) + ->leftjoin($db->qn('#__redshop_category', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pcx.category_id')) + ->where($db->qn('p.manufacturer_id') . ' = ' . $db->q((int) $this->_id)) + ->where($db->qn('p.published') . ' = 1') + ->where($db->qn('p.expired') . ' = 0') + ->where($db->qn('p.product_parent_id') . ' = 0') + ->order($orderBy) + ->group($db->qn('p.product_id')); + + if (!empty($shopperGroupManufactures)) + { + $shopperGroupManufactures = explode(',', $shopperGroupManufactures); + $shopperGroupManufactures = ArrayHelper::toInteger($shopperGroupManufactures); + $shopperGroupManufactures = implode(',', $shopperGroupManufactures); + $query->where($db->qn('p.manufacturer_id') . ' IN (' . $shopperGroupManufactures . ')'); + } + + if ($filterBy != '0') + { + $query->where($db->qn('c.id') . ' = ' . $db->q((int) $filterBy)); + } + + // Filter cids by menu configuration + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $active = $menu->getActive(); + $itemId = isset($active->id) ? $active->id : null; + $menuParams = $menu->getParams($itemId); + $cid = $menuParams->get('cid'); + + if ($cid) + { + $tmpCategories = RedshopHelperCategory::getCategoryTree($cid); + $categoriesIds = array($cid); + + if (!empty($tmpCategories)) + { + foreach ($tmpCategories as $child) + { + $categoriesIds[] = $child->id; + } + } + $query->where($db->qn('c.id') . ' IN ( ' . implode(',', $categoriesIds) . ' )'); + } + + return $query; + } + + public function getmanufacturercategory($mid, $tblobj) + { + $plg_manufacturer = RedshopHelperOrder::getParameters('plg_manucaturer_excluding_category'); + $db = $this->_db; + + $query = $db->getQuery(true) + ->select('DISTINCT(c.id)') + ->select($db->qn('c.name')) + ->select($db->qn('c.short_description')) + ->select($db->qn('c.description')) + ->select($db->qn('c.category_thumb_image')) + ->select($db->qn('c.category_full_image')) + ->from($db->qn('#__redshop_product') . ' AS p') + ->leftJoin($db->qn('#__redshop_product_category_xref') . ' AS pc' . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('pc.product_id')) + ->leftJoin($db->qn('#__redshop_category') . ' AS c' . ' ON ' . $db->qn('pc.category_id') . ' = ' . $db->qn('c.id')) + ->where($db->qn('p.published') . ' = 1') + ->where($db->qn('p.manufacturer_id') . ' = ' . $db->q((int) $mid)) + ->where($db->qn('p.expired') . ' = 0') + ->where($db->qn('p.product_parent_id') . ' = 0'); + + if (!empty($plg_manufacturer) && $plg_manufacturer[0]->enabled && $tblobj->excluding_category_list != '') + { + $excluding_category_list = explode(',', $tblobj->excluding_category_list); + + if (!empty($excluding_category_list)) + { + $excluding_category_list = implode(',', Joomla\Utilities\ArrayHelper::toInteger($excluding_category_list)); + $query->where($db->qn('c.id') . ' NOT IN (' . $excluding_category_list . ')'); + } + } + + return $db->setQuery($query)->loadObjectlist(); + } + + public function getProductTotal() + { + $query = $this->_buildProductQuery(); + $total = $this->_getListCount($query); + + return $total; + } + + public function getProductPagination() + { + $limit = $this->getProductLimit(); + $limitstart = JFactory::getApplication()->input->getInt('limitstart', 0); + $productpagination = new JPagination($this->getProductTotal(), $limitstart, $limit); + + return $productpagination; + } + + public function _buildProductOrderBy($template_data = '') + { + $orderByObj = RedshopHelperUtility::prepareOrderBy( + urldecode( + JFactory::getApplication()->input->getString('order_by', Redshop::getConfig()->get('DEFAULT_MANUFACTURER_PRODUCT_ORDERING_METHOD')) + ) + ); + $orderBy = $orderByObj->ordering . ' ' . $orderByObj->direction; + $filterOrder = 'pc.ordering'; + + if (in_array($orderBy, $this->filter_fields_products)) + { + $filterOrder = $orderBy; + } + + if (strstr($template_data, '{category_name}')) + { + $filterOrder = "c.ordering, c.id, " . $filterOrder; + } + + return JFactory::getDbo()->escape($filterOrder) . ' '; + } +} diff --git a/component/site/models/newsletter.php b/component/site/models/newsletter.php new file mode 100644 index 00000000000..cde982c8e47 --- /dev/null +++ b/component/site/models/newsletter.php @@ -0,0 +1,123 @@ +_db = JFactory::getDbo(); + $this->_table_prefix = '#__redshop_'; + $subId = JFactory::getApplication()->input->getInt('sid', ''); + + if ($subId) + { + $this->confirmSubscribe($subId); + } + } + + /** + * Check is email is subscription + * + * @param string $email Email + * + * @return boolean + * @throws Exception + */ + public function checkSubscriptionByEmail($email) + { + $app = JFactory::getApplication(); + $db = $this->getDbo(); + $link = JUri::root() . 'index.php?option=com_redshop&view=newsletter'; + + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from($db->qn('#__redshop_newsletter')); + $count = (int) $db->setQuery($query)->loadResult(); + + if (!$count) + { + // If there are no newsletter, redirect with message. + $app->redirect(JRoute::_($link), JText::_('COM_REDSHOP_NEWSLETTER_NOT_AVAILABLE')); + } + + $user = JFactory::getUser(); + + if ($user->id) + { + $email = $user->email; + } + + $query->clear() + ->select($db->qn('subscription_id')) + ->from($db->qn('#__redshop_newsletter_subscription')) + ->where($db->qn('email') . ' = ' . $db->quote($email)) + ->where($db->qn('newsletter_id') . ' = ' . Redshop::getConfig()->getInt('DEFAULT_NEWSLETTER')) + ->where($db->qn('user_id') . ' = ' . $user->id); + + $hasSubscribed = $db->setQuery($query)->loadResult(); + + if ($hasSubscribed) + { + return true; + } + + return false; + } + + /** + * Check is email is subscription + * + * @param integer $subscriptionId Subscribe ID + * + * @return void + * @throws Exception + */ + public function confirmSubscribe($subscriptionId) + { + $app = JFactory::getApplication(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_newsletter_subscription')) + ->set($db->qn('published') . ' = 1') + ->where($db->qn('subscription_id') . ' = ' . (int) $subscriptionId); + $db->setQuery($query)->execute(); + + $app->redirect( + JRoute::_(JUri::root() . 'index.php?option=com_redshop&view=newsletter'), + JText::_('COM_REDSHOP_MESSAGE_CONFIRMED_SUBSCRIBE') + ); + } +} diff --git a/component/site/models/order_detail.php b/component/site/models/order_detail.php new file mode 100644 index 00000000000..749824f1b4b --- /dev/null +++ b/component/site/models/order_detail.php @@ -0,0 +1,189 @@ +_table_prefix = '#__redshop_'; + } + + /** + * Check Order Information Access Token + * + * @param integer $oid Order Id + * @param string $encr Encryped String - Token + * + * @return integer User Info id - redSHOP User Id if validate. + */ + public function checkauthorization($oid, $encr) + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + // Create the base select statement. + $query->select('user_info_id') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_id') . ' = ' . (int) $oid) + ->where($db->qn('encr_key') . ' = ' . $db->q($encr)); + + // Set the query and load the result. + $db->setQuery($query); + + try + { + $userInfoIdEncr = $db->loadResult(); + } + catch (RuntimeException $e) + { + throw new RuntimeException($e->getMessage(), $e->getCode()); + } + + if ($userInfoIdEncr) + { + $session = JFactory::getSession(); + $auth['users_info_id'] = $userInfoIdEncr; + + $session->set('auth', $auth); + } + + return $userInfoIdEncr; + } + + /** + * Update analytic status + * + * @return boolean + */ + public function UpdateAnalytics_status($oid) + { + $query = "UPDATE " . $this->_table_prefix . "orders SET `analytics_status` = 1 WHERE order_id = " . (int) $oid; + $this->_db->setQuery($query); + + if (!$this->_db->execute()) + { + return false; + } + + return true; + } + + /** + * Get Billing Addresses + * + * @return object + */ + public function billingaddresses() + { + $user = JFactory::getUser(); + $session = JFactory::getSession(); + $auth = $session->get('auth'); + $billingAddress = new stdClass; + + if ($user->id) + { + $billingAddress = RedshopHelperOrder::getBillingAddress($user->id); + } + elseif ($auth['users_info_id']) + { + $uid = -$auth['users_info_id']; + $billingAddress = RedshopHelperOrder::getBillingAddress($uid); + } + + if ($billingAddress === false || $billingAddress === null) + { + return new stdClass; + } + + return $billingAddress; + } + + /** + * Get category name from Product Id + * + * @return string + */ + public function getCategoryNameByProductId($pid) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('c.name')) + ->from($db->qn('#__redshop_product_category_xref', 'pcx')) + ->leftjoin($db->qn('#__redshop_category', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pcx.category_id')) + ->where($db->qn('pcx.product_id') . ' = ' . $db->q((int) $pid)) + ->where($db->qn('c.name') . ' IS NOT NULL') + ->order($db->qn('c.id') . ' ASC'); + + return $db->setQuery($query, 0, 1)->loadResult(); + } + + /** + * @return void + * + * @since 2.0.7 + */ + public function resetcart() + { + RedshopHelperCartSession::reset(); + $session = JFactory::getSession(); + $session->set('ccdata', null); + $session->set('issplit', null); + $session->set('userfield', null); + + unset($_SESSION ['ccdata']); + } + + public function update_ccdata($order_id, $payment_transaction_id) + { + $db = JFactory::getDbo(); + + $session = JFactory::getSession(); + $ccdata = $session->get('ccdata'); + + $order_payment_code = $ccdata['creditcard_code']; + $order_payment_cardname = base64_encode($ccdata['order_payment_name']); + $order_payment_number = base64_encode($ccdata['order_payment_number']); + + // This is ccv code + $order_payment_ccv = base64_encode($ccdata['credit_card_code']); + $order_payment_expire = $ccdata['order_payment_expire_month'] . $ccdata['order_payment_expire_year']; + $order_payment_trans_id = $payment_transaction_id; + + $payment_update = "UPDATE " . $this->_table_prefix . "order_payment " + . " SET order_payment_code = " . $db->quote($order_payment_code) . ", " + . " order_payment_cardname = " . $db->quote($order_payment_cardname) . ", " + . " order_payment_number = " . $db->quote($order_payment_number) . ", " + . " order_payment_ccv = " . $db->quote($order_payment_ccv) . ", " + . " order_payment_expire = " . $db->quote($order_payment_expire) . ", " + . " order_payment_trans_id = " . $db->quote($payment_transaction_id) . " " + . " WHERE order_id = " . (int) $order_id; + + return $db->setQuery($payment_update)->execute(); + } +} diff --git a/component/site/models/orders.php b/component/site/models/orders.php new file mode 100644 index 00000000000..ab3c60e72b0 --- /dev/null +++ b/component/site/models/orders.php @@ -0,0 +1,90 @@ +_table_prefix = '#__redshop_'; + $this->_limitstart = $app->input->get('limitstart', 0); + $this->_limit = $app->getUserStateFromRequest($context . 'limit', 'limit', 10, 'int'); + } + + public function _buildQuery() + { + $user = JFactory::getUser(); + $db = $this->getDbo(); + $query = $db->getQuery(true); + + $query->select('*'); + $query->from($this->_table_prefix . "orders"); + $query->where('user_id = ' . (int) $user->id); + $query->order('cdate DESC'); + + return $query; + } + + public function getData() + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->_limitstart, $this->_limit); + + return $this->_data; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + JLoader::import('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->_limitstart, $this->_limit); + } + + return $this->_pagination; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } +} diff --git a/component/site/models/ordertracker.php b/component/site/models/ordertracker.php new file mode 100644 index 00000000000..b1f770ccff6 --- /dev/null +++ b/component/site/models/ordertracker.php @@ -0,0 +1,35 @@ +_table_prefix = '#__redshop_'; + } +} diff --git a/component/site/models/price_filter.php b/component/site/models/price_filter.php new file mode 100644 index 00000000000..2e2f05974fb --- /dev/null +++ b/component/site/models/price_filter.php @@ -0,0 +1,46 @@ +getQuery(true) + ->select('DISTINCT(p.product_id), p.*') + ->from($db->qn('#__redshop_product', 'p')) + ->where('p.published = 1') + ->order('p.product_price'); + + if ($category = JFactory::getApplication()->input->getString('category', 0)) + { + $query->leftJoin($db->qn('#__redshop_product_category_xref', 'cx') . ' ON cx.product_id = p.product_id') + ->where($db->qn('cx.category_id') . ' IN ('. $category .')'); + } + + return $db->setQuery($query)->loadObjectList(); + } +} diff --git a/component/site/models/product.php b/component/site/models/product.php new file mode 100644 index 00000000000..ebadb5479c5 --- /dev/null +++ b/component/site/models/product.php @@ -0,0 +1,610 @@ +input = JFactory::getApplication()->input; + + $this->_table_prefix = '#__redshop_'; + $pid = $this->input->getInt('pid', 0); + + $GLOBALS['childproductlist'] = array(); + + $this->setId((int) $pid); + $this->_catid = $this->input->getInt('cid', 0); + } + + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + public function getData() + { + if (empty($this->_data)) + { + $this->_db->setQuery($this->_buildQuery(), 0, 1); + $this->_data = $this->_db->loadObject(); + } + + if (is_object($this->_data)) + { + $this->_data->product_s_desc = RedshopHelperTemplate::parseRedshopPlugin($this->_data->product_s_desc); + $this->_data->product_desc = RedshopHelperTemplate::parseRedshopPlugin($this->_data->product_desc); + } + + return $this->_data; + } + + + /** + * get name supplier + * @param int $id id supplier + * + * @return array + */ + public function getNameSupplierById($id) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('name') + ->from($db->qn('#__redshop_supplier')) + ->where($db->qn('id') . ' = ' . (int) $id); + + return $db->setQuery($query)->loadResult(); + } + + public function _buildQuery() + { + // Shopper group - choose from manufactures Start + $shopperGroupManufactures = RedshopHelperShopper_Group::getShopperGroupManufacturers(); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('p.*') + ->select($db->qn('c.id', 'category_id')) + ->select($db->qn('c.name', 'category_name')) + ->select($db->qn('c.category_full_image')) + ->select($db->qn('c.category_back_full_image')) + ->select($db->qn('m.name', 'manufacturer_name')) + ->select($db->qn('pcx.ordering')) + ->select($db->qn('ppx.payment_id')) + ->from($db->qn('#__redshop_product', 'p')) + ->leftjoin($db->qn('#__redshop_product_category_xref', 'pcx') . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('pcx.product_id')) + ->leftjoin($db->qn('#__redshop_manufacturer', 'm') . ' ON ' . $db->qn('m.id') . ' = ' . $db->qn('p.manufacturer_id')) + ->leftjoin($db->qn('#__redshop_category', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('pcx.category_id')) + ->leftjoin($db->qn('#__redshop_product_payment_xref', 'ppx') . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('ppx.product_id')) + ->where($db->qn('p.product_id') . ' = ' . $db->q((int) $this->_id)); + + if (!empty($shopperGroupManufactures)) + { + $shopperGroupManufactures = explode(',', $shopperGroupManufactures); + $shopperGroupManufactures = ArrayHelper::toInteger($shopperGroupManufactures); + $shopperGroupManufactures = implode(',', $shopperGroupManufactures); + $query->where($db->qn('p.manufacturer_id') . ' IN (' . $shopperGroupManufactures . ')'); + } + + // Shopper group - choose from manufactures End + if (isset($this->_catid) && $this->_catid != 0) + { + $query->where($db->qn('pcx.category_id') . ' = ' . $db->q((int) $this->_catid)); + } + + return $query; + } + + public function getProductTemplate() + { + if (empty($this->_template)) + { + $this->_template = RedshopHelperTemplate::getTemplate("product", $this->_data->product_template); + $this->_template = $this->_template[0]; + } + + return $this->_template; + } + + /** + * get next or previous product using ordering. + * + * @param int $product_id current product id + * @param int $category_id current product category id + * @param int $dirn to indicate next or previous product + * + * @return mixed + */ + public function getPrevNextproduct($product_id, $category_id, $dirn) + { + $query = "SELECT ordering FROM " . $this->_table_prefix . "product_category_xref WHERE product_id = " . (int) $product_id . " AND category_id = " . (int) $category_id . " LIMIT 0,1"; + + $where = ' AND p.published="1" AND category_id = ' . (int) $category_id; + + $sql = "SELECT pcx.product_id, p.product_name , ordering FROM " . $this->_table_prefix . "product_category_xref "; + + $sql .= " as pcx LEFT JOIN " . $this->_table_prefix . "product as p ON p.product_id = pcx.product_id "; + + if ($dirn < 0) + { + $sql .= ' WHERE ordering < (' . $query . ')'; + $sql .= $where; + $sql .= ' ORDER BY ordering DESC'; + } + elseif ($dirn > 0) + { + $sql .= ' WHERE ordering > (' . $query . ')'; + $sql .= $where; + $sql .= ' ORDER BY ordering'; + } + else + { + $sql .= ' WHERE ordering = (' . $query . ')'; + $sql .= $where; + $sql .= ' ORDER BY ordering'; + } + + $this->_db->setQuery($sql, 0, 1); + $row = null; + $row = $this->_db->loadObject(); + + return $row; + } + + public function checkReview($email) + { + $db = JFactory::getDbo(); + $query = "SELECT email from " . $this->_table_prefix . "product_rating WHERE email = " . $db->quote($email) . " AND email != '' AND product_id = " . (int) $product_id . " limit 0,1 "; + $db->setQuery($query); + $chkemail = $db->loadResult(); + + if ($chkemail) + { + return true; + } + + return false; + } + + public function sendMailForReview($data) + { + $user = JFactory::getUser(); + $data['userid'] = $user->id; + + $data['user_rating'] = $data['user_rating']; + $data['username'] = $data['username']; + $data['title'] = $data['title']; + $data['comment'] = $data['comment']; + $data['product_id'] = $data['product_id']; + $data['published'] = 0; + $data['time'] = $data['time']; + + $row = $this->getTable('rating_detail'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $producthelper = productHelper::getInstance(); + $user = JFactory::getUser(); + + $url = JURI::base(); + $Itemid = $this->input->get('Itemid'); + $mailbcc = null; + $fromname = $data['username']; + $from = $user->email; + $subject = ""; + $message = $data['title']; + $comment = $data['comment']; + $username = $data['username']; + $product_id = $data['product_id']; + + $mailbody = Redshop\Mail\Helper::getTemplate(0, "review_mail"); + + $data_add = $message; + + if (count($mailbody) > 0) + { + $data_add = $mailbody[0]->mail_body; + $subject = $mailbody[0]->mail_subject; + + if (trim($mailbody[0]->mail_bcc) != "") + { + $mailbcc = explode(",", $mailbody[0]->mail_bcc); + } + } + + $product = $producthelper->getProductById($product_id); + + $link = JRoute::_($url . "index.php?option=com_redshop&view=product&pid=" . $product_id . '&Itemid=' . $Itemid); + $product_url = "" . $product->product_name . ""; + $data_add = str_replace("{product_link}", $product_url, $data_add); + $data_add = str_replace("{product_name}", $product->product_name, $data_add); + $data_add = str_replace("{title}", $message, $data_add); + $data_add = str_replace("{comment}", $comment, $data_add); + $data_add = str_replace("{username}", $username, $data_add); + + Redshop\Mail\Helper::imgInMail($data_add); + + if (Redshop::getConfig()->get('ADMINISTRATOR_EMAIL') != "") + { + $sendto = explode(",", Redshop::getConfig()->get('ADMINISTRATOR_EMAIL')); + + if (JFactory::getMailer()->sendMail($from, $fromname, $sendto, $subject, $data_add, $mode = 1, null, $mailbcc)) + { + return true; + } + else + { + return false; + } + } + } + + /** + * Product Tags Functions + */ + public function getProductTags($tagname, $productid) + { + $query = "SELECT pt.*,ptx.product_id,ptx.users_id " + . "FROM " . $this->_table_prefix . "product_tags AS pt " + . "LEFT JOIN " . $this->_table_prefix . "product_tags_xref AS ptx ON pt.tags_id=ptx.tags_id " + . "WHERE pt.tags_name LIKE " . $this->_db->quote($tagname) . " "; + $this->_db->setQuery($query); + $list = $this->_db->loadObjectlist(); + + return $list; + } + + public function updateVisited($product_id) + { + $query = "UPDATE " . $this->_table_prefix . "product " + . "SET visited=visited + 1 " + . "WHERE product_id = " . (int) $product_id; + $this->_db->setQuery($query); + $this->_db->execute(); + } + + public function addProductTags($data) + { + $tags = $this->getTable('product_tags'); + + if (!$tags->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$tags->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $tags; + } + + public function addtowishlist($data) + { + $row = $this->getTable('wishlist'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return $row; + } + + /** + * Method for store wishlist in session. + * + * @param array $data List of data. + * + * @return bool True on success. False otherwise. + */ + public function addtowishlist2session($data) + { + $attributes = null; + $properties = null; + $subAttributes = null; + $session = JFactory::getSession(); + + if (array_key_exists('attribute_id', $data)) + { + $attributes = explode('##', $data['attribute_id']); + } + + if (array_key_exists('property_id', $data)) + { + $properties = explode('##', $data['property_id']); + } + + if (array_key_exists('subattribute_id', $data)) + { + $subAttributes = explode('##', $data['subattribute_id']); + } + + ob_clean(); + $extraField = extraField::getInstance(); + $section = 12; + $row_data = $extraField->getSectionFieldList($section); + $wishlistSession = $session->get('wishlist'); + + if (!empty($wishlistData) && !Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE')) + { + $wishlistSession[$data['product_id']] = null; + } + + $wishlist = new stdClass; + $wishlist->product_id = $data['product_id']; + $wishlist->comment = isset($data ['comment']) ? $data ['comment'] : ""; + $wishlist->cdate = $data['cdate']; + + for ($k = 0, $kn = count($row_data); $k < $kn; $k++) + { + $field = "productuserfield_" . $k; + $wishlist->{$field} = $data['productuserfield_' . $k]; + } + + if (!$attributes || !Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE')) + { + $wishlistSession[$data['product_id']] = $wishlist; + $session->set('wishlist', $wishlistSession); + + return true; + } + + if (empty($wishlistSession[$data['product_id']]) || !is_array($wishlistSession[$data['product_id']])) + { + $wishlistSession[$data['product_id']] = array(); + } + + $wishlist->product_items = array(); + + foreach ($attributes as $index => $attribute) + { + $item = new stdClass; + $item->attribute_id = $attribute; + + if (isset($properties[$index])) + { + $item->property_id = $properties[$index]; + } + + if (isset($subAttributes[$index])) + { + $item->subattribute_id = $subAttributes[$index]; + } + + $wishlist->product_items = $item; + } + + if (!empty($wishlistSession[$data['product_id']])) + { + foreach ($wishlistSession[$data['product_id']] as $wishlistItem) + { + if ($wishlistItem->product_items == $wishlist->product_items) + { + return true; + } + } + } + + $wishlistSession[$data['product_id']][] = $wishlist; + $session->set('wishlist', $wishlistSession); + + return true; + } + + public function addProductTagsXref($post, $tags) + { + $user = JFactory::getUser(); + $query = "INSERT INTO " . $this->_table_prefix . "product_tags_xref " + . "VALUES('" . (int) $tags->tags_id . "','" . (int) $post['product_id'] . "','" . (int) $user->id . "')"; + $this->_db->setQuery($query); + $this->_db->execute(); + + return true; + } + + public function checkProductTags($tagname, $productid) + { + $user = JFactory::getUser(); + $query = "SELECT pt.*,ptx.product_id,ptx.users_id FROM " . $this->_table_prefix . "product_tags AS pt " + . "LEFT JOIN " . $this->_table_prefix . "product_tags_xref AS ptx ON pt.tags_id=ptx.tags_id " + . "WHERE pt.tags_name LIKE " . $this->_db->quote($tagname) . " " + . "AND ptx.product_id = " . (int) $productid . " " + . "AND ptx.users_id = " . (int) $user->id; + $this->_db->setQuery($query); + $list = $this->_db->loadObject(); + + return $list; + } + + public function checkWishlist($product_id) + { + $user = JFactory::getUser(); + $query = "SELECT * FROM " . $this->_table_prefix . "wishlist " + . "WHERE product_id = " . (int) $product_id . " " + . "AND user_id = " . (int) $user->id; + $this->_db->setQuery($query); + $list = $this->_db->loadObject(); + + return $list; + } + + /** + * Get Download product info + * + * @param string $downloadId Download id + * + * @return mixed + */ + public function downloadProduct($downloadId) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_product_download', 'pd')) + ->leftJoin($db->qn('#__redshop_media', 'm') . ' ON m.media_name = pd.file_name') + ->where('pd.download_id = ' . $db->q($downloadId)); + + return $db->setQuery($query)->loadObject(); + } + + public function AdditionaldownloadProduct($mid = 0, $id = 0, $media = 0) + { + $where = ""; + + if ($mid != 0) + { + $where .= "AND media_id = " . (int) $mid . " "; + } + + if ($id != 0) + { + $where .= "AND id = " . (int) $id . " "; + } + + if ($media != 0) + { + $tablename = "media "; + } + else + { + $tablename = "media_download "; + } + + $query = "SELECT * FROM " . $this->_table_prefix . $tablename + . "WHERE 1=1 " + . $where; + $list = $this->_getList($query); + + return $list; + } + + public function setDownloadLimit($did) + { + $query = "UPDATE " . $this->_table_prefix . "product_download " + . "SET download_max=(download_max - 1) " + . "WHERE download_id = " . (int) $did; + $this->_db->setQuery($query); + $ret = $this->_db->execute(); + + if ($ret) + { + return true; + } + + return false; + } + + public function getAllChildProductArrayList($childid = 0, $parentid = 0) + { + $info = RedshopHelperProduct::getChildProduct($parentid); + + for ($i = 0, $in = count($info); $i < $in; $i++) + { + if ($childid != $info[$i]->product_id) + { + $GLOBALS['childproductlist'][] = $info[$i]; + $this->getAllChildProductArrayList($childid, $info[$i]->product_id); + } + } + + return $GLOBALS['childproductlist']; + } + + public function addNotifystock($product_id, $property_id, $subproperty_id, $email_not_login = null) + { + ob_clean(); + $user = JFactory::getUser(); + $user_id = $user->id; + $data = array(); + $data['product_id'] = $product_id; + $data['property_id'] = $property_id; + $data['subproperty_id'] = $subproperty_id; + $data['user_id'] = $user_id; + $data['email_not_login'] = $email_not_login; + $row = $this->getTable('notifystock_user'); + + if (!$row->bind($data)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + /** @scrutinizer ignore-deprecated */ $this->setError(/** @scrutinizer ignore-deprecated */ $this->_db->getErrorMsg()); + + return false; + } + + return true; + } +} diff --git a/component/site/models/product_mini.php b/component/site/models/product_mini.php new file mode 100644 index 00000000000..65a3c404cc2 --- /dev/null +++ b/component/site/models/product_mini.php @@ -0,0 +1,175 @@ +_table_prefix = '#__redshop_'; + + $limit = $app->getUserStateFromRequest($context . 'limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest($context . 'limitstart', 'limitstart', 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query); + } + + return $this->_data; + } + + public function getTotal() + { + global $context; + + $app = JFactory::getApplication(); + + $orderby = $this->_buildContentOrderBy(); + $search_field = $app->getUserStateFromRequest($context . 'search_field', 'search_field', ''); + $keyword = $app->getUserStateFromRequest($context . 'keyword', 'keyword', ''); + $category_id = $app->getUserStateFromRequest($context . 'category_id', 'category_id', 0); + + $where = ''; + + if (trim($keyword) != '') + { + $where .= " AND " . $this->_db->quoteName($search_field) . " LIKE " . $this->_db->quote('%' . $keyword . '%') . " "; + } + + if ($category_id) + { + $where .= " AND c.category_id = " . (int) $category_id . " "; + } + + if ($where != '') + { + $query = 'SELECT count(distinct(p.product_id)) ' + . 'FROM ' . $this->_table_prefix . 'product p ' + . 'LEFT JOIN ' . $this->_table_prefix . 'product_category_xref x ON x.product_id = p.product_id ' + . 'LEFT JOIN ' . $this->_table_prefix . 'category c ON x.category_id = c.category_id ' + . 'WHERE 1=1 ' + . $where; + } + else + { + $query = 'SELECT count(*) FROM ' . $this->_table_prefix . 'product p '; + } + + if (empty($this->_total)) + { + $this->_db->setQuery($query); + $this->_total = $this->_db->loadResult(); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function _buildQuery() + { + global $context; + + $query = null; + + $app = JFactory::getApplication(); + + $orderby = $this->_buildContentOrderBy(); + $search_field = $app->getUserStateFromRequest($context . 'search_field', 'search_field', ''); + $keyword = $app->getUserStateFromRequest($context . 'keyword', 'keyword', ''); + $category_id = $app->getUserStateFromRequest($context . 'category_id', 'category_id', 0); + + $where = ''; + + if (trim($keyword) != '') + { + $where .= " AND " . $this->_db->quoteName($search_field) . " LIKE " . $this->_db->quote('%' . $keyword . '%') . " "; + } + + if ($category_id) + { + $where .= " AND c.category_id = " . (int) $category_id . " "; + } + + // Change limit condition for all issue + $limit = ""; + + if ($this->getState('limit') > 0) + { + $limit = " LIMIT " . (int) $this->getState('limitstart') . "," . (int) $this->getState('limit'); + } + + if ($where != '') + { + $query = 'SELECT distinct(p.product_id),p.*, x.ordering , x.category_id FROM ' . $this->_table_prefix . 'product p ' + . 'LEFT JOIN ' . $this->_table_prefix . 'product_category_xref x ON x.product_id = p.product_id ' + . 'LEFT JOIN ' . $this->_table_prefix . 'category c ON x.category_id = c.category_id ' + . 'WHERE 1=1 ' . $where . ' ' + . $orderby; + } + + return $query; + } + + public function _buildContentOrderBy() + { + $db = JFactory::getDbo(); + + global $context; + + $app = JFactory::getApplication(); + + $filter_order = urldecode($app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'product_id')); + $filter_order_Dir = urldecode($app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', '')); + + $orderby = ' ORDER BY ' . $db->escape($filter_order . ' ' . $filter_order_Dir); + + return $orderby; + } +} diff --git a/component/site/models/product_rating.php b/component/site/models/product_rating.php new file mode 100644 index 00000000000..ea712d07152 --- /dev/null +++ b/component/site/models/product_rating.php @@ -0,0 +1,191 @@ +context = $config['context']; + } + else + { + $this->context = $this->context . '.' . JFactory::getApplication()->input->getInt('product_id', 0); + } + } + + /** + * 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.5 + */ + public function getForm($data = array(), $loadData = true) + { + // Get the form. + $form = $this->loadForm($this->context . '.' . $this->formName, $this->formName, array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return array The default data is an empty array. + * + * @since 1.5 + */ + protected function loadFormData() + { + $data = (array) JFactory::getApplication()->getUserState($this->context . '.data', array()); + + return $data; + } + + /** + * Method to store the records + * + * @param array $data array of data + * + * @return bool + */ + public function store($data) + { + $row = $this->getTable('rating_detail'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + return true; + } + + /** + * Send Mail For Ask Review + * + * @param array $data Review data + * + * @return boolean + */ + public function sendMailForReview($data) + { + if (!$this->store($data)) + { + return false; + } + + $mailbcc = null; + $subject = ""; + $mailbody = Redshop\Mail\Helper::getTemplate(0, "review_mail"); + $data_add = $data['title']; + + if (count($mailbody) > 0) + { + $data_add = $mailbody[0]->mail_body; + $subject = $mailbody[0]->mail_subject; + + if (trim($mailbody[0]->mail_bcc) != "") + { + $mailbcc = explode(",", $mailbody[0]->mail_bcc); + } + } + + $product = RedshopHelperProduct::getProductById($data['product_id']); + $link = JRoute::_(JURI::base() . "index.php?option=com_redshop&view=product&pid=" . $data['product_id'] . '&Itemid=' . $data['Itemid'], false); + $data_add = str_replace("{product_link}", "" . $product->product_name . "", $data_add); + $data_add = str_replace("{product_name}", $product->product_name, $data_add); + $data_add = str_replace("{title}", $data['title'], $data_add); + $data_add = str_replace("{comment}", $data['comment'], $data_add); + $data_add = str_replace("{username}", $data['username'], $data_add); + + Redshop\Mail\Helper::imgInMail($data_add); + + if (Redshop::getConfig()->get('ADMINISTRATOR_EMAIL') != "") + { + $sendto = explode(",", Redshop::getConfig()->get('ADMINISTRATOR_EMAIL')); + + if (JFactory::getMailer()->sendMail($data['email'], $data['username'], $sendto, $subject, $data_add, $mode = 1, null, $mailbcc)) + { + return true; + } + else + { + $this->setError(JText::_('COM_REDSHOP_EMAIL_HAS_NOT_BEEN_SENT_SUCCESSFULLY')); + + return false; + } + } + + return true; + } + + /** + * Check Rated Product + * + * @param int $pid Product id + * @param int $uid User id + * @param string $email User mail + * + * @return mixed + */ + public function checkRatedProduct($pid, $uid = 0, $email = '') + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('COUNT(rating_id)') + ->from($db->qn('#__redshop_product_rating')) + ->where('product_id = ' . (int) $pid) + ->where('userid = ' . (int) $uid); + + if ($email) + { + $query->where('email = ' . $db->q($email)); + } + + return $db->setQuery($query)->loadResult(); + } +} diff --git a/component/site/models/quotation.php b/component/site/models/quotation.php new file mode 100644 index 00000000000..7d76d071d8d --- /dev/null +++ b/component/site/models/quotation.php @@ -0,0 +1,657 @@ +_table_prefix = '#__redshop_'; + } + + public function &getData() + { + if (!$this->_loadData()) + { + $this->_initData(); + } + + return $this->_data; + } + + public function _loadData() + { + $user = JFactory::getUser(); + + if ($user->id) + { + $this->_data = RedshopHelperOrder::getBillingAddress($user->id); + $this->_data->user_info_id = $this->_data->users_info_id; + + return true; + } + + return false; + } + + public function _initData() + { + $detail = new stdClass; + $detail->user_info_id = 0; + $detail->user_id = 0; + $detail->firstname = null; + $detail->lastname = null; + $detail->address = null; + $detail->zipcode = null; + $detail->city = null; + $detail->country_code = null; + $detail->state_code = null; + $detail->phone = null; + $detail->user_email = null; + $detail->is_company = null; + $detail->vat_number = null; + $detail->requesting_tax_exempt = 0; + $detail->tax_exempt = null; + $this->_data = $detail; + } + + public function store($data, $post) + { + $this->_loadData(); + $producthelper = productHelper::getInstance(); + $user = JFactory::getUser(); + $user_id = 0; + $user_info_id = 0; + $user_email = $post['user_email']; + + if ($user->id) + { + $user_id = $user->id; + $user_info_id = $this->_data->user_info_id; + $user_email = $user->email; + } + + $res = $this->getUserIdByEmail($user_email); + + if ($res > 0) + { + $user_id = $res->user_id; + $user_info_id = $res->users_info_id; + } + + $data['quotation_number'] = RedshopHelperQuotation::generateQuotationNumber(); + $data['user_id'] = $user_id; + $data['user_info_id'] = $user_info_id; + $data['user_email'] = $user_email; + $data['quotation_total'] = $data['total']; + $data['quotation_subtotal'] = $data['subtotal']; + $data['quotation_tax'] = $data['tax']; + $data['quotation_status'] = 1; + $data['quotation_cdate'] = time(); + $data['quotation_mdate'] = time(); + $data['quotation_note'] = $data['quotation_note']; + $data['quotation_ipaddress'] = $_SERVER ['REMOTE_ADDR']; + $data['quotation_encrkey'] = RedshopHelperQuotation::randomQuotationEncryptKey(); + $data['quotation_discount'] = (isset($data['discount2'])) ? $data['discount2'] : 0; + + $totalitem = $data['idx']; + $quotation_item = array(); + + $row = $this->getTable('quotation_detail'); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + for ($i = 0; $i < $totalitem; $i++) + { + $rowitem = $this->getTable('quotation_item_detail'); + $quotation_item[$i] = new stdClass; + $quotation_item[$i]->quotation_id = $row->quotation_id; + + if (isset($data[$i]['giftcard_id']) && $data[$i]['giftcard_id'] != 0) + { + $quotation_item[$i]->product_id = $data[$i]['giftcard_id']; + + $giftcardData = RedshopEntityGiftcard::getInstance($data[$i]['giftcard_id'])->getItem(); + + $quotation_item[$i]->is_giftcard = 1; + $quotation_item[$i]->product_name = $giftcardData->giftcard_name; + $section = 13; + } + else + { + $product = RedshopHelperProduct::getProductById($data[$i]['product_id']); + + $retAttArr = $producthelper->makeAttributeCart($data[$i]['cart_attribute'], $data[$i]['product_id'], 0, 0, $data[$i]['quantity']); + $cart_attribute = $retAttArr[0]; + + $retAccArr = $producthelper->makeAccessoryCart($data[$i]['cart_accessory'], $data[$i]['product_id']); + $cart_accessory = $retAccArr[0]; + + $quotation_item[$i]->product_id = $data[$i]['product_id']; + $quotation_item[$i]->is_giftcard = 0; + $quotation_item[$i]->product_name = $product->product_name; + $quotation_item[$i]->actualitem_price = $data[$i]['product_price']; + $quotation_item[$i]->product_price = $data[$i]['product_price']; + $quotation_item[$i]->product_excl_price = $data[$i]['product_price_excl_vat']; + $quotation_item[$i]->product_final_price = $data[$i]['product_price'] * $data[$i]['quantity']; + $quotation_item[$i]->product_attribute = $cart_attribute; + $quotation_item[$i]->product_accessory = $cart_accessory; + $quotation_item[$i]->product_wrapperid = $data[$i]['wrapper_id']; + $quotation_item[$i]->wrapper_price = $data[$i]['wrapper_price']; + + $section = 12; + } + + $quotation_item[$i]->product_quantity = $data[$i]['quantity']; + + if (!$rowitem->bind($quotation_item[$i])) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$rowitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + /** my accessory save in table start */ + if (count($data[$i]['cart_accessory']) > 0) + { + $attArr = $data [$i] ['cart_accessory']; + + for ($a = 0, $an = count($attArr); $a < $an; $a++) + { + $accessory_vat_price = 0; + $accessory_attribute = ""; + $accessory_id = $attArr[$a]['accessory_id']; + $accessory_name = $attArr[$a]['accessory_name']; + $accessory_price = $attArr[$a]['accessory_price']; + $accessory_org_price = $accessory_price; + + if ($accessory_price > 0) + { + $accessory_vat_price = RedshopHelperProduct::getProductTax($rowitem->product_id, $accessory_price); + } + + $attchildArr = $attArr[$a]['accessory_childs']; + + for ($j = 0, $jn = count($attchildArr); $j < $jn; $j++) + { + $attribute_id = $attchildArr[$j]['attribute_id']; + $accessory_attribute .= urldecode($attchildArr[$j]['attribute_name']) . ":
    "; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $accessory_id; + $rowattitem->section_name = $attchildArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 1; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + + $propArr = $attchildArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = RedshopHelperProduct::getProductTax($rowitem->product_id, $propArr[$k]['property_price']); + $property_id = $propArr[$k]['property_id']; + $accessory_attribute .= urldecode($propArr[$k]['property_name']) + . " (" . $propArr[$k]['property_oprand'] + . RedshopHelperProductPrice::formattedPrice($propArr[$k]['property_price'] + $section_vat) + . ")
    "; + $subpropArr = $propArr[$k]['property_childs']; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = RedshopHelperProduct::getProductTax($rowitem->product_id, $subpropArr[$l]['subproperty_price']); + $subproperty_id = $subpropArr[$l]['subproperty_id']; + $accessory_attribute .= urldecode($subpropArr[$l]['subproperty_name']) + . " (" . $subpropArr[$l]['subproperty_oprand'] + . RedshopHelperProductPrice::formattedPrice($subpropArr[$l]['subproperty_price'] + $section_vat) . ")
    "; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 1; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + + $accdata = $this->getTable('accessory_detail'); + + if ($accessory_id > 0) + { + $accdata->load($accessory_id); + } + + $accProductinfo = RedshopHelperProduct::getProductById($accdata->child_product_id); + $rowaccitem = $this->getTable('quotation_accessory_item'); + $rowaccitem->quotation_item_acc_id = 0; + $rowaccitem->quotation_item_id = $rowitem->quotation_item_id; + $rowaccitem->accessory_id = $accessory_id; + $rowaccitem->accessory_item_sku = $accProductinfo->product_number; + $rowaccitem->accessory_item_name = $accessory_name; + $rowaccitem->accessory_price = $accessory_org_price; + $rowaccitem->accessory_vat = $accessory_vat_price; + $rowaccitem->accessory_quantity = $rowitem->product_quantity; + $rowaccitem->accessory_item_price = $accessory_price; + $rowaccitem->accessory_final_price = ($accessory_price * $rowitem->product_quantity); + $rowaccitem->accessory_attribute = $accessory_attribute; + + if ($accessory_id > 0) + { + if (!$rowaccitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + + // My attribute save in table start + if (count($data[$i]['cart_attribute']) > 0) + { + $attArr = $data [$i] ['cart_attribute']; + + for ($j = 0, $jn = count($attArr); $j < $jn; $j++) + { + $attribute_id = $attArr[$j]['attribute_id']; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $attribute_id; + $rowattitem->section = "attribute"; + $rowattitem->parent_section_id = $rowitem->product_id; + $rowattitem->section_name = $attArr[$j]['attribute_name']; + $rowattitem->is_accessory_att = 0; + + if ($attribute_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $propArr = $attArr[$j]['attribute_childs']; + + for ($k = 0, $kn = count($propArr); $k < $kn; $k++) + { + $section_vat = RedshopHelperProduct::getProductTax($rowitem->product_id, $propArr[$k]['property_price']); + $property_id = $propArr[$k]['property_id']; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $property_id; + $rowattitem->section = "property"; + $rowattitem->parent_section_id = $attribute_id; + $rowattitem->section_name = $propArr[$k]['property_name']; + $rowattitem->section_price = $propArr[$k]['property_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $propArr[$k]['property_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($property_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + + $subpropArr = $propArr[$k]['property_childs']; + + for ($l = 0, $ln = count($subpropArr); $l < $ln; $l++) + { + $section_vat = RedshopHelperProduct::getProductTax($rowitem->product_id, $subpropArr[$l]['subproperty_price']); + $subproperty_id = $subpropArr[$l]['subproperty_id']; + + $rowattitem = $this->getTable('quotation_attribute_item'); + $rowattitem->quotation_att_item_id = 0; + $rowattitem->quotation_item_id = $rowitem->quotation_item_id; + $rowattitem->section_id = $subproperty_id; + $rowattitem->section = "subproperty"; + $rowattitem->parent_section_id = $property_id; + $rowattitem->section_name = $subpropArr[$l]['subproperty_name']; + $rowattitem->section_price = $subpropArr[$l]['subproperty_price']; + $rowattitem->section_vat = $section_vat; + $rowattitem->section_oprand = $subpropArr[$l]['subproperty_oprand']; + $rowattitem->is_accessory_att = 0; + + if ($subproperty_id > 0) + { + if (!$rowattitem->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + } + } + } + } + } + + RedshopHelperQuotation::manageQuotationUserField($data[$i], $rowitem->quotation_item_id, $section); + } + + return $row; + } + + public function usercreate($data) + { + $app = JFactory::getApplication(); + + // Get required system objects + $user = clone(JFactory::getUser()); + $authorize = JFactory::getACL(); + + $MailFrom = $app->get('mailfrom'); + $FromName = $app->get('fromname'); + + $usersConfig = JComponentHelper::getParams('com_users'); + $usersConfig->set('allowUserRegistration', 1); + + if ($usersConfig->get('allowUserRegistration') == '0') + { + JError::raiseError(403, JText::_('COM_REDSHOP_ACCESS_FORBIDDEN')); + + return; + } + + // Initialize new usertype setting + $newUsertype = $usersConfig->get('new_usertype'); + + if (!$newUsertype) + { + $newUsertype = 'Registered'; + } + + // Bind the post array to the user object + if (!$user->bind($app->input->post->getArray(), 'usertype')) + { + JError::raiseError(500, $user->getError()); + } + + // Set some initial user values + $user->set('id', 0); + $user->set('usertype', 'Registered'); + $user->set('gid', $authorize->get_group_id('', $newUsertype, 'ARO')); + + $date = JFactory::getDate(); + $user->set('registerDate', $date->toSql()); + + $useractivation = $usersConfig->get('useractivation'); + + if ($useractivation == '1') + { + JLoader::import('joomla.user.helper'); + + $user->set('block', '0'); + } + + if ($data['is_company'] == 1) + { + $tmp = @explode(" ", $data['contact_person']); + $name = @ $tmp[0] . ' ' . $tmp[1]; + $name = $app->input->get('username'); + } + else + { + $name = $app->input->get('firstname') . ' ' . $app->input->get('lastname'); + } + + $email = $app->input->get('email'); + + $password = \Redshop\Crypto\Helper\Encrypt::generateCustomRandomEncryptKey(12); + + // Disallow control chars in the email + $password = preg_replace('/[\x00-\x1F\x7F]/', '', $password); + + $user->password = md5($password); + $user->set('name', $name); + $user->name = $name; + + // If there was an error with registration, set the message and display form + if (!$user->save()) + { + JError::raiseWarning('', JText::_($user->getError())); + + return false; + } + + $user_id = $user->id; + $user->set('id', 0); + + if ($useractivation == 1) + { + $message = JText::_('COM_REDSHOP_REG_COMPLETE_ACTIVATE'); + } + else + { + $message = JText::_('COM_REDSHOP_REG_COMPLETE'); + } + + // Creating Joomla user end + $row = $this->getTable('user_detail'); + $row->user_id = $user_id; + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if ($data['is_company'] == 1) + { + if (Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_COMPANY') != 0) + { + $row->shopper_group_id = Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_COMPANY'); + } + else + { + $row->shopper_group_id = 2; + } + } + else + { + if (Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_PRIVATE') != 0) + { + $row->shopper_group_id = Redshop::getConfig()->get('SHOPPER_GROUP_DEFAULT_PRIVATE'); + } + else + { + $row->shopper_group_id = 1; + } + } + + if ($data['is_company'] == 1) + { + $tmp = explode(" ", $data['contact_person']); + $row->firstname = $tmp[0]; + $row->lastname = $tmp[1]; + } + + $row->user_email = $user->email; + $row->address_type = 'BT'; + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $email = $user->email; + + $session = JFactory::getSession(); + $cart = $session->get('cart'); + + $cart['user_id'] = $user_id; + $user_data = RedshopHelperUser::getUserInformation($user_id); + $cart['user_info_id'] = $user_data->users_info_id; + $quotationDetail = $this->store($cart); + + $quotation_id = $quotationDetail->quotation_id; + $quotationdetailurl = JURI::root() . 'index.php?option=com_redshop&view=quotation_detail&quoid=' . $quotation_id . '&encr=' . $quotationDetail->quotation_encrkey; + + $mailbody = ''; + $mailbody .= ''; + $mailbody .= ''; + $mailbody .= ''; + $mailbody .= '
    ' . JText::_('COM_REDSHOP_USERNAME') . ' : ' . $data['username'] . '
    ' . JText::_('COM_REDSHOP_PASSWORD') . ' : ' . $password . '
    ' . JText::_('COM_REDSHOP_QUOTATION_DETAILS') . ' : ' . JText::_("COM_REDSHOP_QUOTATION_DETAILS") . '
    '; + $mailsubject = 'Register'; + $mailbcc = null; + $mailinfo = Redshop\Mail\Helper::getTemplate(0, "quotation_user_register"); + + if (count($mailinfo) > 0) + { + $mailbody = $mailinfo[0]->mail_body; + $mailsubject = $mailinfo[0]->mail_subject; + + if (trim($mailinfo[0]->mail_bcc) != "") + { + $mailbcc = explode(",", $mailinfo[0]->mail_bcc); + } + } + + $this->sendQuotationMail($quotationDetail->quotation_id); + + $link = "" . JText::_("COM_REDSHOP_QUOTATION_DETAILS") . ""; + + $mailbody = str_replace('{link}', $link, $mailbody); + $mailbody = str_replace('{username}', $name, $mailbody); + $mailbody = str_replace('{password}', $name, $mailbody); + Redshop\Mail\Helper::imgInMail($mailbody); + + JFactory::getMailer()->sendMail($MailFrom, $FromName, $email, $mailsubject, $mailbody, 1, null, $mailbcc); + + $session = JFactory::getSession(); + RedshopHelperCartSession::setCart(null); + $session->set('ccdata', null); + $session->set('issplit', null); + $session->set('userfield', null); + unset ($_SESSION ['ccdata']); + + return; + } + + public function sendQuotationMail($quotationId) + { + return Redshop\Mail\Quotation::sendMail($quotationId); + } + + /** + * @param string $email Email + * + * @return null|stdClass + */ + public function getUserIdByEmail($email) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select('*') + ->from($db->quoteName('#__redshop_users_info')) + ->where($db->quoteName('user_email') . ' = ' . $db->quote($email)) + ->where($db->quoteName('address_type') . ' = ' . $db->quote('BT')); + + return $db->setQuery($query)->loadObject(); + } +} diff --git a/component/site/models/quotation_detail.php b/component/site/models/quotation_detail.php new file mode 100644 index 00000000000..d1ff9ade901 --- /dev/null +++ b/component/site/models/quotation_detail.php @@ -0,0 +1,250 @@ +_table_prefix = '#__redshop_'; + } + + public function checkAuthorization($quoid, $encr) + { + $query = "SELECT COUNT(quotation_id) FROM " . $this->_table_prefix . "quotation " + . "WHERE quotation_id = " . (int) $quoid . " " + . "AND quotation_encrkey LIKE " . $this->_db->quote($encr); + $this->_db->setQuery($query); + $record = $this->_db->loadResult(); + + return $record; + } + + public function addtocart($data = array()) + { + $session = JFactory::getSession(); + + $carthelper = rsCarthelper::getInstance(); + $producthelper = productHelper::getInstance(); + + $cart = $session->get('cart'); + + $idx = (int) ($cart['idx']); + + $row_data = RedshopHelperQuotation::getQuotationUserField($data->quotation_item_id); + $quotation_acc_data = RedshopHelperQuotation::getQuotationItemAccessoryDetail($data->quotation_item_id); + $quotation_att_data = RedshopHelperQuotation::getQuotationItemAttributeDetail($data->quotation_item_id, 0, "attribute", $data->product_id); + + // Set session for giftcard + if ($data->is_giftcard == 1) + { + if ($carthelper->rs_recursiveArraySearch($cart, $data->product_id)) + { + $cart[$idx]['quantity'] += 1; + RedshopHelperCartSession::setCart($cart); + + return; + } + else + { + $cart[$idx]['quantity'] = 1; + } + + $cart[$idx]['quantity'] = $data->product_quantity; + $cart[$idx]['giftcard_id'] = $data->product_id; + $cart[$idx]['product_price'] = $data->product_price; + $cart[$idx]['product_vat'] = 0; + $cart[$idx]['product_id'] = ''; + $cart['discount_type'] = 0; + $cart['discount'] = 0; + $cart['discount2'] = 0; + $cart['reciver_email'] = ''; + $cart['reciver_name'] = ''; + + for ($i = 0, $in = count($row_data); $i < $in; $i++) + { + $field_name = $row_data[$i]->field_name; + $cart[$idx][$field_name] = $row_data[$i]->data_txt; + } + + $cart['idx'] = $idx + 1; + RedshopHelperCartSession::setCart($cart); + + return; + } + + $cart[$idx]['product_id'] = $data->product_id; + $cart[$idx]['product_price'] = $data->product_price; + $cart[$idx]['quantity'] = $data->product_quantity; + + if ($data->product_excl_price) + { + $getprotax = $producthelper->getProductTax($cart[$idx]['product_id'], $data->product_excl_price); + $cart[$idx]['product_price'] = $data->product_excl_price + $getprotax; + $cart[$idx]['product_price'] += $data->wrapper_price; + $cart[$idx]['product_subtotal'] = $cart[$idx]['quantity'] * $cart[$idx]['product_price']; + } + + $generateAccessoryCart = array(); + + for ($i = 0, $in = count($quotation_acc_data); $i < $in; $i++) + { + $generateAccessoryCart[$i]['accessory_id'] = $quotation_acc_data[$i]->accessory_id; + $generateAccessoryCart[$i]['accessory_name'] = $quotation_acc_data[$i]->accessory_item_name; + $generateAccessoryCart[$i]['accessory_oprand'] = "+"; + $generateAccessoryCart[$i]['accessory_price'] = $quotation_acc_data[$i]->accessory_price; + + $acc_att_data = RedshopHelperQuotation::getQuotationItemAttributeDetail($data->quotation_item_id, 1, "attribute", $quotation_acc_data[$i]->accessory_id); + + $accAttributeCart = array(); + + for ($ia = 0, $countAccessoryAttribute = count($acc_att_data); $ia < $countAccessoryAttribute; $ia++) + { + $accPropertyCart = array(); + $accAttributeCart[$ia]['attribute_id'] = $acc_att_data[$ia]->section_id; + $accAttributeCart[$ia]['attribute_name'] = $acc_att_data[$ia]->section_name; + + $acc_prop_data = RedshopHelperQuotation::getQuotationItemAttributeDetail($data->quotation_item_id, 1, "property", $acc_att_data[$ia]->section_id); + + for ($ip = 0, $countAccessoryProperty = count($acc_prop_data); $ip < $countAccessoryProperty; $ip++) + { + $accSubpropertyCart = array(); + $accPropertyCart[$ip]['property_id'] = $acc_prop_data[$ip]->section_id; + $accPropertyCart[$ip]['property_name'] = $acc_prop_data[$ip]->section_name; + $accPropertyCart[$ip]['property_oprand'] = $acc_prop_data[$ip]->section_oprand; + + $acc_subpro_data = RedshopHelperQuotation::getQuotationItemAttributeDetail($data->quotation_item_id, 1, "subproperty", $acc_prop_data[$ip]->section_id); + $countAccessorySubroperty = count($acc_subpro_data); + + for ($isp = 0; $isp < $countAccessorySubroperty; $isp++) + { + $accSubpropertyCart[$isp]['subproperty_id'] = $acc_subpro_data[$isp]->section_id; + $accSubpropertyCart[$isp]['subproperty_name'] = $acc_subpro_data[$isp]->section_name; + $accSubpropertyCart[$isp]['subproperty_oprand'] = $acc_subpro_data[$isp]->section_oprand; + } + + $accPropertyCart[$ip]['property_childs'] = $accSubpropertyCart; + } + + $accAttributeCart[$ia]['attribute_childs'] = $accPropertyCart; + } + + $generateAccessoryCart[$i]['accessory_childs'] = $accAttributeCart; + } + + $generateAttributeCart = array(); + + for ($ia = 0, $countQuotationAtrribute = count($quotation_att_data); $ia < $countQuotationAtrribute; $ia++) + { + $accPropertyCart = array(); + $generateAttributeCart[$ia]['attribute_id'] = $quotation_att_data[$ia]->section_id; + $generateAttributeCart[$ia]['attribute_name'] = $quotation_att_data[$ia]->section_name; + + $acc_prop_data = RedshopHelperQuotation::getQuotationItemAttributeDetail($data->quotation_item_id, 0, "property", $quotation_att_data[$ia]->section_id); + $countQuotationProperty = count($acc_prop_data); + + for ($ip = 0; $ip < $countQuotationProperty; $ip++) + { + $accSubpropertyCart = array(); + $accPropertyCart[$ip]['property_id'] = $acc_prop_data[$ip]->section_id; + $accPropertyCart[$ip]['property_name'] = $acc_prop_data[$ip]->section_name; + $accPropertyCart[$ip]['property_oprand'] = $acc_prop_data[$ip]->section_oprand; + + $acc_subpro_data = RedshopHelperQuotation::getQuotationItemAttributeDetail($data->quotation_item_id, 0, "subproperty", $acc_prop_data[$ip]->section_id); + $countQuotationSubproperty = count($acc_subpro_data); + + for ($isp = 0; $isp < $countQuotationSubproperty; $isp++) + { + $accSubpropertyCart[$isp]['subproperty_id'] = $acc_subpro_data[$isp]->section_id; + $accSubpropertyCart[$isp]['subproperty_name'] = $acc_subpro_data[$isp]->section_name; + $accSubpropertyCart[$isp]['subproperty_oprand'] = $acc_subpro_data[$isp]->section_oprand; + } + + $accPropertyCart[$ip]['property_childs'] = $accSubpropertyCart; + } + + $generateAttributeCart[$ia]['attribute_childs'] = $accPropertyCart; + } + + $cart[$idx]['cart_attribute'] = $generateAttributeCart; + $cart[$idx]['cart_accessory'] = $generateAccessoryCart; + $cart[$idx]['wrapper_id'] = $data->product_wrapperid; + $cart[$idx]['wrapper_price'] = $data->wrapper_price; + $cart[$idx]['product_price_excl_vat'] = $data->product_excl_price; + + $cart['idx'] = $idx + 1; + + for ($i = 0, $in = count($row_data); $i < $in; $i++) + { + $field_name = $row_data[$i]->field_name; + $cart[$idx][$field_name] = $row_data[$i]->data_txt; + } + + RedshopHelperCartSession::setCart($cart); + } + + public function modifyQuotation($user_id = 0) + { + $session = JFactory::getSession(); + $carthelper = rsCarthelper::getInstance(); + $cart = $session->get('cart'); + + $cart = \Redshop\Cart\Cart::modify($cart, $user_id); + + RedshopHelperCartSession::setCart($cart); + $carthelper->cartFinalCalculation(false); + } + + /** + * Add Quotation Detail Customer note + * + * @param array $data Quotation Detail Post Data + * + * @return void + */ + public function addQuotationCustomerNote($data) + { + // Initialize variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + // Create the base update statement. + $query->update($db->quoteName('#__redshop_quotation')) + ->set($db->quoteName('quotation_customer_note') . ' = ' . $db->quote($data['quotation_customer_note'])) + ->where($db->quoteName('quotation_id') . ' = ' . (int) $data['quotation_id']); + + // Set the query and execute the update. + $db->setQuery($query); + + try + { + $db->execute(); + } + catch (RuntimeException $e) + { + throw new RuntimeException($e->getMessage(), $e->getCode()); + } + } +} diff --git a/component/site/models/ratings.php b/component/site/models/ratings.php new file mode 100644 index 00000000000..b0080ccf326 --- /dev/null +++ b/component/site/models/ratings.php @@ -0,0 +1,95 @@ +_table_prefix = '#__redshop_'; + + $limit = $app->getUserStateFromRequest('limit', 'limit', $app->getCfg('list_limit'), 0); + $limitstart = $app->getUserStateFromRequest('limitstart', 'limitstart', 0); + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + public function _buildQuery() + { + $query = "SELECT distinct(p.product_id),p.product_name FROM " . $this->_table_prefix . "product p" + . ", " . $this->_table_prefix . "product_rating AS r " + . "WHERE p.published=1 AND r.published=1 AND p.product_id=r.product_id "; + + return $query; + } + + public function getData() + { + if (empty($this->_data)) + { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_data; + } + + public function getTotal() + { + if (empty($this->_total)) + { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + + return $this->_total; + } + + public function getPagination() + { + if (empty($this->_pagination)) + { + JLoader::import('joomla.html.pagination'); + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + public function getProductreviews($pid) + { + $query = "SELECT pr.*,uf.firstname,uf.lastname FROM " . $this->_table_prefix . "product_rating as pr" + . ", " . $this->_table_prefix . "users_info as uf " + . "WHERE published=1 AND product_id = " . (int) $pid . " " + . "AND uf.address_type LIKE 'BT' AND pr.userid=uf.user_id " + . "ORDER BY favoured DESC"; + $this->_db->setQuery($query); + $this->_data = $this->_db->loadObjectlist(); + + return $this->_data; + } +} diff --git a/component/site/models/registration.php b/component/site/models/registration.php new file mode 100644 index 00000000000..1d1aa28891c --- /dev/null +++ b/component/site/models/registration.php @@ -0,0 +1,57 @@ +_table_prefix = '#__redshop_'; + } + + public function store(&$data) + { + $captcha = Redshop\Helper\Utility::checkCaptcha($data); + + if (!$captcha) + { + return false; + } + + $joomlauser = RedshopHelperJoomla::createJoomlaUser($data, 1); + + if (!$joomlauser) + { + return false; + } + + $data['billisship'] = 1; + $reduser = RedshopHelperUser::storeRedshopUser($data, $joomlauser->id); + + return $reduser; + } +} diff --git a/component/site/models/search.php b/component/site/models/search.php new file mode 100644 index 00000000000..b6dbaa04bc4 --- /dev/null +++ b/component/site/models/search.php @@ -0,0 +1,1538 @@ +getMenu(); + $item = $menu->getActive(); + $layout = $app->getUserStateFromRequest($this->context . '.layout', 'layout', 'default'); + $this->setState('layout', $layout); + + $templateid = $app->getUserStateFromRequest($this->context . '.templateid', 'templateid', ''); + + $cid = 0; + + if ($layout == 'newproduct') + { + $result = $item->query['template_id']; + + if ($result != 0) + { + $templateid = $result; + } + else + { + $cid = $item->query['categorytemplate']; + } + } + elseif ($layout == 'productonsale') + { + $cid = $item->params->get('categorytemplate'); + } + + if ($layout == 'productonsale' || $layout == 'featuredproduct') + { + $result = $item->params->get('template_id'); + + if ($result != 0) + { + $templateid = $result; + $cid = 0; + } + } + + if ($templateid == "" && JModuleHelper::isEnabled('redPRODUCTFILTER')) + { + $module = JModuleHelper::getModule('redPRODUCTFILTER'); + $module_params = new Registry($module->params); + + if ($module_params->get('filtertemplate') != "") + { + $templateid = $module_params->get('filtertemplate'); + } + } + + $this->setState('templateid', $templateid); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('c.template AS category_template, t.*') + ->from($db->qn('#__redshop_template', 't')) + ->leftJoin($db->qn('#__redshop_category', 'c') . ' ON t.id = c.template') + ->where('t.section = ' . $db->q('category')) + ->where('t.published = 1'); + + if ($cid != 0) + { + $query->where('c.id = ' . (int) $cid); + } + + if ($templateid != 0) + { + $query->where('t.id = ' . (int) $templateid); + } + + $templateDesc = null; + + if ($template = $db->setQuery($query)->loadObject()) + { + $templateDesc = RedshopHelperTemplate::readTemplateFile($template->section, $template->file_name); + } + + $this->setState('templateDesc', $templateDesc); + $limit = 0; + + if ($module = JModuleHelper::getModule('redshop_search')) + { + $module_params = new Registry($module->params); + $perpageproduct = $module_params->get('productperpage', 5); + } + else + { + $perpageproduct = 5; + } + + if (!strstr($templateDesc, "{show_all_products_in_category}") + && strstr($templateDesc, "{pagination}") + && strstr($templateDesc, "perpagelimit:") + ) + { + $perpage = explode('{perpagelimit:', $templateDesc); + $perpage = explode('}', $perpage[1]); + $limit = intval($perpage[0]); + } + else + { + $limit = $app->getUserStateFromRequest($this->context . '.limit', 'limit', $limit, 'int'); + + if (!$limit && $perpageproduct != 0 && $perpageproduct != '' && $layout == 'default') + { + $limit = $perpageproduct; + } + elseif (!$limit && $layout == 'productonsale') + { + $limit = $params->get('productlimit', 5); + } + elseif (!$limit) + { + $limit = Redshop::getConfig()->get('MAXCATEGORY'); + } + } + + $productlimit = 0; + + if (isset($item->query['productlimit'])) + { + $productlimit = $item->query['productlimit']; + } + + $filter = $app->input->post->get('redform', array(), 'filter'); + $this->setState('filter.data', $filter); + + $orderBy = $app->input->getString('order_by', ''); + $this->setState('order_by', $orderBy); + $this->setState('template_id', isset($filter['template_id']) ? $filter['template_id'] : null); + + $this->setState('productperpage', $perpageproduct); + $this->setState('list.limit', $limit); + $productlimit = $app->getUserStateFromRequest($this->context . '.productlimit', 'productlimit', $productlimit, 8); + $this->setState('productlimit', $productlimit); + + $value = $app->input->get('limitstart', 0, 'int'); + $limitstart = ($limit != 0 ? (floor($value / $limit) * $limit) : 0); + $this->setState('list.start', $limitstart); + + $keyword = $app->getUserStateFromRequest($this->context . '.keyword', 'keyword', ''); + $this->setState('keyword', $keyword); + } + + /** + * Method to get a store id based on the model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id An identifier string to generate the store id. + * + * @return string A store id. + * + * @since 1.5 + */ + protected function getStoreId($id = '') + { + // Add the list state to the store id. + $id .= ':' . $this->getState('productperpage'); + $id .= ':' . $this->getState('productlimit'); + $id .= ':' . $this->getState('templateid'); + $id .= ':' . $this->getState('keyword'); + $id .= ':' . $this->getState('layout'); + + return md5($this->context . ':' . $id); + } + + /** + * Method to get the starting number of items for the data set. + * + * @return integer The starting number of items available in the data set. + * + * @since 1.5 + */ + public function getStart() + { + $store = $this->getStoreId('getstart'); + + // Try to load the data from internal storage. + if (isset($this->cache[$store])) + { + return $this->cache[$store]; + } + + $start = $this->getState('list.start'); + $limit = $this->getState('list.limit'); + $total = $this->getTotal(); + + if ($start > $total - $limit) + { + $start = max(0, (int) (ceil($total / $limit) - 1) * $limit); + } + + // Add the total to the internal cache. + $this->cache[$store] = $start; + + return $this->cache[$store]; + } + + /** + * Method to get an array of data items. + * + * @return mixed An array of data items on success, false on failure. + * + * @since 1.5 + */ + public function getData() + { + // Get a storage key. + $store = $this->getStoreId(); + + // Try to load the data from internal storage. + if (isset($this->cache[$store])) + { + return $this->cache[$store]; + } + + $post = JFactory::getApplication()->input->post->getArray(); + $db = JFactory::getDbo(); + $items = array(); + $query = $this->_buildQuery($post); + $templateDesc = $this->getState('templateDesc'); + + if ($templateDesc) + { + if (strstr($templateDesc, "{show_all_products_in_category}")) + { + $db->setQuery($query); + } + elseif (strstr($templateDesc, "{pagination}") || $this->getState('productlimit') > 0) + { + $db->setQuery($query, $this->getStart(), $this->getState('list.limit')); + } + else + { + $db->setQuery($query); + } + } + else + { + $db->setQuery($query); + } + + if ($productIds = $db->loadColumn()) + { + // Third steep get all product relate info + $query->clear() + ->where('p.product_id IN (' . implode(',', $productIds) . ')') + ->order('FIELD(p.product_id, ' . implode(',', $productIds) . ')'); + + $user = JFactory::getUser(); + $query = RedshopHelperProduct::getMainProductQuery($query, $user->id) + ->select( + array( + 'pc.ordering', 'c.*', 'm.*', + 'CONCAT_WS(' . $db->q('.') . ', p.product_id, ' . (int) $user->id . ') AS concat_id' + ) + ) + ->select($db->qn('c.id', 'category_id')) + ->select($db->qn('c.name', 'category_name')) + ->leftJoin('#__redshop_category AS c ON c.id = pc.category_id') + ->leftJoin('#__redshop_manufacturer AS m ON m.id = p.manufacturer_id'); + + if ($products = $db->setQuery($query)->loadObjectList('concat_id')) + { + RedshopHelperProduct::setProduct($products); + $items = array_values($products); + } + } + + $this->preprocessData($this->context, $items); + + // Add the items to the internal cache. + $this->cache[$store] = $items; + + return $this->cache[$store]; + } + + /** + * Method to get the total number of items for the data set. + * + * @return integer The total number of items available in the data set. + * + * @since 1.5 + */ + public function getTotal() + { + // Get a storage key. + $store = $this->getStoreId('getTotal'); + + // Try to load the data from internal storage. + if (isset($this->cache[$store])) + { + return $this->cache[$store]; + } + + $productlimit = $this->getState('productlimit'); + $layout = $this->getState('layout', 'default'); + + $db = JFactory::getDbo(); + $total = $db->setQuery($this->_buildQuery(0, true)) + ->loadResult(); + + if ($layout == 'newproduct' || $layout == 'productonsale') + { + if ($total > $productlimit && $productlimit != "") + { + $total = $productlimit; + } + } + + // Add the total to the internal cache. + $this->cache[$store] = $total; + + return $this->cache[$store]; + } + + /** + * Get Search Condition + * + * @param array|string $fields Fields + * @param array|string $condition Condition + * @param string $glue Glue + * + * @return string + */ + public function getSearchCondition($fields, $condition, $glue = 'OR') + { + if (empty($condition)) + { + return '1 = 1'; + } + + $where = array(); + $db = JFactory::getDbo(); + $conditions = explode(' ', trim($condition)); + + foreach ((array) $fields as $field) + { + $glueOneField = array(); + + foreach ((array) $conditions as $con) + { + $con = trim($con); + + if ($con != '') + { + $glueOneField[] = $db->qn($field) . ' LIKE ' . $db->quote($con . '%'); + } + } + + $where[] = '(' . implode(' AND ', $glueOneField) . ')'; + + // Full condition + $where[] = $db->qn($field) . ' LIKE ' . $db->quote('%' . $condition . '%'); + } + + if (!empty($where)) + { + return '(' . implode(' ' . $glue . ' ', $where) . ')'; + } + else + { + return '1 = 1'; + } + } + + /** + * Build query + * + * @param int|array $manudata Post request + * @param bool $getTotal Get total product(true) or product data(false) + * + * @return JDatabaseQuery + */ + public function _buildQuery($manudata = 0, $getTotal = false) + { + $app = JFactory::getApplication(); + $input = $app->input; + $db = JFactory::getDbo(); + + $orderByMethod = $input->getString( + 'order_by', + $app->getParams()->get('order_by', Redshop::getConfig()->get('DEFAULT_PRODUCT_ORDERING_METHOD')) + ); + $orderByObj = RedshopHelperUtility::prepareOrderBy(urldecode($orderByMethod)); + $orderBy = $orderByObj->ordering . ' ' . $orderByObj->direction; + + if ($getTotal) + { + $query = $db->getQuery(true) + ->select('COUNT(DISTINCT(p.product_id))'); + } + else + { + $query = $db->getQuery(true) + ->select('DISTINCT(p.product_id)') + ->leftJoin($db->qn('#__redshop_manufacturer', 'm') . ' ON m.id = p.manufacturer_id') + ->order($db->escape($orderBy)); + } + + $query->from($db->qn('#__redshop_product', 'p')) + ->leftJoin($db->qn('#__redshop_product_category_xref', 'pc') . ' ON pc.product_id = p.product_id') + ->where('p.published = 1'); + + $layout = $input->getString('layout', 'default'); + $manufacture_id = $input->getInt('manufacture_id', 0); + $cat_group = array(); + $customField = $input->get('custom_field', array(), 'array'); + + if ($category_id = $input->get('category_id', 0)) + { + $cat = RedshopHelperCategory::getCategoryListArray(0, $category_id); + + for ($j = 0, $countCat = count($cat); $j < $countCat; $j++) + { + $cat_group[$j] = $cat[$j]->category_id; + + if ($j == count($cat) - 1) + { + $cat_group[$j + 1] = $category_id; + } + } + + $cat_group = ArrayHelper::toInteger($cat_group); + + if (!empty($cat_group)) + { + $cat_group = join(',', $cat_group); + } + else + { + $cat_group = $category_id; + } + } + + $menu = $app->getMenu(); + $item = $menu->getActive(); + $days = isset($item->query['newproduct']) ? $item->query['newproduct'] : 0; + $today = date('Y-m-d H:i:s', time()); + $days_before = date('Y-m-d H:i:s', time() - ($days * 60 * 60 * 24)); + $aclProducts = productHelper::getInstance()->loadAclProducts(); + + // Shopper group - choose from manufactures Start + $shopper_group_manufactures = RedshopHelperShopper_Group::getShopperGroupManufacturers(); + + if ($shopper_group_manufactures != "") + { + // Sanitize ids + $manufacturerIds = explode(',', $shopper_group_manufactures); + $manufacturerIds = ArrayHelper::toInteger($manufacturerIds); + + $query->where('p.manufacturer_id IN (' . implode(',', $manufacturerIds) . ')'); + } + + if (!empty($customField)) + { + $key = 0; + $subQuery = array(); + + foreach ($customField as $fieldId => $fieldValue) + { + if (empty($fieldValue)) + { + continue; + } + + $subQuery[] = 'FIND_IN_SET("' . $fieldValue . '", ' . $db->qn('fd' . $key . '.data_txt') . ')'; + + $query->leftJoin( + $db->qn('#__redshop_fields_data', 'fd' . $key) + . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('fd' . $key . '.itemid') + ) + ->where($db->qn('fd' . $key . '.fieldid') . ' = ' . $db->q((int) $fieldId)); + $key++; + } + + if (!empty($subQuery)) + { + $query->where('(' . implode(' OR ', $subQuery) . ')'); + } + } + + // Shopper group - choose from manufactures End + if ($aclProducts != "") + { + // Sanitize ids + $productIds = explode(',', $aclProducts); + $productIds = ArrayHelper::toInteger($productIds); + + $query->where('p.product_id IN (' . implode(',', $productIds) . ')'); + } + + $excludeCategories = $app->input->getString('excludeCategories', ''); + + if (!empty($excludeCategories)) + { + $excludeCategories = explode(',', $excludeCategories); + $excludeCategories = ArrayHelper::toInteger($excludeCategories); + $query->where('pc.category_id NOT IN (' . implode(',', $excludeCategories) . ')'); + } + + if ($layout == 'productonsale') + { + $categoryid = $item->params->get('categorytemplate'); + + if ($categoryid) + { + $catMain = RedshopHelperCategory::getCategoryTree($categoryid); + $catGroupMain = array(); + + foreach ($catMain as $row) + { + $catGroupMain[] = $row->id; + } + + $catGroupMain[] = $categoryid; + $catGroupMain = ArrayHelper::toInteger($catGroupMain); + + $query->where('pc.category_id IN (' . implode(',', $catGroupMain) . ')'); + } + + $query->where( + array( + 'p.product_on_sale = 1', + 'p.expired = 0', + 'p.product_parent_id = 0', + 'UNIX_TIMESTAMP() BETWEEN p.discount_stratdate AND p.discount_enddate', + 'p.discount_price > 0' + ) + ); + } + elseif ($layout == 'featuredproduct') + { + $query->where('p.product_special = 1'); + } + elseif ($layout == 'newproduct') + { + $categoryid = $item->params->get('categorytemplate'); + + if ($categoryid) + { + $catMain = RedshopHelperCategory::getCategoryTree($categoryid); + $catGroupMain = array(); + + foreach ($catMain as $row) + { + $catGroupMain[] = $row->id; + } + + $catGroupMain[] = $categoryid; + $catGroupMain = ArrayHelper::toInteger($catGroupMain); + + $query->where('pc.category_id IN (' . implode(',', $catGroupMain) . ')'); + } + + $query->where('p.publish_date BETWEEN ' . $db->quote($days_before) . ' AND ' . $db->quote($today)) + ->where('p.expired = 0') + ->where('p.product_parent_id = 0'); + } + elseif ($layout == 'redfilter') + { + $query->where('p.expired = 0'); + + // Get products for filtering + if ($products = $this->getRedFilterProduct()) + { + // Sanitize ids + $productIds = explode(',', $products); + $productIds = ArrayHelper::toInteger($productIds); + + $query->where('p.product_id IN ( ' . implode(',', $productIds) . ')'); + } + } + else + { + $keyword = $this->getState('keyword'); + $defaultSearchType = $app->input->getCmd('search_type', 'product_name'); + + if (!empty($manudata['search_type'])) + { + $defaultSearchType = $manudata['search_type']; + } + + switch ($defaultSearchType) + { + case 'name_number': + $query->where($this->getSearchCondition(array('p.product_name', 'p.product_number'), $keyword)); + break; + case 'name_desc': + $query->where($this->getSearchCondition(array('p.product_name', 'p.product_desc', 'p.product_s_desc'), $keyword)); + break; + case 'virtual_product_num': + $query->where($this->getSearchCondition(array('pap.property_number', 'ps.subattribute_color_number'), $keyword)); + break; + case 'name_number_desc': + $query->where( + $this->getSearchCondition( + array( + 'p.product_name', 'p.product_number', 'p.product_desc', 'p.product_s_desc', 'pap.property_number', + 'ps.subattribute_color_number' + ), + $keyword + ) + ); + break; + case 'product_desc': + $query->where($this->getSearchCondition(array('p.product_s_desc', 'p.product_desc'), $keyword)); + break; + case 'product_name': + $query->where($this->getSearchCondition('p.product_name', $keyword)); + break; + case 'product_number': + $query->where($this->getSearchCondition('p.product_number', $keyword)); + break; + } + + if ($manufacture_id == 0) + { + if (!empty($manudata['manufacturer_id'])) + { + $manufacture_id = $manudata['manufacturer_id']; + } + } + + if ($defaultSearchType == "name_number_desc" || $defaultSearchType == "virtual_product_num") + { + $query->leftJoin($db->qn('#__redshop_product_attribute', 'a') . ' ON a.product_id = p.product_id') + ->leftJoin($db->qn('#__redshop_product_attribute_property', 'pap') . ' ON pap.attribute_id = a.attribute_id') + ->leftJoin($db->qn('#__redshop_product_subattribute_color', 'ps') . ' ON ps.subattribute_id = pap.property_id'); + } + + $query->where('p.expired = 0'); + + if ($category_id != 0) + { + // Sanitize ids + $cat_group = explode(',', $cat_group); + $cat_group = ArrayHelper::toInteger($cat_group); + + $query->where('pc.category_id IN (' . implode(',', $cat_group) . ')'); + } + + if ($manufacture_id != 0) + { + $query->where('p.manufacturer_id = ' . (int) $manufacture_id); + } + } + + return $query; + } + + /** + * Red Product Filter + */ + public function getRedFilterProduct($remove = 0) + { + // Get seeion filter data + + $session = JSession::getInstance('none', array()); + + // Get filter types and tags + $getredfilter = $session->get('redfilter'); + + $app = JFactory::getApplication(); + + $type_id_main = explode('.', $app->input->get('tagid')); + + // Initialise variables + $lstproduct_id = array(); + $lasttypeid = 0; + $lasttagid = 0; + $productid = 0; + $products = ""; + + if (!empty($getredfilter)) + { + $main_sal_sp = array(); + $main_sal_type = array(); + $main_sal_tag = array(); + + if ($app->input->get('main_sel') != "") + { + $main_sal_sp = explode(",", $app->input->get('main_sel')); + + for ($f = 0, $fn = count($main_sal_sp); $f < $fn; $f++) + { + if ($main_sal_sp[$f] != "") + { + $main_typeid = explode(".", $main_sal_sp[$f]); + $main_sal_type[] = $main_typeid[1]; + $main_sal_tag[] = $main_typeid[0]; + } + } + } + + $q = "SELECT a.product_id + FROM #__redproductfinder_association_tag AS ta + LEFT JOIN #__redproductfinder_associations AS a ON a.id = ta.association_id + LEFT JOIN #__redshop_product AS p ON p.product_id = a.product_id + LEFT JOIN #__redshop_product_category_xref x ON x.product_id = a.product_id "; + + for ($i = 0, $in = count($main_sal_type); $i < $in; $i++) + { + if ($i != 0) + { + $q .= " LEFT JOIN #__redproductfinder_association_tag AS t" . $i . " ON t" . $i . ".association_id=ta.association_id "; + } + } + + $q .= "where ( "; + $dep_cond = array(); + + for ($i = 0, $in = count($main_sal_type); $i < $in; $i++) + { + $chk_q = ""; + + // Search for checkboxes + if ($i != 0) + { + $chk_q .= "t" . $i . ".tag_id='" . (int) $main_sal_tag[$i] . "' "; + } + else + { + $chk_q .= "ta.tag_id='" . (int) $main_sal_tag[$i] . "' "; + } + + if ($chk_q != "") + { + $dep_cond[] = " ( " . $chk_q . " ) "; + } + } + + if (count($dep_cond) <= 0) + { + $dep_cond[] = "1=1"; + } + + $q .= implode(" AND ", $dep_cond); + + $q .= ") AND p.published = '1' AND x.category_id = " . (int) JRequest::getInt('cid', 0) . " order by p.product_name "; + $product = $this->_getList($q); + + for ($i = 0, $in = count($product); $i < $in; $i++) + { + $lstproduct_id[] = $product[$i]->product_id; + } + + $products = implode(",", $lstproduct_id); + } + else + { + $session->set('redfilterproduct', array()); + } + + return $products; + } + + public function mod_redProductfilter($Itemid) + { + $db = JFactory::getDbo(); + $query = "SELECT t.*, f.formname AS form_name FROM #__redproductfinder_types t + LEFT JOIN #__redproductfinder_forms f + ON t.form_id = f.id + ORDER BY ordering"; + + $types = $this->_getList($query); + $session = JSession::getInstance('none', array()); + + $getredfilter = $session->get('redfilter'); + + $redfilterproduct = $session->get('redfilterproduct'); + + $redproducttotal = count($redfilterproduct); + + foreach ($types as $key => $type) + { + if (@!array_key_exists($type->id, $getredfilter)) + { + $str = htmlentities($type->type_name, ENT_COMPAT, "UTF-8"); + $str = preg_replace('/&([a-zA-Z])(uml|acute|grave|circ|tilde|elig|slash|ring);/', '$1', $str); + $str = str_replace(' ', '', $str); + $types[$key]->type_name_css = html_entity_decode($str); + + $id = $type->id; + $all = 1; + $productids = ""; + + if (count($getredfilter) > 0 && $all == 1) + { + $type_id = array(); + $tag_id = array(); + + $k = 0; + + foreach ($getredfilter as $typeid => $tags) + { + $type_id[] = $typeid; + $tags = explode(".", $tags); + $tag_id[] = $tags[0]; + + if (count($getredfilter) - 1 == $k) + { + $lasttypeid = $typeid; + $lasttagid = $tags[0]; + } + + $k++; + } + + $typeids = implode(",", $type_id); + $tagids = implode(",", $tag_id); + + $query = "SELECT ra.product_id FROM `#__redproductfinder_association_tag` as rat + LEFT JOIN #__redproductfinder_associations as ra ON rat.`association_id` = ra.id + WHERE rat.`type_id` = " . $db->quote($lasttypeid) . " "; + + $query .= "AND rat.`tag_id` = " . $db->quote($lasttagid) . " "; + + $product = $this->_getList($query); + + $products = array(); + + for ($i = 0, $in = count($product); $i < $in; $i++) + { + $products[] = $product[$i]->product_id; + } + + $products = ArrayHelper::toInteger($products); + $productids = implode(",", $products); + } + + $q = "SELECT DISTINCT j.tag_id as tagid ,ra.product_id,count(ra.product_id) as ptotal ,CONCAT(j.tag_id,'.',j.type_id) AS tag_id, t.tag_name + FROM ((#__redproductfinder_tag_type j, #__redproductfinder_tags t ) + LEFT JOIN #__redproductfinder_association_tag as rat ON t.`id` = rat.`tag_id`) + LEFT JOIN #__redproductfinder_associations as ra ON ra.id = rat.association_id + WHERE j.tag_id = t.id + AND j.type_id = " . (int) $id . " "; + + if ($productids != "") + { + // Sanitize ids + $productIds = explode(',', $productids); + $productIds = ArrayHelper::toInteger($productIds); + + $q .= " AND ra.product_id IN ( " . implode(',', $productIds) . " ) "; + } + $q .= " GROUP BY t.id ORDER BY t.ordering "; + + $tags = $this->_getList($q); + + $tagname = ""; + + // Only show if the type has tags + if (count($tags) > 0) + { + // Create the selection boxes + for ($t = 0, $tn = count($tags); $t < $tn; $t++) + { + $type_id = explode('.', $tags[$t]->tag_id); + + $query = "SELECT count(*) as count FROM #__redproductfinder_association_tag as ra + left join #__redproductfinder_associations as a on ra.association_id = a.id + left join #__redshop_product as rp on rp.product_id = a.product_id + WHERE type_id = " . $db->quote($type_id[1]) . " AND tag_id = " . $db->quote($type_id[0]) . " AND rp.published = 1"; + + $published = $this->_getList($query); + + if ($published[0]->count > $redproducttotal && $redproducttotal > 0) + { + $finalcount = $redproducttotal; + } + else + { + $finalcount = $published[0]->count; + } + + if ($finalcount > 0) + { + $tagname .= "  id . '&tagid=' . $tags[$t]->tag_id . '&Itemid=' . $Itemid) . "' title='" . $tags[$t]->tag_name . "' >" . $tags[$t]->tag_name . " ( " . $finalcount . " )
    "; + } + } + + if ($tagname != "") + { + $lists['type' . $key] = $tagname; + } + } + else + { + unset($types[$key]); + } + } + } + + if (count($getredfilter) != 0) + { + foreach ($getredfilter as $typeid => $tag_id) + { + foreach ($types as $key => $type) + { + if ($typeid == $type->id) + { + $str = htmlentities($type->type_name, ENT_COMPAT, "UTF-8"); + $str = preg_replace('/&([a-zA-Z])(uml|acute|grave|circ|tilde|elig|slash|ring);/', '$1', $str); + $str = str_replace(' ', '', $str); + $types[$key]->type_name_css = html_entity_decode($str); + + $tags = $this->getTagsDetail($type->id, 0); + + $tagname = ""; + + // Only show if the type has tags + if (count($tags) > 0) + { + // Create the selection boxes + for ($t = 0, $tn = count($tags); $t < $tn; $t++) + { + if ($tags[$t]->tagid == $tag_id) + { + $tagname .= "  " . $tags[$t]->tag_name . "" . JText::_('COM_REDSHOP_DELETE') . "
    "; + } + } + + if ($tagname != "") + { + $filteredlists['type' . $key] = $tagname; + } + } + else + { + unset($types[$key]); + } + } + } + } + } + + if (count($getredfilter) != 0) + { + ?> +
    + +
    + $tag_id) + { + foreach ($types as $key => $type) + { + if ($typeid == $type->id) + { + ?> +
    + type_name; ?> + tooltip) > 0) + { + echo ' ' . JHtml::tooltip($type->tooltip, $type->type_name, 'tooltip.png', '', '', false); + } ?> +
    +
    +
    +
    + + +
    + + +
    +
     _________________________
    + 0) + { + ?> +
    + +
    + $type) + { + if (@!array_key_exists($type->id, $getredfilter) && @array_key_exists('type' . $key, $lists)) + { + ?> +
    + type_name; ?> + tooltip) > 0) + { + echo ' ' . JHtml::tooltip($type->tooltip, $type->type_name, 'tooltip.png', '', '', false); + } ?> +
    +
    +
    +
    + get('redfilter'); + $db = JFactory::getDbo(); + $products = array(); + + if (count($getredfilter) > 0 && $all == 1) + { + $type_id = array(); + $tag_id = array(); + $k = 0; + + foreach ($getredfilter as $typeid => $tags) + { + $type_id[] = $typeid; + $tags = explode(".", $tags); + $tag_id[] = $tags[0]; + + if (count($getredfilter) - 1 == $k) + { + $lasttypeid = $typeid; + $lasttagid = $tags[0]; + } + + $k++; + } + + $typeids = implode(",", $type_id); + $tagids = implode(",", $tag_id); + + $query = "SELECT ra.product_id FROM #__redproductfinder_association_tag AS rat " + . "LEFT JOIN #__redproductfinder_associations AS ra ON rat.association_id = ra.id " + . "WHERE rat.type_id = " . $db->quote($lasttypeid) . " " + . "AND rat.tag_id = " . $db->quote($lasttagid) . " "; + $db->setQuery($query); + $product = $db->loadObjectList(); + + for ($i = 0, $in = count($product); $i < $in; $i++) + { + $products[] = $product[$i]->product_id; + } + } + + $q = "SELECT DISTINCT j.tag_id AS tagid,ra.product_id,count(ra.product_id) AS ptotal, " + . "CONCAT(j.tag_id,'.',j.type_id) AS tag_id, t.tag_name " + . "FROM ((#__redproductfinder_tag_type j, #__redproductfinder_tags t ) " + . "LEFT JOIN #__redproductfinder_association_tag as rat ON t.`id` = rat.`tag_id`) " + . "LEFT JOIN #__redproductfinder_associations as ra ON ra.id = rat.association_id " + . "WHERE j.tag_id = t.id " + . "AND j.type_id = " . (int) $id . " "; + + if (!empty($products)) + { + // Sanitize ids + $products = ArrayHelper::toInteger($products); + + $q .= " AND ra.product_id IN (" . implode(",", $products) . ") "; + } + + $q .= " GROUP BY t.id ORDER BY t.ordering "; + $db->setQuery($q); + + return $db->loadObjectList(); + } + + /** + * Get Category products selected in search Module + */ + public function loadCatProductsManufacturer($cid) + { + $db = JFactory::getDbo(); + $query = "SELECT p.product_id, p.manufacturer_id FROM #__redshop_product_category_xref AS cx " + . ", #__redshop_product AS p " + . "WHERE cx.category_id = " . (int) $cid . " " + . "AND p.product_id=cx.product_id "; + $db->setQuery($query); + $manufacturer = $db->loadObjectList(); + + $mids = array(); + + for ($i = 0, $countManuf = count($manufacturer); $i < $countManuf; $i++) + { + if ($manufacturer[$i]->manufacturer_id > 0) + { + $mids[] = $manufacturer[$i]->manufacturer_id; + } + } + + // Sanitize ids + $mids = ArrayHelper::toInteger($mids); + + $query = "SELECT id AS value,name AS text FROM #__redshop_manufacturer " + . "WHERE id IN ('" . implode(",", $mids) . "')"; + $db->setQuery($query); + + return $db->loadObjectList(); + } + + /** + * Get ajax Data + * + * @return array|null + * + * @throws Exception + */ + public function getajaxData() + { + JLoader::import('joomla.application.module.helper'); + $module = JModuleHelper::getModule('redshop_search'); + $params = new JRegistry($module->params); + $limit = $params->get('noofsearchresults'); + $app = JFactory::getApplication(); + $keyword = $app->input->getString('keyword', ''); + $search_type = $app->input->getCmd('search_type', ''); + $category_id = $app->input->getInt('category_id', 0); + $manufacture_id = $app->input->getInt('manufacture_id', 0); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('p.product_id AS id, p.product_name AS value') + ->from($db->qn('#__redshop_product', 'p')) + ->leftJoin($db->qn('#__redshop_product_category_xref', 'x') . ' ON x.product_id = p.product_id') + ->leftJoin($db->qn('#__redshop_category', 'c') . ' ON x.category_id = c.id') + ->where('p.published = 1') + ->where('p.expired = 0') + ->group('p.product_id'); + + switch ($search_type) + { + case 'product_name': + case 'product_number': + $query->where($this->getSearchCondition('p.' . $search_type, $keyword)); + break; + case 'name_number': + $query->where($this->getSearchCondition(array('p.product_name', 'p.product_number'), $keyword)); + break; + case 'product_desc': + $query->where($this->getSearchCondition(array('p.product_s_desc', 'p.product_desc'), $keyword)); + break; + case 'name_desc': + $query->where($this->getSearchCondition(array('p.product_name', 'p.product_s_desc', 'p.product_desc'), $keyword)); + break; + case 'virtual_product_num': + $query->where($this->getSearchCondition(array('pap.property_number', 'ps.subattribute_color_number'), $keyword)); + break; + case 'name_number_desc': + $query->where( + $this->getSearchCondition( + array('p.product_name', 'p.product_number', 'p.product_desc', 'p.product_s_desc', 'pap.property_number', 'ps.subattribute_color_number'), + $keyword + ) + ); + break; + } + + if ($search_type == "name_number_desc" || $search_type == "virtual_product_num") + { + $query->leftJoin($db->qn('#__redshop_product_attribute', 'a') . ' ON a.product_id = p.product_id') + ->leftJoin($db->qn('#__redshop_product_attribute_property', 'pap') . ' ON pap.attribute_id = a.attribute_id') + ->leftJoin($db->qn('#__redshop_product_subattribute_color', 'ps') . ' ON ps.subattribute_id = pap.property_id'); + } + + if ($category_id != "0") + { + $query->where('c.id = ' . (int) $category_id); + } + + if ($manufacture_id != "0") + { + $query->where('p.manufacturer_id = ' . (int) $manufacture_id); + } + + $excludeCategories = $app->input->getString('excludeCategories', ''); + + if (!empty($excludeCategories)) + { + $excludeCategories = explode(',', $excludeCategories); + $excludeCategories = ArrayHelper::toInteger($excludeCategories); + + $query->where('x.category_id NOT IN (' . implode(',', $excludeCategories) . ')'); + } + + $data = $db->setQuery($query, 0, $limit)->loadObjectList(); + + if ($data) + { + foreach ($data as &$row) + { + $itemData = productHelper::getInstance()->getMenuInformation(0, 0, '', 'product&pid=' . $row->id); + + if (count($itemData) > 0) + { + $pItemid = $itemData->id; + } + else + { + $pItemid = RedshopHelperRouter::getItemId($row->id, $category_id); + } + + $row->link = JRoute::_( + 'index.php?option=com_redshop' . + '&view=product&pid=' . $row->id . + '&cid=' . $category_id . + '&Itemid=' . $pItemid + ); + } + } + + $this->preprocessData($this->context, $data); + + return $data; + } + + /** + * Get List from product + * + * @return JDatabaseQuery + */ + public function getListQuery() + { + $pk = $this->getState('filter.data', array()); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn("p.product_id")) + ->from($db->qn("#__redshop_product", "p")) + ->leftJoin( + $db->qn("#__redshop_product_category_xref", "pc") . " ON " + . $db->qn('p.product_id') . " = " + . $db->qn('pc.product_id') + ) + ->where($db->qn('p.published') . ' = 1') + ->where($db->qn('p.expired') . ' = 0') + ->group($db->qn('p.product_id')); + + $productOnSale = !empty($pk['product_on_sale']) ? $pk['product_on_sale'] : 0; + $cid = !empty($pk['cid']) ? $pk['cid'] : 0; + $mid = !empty($pk['mid']) ? $pk['mid'] : 0; + $rootCategory = !empty($pk['root_category']) ? $pk['root_category'] : 0; + $categoryForSale = !empty($pk['category_for_sale']) ? $pk['category_for_sale'] : array(); + $categories = !empty($pk['category']) ? $pk['category'] : array(); + $manufacturers = !empty($pk['manufacturer']) ? $pk['manufacturer'] : array(); + $keyword = !empty($pk['keyword']) ? $pk['keyword'] : ""; + $customField = !empty($pk['custom_field']) ? $pk['custom_field'] : ""; + + if (isset($pk["filterprice"])) + { + $min = $pk["filterprice"]['min']; + $max = $pk["filterprice"]['max']; + } + + if (!empty($categories)) + { + if (in_array($rootCategory, $categories)) + { + $key = array_search($rootCategory, $categories); + unset($categories[$key]); + } + + $categoryList = implode(',', $categories); + } + elseif (!empty($cid)) + { + $catList = RedshopHelperCategory::getCategoryListArray($cid); + + if (!empty($catList)) + { + foreach ($catList as $key => $cat) + { + $list[] = $cat->id; + } + + array_push($list, $cid); + + $categoryList = implode(',', $list); + + } + else + { + $categoryList = $cid; + } + } + else + { + $categoryList = $cid; + } + + $orderBy = $this->getState('order_by'); + + if ($orderBy == 'pc.ordering ASC' || $orderBy == 'c.ordering ASC') + { + $orderBy = 'p.product_id DESC'; + } + + if (!empty($pk["filterprice"])) + { + $comparePrice = $db->qn('p.product_price') . ' >= ' . $db->q($min) . ' AND ' . $db->qn('p.product_price') . ' <= ' . $db->q(($max)); + $compareDiscountPrice = $db->qn('p.discount_price') . ' >= ' . $db->q($min) . ' AND ' . $db->qn('p.discount_price') . ' <= ' . $db->q(($max)); + $saleTime = $db->qn('p.discount_stratdate') . ' AND ' . $db->qn('p.discount_enddate'); + $query->where('( CASE WHEN( ' . $db->qn('p.product_on_sale') . ' = 1 AND UNIX_TIMESTAMP() BETWEEN ' + . $saleTime . ') THEN (' + . $compareDiscountPrice . ') ELSE (' + . $comparePrice . ') END )' + ); + } + + if (!empty($keyword)) + { + $search = $db->q('%' . $db->escape(trim($keyword, true) . '%')); + $query->leftJoin( + $db->qn('#__redshop_manufacturer', 'm') . ' ON ' + . $db->qn('m.id') . ' = ' . $db->qn('p.manufacturer_id') + ) + ->where('(' . $db->qn('p.product_name') . ' LIKE ' . $search . ' OR ' . $db->qn('m.name') . ' LIKE ' . $search . ')'); + } + + $catList = RedshopHelperCategory::getCategoryListArray($categoryForSale); + $childCat = array($categoryForSale); + + foreach ($catList as $key => $value) + { + $childCat[] = $value->id; + } + + if (!empty($customField)) + { + $key = 0; + $subQuery = array(); + + foreach ($customField as $fieldId => $fieldValues) + { + $fieldValues = array_filter($fieldValues); + + if (empty($fieldValues)) + { + continue; + } + + foreach ($fieldValues as $value) + { + $subQuery[] = 'FIND_IN_SET("' . $value . '", ' . $db->qn('fd' . $key . '.data_txt') . ')'; + } + + $query->leftJoin($db->qn('#__redshop_fields_data', 'fd' . $key) . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('fd' . $key . '.itemid')) + ->where($db->qn('fd' . $key . '.fieldid') . ' = ' . $db->q((int) $fieldId)); + $key++; + } + + if (!empty($subQuery)) + { + $query->where('(' . implode(' OR ', $subQuery) . ')'); + } + } + + if (!empty($categoryForSale) && in_array($cid, $childCat)) + { + if (!empty($categories)) + { + foreach ($categories as $key => $value) + { + $query->leftJoin( + $db->qn('#__redshop_product_category_xref', 'pc' . $key) . ' ON ' + . $db->qn('p.product_id') . ' = ' + . $db->qn('pc' . $key . '.product_id') + ) + ->where($db->qn('pc' . $key . '.category_id') . ' = ' . $db->q((int) $value)) + ->where($db->qn("pc.category_id") . " = " . $db->q((int) $cid)); + } + } + elseif (!empty($cid) || !empty($categories)) + { + $query->where($db->qn("pc.category_id") . " IN (" . $categoryList . ')'); + } + } + elseif (!empty($cid) || !empty($categories)) + { + $query->where($db->qn("pc.category_id") . " IN (" . $categoryList . ')'); + } + + if (!empty($manufacturers)) + { + $query->where($db->qn("p.manufacturer_id") . " IN (" . implode(',', $manufacturers) . ')'); + } + elseif ($mid) + { + $query->where($db->qn("p.manufacturer_id") . "=" . $db->q((int) $mid)); + } + + if (!empty($productOnSale)) + { + $query->where($db->qn('p.product_on_sale') . ' = ' . $db->q((int) $productOnSale)); + } + + if ($orderBy) + { + $query->order($db->escape($orderBy)); + } + + JPluginHelper::importPlugin('redshop_product'); + JDispatcher::getInstance()->trigger('onFilterProduct', array(&$query, $pk)); + + return $query; + } + + /** + * Get Items + * + * @return array + */ + public function getItem() + { + $query = $this->getListQuery(); + $db = JFactory::getDbo(); + $start = $this->getState('list.start'); + $limit = $this->getState('list.limit'); + $templateId = $this->getState('template_id'); + + $templateArr = RedshopHelperTemplate::getTemplate("category", $templateId); + $templateDesc = $templateArr[0]->template_desc; + + if ($templateDesc) + { + if (strstr($templateDesc, "{pagination}")) + { + $db->setQuery($query, $start, $limit); + } + else + { + $db->setQuery($query); + } + } + else + { + $db->setQuery($query); + } + + return $db->loadColumn(); + } + + /** + * Get pagination. + * + * @return JPagination + */ + public function getFilterPagination() + { + $endlimit = $this->getState('list.limit'); + $limitstart = $this->getState('list.start'); + $this->pagination = new JPagination($this->getFilterTotal(), $limitstart, $endlimit); + + return $this->pagination; + } + + /** + * Get total. + * + * @return integer + */ + public function getFilterTotal() + { + $query = $this->getListQuery(); + $this->total = $this->_getListCount($query); + + return $this->total; + } +} diff --git a/component/site/models/send_friend.php b/component/site/models/send_friend.php new file mode 100644 index 00000000000..dfe251a9b6b --- /dev/null +++ b/component/site/models/send_friend.php @@ -0,0 +1,138 @@ +_table_prefix = '#__redshop_'; + + $this->setId(JFactory::getApplication()->input->getInt('pid', 0)); + } + + /** + * Method for set ID + * + * @param integer $id ID + * + * @return void + */ + public function setId($id) + { + $this->_id = $id; + $this->_data = null; + } + + /** + * Method for send mail to friend + * + * @param string $yourName Your name + * @param string $friendName Friend name + * @param integer $productId Product ID + * @param string $email Friend email + * + * @return void + * @throws Exception + */ + public function sendProductMailToFriend($yourName, $friendName, $productId, $email) + { + $mailTemplate = Redshop\Mail\Helper::getTemplate(0, "product"); + $mailBcc = null; + + if (!empty($mailTemplate)) + { + $mailBody = $mailTemplate[0]->mail_body; + $subject = $mailTemplate[0]->mail_subject; + + if (trim($mailTemplate[0]->mail_bcc) != "") + { + $mailBcc = explode(",", $mailTemplate[0]->mail_bcc); + } + } + else + { + $mailBody = "

    Hi {friend_name} ,

    \r\n

    New Product : {product_name}

    \r\n" + . "

    {product_desc} Please check this link : {product_url}

    \r\n

    \r\n

    "; + $subject = "Send to friend"; + } + + $mailBody = str_replace("{friend_name}", $friendName, $mailBody); + $mailBody = str_replace("{your_name}", $yourName, $mailBody); + + $product = RedshopHelperProduct::getProductById($productId); + + $mailBody = str_replace("{product_name}", $product->product_name, $mailBody); + $mailBody = str_replace("{product_desc}", $product->product_desc, $mailBody); + + $productLink = JRoute::_(JUri::base() . 'index.php?option=com_redshop&view=product&pid=' . $productId, false); + $productLink = "" . $productLink . ""; + $mailBody = str_replace("{product_url}", $productLink, $mailBody); + Redshop\Mail\Helper::imgInMail($mailBody); + + $config = JFactory::getConfig(); + $from = (string) $config->get('mailfrom'); + $fromName = (string) $config->get('fromname'); + + $subject = str_replace("{product_name}", $product->product_name, $subject); + $subject = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $subject); + + if (!empty($email)) + { + if (JFactory::getMailer()->sendMail($from, $fromName, $email, $subject, $mailBody, 1, null, $mailBcc)) + { + echo "
    " . JText::_('COM_REDSHOP_EMAIL_HAS_BEEN_SENT_SUCCESSFULLY') . "
    "; + } + else + { + echo "
    " . JText::_('COM_REDSHOP_EMAIL_HAS_NOT_BEEN_SENT_SUCCESSFULLY') . "
    "; + } + } + } +} diff --git a/component/site/models/wishlist.php b/component/site/models/wishlist.php new file mode 100644 index 00000000000..03433981b17 --- /dev/null +++ b/component/site/models/wishlist.php @@ -0,0 +1,525 @@ +id) + { + $wishlists = $this->getUserWishlist(); + $wishProducts = array(); + + foreach ($wishlists as $key => $wishlist) + { + $query = $db->getQuery(true) + ->select('DISTINCT wp.*, p.*') + ->from($db->qn('#__redshop_product', 'p')) + ->leftJoin($db->qn('#__redshop_wishlist_product', 'wp') . ' ON ' . $db->qn('wp.product_id') . ' = ' . $db->qn('p.product_id')) + ->where($db->qn('wp.wishlist_id') . ' = ' . $db->q((int) $wishlist->wishlist_id)); + + $wishProducts[$wishlist->wishlist_id] = $db->setQuery($query)->loadObjectList(); + } + + return $wishProducts; + } + + $numberProduct = $session->get('no_of_prod'); + + if (!isset($numberProduct)) + { + return array(); + } + + $productIds = array(); + + for ($add = 1; $add <= $numberProduct; $add++) + { + if (!isset($session->get('wish_' . $add)->product_id)) + { + continue; + } + + $productIds[] = (int) $session->get('wish_' . $add)->product_id; + } + + if (empty($productIds)) + { + return array(); + } + + $query = $db->getQuery(true) + ->select('DISTINCT *') + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_id') . ' IN (' . implode(',', ArrayHelper::toInteger($productIds)) . ')'); + + return $db->setQuery($query)->loadObjectList(); + } + + public function getWishlistProductFromSession() + { + $db = JFactory::getDbo(); + $session = JFactory::getSession(); + $wishlist = $session->get('wishlist'); + $productIds = array(); + + if (empty($wishlist)) + { + return array(); + } + + foreach ($wishlist as $productId => $wish) + { + $productIds[] = $productId; + } + + if (empty($productIds)) + { + return array(); + } + + $query = $db->getQuery(true) + ->select($db->qn('p.product_id', 'index')) + ->select('p.*') + ->select($db->qn('pcx.category_id')) + ->from($db->qn('#__redshop_product', 'p')) + ->leftJoin($db->qn('#__redshop_product_category_xref', 'pcx') . ' ON ' . $db->qn('pcx.product_id') . ' = ' . $db->qn('p.product_id')) + ->where($db->qn('p.product_id') . ' IN (' . implode(',', ArrayHelper::toInteger($productIds)) . ')') + ->group($db->qn('index')); + + $products = $db->setQuery($query)->loadObjectList('index'); + + if (empty($products)) + { + return array(); + } + + if (!Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE')) + { + $products = array_filter($products); + + return $products; + } + + $rows = array(); + + foreach ($wishlist as $productId => $wishes) + { + foreach ($wishes as $wish) + { + $newWish = clone $products[$productId]; + $newWish->product_items = $wish->product_items; + + $rows[] = $newWish; + } + } + + return $rows; + } + + public function store($data) + { + $row = $this->getTable(); + + if (!$row->bind($data)) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + if (!$row->store()) + { + $this->setError($this->_db->getErrorMsg()); + + return false; + } + + $session = JFactory::getSession(); + $numberProduct = $session->get('no_of_prod'); + $db = JFactory::getDbo(); + $productId = $data['product_id']; + + if ($productId) + { + $columns = array('wishlist_id', 'product_id', 'cdate'); + $values = array($row->wishlist_id, $productId, $db->q(time())); + $query = $db->getQuery(true) + ->insert($db->qn('#__redshop_wishlist_product')) + ->columns($db->qn($columns)) + ->values(implode(',', $values)); + + return (bool) $db->setQuery($query)->execute(); + } + + if ($numberProduct) + { + ob_clean(); + $extraField = extraField::getInstance(); + $rowData = $extraField->getSectionFieldList(12); + $totalRowData = count($rowData); + + for ($si = 1; $si <= $numberProduct; $si++) + { + $data = $session->get('wish_' . $si); + + for ($k = 0, $kn = $totalRowData; $k < $kn; $k++) + { + $field = "productuserfield_" . $k; + + if (empty($data->{$field})) + { + continue; + } + + $values = array($row->wishlist_id, (int) $data->product_id, $db->q($data->{$field})); + + $query = $db->getQuery(true) + ->insert($db->qn('#__redshop_wishlist_userfielddata')) + ->columns($db->qn(array('wishlist_id', 'product_id', 'userfielddata'))) + ->values(implode(',', $values)); + $db->setQuery($query)->execute(); + } + + $values = array($row->wishlist_id, (int) $data->product_id, $db->q($data->cdate)); + $query = $db->getQuery(true) + ->insert($db->qn('#__redshop_wishlist_product')) + ->columns($db->qn(array('wishlist_id', 'product_id', 'cdate'))) + ->values(implode(',', $values)); + $db->setQuery($query)->execute(); + + $session->clear('wish_' . $si); + } + + $session->clear('no_of_prod'); + } + + return true; + } + + /** + * Method for save wishlist. + * + * @param array $data List of data + * + * @return boolean True if success. False otherwise. + * + * @throws Exception + */ + public function savewishlist($data) + { + if (empty($data)) + { + $input = JFactory::getApplication()->input; + + $wishlistIds = $input->get('wishlist_id', array(), 'Array'); + $productIds = $input->getString('product_id', ''); + $attributeIds = $input->getString('attribute_id', 0); + $propertyIds = $input->getString('property_id', 0); + $subAttributeIds = $input->getString('subattribute_id', 0); + } + else + { + $wishlistIds = isset($data['wishlist_id']) ? $data['wishlist_id'] : array(); + $productIds = isset($data['product_id']) ? $data['product_id'] : ''; + $attributeIds = isset($data['attribute_id']) ? $data['attribute_id'] : ''; + $propertyIds = isset($data['property_id']) ? $data['property_id'] : ''; + $subAttributeIds = isset($data['subattribute_id']) ? $data['subattribute_id'] : ''; + } + + $productIds = explode(',', $productIds); + $productIds = array_filter($productIds); + + if (empty($wishlistIds)) + { + return false; + } + + JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_redshop/tables'); + + foreach ($wishlistIds as $wishlistId) + { + foreach ($productIds as $productId) + { + /** @var RedshopTableWishlist_Product $table */ + $wishlistProductTable = JTable::getInstance('Wishlist_Product', 'RedshopTable'); + + $tmpData = array( + 'wishlist_id' => $wishlistId, + 'product_id' => $productId + ); + + /* + * Check: If there are already has product in this wishlist. Continue with: + * 1. In case "Add to cart per product" -> Skip this process. + * 2. In case "Add to cart per attribute" -> Check on product attributes exist. If not, start create new wishlist item. + */ + if ($wishlistProductTable->load($tmpData) + && (Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE') == 0 + || $this->isProductDataExist($wishlistId, $productId, $attributeIds, $propertyIds, $subAttributeIds))) + { + continue; + } + + $attributeIds = explode('##', $attributeIds); + $attributeIds = ArrayHelper::toInteger($attributeIds); + $propertyIds = explode('##', $propertyIds); + $propertyIds = ArrayHelper::toInteger($propertyIds); + $subAttributeIds = explode('##', $subAttributeIds); + $subAttributeIds = ArrayHelper::toInteger($subAttributeIds); + + $wishlistProductTable->reset(); + $wishlistProductTable->set('wishlist_product_id', null); + $wishlistProductTable->set('wishlist_id', $wishlistId); + $wishlistProductTable->set('product_id', $productId); + $wishlistProductTable->set('cdate', time()); + + if (!$wishlistProductTable->store()) + { + throw new Exception($wishlistProductTable->getError()); + } + + $attributeIds = array_filter($attributeIds); + + // If there are not attribute with product. + if (empty($attributeIds)) + { + continue; + } + + foreach ($attributeIds as $index => $attributeId) + { + /** @var RedshopTableWishlist_Product_Item $table */ + $wishlistProductItemTable = JTable::getInstance('Wishlist_Product_Item', 'RedshopTable'); + + $tmpData = array( + 'ref_id' => (int) $wishlistProductTable->get('wishlist_product_id'), + 'attribute_id' => $attributeId + ); + + if (!empty($propertyIds[$index])) + { + $tmpData['property_id'] = (int) $propertyIds[$index]; + } + + if (!empty($subAttributeIds[$index])) + { + $tmpData['subattribute_id'] = (int) $subAttributeIds[$index]; + } + + // If wishlist product item has already exist. Skip it. + if ($wishlistProductItemTable->load($tmpData)) + { + continue; + } + + if (!$wishlistProductItemTable->save($tmpData)) + { + throw new Exception($wishlistProductItemTable->getError()); + } + } + } + } + + return true; + } + + public function check_user_wishlist_authority($userId, $wishlistId) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('wishlist_id')) + ->from($db->quoteName('#__redshop_wishlist')) + ->where($db->quoteName('user_id') . ' = ' . (int) $userId) + ->where($db->quoteName('wishlist_id') . ' = ' . (int) $wishlistId); + + if ($db->setQuery($query)->loadResult()) + { + return true; + } + + return false; + } + + public function delwishlist($userId, $wishlistId) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->delete($db->quoteName('#__redshop_wishlist_product')) + ->where($db->quoteName('wishlist_id') . ' = ' . (int) $wishlistId); + $db->setQuery($query)->execute(); + + $query->clear() + ->delete($db->quoteName('#__redshop_wishlist_userfielddata')) + ->where($db->quoteName('wishlist_id') . ' = ' . (int) $wishlistId); + + if (!$db->setQuery($query)->execute()) + { + return false; + } + + $query->clear() + ->delete($db->quoteName('#__redshop_wishlist')) + ->where($db->quoteName('wishlist_id') . ' = ' . (int) $wishlistId) + ->where($db->quoteName('user_id') . ' = ' . (int) $userId); + + if ($db->setQuery($query)->execute()) + { + return true; + } + + return false; + } + + public function mysessdelwishlist($data) + { + if (is_int($data)) + { + $productId = (int) $data; + } + else + { + $productId = isset($data['wishlist_id']) ? (int) $data['wishlist_id'] : 0; + $attributeId = isset($data['attribute_id']) ? (int) $data['attribute_id'] : 0; + $propertyId = isset($data['property_id']) ? (int) $data['property_id'] : 0; + $subAttributeId = isset($data['subattribute_id']) ? (int) $data['subattribute_id'] : 0; + } + + $session = JFactory::getSession(); + $wishlist = $session->get('wishlist'); + + if (empty($wishlist) || !isset($wishlist[$productId])) + { + return true; + } + + if (!Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE')) + { + if (isset($wishlist[$productId])) + { + unset($wishlist[$productId]); + } + + $session->set('wishlist', $wishlist); + + return true; + } + + $checkObject = new stdClass; + $checkObject->attribute_id = $attributeId; + $checkObject->property_id = $propertyId; + $checkObject->subattribute_id = $subAttributeId; + + foreach ($wishlist[$productId] as $key => $wish) + { + if ($wish->product_items == $checkObject) + { + unset($wishlist[$productId][$key]); + } + } + + $wishlist[$productId] = array_values($wishlist[$productId]); + $session->set('wishlist', $wishlist); + + return true; + } + + /** + * Method for check if product data has been exist. + * + * @param int $wishlistId Wishlist ID. + * @param int $productId Product ID. + * @param array $attributes Attributes data. + * @param array $properties Properties data. + * @param array $subAttributes Sub-properties data. + * + * @return boolean True on exist. False otherwise. + * + * @since 2.0.3 + */ + public function isProductDataExist($wishlistId, $productId, $attributes = null, $properties = null, $subAttributes = null) + { + if (!$wishlistId || !$productId) + { + return false; + } + + $wishlistData = RedshopHelperWishlist::getWishlist($wishlistId); + + // Check: If this product is not exist in this wishlist. + // Or this product is exist but new product doesn't have attribute data. + if (!isset($wishlistData->products[$productId]) || !$attributes) + { + return false; + } + + $attributes = !is_array($attributes) ? array($attributes) : $attributes; + $properties = !is_array($properties) ? array($properties) : $properties; + $subAttributes = !is_array($subAttributes) ? array($subAttributes) : $subAttributes; + + foreach ($wishlistData->products[$productId] as $wishlistProduct) + { + /* Check: If attributes has different. + Or properties has different. + Or sub-attributes has different. + */ + if (!empty(array_diff($attributes, $wishlistProduct->attributes)) + || !empty(array_diff($properties, $wishlistProduct->properties)) + || !empty(array_diff($subAttributes, $wishlistProduct->subAttributes))) + { + return false; + } + } + + return true; + } +} diff --git a/component/site/redshop.php b/component/site/redshop.php new file mode 100644 index 00000000000..a6123550e92 --- /dev/null +++ b/component/site/redshop.php @@ -0,0 +1,165 @@ +track(); + +// Helper object +$helper = redhelper::getInstance(); + +// Set the default view name and format from the Request. +$vName = $app->input->getCmd('view', 'category'); +$task = $app->input->getCmd('task', ''); +$format = $app->input->getWord('format', 'html'); +$layout = $app->input->getWord('layout', ''); +$params = $app->getParams('com_redshop'); +$categoryId = $app->input->getInt('cid', $params->get('categoryid')); +$productId = $app->input->getInt('pid', 0); +$shopperGroupPortal = RedshopHelperShopper_Group::getShopperGroupPortal(); +$user = JFactory::getUser(); +$portal = 0; + +// Add product in cart from db +RedshopHelperUtility::databaseToCart(); + +if (!empty($shopperGroupPortal)) +{ + $portal = $shopperGroupPortal->shopper_group_portal; +} + +if (Redshop::getConfig()->get('PORTAL_SHOP') == 1) +{ + if ($vName == 'product' && $productId > 0) + { + $checkProductPermission = RedshopHelperAccess::checkPortalProductPermission($productId); + + if (!$checkProductPermission) + { + $vName = 'login'; + $app->input->set('view', 'login'); + $app->input->set('layout', 'portal'); + $app->enqueuemessage(JText::_('COM_REDSHOP_AUTHENTICATIONFAIL')); + } + } + elseif ($vName == 'category' && $categoryId > 0) + { + $checkCategoryPermission = RedshopHelperAccess::checkPortalCategoryPermission($categoryId); + + if (!$checkCategoryPermission) + { + $vName = 'login'; + $app->input->set('view', 'login'); + $app->input->set('layout', 'portal'); + $app->enqueuemessage(JText::_('COM_REDSHOP_AUTHENTICATIONFAIL')); + } + } +} +else +{ + if ($vName == 'product' && $productId > 0 && $portal == 1) + { + $checkProductPermission = RedshopHelperAccess::checkPortalProductPermission($productId); + + if (!$checkProductPermission) + { + $vName = 'login'; + $app->input->set('view', 'login'); + $app->input->set('layout', 'portal'); + $app->enqueuemessage(JText::_('COM_REDSHOP_AUTHENTICATIONFAIL')); + } + } + + if ($vName == 'category' && $categoryId > 0 && $portal == 1) + { + $checkCategoryPermission = RedshopHelperAccess::checkPortalCategoryPermission($categoryId); + + if (!$checkCategoryPermission) + { + $vName = 'login'; + $app->input->set('view', 'login'); + $app->input->set('layout', 'portal'); + $app->enqueuemessage(JText::_('COM_REDSHOP_AUTHENTICATIONFAIL')); + } + } + + if ($vName == 'redshop') + { + $vName = 'category'; + $app->input->set('view', 'category'); + } + else + { + $app->input->set('view', $vName); + } +} + +// Don't create div for AJAX call and GA code. +if ('component' !== $app->input->getCmd('tmpl') && 'html' == $format) +{ + // Container CSS class definition + if (version_compare(JVERSION, '3.0', '<')) + { + $redSHOPCSSContainerClass = ' isJ25'; + } + else + { + $redSHOPCSSContainerClass = ' isJ30'; + } + + echo '
    '; +} + +// Check for array format. +$filter = JFilterInput::getInstance(); +$task = $app->input->getCmd('task', 'display'); + +if (is_array($task)) +{ + $command = $filter->clean(array_pop(array_keys($task)), 'cmd'); +} +else +{ + $command = $filter->clean($task, 'cmd'); +} + +// Check for a not controller.task command. +if (strpos($command, '.') === false) +{ + $app->input->set('task', $vName . '.' . $command); +} + +// Perform the Request task +$controller = JControllerLegacy::getInstance('Redshop'); + +if (version_compare(JVERSION, '3.0', '<')) +{ + $task = $app->input->getCmd('task'); +} +else +{ + $task = $app->input->get('task', ''); +} + +$controller->execute($task); + +// End component DIV here +echo "
    "; + +echo JLayoutHelper::render('assets'); + +$controller->redirect(); diff --git a/component/site/router.php b/component/site/router.php new file mode 100644 index 00000000000..68014ede2a9 --- /dev/null +++ b/component/site/router.php @@ -0,0 +1,981 @@ +getMenu(); + + $menuItem = empty($query['Itemid']) ? $menu->getActive() : $menu->getItem($query['Itemid']); + + $itemId = is_object($menuItem) ? $menuItem->id : 101; + + $view = null; + + if (isset($query['view'])) + { + $view = $query['view']; + unset($query['view']); + } + + $pid = null; + + if (isset($query['pid'])) + { + $pid = $query['pid']; + unset($query['pid']); + } + + $cid = null; + + if (isset($query['cid'])) + { + $cid = $query['cid']; + unset($query['cid']); + } + + $manufacturerId = null; + + if (isset($query['manufacturer_id'])) + { + $manufacturerId = $query['manufacturer_id']; + unset($query['manufacturer_id']); + } + + $categoryId = null; + + if (isset($query['category_id'])) + { + $categoryId = $query['category_id']; + unset($query['category_id']); + } + + $categoryTemplate = null; + + if (isset($query['category_template'])) + { + $categoryTemplate = $query['category_template']; + unset($query['category_template']); + } + + $gid = null; + + if (isset($query['gid'])) + { + $gid = $query['gid']; + unset($query['gid']); + } + + $layout = null; + + if (isset($query['layout'])) + { + $layout = $query['layout']; + unset($query['layout']); + } + + $mid = null; + + if (isset($query['mid'])) + { + $mid = $query['mid']; + unset($query['mid']); + } + + $task = null; + + if (isset($query['task'])) + { + $task = $query['task']; + unset($query['task']); + } + + $inforId = null; + + if (isset($query['infoid'])) + { + $inforId = $query['infoid']; + unset($query['infoid']); + } + + $oid = null; + + if (isset($query['oid'])) + { + $oid = $query['oid']; + unset($query['oid']); + } + + $orderId = null; + + if (isset($query['order_id'])) + { + $orderId = $query['order_id']; + unset($query['order_id']); + } + + $quotationId = null; + + if (isset($query['quoid'])) + { + $quotationId = $query['quoid']; + unset($query['quoid']); + } + + // Tag id + $tagId = null; + + if (isset($query['tagid'])) + { + $tagId = $query['tagid']; + unset($query['tagid']); + } + + $edit = null; + + if (isset($query['edit'])) + { + $edit = $query['edit']; + unset($query['edit']); + } + + // Remove flag + $remove = null; + + if (isset($query['remove'])) + { + $remove = $query['remove']; + unset($query['remove']); + } + + $wishlistId = null; + + if (isset($query['wishlist_id'])) + { + $wishlistId = $query['wishlist_id']; + unset($query['wishlist_id']); + } + + if (is_object($menuItem)) + { + $myParams = new Registry($menuItem->params); + } + else + { + $menuItem = new stdClass; + $menuItem->title = ''; + $myParams = new Registry; + } + + // Special char for replace + $specialChars = array('.', ' '); + + switch ($view) + { + case 'wishlist': + $segments[] = 'wishlist'; + + if (!empty($task)) + { + $segments[] = $task; + + if (in_array($task, array('delwishlist', 'mysessdelwishlist'))) + { + $segments[] = $wishlistId; + } + } + elseif (!empty($layout)) + { + $segments[] = $layout; + } + + break; + + case 'cart': + $segments[] = 'cart'; + + break; + + case 'search': + $segments[] = 'search'; + + if (!empty($layout)) + { + $segments[] = $layout; + } + + if (!empty($categoryId)) + { + $segments[] = $categoryId; + } + + break; + + case 'password': + $segments[] = 'password'; + break; + + case 'registration': + $segments[] = 'registration'; + break; + + case 'login': + $segments[] = 'login'; + break; + + case 'checkout': + $segments[] = 'checkout'; + break; + + case 'account_billto': + $segments[] = 'account_billto'; + break; + + case 'giftcard': + $segments[] = 'giftcard'; + + if (isset($gid)) + { + $segments[] = $gid; + + $entity = RedshopEntityGiftcard::getInstance($gid); + + if ($entity->isValid()) + { + $segments[] = RedshopHelperUtility::convertToNonSymbol($entity->get('giftcard_name')); + } + } + + break; + + case 'account_shipto': + $segments[] = 'account_shipto'; + + if ($task == 'addshipping' || $task == 'remove') + { + $segments[] = $task; + + if ($inforId > 0) + { + $segments[] = $inforId; + } + } + + break; + + case 'orders': + $segments[] = 'orders'; + + break; + + case 'order_detail': + $segments[] = 'order_detail'; + + if ($oid != '') + { + $segments[] = $oid; + } + elseif ($orderId != '') + { + $segments[] = $orderId; + } + + if ($layout != '') + { + $segments[] = $layout; + } + + if ($task == 'reorder') + { + $segments[] = $task; + } + + break; + + case 'category': + + if (!Redshop::getConfig()->get('ENABLE_SEF_NUMBER_NAME')) + { + if ($cid > 0) + { + $segments[] = $cid; + } + + $segments[] = $itemId; + $segments[] = $manufacturerId; + } + + if ($cid) + { + $url = RedshopEntityCategory::getInstance($cid); + + if (empty($url->get('sef_url'))) + { + $categoriesReverse = RedshopHelperCategory::getCategoryListReverseArray($cid); + + if (count($categoriesReverse) > 0) + { + $categoriesReverse = array_reverse($categoriesReverse); + + foreach ($categoriesReverse as $categoryReverse) + { + if ($categoryReverse->parent_id === 0) + { + continue; + } + + $segments[] = RedshopHelperUtility::convertToNonSymbol($categoryReverse->name); + } + } + + if (Redshop::getConfig()->get('ENABLE_SEF_NUMBER_NAME')) + { + $segments[] = $cid . '-' . RedshopHelperUtility::convertToNonSymbol($url->get('name')); + } + else + { + $segments[] = RedshopHelperUtility::convertToNonSymbol($url->get('name')); + } + } + else + { + if (Redshop::getConfig()->get('ENABLE_SEF_NUMBER_NAME')) + { + $segments[] = $cid . '-' . RedshopHelperUtility::convertToNonSymbol($url->sef_url); + } + else + { + $segments[] = RedshopHelperUtility::convertToNonSymbol($url->sef_url); + } + } + } + elseif ($menuItem->title !== '') + { + $segments[] = RedshopHelperUtility::convertToNonSymbol($menuItem->title); + } + + if ($layout !== 'detail' && $layout !== '') + { + $segments[] = $layout; + } + + break; + + case 'product': + + if (Redshop::getConfig()->get('ENABLE_SEF_NUMBER_NAME') && $layout != '') + { + $segments[] = $layout; + } + else + { + if ($layout != '') + { + $segments[] = $layout; + } + elseif ($pid) + { + $segments[] = $pid; + } + + $segments[] = $itemId; + } + + $segments[] = $task; + $product = RedshopHelperProduct::getProductById($pid); + + if ($pid && $product) + { + $url = $product->sef_url; + $showCategoryInSefUrl = $product->cat_in_sefurl; + + if ($url == '') + { + // Get cid from request for consistency + $categoryId = $showCategoryInSefUrl; + + // If cid is not set than find cid + if (!$categoryId) + { + $categoryId = $product->category_id; + } + + if ($categoriesReverse = RedshopHelperCategory::getCategoryListReverseArray($categoryId)) + { + $categoriesReverse = array_reverse($categoriesReverse); + + foreach ($categoriesReverse as $cat) + { + if ($cat->parent_id == 0) + { + continue; + } + + $segments[] = RedshopHelperUtility::convertToNonSymbol($cat->name); + } + } + + $categoryData = RedshopEntityCategory::getInstance($categoryId); + + // Attach category id with name for consistency + if (Redshop::getConfig()->get('ENABLE_SEF_NUMBER_NAME')) + { + $segments[] = $categoryId . '-' . RedshopHelperUtility::convertToNonSymbol($categoryData->get('name')); + } + else + { + $segments[] = RedshopHelperUtility::convertToNonSymbol($categoryData->get('name')); + } + + // Add product number if config is enabled + if (Redshop::getConfig()->get('ENABLE_SEF_PRODUCT_NUMBER')) + { + $segments[] = RedshopHelperUtility::convertToNonSymbol($product->product_number); + } + + // Config option to generate sef using name : add product id to get parse in parseroute function + if (Redshop::getConfig()->get('ENABLE_SEF_NUMBER_NAME')) + { + $segments[] = 'P' . $pid . '-' . RedshopHelperUtility::convertToNonSymbol($product->product_name); + } + else + { + $segments[] = 'P-' . RedshopHelperUtility::convertToNonSymbol($product->product_name); + } + } + else + { + // Config option to generate sef using name : add product id to get parse in parseroute function + if (Redshop::getConfig()->get('ENABLE_SEF_NUMBER_NAME')) + { + $segments[] = 'P' . $pid . '-' . RedshopHelperUtility::convertToNonSymbol($url); + } + else + { + $segments[] = 'P-' . RedshopHelperUtility::convertToNonSymbol($url); + } + } + } + + break; + + case 'manufacturers': + + if (!$mid) + { + $mid = $myParams->get('manufacturer'); + } + + $segments[] = 'manufacturers'; + + if ($mid) + { + $segments[] = $mid; + + $manufacturer = RedshopEntityManufacturer::getInstance($mid); + + if ($manufacturer->isValid()) + { + if (!empty($manufacturer->get('sef_url'))) + { + $segments[] = str_replace($specialChars, '-', $manufacturer->get('sef_url')); + } + else + { + $segments[] = str_replace($specialChars, '-', $manufacturer->get('name')); + } + } + } + + if (!$mid) + { + if (!empty($menuItem->title)) + { + $segments[] = str_replace($specialChars, '-', $menuItem->title); + } + else + { + $segments[] = 'manufactures'; + } + } + + if ($layout !== 'detail' && $layout !== '') + { + $segments[] = $layout; + } + + break; + + case 'account': + + $segments[] = 'account'; + + if (!empty($task)) + { + $segments[] = $task; + } + else + { + if ($layout == 'mytags') + { + $segments[] = $layout; + + if ($tagId) + { + $segments[] = $tagId; + + $tag = RedshopEntityProduct_Tag::getInstance($tagId); + $segments[] = str_replace($specialChars, '-', $tag->get('tags_name')); + + if ($tagId && isset($edit)) + { + $segments[] = 'edit'; + } + + if ($tagId && isset($remove)) + { + $segments[] = 'remove'; + } + } + } + elseif ($layout == 'mywishlist') + { + $segments[] = $layout; + + if (isset($wishlistId)) + { + $segments[] = $wishlistId; + } + + if (isset($remove) && isset($pid)) + { + $segments[] = $pid; + $segments[] = 'delete'; + } + } + elseif ($layout == 'compare') + { + $segments[] = $layout; + + if (isset($remove) && isset($pid)) + { + $segments[] = $pid; + $segments[] = 'delete'; + } + } + } + + break; + + case 'quotation': + $segments[] = 'quotation'; + + break; + + case 'quotation_detail': + $segments[] = 'quotation_detail'; + $segments[] = $quotationId; + + break; + + default: + break; + } + + return $segments; + } + + /** + * Parse the segments of a URL. + * + * @param array $segments The segments of the URL to parse. + * + * @return array The URL attributes to be used by the application. + */ + public function parse(&$segments) + { + $vars = array(); + $firstSegment = $segments[0]; + + switch ($firstSegment) + { + case 'giftcard': + $vars['view'] = 'giftcard'; + + if (isset($segments[1])) + { + $vars['gid'] = $segments[1]; + } + + break; + + case 'cart': + $vars['view'] = 'cart'; + break; + + case 'search': + $vars['view'] = 'search'; + + if (isset($segments[1])) + { + $vars['layout'] = $segments[1]; + } + + if (isset($segments[2])) + { + $vars['category_id'] = $segments[2]; + } + break; + + case 'password': + $vars['view'] = 'password'; + break; + + case 'registration': + $vars['view'] = 'registration'; + break; + + case 'checkout': + $vars['view'] = 'checkout'; + break; + + case 'login': + $vars['view'] = 'login'; + break; + + case 'account_billto': + $vars['view'] = 'account_billto'; + break; + + case 'account_shipto': + $vars['view'] = 'account_shipto'; + + if (isset($segments[1])) + { + $vars['task'] = $segments[1]; + } + + if (isset($segments[2])) + { + $vars['infoid'] = $segments[2]; + } + + break; + + case 'manufacturers': + $vars['view'] = 'manufacturers'; + + if (isset($segments[1])) + { + $vars['mid'] = $segments[1]; + $vars['layout'] = 'detail'; + } + + if (isset($segments[3])) + { + $vars['layout'] = $segments[3]; + } + + break; + + case 'orders': + $vars['view'] = 'orders'; + + break; + + case 'order_detail': + $vars['view'] = 'order_detail'; + + if (isset($segments[1])) + { + $vars['oid'] = $segments[1]; + } + + if (isset($segments[2]) && $segments[2] == 'reorder') + { + $vars['task'] = $segments[2]; + $vars['order_id'] = $segments[1]; + } + elseif (isset($segments[2])) + { + $vars['layout'] = $segments[2]; + } + + break; + + case 'wishlist': + $vars['view'] = 'wishlist'; + + if (isset($segments[1])) + { + $vars['task'] = $segments[1]; + } + + if (isset($segments[2])) + { + $vars['wishlist_id'] = $segments[2]; + } + + break; + + case 'account': + $vars['view'] = 'account'; + + if (isset($segments[1])) + { + if ($segments[1] == 'deleteAccount') + { + $vars['task'] = $segments[1]; + } + else + { + $vars['layout'] = $segments[1]; + + if ($segments[1] == 'mytags') + { + if (isset($segments[2])) + { + $vars['tagid'] = $segments[2]; + + if (isset($segments[4])) + { + if ($segments[4] == 'edit') + { + $vars['edit'] = 1; + } + else + { + $vars['remove'] = 1; + } + } + } + } + elseif ($segments[1] == 'mywishlist') + { + if (isset($segments[2])) + { + $vars['wishlist_id'] = $segments[2]; + } + + if (isset($segments[3])) + { + $vars['pid'] = $segments[3]; + } + + if (isset($segments[4])) + { + $vars['remove'] = 1; + } + } + elseif ($segments[1] == 'compare') + { + if (isset($segments[2])) + { + $vars['pid'] = $segments[2]; + } + + if (isset($segments[3])) + { + $vars['remove'] = 1; + } + } + } + } + + break; + + case 'quotation': + $vars['view'] = 'quotation'; + + break; + + case 'quotation_detail': + $vars['view'] = 'quotation_detail'; + $vars['quoid'] = $segments[1]; + + break; + + default: + $last = count($segments) - 1; + $secondLast = $last - 1; + $main = explode(':', $segments[$last]); + + if (isset($segments[$last])) + { + if ($main[0][0] != 'P' && $segments[0] != 'compare') + { + if (Redshop::getConfig()->get('ENABLE_SEF_NUMBER_NAME')) + { + $vars['view'] = 'category'; + + if (isset($segments[$last])) + { + // Fetch category id + $categories = explode(':', $segments[$last]); + $categoryId = $categories[0]; + $vars['cid'] = $categoryId; + + if (isset($categories[2])) + { + $manufacturerId = $categories[2]; + $vars['manufacturer_id'] = $manufacturerId; + } + + $menu = JFactory::getApplication()->getMenu(); + $item = $menu->getActive(); + $vars['Itemid'] = $item->id; + } + } + else + { + $vars['view'] = 'category'; + + $menu = JFactory::getApplication()->getMenu(); + $item = $menu->getActive(); + + $vars['Itemid'] = ''; + $itemId = ''; + + if (!empty($item)) + { + $vars['Itemid'] = $item->id; + $itemId = $item->id; + } + + if (isset($segments[0]) && $segments[0] != $itemId) + { + $vars['cid'] = $segments[0]; + } + + if (isset($segments[2]) && !isset($vars['cid'])) + { + $vars['manufacturer_id'] = $segments[2]; + } + } + } + else + { + if (Redshop::getConfig()->get('ENABLE_SEF_NUMBER_NAME')) + { + $vars['view'] = 'product'; + + if (isset($segments[0])) + { + $categories = explode(':', $segments[0]); + $categoryId = $categories[0]; + $vars['cid'] = $categoryId; + } + + if (isset($segments[0]) && $segments[0] == 'compare') + { + $vars['layout'] = $segments[0]; + $vars['task'] = $segments[1]; + } + + if (isset($segments[$last])) + { + $products = explode(':', $segments[$last]); + $productId = substr($products[0], 1); + $vars['pid'] = $productId; + } + + $menu = JFactory::getApplication()->getMenu(); + $item = $menu->getActive(); + $vars['Itemid'] = $item->id; + } + else + { + $vars['view'] = 'product'; + + if (isset($segments[0]) && $segments[0] == 'compare') + { + $vars['layout'] = $segments[0]; + $vars['task'] = isset($segments[2]) ? $segments[2] : ''; + } + else + { + $vars['pid'] = $segments[0]; + } + + if (isset($segments[1])) + { + $vars['Itemid'] = $segments[1]; + } + + if (isset($segments[$secondLast])) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('id')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('name') . ' = ' . $db->q($segments[$secondLast])); + + $vars['cid'] = $db->setQuery($query)->loadResult(); + } + } + } + } + + break; + } + + return $vars; + } +} + +/** + * Build URL routes for redSHOP + * + * @param array $query Request variables + * + * @return array + */ +function redshopBuildRoute(&$query) +{ + $router = new RedshopRouter; + + return $router->build($query); +} + +/** + * Parse redSHOP sef url + * + * @param array $segments Sef Url segments + * + * @return array + */ +function redshopParseRoute($segments) +{ + $router = new RedshopRouter; + + return $router->parse($segments); +} diff --git a/component/site/views/account/index.html b/component/site/views/account/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/account/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/account/tmpl/cards.php b/component/site/views/account/tmpl/cards.php new file mode 100644 index 00000000000..f7affe1dca0 --- /dev/null +++ b/component/site/views/account/tmpl/cards.php @@ -0,0 +1,19 @@ +trigger('onListCreditCards', array()); + +if (empty($cards)) +{ + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_PAYMENT_NO_CREDIT_CARDS_PLUGIN_LIST_FOUND'), 'warning'); +} diff --git a/component/site/views/account/tmpl/cards.xml b/component/site/views/account/tmpl/cards.xml new file mode 100644 index 00000000000..902d1060563 --- /dev/null +++ b/component/site/views/account/tmpl/cards.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/account/tmpl/default.php b/component/site/views/account/tmpl/default.php new file mode 100755 index 00000000000..decf4782ec6 --- /dev/null +++ b/component/site/views/account/tmpl/default.php @@ -0,0 +1,499 @@ +input->getInt('Itemid'); +$params = $app->getParams('com_redshop'); +$returnitemid = $params->get('logout', $Itemid); + +$accountbillto_link = JRoute::_("index.php?option=com_redshop&view=account_billto&Itemid=" . $Itemid); +$accountshipto_link = JRoute::_("index.php?option=com_redshop&view=account_shipto&Itemid=" . $Itemid); +$logout_link = JRoute::_("index.php?option=com_redshop&view=login&task=logout&logout=" . $returnitemid . "&Itemid=" . $Itemid); +$compare_link = JRoute::_("index.php?option=com_redshop&view=product&layout=compare&Itemid=" . $Itemid); +$mytags_link = JRoute::_("index.php?option=com_redshop&view=account&layout=mytags&Itemid=" . $Itemid); +$wishlist_link = JRoute::_("index.php?option=com_redshop&view=wishlist&task=viewwishlist&Itemid=" . $Itemid); +$deleteAccountLink = JRoute::_("index.php?option=com_redshop&view=account&task=deleteAccount&Itemid=" . $Itemid); + +/** @var RedshopModelAccount $model */ +$model = $this->getModel('account'); +$template = RedshopHelperTemplate::getTemplate("account_template"); + +if (count($template) > 0 && $template[0]->template_desc != "") +{ + $template_desc = $template[0]->template_desc; +} +else +{ + $template_desc = "\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {welcome_introtext}
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {account_image}{account_title}

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {fullname_lbl}{fullname}
    {state_lbl}{state}
    {country_lbl}{country}
    {vatnumber_lbl}{vatnumber}
    {email_lbl}{email}
    {company_name_lbl}{company_name}
    {edit_account_link}
    {newsletter_signup_chk} {newsletter_signup_lbl}
    {customer_custom_fields}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n{order_loop_start} \r\n\r\n\r\n\r\n{order_loop_end} \r\n\r\n\r\n\r\n\r\n
    {order_image}{order_title}
    {order_index} {order_id} {order_detail_link}
    {more_orders}
    \r\n
    {shipping_image}{shipping_title}

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {edit_shipping_link}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n{quotation_loop_start} \r\n\r\n\r\n\r\n{quotation_loop_end}\r\n\r\n
    {quotation_image}{quotation_title}
    {quotation_index} {quotation_id} {quotation_detail_link}
    \r\n
    {product_serial_image}{product_serial_title}

    \r\n\r\n\r\n{product_serial_loop_start} \r\n\r\n\r\n\r\n{product_serial_loop_end}\r\n\r\n
    {product_name} {product_serial_number}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n{coupon_loop_start} \r\n\r\n\r\n\r\n\r\n\r\n\r\n{coupon_loop_end}\r\n\r\n
    {coupon_image}{coupon_title}
    {coupon_code_lbl} {coupon_code}
    {coupon_value_lbl} {coupon_value}
    \r\n
    {wishlist_image}{wishlist_title}

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {edit_wishlist_link}
    \r\n
    {compare_image}{compare_title}

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {edit_compare_link}
    \r\n
    {logout_link}{tag_image}{tag_title}

    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {edit_tag_link}
    \r\n
    "; +} + +$pagetitle = JText::_('COM_REDSHOP_ACCOUNT_MAINTAINANCE'); + +if ($this->params->get('show_page_heading', 1)) +{ + ?> +

    + params->get('page_title') != $pagetitle) + { + echo $this->escape($this->params->get('page_title')); + } + else + { + echo $pagetitle; + } ?> +

    +trigger('onReplaceAccountTemplate', array(&$template_desc, $this->userdata)); + +$template_desc = str_replace('{welcome_introtext}', Redshop::getConfig()->get('WELCOMEPAGE_INTROTEXT'), $template_desc); + +$logoutimg = ''; +$logout = '' . JText::_('COM_REDSHOP_LOGOUT') . ''; +$template_desc = str_replace('{logout_link}', $logoutimg . $logout, $template_desc); + +$account_img = ''; +$template_desc = str_replace('{account_image}', $account_img, $template_desc); +$template_desc = str_replace('{account_title}', JText::_('COM_REDSHOP_ACCOUNT_INFORMATION'), $template_desc); + +$template_desc = $carthelper->replaceBillingAddress($template_desc, $this->userdata); + +$edit_account_link = '' . JText::_('COM_REDSHOP_EDIT_ACCOUNT_INFORMATION') . ''; +$template_desc = str_replace('{edit_account_link}', $edit_account_link, $template_desc); + +$deleteAccount = '' . JText::_('COM_REDSHOP_DELETE_ACCOUNT') . ''; +$template_desc = str_replace('{delete_account_link}', $deleteAccount, $template_desc); + +$template_desc = $carthelper->replaceNewsletterSubscription($template_desc, 1); + +if (Redshop::getConfig()->get('SHIPPING_METHOD_ENABLE')) +{ + $shipping_image = ''; + $update_link = '' . JText::_('COM_REDSHOP_UPDATE_SHIPPING_INFO') . ''; + $template_desc = str_replace('{shipping_image}', $shipping_image, $template_desc); + $template_desc = str_replace('{shipping_title}', JText::_('COM_REDSHOP_SHIPPING_INFO'), $template_desc); + $template_desc = str_replace('{edit_shipping_link}', $update_link, $template_desc); +} +else +{ + $template_desc = str_replace('{shipping_image}', '', $template_desc); + $template_desc = str_replace('{shipping_title}', '', $template_desc); + $template_desc = str_replace('{edit_shipping_link}', '', $template_desc); +} + +$is_company = $this->userdata->is_company; + +if ($is_company == 1) +{ + $extrafields = RedshopHelperExtrafields::listAllFieldDisplay(8, $this->userdata->users_info_id); +} +else +{ + $extrafields = RedshopHelperExtrafields::listAllFieldDisplay(7, $this->userdata->users_info_id); +} + +$template_desc = str_replace('{customer_custom_fields}', $extrafields, $template_desc); + +if (strstr($template_desc, "{reserve_discount}")) +{ + $reserve_discount = Redshop\Account\Helper::getReserveDiscount(); + $reserve_discount = $producthelper->getProductFormattedPrice($reserve_discount); + + $template_desc = str_replace('{reserve_discount}', $reserve_discount, $template_desc); + $template_desc = str_replace('{reserve_discount_lbl}', JText::_('COM_REDSHOP_RESERVED_DISCOUNT_LBL'), $template_desc); +} + +if (strstr($template_desc, "{order_loop_start}") && strstr($template_desc, "{order_loop_end}")) +{ + $oder_image = ''; + $template_desc = str_replace('{order_image}', $oder_image, $template_desc); + $template_desc = str_replace('{order_title}', JText::_('COM_REDSHOP_ORDER_INFORMATION'), $template_desc); + + $orderslist = RedshopHelperOrder::getUserOrderDetails($user->id); + + // More Order information + + if (count($orderslist) > 0) + { + $ordermoreurl = JRoute::_('index.php?option=com_redshop&view=orders&Itemid=' . $Itemid); + $template_desc = str_replace('{more_orders}', "" . JText::_('COM_REDSHOP_MORE') . "", $template_desc); + } + else + { + $template_desc = str_replace('{more_orders}', "", $template_desc); + } + + $template_d1 = explode("{order_loop_start}", $template_desc); + $template_d2 = explode("{order_loop_end}", $template_d1[1]); + $order_desc = $template_d2[0]; + + $order_data = ''; + + if (count($orderslist)) + { + for ($j = 0, $jn = count($orderslist); $j < $jn; $j++) + { + if ($j >= 5) + { + break; + } + + $order_data .= $order_desc; + $orderdetailurl = JRoute::_('index.php?option=com_redshop&view=order_detail&oid=' . $orderslist[$j]->order_id . '&Itemid=' . $Itemid); + $order_detail = '' . JText::_('COM_REDSHOP_DETAILS') . ''; + + $order_data = str_replace('{order_index}', JText::_('COM_REDSHOP_ORDER_NUM'), $order_data); + $order_data = str_replace('{order_id}', $orderslist[$j]->order_id, $order_data); + $order_data = str_replace('{order_number}', $orderslist[$j]->order_number, $order_data); + $order_data = str_replace('{order_detail_link}', $order_detail, $order_data); + $order_data = str_replace('{order_total}', $producthelper->getProductFormattedPrice($orderslist[$j]->order_total), $order_data); + } + } + else + { + $order_data .= $order_desc; + $order_data = str_replace('{order_index}', '', $order_data); + $order_data = str_replace('{order_id}', '', $order_data); + $order_data = str_replace('{order_number}', '', $order_data); + $order_data = str_replace('{order_detail_link}', JText::_('COM_REDSHOP_NO_ORDERS_PLACED_YET'), $order_data); + $order_data = str_replace('{order_total}', '', $order_data); + } + + $template_desc = str_replace('{order_loop_start}', "", $template_desc); + $template_desc = str_replace('{order_loop_end}', "", $template_desc); + $template_desc = str_replace($order_desc, $order_data, $template_desc); +} + +if (strstr($template_desc, "{coupon_loop_start}") && strstr($template_desc, "{coupon_loop_end}")) +{ + $ctemplate_d1 = explode("{coupon_loop_start}", $template_desc); + $ctemplate_d2 = explode("{coupon_loop_end}", $ctemplate_d1[1]); + $coupon_desc = $ctemplate_d2[0]; + + $coupon_image = ''; + $coupon_imagelbl = ''; + $coupon_data = ''; + + if (Redshop::getConfig()->get('COUPONINFO')) + { + $coupon_imagelbl = JText::_('COM_REDSHOP_COUPON_INFO'); + $coupon_image = ''; + $usercoupons = $model->getUserCoupons($user->id); + + if (count($usercoupons)) + { + for ($i = 0, $in = count($usercoupons); $i < $in; $i++) + { + $coupon_data .= $coupon_desc; + $unused_amount = Redshop\Account\Helper::getUnusedCouponAmount($user->id, $usercoupons[$i]->code); + $coupon_data = str_replace('{coupon_code_lbl}', JText::_('COM_REDSHOP_COUPON_CODE'), $coupon_data); + $coupon_data = str_replace('{coupon_code}', $usercoupons[$i]->code, $coupon_data); + $coupon_data = str_replace('{coupon_value_lbl}', JText::_('COM_REDSHOP_COUPON_VALUE'), $coupon_data); + $coupon_data = str_replace('{unused_coupon_lbl}', JText::_('COM_REDSHOP_UNUSED_COUPON_LBL'), $coupon_data); + $coupon_data = str_replace('{unused_coupon_value}', $unused_amount, $coupon_data); + + $coupon_value = ($usercoupons[$i]->type == 0) ? RedshopHelperProductPrice::formattedPrice($usercoupons[$i]->coupon_value) : $usercoupons[$i]->value . ' %'; + $coupon_data = str_replace('{coupon_value}', $coupon_value, $coupon_data); + } + } + else + { + $coupon_data .= $coupon_desc; + $coupon_data = str_replace('{coupon_code_lbl}', '', $coupon_data); + $coupon_data = str_replace('{coupon_code}', '', $coupon_data); + $coupon_data = str_replace('{coupon_value_lbl}', '', $coupon_data); + $coupon_data = str_replace('{unused_coupon_value}', '', $coupon_data); + $coupon_data = str_replace('{unused_coupon_lbl}', '', $coupon_data); + $coupon_data = str_replace('{coupon_value}', JText::_('COM_REDSHOP_NO_COUPONS'), $coupon_data); + } + } + + $template_desc = str_replace('{coupon_loop_start}', "", $template_desc); + $template_desc = str_replace('{coupon_loop_end}', "", $template_desc); + $template_desc = str_replace($coupon_desc, $coupon_data, $template_desc); + $template_desc = str_replace('{coupon_image}', $coupon_image, $template_desc); + $template_desc = str_replace('{coupon_title}', $coupon_imagelbl, $template_desc); +} + + +if (strpos($template_desc, "{if coupon}") !== false && strpos($template_desc, "{coupon end if}") !== false) +{ + $template_d1 = explode("{if coupon}", $template_desc); + $template_d2 = explode("{coupon end if}", $template_d1[1]); + + if (Redshop::getConfig()->get('COUPONINFO') && count($usercoupons)) + { + $template_desc = str_replace("{if coupon}", "", $template_desc); + $template_desc = str_replace("{coupon end if}", "", $template_desc); + } + else + { + $template_desc = $template_d1[0] . $template_d2[1]; + } +} + +$tag_imagelbl = ''; +$tag_image = ''; +$tag_link = ''; + +if (Redshop::getConfig()->get('MY_TAGS')) +{ + $tag_imagelbl = JText::_('COM_REDSHOP_MY_TAGS'); + $tag_image = ''; + $tag_link = JText::_('COM_REDSHOP_NO_TAGS_AVAILABLE'); + $myTags = $model->countMyTags(); + + if ($myTags > 0) + { + $tag_link = '' . JText::_("COM_REDSHOP_SHOW_TAG") . ''; + } +} + +$template_desc = str_replace('{tag_image}', $tag_image, $template_desc); +$template_desc = str_replace('{tag_title}', $tag_imagelbl, $template_desc); +$template_desc = str_replace('{edit_tag_link}', $tag_link, $template_desc); + +if (strpos($template_desc, "{if tag}") !== false && strpos($template_desc, "{tag end if}") !== false) +{ + $template_d1 = explode("{if tag}", $template_desc); + $template_d2 = explode("{tag end if}", $template_d1[1]); + + if (Redshop::getConfig()->get('MY_TAGS') && $myTags > 0) + { + $template_desc = str_replace("{if tag}", "", $template_desc); + $template_desc = str_replace("{tag end if}", "", $template_desc); + } + else + { + $template_desc = $template_d1[0] . $template_d2[1]; + } +} + +$quotations = array(); + +if (strstr($template_desc, "{quotation_loop_start}") && strstr($template_desc, "{quotation_loop_end}")) +{ + $quotation_image = ''; + $template_desc = str_replace('{quotation_image}', $quotation_image, $template_desc); + $template_desc = str_replace('{quotation_title}', JText::_('COM_REDSHOP_QUOTATION_INFORMATION'), $template_desc); + + $quotations = RedshopHelperQuotation::getQuotationUserList(); + + // More Order information + if (!empty($quotations)) + { + $quotationmoreurl = JRoute::_('index.php?option=com_redshop&view=quotation&Itemid=' . $Itemid); + $template_desc = str_replace('{more_quotations}', "" . JText::_('COM_REDSHOP_MORE') . "", $template_desc); + } + + $template_d1 = explode("{quotation_loop_start}", $template_desc); + $template_d2 = explode("{quotation_loop_end}", $template_d1[1]); + $quotation_desc = $template_d2[0]; + + $quotation_data = ''; + + if (count($quotations)) + { + for ($j = 0, $jn = count($quotations); $j < $jn; $j++) + { + if ($j >= 5) + { + break; + } + + $quotation_data .= $quotation_desc; + $quotationurl = JRoute::_('index.php?option=com_redshop&view=quotation_detail&quoid=' . $quotations[$j]->quotation_id . '&Itemid=' . $Itemid); + $quotation_detail = '' . JText::_('COM_REDSHOP_DETAILS') . ''; + + $quotation_data = str_replace('{quotation_index}', JText::_('COM_REDSHOP_QUOTATION') . " #", $quotation_data); + $quotation_data = str_replace('{quotation_id}', $quotations[$j]->quotation_id, $quotation_data); + $quotation_data = str_replace('{quotation_detail_link}', $quotation_detail, $quotation_data); + } + } + else + { + $quotation_data .= $quotation_desc; + $quotation_data = str_replace('{quotation_index}', '', $quotation_data); + $quotation_data = str_replace('{quotation_id}', '', $quotation_data); + $quotation_data = str_replace('{quotation_detail_link}', JText::_('COM_REDSHOP_NO_QUOTATION_PLACED_YET'), $quotation_data); + } + + $template_desc = str_replace('{quotation_loop_start}', "", $template_desc); + $template_desc = str_replace('{quotation_loop_end}', "", $template_desc); + $template_desc = str_replace($quotation_desc, $quotation_data, $template_desc); +} + +$wishlist_imagelbl = ''; +$wishlist_image = ''; +$edit_wishlist_link = ''; +$myWishlist = 0; + +if (strpos($template_desc, "{if quotation}") !== false && strpos($template_desc, "{quotation end if}") !== false) +{ + $template_d1 = explode("{if quotation}", $template_desc); + $template_d2 = explode("{quotation end if}", $template_d1[1]); + + if (!empty($quotations)) + { + $template_desc = str_replace("{if quotation}", "", $template_desc); + $template_desc = str_replace("{quotation end if}", "", $template_desc); + } + else + { + $template_desc = $template_d1[0] . $template_d2[1]; + } +} + +if (Redshop::getConfig()->get('MY_WISHLIST')) +{ + $wishlist_imagelbl = JText::_('COM_REDSHOP_MY_WISHLIST'); + $wishlist_image = ''; + $edit_wishlist_link = JText::_('COM_REDSHOP_NO_PRODUCTS_IN_WISHLIST'); + $myWishlist = $model->countMyWishlist(); + + if ($myWishlist) + { + $edit_wishlist_link = '' . JText::_("COM_REDSHOP_SHOW_WISHLIST_PRODUCTS") . ''; + } +} + +$template_desc = str_replace('{wishlist_image}', $wishlist_image, $template_desc); +$template_desc = str_replace('{wishlist_title}', $wishlist_imagelbl, $template_desc); +$template_desc = str_replace('{edit_wishlist_link}', $edit_wishlist_link, $template_desc); + +if (strpos($template_desc, "{if wishlist}") !== false && strpos($template_desc, "{wishlist end if}") !== false) +{ + $template_d1 = explode("{if wishlist}", $template_desc); + $template_d2 = explode("{wishlist end if}", $template_d1[1]); + + + if ($myWishlist) + { + $template_desc = str_replace("{if wishlist}", "", $template_desc); + $template_desc = str_replace("{wishlist end if}", "", $template_desc); + } + else + { + $template_desc = $template_d1[0] . $template_d2[1]; + } +} + +$userDownloadProduct = array(); + +if (strstr($template_desc, "{product_serial_loop_start}") && strstr($template_desc, "{product_serial_loop_end}")) +{ + $product_serial_image = ''; + $template_desc = str_replace('{product_serial_image}', $product_serial_image, $template_desc); + $template_desc = str_replace('{product_serial_title}', JText::_('COM_REDSHOP_MY_SERIALS'), $template_desc); + + $template_d1 = explode("{product_serial_loop_start}", $template_desc); + $template_d2 = explode("{product_serial_loop_end}", $template_d1[1]); + $serial_desc = $template_d2[0]; + + $userDownloadProduct = Redshop\Account\Helper::getDownloadProductList($user->id); + + $serial_data = ''; + + if (!empty($userDownloadProduct)) + { + for ($j = 0, $jn = count($userDownloadProduct); $j < $jn; $j++) + { + $serial_data .= $serial_desc; + $serial_data = str_replace('{product_name}', $userDownloadProduct[$j]->product_name, $serial_data); + $serial_data = str_replace('{product_serial_number}', $userDownloadProduct[$j]->product_serial_number, $serial_data); + } + } + else + { + $serial_data .= $serial_desc; + $serial_data = str_replace('{product_name}', "", $serial_data); + $serial_data = str_replace('{product_serial_number}', "", $serial_data); + } + + $template_desc = str_replace('{product_serial_loop_start}', "", $template_desc); + $template_desc = str_replace('{product_serial_loop_end}', "", $template_desc); + $template_desc = str_replace($serial_desc, $serial_data, $template_desc); +} + +if (strpos($template_desc, "{if product_serial}") !== false && strpos($template_desc, "{product_serial end if}") !== false) +{ + $template_d1 = explode("{if product_serial}", $template_desc); + $template_d2 = explode("{product_serial end if}", $template_d1[1]); + + if (!empty($userDownloadProduct)) + { + $template_desc = str_replace("{if product_serial}", "", $template_desc); + $template_desc = str_replace("{product_serial end if}", "", $template_desc); + } + else + { + $template_desc = $template_d1[0] . $template_d2[1]; + } +} + +$cmp_imagelbl = ''; +$cmp_image = ''; +$cmp_link = ''; + +if (Redshop::getConfig()->get('COMPARE_PRODUCTS')) +{ + $cmp_imagelbl = JText::_('COM_REDSHOP_COMPARE_PRODUCTS'); + $cmp_image = ''; + $cmp_link = JText::_('COM_REDSHOP_NO_PRODUCTS_TO_COMPARE'); + $compare = new RedshopProductCompare; + + if (!$compare->isEmpty()) + { + $cmp_link = '' . JText::_("COM_REDSHOP_SHOW_PRODUCTS_TO_COMPARE") . ''; + } +} + +if (strpos($template_desc, "{if compare}") !== false && strpos($template_desc, "{compare end if}") !== false) +{ + $template_d1 = explode("{if compare}", $template_desc); + $template_d2 = explode("{compare end if}", $template_d1[1]); + + if (Redshop::getConfig()->get('COMPARE_PRODUCTS') && !$compare->isEmpty()) + { + $template_desc = str_replace("{if compare}", "", $template_desc); + $template_desc = str_replace("{compare end if}", "", $template_desc); + } + else + { + $template_desc = $template_d1[0] . $template_d2[1]; + } +} + +$template_desc = str_replace('{compare_image}', $cmp_image, $template_desc); +$template_desc = str_replace('{compare_title}', $cmp_imagelbl, $template_desc); +$template_desc = str_replace('{edit_compare_link}', $cmp_link, $template_desc); +$template_desc = str_replace('{if compare}', '', $template_desc); +$template_desc = str_replace('{compare end if}', '', $template_desc); + +$template_desc = RedshopHelperTemplate::parseRedshopPlugin($template_desc); +echo eval("?>" . $template_desc . " + + + + + + + + +
    + +
    +
    +
    diff --git a/component/site/views/account/tmpl/index.html b/component/site/views/account/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/account/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/account/tmpl/mytags.php b/component/site/views/account/tmpl/mytags.php new file mode 100644 index 00000000000..bdca5af7aaf --- /dev/null +++ b/component/site/views/account/tmpl/mytags.php @@ -0,0 +1,223 @@ +input->getInt('Itemid'); +$tagid = $app->input->getInt('tagid'); +$edit = $app->input->getInt('edit'); + +/** @var RedshopModelAccount $model */ +$model = $this->getModel('account'); +$user = JFactory::getUser(); + +$pagetitle = JText::_('COM_REDSHOP_MY_TAGS'); + +if ($this->params->get('show_page_heading', 1)) +{ + ?> +

    + +

    + +id != 0) +{ + if (isset($tagid)) + { + if (isset($edit)) + { + $link = JRoute::_('index.php?option=com_redshop&view=account&Itemid=' . $Itemid); + + ?> +
     
    +
    + + + + + + +
    + + + + + +
    +
    +
     
    +
    + + +
    + getMyDetail(); + + $link_edit = 'index.php?option=com_redshop&view=account&layout=mytags&edit=1&tagid=' . $tagid . '&Itemid=' . $Itemid; + $link_remove = 'index.php?option=com_redshop&view=account&layout=mytags&remove=1&tagid=' . $tagid . '&Itemid=' . $Itemid; + ?> + + + + + + +
    +  | + +
    +
     
    + + + + +
    + 0) + { + foreach ($MyTags as $row) + { + $data_add = '
    '; + $thum_image = ""; + + $pname = $row->product_name; + + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $row->product_id . '&Itemid=' . $Itemid); + + if ($row->product_full_image) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $row->product_full_image, + '', + 'thumb', + 'product', + Redshop::getConfig()->get('THUMB_WIDTH'), + Redshop::getConfig()->get('THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $thum_image = "
    get('THUMB_HEIGHT') . "px;margin-left:20px;' >
    "; + $data_add .= $thum_image; + } + + $pname = ""; + $data_add .= $pname; + + // For attribute price count + $price_add = '' . $extra_data->getProductFormattedPrice($row->product_price) . ''; + + $tax_amount = $extra_data->getProductTax($row->product_id); + + if ($tax_amount == 0) + $data_add .= '
    ' . $price_add . '
    '; + else + $data_add .= '
    ' . $extra_data->getProductFormattedPrice($tax_amount) . '
    '; + + // Start cart + + ($tax_amount == 0) ? $product_price = $row->product_price : $product_price = $tax_amount; + + $data_add .= "
    + + + + + + " . JText::_('COM_REDSHOP_ADD_TO_CART') . " +
    +
    "; + $i++; + $data_add .= '
    '; + echo $data_add; + } + } + else + { + echo "
    " . JText::_('COM_REDSHOP_NO_PRODUCTS_IN_TAGS') . "
    "; + } + + ?> +
    +
     
    + + + + + + + + +
    +
    + + +
    +
    + pagination->getPagesLinks(); ?> +

    +
    + pagination->getPagesCounter(); ?> +
    +
     
    + getMyDetail(); + ?> +
    + + + + + +
    + + tags_name; ?> + +
    +
    +
     
    +
    + +
    + input; + +JHtml::_('behavior.modal'); + +// Get product helper +$producthelper = productHelper::getInstance(); +$configobj = Redconfiguration::getInstance(); +$redTemplate = Redtemplate::getInstance(); +$extraField = extraField::getInstance(); + +$session = JFactory::getSession(); +$Itemid = $input->getInt('Itemid'); +$wishlist_id = $input->getInt('wishlist_id'); +$mail = $input->getInt('mail', 0); +$window = $input->getInt('window'); + +/** @var RedshopModelAccount $model */ +$model = $this->getModel('account'); + +/** @var RedshopModelProduct $productModel */ +$productModel = $this->getModel('product'); +$user = JFactory::getUser(); + +$pagetitle = JText::_('COM_REDSHOP_MY_WISHLIST'); +$isIndividualAddToCart = (boolean) Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE'); + +if ($window == 1) +{ + ?> + + close(); +} + +if ($this->params->get('show_page_heading', 1)) +{ + ?> +

    + +

    +
     
    +getMyDetail(); + $template = RedshopHelperTemplate::getTemplate("wishlist_template"); + + if (count($template) > 0 && $template[0]->template_desc != "") + { + $data = $template[0]->template_desc; + } + else + { + $data = "
    {mail_link}
    {product_loop_start}
    {product_thumb_image}
    {product_name}
    {product_price}
    {form_addtocart:templet1}
    {remove_product_link}


    {product_loop_end}
    {back_link}
    "; + } + + $template_d1 = explode("{product_loop_start}", $data); + $template_d2 = explode("{product_loop_end}", $template_d1[1]); + + $mlink = JURI::root() . "index.php?option=com_redshop&view=account&layout=mywishlist&mail=1&tmpl=component&wishlist_id=" . $wishlist_id; + + $mail_link = ''; + + if (count($MyWishlist) > 0) + { + $template_d1[0] = str_replace('{mail_link}', $mail_link, $template_d1[0]); + } + else + { + $template_d1[0] = str_replace('{mail_link}', "", $template_d1[0]); + } + + $wishlist_desc = $template_d2[0]; + + if (strstr($data, '{product_thumb_image_2}')) + { + $tag = '{product_thumb_image_2}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT_2'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH_2'); + } + elseif (strstr($data, '{product_thumb_image_3}')) + { + $tag = '{product_thumb_image_3}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT_3'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH_3'); + } + elseif (strstr($data, '{product_thumb_image_1}')) + { + $tag = '{product_thumb_image_1}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + else + { + $tag = '{product_thumb_image}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + + $temp_template = ''; + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(1, 1, 1); + + if (count($MyWishlist) > 0) + { + $mainid = null; + $totattid = null; + $totcount_no_user_field = null; + $newWishList = array(); + + // Process for clone product follow attribute data. + foreach ($MyWishlist as $wishList) + { + $wishList->wishlistData = RedshopHelperWishlist::getWishlist($wishList->wishlist_id); + $dataForCheck = null; + + if (!empty($wishList->wishlistData->products) && !empty($wishList->wishlistData->products[$wishList->product_id])) + { + $dataForCheck = $wishList->wishlistData->products[$wishList->product_id]; + } + + if (!$dataForCheck) + { + $wishList->wishlistData = null; + $newWishList[] = $wishList; + + continue; + } + + foreach ($dataForCheck as $productData) + { + $tmpWishList = clone $wishList; + $tmpWishList->wishlistData = $productData; + $newWishList[] = $tmpWishList; + } + } + + $MyWishlist = $newWishList; + + foreach ($MyWishlist as $row) + { + $wishlistuserfielddata = $producthelper->getwishlistuserfieldata($row->wishlist_id, $row->product_id); + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $row->product_id . '&Itemid=' . $Itemid); + $link_remove = 'index.php?option=com_redshop&view=account&layout=mywishlist&wishlist_id=' . $wishlist_id + . '&pid=' . $row->product_id . '&remove=1'; + + if ($isIndividualAddToCart) + { + $link_remove .= '&wishlist_product_id=' . $row->wishlistData->wishlist_product_id; + } + + $link_remove = JRoute::_($link_remove . '&Itemid=' . $Itemid, false); + + $thum_image = Redshop\Product\Image\Image::getImage($row->product_id, $link, $w_thumb, $h_thumb); + $product_price = Redshop\Product\Price::getPrice($row->product_id); + $product_price_discount = $producthelper->getProductNetPrice($row->product_id); + + $pname = "" . $row->product_name . ""; + $wishlist_data = str_replace($tag, $thum_image, $wishlist_desc); + $wishlist_data = str_replace('{product_number}', $row->product_number, $wishlist_data); + $wishlist_data = str_replace('{product_name}', $pname, $wishlist_data); + /*if($product_price > $product_price_discount) + { + $wishlist_data = str_replace('{product_price}', $producthelper->getProductFormattedPrice($product_price_discount) , $wishlist_data); + }else{ + $wishlist_data = str_replace('{product_price}', $producthelper->getProductFormattedPrice($product_price) , $wishlist_data); + }*/ + $wishlist_data = str_replace('{product_s_desc}', $row->product_s_desc, $wishlist_data); + + // Checking for child products start + if (strstr($wishlist_data, "{child_products}")) + { + $parentproductid = $row->product_id; + + if ($this->data->product_parent_id != 0) + { + $parentproductid = $producthelper->getMainParentProduct($row->product_id); + } + + $frmChild = ""; + + if ($parentproductid != 0) + { + $productInfo = $producthelper->getProductById($parentproductid); + + // Get child products + $childproducts = $productModel->getAllChildProductArrayList(0, $parentproductid); + + if (count($childproducts) > 0) + { + $childproducts = array_merge(array($productInfo), $childproducts); + + $cld_name = array(); + + if (count($childproducts) > 0) + { + $parentid = 0; + + for ($c = 0, $cn = count($childproducts); $c < $cn; $c++) + { + if ($childproducts[$c]->product_parent_id == 0) + { + $level = ""; + } + + $parentid = $childproducts[$c]->product_parent_id; + + $childproducts[$c]->product_name = $level . $childproducts[$c]->product_name; + } + + $cld_name = @array_merge($cld_name, $childproducts); + } + + $selected = array($row->product_id); + $lists['product_child_id'] = JHTML::_('select.genericlist', $cld_name, 'pid', 'class="inputbox" size="1" onchange="document.frmChild.submit();"', 'product_id', 'product_name', $selected); + + $frmChild .= "
    "; + $frmChild .= JText::_('COM_REDSHOP_CHILD_PRODUCTS') . $lists ['product_child_id']; + $frmChild .= ""; + $frmChild .= ""; + $frmChild .= ""; + $frmChild .= ""; + $frmChild .= "
    "; + } + } + + $wishlist_data = str_replace("{child_products}", $frmChild, $wishlist_data); + } + + $childproduct = RedshopHelperProduct::getChildProduct($row->product_id); + + if (count($childproduct) > 0) + { + if (Redshop::getConfig()->get('PURCHASE_PARENT_WITH_CHILD') == 1) + { + $isChilds = false; + $attributes_set = array(); + + if ($row->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $row->attribute_set_id, 0, 1); + } + + $attributes = $producthelper->getProductAttribute($row->product_id); + + $attributes = array_merge($attributes, $wishlist_data); + } + else + { + $isChilds = true; + $attributes = array(); + } + } + else + { + $isChilds = false; + $attributes_set = array(); + + if ($row->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $row->attribute_set_id, 0, 1); + } + + $attributes = $producthelper->getProductAttribute($row->product_id); + $attributes = array_merge($attributes, $attributes_set); + } + + $attribute_template = \Redshop\Template\Helper::getAttribute($wishlist_data); + + $wishlistData = $row->wishlistData; + + if ($wishlistData) + { + // Get necessary data for attributes, properties and sub-attributes. + foreach ($attributes as $key => $attribute) + { + if (empty($attribute->properties)) + { + continue; + } + + if (!isset($wishlistData->product_items[$attribute->attribute_id])) + { + if ($isIndividualAddToCart) + { + unset($attributes[$key]); + } + + continue; + } + + $wishlistProductItem = $wishlistData->product_items[$attribute->attribute_id]; + + foreach ($attribute->properties as $property) + { + $property->setdefault_selected = 0; + + if ($property->property_id != $wishlistProductItem->property_id) + { + continue; + } + + $property->setdefault_selected = 1; + + if (empty($wishlistProductItem->subattribute_id)) + { + continue; + } + + if (empty($property->sub_properties)) + { + $property->sub_properties = RedshopHelperProduct_Attribute::getAttributeSubProperties(0, $property->value); + } + + foreach ($property->sub_properties as $subProperty) + { + $subProperty->setdefault_selected = 0; + + if ($subProperty->subattribute_color_id == $wishlistProductItem->subattribute_id + && $subProperty->subattribute_id == $wishlistProductItem->attribute_id) + { + $subProperty->setdefault_selected = 1; + } + } + } + } + + $attributes = array_values($attributes); + } + + // Check product for not for sale + $wishlist_data = $producthelper->getProductNotForSaleComment($row, $wishlist_data, $attributes); + + $wishlist_data = Redshop\Product\Stock::replaceInStock($row->product_id, $wishlist_data, $attributes, $attribute_template); + + // Product attribute Start + $totalatt = count($attributes); + $wishlist_data = RedshopHelperAttribute::replaceAttributeData( + $row->product_id, 0, 0, $attributes, $wishlist_data, $attribute_template, $isChilds, array(), 1, true + ); + + // Product attribute End + // Checking for child products end + + // Product accessory Start + $accessory = $producthelper->getProductAccessory(0, $row->product_id); + $totalAccessory = count($accessory); + + $wishlist_data = RedshopHelperProductAccessory::replaceAccessoryData($row->product_id, 0, $accessory, $wishlist_data, $isChilds); + + // Product accessory End + + // Product User Field Start + $count_no_user_field = 0; + $returnArr = $producthelper->getProductUserfieldFromTemplate($wishlist_data); + $template_userfield = $returnArr[0]; + + $userfieldArr = $returnArr[1]; + + if (strstr($wishlist_data, "{if product_userfield}") && strstr($wishlist_data, "{product_userfield end if}") && $template_userfield != "") + { + $ufield = ""; + $cart = $session->get('cart'); + + if (isset($cart['idx'])) + { + $idx = (int) ($cart['idx']); + } + + $idx = 0; + $cart_id = ''; + + for ($j = 0; $j < $idx; $j++) + { + if ($cart[$j]['product_id'] == $row->product_id) + { + $cart_id = $j; + } + } + + for ($ui = 0; $ui < count($userfieldArr); $ui++) + { + if (!$idx) + { + $cart_id = ""; + } + + $productUserFieldsFinal = $wishlistuserfielddata[$ui]->userfielddata; + + if ($productUserFieldsFinal != '') + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', '', 0, $row->product_id, $productUserFieldsFinal, 1); + } + else + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', $cart_id, 0, $row->product_id); + } + + $ufield .= $productUserFields[1]; + + // + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + $wishlist_data = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $wishlist_data); + $wishlist_data = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $wishlist_data); + } + + $productUserFieldsForm = "
    "; + + if ($ufield != "") + { + $wishlist_data = str_replace("{if product_userfield}", $productUserFieldsForm, $wishlist_data); + $wishlist_data = str_replace("{product_userfield end if}", "
    ", $wishlist_data); + } + else + { + $wishlist_data = str_replace("{if product_userfield}", "", $wishlist_data); + $wishlist_data = str_replace("{product_userfield end if}", "", $wishlist_data); + } + } + + // Product User Field End + + $rmore = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $wishlist_data = str_replace("{read_more}", $rmore, $wishlist_data); + $wishlist_data = str_replace("{read_more_link}", $link, $wishlist_data); + $remove = '' . JText::_("COM_REDSHOP_REMOVE_PRODUCT_FROM_WISHLIST") . ''; + $wishlist_data = str_replace('{remove_product_link}', $remove, $wishlist_data); + + // Extra field display + $wishlist_data = $producthelper->getExtraSectionTag($extraFieldName, $row->product_id, "1", $wishlist_data, 1); + + $wishlist_data = str_replace("{if product_on_sale}", "", $wishlist_data); + $wishlist_data = str_replace("{product_on_sale end if}", "", $wishlist_data); + + if (isset($row->category_id) === false) + { + $row->category_id = 0; + } + + if ($isIndividualAddToCart) + { + $wishlist_data = Redshop\Cart\Render::replace( + $row->product_id, $row->category_id, 0, 0, $wishlist_data, $isChilds, + $userfieldArr, $totalatt, $totalAccessory, $count_no_user_field, $row->wishlistData->wishlist_product_id + ); + } + else + { + $wishlist_data = Redshop\Cart\Render::replace( + $row->product_id, $row->category_id, 0, 0, $wishlist_data, $isChilds, + $userfieldArr, $totalatt, $totalAccessory, $count_no_user_field + ); + } + + $mainid .= $row->product_id . ","; + $totattid .= $totalatt . ","; + $totcount_no_user_field .= $count_no_user_field . ","; + + $temp_template .= $wishlist_data; + } + + $my = "
    "; + + $my .= " + + + + +
    "; + } + else + { + echo "
    " . JText::_('COM_REDSHOP_NO_PRODUCTS_IN_WISHLIST') . "
    "; + $my = ''; + } + + $data = $template_d1[0] . $temp_template . $template_d2[1]; + + $back_link = '' . JText::_('COM_REDSHOP_BACK_TO_MYACCOUNT') . ''; + $data = str_replace('{back_link}', $back_link, $data); + $mail_link = ''; + + if (count($MyWishlist) > 0) + { + $mlink = JURI::root() . "index.php?option=com_redshop&view=account&layout=mywishlist&mail=1&tmpl=component&wishlist_id=" . $wishlist_id; + $mail_link = ''; + } + + $data = str_replace('{mail_link}', $mail_link, $data); + $data = str_replace('{all_cart}', $my, $data); + $data = RedshopHelperTemplate::parseRedshopPlugin($data); + echo eval("?>" . $data . " 0 && $mailtemplate[0]->template_desc != "") + { + $wishlist_maildata = $mailtemplate[0]->template_desc; + } + else + { + $wishlist_maildata = "
    {email_to_friend}
    {emailto_lbl}{emailto}
    {sender_lbl}{sender}
    {mail_lbl}{mail}
    {subject_lbl}{subject}
    {cancel_button} {send_button}
    "; + } + + $data = '
    '; + $data .= $wishlist_maildata; + $data = str_replace("{email_to_friend}", JText::_("COM_REDSHOP_EMAIL_TO_FRIEND"), $data); + $data = str_replace("{emailto_lbl}", JText::_("COM_REDSHOP_EMAIL_TO"), $data); + $email_to_field = ''; + $data = str_replace("{emailto}", $email_to_field, $data); + $data = str_replace("{sender_lbl}", JText::_('COM_REDSHOP_SENDER'), $data); + $sender_field = ''; + $data = str_replace("{sender}", $sender_field, $data); + $data = str_replace("{mail_lbl}", JText::_('COM_REDSHOP_YOUR_EMAIL'), $data); + $email_field = ''; + $data = str_replace("{mail}", $email_field, $data); + $data = str_replace("{subject_lbl}", JText::_('COM_REDSHOP_SUBJECT'), $data); + $subject = ''; + $data = str_replace("{subject}", $subject, $data); + + $cancel_btn = ''; + $data = str_replace("{cancel_button}", $cancel_btn, $data); + + $send_btn = ''; + $data = str_replace("{send_button}", $send_btn, $data); + + $data .= '' + . '' + . '' + . '' + . '' + . ''; + $data .= '
    '; + echo eval("?>" . $data . " + + + + + + + diff --git a/component/site/views/account/view.html.php b/component/site/views/account/view.html.php new file mode 100644 index 00000000000..a70c7c44271 --- /dev/null +++ b/component/site/views/account/view.html.php @@ -0,0 +1,166 @@ +input; + $params = $app->getParams('com_redshop'); + + RedshopHelperBreadcrumb::generate(); + + $itemId = $input->getInt('Itemid'); + $layout = $input->getCmd('layout'); + + /** @var RedshopModelAccount $model */ + $model = $this->getModel(); + $user = JFactory::getUser(); + + $userData = $model->getUserAccountInfo($user->id); + + if (!count($userData) && $layout != 'mywishlist') + { + $app->redirect( + JRoute::_("index.php?option=com_redshop&view=account_billto&Itemid=" . $itemId), + JText::_('COM_REDSHOP_LOGIN_USER_IS_NOT_REDSHOP_USER') + ); + } + + $layout = $input->getCmd('layout', 'default'); + $mail = $input->getInt('mail'); + + // Preform security checks. Give permission to send wishlist while not logged in + if (($user->id == 0 && $layout != 'mywishlist') || ($user->id == 0 && $layout == 'mywishlist' && !isset($mail))) + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=login&Itemid=' . $itemId, false)); + } + + if ($layout == 'mytags') + { + JLoader::import('joomla.html.pagination'); + $this->setLayout('mytags'); + + $remove = $input->getInt('remove', 0); + + if ($remove == 1) + { + $model->removeTag(); + } + + $maxcategory = $params->get('maxcategory', 5); + $limit = $app->getUserStateFromRequest($model->context . 'limit', 'limit', $maxcategory, 5); + $limitstart = $input->getInt('limitstart', 0, '', 'int'); + $total = $this->get('total'); + $pagination = new JPagination($total, $limitstart, $limit); + $this->pagination = $pagination; + } + + if ($layout == 'mywishlist') + { + $wishlistId = $input->getInt('wishlist_id', 0); + + if ($wishlistId == 0 && !Redshop::getConfig()->get('WISHLIST_LIST')) + { + $usersWishlist = RedshopHelperWishlist::getUserWishlist(); + $usersWishlist = reset($usersWishlist); + + $app->redirect( + JRoute::_( + "index.php?option=com_redshop&view=account&layout=mywishlist&wishlist_id=" + . $usersWishlist->wishlist_id . "&Itemid=" . $itemId, + false + ) + ); + } + + // If wishlist Id is not set then redirect to it's main page + if ($wishlistId == 0) + { + $app->redirect(JRoute::_("index.php?option=com_redshop&view=wishlist&layout=viewwishlist&Itemid=" . $itemId)); + } + + JLoader::import('joomla.html.pagination'); + + $this->setLayout('mywishlist'); + + $remove = $input->getInt('remove', 0); + + if ($remove == 1) + { + $model->removeWishlistProduct(); + } + + $maxcategory = $params->get('maxcategory', 5); + $limit = $app->getUserStateFromRequest($model->context . 'limit', 'limit', $maxcategory, 5); + $limitstart = $input->getInt('limitstart', 0, '', 'int'); + $total = $this->get('total'); + $pagination = new JPagination($total, $limitstart, $limit); + $this->pagination = $pagination; + } + + if ($layout == 'compare') + { + $remove = $input->getInt('remove', 0); + + if ($remove == 1) + { + $model->removeCompare(); + } + + JLoader::import('joomla.html.pagination'); + $this->setLayout('compare'); + } + + $this->user = $user; + $this->userdata = $userData; + $this->params = $params; + + parent::display($tpl); + } +} diff --git a/component/site/views/account_billto/index.html b/component/site/views/account_billto/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/account_billto/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/account_billto/tmpl/default.php b/component/site/views/account_billto/tmpl/default.php new file mode 100644 index 00000000000..78c14f4301d --- /dev/null +++ b/component/site/views/account_billto/tmpl/default.php @@ -0,0 +1,78 @@ +trigger('onRenderCustomField', array($this->billingaddresses->users_info_id)); +$input = JFactory::getApplication()->input; +$userHelper = rsUserHelper::getInstance(); +$user = JFactory::getUser(); +$itemId = $input->getInt('Itemid', 0); +$isEdit = $input->getInt('is_edit', 0); +$return = $input->getString('return', ""); + +$post = (array) $this->billingaddresses; +$post["email1"] = $post["email"] = $post["user_email"]; + +if ($user->username) +{ + $post["username"] = $user->username; +} + +$createAccount = 1; + +if ($post["user_id"] < 0) +{ + $createAccount = 0; +} +?> + +params->get('show_page_heading', 1)) +{ + ?> +

    + escape(JText::_('COM_REDSHOP_BILLING_ADDRESS_INFORMATION_LBL')); ?>

    + + +
    +
    + + billingaddresses->is_company, $this->lists, 0, 0, $createAccount); ?> + + + + + +
    +
    + + "/> + + + + + +
    diff --git a/component/site/views/account_billto/tmpl/index.html b/component/site/views/account_billto/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/account_billto/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/account_billto/view.html.php b/component/site/views/account_billto/view.html.php new file mode 100644 index 00000000000..49c22269222 --- /dev/null +++ b/component/site/views/account_billto/view.html.php @@ -0,0 +1,125 @@ +getParams('com_redshop'); + + $billingAddresses = Redshop\User\Billing\Billing::getGlobal(); + + if (empty($billingAddresses) || $billingAddresses == new stdClass) + { + /** @var RedshopModelAccount_Billto $model */ + $model = $this->getModel('account_billto'); + + $billingAddresses = $model->_initData(); + } + + $user = JFactory::getUser(); + $uri = JUri::getInstance(); + $session = JFactory::getSession(); + $auth = $session->get('auth'); + + if (!is_array($auth)) + { + $auth['users_info_id'] = 0; + $session->set('auth', $auth); + $auth = $session->get('auth'); + } + + JHtml::_('redshopjquery.framework'); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/jquery.validate.min.js', false, true); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.common.min.js', false, true); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.registration.min.js', false, true); + /** @scrutinizer ignore-deprecated */ + JHtml::stylesheet('com_redshop/redshop.validation.min.css', array(), true); + + // Preform security checks + if ($user->id == 0 && $auth['users_info_id'] == 0) + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=login&Itemid=' . JRequest::getInt('Itemid'))); + $app->close(); + } + + $lists = array( + 'requesting_tax_exempt' => JHtml::_( + 'select.booleanlist', + 'requesting_tax_exempt', + 'class="inputbox"', + $billingAddresses->requesting_tax_exempt + ) + ); + + if ($billingAddresses->is_company) + { + $lists['extra_field_company'] = Redshop\Fields\SiteHelper::renderFields( + RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS, $billingAddresses->users_info_id + ); + } + else + { + $lists['extra_field_user'] = Redshop\Fields\SiteHelper::renderFields( + RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS, $billingAddresses->users_info_id + ); + } + + $this->request_url = $uri->toString(); + + $this->lists = $lists; + $this->billingaddresses = $billingAddresses; + JFilterOutput::cleanText($this->request_url); + $this->params = $params; + + parent::display($tpl); + } +} diff --git a/component/site/views/account_shipto/index.html b/component/site/views/account_shipto/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/account_shipto/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/account_shipto/tmpl/default.php b/component/site/views/account_shipto/tmpl/default.php new file mode 100755 index 00000000000..387b4e3ff36 --- /dev/null +++ b/component/site/views/account_shipto/tmpl/default.php @@ -0,0 +1,90 @@ +input; +$itemId = $input->getInt('Itemid', 0); +$isEdit = $input->getInt('is_edit', 0); +$return = $input->getString('return', ""); +$addLink = "index.php?option=com_redshop&view=account_shipto&task=addshipping&Itemid=" . $itemId; +$backLink = "index.php?option=com_redshop&view=account&Itemid=" . $itemId; +$pageTitle = JText::_('COM_REDSHOP_SHIPPING_ADDRESS_INFO_LBL'); +?> + + + +params->get('show_page_heading', 1)): ?> + params->get('page_title') != $pageTitle): ?> +

    + escape(JText::_('COM_REDSHOP_SHIPPING_ADDRESS_INFO_LBL')); ?> +

    + +

    +

    + + + +
    + + + get('OPTIONAL_SHIPPING_ADDRESS')): ?> + + + + + + shippingAddresses)): ?> + + shippingAddresses); $i++): ?> + shippingAddresses[$i]->users_info_id . "&Itemid=" . $itemId; ?> + shippingAddresses[$i]->users_info_id . "&Itemid=" . $itemId; ?> + + + + + + + shippingAddresses); $i++): ?> + + + + + + + + + + + + + + + +
    -
    + - " . $this->shippingAddresses[$i]->text . ""; ?> + + +
    + - shippingAddresses[$i]->text; ?> +
    + +   + + +
    +
    diff --git a/component/site/views/account_shipto/tmpl/form.php b/component/site/views/account_shipto/tmpl/form.php new file mode 100644 index 00000000000..5a28f27956f --- /dev/null +++ b/component/site/views/account_shipto/tmpl/form.php @@ -0,0 +1,124 @@ +input; +$itemId = $input->getInt('Itemid', 0); +$isEdit = $input->getInt('is_edit', 0); +$return = $input->getString('return', ""); +$infoId = $input->getInt('infoid', 0); +$userHelper = rsUserHelper::getInstance(); +$dispatcher->trigger('onRenderCustomField', array($infoId)); + +$post = (array) $this->shippingAddresses; + +$post['firstname_ST'] = $post['firstname']; +$post['lastname_ST'] = $post['lastname']; +$post['address_ST'] = $post['address']; +$post['city_ST'] = $post['city']; +$post['zipcode_ST'] = $post['zipcode']; +$post['phone_ST'] = $post['phone']; +$post['country_code_ST'] = $post['country_code']; +$post['state_code_ST'] = $post['state_code']; +?> + +
    +
    +
    + + getShippingTable($post, $this->billingAddresses->is_company, $this->lists); ?> + + + + + +
    +
    +
    + + + + + + + + + + + + + + + +
    diff --git a/component/site/views/account_shipto/tmpl/index.html b/component/site/views/account_shipto/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/account_shipto/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/account_shipto/view.html.php b/component/site/views/account_shipto/view.html.php new file mode 100644 index 00000000000..c75b0e46a9e --- /dev/null +++ b/component/site/views/account_shipto/view.html.php @@ -0,0 +1,139 @@ +input->getCmd('task'); + $user = JFactory::getUser(); + + // Preform security checks + $session = JFactory::getSession(); + $auth = $session->get('auth'); + $lists = array(); + $billingAddress = new stdClass; + + if ($user->id) + { + $billingAddress = RedshopHelperOrder::getBillingAddress($user->id); + } + elseif (isset($auth['users_info_id']) && $auth['users_info_id']) + { + $model = $this->getModel('account_shipto'); + $billingAddress = $model->_loadData($auth['users_info_id']); + } + else + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=login&Itemid=' . $app->input->getInt('Itemid', 0))); + $app->close(); + } + + if ($task == 'addshipping') + { + JHtml::_('redshopjquery.framework'); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/jquery.validate.min.js', false, true); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.common.min.js', false, true); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.registration.min.js', false, true); + /** @scrutinizer ignore-deprecated */ + JHtml::stylesheet('com_redshop/redshop.validation.min.css', array(), true); + + $shippingAddresses = $this->get('Data'); + + if ($shippingAddresses->users_info_id > 0 && $shippingAddresses->user_id != $billingAddress->user_id) + { + echo JText::_('COM_REDSHOP_ALERTNOTAUTH'); + + return; + } + + $lists['shipping_customer_field'] = Redshop\Fields\SiteHelper::renderFields( + RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS, $shippingAddresses->users_info_id + ); + $lists['shipping_company_field'] = Redshop\Fields\SiteHelper::renderFields( + RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS, $shippingAddresses->users_info_id + ); + + $this->setLayout('form'); + } + else + { + if ($user->id) + { + $shippingAddresses = RedshopHelperOrder::getShippingAddress($user->id); + } + else + { + $shippingAddresses = RedshopHelperOrder::getShippingAddress(-$auth['users_info_id']); + } + } + + $this->lists = $lists; + $this->shippingAddresses = $shippingAddresses; + $this->billingAddresses = $billingAddress; + $this->request_url = JUri::getInstance()->toString(); + + JFilterOutput::cleanText($this->request_url); + $this->params = $app->getParams(); + + parent::display($tpl); + } +} diff --git a/component/site/views/ask_question/index.html b/component/site/views/ask_question/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/ask_question/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/ask_question/tmpl/default.php b/component/site/views/ask_question/tmpl/default.php new file mode 100644 index 00000000000..da558e85674 --- /dev/null +++ b/component/site/views/ask_question/tmpl/default.php @@ -0,0 +1,29 @@ +input->getInt('questionSend', 0)) +{ + $displayData = array( + 'form' => $this->form, + 'ask' => $app->input->getInt('ask', 0) + ); + echo RedshopLayoutHelper::render('product.ask_question', $displayData); +} +else +{ + ?> + + + + \ No newline at end of file diff --git a/component/site/views/ask_question/view.html.php b/component/site/views/ask_question/view.html.php new file mode 100644 index 00000000000..3f22549c293 --- /dev/null +++ b/component/site/views/ask_question/view.html.php @@ -0,0 +1,43 @@ +state = $this->get('State'); + $this->form = $this->get('Form'); + + parent::display($tpl); + } +} diff --git a/component/site/views/cart/index.html b/component/site/views/cart/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/cart/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/cart/tmpl/change_attribute.php b/component/site/views/cart/tmpl/change_attribute.php new file mode 100644 index 00000000000..726e06038c1 --- /dev/null +++ b/component/site/views/cart/tmpl/change_attribute.php @@ -0,0 +1,140 @@ +cart; +$idx = $cart ['idx']; +$Itemid = $app->input->getInt('Itemid'); +$cart_index = $app->input->getInt('cart_index'); +$product_id = $app->input->getInt('pid'); +$model = $this->getModel('cart'); + +$session = JFactory::getSession(); +$user = JFactory::getUser(); +$document = JFactory::getDocument(); + +?> + + 0 && $cart_attribute[0]->template_desc) +{ + $template_desc = $cart_attribute[0]->template_desc; +} +else +{ + $template_desc = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    Change Attribute
    {attribute_template:attributes}
    {apply_button} {cancel_button}
    '; +} + +$product = $producthelper->getProductById($product_id); + +// Checking for child products +$childproduct = RedshopHelperProduct::getChildProduct($product_id); + +if (count($childproduct) > 0) +{ + $isChilds = true; +} +else +{ + $isChilds = false; +} + +// Product attribute Start +if ($isChilds) +{ + $attributes = array(); + $selectAtt = array(array(), array()); +} +else +{ + $attributes_set = array(); + + if ($product->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $product->attribute_set_id, 0, 1); + } + + $bool = (Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE')) ? false : true; + $attribute_template = \Redshop\Template\Helper::getAttribute($template_desc, $bool); + $attribute_template->template_desc = str_replace("{property_image_scroller}", "", $attribute_template->template_desc); + $attribute_template->template_desc = str_replace("{subproperty_image_scroller}", "", $attribute_template->template_desc); + $attributes = $producthelper->getProductAttribute($product_id); + $attributes = array_merge($attributes, $attributes_set); + + $selectAtt = $carthelper->getSelectedCartAttributeArray($cart[$cart_index]['cart_attribute']); +} + +$totalatt = count($attributes); +$template_desc = $producthelper->replaceAttributeData($product_id, 0, 0, $attributes, $template_desc, $attribute_template, $isChilds, $selectAtt, 0); + +// Product attribute End + +$stockaddtocart = "stockaddtocartprd_" . $product_id; +$pdaddtocart = "pdaddtocartprd_" . $product_id; + +$applybutton = ""; +$applybutton .= ""; +$applybutton .= ""; +$applybutton .= ""; +$applybutton .= ""; +$applybutton .= ""; +$applybutton .= ""; +$cancelbutton = ""; + +$template_desc = str_replace("{apply_button}", "" . $applybutton . "", $template_desc); +$template_desc = str_replace("{cancel_button}", $cancelbutton, $template_desc); + +$template_desc = '
    ' . $template_desc . '
    '; + +$template_desc = str_replace("{change_attribute}", JText::_("COM_REDSHOP_CHANGE_ATTRIBUTE"), $template_desc); + +if ($totalatt > 0) +{ + $template_desc = RedshopHelperTemplate::parseRedshopPlugin($template_desc); + echo eval ("?>" . $template_desc . "cart; +$idx = $cart['idx']; +$model = $this->getModel('cart'); +$session = JFactory::getSession(); +$user = JFactory::getUser(); +$print = JFactory::getApplication()->input->getInt('print'); +$Itemid = RedshopHelperRouter::getCheckoutItemId(); + +// Define array to store product detail for ajax cart display +$cart_data = $this->data[0]->template_desc; + +// Process the product plugin before cart template replace tag +JPluginHelper::importPlugin('redshop_product'); +$results = $dispatcher->trigger('onStartCartTemplateReplace', array(&$cart_data, &$cart)); + +// End + +if ($cart_data == "") +{ + if (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE')) + { + $cart_data = '

    {cart_lbl}

    {print}


    {product_loop_start}{product_loop_end}
    {product_name_lbl} {quantity_lbl}
    {product_name}
    {product_attribute}
    {product_accessory}
    {product_wrapper}
    {product_userfields}
    {product_thumb_image}
    {update_cart}{remove_product}

    {update}{empty_cart}{quotation_request}{shop_more}
    '; + } + else + { + $cart_data = '

    {cart_lbl}

    {print}
    {product_loop_start}{product_loop_end}
    {product_name_lbl}
    {price_lbl} {product_price_excl_lbl}{quantity_lbl}{total_price_lbl}{total_price_exe_lbl}
    {product_name}
    {product_old_price}
    {product_attribute}
    {product_accessory}
    {product_wrapper}
    {product_userfields}
    {attribute_price_with_vat}
    {product_thumb_image}{product_price}
    {vat_info}
    {product_price_excl_vat}
    {update_cart}{remove_product}
    {product_total_price}{product_total_price_excl_vat}


    {update}{empty_cart}
    {discount_form_lbl}{coupon_code_lbl}
    {discount_form}



    {if discount}{discount end if}{if vat}{vat end if}{if payment_discount}{payment_discount end if}
    {product_subtotal_lbl}:{product_subtotal}{product_subtotal_excl_vat_lbl}:{product_subtotal_excl_vat}
    {shipping_with_vat_lbl}:{shipping}{shipping_excl_vat_lbl}:{shipping_excl_vat}{shipping_denotation}
    {discount_lbl}{discount}{discount_lbl}{discount_excl_vat}{discount_denotation}
    {totalpurchase_lbl}:{subtotal}{subtotal_excl_vat_lbl} :{subtotal_excl_vat}
    {vat_lbl}{tax}{vat_lbl}{sub_total_vat}
    {payment_discount_lbl}{payment_order_discount}
    {total_lbl}:
    {total}
    {total_lbl}:
    {total_excl_vat}
    {denotation_label}
    {checkout}

    {shop_more}
    '; + } +} + +if ($print) +{ + $onclick = "onclick='window.print();'"; +} +else +{ + $print_url = $url . "index.php?option=com_redshop&view=cart&print=1&tmpl=component&Itemid=" . $Itemid; + $onclick = "onclick='window.open(\"$print_url\",\"mywindow\",\"scrollbars=1\",\"location=1\")'"; +} + +$print_tag = ""; +$print_tag .= "" . JText::_("; +$print_tag .= ""; + +$cart_data = str_replace("{print}", $print_tag, $cart_data); +$cart_data = $carthelper->replaceTemplate($cart, $cart_data, 0); +RedshopHelperCartSession::setCart($cart); + +if (strstr($cart_data, '{shipping_calculator}') && Redshop::getConfig()->get('SHIPPING_METHOD_ENABLE')) +{ + if (Redshop::getConfig()->get('SHOW_SHIPPING_IN_CART')) + { + $shipping_calc = $model->shippingrate_calc(); + $cart_data = str_replace("{shipping_calculator}", $shipping_calc, $cart_data); + $cart_data = str_replace("{shipping_calculator_label}", JText::_('COM_REDSHOP_SHIPPING_CALCULATOR'), $cart_data); + } + else + { + $cart_data = str_replace("{shipping_calculator}", '', $cart_data); + $cart_data = str_replace("{shipping_calculator_label}", '', $cart_data); + } +} + +if (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE')) +{ + $checkout = ''; +} +else +{ + $checkout = ''; + JPluginHelper::importPlugin('redshop_payment'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $pluginButton = $dispatcher->trigger('onPaymentCheckoutButton', array($cart)); + $pluginButton = implode("
    ", $pluginButton); + + // Google checkout start Div + if ($pluginButton) + $checkout .= '
    ' . $pluginButton . '
    '; + + if (Redshop::getConfig()->get('SSL_ENABLE_IN_CHECKOUT')) + { + $uri = JURI::getInstance(); + $c_link = new JURI; + $c_link->setScheme('https'); + $c_link->setHost($uri->getHost()); + + $c_link->setPath(JRoute::_('index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid)); + $link = $c_link->toString(); + } + else + { + $link = JRoute::_('index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid); + } + + $checkout .= '
    '; + $checkout .= 'get('MINIMUM_ORDER_TOTAL') > 0 && $cart ['total'] < Redshop::getConfig()->get('MINIMUM_ORDER_TOTAL')) + { + $checkout .= ' onclick="alert(\'' . JText::_('COM_REDSHOP_MINIMUM_ORDER_TOTAL_HAS_TO_BE_MORE_THAN') . ' ' . Redshop::getConfig()->get('MINIMUM_ORDER_TOTAL') . '\');">'; + } + else + { + $checkout .= ' onclick="javascript:document.location=\'' . $link . '\'">'; + } + + $checkout .= '
    '; +} + +$cart_data = str_replace("{checkout}", $checkout, $cart_data); +$cart_data = str_replace("{checkout_button}", $checkout, $cart_data); + +$qlink = $url . 'index.php?option=com_redshop&view=quotation&tmpl=component&return=1&Itemid=' . $Itemid; +$quotation_request = ''; +$cart_data = str_replace("{quotation_request}", $quotation_request, $cart_data); +/* + * continue redirection link + */ +if (strstr($cart_data, "{shop_more}")) +{ + if (Redshop::getConfig()->get('CONTINUE_REDIRECT_LINK') != '') + { + $shopmorelink = JRoute::_(Redshop::getConfig()->get('CONTINUE_REDIRECT_LINK')); + } + elseif ($catItemId = RedshopHelperRouter::getCategoryItemid()) + { + $shopmorelink = JRoute::_('index.php?option=com_redshop&view=category&Itemid=' . $catItemId); + } + else + { + $shopmorelink = JRoute::_('index.php'); + } + + $shop_more = ''; + $cart_data = str_replace("{shop_more}", $shop_more, $cart_data); +} + +if (Redshop::getConfig()->getBool('QUANTITY_TEXT_DISPLAY')) +{ + $update_all = '
    + + + + +
    '; + + $cart_data = str_replace("{update}", $update_all, $cart_data); +} +else +{ + $cart_data = str_replace("{update}", '', $cart_data); +} + +$empty_cart = '
    + + +
    '; + +$cart_data = str_replace("{empty_cart}", $empty_cart, $cart_data); + +$discount = RedshopHelperDiscount::getDiscount(0); + +if (is_object($discount)) +{ + $text = ''; + + if (isset($discount->discount_type) && $discount->discount_type == 0) + { + $discount_amount = $discount->discount_amount; + $discount_sign = " " . Redshop::getConfig()->get('REDCURRENCY_SYMBOL'); + } + else + { + $discount_amount = ($discount->amount * $discount->discount_amount) / (100); + $discount_sign = " %"; + } + + $diff = $discount->amount - $cart ['product_subtotal']; + $price = number_format($discount->discount_amount, Redshop::getConfig()->get('PRICE_DECIMAL'), Redshop::getConfig()->get('PRICE_SEPERATOR'), Redshop::getConfig()->get('THOUSAND_SEPERATOR')); + + if ($diff > 0) + { + $text = sprintf(JText::_('COM_REDSHOP_DISCOUNT_TEXT'), $producthelper->getProductFormattedPrice($diff, true), $producthelper->getProductFormattedPrice($discount_amount, true), $price . $discount_sign); + } + + /* + * Discount type = 1 // Discount/coupon/voucher + * Discount type = 2 // Discount + coupon/voucher + * Discount type = 3 // Discount + coupon + voucher + * Discount type = 4 // Discount + coupons + voucher + */ + if (Redshop::getConfig()->get('DISCOUNT_TYPE') && Redshop::getConfig()->get('DISCOUNT_ENABLE') == 1) + { + $cart_data = str_replace("{discount_rule}", $text, $cart_data); + } + else + { + $cart_data = str_replace("{discount_rule}", '', $cart_data); + } +} +else +{ + $cart_data = str_replace("{discount_rule}", '', $cart_data); +} + +$discount_form = '
    '; +$coupon_lableFLG = 0; +$coupon_lable = ''; +$confirmMsg = ''; +$radiobttn = ''; + +if (Redshop::getConfig()->get('COUPONS_ENABLE') == 1 && Redshop::getConfig()->get('VOUCHERS_ENABLE') == 1) +{ + $discount_form .= ''; + $discount_form .= ''; + $coupon_lableFLG = 1; +} +elseif (Redshop::getConfig()->get('COUPONS_ENABLE') == 1 && Redshop::getConfig()->get('VOUCHERS_ENABLE') == 0) +{ + $discount_form .= ''; + $discount_form .= ''; + $coupon_lableFLG = 1; +} +elseif (Redshop::getConfig()->get('COUPONS_ENABLE') == 0 && Redshop::getConfig()->get('VOUCHERS_ENABLE') == 1) +{ + $discount_form .= ''; + $discount_form .= ''; + $coupon_lableFLG = 1; +} + +$discount_form .= ''; +$discount_form .= '
    '; + +if (Redshop::getConfig()->get('DISCOUNT_TYPE') == "0" || Redshop::getConfig()->get('DISCOUNT_TYPE') == "") +{ + $discount_form = ""; + $coupon_lableFLG = 0; +} + +if ($coupon_lableFLG) +{ + $coupon_lable = "
    " . JText::_('COM_REDSHOP_CART_COUPON_CODE_TBL') . "
    "; +} + +$cart_data = str_replace("{discount_form_lbl}", "", $cart_data); +$cart_data = str_replace("{discount_form}", $discount_form, $cart_data); +$cart_data = str_replace("{coupon_code_lbl}", $coupon_lable, $cart_data); +$cart_data = str_replace("{without_vat}", '', $cart_data); +$cart_data = str_replace("{with_vat}", '', $cart_data); + +// Process the product plugin for cart item +JPluginHelper::importPlugin('redshop_product'); +$results = $dispatcher->trigger('atEndCartTemplateReplace', array(& $cart_data, $cart)); + +$cart_data = RedshopHelperTemplate::parseRedshopPlugin($cart_data); +echo eval ("?>" . $cart_data . " + diff --git a/component/site/views/cart/tmpl/default.xml b/component/site/views/cart/tmpl/default.xml new file mode 100644 index 00000000000..2c0fb928150 --- /dev/null +++ b/component/site/views/cart/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/cart/tmpl/index.html b/component/site/views/cart/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/cart/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/cart/view.html.php b/component/site/views/cart/view.html.php new file mode 100644 index 00000000000..ec775f57d06 --- /dev/null +++ b/component/site/views/cart/view.html.php @@ -0,0 +1,90 @@ +input->getCmd('layout'); + $itemId = $app->input->getInt('Itemid'); + + if ($app->input->getString('quotemsg') != "") + { + $app->redirect( + JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . $itemId, false), + $app->input->getString('quotemsg') + ); + } + + JHtml::_('redshopjquery.framework'); + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.common.min.js', false, true); + + if (!array_key_exists("idx", $cart) || (array_key_exists("idx", $cart) && $cart['idx'] < 1)) + { + $cartData = RedshopHelperTemplate::getTemplate("empty_cart"); + + if (count($cartData) > 0 && $cartData[0]->template_desc != "") + { + $cartTemplate = $cartData[0]->template_desc; + } + else + { + $cartTemplate = JText::_("COM_REDSHOP_EMPTY_CART"); + } + + echo eval ("?>" . $cartTemplate . "get('data'); + + if ($layout == 'change_attribute') + { + $this->setLayout('change_attribute'); + } + + $this->cart = $cart; + $this->data = $data; + + parent::display($tpl); + } +} diff --git a/component/site/views/catalog/index.html b/component/site/views/catalog/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/catalog/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/catalog/tmpl/default.php b/component/site/views/catalog/tmpl/default.php new file mode 100644 index 00000000000..32468c71e15 --- /dev/null +++ b/component/site/views/catalog/tmpl/default.php @@ -0,0 +1,99 @@ +input->getInt('Itemid'); +$layout = $app->input->getCmd('layout', 'default'); + +/** @var RedshopModelCatalog $model */ +$model = $this->getModel('catalog'); + +$template = RedshopHelperTemplate::getTemplate("catalog"); + +if (count($template) > 0 && $template[0]->template_desc != "") +{ + $template_desc = $template[0]->template_desc; +} +else +{ + $template_desc = '

    Order Catalog

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eget nisi orci, vel vehicula massa. Phasellus ipsum est, egestas a consequat eget, placerat vitae ipsum. Proin ac purus risus. Quisque nec nisi lacus, vitae iaculis eros. Donec ipsum diam, dictum ac euismod molestie, ultrices eget arcu. Vestibulum lacinia nisl et odio sagittis fermentum. Aliquam tristique volutpat faucibus. Sed id orci ut metus condimentum bibendum. Ut gravida scelerisque magna et pharetra. Ut vel turpis in orci molestie scelerisque. Proin nisl elit, ullamcorper id blandit nec, congue eget augue. Nullam gravida ligula nisi.

    Catalog:{catalog_select}
    NAME {name}

    EMAIL {email_address}

    {submit_button_catalog}
    '; +} + +if ($this->params->get('show_page_heading', 1)) +{ + if ($this->params->get('page_title')) + { + ?> +

    + escape($this->params->get('page_title')); ?> +

    +
    + getCatalogList(); + $optionselect = array(); + $optionselect[] = JHTML::_('select.option', '0', JText::_('COM_REDSHOP_SELECT')); + $catalog_select = array_merge($optionselect, $catalog); + + $catalogsel = JHTML::_('select.genericlist', $catalog_select, 'catalog_id', 'class="inputbox" size="1" ', 'value', 'text', 0); + + $template_desc = str_replace("{catalog_select}", $catalogsel, $template_desc); + } + + $template_desc = str_replace("{name_lbl}", JText::_('COM_REDSHOP_NAME_LBL'), $template_desc); + $template_desc = str_replace("{name}", '', $template_desc); + $template_desc = str_replace("{email_lbl}", JText::_('COM_REDSHOP_EMAIL_LBL'), $template_desc); + $template_desc = str_replace("{email_address}", '', $template_desc); + $template_desc = str_replace("{submit_button_catalog}", '', $template_desc); + + echo $template_desc; + ?> + + + + +
    + diff --git a/component/site/views/catalog/tmpl/default.xml b/component/site/views/catalog/tmpl/default.xml new file mode 100644 index 00000000000..6329ce91682 --- /dev/null +++ b/component/site/views/catalog/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/catalog/tmpl/index.html b/component/site/views/catalog/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/catalog/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/catalog/tmpl/sample.php b/component/site/views/catalog/tmpl/sample.php new file mode 100644 index 00000000000..3fbb25f5b99 --- /dev/null +++ b/component/site/views/catalog/tmpl/sample.php @@ -0,0 +1,151 @@ +input->getInt('Itemid'); +$layout = $app->input->getCmd('layout', 'default'); + +/** @var RedshopModelCatalog $model */ +$model = $this->getModel('catalog'); + +$template = RedshopHelperTemplate::getTemplate("product_sample"); + +if (count($template) > 0 && $template[0]->template_desc != "") +{ + $template_desc = $template[0]->template_desc; +} +else +{ + $template_desc = '

    Bestil Farveprver

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eget nisi orci, vel vehicula massa. Phasellus ipsum est, egestas a consequat eget, placerat vitae ipsum. Proin ac purus risus. Quisque nec nisi lacus, vitae iaculis eros. Donec ipsum diam, dictum ac euismod molestie, ultrices eget arcu. Vestibulum lacinia nisl et odio sagittis fermentum. Aliquam tristique volutpat faucibus. Sed id orci ut metus condimentum bibendum. Ut gravida scelerisque magna et pharetra. Ut vel turpis in orci molestie scelerisque. Proin nisl elit, ullamcorper id blandit nec, congue eget augue. Nullam gravida ligula nisi.

    {product_samples}

    {address_fields}

    {submit_button_sample}

    '; +} + +if ($this->params->get('show_page_heading', 1)) +{ + if ($this->params->get('page_title')) + { + ?> +

    + escape($this->params->get('page_title')); ?> +

    +
    + getCatalogSampleList(); + $saple_data = ""; + + for ($k = 0, $kn = count($catalog_sample); $k < $kn; $k++) + { + $saple_data .= $catalog_sample[$k]->sample_name . "
    "; + + $catalog_colour = $model->getCatalogSampleColorList($catalog_sample[$k]->sample_id); + + $saple_data .= ""; + $saple_check = ""; + + for ($c = 0, $cn = count($catalog_colour); $c < $cn; $c++) + { + $saple_data .= ""; + $saple_data .= ""; + } + + $saple_check .= ""; + $saple_data .= "" . $saple_check . "
    "; + + if ($catalog_colour[$c]->is_image == 1) + { + $saple_data .= "
    "; + } + else + { + $saple_data .= '
    '; + } + + $saple_check .= "
     
    "; + } + + $template_desc = str_replace("{product_samples}", $saple_data, $template_desc); + } + + if (strstr($template_desc, "{address_fields}")) + { + $address_fields = RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_COLOR_SAMPLE, 0); + $myfield = ""; + $myfield .= $address_fields; + $myfield .= '
    '; + + $template_desc = str_replace("{address_fields}", $myfield, $template_desc); + } + + $template_desc = str_replace("{name_lbl}", JText::_('COM_REDSHOP_NAME_LBL'), $template_desc); + $template_desc = str_replace("{name}", '', $template_desc); + $template_desc = str_replace("{email_lbl}", JText::_('COM_REDSHOP_EMAIL_LBL'), $template_desc); + $template_desc = str_replace("{email_address}", '', $template_desc); + + $template_desc = str_replace("{submit_button_sample}", '', $template_desc); + + echo $template_desc; + ?> + + + + + +
    + diff --git a/component/site/views/catalog/tmpl/sample.xml b/component/site/views/catalog/tmpl/sample.xml new file mode 100644 index 00000000000..24977c0ec5a --- /dev/null +++ b/component/site/views/catalog/tmpl/sample.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/component/site/views/catalog/view.html.php b/component/site/views/catalog/view.html.php new file mode 100644 index 00000000000..0f1eaffe975 --- /dev/null +++ b/component/site/views/catalog/view.html.php @@ -0,0 +1,51 @@ +getParams('com_redshop'); + $layout = $app->input->getCmd('layout'); + + if ($layout == "sample") + { + $this->setLayout('sample'); + } + + $this->params = $params; + + parent::display($tpl); + } +} diff --git a/component/site/views/category/index.html b/component/site/views/category/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/category/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/category/tmpl/categoryproduct.php b/component/site/views/category/tmpl/categoryproduct.php new file mode 100644 index 00000000000..87f4d350998 --- /dev/null +++ b/component/site/views/category/tmpl/categoryproduct.php @@ -0,0 +1,608 @@ +getModel('category'); +$categoryTemplate = RedshopHelperTemplate::getTemplate('categoryproduct'); + +if (!empty($categoryTemplate) && $categoryTemplate[0]->template_desc != "") +{ + $templateHtml = $categoryTemplate[0]->template_desc; +} +else +{ + $templateHtml = "
    {print}
    "; + $templateHtml .= "
    {filter_by_lbl}{filter_by}
    "; + $templateHtml .= "
    {order_by_lbl}{order_by}
    "; + $templateHtml .= "

    {category_loop_start}

    "; + $templateHtml .= "
    "; + $templateHtml .= "
    {category_thumb_image}
    "; + $templateHtml .= "

    {category_name}

    {category_description}
    "; + $templateHtml .= "
    {product_loop_start}
    "; + $templateHtml .= "
    "; + $templateHtml .= ""; + $templateHtml .= ""; + $templateHtml .= ""; + $templateHtml .= ""; + $templateHtml .= "
    "; + $templateHtml .= "
    {product_thumb_image}

    {product_name}

    {product_price}
    {read_more}
    {attribute_template:attributes}
    {form_addtocart:add_to_cart1}
    "; + $templateHtml .= "{product_loop_end}

    {category_loop_end}

    "; +} + +if (empty($this->detail)) +{ + $templateHtml = '
    ' . JText::_('COM_REDSHOP_ALL_CATEGORY_VIEW_NO_RESULT_TEXT') . '
    '; +} + +$app = JFactory::getApplication(); +$router = $app->getRouter(); + +if ($this->print) +{ + $templateHtml = str_replace("{product_price_slider}", "", $templateHtml); + $templateHtml = str_replace("{pagination}", "", $templateHtml); +} + +$print_url = $url . "index.php?option=com_redshop&view=category&layout=categoryproduct&print=1&tmpl=component&Itemid=" . $this->itemid; +$onclick = "onclick='window.print();'"; + +$printHtml = JLayoutHelper::render('general.print', /** @scrutinizer ignore-type */ array('onclick' => $onclick)); + +$templateHtml = str_replace("{print}", ($this->print) ? '' : $printHtml, $templateHtml); +$templateHtml = str_replace("{category_frontpage_introtext}", Redshop::getConfig()->get('CATEGORY_FRONTPAGE_INTROTEXT'), $templateHtml); + +if (strstr($templateHtml, "{category_loop_start}") && strstr($templateHtml, "{category_loop_end}")) +{ + $cattemplate_desc = explode('{category_loop_start}', $templateHtml); + $catheader = $cattemplate_desc [0]; + + $cattemplate_desc = explode('{category_loop_end}', $cattemplate_desc [1]); + $middletemplate_desc = $cattemplate_desc[0]; + + if (strstr($middletemplate_desc, '{category_thumb_image_2}')) + { + $tag = '{category_thumb_image_2}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT_2'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH_2'); + } + elseif (strstr($middletemplate_desc, '{category_thumb_image_3}')) + { + $tag = '{category_thumb_image_3}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT_3'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH_3'); + } + elseif (strstr($middletemplate_desc, '{category_thumb_image_1}')) + { + $tag = '{category_thumb_image_1}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + else + { + $tag = '{category_thumb_image}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(2, 1, 1); + $data_add = ""; + + for ($i = 0; $i < count($this->detail); $i++) + { + $row = $this->detail[$i]; + + $data_add .= $middletemplate_desc; + + $cItemid = RedshopHelperRouter::getCategoryItemid($row->id); + + if ($cItemid != "") + { + $tmpItemid = $cItemid; + } + else + { + $tmpItemid = $this->itemid; + } + + $link = JRoute::_('index.php?option=com_redshop&view=category&cid=' . $row->id . '&layout=detail&Itemid=' . $tmpItemid); + $middlepath = REDSHOP_FRONT_IMAGES_RELPATH . 'category/'; + $title = " title='" . $row->name . "' "; + $alt = " alt='" . $row->name . "' "; + $product_img = REDSHOP_FRONT_IMAGES_ABSPATH . "noimage.jpg"; + $linkimage = $product_img; + + if ($row->category_full_image && file_exists($middlepath . $row->category_full_image)) + { + $product_img = RedshopHelperMedia::watermark('category', $row->category_full_image, $w_thumb, $h_thumb, Redshop::getConfig()->get('WATERMARK_CATEGORY_THUMB_IMAGE'), '0'); + $linkimage = RedshopHelperMedia::watermark('category', $row->category_full_image, '', '', Redshop::getConfig()->get('WATERMARK_CATEGORY_IMAGE'), '0'); + } + elseif (Redshop::getConfig()->get('CATEGORY_DEFAULT_IMAGE') && file_exists($middlepath . Redshop::getConfig()->get('CATEGORY_DEFAULT_IMAGE'))) + { + $product_img = RedshopHelperMedia::watermark('category', Redshop::getConfig()->get('CATEGORY_DEFAULT_IMAGE'), $w_thumb, $h_thumb, Redshop::getConfig()->get('WATERMARK_CATEGORY_THUMB_IMAGE'), '0'); + $linkimage = RedshopHelperMedia::watermark('category', Redshop::getConfig()->get('CATEGORY_DEFAULT_IMAGE'), '', '', Redshop::getConfig()->get('WATERMARK_CATEGORY_IMAGE'), '0'); + } + + if (Redshop::getConfig()->get('CAT_IS_LIGHTBOX')) + { + $cat_thumb = ""; + } + else + { + $cat_thumb = ""; + } + + $cat_thumb .= ""; + $cat_thumb .= ""; + $data_add = str_replace($tag, $cat_thumb, $data_add); + + if (strstr($data_add, '{category_name}')) + { + $cat_name = '' . $row->name . ''; + $data_add = str_replace("{category_name}", $cat_name, $data_add); + } + + if (strstr($data_add, '{category_readmore}')) + { + $cat_name = '' . JText::_('COM_REDSHOP_READ_MORE') . ''; + $data_add = str_replace("{category_readmore}", $cat_name, $data_add); + } + + if (strstr($data_add, '{category_description}')) + { + $cat_desc = $config->maxchar($row->description, Redshop::getConfig()->get('CATEGORY_SHORT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_SHORT_DESC_END_SUFFIX')); + $data_add = str_replace("{category_description}", $cat_desc, $data_add); + } + + if (strstr($data_add, '{category_short_desc}')) + { + $cat_s_desc = $config->maxchar($row->short_description, Redshop::getConfig()->get('CATEGORY_SHORT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_SHORT_DESC_END_SUFFIX')); + $data_add = str_replace("{category_short_desc}", $cat_s_desc, $data_add); + } + + if (strstr($data_add, '{category_total_product}')) + { + $totalprd = $productHelper->getProductCategory($row->id); + $data_add = str_replace("{category_total_product}", count($totalprd), $data_add); + $data_add = str_replace("{category_total_product_lbl}", JText::_('COM_REDSHOP_TOTAL_PRODUCT'), $data_add); + } + + /* + * category template extra field + * "2" argument is set for category + */ + $data_add = $productHelper->getExtraSectionTag($extraFieldName, $row->id, "2", $data_add); + + if (strstr($data_add, "{product_loop_start}") && strstr($data_add, "{product_loop_end}")) + { + $template_d1 = explode("{product_loop_start}", $data_add); + $template_d2 = explode("{product_loop_end}", $template_d1 [1]); + $template_product = $template_d2 [0]; + + $attribute_template = \Redshop\Template\Helper::getAttribute($template_product); + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(1, 1, 1); + $product_data = ''; + $prddata_add = ""; + + $this->product = $model->getCategorylistProduct($row->id); + + for ($j = 0; $j < count($this->product); $j++) + { + $product = $this->product[$j]; + $productId = (int) $product->product_id; + + if (!is_object($product)) + { + break; + } + + $count_no_user_field = 0; + + // Counting accessory + $accessorylist = RedshopHelperAccessory::getProductAccessories(0, $productId); + $totacc = count($accessorylist); + + $prddata_add .= $template_product; + + // Product User Field Start + $hidden_userfield = ""; + $returnArr = $productHelper->getProductUserfieldFromTemplate($prddata_add); + $template_userfield = $returnArr[0]; + $userfieldArr = $returnArr[1]; + + if ($template_userfield != "") + { + $ufield = ""; + + for ($ui = 0; $ui < count($userfieldArr); $ui++) + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', '', 0, $product->product_id); + $ufield .= $productUserFields[1]; + + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + $prddata_add = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $prddata_add); + $prddata_add = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $prddata_add); + } + + $productUserFieldsForm = "
    "; + + if ($ufield != "") + { + $prddata_add = str_replace("{if product_userfield}", $productUserFieldsForm, $prddata_add); + $prddata_add = str_replace("{product_userfield end if}", "
    ", $prddata_add); + } + else + { + $prddata_add = str_replace("{if product_userfield}", "", $prddata_add); + $prddata_add = str_replace("{product_userfield end if}", "", $prddata_add); + } + } + elseif (Redshop::getConfig()->get('AJAX_CART_BOX')) + { + $ajax_detail_template_desc = ""; + $ajax_detail_template = \Redshop\Template\Helper::getAjaxDetailBox($product); + + if (null !== $ajax_detail_template) + { + $ajax_detail_template_desc = $ajax_detail_template->template_desc; + } + + $returnArr = $productHelper->getProductUserfieldFromTemplate($ajax_detail_template_desc); + $template_userfield = $returnArr[0]; + $userfieldArr = $returnArr[1]; + + if ($template_userfield != "") + { + $ufield = ""; + + for ($ui = 0; $ui < count($userfieldArr); $ui++) + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', '', 0, $productId); + $ufield .= $productUserFields[1]; + + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + $template_userfield = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $template_userfield); + $template_userfield = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $template_userfield); + } + + if ($ufield != "") + { + $hidden_userfield = "
    " . + $template_userfield . "
    "; + } + } + } + + $prddata_add = $prddata_add . $hidden_userfield; + /************** end user fields ***************************/ + + $ItemData = $productHelper->getMenuInformation(0, 0, '', 'product&pid=' . $productId); + + if (!empty($ItemData)) + { + $pItemid = $ItemData->id; + } + else + { + $pItemid = RedshopHelperRouter::getItemId($productId); + } + + $prddata_add = str_replace("{product_id_lbl}", JText::_('COM_REDSHOP_PRODUCT_ID_LBL'), $prddata_add); + $prddata_add = str_replace("{product_id}", $productId, $prddata_add); + + $prddata_add = str_replace("{product_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER_LBL'), $prddata_add); + $product_number_output = '' . $product->product_number . ''; + $prddata_add = str_replace("{product_number}", $product_number_output, $prddata_add); + + $product_volume_unit = '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . "3" . ''; + $strToInsert = $productHelper->redunitDecimal($product->product_volume) . " " . $product_volume_unit; + $prddata_add = str_replace("{product_size}", $strToInsert, $prddata_add); + + $product_unit = '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . ''; + $strToInsert = $productHelper->redunitDecimal($product->product_length) . " " . $product_unit; + $prddata_add = str_replace("{product_length}", $strToInsert, $prddata_add); + + $prddata_add = str_replace("{product_width}", $productHelper->redunitDecimal($product->product_width) . " " . $product_unit, $prddata_add); + + $strToInsert = $productHelper->redunitDecimal($product->product_height) . " " . $product_unit; + $prddata_add = str_replace("{product_height}", $strToInsert, $prddata_add); + + $prddata_add = $productHelper->replaceVatinfo($prddata_add); + $this->catid = isset($row->category_id) ? $row->category_id : ''; + $link = JRoute::_( + 'index.php?option=com_redshop&view=product&pid=' . + $productId . '&cid=' . $this->catid . '&Itemid=' . $pItemid + ); + + if (strstr($prddata_add, '{product_name}')) + { + $pname = $config->maxchar($product->product_name, Redshop::getConfig()->get('CATEGORY_PRODUCT_TITLE_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_PRODUCT_TITLE_END_SUFFIX')); + $pname = "" . $pname . ""; + $prddata_add = str_replace("{product_name}", $pname, $prddata_add); + } + + if (strstr($prddata_add, '{read_more}')) + { + $rmore = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $prddata_add = str_replace("{read_more}", $rmore, $prddata_add); + } + + if (strstr($prddata_add, '{read_more_link}')) + { + $prddata_add = str_replace("{read_more_link}", $link, $prddata_add); + } + + if (strstr($prddata_add, '{product_s_desc}')) + { + $p_s_desc = $config->maxchar($product->product_s_desc, Redshop::getConfig()->get('CATEGORY_PRODUCT_SHORT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_PRODUCT_SHORT_DESC_END_SUFFIX')); + $prddata_add = str_replace("{product_s_desc}", $p_s_desc, $prddata_add); + } + + if (strstr($prddata_add, '{product_desc}')) + { + $p_desc = $config->maxchar($product->product_desc, Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_END_SUFFIX')); + $prddata_add = str_replace("{product_desc}", $p_desc, $prddata_add); + } + + if (strstr($prddata_add, '{product_rating_summary}')) + { + // Product Review/Rating Fetching reviews + $final_avgreview_data = Redshop\Product\Rating::getRating($productId); + $prddata_add = str_replace("{product_rating_summary}", $final_avgreview_data, $prddata_add); + } + + if (strstr($prddata_add, '{manufacturer_link}')) + { + $manufacturer_link_href = JRoute::_( + 'index.php?option=com_redshop&view=manufacturers&layout=detail&mid=' . + $product->manufacturer_id . '&Itemid=' . $this->temid + ); + $manufacturer_link = '' . + $product->manufacturer_name . + ''; + $prddata_add = str_replace("{manufacturer_link}", $manufacturer_link, $prddata_add); + + if (strstr($prddata_add, "{manufacturer_link}")) + { + $prddata_add = str_replace("{manufacturer_name}", "", $prddata_add); + } + } + + if (strstr($prddata_add, '{manufacturer_product_link}')) + { + $manuUrl = JRoute::_( + 'index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $product->manufacturer_id . + '&Itemid=' . $this->itemid + ); + $manufacturerPLink = "" . + JText::_("COM_REDSHOP_VIEW_ALL_MANUFACTURER_PRODUCTS") . " " . $product->manufacturer_name . + ""; + $prddata_add = str_replace("{manufacturer_product_link}", $manufacturerPLink, $prddata_add); + } + + if (strstr($prddata_add, '{manufacturer_name}')) + { + $prddata_add = str_replace("{manufacturer_name}", $product->manufacturer_name, $prddata_add); + } + + if (strstr($prddata_add, "{product_thumb_image_3}")) + { + $pimg_tag = '{product_thumb_image_3}'; + $ph_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_3'); + $pw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_3'); + } + elseif (strstr($prddata_add, "{product_thumb_image_2}")) + { + $pimg_tag = '{product_thumb_image_2}'; + $ph_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_2'); + $pw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_2'); + } + elseif (strstr($prddata_add, "{product_thumb_image_1}")) + { + $pimg_tag = '{product_thumb_image_1}'; + $ph_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $pw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + else + { + $pimg_tag = '{product_thumb_image}'; + $ph_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $pw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + + $hidden_thumb_image = ""; + $hidden_thumb_image .= ""; + $thum_image = Redshop\Product\Image\Image::getImage($productId, $link, $pw_thumb, $ph_thumb, 2, 1); + + // Product image flying addwishlist time start. + $thum_image = "" . + Redshop\Product\Image\Image::getImage($productId, $link, $pw_thumb, $ph_thumb, 2, 1) . ""; + + // Product image flying addwishlist time end. + $prddata_add = str_replace($pimg_tag, $thum_image . $hidden_thumb_image, $prddata_add); + + $prddata_add = $productHelper->getJcommentEditor($product, $prddata_add); + + /* + * Product loop template extra field + * lat arg set to "1" for indetify parsing data for product tag loop in category + * last arg will parse {producttag:NAMEOFPRODUCTTAG} nameing tags. + * "1" is for section as product. + */ + if (count($categoryTemplate) > 0) + { + $prddata_add = $productHelper->getExtraSectionTag($extraFieldName, $productId, "1", $prddata_add, 1); + } + + /************************************ + * Conditional tag + * if product on discount : Yes + * {if product_on_sale} This product is on sale {product_on_sale end if} // OUTPUT : This product is on sale + * NO : // OUTPUT : Display blank + ************************************/ + $prddata_add = $productHelper->getProductOnSaleComment($product, $prddata_add); + + // Replace wishlistbutton. + $prddata_add = RedshopHelperWishlist::replaceWishlistTag($productId, $prddata_add); + + // Replace compare product button. + $prddata_add = Redshop\Product\Compare::replaceCompareProductsButton($productId, (int) $this->catid, $prddata_add); + + $prddata_add = RedshopHelperStockroom::replaceStockroomAmountDetail($prddata_add, $productId); + + // Checking for child products. + $childproduct = RedshopHelperProduct::getChildProduct($productId); + + if (count($childproduct) > 0) + { + $isChilds = true; + $attributes = array(); + } + else + { + $isChilds = false; + + // Get attributes. + $attributes_set = array(); + + if ($product->attribute_set_id > 0) + { + $attributes_set = RedshopHelperProduct_Attribute::getProductAttribute(0, $product->attribute_set_id, 0, 1); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($productId); + $attributes = array_merge($attributes, $attributes_set); + } + + // Product attribute - Start. + $totalatt = count($attributes); + + // Check product for not for sale. + $prddata_add = $productHelper->getProductNotForSaleComment($product, $prddata_add, $attributes); + + $prddata_add = Redshop\Product\Stock::replaceInStock($productId, $prddata_add, $attributes, $attribute_template); + + $prddata_add = $productHelper->replaceAttributeData($productId, 0, 0, $attributes, $prddata_add, $attribute_template, $isChilds); + + // Get cart tempalte. + $prddata_add = Redshop\Cart\Render::replace( + $productId, + (int) $this->catid, + 0, + 0, + $prddata_add, + $isChilds, + $userfieldArr, + $totalatt, + $totacc, + $count_no_user_field + ); + } + + $data_add = str_replace("{product_loop_start}", "", $data_add); + $data_add = str_replace("{product_loop_end}", "", $data_add); + $data_add = str_replace($template_product, $prddata_add, $data_add); + } + } + + $templateHtml = str_replace("{category_loop_start}", "", $templateHtml); + $templateHtml = str_replace("{category_loop_end}", "", $templateHtml); + $templateHtml = str_replace($middletemplate_desc, $data_add, $templateHtml); +} + +if (strstr($templateHtml, "{filter_by}")) +{ + $templateHtml = str_replace("{filter_by_lbl}", "", $templateHtml); + $templateHtml = str_replace("{filter_by}", "", $templateHtml); +} + +if (strstr($templateHtml, "{template_selector_category}")) +{ + $template_selecter_form = "
    "; + $template_selecter_form .= $this->lists['category_template']; + $template_selecter_form .= ""; + $template_selecter_form .= ""; + $template_selecter_form .= "
    "; + + $templateHtml = str_replace("{template_selector_category_lbl}", JText::_('COM_REDSHOP_TEMPLATE_SELECTOR_CATEGORY_LBL'), $templateHtml); + $templateHtml = str_replace("{template_selector_category}", $template_selecter_form, $templateHtml); +} + +if (strstr($templateHtml, "{order_by}")) +{ + $templateHtml = str_replace("{order_by_lbl}", "", $templateHtml); + $templateHtml = str_replace("{order_by}", "", $templateHtml); +} + +if (strstr($templateHtml, "{pagination}")) +{ + $pagination = $model->getCategoryProductPagination(); + $templateHtml = str_replace("{pagination}", $pagination->getPagesLinks(), $templateHtml); +} + +$templateHtml = str_replace("{with_vat}", "", $templateHtml); +$templateHtml = str_replace("{without_vat}", "", $templateHtml); +$templateHtml = str_replace("{attribute_price_with_vat}", "", $templateHtml); +$templateHtml = str_replace("{attribute_price_without_vat}", "", $templateHtml); + +$templateHtml = RedshopHelperTemplate::parseRedshopPlugin($templateHtml); + +if ($this->params->get('show_page_heading', 0)) +{ + if (!$this->catid) + { + echo '
    '; + } + else + { + echo '
    '; + } + + if (!$this->catid) + { + echo '

    '; + + if ($this->params->get('page_title') != $this->pageheadingtag) + { + echo $this->escape($this->params->get('page_title')); + } + else + { + echo $this->pageheadingtag; + } + + echo '

    '; + } + + echo '
    '; +} + +echo eval("?>" . $templateHtml . " + + + + + + + + +
    + + + + +
    +
    + + +
    + +
    +
    +
    diff --git a/component/site/views/category/tmpl/default.php b/component/site/views/category/tmpl/default.php new file mode 100644 index 00000000000..e2f7d857450 --- /dev/null +++ b/component/site/views/category/tmpl/default.php @@ -0,0 +1,266 @@ +getModel('category'); +$loadCategorytemplate = $this->loadCategorytemplate; + +if (!empty($loadCategorytemplate) && $loadCategorytemplate[0]->template_desc != "") +{ + $template_desc = $loadCategorytemplate[0]->template_desc; +} +else +{ + $template_desc = "
    {print}

    {category_frontpage_introtext}

    "; + $template_desc .= "\r\n{category_frontpage_loop_start}
    \r\n"; + $template_desc .= "
    {category_thumb_image}
    \r\n"; + $template_desc .= "

    {category_name}

    \r\n
    {category_frontpage_loop_end}"; +} + +if ($this->params->get('show_page_heading', 0)) +{ + if (!$this->catid) + { + echo '
    '; + } + else + { + echo '
    '; + } + + if (!$this->catid) + { + echo '

    '; + + if ($this->params->get('page_title') != $this->pageheadingtag) + { + echo $this->escape($this->params->get('page_title')); + } + else + { + echo $this->pageheadingtag; + } + + echo '

    '; + } + + echo '
    '; +} + +if ($this->print) +{ + $onclick = "onclick='window.print();'"; +} +else +{ + $print_url = $url . "index.php?option=com_redshop&view=category&print=1&tmpl=component&Itemid=" . $this->itemid; + $onclick = "onclick='window.open(\"$print_url\",\"mywindow\",\"scrollbars=1\",\"location=1\")'"; +} + +$print_tag = ""; +$print_tag .= "" .
+	JText::_("; +$print_tag .= ""; + +$template_desc = str_replace("{print}", $print_tag, $template_desc); +$template_desc = str_replace("{category_frontpage_introtext}", Redshop::getConfig()->get('CATEGORY_FRONTPAGE_INTROTEXT'), $template_desc); + +if (strstr($template_desc, "{category_frontpage_loop_start}") && strstr($template_desc, "{category_frontpage_loop_end}")) +{ + $cattemplate_desc = explode('{category_frontpage_loop_start}', $template_desc); + $catheader = $cattemplate_desc[0]; + + $cattemplate_desc = explode('{category_frontpage_loop_end}', $cattemplate_desc [1]); + $middletemplate_desc = $cattemplate_desc[0]; + + if (strstr($middletemplate_desc, '{category_thumb_image_2}')) + { + $tag = '{category_thumb_image_2}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT_2'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH_2'); + } + elseif (strstr($middletemplate_desc, '{category_thumb_image_3}')) + { + $tag = '{category_thumb_image_3}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT_3'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH_3'); + } + elseif (strstr($middletemplate_desc, '{category_thumb_image_1}')) + { + $tag = '{category_thumb_image_1}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + else + { + $tag = '{category_thumb_image}'; + $h_thumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $w_thumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(2, 1, 1); + $cat_detail = ""; + $countCategories = count($this->detail); + + if (!$countCategories) + { + $cat_detail .= '

    ' . JText::_('COM_REDSHOP_THERE_ARE_NO_CATEGORIES_TO_SHOW') . '

    '; + } + + for ($i = 0; $i < $countCategories; $i++) + { + $row = $this->detail[$i]; + + // Filter categories based on Shopper group category ACL + $checkcid = RedshopHelperAccess::checkPortalCategoryPermission($row->id); + $sgportal = RedshopHelperShopper_Group::getShopperGroupPortal(); + $portal = 0; + + if (!empty($sgportal)) + { + $portal = $sgportal->shopper_group_portal; + } + + if (!$checkcid && (Redshop::getConfig()->get('PORTAL_SHOP') == 1 || $portal == 1)) + { + continue; + } + + $data_add = $middletemplate_desc; + + $cItemid = RedshopHelperRouter::getCategoryItemid($row->id); + + if ($cItemid != "") + { + $tmpItemid = $cItemid; + } + else + { + $tmpItemid = $this->itemid; + } + + $link = JRoute::_('index.php?option=com_redshop&view=category&cid=' . $row->id . '&layout=detail&Itemid=' . $tmpItemid); + + // New tags replacement for category template section + $data_add = RedshopTagsReplacer::_( + 'category', + $data_add, + array('category' => $row, 'itemId' => $tmpItemid) + ); + + if (strstr($data_add, '{category_name}')) + { + $cat_name = '' . $row->name . ''; + $data_add = str_replace("{category_name}", $cat_name, $data_add); + } + + if (strstr($data_add, '{category_readmore}')) + { + $cat_name = '' . JText::_('COM_REDSHOP_READ_MORE') . ''; + $data_add = str_replace("{category_readmore}", $cat_name, $data_add); + } + + if (strstr($data_add, '{category_description}')) + { + $cat_desc = $config->maxchar($row->description, Redshop::getConfig()->get('CATEGORY_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_DESC_END_SUFFIX')); + $data_add = str_replace("{category_description}", $cat_desc, $data_add); + } + + if (strstr($data_add, '{category_short_desc}')) + { + $cat_s_desc = $config->maxchar($row->short_description, Redshop::getConfig()->get('CATEGORY_SHORT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_SHORT_DESC_END_SUFFIX')); + $data_add = str_replace("{category_short_desc}", $cat_s_desc, $data_add); + } + + if (strstr($data_add, '{category_total_product}')) + { + $totalprd = $producthelper->getProductCategory($row->id); + $data_add = str_replace("{category_total_product}", count($totalprd), $data_add); + $data_add = str_replace("{category_total_product_lbl}", JText::_('COM_REDSHOP_TOTAL_PRODUCT'), $data_add); + } + + /* + * category template extra field + * "2" argument is set for category + */ + $data_add = $producthelper->getExtraSectionTag($extraFieldName, $row->id, "2", $data_add); + + $read_more = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $data_add = str_replace("{read_more}", $read_more, $data_add); + + $cat_detail .= $data_add; + } + + $template_desc = str_replace("{category_frontpage_loop_start}", "", $template_desc); + $template_desc = str_replace("{category_frontpage_loop_end}", "", $template_desc); + $template_desc = str_replace($middletemplate_desc, $cat_detail, $template_desc); +} + +if (strstr($template_desc, "{filter_by}")) +{ + $template_desc = str_replace("{filter_by_lbl}", "", $template_desc); + $template_desc = str_replace("{filter_by}", "", $template_desc); +} + +if (strstr($template_desc, "{template_selector_category}")) +{ + $template_selecter_form = "
    "; + $template_selecter_form .= $this->lists['category_template']; + $template_selecter_form .= ""; + $template_selecter_form .= ""; + $template_selecter_form .= "
    "; + + $template_desc = str_replace("{template_selector_category_lbl}", JText::_('COM_REDSHOP_TEMPLATE_SELECTOR_CATEGORY_LBL'), $template_desc); + $template_desc = str_replace("{template_selector_category}", $template_selecter_form, $template_desc); +} + +if (strstr($template_desc, "{order_by}")) +{ + $template_desc = str_replace("{order_by_lbl}", "", $template_desc); + $template_desc = str_replace("{order_by}", "", $template_desc); +} + +if (strstr($template_desc, "{show_all_products_in_category}")) +{ + $template_desc = str_replace("{show_all_products_in_category}", "", $template_desc); + $template_desc = str_replace("{pagination}", "", $template_desc); +} + +if (strpos($template_desc, "{pagination}") !== false) +{ + $pagination = $model->getCategoryPagination(); + $template_desc = str_replace("{pagination}", $pagination->getPagesLinks(), $template_desc); +} + +if (strstr($template_desc, "perpagelimit:")) +{ + $perpage = explode('{perpagelimit:', $template_desc); + $perpage = explode('}', $perpage[1]); + $template_desc = str_replace("{perpagelimit:" . intval($perpage[0]) . "}", "", $template_desc); +} + +if (strstr($template_desc, "{product_display_limit}")) +{ + $template_desc = str_replace("{product_display_limit}", '', $template_desc); +} + +$template_desc = RedshopHelperTemplate::parseRedshopPlugin($template_desc); +echo eval("?>" . $template_desc . " + + + + + + + + +
    + +
    +
    +
    diff --git a/component/site/views/category/tmpl/detail.php b/component/site/views/category/tmpl/detail.php new file mode 100644 index 00000000000..2513a639fa9 --- /dev/null +++ b/component/site/views/category/tmpl/detail.php @@ -0,0 +1,1098 @@ +input->getInt('limitstart', 0); + +$slide = $this->input->getInt('ajaxslide', null); +$filter_by = $this->input->getInt('manufacturer_id', $this->params->get('manufacturer_id')); +$category_template = $this->input->getInt('category_template', 0); + +/** @var RedshopModelCategory $model */ +$model = $this->getModel('category'); +$minmax = $model->getMaxMinProductPrice(); +$texpricemin = $minmax[0]; +$texpricemax = $minmax[1]; + +$loadCategorytemplate = $this->loadCategorytemplate; +$fieldArray = $extraField->getSectionFieldList(17, 0, 0); + +if (!empty($loadCategorytemplate) && $loadCategorytemplate[0]->template_desc != "") +{ + $template_desc = $loadCategorytemplate[0]->template_desc; +} +else +{ + $template_desc = "
    {print}
    \r\n
    \r\n"; + $template_desc .= "
    {category_main_description}
    \r\n"; + $template_desc .= "

    {if subcats} {category_loop_start}

    \r\n
    \r\n"; + $template_desc .= "
    \r\n
    {category_thumb_image}
    \r\n"; + $template_desc .= "
    \r\n

    {category_name}

    \r\n"; + $template_desc .= "{category_description}
    \r\n
    \r\n
    \r\n

    {category_loop_end} {subcats end if}

    \r\n"; + $template_desc .= "
    \r\n
    \r\n
    "; + $template_desc .= "{order_by}
    \r\n
    \r\n
    {product_loop_start}\r\n"; + $template_desc .= "
    \r\n
    \r\n
    "; + $template_desc .= "{product_thumb_image}
    \r\n
    \r\n

    {product_name}

    \r\n
    \r\n"; + $template_desc .= "
    {product_price}
    \r\n
    {read_more}
    \r\n"; + $template_desc .= "
    {product_rating_summary}
    \r\n
    {form_addtocart:add_to_cart1}"; + $template_desc .= "
    \r\n
    \r\n
    \r\n{product_loop_end}\r\n
    \r\n"; + $template_desc .= "
    \r\n
    {pagination}
    "; +} + +$categoryItemId = (int) RedshopHelperRouter::getCategoryItemid($this->catid); +$mainItemid = !$categoryItemId ? $this->itemid : $categoryItemId; + +$excludedTags = array(); +// New tags replacement for category template section +$template_desc = RedshopTagsReplacer::_('category', $template_desc, array('category' => $this->maincat, 'subCategories' => $this->detail, 'manufacturerId' => $this->manufacturer_id, 'itemId' => $mainItemid, 'excludedTags' => $excludedTags)); + +$endlimit = $this->state->get('list.limit'); + +$app = JFactory::getApplication(); +$router = $app->getRouter(); + +$document = JFactory::getDocument(); +$model = $this->getModel('category'); + +// Replace redproductfilder filter tag +if (strpos($template_desc, "{redproductfinderfilter:") !== false) +{ + if (file_exists(JPATH_SITE . '/components/com_redproductfinder/helpers/redproductfinder_helper.php')) + { + include_once JPATH_SITE . "/components/com_redproductfinder/helpers/redproductfinder_helper.php"; + $redproductfinder_helper = new redproductfinder_helper; + $hdnFields = array( + 'texpricemin' => '0', + 'texpricemax' => '0', + 'manufacturer_id' => $filter_by, + 'category_template' => $category_template + ); + $hide_filter_flag = false; + + if ($this->catid) + { + $prodctofcat = $producthelper->getProductCategory($this->catid); + + if (empty($prodctofcat)) + { + $hide_filter_flag = true; + } + } + + $template_desc = $redproductfinder_helper->replaceProductfinder_tag($template_desc, $hdnFields, $hide_filter_flag); + } +} + +// Replace redproductfilder filter tag end here +if (!$slide) +{ + echo '
    '; + + if ($this->params->get('show_page_heading', 0)) + { + ?> +
    + maincat->pageheading != "") + { + echo $this->escape($this->maincat->pageheading); + } + else + { + echo $this->escape($this->pageheadingtag); + } + ?> +
    + "; + + if ($this->print) + { + $onclick = "onclick='window.print();'"; + $template_desc = str_replace("{product_price_slider}", "", $template_desc); + $template_desc = str_replace("{pagination}", "", $template_desc); + } + else + { + $print_url = $url . "index.php?option=com_redshop&view=category&layout=detail&cid=" . $this->catid; + $print_url .= "&print=1&tmpl=component&Itemid=" . $this->itemid; + $print_url .= "&limit=" . $endlimit . "&texpricemin=" . $texpricemin . "&texpricemax=" . $texpricemax . "&order_by=" . $this->order_by_select; + $print_url .= "&manufacturer_id=" . $this->manufacturer_id . "&category_template=" . $this->category_template_id; + + $onclick = "onclick='window.open(\"$print_url\",\"mywindow\",\"scrollbars=1\",\"location=1\")'"; + } + + $print_tag = ""; + $print_tag .= "" .
+		JText::_("; + $print_tag .= ""; + + $template_desc = str_replace("{print}", $print_tag, $template_desc); + $template_desc = str_replace("{total_product}", $model->_total, $template_desc); + $template_desc = str_replace("{total_product_lbl}", JText::_('COM_REDSHOP_TOTAL_PRODUCT'), $template_desc); + + if (strpos($template_desc, '{returntocategory_link}') !== false || strpos($template_desc, '{returntocategory_name}') !== false || strpos($template_desc, '{returntocategory}') !== false) + { + $parentid = $producthelper->getParentCategory($this->catid); + $returncatlink = ''; + $returntocategory = ''; + $returntocategory_name = ''; + + if ($parentid != 0) + { + $categorylist = RedshopEntityCategory::getInstance($parentid)->getItem(); + $returntocategory_name = $categorylist->name; + $returncatlink = JRoute::_( + "index.php?option=" . $this->option . + "&view=category&cid=" . $parentid . + '&manufacturer_id=' . $this->manufacturer_id . + "&Itemid=" . $this->itemid + ); + $returntocategory = '' . Redshop::getConfig()->get('DAFULT_RETURN_TO_CATEGORY_PREFIX') . ' ' . $categorylist->name . ''; + } + else if (Redshop::getConfig()->get('DAFULT_RETURN_TO_CATEGORY_PREFIX')) + { + $returntocategory_name = Redshop::getConfig()->get('DAFULT_RETURN_TO_CATEGORY_PREFIX'); + $returncatlink = JRoute::_( + "index.php?option=" . $this->option . + "&view=category&manufacturer_id=" . $this->manufacturer_id . + "&Itemid=" . $this->itemid + ); + $returntocategory = '' . Redshop::getConfig()->get('DAFULT_RETURN_TO_CATEGORY_PREFIX') . ''; + } + + $template_desc = str_replace("{returntocategory_link}", $returncatlink, $template_desc); + $template_desc = str_replace('{returntocategory_name}', $returntocategory_name, $template_desc); + $template_desc = str_replace("{returntocategory}", $returntocategory, $template_desc); + } + + if (strpos($template_desc, '{category_main_description}') !== false) + { + $main_cat_desc = $Redconfiguration->maxchar($this->maincat->description, Redshop::getConfig()->get('CATEGORY_SHORT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_SHORT_DESC_END_SUFFIX')); + $template_desc = str_replace("{category_main_description}", $main_cat_desc, $template_desc); + } + + if (strpos($template_desc, '{category_main_short_desc}') !== false) + { + $main_cat_s_desc = $Redconfiguration->maxchar( + $this->maincat->short_description, + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_MAX_CHARS'), + Redshop::getConfig()->get('CATEGORY_SHORT_DESC_END_SUFFIX') + ); + $template_desc = str_replace("{category_main_short_desc}", $main_cat_s_desc, $template_desc); + } + + if (strpos($template_desc, '{shopname}') !== false) + { + $template_desc = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $template_desc); + } + + $main_cat_name = $Redconfiguration->maxchar($this->maincat->name, Redshop::getConfig()->get('CATEGORY_TITLE_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_TITLE_END_SUFFIX')); + $template_desc = str_replace("{category_main_name}", $main_cat_name, $template_desc); + + if (strpos($template_desc, '{category_main_thumb_image_2}') !== false) + { + $ctag = '{category_main_thumb_image_2}'; + $ch_thumb = Redshop::getConfig()->get('THUMB_HEIGHT_2'); + $cw_thumb = Redshop::getConfig()->get('THUMB_WIDTH_2'); + } + elseif (strpos($template_desc, '{category_main_thumb_image_3}') !== false) + { + $ctag = '{category_main_thumb_image_3}'; + $ch_thumb = Redshop::getConfig()->get('THUMB_HEIGHT_3'); + $cw_thumb = Redshop::getConfig()->get('THUMB_WIDTH_3'); + } + elseif (strpos($template_desc, '{category_main_thumb_image_1}') !== false) + { + $ctag = '{category_main_thumb_image_1}'; + $ch_thumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $cw_thumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + else + { + $ctag = '{category_main_thumb_image}'; + $ch_thumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $cw_thumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + + $link = JRoute::_( + 'index.php?option=' . $this->option . + '&view=category&cid=' . $this->catid . + '&manufacturer_id=' . $this->manufacturer_id . + '&layout=detail&Itemid=' . $mainItemid + ); + + $cat_main_thumb = ""; + + $medias = RedshopEntityCategory::getInstance($this->maincat->id)->getMedia(); + + /** @var RedshopEntityMediaImage $fullImage */ + $fullImage = null; + + foreach ($medias->getAll() as $media) + { + /** @var RedshopEntityMedia $media */ + if ($media->get('scope') == 'full') + { + $fullImage = RedshopEntityMediaImage::getInstance($media->getId()); + + break; + } + } + + if (null !== $fullImage) + { + if (is_null($ch_thumb) || !$ch_thumb || is_null($cw_thumb) || !$cw_thumb) + { + $ch_thumb = Redshop::getConfig()->get('THUMB_HEIGHT'); + $cw_thumb = Redshop::getConfig()->get('THUMB_WIDTH'); + } + + $water_cat_img = $fullImage->generateThumb($cw_thumb, $ch_thumb); + $cat_main_thumb = "" . $main_cat_name . ""; + } + + $template_desc = str_replace($ctag, $cat_main_thumb, $template_desc); + + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(2, 1, 1); + $template_desc = RedshopHelperProductTag::getExtraSectionTag($extraFieldName, $this->catid, RedshopHelperExtrafields::SECTION_CATEGORY, $template_desc); + + if (strpos($template_desc, "{compare_product_div}") !== false) + { + $compare_product_div = ""; + + if (!empty(Redshop::getConfig()->get('PRODUCT_COMPARISON_TYPE'))) + { + $comparediv = Redshop\Product\Compare::generateCompareProduct(); + $compareUrl = JRoute::_('index.php?option=com_redshop&view=product&layout=compare&Itemid=' . $this->itemid); + $compare_product_div = '' . JText::_('COM_REDSHOP_COMPARE') . ''; + $compare_product_div .= "
    " . $comparediv . "
    "; + } + + $template_desc = str_replace("{compare_product_div}", $compare_product_div, $template_desc); + } + + if (strpos($template_desc, "{category_loop_start}") !== false && strpos($template_desc, "{category_loop_end}") !== false) + { + $template_d1 = explode("{category_loop_start}", $template_desc); + $template_d2 = explode("{category_loop_end}", $template_d1 [1]); + $subcat_template = $template_d2 [0]; + + $cat_detail = ""; + $extraFieldsForCurrentTemplate = RedshopHelperTemplate::getExtraFieldsForCurrentTemplate($extraFieldName, $subcat_template); + + for ($i = 0, $nc = count($this->detail); $i < $nc; $i++) + { + if (empty($excludedTags)) + { + break; + } + + $row = $this->detail[$i]; + + // Filter categories based on Shopper group category ACL + $checkcid = RedshopHelperAccess::checkPortalCategoryPermission($row->id); + $sgportal = RedshopHelperShopper_Group::getShopperGroupPortal(); + $portal = 0; + + if (!empty($sgportal)) + { + $portal = $sgportal->shopper_group_portal; + } + + if (!$checkcid && (Redshop::getConfig()->get('PORTAL_SHOP') == 1 || $portal == 1)) + { + continue; + } + + $data_add = explode('{explode_product}', $subcat_template); + + /* + * category template extra field + * "2" argument is set for category + */ + if ($extraFieldsForCurrentTemplate) + { + $data_add[$i] = Redshop\Helper\ExtraFields::displayExtraFields(2, $row->id, $extraFieldsForCurrentTemplate, $data_add[$i]); + } + + $cat_detail .= $data_add[$i]; + } + + $template_desc = str_replace("{category_loop_start}", "", $template_desc); + $template_desc = str_replace("{category_loop_end}", "", $template_desc); + $template_desc = str_replace($subcat_template, $cat_detail, $template_desc); + } + + if (strpos($template_desc, "{if subcats}") !== false && strpos($template_desc, "{subcats end if}") !== false) + { + $template_d1 = explode("{if subcats}", $template_desc); + $template_d2 = explode("{subcats end if}", $template_d1 [1]); + + if (!empty($this->detail)) + { + $template_desc = str_replace("{if subcats}", "", $template_desc); + $template_desc = str_replace("{subcats end if}", "", $template_desc); + } + else + { + $template_desc = $template_d1 [0] . $template_d2 [1]; + } + } + + if (strpos($template_desc, "{product_price_slider}") !== false) + { + $price_slider = '
    +
    +
    ' . JText::_('COM_REDSHOP_PRICE') . ':
    +
    +
    + + +
    +
    +
    +
    + +
    +
    '; + $template_desc = str_replace("{product_price_slider}", $price_slider, $template_desc); + $product_tmpl = JText::_('COM_REDSHOP_NO_PRODUCT_FOUND'); + } +} + +if (strpos($template_desc, "{product_loop_start}") !== false && strpos($template_desc, "{product_loop_end}") !== false) +{ + $template_d1 = explode("{product_loop_start}", $template_desc); + $template_d2 = explode("{product_loop_end}", $template_d1 [1]); + $template_product = $template_d2 [0]; + + $attribute_template = \Redshop\Template\Helper::getAttribute($template_product); + + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(1, 1, 1); + $extraFieldsForCurrentTemplate = $producthelper->getExtraFieldsForCurrentTemplate($extraFieldName, $template_product, 1); + $product_data = ''; + list($template_userfield, $userfieldArr) = $producthelper->getProductUserfieldFromTemplate($template_product); + $template_product = $producthelper->replaceVatinfo($template_product); + + foreach ($this->product as $product) + { + // ToDo: This is wrong way to generate tmpl file. And model function to load $this->product is wrong way also. Fix it. + // ToDo: Echo a message when no records is returned by selection of empty category or wrong manufacturer in menu item params. + + $count_no_user_field = 0; + + $data_add = $template_product; + + // ProductFinderDatepicker Extra Field Start + $data_add = $producthelper->getProductFinderDatepickerValue($data_add, $product->product_id, $fieldArray); + // ProductFinderDatepicker Extra Field End + + //Replace Product price when config enable discount is "No" + if (Redshop::getConfig()->getInt('DISCOUNT_ENABLE') === 0) + { + $data_add = str_replace('{product_old_price}', '', $data_add); + } + + /* + * Process the prepare Product plugins + */ + $params = array(); + $results = $this->dispatcher->trigger('onPrepareProduct', array(& $data_add, & $params, $product)); + + if (strpos($data_add, "{product_delivery_time}") !== false) + { + $product_delivery_time = $producthelper->getProductMinDeliveryTime($product->product_id); + + if ($product_delivery_time != "") + { + $data_add = str_replace("{delivery_time_lbl}", JText::_('COM_REDSHOP_DELIVERY_TIME'), $data_add); + $data_add = str_replace("{product_delivery_time}", $product_delivery_time, $data_add); + } + else + { + $data_add = str_replace("{delivery_time_lbl}", "", $data_add); + $data_add = str_replace("{product_delivery_time}", "", $data_add); + } + } + + // More documents + if (strpos($data_add, "{more_documents}") !== false) + { + $media_documents = RedshopHelperMedia::getAdditionMediaImage($product->product_id, "product", "document"); + $more_doc = ''; + + for ($m = 0, $nm = count($media_documents); $m < $nm; $m++) + { + $alttext = RedshopHelperMedia::getAlternativeText( + "product", $media_documents[$m]->section_id, "", $media_documents[$m]->media_id, "document" + ); + + if (!$alttext) + { + $alttext = $media_documents[$m]->media_name; + } + + if (JFile::exists(REDSHOP_FRONT_DOCUMENT_RELPATH . 'product/' . $media_documents[$m]->media_name)) + { + $downlink = JURI::root() . + 'index.php?tmpl=component&option=' . $this->option . + '&view=product&pid=' . $this->data->product_id . + '&task=downloadDocument&fname=' . $media_documents[$m]->media_name . + '&Itemid=' . $this->itemid; + $more_doc .= ""; + } + } + + $data_add = str_replace("{more_documents}", "" . $more_doc . "", $data_add); + } + + // More documents end + + // Product User Field Start + $hidden_userfield = ""; + + if ($template_userfield != "") + { + $ufield = ""; + + for ($ui = 0, $nui = count($userfieldArr); $ui < $nui; $ui++) + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', '', 0, $product->product_id); + $ufield .= $productUserFields[1]; + + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + $data_add = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $data_add); + $data_add = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $data_add); + } + + $productUserFieldsForm = "
    "; + + if ($ufield != "") + { + $data_add = str_replace("{if product_userfield}", $productUserFieldsForm, $data_add); + $data_add = str_replace("{product_userfield end if}", "
    ", $data_add); + } + else + { + $data_add = str_replace("{if product_userfield}", "", $data_add); + $data_add = str_replace("{product_userfield end if}", "", $data_add); + } + } + elseif (Redshop::getConfig()->get('AJAX_CART_BOX')) + { + $ajax_detail_template_desc = ""; + $ajax_detail_template = \Redshop\Template\Helper::getAjaxDetailBox($product); + + if (null !== $ajax_detail_template) + { + $ajax_detail_template_desc = $ajax_detail_template->template_desc; + } + + $returnArr = $producthelper->getProductUserfieldFromTemplate($ajax_detail_template_desc); + $template_userfield = $returnArr[0]; + $userfieldArr = $returnArr[1]; + + if ($template_userfield != "") + { + $ufield = ""; + + for ($ui = 0, $nui = count($userfieldArr); $ui < $nui; $ui++) + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', '', 0, $product->product_id); + $ufield .= $productUserFields[1]; + + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + $template_userfield = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $template_userfield); + $template_userfield = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $template_userfield); + } + + if ($ufield != "") + { + $hidden_userfield = "
    " . $template_userfield . "
    "; + } + } + } + + $data_add = $data_add . $hidden_userfield; + /************** end user fields ***************************/ + + $ItemData = $producthelper->getMenuInformation(0, 0, '', 'product&pid=' . $product->product_id); + $catidmain = JFactory::getApplication()->input->get("cid"); + + if (!empty($ItemData)) + { + $pItemid = $ItemData->id; + } + else + { + $pItemid = RedshopHelperRouter::getItemId($product->product_id, $catidmain); + } + + $data_add = str_replace("{product_id_lbl}", JText::_('COM_REDSHOP_PRODUCT_ID_LBL'), $data_add); + $data_add = str_replace("{product_id}", $product->product_id, $data_add); + $data_add = str_replace("{product_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER_LBL'), $data_add); + $product_number_output = '' . $product->product_number . ''; + $data_add = str_replace("{product_number}", $product_number_output, $data_add); + + $product_volume_unit = '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . "3" . ''; + + $dataAddStr = $producthelper->redunitDecimal($product->product_volume) . " " . $product_volume_unit; + $data_add = str_replace("{product_size}", $dataAddStr, $data_add); + + $product_unit = '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . ''; + $data_add = str_replace("{product_length}", $producthelper->redunitDecimal($product->product_length) . " " . $product_unit, $data_add); + $data_add = str_replace("{product_width}", $producthelper->redunitDecimal($product->product_width) . " " . $product_unit, $data_add); + $data_add = str_replace("{product_height}", $producthelper->redunitDecimal($product->product_height) . " " . $product_unit, $data_add); + + $specificLink = $this->dispatcher->trigger('createProductLink', array($product)); + + if (empty($specificLink)) + { + $productCatId = !empty($product->categories) && is_array($product->categories) ? $product->categories[0] : $this->catid; + + $link = JRoute::_( + 'index.php?option=' . $this->option . + '&view=product&pid=' . $product->product_id . + '&cid=' . $productCatId . + '&Itemid=' . $pItemid + ); + } + else + { + $link = $specificLink[0]; + } + + $pname = $Redconfiguration->maxchar($product->product_name, Redshop::getConfig()->get('CATEGORY_PRODUCT_TITLE_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_PRODUCT_TITLE_END_SUFFIX')); + $product_nm = $pname; + + if (strpos($data_add, '{product_name_nolink}') !== false) + { + $data_add = str_replace("{product_name_nolink}", $product_nm, $data_add); + } + + if (strpos($data_add, '{product_name}') !== false) + { + $pname = "" . $pname . ""; + $data_add = str_replace("{product_name}", $pname, $data_add); + } + + if (strpos($data_add, '{category_product_link}') !== false) + { + $data_add = str_replace("{category_product_link}", $link, $data_add); + } + + if (strpos($data_add, '{read_more}') !== false) + { + $rmore = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $data_add = str_replace("{read_more}", $rmore, $data_add); + } + + if (strpos($data_add, '{read_more_link}') !== false) + { + $data_add = str_replace("{read_more_link}", $link, $data_add); + } + + /** + * Related Product List in Lightbox + * Tag Format = {related_product_lightbox:[:width][:height]} + */ + if (strpos($data_add, '{related_product_lightbox:') !== false) + { + $related_product = $producthelper->getRelatedProduct($product->product_id); + $rtlnone = explode("{related_product_lightbox:", $data_add); + $rtlntwo = explode("}", $rtlnone[1]); + $rtlnthree = explode(":", $rtlntwo[0]); + $rtln = $rtlnthree[0]; + $rtlnfwidth = (isset($rtlnthree[1])) ? $rtlnthree[1] : "900"; + $rtlnwidthtag = (isset($rtlnthree[1])) ? ":" . $rtlnthree[1] : ""; + + $rtlnfheight = (isset($rtlnthree[2])) ? $rtlnthree[2] : "600"; + $rtlnheighttag = (isset($rtlnthree[2])) ? ":" . $rtlnthree[2] : ""; + + $rtlntag = "{related_product_lightbox:$rtln$rtlnwidthtag$rtlnheighttag}"; + + if (!empty($related_product)) + { + $linktortln = JURI::root() . + "index.php?option=com_redshop&view=product&pid=" . $product->product_id . + "&tmpl=component&template=" . $rtln . "&for=rtln"; + $rtlna = '' . JText::_('COM_REDSHOP_RELATED_PRODUCT_LIST_IN_LIGHTBOX') . ''; + } + else + { + $rtlna = ""; + } + + $data_add = str_replace($rtlntag, $rtlna, $data_add); + } + + if (strpos($data_add, '{product_s_desc}') !== false) + { + $p_s_desc = $Redconfiguration->maxchar($product->product_s_desc, Redshop::getConfig()->get('CATEGORY_PRODUCT_SHORT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_PRODUCT_SHORT_DESC_END_SUFFIX')); + $data_add = str_replace("{product_s_desc}", $p_s_desc, $data_add); + } + + if (strpos($data_add, '{product_desc}') !== false) + { + $p_desc = $Redconfiguration->maxchar($product->product_desc, Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_END_SUFFIX')); + $data_add = str_replace("{product_desc}", $p_desc, $data_add); + } + + if (strpos($data_add, '{product_rating_summary}') !== false) + { + // Product Review/Rating Fetching reviews + $final_avgreview_data = Redshop\Product\Rating::getRating($product->product_id); + $data_add = str_replace("{product_rating_summary}", $final_avgreview_data, $data_add); + } + + if (strpos($data_add, '{manufacturer_link}') !== false) + { + $manufacturer_link_href = JRoute::_( + 'index.php?option=com_redshop&view=manufacturers&layout=detail&mid=' . $product->manufacturer_id . + '&Itemid=' . $this->itemid + ); + $manufacturer_link = '' . + $product->manufacturer_name . + ''; + $data_add = str_replace("{manufacturer_link}", $manufacturer_link, $data_add); + + if (strpos($data_add, "{manufacturer_link}") !== false) + { + $data_add = str_replace("{manufacturer_name}", "", $data_add); + } + } + + if (strpos($data_add, '{manufacturer_product_link}') !== false) + { + $manuUrl = JRoute::_( + 'index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $product->manufacturer_id . + '&Itemid=' . $this->itemid + ); + $manufacturerPLink = "" . + JText::_("COM_REDSHOP_VIEW_ALL_MANUFACTURER_PRODUCTS") . " " . $product->manufacturer_name . + ""; + $data_add = str_replace("{manufacturer_product_link}", $manufacturerPLink, $data_add); + } + + if (strpos($data_add, '{manufacturer_name}') !== false) + { + $data_add = str_replace("{manufacturer_name}", $product->manufacturer_name, $data_add); + } + + if (strpos($data_add, "{product_thumb_image_3}") !== false) + { + $pimg_tag = '{product_thumb_image_3}'; + $ph_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_3'); + $pw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_3'); + } + elseif (strpos($data_add, "{product_thumb_image_2}") !== false) + { + $pimg_tag = '{product_thumb_image_2}'; + $ph_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_2'); + $pw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_2'); + } + elseif (strpos($data_add, "{product_thumb_image_1}") !== false) + { + $pimg_tag = '{product_thumb_image_1}'; + $ph_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $pw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + else + { + $pimg_tag = '{product_thumb_image}'; + $ph_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $pw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + + $hidden_thumb_image = " + "; + + // Product image flying addwishlist time start + $thum_image = "" . + Redshop\Product\Image\Image::getImage($product->product_id, $link, $pw_thumb, $ph_thumb, 2, 1) . + ""; + + // Product image flying addwishlist time end + $data_add = str_replace($pimg_tag, $thum_image . $hidden_thumb_image, $data_add); + + // Front-back image tag... + if (strpos($data_add, "{front_img_link}") !== false || strpos($data_add, "{back_img_link}") !== false) + { + if ($this->_data->product_thumb_image) + { + $mainsrcPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $product->product_thumb_image; + } + else + { + $mainsrcPath = RedshopHelperMedia::getImagePath( + $product->product_full_image, + '', + 'thumb', + 'product', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + } + + if ($this->_data->product_back_thumb_image) + { + $backsrcPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $product->product_back_thumb_image; + } + else + { + $backsrcPath = RedshopHelperMedia::getImagePath( + $product->product_back_full_image, + '', + 'thumb', + 'product', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + } + + $ahrefpath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $product->product_full_image; + $ahrefbackpath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $product->product_back_full_image; + + $product_front_image_link = "" . + JText::_('COM_REDSHOP_FRONT_IMAGE') . ""; + $product_back_image_link = "" . + JText::_('COM_REDSHOP_BACK_IMAGE') . ""; + + $data_add = str_replace("{front_img_link}", $product_front_image_link, $data_add); + $data_add = str_replace("{back_img_link}", $product_back_image_link, $data_add); + } + else + { + $data_add = str_replace("{front_img_link}", "", $data_add); + $data_add = str_replace("{back_img_link}", "", $data_add); + } + + // Front-back image tag end + + // Product preview image. + if (strpos($data_add, '{product_preview_img}') !== false) + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $product->product_preview_image)) + { + $previewsrcPath = RedshopHelperMedia::getImagePath( + $product->product_preview_image, + '', + 'thumb', + 'product', + Redshop::getConfig()->get('CATEGORY_PRODUCT_PREVIEW_IMAGE_WIDTH'), + Redshop::getConfig()->get('CATEGORY_PRODUCT_PREVIEW_IMAGE_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $previewImg = ""; + $data_add = str_replace("{product_preview_img}", $previewImg, $data_add); + } + else + { + $data_add = str_replace("{product_preview_img}", "", $data_add); + } + } + + $data_add = $producthelper->getJcommentEditor($product, $data_add); + + /* + * product loop template extra field + * lat arg set to "1" for indetify parsing data for product tag loop in category + * last arg will parse {producttag:NAMEOFPRODUCTTAG} nameing tags. + * "1" is for section as product + */ + if ($extraFieldsForCurrentTemplate && !empty($loadCategorytemplate)) + { + $data_add = Redshop\Helper\ExtraFields::displayExtraFields(1, $product->product_id, $extraFieldsForCurrentTemplate, $data_add, true); + } + + /************************************ + * Conditional tag + * if product on discount : Yes + * {if product_on_sale} This product is on sale {product_on_sale end if} // OUTPUT : This product is on sale + * NO : // OUTPUT : Display blank + ************************************/ + $data_add = $producthelper->getProductOnSaleComment($product, $data_add); + + // Replace wishlistbutton + $data_add = $producthelper->replaceWishlistButton($product->product_id, $data_add); + + // Replace compare product button + $data_add = Redshop\Product\Compare::replaceCompareProductsButton($product->product_id, $this->catid, $data_add); + + $data_add = RedshopHelperStockroom::replaceStockroomAmountDetail($data_add, $product->product_id); + + // Checking for child products + if ($product->count_child_products > 0) + { + if (Redshop::getConfig()->get('PURCHASE_PARENT_WITH_CHILD') == 1) + { + $isChilds = false; + + // Get attributes + $attributes_set = array(); + + if ($product->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $product->attribute_set_id, 0, 1); + } + + $attributes = $producthelper->getProductAttribute($product->product_id); + $attributes = array_merge($attributes, $attributes_set); + } + else + { + $isChilds = true; + $attributes = array(); + } + } + else + { + $isChilds = false; + + // Get attributes + $attributes_set = array(); + + if ($product->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $product->attribute_set_id, 0, 1); + } + + $attributes = $producthelper->getProductAttribute($product->product_id); + $attributes = array_merge($attributes, $attributes_set); + } + + // Product attribute Start + $totalatt = count($attributes); + + // Check product for not for sale + + $data_add = $producthelper->getProductNotForSaleComment($product, $data_add, $attributes); + + $data_add = Redshop\Product\Stock::replaceInStock($product->product_id, $data_add, $attributes, $attribute_template); + + $data_add = $producthelper->replaceAttributeData($product->product_id, 0, 0, $attributes, $data_add, $attribute_template, $isChilds); + + // Get cart tempalte + $data_add = Redshop\Cart\Render::replace( + $product->product_id, + $this->catid, + 0, + 0, + $data_add, + $isChilds, + $userfieldArr, + $totalatt, + $product->total_accessories, + $count_no_user_field + ); + + // Extra field display + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(RedshopHelperExtrafields::SECTION_PRODUCT); + $data_add = RedshopHelperProductTag::getExtraSectionTag($extraFieldName, $product->product_id, "1", $data_add); + + $productAvailabilityDate = strstr($data_add, "{product_availability_date}"); + $stockNotifyFlag = strstr($data_add, "{stock_notify_flag}"); + $stockStatus = strstr($data_add, "{stock_status"); + + $attributeproductStockStatus = array(); + + if ($productAvailabilityDate || $stockNotifyFlag || $stockStatus) + { + $attributeproductStockStatus = $producthelper->getproductStockStatus($product->product_id, $totalatt); + } + + $data_add = \Redshop\Helper\Stockroom::replaceProductStockData( + $product->product_id, + 0, + 0, + $data_add, + $attributeproductStockStatus + ); + + $this->dispatcher->trigger('onAfterDisplayProduct', array(&$data_add, array(), $product)); + + $product_data .= $data_add; + } + + if (!$slide) + { + $product_tmpl = "
    " . $product_data . "
    "; + } + else + { + $product_tmpl = $product_data; + } + + $product_tmpl .= ""; + $product_tmpl .= ""; + + if (strstr($template_desc, "{show_all_products_in_category}")) + { + $template_desc = str_replace("{show_all_products_in_category}", "", $template_desc); + $template_desc = str_replace("{pagination}", "", $template_desc); + } + + $limitBox = ''; + $paginationList = ''; + $usePerPageLimit = false; + + $pagination = new JPagination($model->_total, $start, $endlimit); + + if ($this->productPriceSliderEnable) + { + $pagination->setAdditionalUrlParam('texpricemin', $texpricemin); + $pagination->setAdditionalUrlParam('texpricemax', $texpricemax); + } + + if (strpos($template_desc, "{pagination}") !== false) + { + $paginationList = $pagination->getPagesLinks(); + $template_desc = str_replace("{pagination}", $paginationList, $template_desc); + } + + if (strpos($template_desc, "perpagelimit:") !== false) + { + $usePerPageLimit = true; + $perpage = explode('{perpagelimit:', $template_desc); + $perpage = explode('}', $perpage[1]); + $template_desc = str_replace("{perpagelimit:" . intval($perpage[0]) . "}", "", $template_desc); + } + + if (strpos($template_desc, "{product_display_limit}") !== false) + { + if (!$usePerPageLimit) + { + $limitBox .= ""; + $limitBox .= ""; + $limitBox = "
    " . $limitBox . $pagination->getLimitBox() . "
    "; + } + + $template_desc = str_replace("{product_display_limit}", $limitBox, $template_desc); + } + + if ($this->productPriceSliderEnable) + { + $product_tmpl .= ""; + $product_tmpl .= '"; + } + + $template_desc = str_replace("{product_loop_start}", "", $template_desc); + $template_desc = str_replace("{product_loop_end}", "", $template_desc); + $template_desc = str_replace($template_product, "
    " . $product_tmpl . "
    ", $template_desc); +} + +if (!$slide) +{ + if (strpos($template_desc, "{filter_by}") !== false) + { + $filterby_form = "
    "; + $filterby_form .= $this->lists['manufacturer']; + $filterby_form .= ""; + $filterby_form .= ""; + $filterby_form .= ""; + $filterby_form .= ''; + $filterby_form .= ""; + $filterby_form .= "
    "; + + if ($this->lists['manufacturer'] != "") + { + $template_desc = str_replace("{filter_by_lbl}", JText::_('COM_REDSHOP_SELECT_FILTER_BY'), $template_desc); + } + else + { + $template_desc = str_replace("{filter_by_lbl}", "", $template_desc); + } + + $template_desc = str_replace("{filter_by}", $filterby_form, $template_desc); + } + + if (strpos($template_desc, "{template_selector_category}") !== false) + { + if ($this->lists['category_template'] != "") + { + $template_selecter_form = "
    "; + $template_selecter_form .= $this->lists['category_template']; + $template_selecter_form .= ""; + $template_selecter_form .= ""; + $template_selecter_form .= "
    "; + + $template_desc = str_replace("{template_selector_category_lbl}", JText::_('COM_REDSHOP_TEMPLATE_SELECTOR_CATEGORY_LBL'), $template_desc); + $template_desc = str_replace("{template_selector_category}", $template_selecter_form, $template_desc); + } + + $template_desc = str_replace("{template_selector_category_lbl}", "", $template_desc); + $template_desc = str_replace("{template_selector_category}", "", $template_desc); + } + + if (strpos($template_desc, "{order_by}") !== false) + { + $orderby_form = "
    "; + $orderby_form .= $this->lists['order_by']; + $orderby_form .= ""; + $orderby_form .= ""; + $orderby_form .= ""; + $orderby_form .= ""; + $orderby_form .= "
    "; + + $template_desc = str_replace("{order_by_lbl}", JText::_('COM_REDSHOP_SELECT_ORDER_BY'), $template_desc); + $template_desc = str_replace("{order_by}", $orderby_form, $template_desc); + } +} + +$template_desc = str_replace("{with_vat}", "", $template_desc); +$template_desc = str_replace("{without_vat}", "", $template_desc); +$template_desc = str_replace("{attribute_price_with_vat}", "", $template_desc); +$template_desc = str_replace("{attribute_price_without_vat}", "", $template_desc); +$template_desc = str_replace("{redproductfinderfilter_formstart}", "", $template_desc); +$template_desc = str_replace("{product_price_slider1}", "", $template_desc); +$template_desc = str_replace("{redproductfinderfilter_formend}", "", $template_desc); +$template_desc = str_replace("{redproductfinderfilter:rp_myfilter}", "", $template_desc); + +$template_desc = RedshopHelperTemplate::parseRedshopPlugin($template_desc); + +$template_desc = RedshopHelperText::replaceTexts($template_desc); +echo eval("?>" . $template_desc . "close(); +} diff --git a/component/site/views/category/tmpl/detail.xml b/component/site/views/category/tmpl/detail.xml new file mode 100644 index 00000000000..1e75fe4b08f --- /dev/null +++ b/component/site/views/category/tmpl/detail.xml @@ -0,0 +1,31 @@ + + + + + + + + + +
    + + +
    +
    + + +
    + + + +
    +
    +
    diff --git a/component/site/views/category/tmpl/index.html b/component/site/views/category/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/category/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/category/tmpl/notfound.php b/component/site/views/category/tmpl/notfound.php new file mode 100644 index 00000000000..4f0a3cc3a73 --- /dev/null +++ b/component/site/views/category/tmpl/notfound.php @@ -0,0 +1,14 @@ + +
    + maincat->name, $this->maincat->id) ?> +
    diff --git a/component/site/views/category/view.html.php b/component/site/views/category/view.html.php new file mode 100644 index 00000000000..d1feca6bac1 --- /dev/null +++ b/component/site/views/category/view.html.php @@ -0,0 +1,471 @@ +app = JFactory::getApplication(); + $this->input = $this->app->input; + $prodhelperobj = productHelper::getInstance(); + + // Request variables + $this->option = $this->input->getString('option', 'com_redshop'); + $this->itemid = $this->input->getInt('Itemid', null); + $this->catid = $this->input->getInt('cid', 0); + $layout = $this->input->getString('layout', ''); + $this->print = $this->input->getBool('print', false); + + $params = $this->app->getParams('com_redshop'); + /** @var RedshopModelCategory $model */ + $model = $this->getModel('category'); + $this->state = $model->get('state'); + + JPluginHelper::importPlugin('redshop_product'); + JPluginHelper::importPlugin('redshop_product_type'); + $this->dispatcher = RedshopHelperUtility::getDispatcher(); + + $menu_meta_keywords = $params->get('menu-meta_keywords'); + $menu_robots = $params->get('robots'); + $menu_meta_description = $params->get('menu-meta_description'); + + if (!$this->catid && $layout == 'detail') + { + $this->catid = $params->get('cid'); + + if (!$this->catid) + { + throw new InvalidArgumentException(JText::_('COM_REDSHOP_CATEGORY_NOT_FOUND'), 404); + } + + $this->setLayout('detail'); + } + + if (empty($layout) && $this->catid > 0) + { + $this->setLayout('detail'); + } + + $document = JFactory::getDocument(); + JHtml::stylesheet('com_redshop/redshop.priceslider.min.css', array(), true); + + $lists = array(); + $minmax = array(0, 0); + $product = array(); + + $maincat = $model->_loadCategory(); + + $categoryTemplateId = $model->getState('category_template'); + $allCategoryTemplate = $model->getCategoryTemplate(); + $orderData = RedshopHelperUtility::getOrderByList(); + $manufacturers = $model->getManufacturer(); + $loadCategorytemplate = $model->loadCategoryTemplate($categoryTemplateId); + $detail = $model->getdata(); + + if (!empty($maincat) && !empty($maincat->canonical_url)) + { + $main_url = JUri::root() . $maincat->canonical_url; + $canonical = ''; + $document->addCustomTag($canonical); + } + + $pageheadingtag = ''; + + if ($this->catid) + { + // Restrict category if category not published + if ($maincat->published == 0) + { + $this->setLayout('notfound'); + } + + $registry = new JRegistry; + $filterParams = $registry->loadString($maincat->product_filter_params); + + $isSlider = false; + + if ((!empty($loadCategorytemplate) && strpos($loadCategorytemplate[0]->template_desc, "{include_product_in_sub_cat}") !== false) + || ($filterParams->get('enable') == 1 && $filterParams->get('category_enable') == 1) + ) + { + $model->setState('include_sub_categories_products', true); + $loadCategorytemplate[0]->template_desc = str_replace("{include_product_in_sub_cat}", '', $loadCategorytemplate[0]->template_desc); + } + + if (!empty($loadCategorytemplate) && strpos($loadCategorytemplate[0]->template_desc, "{product_price_slider}") !== false) + { + $model->getCategoryProduct(1); + $minmax[0] = $model->getState('minprice'); + $minmax[1] = $model->getState('maxprice'); + + $isSlider = true; + $texpricemin = $this->input->getInt('texpricemin', $minmax[0]); + $texpricemax = $this->input->getInt('texpricemax', $minmax[1]); + $model->setMaxMinProductPrice(array($texpricemin, $texpricemax)); + } + + $product = $model->getCategoryProduct(0, $isSlider); + + $document->setMetaData('keywords', $maincat->metakey); + $document->setMetaData('description', $maincat->metadesc); + $document->setMetaData('robots', $maincat->metarobot_info); + + // For page title + $pagetitletag = Redshop::getConfig()->get('SEO_PAGE_TITLE_CATEGORY'); + $parentcat = ""; + $parentid = $prodhelperobj->getParentCategory($maincat->id); + + while ($parentid != 0) + { + $parentdetail = RedshopEntityCategory::getInstance($parentid)->getItem(); + $parentcat = $parentdetail->name . " " . $parentcat; + $parentid = $prodhelperobj->getParentCategory($parentdetail->id); + } + + $pagetitletag = str_replace("{parentcategoryloop}", $parentcat, $pagetitletag); + $pagetitletag = str_replace("{categoryname}", $maincat->name, $pagetitletag); + $pagetitletag = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $pagetitletag); + $pagetitletag = str_replace("{categoryshortdesc}", strip_tags($maincat->short_description), $pagetitletag); + + if ($maincat->pagetitle != "" && RedShop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_TITLE_CATEGORY') != '') + { + if ($maincat->append_to_global_seo == 'append') + { + $pagetitletag = $pagetitletag . $maincat->pagetitle; + $document->setTitle($pagetitletag); + } + elseif ($maincat->append_to_global_seo == 'prepend') + { + $pagetitletag = $maincat->pagetitle . $pagetitletag; + $document->setTitle($pagetitletag); + } + elseif ($maincat->append_to_global_seo == 'replace') + { + $document->setTitle($maincat->pagetitle); + } + } + elseif ($maincat->pagetitle != "") + { + $document->setTitle($maincat->pagetitle); + } + elseif (RedShop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_TITLE_CATEGORY') != '') + { + $document->setTitle($pagetitletag); + } + else + { + $document->setTitle($this->app->getCfg('sitename')); + } + + $pagekeywordstag = ''; + + if (RedShop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_KEYWORDS_CATEGORY') != '') + { + $pagekeywordstag = Redshop::getConfig()->get('SEO_PAGE_KEYWORDS_CATEGORY'); + $pagekeywordstag = str_replace("{categoryname}", $maincat->name, $pagekeywordstag); + $pagekeywordstag = str_replace("{categoryshortdesc}", strip_tags($maincat->short_description), $pagekeywordstag); + $pagekeywordstag = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $pagekeywordstag); + $document->setMetaData('keywords', $pagekeywordstag); + } + + if (trim($maincat->metakey) != '' + && RedShop::getConfig()->get('AUTOGENERATED_SEO') + && Redshop::getConfig()->get('SEO_PAGE_KEYWORDS_CATEGORY') != '') + { + if ($maincat->append_to_global_seo == 'append') + { + $pagekeywordstag .= "," . trim($maincat->metakey); + $document->setMetaData('keywords', $pagekeywordstag); + } + elseif ($maincat->append_to_global_seo == 'prepend') + { + $pagekeywordstag = trim($maincat->metakey) . $pagekeywordstag; + $document->setMetaData('keywords', $pagekeywordstag); + } + elseif ($maincat->append_to_global_seo == 'replace') + { + $document->setMetaData('keywords', $maincat->metakey); + } + } + else + { + if ($maincat->metakey != '') + { + $document->setMetaData('keywords', $maincat->metakey); + } + else + { + if (RedShop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_KEYWORDS_CATEGORY') != '') + { + $document->setMetaData('keywords', $pagekeywordstag); + } + else + { + $document->setMetaData('keywords', $maincat->name); + } + } + } + + $pagedesctag = ''; + + // For custom + auto generated description + if (RedShop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION_CATEGORY') != '') + { + $pagedesctag = Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION_CATEGORY'); + $pagedesctag = str_replace("{categoryname}", $maincat->name, $pagedesctag); + $pagedesctag = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $pagedesctag); + $pagedesctag = str_replace("{categoryshortdesc}", strip_tags($maincat->short_description), $pagedesctag); + $pagedesctag = str_replace("{categorydesc}", strip_tags($maincat->description), $pagedesctag); + } + + if ($maincat->metadesc != '' && RedShop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION_CATEGORY') != '') + { + if ($maincat->append_to_global_seo == 'append') + { + $pagedesctag .= $maincat->metadesc; + $document->setMetaData('description', $pagedesctag); + } + elseif ($maincat->append_to_global_seo == 'prepend') + { + $pagedesctag = trim($maincat->metadesc) . $pagedesctag; + $document->setMetaData('description', $pagedesctag); + } + elseif ($maincat->append_to_global_seo == 'replace') + { + $document->setMetaData('description', $maincat->metadesc); + } + } + elseif ($maincat->metadesc != '') + { + $document->setMetaData('description', $maincat->metadesc); + } + else + { + if (RedShop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION_CATEGORY') != '') + { + $document->setMetaData('description', $pagedesctag); + } + else + { + $document->setMetaData('description', $maincat->name); + } + } + + // For metarobot + if ($maincat->metarobot_info != '') + { + $document->setMetaData('robots', $maincat->metarobot_info); + } + else + { + if (RedShop::getConfig()->get('AUTOGENERATED_SEO') && JFactory::getConfig()->get('robots') != '') + { + $document->setMetaData('robots', JFactory::getConfig()->get('robots')); + } + else + { + $document->setMetaData('robots', "INDEX,FOLLOW"); + } + } + + $pageheadingtag = str_replace("{categoryname}", $maincat->name, Redshop::getConfig()->get('SEO_PAGE_HEADING_CATEGORY')); + + if ($maincat->pageheading != "" && RedShop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_HEADING_CATEGORY') != '') + { + $pageheadingtag = $pageheadingtag . $maincat->pageheading; + } + elseif ($maincat->pageheading != "") + { + $pageheadingtag = $maincat->pageheading; + } + else + { + $pageheadingtag = $this->app->getCfg('sitename'); + } + } + else + { + if ($menu_meta_keywords != "") + { + $document->setMetaData('keywords', $menu_meta_keywords); + } + else + { + $document->setMetaData('keywords', $this->app->getCfg('sitename')); + } + + if ($menu_meta_description != "") + { + $document->setMetaData('description', $menu_meta_description); + } + else + { + $document->setMetaData('description', $this->app->getCfg('sitename')); + } + + if ($menu_robots != "") + { + $document->setMetaData('robots', $menu_robots); + } + else + { + $document->setMetaData('robots', $this->app->getCfg('sitename')); + } + } + + // Breadcrumbs + RedshopHelperBreadcrumb::generate($this->catid); + $disabled = ""; + + if ($this->print) + { + $disabled = "disabled"; + } + + $manufacturerId = $model->getState('manufacturer_id'); + + $lists['category_template'] = ""; + $lists['manufacturer'] = ""; + + if (!empty($manufacturers)) + { + $temps = array( + (object) array( + 'id' => 0, + 'name' => JText::_('COM_REDSHOP_SELECT_MANUFACTURE') + ) + ); + $manufacturers = array_merge($temps, $manufacturers); + $lists['manufacturer'] = JHtml::_( + 'select.genericlist', + $manufacturers, + 'manufacturer_id', + 'class="inputbox" onchange="javascript:setSliderMinMaxForManufactur();" ' . $disabled . ' ', + 'id', + 'name', + $manufacturerId + ); + } + + if (count($allCategoryTemplate) > 1) + { + $lists['category_template'] = JHtml::_( + 'select.genericlist', + $allCategoryTemplate, + 'category_template', + 'class="inputbox" size="1" onchange="javascript:setSliderMinMaxForTemplate();" ' . $disabled . ' ', + 'id', + 'name', + $categoryTemplateId + ); + } + + $orderByMethod = $this->app->getUserStateFromRequest($model->context . '.order_by', 'order_by'); + $lists['order_by'] = JHtml::_( + 'select.genericlist', + $orderData, + 'order_by', + 'class="inputbox" size="1" onChange="javascript:setSliderMinMax();" ' . $disabled . ' ', + 'value', + 'text', + $orderByMethod + ); + + if ($this->catid && count($loadCategorytemplate) > 0) + { + if (strpos($loadCategorytemplate[0]->template_desc, "{product_price_slider}") !== false) + { + $ajaxSlide = $this->input->getBool('ajaxslide', false); + + if (!$ajaxSlide) + { + $strToInsert = "
    {show_all_products_in_category}
    "; + $loadCategorytemplate[0]->template_desc = str_replace("{show_all_products_in_category}", $strToInsert, $loadCategorytemplate[0]->template_desc); + + $strToInsert = "
    {pagination}
    "; + $loadCategorytemplate[0]->template_desc = str_replace("{pagination}", $strToInsert, $loadCategorytemplate[0]->template_desc); + + $strToInsert = '{product_display_limit}'; + $loadCategorytemplate[0]->template_desc = str_replace("{product_display_limit}", $strToInsert, $loadCategorytemplate[0]->template_desc); + } + + if (!empty($product)) + { + $this->productPriceSliderEnable = true; + + // Start Code for fixes IE9 issue + JHtml::_('redshopjquery.ui'); + + // End Code for fixes IE9 issue + require_once JPATH_ROOT . '/media/com_redshop/js/catprice_filter.php'; + } + else + { + $loadCategorytemplate[0]->template_desc = str_replace("{product_price_slider}", "", $loadCategorytemplate[0]->template_desc); + $loadCategorytemplate[0]->template_desc = str_replace("{pagination}", "", $loadCategorytemplate[0]->template_desc); + } + } + + if (!count($product)) + { + $loadCategorytemplate[0]->template_desc = str_replace("{order_by_lbl}", "", $loadCategorytemplate[0]->template_desc); + $loadCategorytemplate[0]->template_desc = str_replace("{order_by}", "", $loadCategorytemplate[0]->template_desc); + + if (!$manufacturerId) + { + $loadCategorytemplate[0]->template_desc = str_replace("{filter_by_lbl}", "", $loadCategorytemplate[0]->template_desc); + $loadCategorytemplate[0]->template_desc = str_replace("{filter_by}", "", $loadCategorytemplate[0]->template_desc); + } + } + } + + $this->detail = $detail; + $this->lists = $lists; + $this->product = $product; + $this->pageheadingtag = $pageheadingtag; + $this->params = $params; + $this->maincat = $maincat; + $this->category_template_id = $categoryTemplateId; + $this->order_by_select = $orderByMethod; + $this->manufacturer_id = $manufacturerId; + $this->loadCategorytemplate = $loadCategorytemplate; + + parent::display($tpl); + } +} diff --git a/component/site/views/checkout/index.html b/component/site/views/checkout/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/checkout/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/checkout/tmpl/default.php b/component/site/views/checkout/tmpl/default.php new file mode 100644 index 00000000000..86a6498f5f5 --- /dev/null +++ b/component/site/views/checkout/tmpl/default.php @@ -0,0 +1,275 @@ +trigger('onRenderCustomField'); + +$url = JURI::base(); +$user = JFactory::getUser(); +$session = JFactory::getSession(); + +$redhelper = redhelper::getInstance(); +$userhelper = rsUserHelper::getInstance(); +$order_functions = order_functions::getInstance(); +$redTemplate = Redtemplate::getInstance(); + +$telesearch = RedshopHelperOrder::getParameters('rs_telesearch'); +$Itemid = RedshopHelperRouter::getCheckoutItemId(); +$auth = $session->get('auth'); +$jinput = JFactory::getApplication()->input; +$l = $jinput->getInt('l', 1); + +JPluginHelper::importPlugin('redshop_checkout'); +$dispatcher = RedshopHelperUtility::getDispatcher(); +$dispatcher->trigger('onRenderCustomField'); + +/* + * REGISTER_METHOD + * 0 With account creation + * 1 Without account creation + * 2 Optional (create an account if you like or dont) + * 3 Silent account creation + * + * */ + +// Actually need know and determine which variables we want to use +$post = $jinput->post->getArray(); + +$login_template = RedshopHelperTemplate::getTemplate("login"); + +if (count($login_template) > 0 && $login_template[0]->template_desc) +{ + $login_template_desc = $login_template[0]->template_desc; +} +else +{ + $login_template_desc = ' + + '; +} + +if (!Redshop::getConfig()->get('ONESTEP_CHECKOUT_ENABLE')) +{ + echo JLayoutHelper::render('cart.wizard', array('step' => '1')); +} + +$returnurl = JRoute::_($url . 'index.php?option=com_redshop&view=checkout', false); +$returnurl = base64_encode($returnurl); + +if ($user->id || (isset($auth['users_info_id']) && $auth['users_info_id'] > 0)) +{ + echo $this->loadTemplate('address'); +} +else +{ + if ($user->id == "" && Redshop::getConfig()->get('REGISTER_METHOD') != 1) + { + $show_login = 1; + $open_to_mystretchermy = 0; + } + else + { + $show_login = 0; + $open_to_mystretchermy = 1; + } + + if (Redshop::getConfig()->get('NEW_CUSTOMER_SELECTION') || (isset($post['createaccount']) && $post['createaccount'] == 1)) + { + $open_to_mystretchermy = 1; + } + + if ($show_login) + { + echo '
    '; + echo JHtml::_(Redshop::getConfig()->get('CHECKOUT_LOGIN_REGISTER_SWITCHER') . '.start', 'signInPane', array('startOffset' => $open_to_mystretchermy)); + echo JHtml::_(Redshop::getConfig()->get('CHECKOUT_LOGIN_REGISTER_SWITCHER') . '.panel', JText::_('COM_REDSHOP_RETURNING_CUSTOMERS'), 'login'); + + if (strstr($login_template_desc, "{rs_username}")) + { + $txtusername = ''; + $login_template_desc = str_replace("{rs_username_lbl}", JText::_('COM_REDSHOP_USERNAME'), $login_template_desc); + $login_template_desc = str_replace("{rs_username}", $txtusername, $login_template_desc); + } + + if (strstr($login_template_desc, "{rs_password}")) + { + $txtpassword = ''; + $login_template_desc = str_replace("{rs_password_lbl}", JText::_('COM_REDSHOP_PASSWORD'), $login_template_desc); + $login_template_desc = str_replace("{rs_password}", $txtpassword, $login_template_desc); + } + + if (strstr($login_template_desc, "{rs_login_button}")) + { + $loginbutton = ''; + $loginbutton .= ''; + $loginbutton .= ''; + $loginbutton .= ''; + $loginbutton .= ''; + $loginbutton .= ''; + $loginbutton .= ''; + $login_template_desc = str_replace("{rs_login_button}", $loginbutton, $login_template_desc); + } + + $forgotpwd = '' . JText::_('COM_REDSHOP_FORGOT_PWD_LINK') . ''; + $login_template_desc = str_replace("{forget_password_link}", $forgotpwd, $login_template_desc); + + $login_template_desc = '
    ' . $login_template_desc . '
    '; + + echo eval("?>" . $login_template_desc . "get('CHECKOUT_LOGIN_REGISTER_SWITCHER') . '.panel', JText::_('COM_REDSHOP_NEW_CUSTOMERS'), 'registration'); + } + + $allowCustomer = $this->lists['allowCustomer']; + $allowCompany = $this->lists['allowCompany']; + $is_company = $this->lists['is_company']; + ?> + +
    + + +
    + + 0 && $telesearch[0]->enabled) : ?> + +
    + + + + +
    + + + + +
    +
    + + get('REGISTER_METHOD') == 2) : + $checked_style = (Redshop::getConfig()->get('CREATE_ACCOUNT_CHECKBOX') == 1) ? 'checked="checked"' : "''"; + ?> +
    + +
    + + +
    + + + lists, Redshop::getConfig()->get('OPTIONAL_SHIPPING_ADDRESS'), 1, Redshop::getConfig()->get('CREATE_ACCOUNT_CHECKBOX')); ?> +
    + + get('SHIPPING_METHOD_ENABLE')) : ?> + + 0) + { + if (isset($post['billisship']) && $post['billisship'] == 1) + { + $billingisshipping = "style='display:none'"; + } + } + elseif (Redshop::getConfig()->get('OPTIONAL_SHIPPING_ADDRESS')) + { + $billingisshipping = "style='display:none'"; + } + ?> + +
    > +
    + + getShippingTable($post, $is_company, $this->lists); ?> +
    +
    + + + + + +
    + + +
    + +
    + + + + + + + + + +
    +
    + get('CHECKOUT_LOGIN_REGISTER_SWITCHER') . '.end'); + echo '
    '; + } +} ?> + + diff --git a/component/site/views/checkout/tmpl/default.xml b/component/site/views/checkout/tmpl/default.xml new file mode 100644 index 00000000000..5c4862e224f --- /dev/null +++ b/component/site/views/checkout/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/checkout/tmpl/default_address.php b/component/site/views/checkout/tmpl/default_address.php new file mode 100644 index 00000000000..26fd0cf8524 --- /dev/null +++ b/component/site/views/checkout/tmpl/default_address.php @@ -0,0 +1,145 @@ +getModel('checkout'); +$Itemid = RedshopHelperRouter::getCheckoutItemId(); +$cart = RedshopHelperCartSession::getCart(); +?> + +
    + + billingaddresses(); + $editbill = JRoute::_("index.php?option=com_redshop&view=account_billto&return=checkout&tmpl=component&setexit=1&Itemid=" . $Itemid, false); + ?> + +
    +
    +
    +
    +

    +
    + +
    + + + loadTemplate('billing'); + } + else + { + ?> +
    + + +
    +
    +
    + + get('SHIPPING_METHOD_ENABLE')) + { + ?> +
    +
    +
    +

    +
    + +
    + get('OPTIONAL_SHIPPING_ADDRESS')) + { + $checked = ((!isset($this->users_info_id) || $this->users_info_id == 0) || $this->users_info_id == $billingaddresses->users_info_id) ? 'checked' : ''; ?> + +
    + +
    + shippingaddresses(); + $add_addlink = JRoute::_("index.php?option=com_redshop&view=account_shipto&task=addshipping&return=checkout&tmpl=component&is_company=" . $billingaddresses->is_company . "&Itemid=" . $Itemid, false); + + for ($i = 0, $in = count($shippingaddresses); $i < $in; $i++) + { + if ($this->users_info_id != "") + { + $checked = ($this->users_info_id == $shippingaddresses [$i]->users_info_id) ? 'checked' : ''; + } + + $edit_addlink = JRoute::_("index.php?option=com_redshop&view=account_shipto&task=addshipping&return=checkout&tmpl=component&infoid=" . $shippingaddresses[$i]->users_info_id . "&Itemid=" . $Itemid, false); + $delete_addlink = JRoute::_("index.php?option=com_redshop&view=account_shipto&return=checkout&tmpl=component&task=remove&infoid=" . $shippingaddresses[$i]->users_info_id . "&Itemid=" . $Itemid, false); ?> + +
    + +
    + + + + + +
    +
    +
    + +
    + + get('SHIPPING_METHOD_ENABLE') && $cart['free_shipping'] != 1) + { + echo $this->loadTemplate('shipping'); + } + ?> + +
    + +
    loadTemplate('payment');?>
    +
    + + + + + + +
    "/>
    +
    diff --git a/component/site/views/checkout/tmpl/default_billing.php b/component/site/views/checkout/tmpl/default_billing.php new file mode 100644 index 00000000000..e23d2779648 --- /dev/null +++ b/component/site/views/checkout/tmpl/default_billing.php @@ -0,0 +1,16 @@ +getModel('checkout'); +echo JLayoutHelper::render( + 'cart.billing', + /** @scrutinizer ignore-type */ array('billingAddresses' => $model->billingaddresses()) +); diff --git a/component/site/views/checkout/tmpl/default_billing_crm.php b/component/site/views/checkout/tmpl/default_billing_crm.php new file mode 100644 index 00000000000..1e059c4dac7 --- /dev/null +++ b/component/site/views/checkout/tmpl/default_billing_crm.php @@ -0,0 +1,204 @@ +getModel('checkout'); + +$uri = JURI::getInstance(); +$url = $uri->root(); + +$redhelper = redhelper::getInstance(); +$Itemid = RedshopHelperRouter::getCheckoutItemId(); + +if ($Itemid == 0) +{ + $Itemid = JFactory::getApplication()->input->getInt('Itemid'); +} + +$session = JFactory::getSession(); + +$order_functions = order_functions::getInstance(); +$extra_field = extra_field::getInstance(); + +$billingaddresses = $model->billingaddresses(); + +?> + + is_company == 1) + { + ?> + + + + + + + + + + + + + + address != "") + { + ?> + + + + + zipcode != "") + { + ?> + + + + + city != "") + { + ?> + + + + + country_code) != "" && trim($billingaddresses->country_code)) + { + ?> + + + + + state_code, $billingaddresses->country_code); + + if ($state != "") + { + ?> + + + + + phone != "") + { + ?> + + + + + debitor_mobile_phone != 0) + { + ?> + + + + + user_email != "") + { + ?> + + + + + is_company == 1) + { + ?> + + + + + is_company == 1 && Redshop::getConfig()->get('USE_TAX_EXEMPT') == 1) + { + ?> + + + + + get('SHOW_TAX_EXEMPT_INFRONT')) + { + ?> + + + + + + debitor_money_transfer_number > 0) + { + ?> + + + + + + + is_company == 1) + { + echo $extrafields = RedshopHelperExtrafields::listAllFieldDisplay(8, $billingaddresses->users_info_id); + } + else + { + echo $extrafields = RedshopHelperExtrafields::listAllFieldDisplay(7, $billingaddresses->users_info_id); + } + ?> +
    company_name;?>
    firstname;?>
    lastname;?>
    + address;?>
    zipcode;?>
    city;?>
    country_code));?>
    phone;?>
    + debitor_mobile_phone;?>
    user_email ? $billingaddresses->user_email : $user->email;?>
    ean_number;?>
    vat_number;?>
    tax_exempt == 1) + { + echo JText::_('COM_REDSHOP_YES'); + } + else + { + echo JText::_('COM_REDSHOP_NO'); + } + ?> +
    debitor_money_transfer_number;?>
    diff --git a/component/site/views/checkout/tmpl/default_checkoutnext.php b/component/site/views/checkout/tmpl/default_checkoutnext.php new file mode 100644 index 00000000000..b9b363ee64f --- /dev/null +++ b/component/site/views/checkout/tmpl/default_checkoutnext.php @@ -0,0 +1,152 @@ +id; +$Itemid = RedshopHelperRouter::getCheckoutItemId(); + +if ($Itemid == 0) +{ + $Itemid = $app->input->getInt('Itemid'); +} + +$ccinfo = $app->input->getInt('ccinfo'); +$print = $app->input->getInt('print'); +$gls_mobile = $app->input->getString('gls_mobile'); + +$shop_id = $app->input->getString('shop_id') . '###' . $gls_mobile; +$model = $this->getModel('checkout'); + +$is_creditcard = $this->is_creditcard; + +$cart_data = ""; + +if (Redshop::getConfig()->get('USE_AS_CATALOG')) +{ + $carttempdata = RedshopHelperTemplate::getTemplate("catalogue_cart"); + + if ($carttempdata[0]->template_desc != "") + { + $cart_data = $carttempdata[0]->template_desc; + } +} +else +{ + $carttempdata = RedshopHelperTemplate::getTemplate("checkout"); + + if ($carttempdata[0]->template_desc != "") + { + $cart_data = $carttempdata[0]->template_desc; + } + else + { + $cart_data = '

    {cart_lbl}

    {product_loop_start}{product_loop_end}
    {product_name_lbl} {price_lbl} {quantity_lbl}{total_price_lbl}
    {product_name}
    {product_attribute}
    {product_accessory}
    {product_userfields}
    {product_thumb_image}{product_price}
    {update_cart}{remove_product}
    {product_total_price}
    {coupon_code_lbl}
    {thirdparty_email_lbl}
    {thirdparty_email}
    {customer_note_lbl}
    {customer_note}



    {if vat}{vat end if}{if discount}{discount end if}{if payment_discount}{payment_discount end if}
    {totalpurchase_lbl}:{subtotal}
    {vat_lbl}{tax}
    {discount_lbl}{discount}
    {payment_discount_lbl}{payment_order_discount}
    {shipping_lbl}{shipping}
    {total_lbl}:
    {total}
    {checkout}

    {shop_more}
    '; + } +} + +// Process the product plugin for cart item +JPluginHelper::importPlugin('redshop_product'); +$results = $dispatcher->trigger('onStartCartTemplateReplace', array(& $cart_data, $cart)); +// End + +echo JLayoutHelper::render('cart.wizard', array('step' => '2')); + +if ($is_creditcard == 1 && $ccinfo != '1' && $cart['total'] > 0) +{ + $cart_data = '
    '; + $cart_data .= $carthelper->replaceCreditCardInformation($this->payment_method_id); + $cart_data .= ''; + $cart_data .= ''; + $cart_data .= ''; + $cart_data .= ''; + $cart_data .= ''; + $cart_data .= ''; + $cart_data .= ''; + $cart_data .= ''; + $cart_data .= ''; + $cart_data .= '
    '; + + echo eval("?>" . $cart_data . ""; + $print_tag .= "" . JText::_("; + $print_tag .= ""; + + $cart_data = str_replace("{without_vat}", '', $cart_data); + $cart_data = str_replace("{with_vat}", '', $cart_data); + $cart_data = $model->displayShoppingCart($cart_data, $this->users_info_id, $this->shipping_rate_id, $this->payment_method_id, $Itemid, '', '', '', '', '', $shop_id); + + $cart_data = '
    ' . $cart_data . '
    '; + echo eval("?>" . $cart_data . "GetCartModuleCalc($cart); +$cart['mod_cart_total'] = $mod_cart_total; +$session->set('cart',$cart);*/ +?> + + diff --git a/component/site/views/checkout/tmpl/default_payment.php b/component/site/views/checkout/tmpl/default_payment.php new file mode 100644 index 00000000000..8df15315db6 --- /dev/null +++ b/component/site/views/checkout/tmpl/default_payment.php @@ -0,0 +1,37 @@ +getModel('checkout'); +$payment_template = RedshopHelperTemplate::getTemplate("redshop_payment"); + +if (count($payment_template) > 0 && $payment_template[0]->template_desc) +{ + $template_desc = $payment_template[0]->template_desc; +} +else +{ + $template_desc = "
    {payment_heading}\r\n
    {payment_loop_start}\r\n
    {payment_method_name}
    \r\n
    {creditcard_information}
    \r\n{payment_loop_end}
    "; +} + +// Get billing info for check is_company +$billingaddresses = $model->billingaddresses(); +$is_company = $billingaddresses->is_company; + +$eanNumber = (int) $billingaddresses->ean_number; + +$template_desc = $carthelper->replacePaymentTemplate($template_desc, $this->element, $is_company, $eanNumber); + +$template_desc = RedshopHelperTemplate::parseRedshopPlugin($template_desc); +echo eval("?>" . $template_desc . "input; +$post = $jinput->getArray($_POST); + +$shippingbox_template = RedshopHelperTemplate::getTemplate("shippingbox"); + +if (count($shippingbox_template) > 0 && $shippingbox_template[0]->template_desc) +{ + $box_template_desc = $shippingbox_template[0]->template_desc; +} +else +{ + $box_template_desc = "
    {shipping_box_heading}\r\n
    {shipping_box_list}
    \r\n
    "; +} + +$shipping_template = RedshopHelperTemplate::getTemplate("redshop_shipping"); + +if (count($shipping_template) > 0 && $shipping_template[0]->template_desc) +{ + $template_desc = $shipping_template[0]->template_desc; +} +else +{ + $template_desc = "
    {shipping_heading}\r\n
    {shipping_method_loop_start}\r\n

    {shipping_method_title}

    \r\n
    {shipping_rate_loop_start}\r\n
    {shipping_rate_name} {shipping_rate}
    \r\n{shipping_rate_loop_end}
    \r\n{shipping_method_loop_end}
    \r\n
    "; +} + +if ($this->users_info_id > 0) +{ + $shippinghelper = shipping::getInstance(); + $shippingBoxes = RedshopHelperShipping::getShippingBox(); + $selshipping_box_post_id = 0; + + if (count($shippingBoxes) > 0) + { + $selshipping_box_post_id = $shippingBoxes[0]->shipping_box_id; + } + + if (isset($post['shipping_box_id'])) + { + $shipping_box_post_id = $post['shipping_box_id']; + } + else + { + $shipping_box_post_id = $selshipping_box_post_id; + } + + $box_template_desc = $carthelper->replaceShippingBoxTemplate($box_template_desc, $shipping_box_post_id); + echo eval("?>" . $box_template_desc . "replaceShippingTemplate($template_desc, $this->shipping_rate_id, $shipping_box_post_id, $user->id, $this->users_info_id, $this->ordertotal, $this->order_subtotal); + $template_desc = $returnarr['template_desc']; + $this->shipping_rate_id = $returnarr['shipping_rate_id']; + + echo eval("?>" . $template_desc . " +
    + + + \ No newline at end of file diff --git a/component/site/views/checkout/tmpl/onestepcheckout.php b/component/site/views/checkout/tmpl/onestepcheckout.php new file mode 100644 index 00000000000..0f99680b94b --- /dev/null +++ b/component/site/views/checkout/tmpl/onestepcheckout.php @@ -0,0 +1,436 @@ +trigger('onRenderCustomField'); +$url = JUri::base(); +$user = JFactory::getUser(); +$app = JFactory::getApplication(); +$session = JFactory::getSession(); +$auth = $session->get('auth'); +$carthelper = rsCarthelper::getInstance(); +$itemId = RedshopHelperRouter::getCheckoutItemId(); + +/** @var RedshopModelCheckout $model */ +$model = $this->getModel('checkout'); + +$cart = RedshopHelperCartSession::getCart(); +$billingAddresses = $model->billingaddresses(); + +if ($billingAddresses == new stdClass) +{ + $billingAddresses = null; +} + +$paymentMethods = RedshopHelperUtility::getPlugins('redshop_payment'); +$selectedPaymentMethodId = 0; + +if (count($paymentMethods) > 0) +{ + $selectedPaymentMethodId = $paymentMethods[0]->element; +} + +$shippingBoxes = RedshopHelperShipping::getShippingBox(); +$selectedShippingBoxId = 0; + +if (count($shippingBoxes) > 0) +{ + $selectedShippingBoxId = $shippingBoxes[0]->shipping_box_id; +} + +$usersInfoId = $app->input->getInt('users_info_id', $this->users_info_id); +$paymentMethodId = $app->input->getCmd('payment_method_id', $selectedPaymentMethodId); +$shippingBoxPostId = $app->input->getInt('shipping_box_id', $selectedShippingBoxId); +$shippingRateId = $app->input->getInt('shipping_rate_id', 0); + +if ($usersInfoId == 0 && !empty($billingAddresses) && !empty($billingAddresses->users_info_id)) +{ + $usersInfoId = $billingAddresses->users_info_id; +} + +$loginTemplate = ""; +$input = JFactory::getApplication()->input; + +if (!$usersInfoId && Redshop::getConfig()->getInt('REGISTER_METHOD') != 1 + && Redshop::getConfig()->getInt('REGISTER_METHOD') != 3) +{ + $loginTemplate = RedshopLayoutHelper::render( + 'checkout.login', + null, + '', + array( + 'component' => 'com_redshop' + ) + ); +} + +$oneStepTemplateHtml = ""; +$oneStepTemplate = RedshopHelperTemplate::getTemplate("onestep_checkout"); + +if (count($oneStepTemplate) > 0 && $oneStepTemplate[0]->template_desc) +{ + $oneStepTemplateHtml = "
    " . $oneStepTemplate[0]->template_desc . "
    "; +} +else +{ + $oneStepTemplateHtml = JText::_("COM_REDSHOP_TEMPLATE_NOT_EXISTS"); +} + +if (strpos($oneStepTemplateHtml, '{billing_address_information_lbl}') !== false) +{ + $oneStepTemplateHtml = str_replace( + "{billing_address_information_lbl}", + JText::_('COM_REDSHOP_BILLING_ADDRESS_INFORMATION_LBL'), + $oneStepTemplateHtml + ); +} + +$paymentTemplate = ""; +$paymentTemplateHtml = ""; +$templates = RedshopHelperTemplate::getTemplate("redshop_payment"); + +foreach ($templates as $template) +{ + if (strpos($oneStepTemplateHtml, "{payment_template:" . $template->name . "}") === false) + { + continue; + } + + $paymentTemplate = "{payment_template:" . $template->name . "}"; + $paymentTemplateHtml = $template->template_desc; + $oneStepTemplateHtml = str_replace($paymentTemplate, "
    " . $paymentTemplate . "
    ", $oneStepTemplateHtml); +} + +$templates = RedshopHelperTemplate::getTemplate("checkout"); + +foreach ($templates as $template) +{ + if (strpos($oneStepTemplateHtml, "{checkout_template:" . $template->name . "}") === false) + { + continue; + } + + $cartTemplate = "{checkout_template:" . $template->name . "}"; + $oneStepTemplateHtml = str_replace( + $cartTemplate, + '
    ' . $cartTemplate . '
    ' + . '', + $oneStepTemplateHtml + ); + $oneStepTemplateHtml = str_replace($cartTemplate, $template->template_desc, $oneStepTemplateHtml); +} + +// For shipping template +$shippingBoxTemplate = ""; +$shippingBoxTemplateHtml = ""; +$shippingTemplate = ""; +$shippingTemplateHtml = ""; +$templates = RedshopHelperTemplate::getTemplate("shippingbox"); + +foreach ($templates as $template) +{ + if (strpos($oneStepTemplateHtml, "{shippingbox_template:" . $template->name . "}") === false) + { + continue; + } + + $shippingBoxTemplate = "{shippingbox_template:" . $template->name . "}"; + $shippingBoxTemplateHtml = $template->template_desc; +} +$templates = RedshopHelperTemplate::getTemplate("redshop_shipping"); + +foreach ($templates as $template) +{ + if (strpos($oneStepTemplateHtml, "{shipping_template:" . $template->name . "}") === false) + { + continue; + } + $shippingTemplate = "{shipping_template:" . $template->name . "}"; + $shippingTemplateHtml = $template->template_desc; + $oneStepTemplateHtml = str_replace( + $shippingTemplate, + '
    ' . $shippingTemplate . '
    ' + . '', + $oneStepTemplateHtml + ); +} + +if (Redshop::getConfig()->getBool('SHIPPING_METHOD_ENABLE')) +{ + $orderTotal = $cart['total']; + $totalDiscount = $cart['cart_discount'] + $cart['voucher_discount'] + $cart['coupon_discount']; + $orderSubTotal = Redshop::getConfig()->getString('SHIPPING_AFTER') == 'total' ? + $cart['product_subtotal'] - $totalDiscount : $cart['product_subtotal']; + $shippingBoxTemplateHtml = $carthelper->replaceShippingBoxTemplate($shippingBoxTemplateHtml, $shippingBoxPostId); + $oneStepTemplateHtml = str_replace($shippingBoxTemplate, $shippingBoxTemplateHtml, $oneStepTemplateHtml); + $return = $carthelper->replaceShippingTemplate( + $shippingTemplateHtml, + $shippingRateId, + $shippingBoxPostId, + $user->id, + $usersInfoId, + $orderTotal, + $orderSubTotal + ); + $shippingTemplateHtml = $return['template_desc']; + $shippingRateId = $return['shipping_rate_id']; + if ($shippingRateId) + { + $shippingList = $model->calculateShipping($shippingRateId); + $cart['shipping'] = $shippingList['order_shipping_rate']; + $cart['shipping_vat'] = $shippingList['shipping_vat']; + $cart = $carthelper->modifyDiscount($cart); + } + $oneStepTemplateHtml = str_replace($shippingTemplate, $shippingTemplateHtml, $oneStepTemplateHtml); +} +else +{ + $oneStepTemplateHtml = str_replace($shippingBoxTemplate, "", $oneStepTemplateHtml); + $oneStepTemplateHtml = str_replace($shippingTemplate, "", $oneStepTemplateHtml); +} + +$eanNumber = 0; + +if (!empty($billingAddresses) && !empty($billingAddresses->ean_number)) +{ + $eanNumber = 1; +} + +if (strpos($oneStepTemplateHtml, '{billing_template}') === false) +{ + $oneStepTemplateHtml = str_replace('{billing_address}', '{billing_address}{billing_template}', $oneStepTemplateHtml); +} + +if ($usersInfoId) +{ + $oneStepTemplateHtml = RedshopHelperBillingTag::replaceBillingAddress($oneStepTemplateHtml, $billingAddresses); + $billingTemplate = ''; +} +else +{ + $oneStepTemplateHtml = str_replace("{billing_address}", "", $oneStepTemplateHtml); + $billingTemplate = RedshopLayoutHelper::render( + 'checkout.onestep.billing', + array(), + '', + array( + 'component' => 'com_redshop' + ) + ); +} + +$oneStepTemplateHtml = str_replace('{billing_template}', $billingTemplate, $oneStepTemplateHtml); + +if (strpos($oneStepTemplateHtml, "{edit_billing_address}") !== false && $usersInfoId) +{ + $editBillingLink = JRoute::_('index.php?option=com_redshop&view=account_billto&tmpl=component&return=checkout&setexit=1&Itemid=' . $itemId); + $editBilling = ' ' . JText::_('COM_REDSHOP_EDIT') . ''; + $oneStepTemplateHtml = str_replace("{edit_billing_address}", $editBilling, $oneStepTemplateHtml); +} +else +{ + $oneStepTemplateHtml = str_replace("{edit_billing_address}", "", $oneStepTemplateHtml); +} + +$isCompany = isset($billingAddresses->is_company) ? $billingAddresses->is_company : 0; + +if (strpos($oneStepTemplateHtml, "{shipping_address}") !== false) +{ + if (Redshop::getConfig()->getBool('SHIPPING_METHOD_ENABLE')) + { + $shippingHtml = ''; + + if ($usersInfoId) + { + $shippingAddresses = $model->shippingaddresses(); + + if ($billingAddresses) + { + $shippingCheck = $usersInfoId == $billingAddresses->users_info_id ? 'checked="checked"' : ''; + $shippingHtml .= '
    '; + } + + foreach ($shippingAddresses as $shippingAddress) + { + $addShippingLink = JRoute::_( + 'index.php?option=com_redshop&view=account_shipto&tmpl=component&task=addshipping' + . '&return=checkout&Itemid=' . $itemId . '&infoid=' . $shippingAddress->users_info_id, + false + ); + $removeShippingLink = JRoute::_($url . + 'index.php?option=com_redshop&view=account_shipto&return=checkout' + . '&tmpl=component&task=remove&infoid=' . $shippingAddress->users_info_id . '&Itemid=' . $itemId, + false + ); + $shippingCheck = $usersInfoId == $shippingAddress->users_info_id ? 'checked="checked"' : ''; + $shippingHtml .= '
    ' + . '' + . '(' . JText::_('COM_REDSHOP_EDIT_LBL') . ') ' + . '' + . '(' . JText::_('COM_REDSHOP_DELETE_LBL') . ')
    '; + } + + $addLink = JRoute::_( + 'index.php?option=com_redshop&view=account_shipto&tmpl=component&task=addshipping' + . '&return=checkout&Itemid=' . $itemId . '&infoid=0&is_company=' . $billingAddresses->is_company, + false + ); + + $shippingHtml .= '' + . JText::_('COM_REDSHOP_ADD_ADDRESS') . ''; + } + else + { + $lists['shipping_customer_field'] = Redshop\Fields\SiteHelper::renderFields(RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS); + $lists['shipping_company_field'] = Redshop\Fields\SiteHelper::renderFields(RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS); + + $shippingHtml = '
    ' + . ''; + } + + $oneStepTemplateHtml = str_replace('{shipping_address}', $shippingHtml, $oneStepTemplateHtml); + $oneStepTemplateHtml = str_replace( + '{shipping_address_information_lbl}', + JText::_('COM_REDSHOP_SHIPPING_ADDRESS_INFO_LBL'), + $oneStepTemplateHtml + ); + } + else + { + $oneStepTemplateHtml = str_replace('{shipping_address}', '', $oneStepTemplateHtml); + $oneStepTemplateHtml = str_replace('{shipping_address_information_lbl}', '', $oneStepTemplateHtml); + } +} +JPluginHelper::importPlugin('redshop_checkout'); +$dispatcher->trigger('onRenderInvoiceOneStepCheckout', array(&$oneStepTemplateHtml)); + +if ($usersInfoId && !empty($billingAddresses)) +{ + $paymentTemplateHtml = $carthelper->replacePaymentTemplate( + $paymentTemplateHtml, $paymentMethodId, $isCompany, $eanNumber + ); + $oneStepTemplateHtml = str_replace($paymentTemplate, $paymentTemplateHtml, $oneStepTemplateHtml); +} +else +{ + $oneStepTemplateHtml = str_replace($paymentTemplate, "", $oneStepTemplateHtml); +} + +$oneStepTemplateHtml = $model->displayShoppingCart($oneStepTemplateHtml, $usersInfoId, $shippingRateId, $paymentMethodId, $itemId); +$oneStepTemplateHtml = RedshopHelperTemplate::parseRedshopPlugin($oneStepTemplateHtml); +?> + +id && empty($auth['users_info_id']) && Redshop::getConfig()->getInt('REGISTER_METHOD') != 1 && Redshop::getConfig()->getInt('REGISTER_METHOD') != 3): ?> +
    +
    +

    +
    +
    + +
    +
    + + +
    + + +
    + + + + diff --git a/component/site/views/checkout/view.html.php b/component/site/views/checkout/view.html.php new file mode 100644 index 00000000000..ac70da281be --- /dev/null +++ b/component/site/views/checkout/view.html.php @@ -0,0 +1,204 @@ +getModel('checkout'); + + $Itemid = $app->input->getInt('Itemid'); + $user = JFactory::getUser(); + $session = JFactory::getSession(); + + $language = JFactory::getLanguage(); + + // Load payment languages + RedshopHelperPayment::loadLanguages(); + + // Load Shipping language file + $shippingPlugins = RedshopHelperUtility::getPlugins("redshop_shipping", 1); + $base_dir = JPATH_ADMINISTRATOR; + + for ($l = 0, $ln = count($shippingPlugins); $l < $ln; $l++) + { + $extension = 'plg_redshop_shipping_' . $shippingPlugins[$l]->element; + $language->load($extension, $base_dir); + } + + /** @scrutinizer ignore-deprecated */JHtml::script('system/validate.js', true, false); + JHtml::_('redshopjquery.framework'); + JHtml::_('behavior.framework', true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/jquery.validate.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.common.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/jquery.metadata.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.registration.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::stylesheet('com_redshop/redshop.validation.min.css', array(), true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.redbox.min.js', false, true); + + JPluginHelper::importPlugin('redshop_vies_registration'); + + $cart = $session->get('cart'); + $auth = $session->get('auth'); + + if (!is_array($auth)) + { + $auth['users_info_id'] = 0; + $session->set('auth', $auth); + $auth = $session->get('auth'); + } + + if ($cart['idx'] < 1) + { + $msg = JText::_('COM_REDSHOP_EMPTY_CART'); + $link = 'index.php?option=com_redshop&Itemid=' . $Itemid; + $app->redirect(JRoute::_($link, false), $msg); + } + + $lists = array(); + + $jInput = $app->input; + $isCompany = $jInput->getInt('is_company', 0); + + // Toggler settings + $openToStretcher = 0; + + if ($isCompany == 1 || Redshop::getConfig()->get('DEFAULT_CUSTOMER_REGISTER_TYPE') == 2) + { + $openToStretcher = 1; + } + + // Allow registration type settings + $lists['allowCustomer'] = ""; + $lists['allowCompany'] = ""; + + if (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') != "0") + { + $lists['allowCompany'] = "style='display:none;'"; + $lists['allowCustomer'] = "style='display:none;'"; + } + + if (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') == "1") + { + $openToStretcher = 0; + } + elseif (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') == "2") + { + $openToStretcher = 1; + } + + $lists['is_company'] = ($openToStretcher == 1 || ($isCompany == 1)) ? 1 : 0; + + if ($user->id || $auth['users_info_id'] > 0) + { + $cart = $session->get('cart'); + + if (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') == 1 && !array_key_exists("quotation_id", $cart)) + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=quotation&Itemid=' . $Itemid, false)); + } + + $users_info_id = $app->input->getInt('users_info_id'); + $billingaddresses = $model->billingaddresses(); + $shippingaddresses = $model->shippingaddresses(); + + if ($billingaddresses == new stdClass) + { + $billingaddresses = null; + } + + if (!$users_info_id) + { + if ((!isset($users_info_id) || $users_info_id == 0) && !empty($shippingaddresses)) + { + $users_info_id = $shippingaddresses[0]->users_info_id; + } + elseif ((!isset($users_info_id) || $users_info_id == 0) && !empty($billingaddresses)) + { + $users_info_id = $billingaddresses->users_info_id; + } + else + { + $app->redirect(JRoute::_("index.php?option=com_redshop&view=account_billto&Itemid=" . $Itemid, false)); + } + } + + $shipping_rate_id = $app->input->getInt('shipping_rate_id'); + $element = $app->input->getCmd('payment_method_id'); + $ccinfo = $app->input->getInt('ccinfo'); + + if (!isset($cart['voucher_discount'])) + { + $cart['voucher_discount'] = 0; + } + + if (!isset($cart['coupon_discount'])) + { + $cart['coupon_discount'] = 0; + } + + if (!isset($cart['product_subtotal'])) + { + $cart['product_subtotal'] = 0; + } + + if (!isset($cart['total'])) + { + $cart['total'] = 0; + } + + $total_discount = $cart['cart_discount'] + $cart['voucher_discount'] + $cart['coupon_discount']; + $subtotal = (Redshop::getConfig()->get('SHIPPING_AFTER') == 'total') ? $cart['product_subtotal'] - $total_discount : $cart['product_subtotal']; + + $this->shipping_rate_id = $shipping_rate_id; + $this->element = $element; + $this->ccinfo = $ccinfo; + $this->order_subtotal = $subtotal; + $this->ordertotal = $cart['total']; + } + else + { + $users_info_id = 0; + + if ($lists['is_company']) + { + // Field_section Company + $lists['extra_field_company'] = Redshop\Fields\SiteHelper::renderFields(8); + } + else + { + // Field_section Customer + $lists['extra_field_user'] = Redshop\Fields\SiteHelper::renderFields(7); + } + + $lists['shipping_company_field'] = Redshop\Fields\SiteHelper::renderFields(15, 0, 'billingRequired valid'); + $lists['shipping_customer_field'] = Redshop\Fields\SiteHelper::renderFields(14, 0, 'billingRequired valid'); + } + + if (Redshop::getConfig()->get('ONESTEP_CHECKOUT_ENABLE')) + { + $this->setLayout('onestepcheckout'); + } + + $this->users_info_id = $users_info_id; + $this->lists = $lists; + parent::display($tpl); + } +} diff --git a/component/site/views/checkout/view.next.php b/component/site/views/checkout/view.next.php new file mode 100644 index 00000000000..09486d21dcf --- /dev/null +++ b/component/site/views/checkout/view.next.php @@ -0,0 +1,117 @@ +input->getInt('Itemid'); + $issplit = $app->input->getBool('issplit'); + $ccinfo = $app->input->getInt('ccinfo'); + $task = $app->input->getCmd('task'); + + /** @var RedshopModelCheckout $model */ + $model = $this->getModel('checkout'); + $session = JFactory::getSession(); + + if ($issplit != '') + { + $session->set('issplit', $issplit); + } + + $payment_method_id = $app->input->getCmd('payment_method_id'); + $users_info_id = $app->input->getInt('users_info_id'); + $auth = $session->get('auth'); + + if (empty($users_info_id)) + { + $users_info_id = $auth['users_info_id']; + } + + $shipping_rate_id = $app->input->getString('shipping_rate_id'); + $shippingdetail = Redshop\Shipping\Rate::decrypt($shipping_rate_id); + + if (count($shippingdetail) < 4) + { + $shipping_rate_id = ""; + } + + $cart = $session->get('cart'); + + if ($cart['idx'] < 1) + { + $msg = JText::_('COM_REDSHOP_EMPTY_CART'); + $app->Redirect(JRoute::_('index.php?option=com_redshop&Itemid=' . $Itemid), $msg); + } + + if (Redshop::getConfig()->get('SHIPPING_METHOD_ENABLE')) + { + if ($users_info_id < 1) + { + $msg = JText::_('COM_REDSHOP_SELECT_SHIP_ADDRESS'); + $link = 'index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid . '&users_info_id=' + . $users_info_id . '&shipping_rate_id=' . $shipping_rate_id . '&payment_method_id=' + . $payment_method_id; + $app->redirect(JRoute::_($link), $msg); + } + + if ($shipping_rate_id == '' && $cart['free_shipping'] != 1) + { + $msg = JText::_('LIB_REDSHOP_SELECT_SHIP_METHOD'); + $link = 'index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid . '&users_info_id=' + . $users_info_id . '&shipping_rate_id=' . $shipping_rate_id . '&payment_method_id=' + . $payment_method_id; + $app->redirect(JRoute::_($link), $msg); + } + } + + if ($payment_method_id == '') + { + $msg = JText::_('COM_REDSHOP_SELECT_PAYMENT_METHOD'); + $link = 'index.php?option=com_redshop&view=checkout&Itemid=' . $Itemid . '&users_info_id=' + . $users_info_id . '&shipping_rate_id=' . $shipping_rate_id . '&payment_method_id=' + . $payment_method_id; + $app->redirect(JRoute::_($link), $msg, 'error'); + } + + $paymentinfo = RedshopHelperOrder::getPaymentMethodInfo($payment_method_id); + $paymentinfo = $paymentinfo[0]; + $paymentpath = JPATH_SITE . '/plugins/redshop_payment/' . $paymentinfo->element . '/' . $paymentinfo->element . '.xml'; + $paymentparams = new JRegistry($paymentinfo->params); + $is_creditcard = $paymentparams->get('is_creditcard', ''); + $is_subscription = $paymentparams->get('is_subscription', 0); + + if (@$is_creditcard == 1) + { + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.creditcard.min.js', false, true); + } + + if ($is_subscription) + { + $subscription_id = $session->set('subscription_id', $subscription_id); + } + + $this->cart = $cart; + $this->users_info_id = $users_info_id; + $this->shipping_rate_id = $shipping_rate_id; + $this->payment_method_id = $payment_method_id; + $this->is_creditcard = $is_creditcard; + + if ($task != '') + { + $tpl = $task; + } + + parent::display($tpl); + } +} diff --git a/component/site/views/giftcard/index.html b/component/site/views/giftcard/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/giftcard/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/giftcard/tmpl/default.php b/component/site/views/giftcard/tmpl/default.php new file mode 100644 index 00000000000..233e90edef1 --- /dev/null +++ b/component/site/views/giftcard/tmpl/default.php @@ -0,0 +1,341 @@ +getModel('giftcard'); +$url = JURI::base(); +$itemid = $app->input->getInt('Itemid'); +$gid = $app->input->getInt('gid', 0); +$session = JFactory::getSession(); +$cart = $session->get('cart'); +$pagetitle = $this->pageheadingtag; +$detail = $this->detail; +$router = $app->getRouter(); + +if (count($this->template) > 0) +{ + $template = $this->template[0]->template_desc; +} +else +{ + if ($gid != 0) + { + $template = "
    {giftcard_image}
    {giftcard_name}
    {giftcard_desc}
    {giftcard_price_lbl}{giftcard_price}
    {giftcard_validity}
    {giftcard_reciver_name_lbl}{giftcard_reciver_name}
    {giftcard_reciver_email_lbl}{giftcard_reciver_email}
    {form_addtocart:templet1}
    "; + } + else + { + $template = "
    {giftcard_loop_start}

    {giftcard_name}

    {giftcard_price}
    {giftcard_value}
    {giftcard_desc}
    {giftcard_validity}
    {giftcard_loop_end}
    "; + } +} + +if ($this->params->get('show_page_heading', 1)) +{ + if (!$gid) + { + if ($this->params->get('page_title') != $pagetitle) + { + ?> +

    + escape($this->params->get('page_title')); ?> +

    + +

    + +

    + giftcard_name, $template); + $template = str_replace("{giftcard_desc}", $detail->giftcard_desc, $template); + + if (strstr($template, "{giftcard_image}")) + { + $product_img = RedshopHelperMedia::watermark('giftcard', $detail->giftcard_image, Redshop::getConfig()->get('GIFTCARD_THUMB_WIDTH'), Redshop::getConfig()->get('GIFTCARD_THUMB_HEIGHT'), Redshop::getConfig()->get('WATERMARK_GIFTCART_THUMB_IMAGE'), '0'); + $linkimage = RedshopHelperMedia::watermark('giftcard', $detail->giftcard_image, '', '', Redshop::getConfig()->get('WATERMARK_GIFTCART_IMAGE'), '0'); + $thum_image = ""; + $thum_image .= "" . $detail->giftcard_name . ""; + $thum_image .= ""; + + $template = str_replace("{giftcard_image}", $thum_image, $template); + } + + $template = str_replace("{giftcard_value}", $producthelper->getProductFormattedPrice($detail->giftcard_value), $template); + $template = str_replace("{giftcard_value_lbl}", JText::_('LIB_REDSHOP_GIFTCARD_VALUE_LBL'), $template); + + if ($detail->customer_amount != 1) + { + $template = str_replace("{giftcard_price_lbl}", JText::_('LIB_REDSHOP_GIFTCARD_PRICE_LBL'), $template); + } + else + { + $template = str_replace("{giftcard_price_lbl}", '', $template); + } + + if ($detail->customer_amount != 1) + { + $template = str_replace("{giftcard_price}", $producthelper->getProductFormattedPrice($detail->giftcard_price), $template); + } + else + { + $template = str_replace("{giftcard_price}", '', $template); + } + + $reciver_email = ''; + $reciver_name = ''; + + $customer_amount = ''; + $customer_quantity = ''; + + if ($detail->customer_amount == 1 && $gid != '') + { + $customer_quantity = ''; + $customer_amount = ''; + } + + if ($detail->customer_amount != 1 || $detail->customer_amount == 1) + { + $template = str_replace("{giftcard_reciver_name_lbl}", JText::_('LIB_REDSHOP_GIFTCARD_RECIVER_NAME_LBL'), $template); + $template = str_replace("{giftcard_reciver_email_lbl}", JText::_('LIB_REDSHOP_GIFTCARD_RECIVER_EMAIL_LBL'), $template); + } + else + { + $template = str_replace("{giftcard_reciver_name_lbl}", '', $template); + $template = str_replace("{giftcard_reciver_email_lbl}", '', $template); + } + + $template = str_replace("{giftcard_reciver_email}", $reciver_email, $template); + $template = str_replace("{giftcard_reciver_name}", $reciver_name, $template); + $template = str_replace("{customer_quantity}", $customer_quantity, $template); + $template = str_replace("{customer_amount}", $customer_amount, $template); + + if ($detail->customer_amount == 1) + { + $template = str_replace("{giftcard_reciver_name_lbl}", JText::_('LIB_REDSHOP_GIFTCARD_RECIVER_NAME_LBL'), $template); + $template = str_replace("{giftcard_reciver_email_lbl}", JText::_('LIB_REDSHOP_GIFTCARD_RECIVER_EMAIL_LBL'), $template); + $template = str_replace("{customer_quantity_lbl}", JText::_('COM_REDSHOP_CUSTOMER_QUANTITY_LBL'), $template); + $template = str_replace("{customer_amount_lbl}", JText::_('COM_REDSHOP_CUSTOMER_AMOUNT_LBL'), $template); + } + else + { + $template = str_replace("{giftcard_reciver_name_lbl}", '', $template); + $template = str_replace("{giftcard_reciver_email_lbl}", '', $template); + $template = str_replace("{customer_quantity_lbl}", '', $template); + $template = str_replace("{customer_amount_lbl}", '', $template); + } + + if ($detail->customer_amount != 1) + { + $template = str_replace("{giftcard_reciver_email}", $reciver_email, $template); + $template = str_replace("{giftcard_reciver_name}", $reciver_name, $template); + } + else + { + $template = str_replace("{giftcard_reciver_email}", '', $template); + $template = str_replace("{giftcard_reciver_name}", '', $template); + } + + if ($detail->customer_amount != 1) + { + $template = str_replace("{giftcard_validity}", $detail->giftcard_validity, $template); + } + else + { + $template = str_replace("{giftcard_validity}", '', $template); + } + + $template = $producthelper->getValidityDate($detail->giftcard_validity, $template); + + // Product User Field Start + $count_no_user_field = 0; + $returnArr = $producthelper->getProductUserfieldFromTemplate($template, 1); + + $template_userfield = $returnArr[0]; + $userfieldArr = $returnArr[1]; + + if (strstr($template, "{if giftcard_userfield}") && strstr($template, "{giftcard_userfield end if}") && $template_userfield != "") + { + $ufield = ""; + $cart = $session->get('cart'); + + if (isset($cart['idx'])) + { + $idx = (int) ($cart['idx']); + } + + $idx = 0; + $cart_id = ''; + + for ($j = 0; $j < $idx; $j++) + { + if ($cart[$j]['giftcard_id'] == $gid) + { + $cart_id = $j; + } + } + + for ($ui = 0; $ui < count($userfieldArr); $ui++) + { + if (!$idx) + { + $cart_id = ""; + } + + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 13, '', $cart_id, 0, $gid); + + $ufield .= $productUserFields[1]; + + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + $template = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $template); + $template = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $template); + } + + $productUserFieldsForm = "
    "; + + if ($ufield != "") + { + $template = str_replace("{if giftcard_userfield}", $productUserFieldsForm, $template); + $template = str_replace("{giftcard_userfield end if}", "
    ", $template); + } + else + { + $template = str_replace("{if giftcard_userfield}", "", $template); + $template = str_replace("{giftcard_userfield end if}", "", $template); + } + } + + // Product User Field End + + // Cart + $template = Redshop\Cart\Render::replace($gid, 0, 0, 0, $template, false, $userfieldArr, 0, 0, $count_no_user_field, 0, $gid); + + $template = RedshopHelperTemplate::parseRedshopPlugin($template); + echo eval("?>" . $template . "giftcard_id; + $link = JRoute::_('index.php?option=com_redshop&view=giftcard&gid=' . $gid . '&Itemid=' . $itemid); + + if (strstr($data_add, "{giftcard_image}")) + { + $product_img = RedshopHelperMedia::watermark('giftcard', $detail[$i]->giftcard_image, Redshop::getConfig()->get('GIFTCARD_LIST_THUMB_WIDTH'), Redshop::getConfig()->get('GIFTCARD_LIST_THUMB_HEIGHT'), Redshop::getConfig()->get('WATERMARK_GIFTCART_THUMB_IMAGE'), '0'); + $linkimage = RedshopHelperMedia::watermark('giftcard', $detail[$i]->giftcard_image, '', '', Redshop::getConfig()->get('WATERMARK_GIFTCART_IMAGE'), '0'); + + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "giftcard/" . $detail[$i]->giftcard_image)) + { + $thum_image = "" . $detail[$i]->giftcard_name . ""; + $data_add = str_replace("{giftcard_image}", $thum_image, $data_add); + } + else + { + $data_add = str_replace("{giftcard_image}", "", $data_add); + } + } + + $giftcard_name = "" . $detail[$i]->giftcard_name . ""; + $giftcard_readmore = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $data_add = str_replace("{giftcard_name}", $giftcard_name, $data_add); + $data_add = str_replace("{giftcard_readmore}", $giftcard_readmore, $data_add); + $data_add = str_replace("{giftcard_desc}", $detail[$i]->giftcard_desc, $data_add); + + $data_add = $producthelper->getValidityDate($detail[$i]->giftcard_validity, $data_add); + + if ($detail[$i]->customer_amount != 1) + { + $data_add = str_replace("{giftcard_validity}", $detail[$i]->giftcard_validity, $data_add); + } + else + { + $data_add = str_replace("{giftcard_validity}", '', $data_add); + } + + $data_add = str_replace("{giftcard_value_lbl}", JText::_('LIB_REDSHOP_GIFTCARD_VALUE_LBL'), $data_add); + $data_add = str_replace("{giftcard_value}", $producthelper->getProductFormattedPrice($detail[$i]->giftcard_value), $data_add); + + $data_add = str_replace("{giftcard_price_lbl}", JText::_('LIB_REDSHOP_GIFTCARD_PRICE_LBL'), $data_add); + $data_add = str_replace("{giftcard_price}", $producthelper->getProductFormattedPrice($detail[$i]->giftcard_price), $data_add); + } + + $template = str_replace("{giftcard_loop_start}" . $template_desc . "{giftcard_loop_end}", $data_add, $template); + } + + echo eval("?>" . $template . " + + + diff --git a/component/site/views/giftcard/tmpl/default.xml b/component/site/views/giftcard/tmpl/default.xml new file mode 100644 index 00000000000..39078106392 --- /dev/null +++ b/component/site/views/giftcard/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/giftcard/tmpl/index.html b/component/site/views/giftcard/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/giftcard/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/giftcard/view.html.php b/component/site/views/giftcard/view.html.php new file mode 100644 index 00000000000..097d401fc5d --- /dev/null +++ b/component/site/views/giftcard/view.html.php @@ -0,0 +1,35 @@ +getParams('com_redshop'); + + $pageheadingtag = JText::_('COM_REDSHOP_REDSHOP'); + + $model = $this->getModel('giftcard'); + $giftcard_template = $model->getGiftcardTemplate(); + $detail = $this->get('data'); + + $this->detail = $detail; + $this->template = $giftcard_template; + $this->pageheadingtag = $pageheadingtag; + $this->params = $params; + parent::display($tpl); + } +} diff --git a/component/site/views/index.html b/component/site/views/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/login/index.html b/component/site/views/login/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/login/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/login/tmpl/default.php b/component/site/views/login/tmpl/default.php new file mode 100644 index 00000000000..7ce8cbcfbd2 --- /dev/null +++ b/component/site/views/login/tmpl/default.php @@ -0,0 +1,63 @@ +input->getInt('Itemid'); +$loginlink = 'index.php?option=com_redshop&view=login&Itemid=' . $Itemid; +$mywishlist = $app->input->getString('wishlist'); + +if ($mywishlist != '') +{ + $newuser_link = 'index.php?wishlist=' . $mywishlist . '&option=com_redshop&view=registration&Itemid=' . $Itemid; +} +else +{ + $newuser_link = 'index.php?option=com_redshop&view=registration&Itemid=' . $Itemid; +} + +$params = $app->getParams('com_redshop'); +$returnitemid = $params->get('login', $Itemid); + +?> +
    + + + + + + +
    diff --git a/component/site/views/login/tmpl/default.xml b/component/site/views/login/tmpl/default.xml new file mode 100644 index 00000000000..beb09c251d4 --- /dev/null +++ b/component/site/views/login/tmpl/default.xml @@ -0,0 +1,18 @@ + + + + + + + + + +
    + + +
    +
    +
    \ No newline at end of file diff --git a/component/site/views/login/tmpl/index.html b/component/site/views/login/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/login/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/login/tmpl/logout.php b/component/site/views/login/tmpl/logout.php new file mode 100644 index 00000000000..1aac1663c47 --- /dev/null +++ b/component/site/views/login/tmpl/logout.php @@ -0,0 +1,42 @@ +input->getInt('Itemid'); +$user = JFactory::getUser(); +$params = $app->getParams('com_redshop'); +$menu = JFactory::getApplication()->getMenu(); + +$returnitemid = $params->get('logout', $Itemid); +?> +
    + + + + + id > 0) : ?> + + + + +
    +

    id > 0) + echo JText::_('COM_REDSHOP_LOGOUT_DESCRIPTION'); + else + echo JText::_('COM_REDSHOP_LOGOUT_SUCCESS'); + ?>

    +
    + + + +
    diff --git a/component/site/views/login/tmpl/logout.xml b/component/site/views/login/tmpl/logout.xml new file mode 100644 index 00000000000..4fab619fce1 --- /dev/null +++ b/component/site/views/login/tmpl/logout.xml @@ -0,0 +1,15 @@ + + + + + + + + + +
    + +
    +
    +
    \ No newline at end of file diff --git a/component/site/views/login/tmpl/portal.php b/component/site/views/login/tmpl/portal.php new file mode 100644 index 00000000000..0965adf1fed --- /dev/null +++ b/component/site/views/login/tmpl/portal.php @@ -0,0 +1,105 @@ +input->getInt('Itemid'); +$loginlink = 'index.php?option=com_redshop&view=login&Itemid=' . $Itemid; +$newuser_link = 'index.php?option=com_redshop&view=registration&Itemid=' . $Itemid; +$shoppergroupid = $app->input->getInt('protalid', 0); + +$returnitemid = $Itemid; + +if (Redshop::getConfig()->get('PORTAL_LOGIN_ITEMID')) +{ + $returnitemid = Redshop::getConfig()->get('PORTAL_LOGIN_ITEMID'); +} + +$portallogofile = REDSHOP_FRONT_IMAGES_RELPATH . 'shopperlogo/' . Redshop::getConfig()->get('DEFAULT_PORTAL_LOGO'); + +$portallogo = RedshopHelperMedia::getImagePath( + Redshop::getConfig()->get('DEFAULT_PORTAL_LOGO'), + '', + 'thumb', + 'shopperlogo', + Redshop::getConfig()->get('THUMB_WIDTH'), + Redshop::getConfig()->get('THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); +$portalname = Redshop::getConfig()->get('DEFAULT_PORTAL_NAME'); +$portalintro = ""; + +if ($shoppergroupid != 0) +{ + $portallogo = RedshopHelperMedia::getImagePath( + $this->ShopperGroupDetail[0]->shopper_group_logo, + '', + 'thumb', + 'shopperlogo', + Redshop::getConfig()->get('THUMB_WIDTH'), + Redshop::getConfig()->get('THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $portalname = $this->ShopperGroupDetail[0]->shopper_group_name; + $portalintro = $this->ShopperGroupDetail[0]->shopper_group_introtext; +} + +?> +
    + + + + + + + + + + + + + + + + + + + +
    + + + +
    + +
    + +
    + + +
    + + +
    + + + + +
    +
     
    diff --git a/component/site/views/login/tmpl/portal.xml b/component/site/views/login/tmpl/portal.xml new file mode 100644 index 00000000000..aec1d5931b7 --- /dev/null +++ b/component/site/views/login/tmpl/portal.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/login/tmpl/portals.php b/component/site/views/login/tmpl/portals.php new file mode 100644 index 00000000000..06c54c5c01c --- /dev/null +++ b/component/site/views/login/tmpl/portals.php @@ -0,0 +1,59 @@ +getParams('com_redshop'); + +$Itemid = $app->input->getInt('Itemid'); + +$returnitemid = $params->get('logout', $Itemid); + +// Get redshop login module +if ($module = JModuleHelper::getModule('redshop_login')) +{ + // Get redshop login module params + if ($module->params != "") + { + $moduleparams = new JRegistry($module->params); + + // Set return Itemid for logout + $returnitemid = $moduleparams->get('logout', $returnitemid); + } +} + +?> + +
    + + ShopperGroupDetail[0])) : ?> + + + + + + + + + + +
    +

    ShopperGroupDetail[0]->shopper_group_name; ?>

    +
    + ShopperGroupDetail[0]->shopper_group_introtext; ?> +
    +
    + + +
    diff --git a/component/site/views/login/tmpl/portals.xml b/component/site/views/login/tmpl/portals.xml new file mode 100644 index 00000000000..c75d5726e86 --- /dev/null +++ b/component/site/views/login/tmpl/portals.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/login/view.html.php b/component/site/views/login/view.html.php new file mode 100644 index 00000000000..3c6890f1ded --- /dev/null +++ b/component/site/views/login/view.html.php @@ -0,0 +1,63 @@ +getModel(); + + $shoppergroupid = $app->input->getInt('protalid', 0); + + $ShopperGroupDetail = $model->ShopperGroupDetail($shoppergroupid); + + $layout = $app->input->getCmd('layout', ''); + + $check = $model->CheckShopperGroup($user->username, $shoppergroupid); + + if ($layout == 'portal' || Redshop::getConfig()->get('PORTAL_SHOP') == 1) + { + isset($ShopperGroupDetail[0]->shopper_group_portal) ? $portal = $ShopperGroupDetail[0]->shopper_group_portal : $portal = 0; + + if ($portal == 1 || Redshop::getConfig()->get('PORTAL_SHOP') == 1) + { + if ($user->id != "") + { + $this->setLayout('portals'); + } + else + { + $this->setLayout('portal'); + } + } + else + { + $app->enqueuemessage(JText::_('COM_REDSHOP_SHOPPER_GROUP_PORTAL_IS_DISABLE')); + $app->redirect(JRoute::_('index.php?option=com_redshop')); + } + } + else + { + if ($user->id != "") + { + $this->setLayout('logout'); + } + } + + $this->ShopperGroupDetail = $ShopperGroupDetail; + $this->check = $check; + parent::display($tpl); + } +} diff --git a/component/site/views/manufacturers/index.html b/component/site/views/manufacturers/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/manufacturers/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/manufacturers/tmpl/default.php b/component/site/views/manufacturers/tmpl/default.php new file mode 100644 index 00000000000..be754c7b732 --- /dev/null +++ b/component/site/views/manufacturers/tmpl/default.php @@ -0,0 +1,205 @@ +input->getInt('print'); +$Itemid = $app->input->getInt('Itemid'); +$redhelper = redhelper::getInstance(); + +// Page Title Start +$pagetitle = JText::_('COM_REDSHOP_MANUFACTURER'); + +if ($this->pageheadingtag != '') +{ + $pagetitle = $this->pageheadingtag; +} ?> +

    + params->get('show_page_heading', 1)) + { + if ($this->params->get('page_title') != $pagetitle) + { + echo $this->escape($this->params->get('page_title')); + } + else + { + echo $pagetitle; + } + } ?> +

    + 0 && $manufacturers_template[0]->template_desc != "") +{ + $template_desc = $manufacturers_template[0]->template_desc; +} +else +{ + $template_desc = "
    {print}
    \r\n
    \r\n
    \r\n
    {order_by}
    \r\n
    \r\n
    {manufacturer_loop_start}\r\n
    \r\n
    \r\n
    {manufacturer_image}
    \r\n
    \r\n

    {manufacturer_name}

    \r\n
    \r\n
    {manufacturer_description}
    \r\n\r\n\r\n
    \r\n
    \r\n{manufacturer_loop_end}
    \r\n
    {pagination}
    "; +} + +// Replace Product Template +if ($print) +{ + $onclick = "onclick='window.print();'"; +} +else +{ + $print_url = $url . "index.php?option=com_redshop&view=manufacturers&print=1&tmpl=component&Itemid=" . $Itemid; + $onclick = "onclick='window.open(\"$print_url\",\"mywindow\",\"scrollbars=1\",\"location=1\")'"; +} + +$print_tag = ""; +$print_tag .= "" . JText::_("; +$print_tag .= ""; + +$template_start = $template_desc; +$template_middle = ""; +$template_end = ""; + +if (strstr($template_desc, '{manufacturer_loop_start}') && strstr($template_desc, '{manufacturer_loop_end}')) +{ + $template_sdata = explode('{manufacturer_loop_start}', $template_desc); + $template_start = $template_sdata[0]; + $template_edata = explode('{manufacturer_loop_end}', $template_sdata[1]); + $template_end = $template_edata[1]; + $template_middle = $template_edata[0]; +} + +$extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(10, 1, 1); +$replace_middledata = ''; + +if ($this->detail && $template_middle != "") +{ + // Limit the number of manufacturers shown + $maxCount = $this->params->get('maxmanufacturer'); + if (count($this->detail) < $maxCount) + { + $maxCount = count($this->detail); + } + + for ($i = 0; $i < $maxCount; $i++) + { + $row = $this->detail[$i]; + + if ($row != '') + { + $mimg_tag = '{manufacturer_image}'; + $mh_thumb = Redshop::getConfig()->getInt('MANUFACTURER_THUMB_HEIGHT'); + $mw_thumb = Redshop::getConfig()->getInt('MANUFACTURER_THUMB_WIDTH'); + + $link = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=detail&mid=' . $row->id . '&Itemid=' . $Itemid); + + $manproducts = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $row->id . '&Itemid=' . $Itemid); + $manufacturer_name = "" . $row->name . ""; + + $middledata = $template_middle; + $manu_name = $config->maxchar($manufacturer_name, Redshop::getConfig()->get('MANUFACTURER_TITLE_MAX_CHARS'), Redshop::getConfig()->get('MANUFACTURER_TITLE_END_SUFFIX')); + $middledata = str_replace("{manufacturer_name}", $manu_name, $middledata); + + // Extra field display + $middledata = RedshopHelperProductTag::getExtraSectionTag( + $extraFieldName, $row->id, RedshopHelperExtrafields::SECTION_MANUFACTURER, $middledata + ); + + if (strpos($middledata, $mimg_tag) !== false) + { + $media = RedshopEntityManufacturer::getInstance($row->id)->getMedia(); + $thum_image = ""; + + if ($media->isValid() && !empty($media->get('media_name')) + && JFile::exists(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $row->id . '/' . $media->get('media_name'))) + { + $altText = $media->get('media_alternate_text', $row->name); + + if (Redshop::getConfig()->get('WATERMARK_MANUFACTURER_IMAGE') || Redshop::getConfig()->get('WATERMARK_MANUFACTURER_THUMB_IMAGE')) + { + $manufacturer_img = RedshopHelperMedia::watermark( + 'manufacturer', + $media->get('media_name'), + $mw_thumb, + $mh_thumb, + Redshop::getConfig()->get('WATERMARK_MANUFACTURER_IMAGE') + ); + } + else + { + $manufacturer_img = RedshopHelperMedia::getImagePath( + $media->get('media_name'), + '', + 'thumb', + 'manufacturer', + $mw_thumb, + $mh_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'), + 'manufacturer', + $row->id + ); + } + + if (Redshop::getConfig()->get('PRODUCT_IS_LIGHTBOX') == 1) + { + $thum_image = "id . '/' . $media->get('media_name') . "' rel=\"{handler: 'image', size: {}}\"> + " . $altText . ""; + } + else + { + $thum_image = " + " . $altText . ""; + } + } + + $middledata = str_replace($mimg_tag, $thum_image, $middledata); + } + + $middledata = str_replace("{manufacturer_description}", $row->description, $middledata); + $middledata = str_replace("{manufacturer_link}", $link, $middledata); + $middledata = str_replace("{manufacturer_allproductslink}", $manproducts, $middledata); + $middledata = str_replace("{manufacturer_allproductslink_lbl}", JText::_('COM_REDSHOP_MANUFACTURER_ALLPRODUCTSLINK_LBL'), $middledata); + $middledata = str_replace("{manufacturer_link_lbl}", JText::_('COM_REDSHOP_MANUFACTURER_LINK_LBL'), $middledata); + + $replace_middledata .= $middledata; + } + } +} + +$template_desc = $template_start . $replace_middledata . $template_end; + +$template_desc = str_replace("{print}", $print_tag, $template_desc); + +if (strstr($template_desc, '{order_by}')) +{ + $orderby_form = "
    " . JText::_('COM_REDSHOP_SELECT_ORDER_BY') . $this->lists['order_select'] . "
    "; + $template_desc = str_replace("{order_by}", $orderby_form, $template_desc); +} + +if (strstr($template_desc, '{pagination}')) +{ + if ($print) + { + $template_desc = str_replace("{pagination}", "", $template_desc); + } + else + { + $template_desc = str_replace("{pagination}", $this->pagination->getPagesLinks(), $template_desc); + } +} + +$template_desc = RedshopHelperTemplate::parseRedshopPlugin($template_desc); +echo eval("?>" . $template_desc . " + + + + + + + + +
    + + + +
    +
    +
    diff --git a/component/site/views/manufacturers/tmpl/default_detail.php b/component/site/views/manufacturers/tmpl/default_detail.php new file mode 100644 index 00000000000..9b9986284c2 --- /dev/null +++ b/component/site/views/manufacturers/tmpl/default_detail.php @@ -0,0 +1,58 @@ +input->getInt('Itemid'); +$mid = $app->input->getInt('mid'); +$redTemplate = Redtemplate::getInstance(); + +$document = JFactory::getDocument(); + +$manufacturerTemplate = RedshopHelperTemplate::getTemplate("manufacturer"); +$manufacturerTemplate = !empty($manufacturerTemplate) ? $manufacturerTemplate[0]->template_desc : ''; + +for ($i = 0; $i < count($this->detail); $i++) +{ + if ($this->detail[$i]->manufacturer_id == $mid) + { + $link = JRoute::_('index.php?option=com_redshop&view=manufacturer_products&mid=' . $this->detail[$i]->id . '&Itemid=' . $Itemid); + $manufacturer_name = "" . $this->detail[$i]->name . ""; + + $manufacturers_data = str_replace("{manufacturer_name}", $manufacturer_name, $manufacturerTemplate); + $manufacturers_data = str_replace("{manufacturer_description}", $this->detail[$i]->description, $manufacturers_data); + echo "
    "; + + $manufacturers_data = RedshopHelperTemplate::parseRedshopPlugin($manufacturers_data); + echo eval("?>" . $manufacturers_data . ""; + } +} + +?> + + + + + + + + +
    + pagination->getPagesLinks(); ?> +

    +
    + pagination->getPagesCounter(); ?> +
    + diff --git a/component/site/views/manufacturers/tmpl/detail.php b/component/site/views/manufacturers/tmpl/detail.php new file mode 100644 index 00000000000..d56d83f6b9c --- /dev/null +++ b/component/site/views/manufacturers/tmpl/detail.php @@ -0,0 +1,172 @@ +input->getInt('Itemid', 0); + +/** @var RedshopModelManufacturers $model */ +$model = $this->getModel('manufacturers'); + +// Page Title Start +$pageTitle = JText::_('COM_REDSHOP_MANUFACTURER_DETAIL'); + +if ($this->pageheadingtag != '') +{ + $pageTitle = $this->pageheadingtag; +} + +if ($this->params->get('show_page_heading', 1)) +{ + ?> +

    + params->get('page_title') != $pageTitle) + { + echo $this->escape($this->params->get('page_title')); + } + else + { + echo $pageTitle; + } ?> +

    + 0 && $manufacturerTemplate[0]->template_desc != "") +{ + $templateHtml = $manufacturerTemplate[0]->template_desc; + $templateId = $manufacturerTemplate[0]->id; +} +else +{ + $templateHtml = "
    \r\n
    {manufacturer_name}
    \r\n
    {manufacturer_image}
    \r\n
    {manufacturer_description}
    \r\n\r\n
    "; + $templateId = 0; +} + +$row = !empty($this->detail) ? $this->detail[0] : null; +$manufacturerId = null !== $row ? $row->id : 0; +$category = $model->getmanufacturercategory($manufacturerId, $row); + +if (strstr($templateHtml, '{category_loop_start}') && strstr($templateHtml, '{category_loop_end}')) +{ + $templateCategoryStart = explode('{category_loop_start}', $templateHtml); + $templateCategoryHtml = $templateCategoryStart[0]; + $templateCategoryEnd = explode('{category_loop_end}', $templateCategoryStart[1]); + $template_end = $templateCategoryEnd[1]; + $template_middle = $templateCategoryEnd[0]; + + if ($template_middle != "") + { + $cart_mdata = ''; + + for ($i = 0, $in = count($category); $i < $in; $i++) + { + $cart_mdata .= $template_middle; + $catlink = JRoute::_('index.php?option=com_redshop&view=category&layout=detail&cid=' . $category[$i]->id . '&manufacturer_id=' . $manufacturerId . '&Itemid=' . $itemId); + $alink = "" . $category[$i]->name . ""; + $cart_mdata = str_replace("{category_name_with_link}", $alink, $cart_mdata); + $cart_mdata = str_replace("{category_desc}", $category[$i]->description, $cart_mdata); + $cart_mdata = str_replace("{category_name}", $category[$i]->name, $cart_mdata); + $thumbUrl = RedshopHelperMedia::getImagePath( + $category[$i]->category_full_image, + '', + 'thumb', + 'category', + 200, + 200, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $categoryImage = ""; + $cart_mdata = str_replace("{category_thumb_image}", $categoryImage, $cart_mdata); + } + } + + $templateHtml = $templateCategoryHtml . $cart_mdata . $template_end; +} + +if (strpos($templateHtml, "{manufacturer_image}") !== false) +{ + $thumbImage = ''; + $media = null !== $row ? RedshopEntityManufacturer::getInstance($manufacturerId)->getMedia() : null; + + if (null !== $media) + { + $mediaImagePath = $media->getAbsImagePath(); + + if (!empty($mediaImagePath)) + { + $thumbHeight = Redshop::getConfig()->get('MANUFACTURER_THUMB_HEIGHT'); + $thumbWidth = Redshop::getConfig()->get('MANUFACTURER_THUMB_WIDTH'); + + if (Redshop::getConfig()->get('WATERMARK_MANUFACTURER_IMAGE') || Redshop::getConfig()->get('WATERMARK_MANUFACTURER_THUMB_IMAGE')) + { + $imagePath = RedshopHelperMedia::watermark( + 'manufacturer', + $media->get('media_name'), + $thumbWidth, + $thumbHeight, + Redshop::getConfig()->get('WATERMARK_MANUFACTURER_IMAGE') + ); + } + else + { + $imagePath = $media->generateThumb($thumbWidth, $thumbHeight); + } + + $altText = $media->get('media_alternate_text', $row->name); + + $thumbImage = '' + . '' . $altText . ''; + } + } + + $templateHtml = str_replace("{manufacturer_image}", $thumbImage, $templateHtml); +} + +$manufacturerLink = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=detail&mid=' . $manufacturerId . '&Itemid=' . $itemId); +$manufacturerProducts = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $manufacturerId . '&Itemid=' . $itemId); +$templateHtml = str_replace("{manufacturer_name}", null !== $row ? $row->name : '', $templateHtml); + +// Replace Manufacturer URL +if (strstr($templateHtml, "{manufacturer_url}")) +{ + $templateHtml = str_replace( + "{manufacturer_url}", + "" . $row->manufacturer_url . "", + $templateHtml + ); +} + +// Extra field display +$extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(10, 1, 1); +$templateHtml = RedshopHelperProductTag::getExtraSectionTag( + $extraFieldName, $manufacturerId, RedshopHelperExtrafields::SECTION_MANUFACTURER, $templateHtml +); +$templateHtml = str_replace("{manufacturer_description}", null !== $row ? $row->description : '', $templateHtml); + +if (strstr($templateHtml, "{manufacturer_extra_fields}")) +{ + $manufacturerExtraFields = RedshopHelperExtrafields::listAllFieldDisplay(RedshopHelperExtrafields::SECTION_MANUFACTURER, $manufacturerId); + $templateHtml = str_replace("{manufacturer_extra_fields}", $manufacturerExtraFields, $templateHtml); +} + +$templateHtml = str_replace("{manufacturer_link}", $manufacturerLink, $templateHtml); +$templateHtml = str_replace("{manufacturer_allproductslink}", $manufacturerProducts, $templateHtml); +$templateHtml = str_replace("{manufacturer_allproductslink_lbl}", JText::_('COM_REDSHOP_MANUFACTURER_ALLPRODUCTSLINK_LBL'), $templateHtml); +$templateHtml = RedshopHelperTemplate::parseRedshopPlugin($templateHtml); + +echo eval("?>" . $templateHtml . " + + + + + + + + +
    + +
    +
    +
    diff --git a/component/site/views/manufacturers/tmpl/index.html b/component/site/views/manufacturers/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/manufacturers/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/manufacturers/tmpl/products.php b/component/site/views/manufacturers/tmpl/products.php new file mode 100644 index 00000000000..d26446aca06 --- /dev/null +++ b/component/site/views/manufacturers/tmpl/products.php @@ -0,0 +1,343 @@ +getModel('manufacturers'); +$itemId = $app->input->getInt('Itemid'); +$print = $app->input->getInt('print'); +$orderBySelect = $app->input->getString('order_by', Redshop::getConfig()->getString('DEFAULT_MANUFACTURER_PRODUCT_ORDERING_METHOD')); +$filterBySelect = $app->input->getString('filter_by', 0); + +$document = JFactory::getDocument(); +$manufacturer = $this->detail[0]; +$limit = $model->getProductLimit(); +$router = $app->getRouter(); + +// Page Title +$pagetitle = JText::_('COM_REDSHOP_MANUFACTURER_PRODUCTS'); +?> +params->get('show_page_heading', 1)): ?> +

    + params->get('page_title') != $pagetitle) + { + echo $this->escape($this->params->get('page_title')); + } + else + { + echo $pagetitle; + } ?> +

    + + +id); + +if (count($manufacturertemplate) > 0 && $manufacturertemplate[0]->template_desc) +{ + $template_desc = $manufacturertemplate[0]->template_desc; + $template_id = $manufacturertemplate[0]->id; +} +else +{ + $template_desc = "
    {print}
    \r\n
    \r\n
    {manufacturer_name}
    \r\n
    {manufacturer_image}
    \r\n
    {manufacturer_description}
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n {order_by} \r\n
    \r\n
    \r\n\r\n
    {product_loop_start}\r\n
    {category_heading_start}
    *{category_name}
    {category_heading_end}
    \r\n
    \r\n
    \r\n
    {product_thumb_image_1}
    \r\n
    \r\n

    {product_name}

    \r\n
    \r\n
    {product_price}
    \r\n
    {read_more}
    \r\n
    \r\n
    \r\n{product_loop_end}
    \r\n
    {pagination}
    "; + $template_id = 0; +} + +if ($print) +{ + $onclick = "onclick='window.print();'"; +} +else +{ + $print_url = $url . "index.php?option=com_redshop&view=manufacturers&layout=products&mid=" . $manufacturer->id . "&print=1&tmpl=component&Itemid=" . $itemId; + $onclick = "onclick='window.open(\"$print_url\",\"mywindow\",\"scrollbars=1\",\"location=1\")'"; +} + +$print_tag = ""; +$print_tag .= "" . JText::_("; +$print_tag .= ""; + +$template_start = $template_desc; +$template_middle = ""; +$template_end = ""; + +if (strstr($template_desc, '{product_loop_start}') && strstr($template_desc, '{product_loop_end}')) +{ + $template_sdata = explode('{product_loop_start}', $template_desc); + $template_start = $template_sdata[0]; + $template_edata = explode('{product_loop_end}', $template_sdata[1]); + $template_end = $template_edata[1]; + $template_middle = $template_edata[0]; +} + +$cart_mdata = ''; +$prod_thumb_image = ""; + +$manufacturer_products = $model->getManufacturerProducts($template_desc); + +$cname = ''; + +if ($template_middle != "") +{ + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(RedshopHelperExtrafields::SECTION_PRODUCT, 1, 1); + + for ($i = 0, $in = count($manufacturer_products); $i < $in; $i++) + { + $cart_mdata .= $template_middle; + + if (strstr($cart_mdata, "{category_heading_start}") && strstr($cart_mdata, "{category_heading_end}")) + { + $cart_mdata1 = explode("{category_heading_start}", $cart_mdata); + $cart_mdata2 = explode("{category_heading_end}", $cart_mdata1[1]); + + if ($cname != $manufacturer_products[$i]->name) + { + $cart_mdata = str_replace("{category_name}", $manufacturer_products[$i]->name, $cart_mdata); + $cart_mdata = str_replace("{category_heading_start}", "", $cart_mdata); + $cart_mdata = str_replace("{category_heading_end}", "", $cart_mdata); + } + else + { + $cart_mdata = $cart_mdata1[0] . $cart_mdata2[1]; + } + + $cname = $manufacturer_products[$i]->name; + + $cart_mdata = str_replace("{category_heading_start}", "", $cart_mdata); + $cart_mdata = str_replace("{category_heading_end}", "", $cart_mdata); + } + + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $manufacturer_products[$i]->product_id); + $product_name = "" . $manufacturer_products[$i]->product_name . ""; + $cart_mdata = str_replace("{product_name}", $product_name, $cart_mdata); + + $cart_mdata = $producthelper->getProductOnSaleComment($manufacturer_products[$i], $cart_mdata); + $cart_mdata = $producthelper->getProductNotForSaleComment($manufacturer_products[$i], $cart_mdata); + $cart_mdata = $producthelper->getSpecialProductComment($manufacturer_products[$i], $cart_mdata); + $product_id = $manufacturer_products[$i]->product_id; + $childproduct = RedshopHelperProduct::getChildProduct($product_id); + + if (count($childproduct) > 0) + { + $isChilds = true; + $attributes = array(); + } + else + { + $isChilds = false; + + // Get attributes + $attributes_set = array(); + + if ($manufacturer_products[$i]->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $manufacturer_products[$i]->attribute_set_id, 0, 1); + } + + $attributes = $producthelper->getProductAttribute($product_id); + $attributes = array_merge($attributes, $attributes_set); + } + + /////////////////////////////////// Product attribute Start ///////////////////////////////// + $totalatt = count($attributes); + + // Check product for not for sale + $cart_mdata = $producthelper->getExtraSectionTag($extraFieldName, $product_id, "1", $cart_mdata, 1); + + $attribute_template = \Redshop\Template\Helper::getAttribute($cart_mdata); + $cart_mdata = Redshop\Product\Stock::replaceInStock($product_id, $cart_mdata, $attributes, $attribute_template); + + $cart_mdata = $producthelper->replaceAttributeData($product_id, 0, 0, $attributes, $cart_mdata, $attribute_template, $isChilds, 0, $totalatt); + + // Get cart tempalte + $cart_mdata = Redshop\Cart\Render::replace($product_id, 0, 0, 0, $cart_mdata, $isChilds); + + $cart_mdata = str_replace("{product_id_lbl}", JText::_('COM_REDSHOP_PRODUCT_ID_LBL'), $cart_mdata); + $cart_mdata = str_replace("{product_id}", $manufacturer_products[$i]->product_id, $cart_mdata); + $cart_mdata = str_replace("{product_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER_LBL'), $cart_mdata); + $cart_mdata = str_replace("{product_number}", $manufacturer_products[$i]->product_number, $cart_mdata); + $cart_mdata = str_replace("{product_s_desc}", $manufacturer_products[$i]->product_s_desc, $cart_mdata); + + $cart_mdata = str_replace("{category_name}", $manufacturer_products[$i]->name, $cart_mdata); + + if (strstr($cart_mdata, '{product_desc}')) + { + $p_desc = $Redconfiguration->maxchar($manufacturer_products[$i]->product_desc, Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_END_SUFFIX')); + $cart_mdata = str_replace("{product_desc}", $p_desc, $cart_mdata); + } + + $cart_mdata = $producthelper->replaceWishlistButton($product_id, $cart_mdata); + + if (strstr($cart_mdata, '{product_thumb_image_2}')) + { + $tag = '{product_thumb_image_2}'; + $h_thumb = Redshop::getConfig()->get('MANUFACTURER_PRODUCT_THUMB_HEIGHT_2'); + $w_thumb = Redshop::getConfig()->get('MANUFACTURER_PRODUCT_THUMB_WIDTH_2'); + } + elseif (strstr($cart_mdata, '{product_thumb_image_3}')) + { + $tag = '{product_thumb_image_3}'; + $h_thumb = Redshop::getConfig()->get('MANUFACTURER_PRODUCT_THUMB_HEIGHT_3'); + $w_thumb = Redshop::getConfig()->get('MANUFACTURER_PRODUCT_THUMB_WIDTH_3'); + } + elseif (strstr($cart_mdata, '{product_thumb_image_1}')) + { + $tag = '{product_thumb_image_1}'; + $h_thumb = Redshop::getConfig()->get('MANUFACTURER_PRODUCT_THUMB_HEIGHT'); + $w_thumb = Redshop::getConfig()->get('MANUFACTURER_PRODUCT_THUMB_WIDTH'); + } + else + { + $tag = '{product_thumb_image}'; + $h_thumb = Redshop::getConfig()->get('MANUFACTURER_PRODUCT_THUMB_HEIGHT'); + $w_thumb = Redshop::getConfig()->get('MANUFACTURER_PRODUCT_THUMB_WIDTH'); + } + + $prod_thumb_image = Redshop\Product\Image\Image::getImage($manufacturer_products[$i]->product_id, $link, $w_thumb, $h_thumb); + $cart_mdata = str_replace($tag, $prod_thumb_image, $cart_mdata); + $redmore = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $cart_mdata = str_replace("{read_more}", $redmore, $cart_mdata); + $cart_mdata = str_replace("{read_more_link}", $link, $cart_mdata); + + if (strstr($cart_mdata, '{manufacturer_product_link}')) + { + $cart_mdata = str_replace("{manufacturer_product_link}", $link, $cart_mdata); + } + + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(1, 1, 1); + $cart_mdata = $producthelper->getExtraSectionTag($extraFieldName, $manufacturer_products[$i]->product_id, "1", $cart_mdata); + + $productAvailabilityDate = strstr($cart_mdata, "{product_availability_date}"); + $stockNotifyFlag = strstr($cart_mdata, "{stock_notify_flag}"); + $stockStatus = strstr($cart_mdata, "{stock_status"); + + $attributeproductStockStatus = array(); + + if ($productAvailabilityDate || $stockNotifyFlag || $stockStatus) + { + $attributeproductStockStatus = $producthelper->getproductStockStatus($manufacturer_products[$i]->product_id, $totalatt); + } + + $cart_mdata = \Redshop\Helper\Stockroom::replaceProductStockData( + $manufacturer_products[$i]->product_id, + 0, + 0, + $cart_mdata, + $attributeproductStockStatus + ); + +// $cart_tr .=$cart_mdata ; + +// $cname = $manufacturer_products[$i]->category_name; + } +} + +$template_desc = $template_start . $cart_mdata . $template_end; + +if (strstr($template_desc, "{manufacturer_image}")) +{ + $thumbImage = ''; + $media = RedshopEntityManufacturer::getInstance($manufacturer->id)->getMedia(); + + if ($media->isValid() && !empty($media->get('media_name')) + && JFile::exists(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $manufacturer->id . '/' . $media->get('media_name'))) + { + $thumbHeight = Redshop::getConfig()->get('MANUFACTURER_THUMB_HEIGHT'); + $thumbWidth = Redshop::getConfig()->get('MANUFACTURER_THUMB_WIDTH'); + + if (Redshop::getConfig()->get('WATERMARK_MANUFACTURER_IMAGE') || Redshop::getConfig()->get('WATERMARK_MANUFACTURER_THUMB_IMAGE')) + { + $imagePath = RedshopHelperMedia::watermark( + 'manufacturer', + $media->get('media_name'), + $thumbWidth, + $thumbHeight, + Redshop::getConfig()->get('WATERMARK_MANUFACTURER_IMAGE') + ); + } + else + { + $imagePath = RedshopHelperMedia::getImagePath( + $media->get('media_name'), + '', + 'thumb', + 'manufacturer', + $thumbWidth, + $thumbHeight, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'), + 'manufacturer', + $manufacturer->id + ); + } + + $altText = $media->get('media_alternate_text', $manufacturer->name); + + $thumbImage = "id . '/' . $media->get('media_name') . "' rel=\"{handler: 'image', size: {}}\"> + " . $altText . ""; + } + + $template_desc = str_replace("{manufacturer_image}", $thumbImage, $template_desc); +} + +$manlink = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=detail&mid=' . $manufacturer->id . '&Itemid=' . $itemId); + +$manproducts = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $manufacturer->id . '&Itemid=' . $itemId); + +$template_desc = str_replace("{manufacturer_name}", $manufacturer->name, $template_desc); + +// Extra field display +$extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(10, 1, 1); +$template_desc = $producthelper->getExtraSectionTag($extraFieldName, $manufacturer->id, "10", $template_desc); +$template_desc = str_replace("{manufacturer_description}", $manufacturer->description, $template_desc); + +$manufacturer_extra_fields = RedshopHelperExtrafields::listAllFieldDisplay(10, $manufacturer->id); +$template_desc = str_replace("{manufacturer_extra_fields}", $manufacturer_extra_fields, $template_desc); + +$template_desc = str_replace("{manufacturer_link}", $manlink, $template_desc); + +$template_desc = str_replace("{print}", $print_tag, $template_desc); + +if (strstr($template_desc, '{filter_by}')) +{ + $filterby_form = "
    " . JText::_('COM_REDSHOP_SELECT_FILTER_BY') . $this->lists['filter_select']; + $filterby_form .= "
    "; + $template_desc = str_replace("{filter_by}", $filterby_form, $template_desc); +} + +if (strstr($template_desc, '{order_by}')) +{ + $orderby_form = "
    " . JText::_('COM_REDSHOP_SELECT_ORDER_BY') . $this->lists['order_select']; + $orderby_form .= "
    "; + $template_desc = str_replace("{order_by}", $orderby_form, $template_desc); +} + +if (strstr($template_desc, '{pagination}')) +{ + $productpagination = $model->getProductPagination(); + $template_desc = str_replace("{pagination}", $productpagination->getPagesLinks(), $template_desc); +} + +$template_desc = RedshopHelperTemplate::parseRedshopPlugin($template_desc); +echo eval("?>" . $template_desc . " + + + + + + + + +
    + + + +
    +
    +
    diff --git a/component/site/views/manufacturers/view.html.php b/component/site/views/manufacturers/view.html.php new file mode 100644 index 00000000000..7ac02d1ed97 --- /dev/null +++ b/component/site/views/manufacturers/view.html.php @@ -0,0 +1,287 @@ +input->getInt('print'); + $layout = $app->input->getCmd('layout', 'default'); + $params = $app->getParams('com_redshop'); + $itemId = $app->input->getInt('itemid', null); + + $mid = 0; + $lists = array(); + + /** @var RedshopModelManufacturers $model */ + $model = $this->getModel('manufacturers'); + $detail = $this->get('data'); + $limit = $params->get('maxproduct'); + + $detail = array_filter(array_values($detail)); + + if (!$limit && !empty($detail)) + { + $limit = $detail[0]->product_per_page; + } + + $model->setProductLimit($limit); + $pageheadingtag = ''; + $disabled = ""; + + if ($print) + { + $disabled = "disabled"; + } + + if ($layout != 'default') + { + $manufacturer = !empty($detail) && !empty($detail[0]) ? $detail[0] : null; + + if (null !== $manufacturer && $manufacturer->id) + { + $mid = $manufacturer->id; + + $document->setMetaData('robots', $manufacturer->metarobot_info); + + // For page title + + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_TITLE_MANUFACTUR') != '') + { + $pagetitletag = Redshop::getConfig()->get('SEO_PAGE_TITLE_MANUFACTUR'); + $pagetitletag = str_replace("{manufacturer}", $manufacturer->name, $pagetitletag); + $pagetitletag = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $pagetitletag); + } + + if ($manufacturer->pagetitle != '' + && Redshop::getConfig()->get('AUTOGENERATED_SEO') + && Redshop::getConfig()->get('SEO_PAGE_TITLE_MANUFACTUR') != '') + { + $pagetitletag = $pagetitletag . " " . $manufacturer->pagetitle; + $document->setTitle($pagetitletag); + } + else + { + if ($manufacturer->pagetitle != '') + { + $pagetitletag = $manufacturer->pagetitle; + $document->setTitle($manufacturer->pagetitle); + } + elseif (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_TITLE_MANUFACTUR') != '') + { + $document->setTitle($pagetitletag); + } + else + { + $pagetitletag = $app->getCfg('sitename'); + $document->setTitle($app->getCfg('sitename')); + } + } + + if ($layout == 'products') + { + $pagetitletag = JText::_("COM_REDSHOP_MANUFACTURER_PRODUCT") . " " . $pagetitletag; + $document->setTitle($pagetitletag); + } + + // For meta keyword + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_KEYWORDS_MANUFACTUR') != '') + { + $pagekeywordstag = Redshop::getConfig()->get('SEO_PAGE_KEYWORDS_MANUFACTUR'); + $pagekeywordstag = str_replace("{manufacturer}", $manufacturer->name, $pagekeywordstag); + $pagekeywordstag = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $pagekeywordstag); + } + + if ($manufacturer->metakey != '' + && Redshop::getConfig()->get('AUTOGENERATED_SEO') + && Redshop::getConfig()->get('SEO_PAGE_KEYWORDS_MANUFACTUR') != '') + { + $pagekeywordstag = $pagekeywordstag . ", " . $manufacturer->metakey; + $document->setMetaData('keywords', $pagekeywordstag); + } + else + { + if ($manufacturer->metakey != '') + { + $document->setMetaData('keywords', $manufacturer->metakey); + } + elseif (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_KEYWORDS_MANUFACTUR') != '') + { + $document->setMetaData('keywords', $pagekeywordstag); + } + else + { + $document->setMetaData('keywords', $manufacturer->name); + } + } + + // For meta description + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION_MANUFACTUR') != '') + { + $pagedesctag = Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION_MANUFACTUR'); + $pagedesctag = str_replace("{manufacturer}", $manufacturer->name, $pagedesctag); + $pagedesctag = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $pagedesctag); + } + + if ($manufacturer->metadesc != '' + && Redshop::getConfig()->get('AUTOGENERATED_SEO') + && Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION_MANUFACTUR') != '') + { + $pagedesctag = $pagedesctag . " " . $manufacturer->metadesc; + $document->setMetaData('description', $pagedesctag); + } + else + { + if ($manufacturer->metadesc != '') + { + $document->setMetaData('description', $manufacturer->metadesc); + } + elseif (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION_MANUFACTUR') != '') + { + $document->setMetaData('description', $pagedesctag); + } + else + { + $document->setMetaData('description', $manufacturer->name); + } + } + + if ($manufacturer->metarobot_info != '') + { + $document->setMetaData('robots', $manufacturer->metarobot_info); + } + else + { + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && JFactory::getConfig()->get('robots') != '') + { + $document->setMetaData('robots', JFactory::getConfig()->get('robots')); + } + else + { + $document->setMetaData('robots', "INDEX,FOLLOW"); + } + } + + // For page heading + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_HEADING_MANUFACTUR') != '') + { + $pageheadingtag = Redshop::getConfig()->get('SEO_PAGE_HEADING_MANUFACTUR'); + $pageheadingtag = str_replace("{manufacturer}", $manufacturer->name, $pageheadingtag); + } + + if (trim($manufacturer->pageheading) != '' + && Redshop::getConfig()->get('AUTOGENERATED_SEO') + && Redshop::getConfig()->get('SEO_PAGE_HEADING_MANUFACTUR') != '') + { + $pageheadingtag = $pageheadingtag . " " . $manufacturer->pageheading; + } + else + { + if (trim($manufacturer->pageheading) != '') + { + $pageheadingtag = $manufacturer->pageheading; + } + elseif (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_HEADING_MANUFACTUR') != '') + { + $pageheadingtag = $pageheadingtag; + } + } + + // FOr Canonical In Manufacturer Page + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_CANONICAL_MANUFACTUR') != '' && $layout != "products") + { + $canonicalurl = Redshop::getConfig()->get('SEO_PAGE_CANONICAL_MANUFACTUR'); + + $manufacturer_products_url = substr_replace(JURI::root(), "", -1) + . JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $manufacturer->id . '&Itemid=' . $itemId); + $canonicalurl_content = ''; + $canonicalurl = str_replace("{manufacturerproductslink}", $canonicalurl_content, $canonicalurl); + $document->addCustomTag($canonicalurl); + } + } + else + { + $document->setMetaData('keywords', $app->getCfg('sitename')); + $document->setMetaData('description', $app->getCfg('sitename')); + $document->setMetaData('robots', $app->getCfg('sitename')); + } + + $this->setLayout($layout); + } + + // Breadcrumbs + RedshopHelperBreadcrumb::generate($mid); + + // Breadcrumbs end + + if ($layout == "products") + { + $filter_order = $params->get('order_by', Redshop::getConfig()->get('DEFAULT_MANUFACTURER_PRODUCT_ORDERING_METHOD')); + $order_by_select = $app->input->getString('order_by', $filter_order); + $order_data = RedshopHelperUtility::getOrderByList(); + } + else + { + $filter_order = $params->get('order_by', Redshop::getConfig()->get('DEFAULT_MANUFACTURER_ORDERING_METHOD')); + + if ($app->input->getString('order_by', '') != null) + { + $order_by_select = $app->input->getString('order_by', ''); + } + elseif ($app->getUserState('com_redshop.manufacturers.default.order_state') != null) + { + $order_by_select = $app->getUserState('com_redshop.manufacturers.default.order_state'); + } + else + { + $order_by_select = $filter_order; + } + + $order_data = RedshopHelperUtility::getManufacturerOrderByList(); + } + + $lists['order_select'] = JHTML::_('select.genericlist', $order_data, 'order_by', 'class="inputbox" size="1" onchange="document.orderby_form.submit();" ' . $disabled . ' ', 'value', 'text', $order_by_select); + + $categorylist = $model->getCategoryList(); + + $temps = array(); + $temps[0] = new StdClass; + $temps[0]->value = "0"; + $temps[0]->text = JText::_('COM_REDSHOP_SELECT'); + $categorylist = array_merge($temps, $categorylist); + $filter_by_select = $app->input->getString('filter_by', 0); + $lists['filter_select'] = JHTML::_('select.genericlist', $categorylist, 'filter_by', 'class="inputbox" size="1" onchange="document.filter_form.submit();" ' . $disabled . ' ', 'value', 'text', $filter_by_select); + + $pagination = $this->get('Pagination'); + + $this->detail = $detail; + $this->lists = $lists; + $this->pagination = $pagination; + $this->pageheadingtag = $pageheadingtag; + $this->params = $params; + parent::display($tpl); + } +} diff --git a/component/site/views/newsletter/index.html b/component/site/views/newsletter/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/newsletter/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/newsletter/tmpl/default.php b/component/site/views/newsletter/tmpl/default.php new file mode 100644 index 00000000000..9776220d2a5 --- /dev/null +++ b/component/site/views/newsletter/tmpl/default.php @@ -0,0 +1,81 @@ +input->getString('email'); +$name = $app->input->getString('name'); +$Itemid = $app->input->getInt('Itemid'); + +if ($user->id != "") +{ + $email = $user->email; + $name = $user->name; +} + +if ($this->params->get('show_page_heading', 1)) +{ + ?> +
    + escape($this->params->get('page_title')); ?> +
    + +
    +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + class="redshop_newsletter_tilmeld"/> + +
    +
    + + + + + +
    + diff --git a/component/site/views/newsletter/tmpl/default.xml b/component/site/views/newsletter/tmpl/default.xml new file mode 100644 index 00000000000..817e99af089 --- /dev/null +++ b/component/site/views/newsletter/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/newsletter/tmpl/index.html b/component/site/views/newsletter/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/newsletter/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/newsletter/tmpl/thankyou.php b/component/site/views/newsletter/tmpl/thankyou.php new file mode 100644 index 00000000000..0098fc06488 --- /dev/null +++ b/component/site/views/newsletter/tmpl/thankyou.php @@ -0,0 +1,12 @@ +input->getString('msg'); +echo $msg; diff --git a/component/site/views/newsletter/tmpl/thankyou.xml b/component/site/views/newsletter/tmpl/thankyou.xml new file mode 100644 index 00000000000..70a32546ea3 --- /dev/null +++ b/component/site/views/newsletter/tmpl/thankyou.xml @@ -0,0 +1,8 @@ + + + + diff --git a/component/site/views/newsletter/view.html.php b/component/site/views/newsletter/view.html.php new file mode 100644 index 00000000000..c412408aebb --- /dev/null +++ b/component/site/views/newsletter/view.html.php @@ -0,0 +1,65 @@ +getPathway(); + $pathway->addItem(JText::_('COM_REDSHOP_NEWSLETTER_SUBSCRIPTION'), ''); + + $layout = $app->input->getCmd('layout'); + + $this->user = JFactory::getUser(); + $this->userdata = $app->input->getString('userdata'); + $this->params = $app->getParams('com_redshop'); + + if ($layout == 'thankyou') + { + $this->setLayout('thankyou'); + } + + parent::display($tpl); + } +} diff --git a/component/site/views/order_detail/index.html b/component/site/views/order_detail/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/order_detail/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/order_detail/tmpl/checkout_final.php b/component/site/views/order_detail/tmpl/checkout_final.php new file mode 100644 index 00000000000..17ac627c945 --- /dev/null +++ b/component/site/views/order_detail/tmpl/checkout_final.php @@ -0,0 +1,128 @@ +input->getInt('oid'); + +$order = RedshopEntityOrder::getInstance($order_id)->getItem(); +$orderitem = RedshopHelperOrder::getOrderItemDetail($order_id); + +if ($order->order_total > 0 && !Redshop::getConfig()->get('USE_AS_CATALOG')) +{ + $paymentmethod = $order_functions->getOrderPaymentDetail($order_id); + $paymentmethod = RedshopHelperOrder::getPaymentMethodInfo($paymentmethod[0]->payment_method_class); + $paymentmethod = $paymentmethod[0]; + + $paymentpath = JPATH_SITE . '/plugins/redshop_payment/' . $paymentmethod->element . '/' . $paymentmethod->element . '.xml'; + $paymentparams = new JRegistry($paymentmethod->params); + + echo '
    '; + + $is_creditcard = $paymentparams->get('is_creditcard', ''); + $is_redirected = $paymentparams->get('is_redirected', 0); + + if (!$is_creditcard || $is_redirected == 1) + { + $adminpath = JPATH_ADMINISTRATOR . '/components/com_redshop'; + $invalid_elements = $paymentparams->get('invalid_elements', ''); + + $billingaddresses = RedshopHelperOrder::getOrderBillingUserInfo($order->order_id); + + if (isset($billingaddresses)) + { + if (isset($billingaddresses->country_code)) + { + $billingaddresses->country_2_code = RedshopHelperWorld::getCountryCode2($billingaddresses->country_code); + } + + if (isset($billingaddresses->state_code)) + { + $billingaddresses->state_2_code = $billingaddresses->state_code; + } + } + + $shippingaddresses = RedshopHelperOrder::getOrderShippingUserInfo($order->order_id); + + if (isset($shippingaddresses)) + { + if (isset($shippingaddresses->country_code)) + { + $shippingaddresses->country_2_code = RedshopHelperWorld::getCountryCode2($shippingaddresses->country_code); + } + + if (isset($shippingaddresses->state_code)) + { + $shippingaddresses->state_2_code = $shippingaddresses->state_code; + } + } + + $cart_quantity = 0; + + for ($i = 0, $in = count($orderitem); $i < $in; $i++) + { + $cart_quantity += $orderitem[$i]->product_quantity; + } + + $values['shippinginfo'] = $shippingaddresses; + $values['billinginfo'] = $billingaddresses; + $values['carttotal'] = $order->order_total; + $values['order_subtotal'] = $order->order_subtotal; + $values["order_id"] = $order_id; + $values["order_quantity"] = $cart_quantity; + $values['payment_plugin'] = $paymentmethod->element; + $values['odiscount'] = $order->order_discount; + $values['order'] = $order; + + if ($values['payment_plugin'] == "rs_payment_epayrelay") + { + $epay_url = "https://relay.ditonlinebetalingssystem.dk/relay/v2/relay.cgi/"; + $actionurl = $url . 'index.php?option=com_redshop&view=epayrelay&oid=' . $order_id . '&Itemid=' . $Itemid; + $results = "
    "; + $results .= ""; + $results .= "
    "; + $results .= ""; + $results .= "
    "; + echo $results; + + ?> + + trigger('onPrePayment', array($values['payment_plugin'], $values)); + + $key = array_search(true, $results); + + if (is_array($results) && $key !== false) + { + $app = JFactory::getApplication(); + $app->redirect(JRoute::_('index.php?option=com_redshop&view=order_detail&layout=receipt&oid=' . $order_id . '&Itemid=' . $Itemid, false)); + } + } + } +} +else +{ + $app = JFactory::getApplication(); + $app->redirect(JRoute::_('index.php?option=com_redshop&view=order_detail&layout=receipt&oid=' . $order_id . '&Itemid=' . $Itemid, false)); +} +?> +
    diff --git a/component/site/views/order_detail/tmpl/default.php b/component/site/views/order_detail/tmpl/default.php new file mode 100644 index 00000000000..38be4ebd6fd --- /dev/null +++ b/component/site/views/order_detail/tmpl/default.php @@ -0,0 +1,159 @@ +input->getInt('Itemid'); +$oid = $app->input->getInt('oid'); +$print = $app->input->getInt('print'); + +$getshm = $uri->getScheme(); +$config = JFactory::getConfig(); +$force_ssl = $config->get('force_ssl'); + +if ($getshm == 'https' && $force_ssl > 2) +{ + $uri->setScheme('http'); +} + +if ($this->params->get('show_page_heading', 1)) : ?> +

    + escape(JText::_('COM_REDSHOP_ORDER_DETAILS')); ?> +

    + +getModel('order_detail'); +$OrdersDetail = $this->OrdersDetail; +$OrderProducts = RedshopHelperOrder::getOrderItemDetail($oid); +$partialpayment = RedshopHelperOrder::getOrderPartialPayment($oid); + +// Get order Payment method information + +if (Redshop::getConfig()->get('USE_AS_CATALOG')) +{ + $orderslist_template = RedshopHelperTemplate::getTemplate("catalogue_order_detail"); + $orderslist_template = $orderslist_template[0]->template_desc; +} +else +{ + $orderslist_template = RedshopHelperTemplate::getTemplate("order_detail"); + + if (count($orderslist_template) > 0 && $orderslist_template[0]->template_desc) + { + $orderslist_template = $orderslist_template[0]->template_desc; + } + else + { + $orderslist_template = '
    {print}
    {discount_type_lbl}
    {discount_type}
    {order_information_lbl}
    {order_id_lbl} : {order_id}
    {order_number_lbl} : {order_number}
    {order_date_lbl} : {order_date}
    {order_status_lbl} : {order_status}
    {billing_address_information_lbl}
    {billing_address}
    {shipping_address_information_lbl}
    {shipping_address}
    {order_detail_lbl}
    {product_loop_start}{product_loop_end}
    {copy_orderitem_lbl}{product_name_lbl}{note_lbl}{price_lbl}{quantity_lbl}{total_price_lbl}
    {copy_orderitem}{product_name}
    {product_attribute}{product_accessory}{product_userfields}
    {product_wrapper}{product_price}{product_quantity}{product_total_price}
    {customer_note_lbl}: {customer_note}
    {requisition_number_lbl}: {requisition_number}
    {if discount}{discount end if}{if vat}{vat end if} {if payment_discount}{payment_discount end if}
    Product Subtotal:{product_subtotal}Product Subtotal excl vat:{product_subtotal_excl_vat}
    Shipping with vat:{shipping}Shipping excl vat:{shipping_excl_vat}
    {discount_lbl}{discount}{discount_lbl}{discount_excl_vat}
    {totalpurchase_lbl}:{order_subtotal}{subtotal_excl_vat_lbl} :{order_subtotal_excl_vat}
    {vat_lbl}{tax}{vat_lbl}{sub_total_vat}
    {payment_discount_lbl}{payment_order_discount}
    {tax_with_shipping_lbl}{shipping}{shipping_lbl}{shipping_excl_vat}
    {total_lbl}:
    {order_total}
    {total_lbl}:
    {total_excl_vat}
    {reorder_button}
    '; + } +} + +// Replace Reorder Button +$this->replaceReorderButton($orderslist_template); + +if ($print) +{ + $onclick = "onclick='window.print();'"; +} +else +{ + $print_url = $url . "index.php?option=com_redshop&view=order_detail&oid=" . $oid . "&print=1&tmpl=component&Itemid=" . $Itemid . "&encr=" . $app->input->getCmd('encr', ''); + $onclick = "onclick='window.open(\"$print_url\",\"mywindow\",\"scrollbars=1\",\"location=1\")'"; +} + +$print_tag = ""; +$print_tag .= "" . JText::_("; +$print_tag .= ""; + +$orderslist_template = str_replace("{print}", $print_tag, $orderslist_template); + +$arr_discount_type = array(); +$arr_discount = explode('@', $OrdersDetail->discount_type); +$discount_type = ''; + +for ($d = 0, $dn = count($arr_discount); $d < $dn; $d++) +{ + if ($arr_discount[$d]) + { + $arr_discount_type = explode(':', $arr_discount[$d]); + + if ($arr_discount_type[0] == 'c') + $discount_type .= JText::_('COM_REDSHOP_COUPEN_CODE') . ' : ' . $arr_discount_type[1] . '
    '; + + if ($arr_discount_type[0] == 'v') + $discount_type .= JText::_('COM_REDSHOP_VOUCHER_CODE') . ' : ' . $arr_discount_type[1] . '
    '; + } +} + +$search[] = "{discount_type_lbl}"; +$replace[] = JText::_('COM_REDSHOP_CART_DISCOUNT_CODE_TBL'); + +if ($discount_type) +{ + $search[] = "{discount_type}"; + $replace[] = $discount_type; +} +else +{ + $search[] = "{discount_type}"; + $replace[] = JText::_('COM_REDSHOP_NO_DISCOUNT_AVAILABLE'); +} + +$statustext = RedshopHelperOrder::getOrderStatusTitle($OrdersDetail->order_status); + +$search [] = "{order_status}"; + +if (trim($OrdersDetail->order_payment_status) == 'Paid') +{ + $orderPaymentStatus = JText::_('COM_REDSHOP_PAYMENT_STA_PAID'); +} +elseif (trim($OrdersDetail->order_payment_status) == 'Unpaid') +{ + $orderPaymentStatus = JText::_('COM_REDSHOP_PAYMENT_STA_UNPAID'); +} +elseif (trim($OrdersDetail->order_payment_status) == 'Partial Paid') +{ + $orderPaymentStatus = JText::_('COM_REDSHOP_PAYMENT_STA_PARTIAL_PAID'); +} +else +{ + $orderPaymentStatus = $OrdersDetail->order_payment_status; +} + +$replace[] = $statustext . " - " . $orderPaymentStatus; + +if (strstr($orderslist_template, "{order_status_order_only}")) +{ + $search [] = "{order_status_order_only}"; + $replace [] = $statustext; +} + +if (strstr($orderslist_template, "{order_status_payment_only}")) +{ + $search [] = "{order_status_payment_only}"; + $replace [] = $orderPaymentStatus; +} + +$message = str_replace($search, $replace, $orderslist_template); + +$message = RedshopHelperTemplate::parseRedshopPlugin($message); +$message = Redshop\Order\Template::replaceTemplate($OrdersDetail, $message); +echo eval("?>" . $message . " + + \ No newline at end of file diff --git a/component/site/views/order_detail/tmpl/receipt.php b/component/site/views/order_detail/tmpl/receipt.php new file mode 100644 index 00000000000..67ad23c5e53 --- /dev/null +++ b/component/site/views/order_detail/tmpl/receipt.php @@ -0,0 +1,152 @@ +input->getInt('oid'); + +// For barcode +$model = $this->getModel('order_detail'); + +$order = $this->OrdersDetail; +?> +params->get('show_page_title', 1)) +{ +?> +

    + escape(JText::_('COM_REDSHOP_ORDER_RECEIPT')); ?> +

    +get('ONESTEP_CHECKOUT_ENABLE')) +{ + echo JLayoutHelper::render('cart.wizard', array('step' => '3')); +} + +if (Redshop::getConfig()->get('USE_AS_CATALOG')) +{ + $ReceiptTemplate = RedshopHelperTemplate::getTemplate("catalogue_order_receipt"); + $ReceiptTemplate = $ReceiptTemplate[0]->template_desc; +} +else +{ + $ReceiptTemplate = RedshopHelperTemplate::getTemplate("order_receipt"); + + if (count($ReceiptTemplate) > 0 && $ReceiptTemplate[0]->template_desc) + { + $ReceiptTemplate = $ReceiptTemplate[0]->template_desc; + } + else + { + $ReceiptTemplate = '
    {print}
    {product_loop_start}{product_loop_end}
    {product_name_lbl} {price_lbl} {quantity_lbl} {total_price_lbl}
    {product_name}
    {product_attribute}{product_accessory}{product_userfields}{product_wrapper}
    {product_thumb_image}{product_price}{product_quantity}{product_total_price}



    {if discount}{discount end if}{if vat}{vat end if} {if payment_discount}{payment_discount end if}
    Product Subtotal:{product_subtotal}Product Subtotal excl vat:{product_subtotal_excl_vat}
    Shipping with vat:{shipping}Shipping excl vat:{shipping_excl_vat}
    {discount_lbl}{discount}{discount_lbl}{discount_excl_vat}
    {totalpurchase_lbl}:{order_subtotal}{subtotal_excl_vat_lbl} :{order_subtotal_excl_vat}
    {vat_lbl}{tax}{vat_lbl}{sub_total_vat}
    {payment_discount_lbl}{payment_order_discount}
    {shipping_lbl}{shipping}{shipping_lbl}{shipping_excl_vat}
    {total_lbl}:
    {order_total}
    {total_lbl}:
    {total_excl_vat}

    {shipping_method_lbl} {shipping_method}

    {payment_status}

    {billing_address}
    {shipping_address}
    '; + } +} + +$orderitem = RedshopHelperOrder::getOrderItemDetail($order_id); + +// Replace Reorder Button +$this->replaceReorderButton($ReceiptTemplate); + +$print = $app->input->getInt('print'); + +if ($print) +{ + $onclick = "onclick='window.print();'"; +} +else +{ + $print_url = $url . "index.php?option=com_redshop&view=order_detail&layout=receipt&oid=" . $order_id . "&print=1&tmpl=component&Itemid=" . $Itemid; + $onclick = "onclick='window.open(\"$print_url\",\"mywindow\",\"scrollbars=1\",\"location=1\")'"; +} + +$print_tag = ""; +$print_tag .= "" . JText::_("; +$print_tag .= ""; +$ReceiptTemplate = str_replace("{print}", $print_tag, $ReceiptTemplate); + +$ReceiptTemplate = str_replace("{product_name_lbl}", JText::_('COM_REDSHOP_PRODUCT_NAME_LBL'), $ReceiptTemplate); +$ReceiptTemplate = str_replace("{price_lbl}", JText::_('COM_REDSHOP_PRICE_LBL'), $ReceiptTemplate); +$ReceiptTemplate = str_replace("{quantity_lbl}", JText::_('COM_REDSHOP_QUANTITY_LBL'), $ReceiptTemplate); +$ReceiptTemplate = str_replace("{total_price_lbl}", JText::_('COM_REDSHOP_TOTAL_PRICE_LBL'), $ReceiptTemplate); +$ReceiptTemplate = Template::replaceTemplate($order, $ReceiptTemplate); + +// Added new tag +/** + * The Tag {txtextra_info} to display some extra information about payment method ( Only For display purpose ). + * + * Output is fatched from Payment Gateway Plugin Parameter 'txtextra_info' + */ +$order_payment = $order_functions->getOrderPaymentDetail($order_id); + +$payment_method_class = $order_payment[0]->payment_method_class; + +JLoader::import('joomla.plugin.helper'); + +$plugin = JPluginHelper::getPlugin('redshop_payment', $payment_method_class); +$params = new JRegistry($plugin->params); + +$txtextra_info = $params->get('txtextra_info'); + +$ReceiptTemplate = str_replace("{txtextra_info}", $txtextra_info, $ReceiptTemplate); + +// End + +$ReceiptTemplate = RedshopHelperTemplate::parseRedshopPlugin($ReceiptTemplate); + +/** + * + * trigger content plugin + */ +$dispatcher = RedshopHelperUtility::getDispatcher(); +$o = new stdClass; +$o->text = $ReceiptTemplate; +JPluginHelper::importPlugin('content'); +$x = array(); +$results = $dispatcher->trigger('onPrepareContent', array(&$o, &$x, 0)); +$ReceiptTemplate = $o->text; + +$dispatcher->trigger('onRenderReceipt', array(&$ReceiptTemplate, $order_id)); + +// End + +echo eval("?>" . $ReceiptTemplate . "get('issplit'); + +if ($issplit) +{ + $split_amount = ($order->order_total) / 2; + $order->order_total = $split_amount; +} + +// End + +$billingaddresses = $model->billingaddresses(); + +if ($order->analytics_status == 0) +{ + $model->UpdateAnalytics_status($order->order_id); +} diff --git a/component/site/views/order_detail/view.html.php b/component/site/views/order_detail/view.html.php new file mode 100644 index 00000000000..4e1850689dd --- /dev/null +++ b/component/site/views/order_detail/view.html.php @@ -0,0 +1,158 @@ +input->getInt('print', 0); + + if ($print) + { + ?> + + get('auth'); + $orderId = $app->input->getInt('oid', $session->get('order_id')); + $encr = $app->input->getString('encr', null); + $orderPayment = $orderFunctions->getOrderPaymentDetail($orderId); + + if ($orderPayment && count($orderPayment)) + { + // Load payment language file + $language = JFactory::getLanguage(); + $base_dir = JPATH_ADMINISTRATOR; + $language_tag = $language->getTag(); + $extension = 'plg_redshop_payment_' . ($orderPayment[0]->payment_method_class); + + $language->load($extension, $base_dir, $language_tag, true); + } + + /** @var RedshopModelOrder_detail $model */ + $model = $this->getModel('order_detail'); + + $orderDetail = RedshopHelperOrder::getOrderDetails($orderId); + + if ($user->id) + { + if ($orderDetail->user_id != $user->id) + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=login&Itemid=' . $app->input->getInt('Itemid'))); + } + } + else + { + if ($encr) + { + $authorization = $model->checkauthorization($orderId, $encr); + + if (!$authorization) + { + JError::raiseWarning(404, JText::_('COM_REDSHOP_ORDER_ENCKEY_FAILURE')); + echo JText::_('COM_REDSHOP_ORDER_ENCKEY_FAILURE'); + } + } + + // Preform security checks + elseif (!$user->id && !isset($auth['users_info_id'])) + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=login&Itemid=' . $app->input->getInt('Itemid'))); + } + } + + JPluginHelper::importPlugin('system'); + RedshopHelperUtility::getDispatcher()->trigger('onDisplayOrderReceipt', array(&$orderDetail)); + + $this->OrdersDetail = $orderDetail; + $this->user = $user; + $this->params = $app->getParams('com_redshop'); + + parent::display($tpl); + } + + /** + * Replace Reorder Button + * + * @param string &$template Template Data + * + * @return void + */ + public function replaceReorderButton(&$template) + { + $app = JFactory::getApplication(); + $order = $this->OrdersDetail; + $orderId = $app->input->getInt('oid', 0); + $print = $app->input->getInt('print', 0); + + if ($order->order_status != 'C' && $order->order_status != 'S' && $order->order_status != 'PR' && $order->order_status != 'APP' && $print != 1 && $order->order_payment_status != 'Paid') + { + $reorder = "
    + + + + + +
    "; + } + else + { + JFactory::getDocument()->addScriptDeclaration(' + function submitReorder() { + if (!confirm("' . JText::_('COM_REDSHOP_CONFIRM_CART_EMPTY') . '")) { + return false; + } + return true; + } + '); + $reorder = "
    "; + $reorder .= ""; + $reorder .= ""; + $reorder .= ""; + $reorder .= ""; + $reorder .= "
    "; + } + + $template = str_replace("{reorder_button}", $reorder, $template); + } +} diff --git a/component/site/views/orders/index.html b/component/site/views/orders/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/orders/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/orders/tmpl/default.php b/component/site/views/orders/tmpl/default.php new file mode 100644 index 00000000000..d16b194545d --- /dev/null +++ b/component/site/views/orders/tmpl/default.php @@ -0,0 +1,170 @@ +input->getInt('Itemid'); +$print = $app->input->getInt('print'); +$document = JFactory::getDocument(); +$redTemplate = Redtemplate::getInstance(); + +$template_id = $this->params->get('template_id'); +$orderslist_template = RedshopHelperTemplate::getTemplate("order_list", $template_id); + +if (count($orderslist_template) > 0 && $orderslist_template[0]->template_desc != "") +{ + $template_desc = $orderslist_template[0]->template_desc; +} +else +{ + $template_desc = "\r\n\r\n\r\n\r\n\r\n{product_loop_start} \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n{product_loop_end}\r\n\r\n
    {order_id_lbl} {product_name_lbl} {total_price_lbl} {order_date_lbl} {order_date_lbl} {order_detail_lbl}
    {order_id}{order_products}{order_total}{order_date}{order_status}{order_detail_link}
    \r\n
    {pagination}
    "; +} + +if ($this->params->get('show_page_heading', 1)) +{ + ?> +

    + escape(JText::_('COM_REDSHOP_ORDER_LIST'));?> +

    +"; +$print_tag .= "" . JText::_("; +$print_tag .= ""; + +$template_desc = str_replace("{print}", $print_tag, $template_desc); + +if (strstr($template_desc, "{product_loop_start}") && strstr($template_desc, "{product_loop_end}")) +{ + $template_sdata = explode('{product_loop_start}', $template_desc); + $template_start = $template_sdata[0]; + $template_edata = explode('{product_loop_end}', $template_sdata[1]); + $template_end = $template_edata[1]; + $template_middle = $template_edata[0]; + + $cart_mdata = ""; + + for ($i = 0; $i < count($this->detail); $i++) + { + $prolist = RedshopHelperOrder::getOrderItemDetail($this->detail[$i]->order_id); + $statusname = RedshopHelperOrder::getOrderStatusTitle($this->detail[$i]->order_status); + + $order_item_name = array(); + + for ($j = 0, $jn = count($prolist); $j < $jn; $j++) + { + $order_item_name[$j] = $prolist[$j]->order_item_name; + } + + $orderpayment = $order_function->getOrderPaymentDetail($this->detail[$i]->order_id); + $paymentmethod = $orderpayment[0]; + + $orderTransFee = ''; + + if ($paymentmethod->order_transfee > 0) + { + $orderTransFee = $producthelper->getProductFormattedPrice( + $paymentmethod->order_transfee + ); + } + + $orderTotalInclTraferfee = $producthelper->getProductFormattedPrice( + $paymentmethod->order_transfee + $this->detail[$i]->order_total + ); + + $orderdetailurl = JRoute::_('index.php?option=com_redshop&view=order_detail&oid=' . $this->detail[$i]->order_id); + + $reorderurl = JURI::root() . 'index.php?option=com_redshop&view=order_detail&order_id=' . $this->detail[$i]->order_id . '&task=reorder&tmpl=component'; + + $order_number = "
    " . $this->detail[$i]->order_number . "
    "; + + $order_id = "
    " . $this->detail[$i]->order_id . "
    "; + + $order_products = "
    " . implode(',
    ', $order_item_name) . "
    "; + + $order_total = "
    " . $producthelper->getProductFormattedPrice($this->detail[$i]->order_total) . "
    "; + + $order_date = "
    " . $redconfig->convertDateFormat($this->detail[$i]->cdate) . "
    "; + + $cart_mdata = str_replace("{order_transfee}", $orderTransFee, $cart_mdata); + + $cart_mdata = str_replace("{order_total_incl_transfee}", $orderTotalInclTraferfee, $cart_mdata); + + $order_status = "
    " . $statusname . "
    "; + + $order_detail_link = ""; + + $reorder_link = ""; + + $cart_mdata .= $template_middle; + + $cart_mdata = str_replace("{order_number}", $order_number, $cart_mdata); + + $cart_mdata = str_replace("{order_id}", $order_id, $cart_mdata); + + $cart_mdata = str_replace("{order_products}", $order_products, $cart_mdata); + + $cart_mdata = str_replace("{order_total}", $order_total, $cart_mdata); + + $cart_mdata = str_replace("{order_date}", $order_date, $cart_mdata); + + $cart_mdata = str_replace("{order_status}", $order_status, $cart_mdata); + + $cart_mdata = str_replace("{order_detail_link}", $order_detail_link, $cart_mdata); + + $cart_mdata = str_replace("{reorder_link}", $reorder_link, $cart_mdata); + + $cart_mdata = str_replace("{requisition_number}", $this->detail[$i]->requisition_number, $cart_mdata); + } + + $template_desc = str_replace("{product_loop_start}", "", $template_desc); + $template_desc = str_replace($template_middle, $cart_mdata, $template_desc); + $template_desc = str_replace("{product_loop_end}", "", $template_desc); +} + +$template_desc = Redshop\Cart\Render\Label::replace($template_desc); + +if (strstr($template_desc, "{pagination}")) +{ + $template_desc = str_replace("{pagination}", $this->pagination->getPagesLinks(), $template_desc); +} + +if (strstr($template_desc, "{pagination_limit}")) +{ + $limitBox = "
    "; + $limitBox .= $this->pagination->getLimitBox(); + $limitBox .= ""; + $limitBox .= ""; + $limitBox .= ""; + $limitBox .= "
    "; + $template_desc = str_replace("{pagination_limit}", $limitBox, $template_desc); +} + +$template_desc = RedshopHelperTemplate::parseRedshopPlugin($template_desc); +echo eval("?>" . $template_desc . " + + + + + + + + +
    + +
    +
    +
    diff --git a/component/site/views/orders/tmpl/index.html b/component/site/views/orders/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/orders/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/orders/view.html.php b/component/site/views/orders/view.html.php new file mode 100644 index 00000000000..476c8b6dccb --- /dev/null +++ b/component/site/views/orders/view.html.php @@ -0,0 +1,44 @@ +id == 0) + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=login&Itemid=' . JRequest::getInt('Itemid'))); + $app->close(); + } + + $layout = $app->input->getCmd('layout', 'default'); + $this->setLayout($layout); + + $params = $app->getParams('com_redshop'); + RedshopHelperBreadcrumb::generate(); + + // Request variables + $limit = $app->getUserStateFromRequest('com_redshop' . 'limit', 'limit', 10, 'int'); + $limitstart = $app->input->getInt('limitstart', 0, '', 'int'); + + $detail = $this->get('data'); + $this->pagination = $this->get('Pagination'); + + $this->detail = $detail; + $this->params = $params; + parent::display($tpl); + } +} diff --git a/component/site/views/ordertracker/index.html b/component/site/views/ordertracker/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/ordertracker/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/ordertracker/tmpl/default.php b/component/site/views/ordertracker/tmpl/default.php new file mode 100644 index 00000000000..2eadd842c13 --- /dev/null +++ b/component/site/views/ordertracker/tmpl/default.php @@ -0,0 +1,105 @@ +input->getInt('Itemid'); +$order_id = $app->input->getInt('order_id', 0); + +$order_detail = array(); +$OrderProducts = array(); + +if ($order_id != 0) +{ + $order_detail = RedshopEntityOrder::getInstance($order_id)->getItem(); + $OrderProducts = RedshopHelperOrder::getOrderItemDetail($order_id); +} + +if ($this->params->get('show_page_heading', 1)) +{ + ?> +
    + params->get('show_page_heading', 1) && $this->params->get('page_title')) + { + echo $this->escape($this->params->get('page_title')); + } ?> +
    + +
    + + + + + + +
    + : + + +
    + + +
    + + + 0) + { + ?> + + + + + + + + + order_item_name; + } + + $itemlist = implode(',
    ', $order_item_name); + $statusname = RedshopHelperOrder::getOrderStatusTitle($order_detail->order_status); + $orderdetailurl = JRoute::_('index.php?option=com_redshop&view=order_detail&oid=' . $order_id); ?> + + + + + + + + + + + + + + +
    order_number;?>getProductFormattedPrice($order_detail->order_total);?>convertDateFormat($order_detail->cdate); ?> +
    diff --git a/component/site/views/ordertracker/tmpl/default.xml b/component/site/views/ordertracker/tmpl/default.xml new file mode 100644 index 00000000000..59ff8c7beea --- /dev/null +++ b/component/site/views/ordertracker/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/ordertracker/tmpl/index.html b/component/site/views/ordertracker/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/ordertracker/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/ordertracker/view.html.php b/component/site/views/ordertracker/view.html.php new file mode 100644 index 00000000000..76f9292787a --- /dev/null +++ b/component/site/views/ordertracker/view.html.php @@ -0,0 +1,25 @@ +getParams('com_redshop'); + + // Request variables + $this->params = $params; + parent::display($tpl); + } +} diff --git a/component/site/views/plugin/index.html b/component/site/views/plugin/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/plugin/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/plugin/tmpl/default.php b/component/site/views/plugin/tmpl/default.php new file mode 100644 index 00000000000..6ddc63e7db0 --- /dev/null +++ b/component/site/views/plugin/tmpl/default.php @@ -0,0 +1,25 @@ +input->getCmd('task'); + +// Group +$type = $app->input->getCmd('type'); + +$post = $app->input->getArray(); + +JPluginHelper::importPlugin($type); + +$paymentResponses = $dispatcher->trigger($task, array(&$post)); diff --git a/component/site/views/plugin/view.html.php b/component/site/views/plugin/view.html.php new file mode 100644 index 00000000000..f31fe2efb33 --- /dev/null +++ b/component/site/views/plugin/view.html.php @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/component/site/views/price_filter/tmpl/default.php b/component/site/views/price_filter/tmpl/default.php new file mode 100644 index 00000000000..34a0d79e785 --- /dev/null +++ b/component/site/views/price_filter/tmpl/default.php @@ -0,0 +1,138 @@ +input->getInt('Itemid'); +$texpricemin = $app->input->getFloat('texpricemin'); +$texpricemax = $app->input->getFloat('texpricemax'); +$count = $app->input->getInt('count'); +$image = $app->input->getString('image'); +$thumbwidth = $app->input->getInt('thumbwidth'); +$thumbheight = $app->input->getInt('thumbheight'); +$show_price = $app->input->getFloat('show_price'); +$show_readmore = $app->input->getBool('show_readmore'); +$show_addtocart = $app->input->getBool('show_addtocart'); +$show_discountpricelayout = $app->input->getBool('show_discountpricelayout'); + +$k = 0; +$configobj = Redconfiguration::getInstance(); + +// Get product helper +$producthelper = productHelper::getInstance();?> + + prdlist); $i < $countPrdList; $i++) + { + $row = $this->prdlist[$i]; + + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $row->product_id); + $pricetext = ''; + $product_price = Redshop\Product\Price::getPrice($row->product_id); + $tmpprcie = $product_price; + + if ($product_price >= $texpricemin && $product_price <= $texpricemax && $count > 0) + { + $k++; + $count--;?> + + + + "; + } ?> +
    + product_id, $link, $thumbwidth, $thumbheight); + echo "
    "; + + if ($image) + { + echo $thum_image . "
    "; + } + + echo "" . $row->product_name . "
    "; + + $productArr = $producthelper->getProductNetPrice($row->product_id); + $product_price_discount = $productArr['productPrice'] + $productArr['productVat']; + + $taxexempt_addtocart = RedshopHelperCart::taxExemptAddToCart(); + + if (!$row->not_for_sale && $show_price && $taxexempt_addtocart) + { + if (Redshop::getConfig()->get('SHOW_PRICE') && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && SHOW_QUOTATION_PRICE))) + { + if (!$product_price) + { + $product_price_dis = $producthelper->getPriceReplacement($product_price); + } + else + { + $product_price_dis = $producthelper->getProductFormattedPrice($product_price); + } + + $pricetext = ""; + $disply_text = "
    " . $product_price_dis . "
    "; + + if ($row->product_on_sale && $product_price_discount > 0) + { + if ($product_price > $product_price_discount) + { + $disply_text = ""; + $s_price = $product_price - $product_price_discount; + $tmpprcie = $product_price_discount; + + if ($show_discountpricelayout) + { + $pricetext = "
    "; + $pricetext .= "" . $producthelper->getProductFormattedPrice($product_price) . "
    "; + $pricetext .= "
    " . $producthelper->getProductFormattedPrice($product_price_discount) . "
    "; + $pricetext .= "
    " . JText::_('COM_REDSHOP_PRODCUT_PRICE_YOU_SAVED') . ' ' . $producthelper->getProductFormattedPrice($s_price) . "
    "; + } + else + { + $pricetext = "
    " . $producthelper->getProductFormattedPrice($product_price) . "
    "; + } + } + } + + echo $pricetext . $disply_text; + } + else + { + $product_price_dis = $producthelper->getPriceReplacement($product_price); + echo "
    " . $product_price_dis . "
    "; + } + } + + if ($show_readmore) + { + echo "
    " . JText::_('COM_REDSHOP_READ_MORE') . " "; + } + + if ($show_addtocart) + { + $addtocartform = Redshop\Cart\Render::replace($row->product_id); + echo "
    " . $addtocartform . "
    "; + } + + echo "
    "; ?> +
    " . JText::_('COM_REDSHOP_NO_PRODUCT_FOUND') . "
    diff --git a/component/site/views/price_filter/tmpl/index.html b/component/site/views/price_filter/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/price_filter/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/price_filter/view.raw.php b/component/site/views/price_filter/view.raw.php new file mode 100644 index 00000000000..dff439f44cd --- /dev/null +++ b/component/site/views/price_filter/view.raw.php @@ -0,0 +1,22 @@ +get('Data'); + + $this->prdlist = $prdlist; + + parent::display($tpl); + } +} diff --git a/component/site/views/product/index.html b/component/site/views/product/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/product/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/product/tmpl/compare.php b/component/site/views/product/tmpl/compare.php new file mode 100644 index 00000000000..03e0485a334 --- /dev/null +++ b/component/site/views/product/tmpl/compare.php @@ -0,0 +1,352 @@ +getCategoryId(); + +if (Redshop::getConfig()->get('PRODUCT_COMPARISON_TYPE') == 'category') +{ + $compareTemplate = $this->redTemplate->getTemplate( + 'compare_product', + Redshop\Product\Compare::getCategoryCompareTemplate($compareCategoryId) + ); +} +else +{ + $compareTemplate = $this->redTemplate->getTemplate("compare_product", Redshop::getConfig()->get('COMPARE_TEMPLATE_ID')); +} + +$template = "
    {compare_product_heading}
    {expand_collapse}
    Product Name{product_name}
    Image{product_image}
    Manufacturer{manufacturer_name}
    Discount Start
    {discount_start_date}
    Discount End
    {discount_end_date}
    Price{product_price}
    Short Desc
    {product_s_desc}
    Desc{product_desc}
    Rating{product_rating_summary}
    Delivery Time{product_delivery_time}
    Product Number
    {product_number}
    Stock
    {products_in_stock}
    Stock
    {product_stock_amount_image}
    Weight
    {product_weight}
    Length
    {product_length}
    Height
    {product_height}
    Width
    {product_width}
    Availability Date
    {product_availability_date}
    Volume
    {product_volume}
    Category
    {product_category}
    {remove}
    {add_to_cart}
    "; + +if (!empty($compareTemplate) && $compareTemplate[0]->template_desc != "") +{ + $template = $compareTemplate[0]->template_desc; +} + +$pagetitle = JText::_('COM_REDSHOP_COMPARE_PRODUCTS'); +$template = str_replace('{compare_product_heading}', $pagetitle, $template); + +$list = $compare->getItems(); +$total = $compare->getItemsTotal(); + +if ($total > 0) +{ + if ($total == 1) + { + JLog::add(JText::_('COM_REDSHOP_ADD_ONE_MORE_PRODUCT_TO_COMPARE'), JLog::NOTICE); + } + + $returnLink = JRoute::_("index.php?option=com_redshop&view=category&cid=" . $compareCategoryId . "&Itemid=" . $this->itemId); + + if ($this->input->getBool('print', false)) + { + $printTag = "" . JText::_("; + } + else + { + $printUrl = JURI::base() . "index.php?option=com_redshop&view=product&layout=compare&print=1&tmpl=component"; + $printTag = "" . JText::_("; + } + + $template = str_replace("{print}", $printTag, $template); + $template = str_replace('{compare_product_heading}', $pagetitle, $template); + $template = str_replace('{returntocategory_name}', JText::_("COM_REDSHOP_GO_BACK"), $template); + $template = str_replace('{returntocategory_link}', $returnLink, $template); + + $removeAll = '' + . JText::_('COM_REDSHOP_REMOVE_ALL_PRODUCT_FROM_COMPARE_LIST') + . ''; + $template = str_replace('{remove_all}', $removeAll, $template); + + // Make extrafield object.. + $field = extraField::getInstance(); + + $productTag = array(); + + if (!empty($compareTemplate)) + { + $productTag = Redshop\Helper\Utility::getProductTags(1, $template); + } + + $index = 0; + + foreach ($list as $data) + { + $product = RedshopHelperProduct::getProductById($data['item']->productId); + $tdStart = ''; + $tdEnd = ''; + + if ($index != ($total - 1)) + { + $tdStart = ""; + $tdEnd = ""; + } + + $expDiv = "
    "; + $divEnd = "
    "; + + $ItemData = $productHelper->getMenuInformation(0, 0, '', 'product&pid=' . $product->product_id); + + if (!empty($ItemData)) + { + $pItemid = $ItemData->id; + } + else + { + $catIdMain = $product->cat_in_sefurl; + $pItemid = RedshopHelperRouter::getItemId($product->product_id, $catIdMain); + } + + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $product->product_id . '&Itemid=' . $pItemid); + + $thumbUrl = RedshopHelperMedia::getImagePath( + $product->product_full_image, + '', + 'thumb', + 'product', + Redshop::getConfig()->get('COMPARE_PRODUCT_THUMB_WIDTH'), + Redshop::getConfig()->get('COMPARE_PRODUCT_THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $img = "
    get('COMPARE_PRODUCT_THUMB_HEIGHT') . "px;float: left;' >" + . "" + . "
    "; + + $expand = "-"; + + if ($index != ($total - 1)) + { + $template = str_replace('{expand_collapse}', $expand . $tdEnd . '' . "{expand_collapse}", $template); + } + else + { + $template = str_replace('{expand_collapse}', $expand . $tdEnd . $tdStart . "{expand_collapse}", $template); + } + + $template = str_replace('{product_name}', $expDiv . $product->product_name . $divEnd . $tdEnd . $tdStart . "{product_name}", $template); + $template = str_replace('{product_image}', $expDiv . $img . $divEnd . $tdEnd . $tdStart . "{product_image}", $template); + + if (strstr($template, "{manufacturer_name}")) + { + $manufacturer = RedshopEntityManufacturer::getInstance($product->manufacturer_id); + $manufacturerName = $manufacturer->get('name'); + $template = str_replace('{manufacturer_name}', $expDiv . $manufacturerName . $divEnd . $tdEnd . $tdStart . "{manufacturer_name}", $template); + } + + if (strstr($template, "{discount_start_date}")) + { + $discStartDate = ''; + + if ($product->discount_stratdate) + { + $discStartDate = $config->convertDateFormat($product->discount_stratdate); + } + + $template = str_replace('{discount_start_date}', $expDiv . $discStartDate . $divEnd . $tdEnd . $tdStart . "{discount_start_date}", $template); + } + + if (strstr($template, "{discount_end_date}")) + { + $discEndDate = ""; + + if ($product->discount_enddate) + { + $discEndDate = $config->convertDateFormat($product->discount_enddate); + } + + $template = str_replace('{discount_end_date}', $expDiv . $discEndDate . $divEnd . $tdEnd . $tdStart . "{discount_end_date}", $template); + } + + $template = str_replace('{product_s_desc}', $expDiv . $product->product_s_desc . $divEnd . $tdEnd . $tdStart . "{product_s_desc}", $template); + $template = str_replace('{product_desc}', $expDiv . $product->product_desc . $divEnd . $tdEnd . $tdStart . "{product_desc}", $template); + + $productNumberOutput = '' . $product->product_number . ''; + $template = str_replace('{product_number}', $expDiv . $product->product_number . $divEnd . $tdEnd . $tdStart . "{product_number}", $template); + + $productWeightUnit = '' . Redshop::getConfig()->get('DEFAULT_WEIGHT_UNIT') . ''; + $template = str_replace('{product_weight}', $expDiv . $productHelper->redunitDecimal($product->weight) . " " . $productWeightUnit . $divEnd . $tdEnd . $tdStart . "{product_weight}", $template); + + $productUnit = '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . ''; + $template = str_replace('{product_length}', $expDiv . $productHelper->redunitDecimal($product->product_length) . " " . $productUnit . $divEnd . $tdEnd . $tdStart . "{product_length}", $template); + $template = str_replace('{product_height}', $expDiv . $productHelper->redunitDecimal($product->product_height) . " " . $productUnit . $divEnd . $tdEnd . $tdStart . "{product_height}", $template); + $template = str_replace('{product_width}', $expDiv . $productHelper->redunitDecimal($product->product_width) . " " . $productUnit . $divEnd . $tdEnd . $tdStart . "{product_width}", $template); + + $productVolumeUnit = '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . "3" . ''; + $template = str_replace('{product_volume}', $expDiv . $productHelper->redunitDecimal($product->product_volume) . " " . $productVolumeUnit . $divEnd . $tdEnd . $tdStart . "{product_volume}", $template); + + if (strstr($template, "{product_price}")) + { + $price = 0; + + if (Redshop::getConfig()->get('SHOW_PRICE') + && !Redshop::getConfig()->get('USE_AS_CATALOG') + && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') + || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') + && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) + ) + { + $productPrices = $productHelper->getProductNetPrice($product->product_id); + $price = $productHelper->getProductFormattedPrice($productPrices['product_price']); + } + + $template = str_replace('{product_price}', $expDiv . $price . $divEnd . $tdEnd . $tdStart . "{product_price}", $template); + } + + if (strstr($template, "{product_rating_summary}")) + { + $finalAvgReviewData = Redshop\Product\Rating::getRating($data['item']->productId); + $template = str_replace('{product_rating_summary}', $expDiv . $finalAvgReviewData . $divEnd . $tdEnd . $tdStart . "{product_rating_summary}", $template); + } + + if (strstr($template, "{products_in_stock}") || strstr($template, "{product_stock_amount_image}")) + { + $productStock = RedshopHelperStockroom::getStockAmountWithReserve($data['item']->productId); + $template = str_replace('{products_in_stock}', $expDiv . $productStock . $divEnd . $tdEnd . $tdStart . "{products_in_stock}", $template); + + $stockamountList = RedshopHelperStockroom::getStockAmountImage($data['item']->productId, "product", $productStock); + $stockamountImage = ""; + + if (!empty($stockamountList)) + { + $stockamountImage = ''; + $stockamountImage .= '
    ' . JText::_('COM_REDSHOP_STOCK_AMOUNT') . '
    '; + $stockamountImage .= '
    ' . $stockamountList[0]->stock_amount_image_tooltip . '
    '; + $stockamountImage .= '' . $stockamountList[0]->stock_amount_image_tooltip . '
    '; + } + + $template = str_replace('{product_stock_amount_image}', $expDiv . $stockamountImage . $divEnd . $tdEnd . $tdStart . "{product_stock_amount_image}", $template); + } + + if (strstr($template, "{product_delivery_time}")) + { + $productDeliveryTime = $productHelper->getProductMinDeliveryTime($data['item']->productId); + $template = str_replace('{product_delivery_time}', $expDiv . $productDeliveryTime . $divEnd . $tdEnd . $tdStart . "{product_delivery_time}", $template); + } + + if (strstr($template, "{product_availability_date}")) + { + $availableDate = ""; + + if ($product->product_availability_date != "") + { + $availableDate = $config->convertDateFormat($product->product_availability_date); + } + + $template = str_replace('{product_availability_date}', $expDiv . $availableDate . $divEnd . $tdEnd . $tdStart . "{product_availability_date}", $template); + } + + if (strstr($template, "{product_category}")) + { + $categoriesId = explode(',', $data['item']->categoriesId); + + if (count($categoriesId) <= 1) + { + $category = RedshopEntityCategory::getInstance($data['item']->categoryId); + $categoryName = $category->get('name'); + + } + else + { + $categoriesName = array(); + + foreach ($categoriesId as $categoryId) + { + $category = RedshopEntityCategory::getInstance((int) $categoryId); + + if (!in_array($category->get('name'), $categoriesName)) + { + $categoriesName[] = $category->get('name'); + } + } + + $categoryName = implode(' ,', $categoriesName); + + } + + $template = str_replace('{product_category}', $expDiv . $categoryName . $divEnd . $tdEnd . $tdStart . "{product_category}", $template); + } + + $linkRemove = JUri::root() . 'index.php?option=com_redshop&view=product&task=removecompare&layout=compare&pid=' . $product->product_id . '&cid=' . $categoriesId[0] . '&Itemid=' . $this->itemId . '&tmpl=component'; + + $remove = "" . JText::_('COM_REDSHOP_REMOVE_PRODUCT_FROM_COMPARE_LIST') . ""; + $template = str_replace('{remove}', $expDiv . $remove . $divEnd . $tdEnd . $tdStart . "{remove}", $template); + + if (strstr($template, "{add_to_cart}")) + { + $addToCart = Redshop\Cart\Render::replace($data['item']->productId, 0, 0, 0, '{form_addtocart:add_to_cart1}'); + $template = str_replace('{add_to_cart}', $expDiv . $addToCart . $divEnd . $tdEnd . $tdStart . "{add_to_cart}", $template); + } + + // Extra field display + foreach ($productTag as $aProductTag) + { + $str = "'" . $aProductTag . "'"; + + if ($index != ($total - 1)) + { + $template = str_replace( + '{' . $aProductTag . '}', + $expDiv . '{' . $aProductTag . '}' . $divEnd . $tdEnd . $tdStart . '{addedext_tag}', + $template + ); + } + + $template = ExtraFields::displayExtraFields("1", $product->product_id, $str, $template); + $template = str_replace('{addedext_tag}', '{' . $aProductTag . '}', $template); + } + + $index++; + } + + $template = General::replaceBlank(array( + '{expand_collapse}', + '{product_name}', + '{product_image}', + '{manufacturer_name}', + '{discount_start_date}', + '{discount_end_date}', + '{product_price}', + '{product_s_desc}', + '{product_desc}', + '{product_rating_summary}', + '{product_delivery_time}', + '{product_number}', + '{products_in_stock}', + '{product_stock_amount_image}', + '{product_weight}', + '{product_length}', + '{product_height}', + '{product_width}', + '{product_availability_date}', + '{product_volume}', + '{product_category}', + '{remove}', + '{add_to_cart}' + ), $template); + + $template = $this->redTemplate->parseredSHOPplugin($template); +} +else +{ + $template = JText::_('COM_REDSHOP_NO_PRODUCTS_TO_COMPARE'); +} + +echo eval("?>" . $template . " + + + + + + + + diff --git a/component/site/views/product/tmpl/default.php b/component/site/views/product/tmpl/default.php new file mode 100644 index 00000000000..f23ec3b9a7c --- /dev/null +++ b/component/site/views/product/tmpl/default.php @@ -0,0 +1,1918 @@ +getScheme(); + +$watched = $this->session->get('watched_product', array()); + +if (in_array($this->pid, $watched) == 0) +{ + array_push($watched, $this->pid); + $this->session->set('watched_product', $watched); +} + +$print = $this->input->getBool('print', false); +$user = JFactory::getUser(); + +$extraField = extraField::getInstance(); +$producthelper = productHelper::getInstance(); +$redshopconfig = Redconfiguration::getInstance(); +$stockroomhelper = rsstockroomhelper::getInstance(); +$config = Redconfiguration::getInstance(); + +$template = $this->template; + +if (!empty($template) && !empty($template->template_desc)) +{ + $template_desc = $template->template_desc; +} +else +{ + $template_desc = "
    \r\n
    \r\n
    "; + $template_desc .= "{product_rating_summary}
    \r\n
    \r\n
    \r\n"; + $template_desc .= "
    {product_rating_summary}
    \r\n
    \r\n
    \r\n"; + $template_desc .= "
    \r\n
    {product_thumb_image}
    \r\n"; + $template_desc .= "
    {more_images}
    \r\n
    "; + $template_desc .= "{view_full_size_image_lbl}
    \r\n
    \r\n
    \r\n{attribute_template:attributes}"; + $template_desc .= "
    {accessory_template:accessory}
    \r\n"; + $template_desc .= "
    \r\n
    {product_price}
    \r\n
    \r\n
    \r\n"; + $template_desc .= "
    {form_addtocart:add_to_cart2}
    \r\n
    \r\n"; + $template_desc .= "
    \r\n
    "; + $template_desc .= "{delivery_time_lbl}: {product_delivery_time}
    \r\n
    \r\n
    \r\n"; + $template_desc .= "
    {bookmark}
    \r\n
    "; + $template_desc .= "{send_to_friend}
    \r\n
    \r\n
    \r\n
    \r\n
    "; + $template_desc .= "\r\n
    \r\n
    \r\n
    \r\n"; + $template_desc .= "
    {product_height_lbl}: {product_height}
    \r\n
    "; + $template_desc .= "x {product_width_lbl}: {product_width}
    \r\n
    x {product_length_lbl}: {product_length}
    \r\n"; + $template_desc .= "
    \r\n
    {manufacturer_link}
    \r\n"; + $template_desc .= "
    {form_rating}
    \r\n
    \r\n
    \r\n
    \r\n

    {product_name}

    \r\n"; + $template_desc .= "
    {product_s_desc}
    \r\n
    {product_desc}
    \r\n"; + $template_desc .= "\r\n
    \r\n
    \r\n"; + $template_desc .= "
    \r\n{product_rating}
    \r\n
    \r\n
    "; +} + +//Replace Product price when config enable discount is "No" +if (Redshop::getConfig()->getInt('DISCOUNT_ENABLE') == 0) +{ + $template_desc = str_replace('{product_old_price}', '', $template_desc); +} +?> + +
    +
    + data)) + { + if (!empty($this->data->pageheading)) + { + echo $this->escape($this->data->pageheading); + } + else + { + echo $this->escape($this->pageheadingtag); + } + } ?> +
    +
    +
    + +data->event->afterDisplayTitle; + +// Display before product data +echo $this->data->event->beforeDisplayProduct; + +/* + * Replace Discount Calculator Tag + */ +$discount_calculator = ""; + +if ($this->data->use_discount_calc) +{ + // Get discount calculator Template + $template_desc = str_replace('{discount_calculator}', $this->loadTemplate('calculator'), $template_desc); +} +else +{ + $template_desc = str_replace('{discount_calculator}', '', $template_desc); +} + +$template_desc = str_replace('{component_heading}', $this->escape($this->data->product_name), $template_desc); + +if (strstr($template_desc, '{back_link}')) +{ + $back_link = '' . JText::_('COM_REDSHOP_BACK') . ''; + $template_desc = str_replace('{back_link}', $back_link, $template_desc); +} + +$returnToCategoryLink = strstr($template_desc, '{returntocategory_link}'); +$returnToCategoryName = strstr($template_desc, '{returntocategory_name}'); +$returnToCategoryStr = strstr($template_desc, '{returntocategory}'); + +if ($returnToCategoryLink || $returnToCategoryName || $returnToCategoryStr) +{ + $returncatlink = ''; + $returntocategory = ''; + + if ($this->data->category_id) + { + $returncatlink = JRoute::_( + 'index.php?option=com_redshop&view=category&layout=detail&cid=' . $this->data->category_id . + '&Itemid=' . $this->itemId + ); + + $returntocategory = '' . Redshop::getConfig()->get('DAFULT_RETURN_TO_CATEGORY_PREFIX') . " " . $this->data->category_name . ''; + } + + $template_desc = str_replace('{returntocategory_link}', $returncatlink, $template_desc); + $template_desc = str_replace('{returntocategory_name}', $this->data->category_name, $template_desc); + $template_desc = str_replace('{returntocategory}', $returntocategory, $template_desc); +} + +if (strstr($template_desc, '{navigation_link_right}') || strstr($template_desc, '{navigation_link_left}')) +{ + $nextbutton = ''; + $prevbutton = ''; + + // Next Navigation + $nextproducts = $this->model->getPrevNextproduct($this->data->product_id, $this->data->category_id, 1); + + if (!empty($nextproducts)) + { + $nextlink = JRoute::_( + 'index.php?option=com_redshop&view=product&pid=' . $nextproducts->product_id . + '&cid=' . $this->data->category_id . + '&Itemid=' . $this->itemId + ); + + if ((int) Redshop::getConfig()->get('DEFAULT_LINK_FIND') === 0) + { + $nextbutton = '' . $nextproducts->product_name . "" . Redshop::getConfig()->get('DAFULT_NEXT_LINK_SUFFIX') . ''; + } + elseif ((int) Redshop::getConfig()->get('DEFAULT_LINK_FIND') == 1) + { + $nextbutton = '' . Redshop::getConfig()->get('CUSTOM_NEXT_LINK_FIND') . ''; + } + elseif (file_exists(REDSHOP_FRONT_IMAGES_RELPATH . Redshop::getConfig()->get('IMAGE_PREVIOUS_LINK_FIND'))) + { + $nextbutton = ''; + } + } + + // Start previous logic + $previousproducts = $this->model->getPrevNextproduct($this->data->product_id, $this->data->category_id, -1); + + if (!empty($previousproducts)) + { + $prevlink = JRoute::_( + 'index.php?option=com_redshop&view=product&pid=' . $previousproducts->product_id . + '&cid=' . $this->data->category_id . + '&Itemid=' . $this->itemId + ); + + if (Redshop::getConfig()->get('DEFAULT_LINK_FIND') === 0) + { + $prevbutton = '' . Redshop::getConfig()->get('DAFULT_PREVIOUS_LINK_PREFIX') . "" . $previousproducts->product_name . ''; + } + elseif (Redshop::getConfig()->get('DEFAULT_LINK_FIND') == 1) + { + $prevbutton = '' . Redshop::getConfig()->get('CUSTOM_PREVIOUS_LINK_FIND') . ''; + } + elseif (file_exists(REDSHOP_FRONT_IMAGES_RELPATH . Redshop::getConfig()->get('IMAGE_PREVIOUS_LINK_FIND'))) + { + $prevbutton = ''; + } + + // End + } + + $template_desc = str_replace('{navigation_link_right}', $nextbutton, $template_desc); + $template_desc = str_replace('{navigation_link_left}', $prevbutton, $template_desc); +} + +/* + * product size variables + */ +$product_volume = ""; +$product_volume .= '' . $producthelper->redunitDecimal($this->data->product_length) . ''; +$product_volume .= '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . ''; +$product_volume .= 'X'; +$product_volume .= '' . $producthelper->redunitDecimal($this->data->product_width) . ''; +$product_volume .= '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . ''; +$product_volume .= 'X'; +$product_volume .= '' . $producthelper->redunitDecimal($this->data->product_height) . ''; +$product_volume .= '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . ''; + +$template_desc = str_replace('{product_size}', $product_volume, $template_desc); + +if (Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT')) +{ + $product_unit = '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . ''; +} +else +{ + $product_unit = ''; +} + +// Product length +if ($this->data->product_length > 0) +{ + $template_desc = str_replace("{product_length_lbl}", JText::_('COM_REDSHOP_PRODUCT_LENGTH_LBL'), $template_desc); + + $insertStr = $producthelper->redunitDecimal($this->data->product_length) . " " . $product_unit; + $template_desc = str_replace('{product_length}', $insertStr, $template_desc); +} +else +{ + $template_desc = str_replace("{product_length_lbl}", "", $template_desc); + $template_desc = str_replace('{product_length}', "", $template_desc); +} + +// Product width +if ($this->data->product_width > 0) +{ + $template_desc = str_replace("{product_width_lbl}", JText::_('COM_REDSHOP_PRODUCT_WIDTH_LBL'), $template_desc); + + $insertStr = $producthelper->redunitDecimal($this->data->product_width) . " " . $product_unit; + $template_desc = str_replace('{product_width}', $insertStr, $template_desc); +} +else +{ + $template_desc = str_replace("{product_width_lbl}", "", $template_desc); + $template_desc = str_replace('{product_width}', "", $template_desc); +} + +// Product Height +if ($this->data->product_height > 0) +{ + $template_desc = str_replace("{product_height_lbl}", JText::_('COM_REDSHOP_PRODUCT_HEIGHT_LBL'), $template_desc); + + $insertStr = $producthelper->redunitDecimal($this->data->product_height) . " " . $product_unit; + $template_desc = str_replace('{product_height}', $insertStr, $template_desc); +} +else +{ + $template_desc = str_replace("{product_height_lbl}", "", $template_desc); + $template_desc = str_replace('{product_height}', "", $template_desc); +} + +// Product Diameter +if ($this->data->product_diameter > 0) +{ + $template_desc = str_replace("{product_diameter_lbl}", JText::_('COM_REDSHOP_PRODUCT_DIAMETER_LBL'), $template_desc); + $template_desc = str_replace("{diameter}", $producthelper->redunitDecimal($this->data->product_diameter) . " " . $product_unit, $template_desc); +} +else +{ + $template_desc = str_replace("{product_diameter_lbl}", "", $template_desc); + $template_desc = str_replace('{diameter}', "", $template_desc); +} + +// Product Volume +$product_volume_unit = '' . Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT') . "3" . ''; + +if ($this->data->product_volume > 0) +{ + $insertStr = JText::_('COM_REDSHOP_PRODUCT_VOLUME_LBL') . JText::_('COM_REDSHOP_PRODUCT_VOLUME_UNIT'); + $template_desc = str_replace("{product_volume_lbl}", $insertStr, $template_desc); + + $insertStr = $producthelper->redunitDecimal($this->data->product_volume) . " " . $product_volume_unit; + $template_desc = str_replace('{product_volume}', $insertStr, $template_desc); +} +else +{ + $template_desc = str_replace('{product_volume}', "", $template_desc); + $template_desc = str_replace("{product_volume_lbl}", "", $template_desc); +} + +// Replace Product Template +if ($print) +{ + $onclick = "onclick='window.print();'"; +} +else +{ + $print_url = $url . "index.php?option=com_redshop&view=product&pid=" . $this->data->product_id; + $print_url .= "&cid=" . $this->data->category_id . "&print=1&tmpl=component&Itemid=" . $this->itemId; + + $onclick = "onclick='window.open(\"$print_url\",\"mywindow\",\"scrollbars=1\",\"location=1\")'"; +} + +$print_tag = ""; +$print_tag .= "" . JText::_("; +$print_tag .= ""; + +// Associate_tag display update +$ass_tag = ''; + +if ($this->redHelper->isredProductfinder()) +{ + $associate_tag = $producthelper->getassociatetag($this->data->product_id); + + for ($k = 0, $kn = count($associate_tag); $k < $kn; $k++) + { + if ($associate_tag[$k] != '') + { + $ass_tag .= $associate_tag[$k]->type_name . " : " . $associate_tag[$k]->tag_name . "
    "; + } + } +} + +$template_desc = $producthelper->replaceVatinfo($template_desc); +$template_desc = str_replace("{associate_tag}", $ass_tag, $template_desc); +$template_desc = str_replace("{print}", $print_tag, $template_desc); +$template_desc = str_replace("{product_name}", $this->data->product_name, $template_desc); +$template_desc = str_replace("{product_id_lbl}", JText::_('COM_REDSHOP_PRODUCT_ID_LBL'), $template_desc); +$template_desc = str_replace("{product_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER_LBL'), $template_desc); +$template_desc = str_replace("{product_id}", $this->data->product_id, $template_desc); + +$template_desc = str_replace("{product_s_desc}", htmlspecialchars_decode($this->data->product_s_desc), $template_desc); +$template_desc = str_replace("{product_desc}", htmlspecialchars_decode($this->data->product_desc), $template_desc); +$template_desc = str_replace("{view_full_size_image_lbl}", JText::_('COM_REDSHOP_VIEW_FULL_SIZE_IMAGE_LBL'), $template_desc); + +if (strstr($template_desc, "{zoom_image}")) +{ + $sendlink = $url . 'components/com_redshop/assets/images/product/' . $this->data->product_full_image; + $send_image = " +
    " . JText::_('SEND_MAIL_IMAGE_LBL') . "
    "; + $template_desc = str_replace("{zoom_image}", $send_image, $template_desc); +} + +if (strstr($template_desc, "{product_category_list}")) +{ + $pcats = ""; + $prodCats = $producthelper->getProductCaterories($this->data->product_id, 1); + + foreach ($prodCats as $prodCat) + { + $pcats .= ''; + $pcats .= $prodCat->name; + $pcats .= "
    "; + } + + $template_desc = str_replace("{product_category_list}", $pcats, $template_desc); +} + +if (strpos($template_desc, "{manufacturer_image}") !== false) +{ + $manufacturerImage = ''; + $manufacturerMedia = RedshopEntityManufacturer::getInstance($this->data->manufacturer_id)->getMedia(); + + if ($manufacturerMedia->isValid() && !empty($manufacturerMedia->get('media_name')) + && JFile::exists(REDSHOP_MEDIA_IMAGE_RELPATH . 'manufacturer/' . $this->data->manufacturer_id . '/' . $manufacturerMedia->get('media_name'))) + { + $thumbHeight = Redshop::getConfig()->get('MANUFACTURER_THUMB_HEIGHT'); + $thumbWidth = Redshop::getConfig()->get('MANUFACTURER_THUMB_WIDTH'); + + if (Redshop::getConfig()->get('WATERMARK_MANUFACTURER_IMAGE') || Redshop::getConfig()->get('WATERMARK_MANUFACTURER_THUMB_IMAGE')) + { + $imagePath = RedshopHelperMedia::watermark( + 'manufacturer', + $manufacturerMedia->get('media_name'), + $thumbWidth, + $thumbHeight, + Redshop::getConfig()->get('WATERMARK_MANUFACTURER_IMAGE') + ); + } + else + { + $imagePath = RedshopHelperMedia::getImagePath( + $manufacturerMedia->get('media_name'), + '', + 'thumb', + 'manufacturer', + $thumbWidth, + $thumbHeight, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'), + 'manufacturer', + $this->data->manufacturer_id + ); + } + + $altText = $manufacturerMedia->get('media_alternate_text'); + + $manufacturerImage = "data->manufacturer_id . '/' . $manufacturerMedia->get('media_name') . "' rel=\"{handler: 'image', size: {}}\"> + " . $altText . ""; + } + + $template_desc = str_replace("{manufacturer_image}", $manufacturerImage, $template_desc); +} + +$product_weight_unit = '' . Redshop::getConfig()->get('DEFAULT_WEIGHT_UNIT') . ''; + +if ($this->data->weight > 0) +{ + $insertStr = $producthelper->redunitDecimal($this->data->weight) . " " . $product_weight_unit; + $template_desc = str_replace("{product_weight}", $insertStr, $template_desc); + $template_desc = str_replace("{product_weight_lbl}", JText::_('COM_REDSHOP_PRODUCT_WEIGHT_LBL'), $template_desc); +} +else +{ + $template_desc = str_replace("{product_weight}", "", $template_desc); + $template_desc = str_replace("{product_weight_lbl}", "", $template_desc); +} + +$template_desc = RedshopHelperStockroom::replaceStockroomAmountDetail($template_desc, $this->data->product_id); + +$template_desc = str_replace("{update_date}", $redshopconfig->convertDateFormat(strtotime($this->data->update_date)), $template_desc); + +if ($this->data->publish_date != '0000-00-00 00:00:00') +{ + $template_desc = str_replace("{publish_date}", $redshopconfig->convertDateFormat(strtotime($this->data->publish_date)), $template_desc); +} +else +{ + $template_desc = str_replace("{publish_date}", "", $template_desc); +} + +/* + * Conditional tag + * if product on discount : Yes + * {if product_on_sale} This product is on sale {product_on_sale end if} // OUTPUT : This product is on sale + * NO : // OUTPUT : Display blank + */ +$template_desc = $producthelper->getProductOnSaleComment($this->data, $template_desc); + +/* + * Conditional tag + * if product on discount : Yes + * {if product_special} This is a special product {product_special end if} // OUTPUT : This is a special product + * NO : // OUTPUT : Display blank + */ +$template_desc = $producthelper->getSpecialProductComment($this->data, $template_desc); + +$manuUrl = JRoute::_( + 'index.php?option=com_redshop&view=manufacturers&layout=detail&mid=' . $this->data->manufacturer_id . + '&Itemid=' . $this->itemId +); +$manufacturerLink = "" . JText::_("COM_REDSHOP_VIEW_MANUFACTURER") . ""; + +$manuUrl = JRoute::_( + 'index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $this->data->manufacturer_id . + '&Itemid=' . $this->itemId +); +$manufacturerPLink = "" . + JText::_("COM_REDSHOP_VIEW_ALL_MANUFACTURER_PRODUCTS") . " " . $this->data->manufacturer_name . + ""; + +$template_desc = str_replace("{manufacturer_link}", $manufacturerLink, $template_desc); +$template_desc = str_replace("{manufacturer_product_link}", $manufacturerPLink, $template_desc); +$template_desc = str_replace("{manufacturer_name}", $this->data->manufacturer_name, $template_desc); + +$supplier_name = ''; + +if ($this->data->supplier_id) +{ + $supplier_name = $this->model->getNameSupplierById($this->data->supplier_id); +} + +$template_desc = str_replace("{supplier_name}", $supplier_name, $template_desc); + +if (strstr($template_desc, "{product_delivery_time}")) +{ + $product_delivery_time = $producthelper->getProductMinDeliveryTime($this->data->product_id); + + if ($product_delivery_time != "") + { + $template_desc = str_replace("{delivery_time_lbl}", JText::_('COM_REDSHOP_DELIVERY_TIME'), $template_desc); + $template_desc = str_replace("{product_delivery_time}", $product_delivery_time, $template_desc); + } + else + { + $template_desc = str_replace("{delivery_time_lbl}", "", $template_desc); + $template_desc = str_replace("{product_delivery_time}", "", $template_desc); + } +} + +// Facebook I like Button +if (strstr($template_desc, "{facebook_like_button}")) +{ + $uri = JUri::getInstance(); + $facebook_link = urlencode(JFilterOutput::cleanText($uri->toString())); + $facebook_like = ''; + $template_desc = str_replace("{facebook_like_button}", $facebook_like, $template_desc); + + $jconfig = JFactory::getConfig(); + $sitename = $jconfig->get('sitename'); + + $this->document->setMetaData("og:url", JFilterOutput::cleanText($uri->toString())); + $this->document->setMetaData("og:type", "product"); + $this->document->setMetaData("og:site_name", $sitename); +} + +// Google I like Button +if (strstr($template_desc, "{googleplus1}")) +{ + JHTML::script('https://apis.google.com/js/plusone.js'); + $uri = JUri::getInstance(); + $google_like = ''; + $template_desc = str_replace("{googleplus1}", $google_like, $template_desc); +} + +if (strstr($template_desc, "{bookmark}")) +{ + $bookmark = ''; + $bookmark .= ''; + $bookmark .= 'Share'; + $bookmark .= ''; + $template_desc = str_replace("{bookmark}", $bookmark, $template_desc); +} + +// Extra field display +$extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(RedshopHelperExtrafields::SECTION_PRODUCT, null); +$template_desc = RedshopHelperProductTag::getExtraSectionTag($extraFieldName, $this->data->product_id, "1", $template_desc); + +// Product thumb image +if (strstr($template_desc, "{product_thumb_image_3}")) +{ + $pimg_tag = '{product_thumb_image_3}'; + $ph_thumb = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT_3'); + $pw_thumb = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_3'); +} +elseif (strstr($template_desc, "{product_thumb_image_2}")) +{ + $pimg_tag = '{product_thumb_image_2}'; + $ph_thumb = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT_2'); + $pw_thumb = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_2'); +} +elseif (strstr($template_desc, "{product_thumb_image_1}")) +{ + $pimg_tag = '{product_thumb_image_1}'; + $ph_thumb = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT'); + $pw_thumb = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE'); +} +else +{ + $pimg_tag = '{product_thumb_image}'; + $ph_thumb = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT'); + $pw_thumb = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE'); +} + +// More images +if (strstr($template_desc, "{more_images_3}")) +{ + $mpimg_tag = '{more_images_3}'; + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_3'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_3'); +} +elseif (strstr($template_desc, "{more_images_2}")) +{ + $mpimg_tag = '{more_images_2}'; + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_2'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_2'); +} +elseif (strstr($template_desc, "{more_images_1}")) +{ + $mpimg_tag = '{more_images_1}'; + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); +} +else +{ + $mpimg_tag = '{more_images}'; + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); +} + +// PRODUCT WRAPPER START +$wrapper = $producthelper->getWrapper($this->data->product_id, 0, 1); +$wrappertemplate = $this->redTemplate->getTemplate("wrapper_template"); + +if (strstr($template_desc, "{wrapper_template:")) +{ + for ($w = 0, $wn = count($wrappertemplate); $w < $wn; $w++) + { + if (strstr($template_desc, "{wrapper_template:" . $wrappertemplate [$w]->name . "}")) + { + $wrappertemplate_data = $wrappertemplate [$w]->template_desc; + $wrapper_start = explode("{product_wrapper_start}", $wrappertemplate_data); + + if (isset ($wrapper_start [1])) + { + $wrapper_start = explode("{product_wrapper_end}", $wrapper_start [1]); + $wrappertemplate_data = $wrapper_start [0]; + } + + $wrappertemplate_data .= ""; + $wrappertemplate_data .= ""; + $warray = array(); + $warray [0]->wrapper_id = 0; + $warray [0]->wrapper_name = JText::_('COM_REDSHOP_SELECT_WRAPPER'); + $wrapperimage_div = ""; + + if (Redshop::getConfig()->get('AUTO_SCROLL_WRAPPER')) + { + $wrapperimage_div .= ""; + } + + $wrapperimage_div .= ""; + + for ($i = 0, $in = count($wrapper); $i < $in; $i++) + { + $wrapper_vat = 0; + + if ($wrapper[$i]->wrapper_price > 0 && !strstr($template_desc, "{without_vat}")) + { + $wrapper_vat = $producthelper->getProducttax($this->data->product_id, $wrapper[$i]->wrapper_price); + } + + $wp = $wrapper[$i]->wrapper_price + $wrapper_vat; + $wp_withoutvat = $wrapper[$i]->wrapper_price; + + $wid = $wrapper[$i]->wrapper_id; + $title = " title='" . $wrapper[$i]->wrapper_name . "' "; + $alt = " alt='" . $wrapper[$i]->wrapper_name . "' "; + + if (Redshop::getConfig()->get('SHOW_PRICE') && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && SHOW_QUOTATION_PRICE))) + { + $wrapper[$i]->wrapper_name = $wrapper[$i]->wrapper_name . " (" . $producthelper->getProductFormattedPrice($wp) . ")"; + } + + $wrapperimage_div .= ""; + $wrappertemplate_data .= ""; + $wrappertemplate_data .= ""; + + if (!Redshop::getConfig()->get('AUTO_SCROLL_WRAPPER')) + { + if (($i + 1) % 3 == 0) + { + $wrapperimage_div .= ""; + } + } + } + + $wrapperimage_div .= "
    "; + + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "wrapper/" . $wrapper[$i]->wrapper_image)) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $wrapper[$i]->wrapper_image, + '', + 'thumb', + 'wrapper', + Redshop::getConfig()->get('DEFAULT_WRAPPER_THUMB_WIDTH'), + Redshop::getConfig()->get('DEFAULT_WRAPPER_THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $wrapperimage_div .= " + + "; + } + + if (strstr($wrappertemplate_data, "{wrapper_price}")) + { + $wrapperimage_div .= "
    "; + + if (Redshop::getConfig()->get('SHOW_PRICE') && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && SHOW_QUOTATION_PRICE))) + { + $wrapperimage_div .= $producthelper->getProductFormattedPrice($wp); + } + + $wrapperimage_div .= "
    "; + } + + $wrapperimage_div .= "
    "; + + if (Redshop::getConfig()->get('AUTO_SCROLL_WRAPPER')) + { + $wrapperimage_div .= "
    "; + } + + if (!empty($wrapper)) + { + $wrapper = array_merge($warray, $wrapper); + + $lists['wrapper_id'] = JHtml::_( + 'select.genericlist', + $wrapper, + 'wrapper_id', + 'class="inputbox" onchange="calculateTotalPrice(\'' . $this->data->product_id . '\',0);" ', + 'wrapper_id', + 'wrapper_name', + 0 + ); + + $wrappertemplate_data = str_replace("{wrapper_dropdown}", $lists ['wrapper_id'], $wrappertemplate_data); + $wrappertemplate_data = str_replace("{wrapper_image}", $wrapperimage_div, $wrappertemplate_data); + $wrappertemplate_data = str_replace("{wrapper_price}", "", $wrappertemplate_data); + $wrapper_checkbox = JText::_('COM_REDSHOP_Add_WRAPPER') . + ": "; + $wrappertemplate_data = str_replace("{wrapper_add_checkbox}", $wrapper_checkbox, $wrappertemplate_data); + $template_desc = str_replace("{wrapper_template:" . $wrappertemplate [$w]->name . "}", $wrappertemplate_data, $template_desc); + } + else + { + $template_desc = str_replace("{wrapper_template:" . $wrappertemplate [$w]->name . "}", "", $template_desc); + } + } + } +} + +// PRODUCT WRAPPER END + +if (strstr($template_desc, "{child_products}")) +{ + $parentproductid = $this->data->product_id; + + if ($this->data->product_parent_id != 0) + { + $parentproductid = $producthelper->getMainParentProduct($this->data->product_id); + } + + $frmChild = ""; + + if ($parentproductid != 0) + { + $productInfo = $producthelper->getProductById($parentproductid); + + // Get child products + $childproducts = $this->model->getAllChildProductArrayList(0, $parentproductid); + + if (!empty($childproducts)) + { + $childproducts = array_merge(array($productInfo), $childproducts); + + $display_text = (Redshop::getConfig()->get('CHILDPRODUCT_DROPDOWN') == "product_number") ? "product_number" : "product_name"; + + $selected = array($this->data->product_id); + + $lists['product_child_id'] = JHtml::_( + 'select.genericlist', + $childproducts, + 'pid', + 'class="inputbox" size="1" onchange="document.frmChild.submit();"', + 'product_id', + $display_text, + $selected + ); + + $frmChild .= "
    "; + $frmChild .= "
    " . JText::_('COM_REDSHOP_CHILD_PRODUCTS') . "
    "; + $frmChild .= "
    " . $lists ['product_child_id'] . "
    "; + $frmChild .= ""; + $frmChild .= ""; + $frmChild .= ""; + $frmChild .= ""; + $frmChild .= "
    "; + } + } + + $template_desc = str_replace("{child_products}", $frmChild, $template_desc); +} + +// Checking for child products +$childproduct = RedshopHelperProduct::getChildProduct($this->data->product_id); + +if (!empty($childproduct)) +{ + if (Redshop::getConfig()->get('PURCHASE_PARENT_WITH_CHILD') == 1) + { + $isChilds = false; + $attributes_set = array(); + + if ($this->data->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $this->data->attribute_set_id, 0, 1); + } + + $attributes = $producthelper->getProductAttribute($this->data->product_id); + $attributes = array_merge($attributes, $attributes_set); + } + else + { + $isChilds = true; + $attributes = array(); + } +} +else +{ + $isChilds = false; + $attributes_set = array(); + + if ($this->data->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $this->data->attribute_set_id, 0, 1); + } + + $attributes = $producthelper->getProductAttribute($this->data->product_id); + $attributes = array_merge($attributes, $attributes_set); +} + +$attribute_template = \Redshop\Template\Helper::getAttribute($template_desc); + +// Check product for not for sale +$template_desc = $producthelper->getProductNotForSaleComment($this->data, $template_desc, $attributes); + +// Replace product in stock tags +$template_desc = Redshop\Product\Stock::replaceInStock($this->data->product_id, $template_desc, $attributes, $attribute_template); + +// Product attribute Start +$totalatt = count($attributes); +$template_desc = RedshopHelperAttribute::replaceAttributeData($this->data->product_id, 0, 0, $attributes, $template_desc, $attribute_template, $isChilds); + +// Product attribute End + +$pr_number = $this->data->product_number; +$preselectedresult = array(); +$moreimage_response = ''; +$property_data = ''; +$subproperty_data = ''; +$attributeproductStockStatus = null; +$selectedpropertyId = 0; +$selectedsubpropertyId = 0; + +if (count($attributes) > 0 && count($attribute_template) > 0) +{ + for ($a = 0, $an = count($attributes); $a < $an; $a++) + { + $selectedId = array(); + $property = RedshopHelperProduct_Attribute::getAttributeProperties(0, $attributes[$a]->attribute_id); + + if ($attributes[$a]->text != "" && count($property) > 0) + { + for ($i = 0, $in = count($property); $i < $in; $i++) + { + if ($property[$i]->setdefault_selected) + { + $selectedId[] = $property[$i]->property_id; + $property_data .= $property[$i]->property_id; + + if ($i != (count($property) - 1)) + { + $property_data .= '##'; + } + } + } + + if (count($selectedId) > 0) + { + $selectedpropertyId = $selectedId[count($selectedId) - 1]; + $subproperty = RedshopHelperProduct_Attribute::getAttributeSubProperties(0, $selectedpropertyId); + $selectedId = array(); + + for ($sp = 0; $sp < count($subproperty); $sp++) + { + if ($subproperty[$sp]->setdefault_selected) + { + $selectedId[] = $subproperty[$sp]->subattribute_color_id; + $subproperty_data .= $subproperty[$sp]->subattribute_color_id; + + if ($sp != (count($subproperty) - 1)) + { + $subproperty_data .= '##'; + } + } + } + + if (count($selectedId) > 0) + { + $subproperty_data = implode('##', $selectedId); + $selectedsubpropertyId = $selectedId[count($selectedId) - 1]; + } + } + } + } + + $get['product_id'] = $this->data->product_id; + $get['main_imgwidth'] = $pw_thumb; + $get['main_imgheight'] = $ph_thumb; + $get['property_data'] = $property_data; + $get['subproperty_data'] = $subproperty_data; + $get['property_id'] = $selectedpropertyId; + $get['subproperty_id'] = $selectedsubpropertyId; + $pluginResults = array(); + + // Trigger plugin to get merge images. + $this->dispatcher->trigger('onBeforeImageLoad', array($get, &$pluginResults)); + + $preselectedresult = RedshopHelperProductTag::displayAdditionalImage( + $this->data->product_id, + 0, + 0, + $selectedpropertyId, + $selectedsubpropertyId, + $pw_thumb, + $ph_thumb, + 'product' + ); + + if (isset($pluginResults['mainImageResponse'])) + { + $preselectedresult['product_mainimg'] = $pluginResults['mainImageResponse']; + } + + $productAvailabilityDate = strstr($template_desc, "{product_availability_date}"); + $stockNotifyFlag = strstr($template_desc, "{stock_notify_flag}"); + $stockStatus = strstr($template_desc, "{stock_status"); + + if ($productAvailabilityDate || $stockNotifyFlag || $stockStatus) + { + $attributeproductStockStatus = $producthelper->getproductStockStatus( + $this->data->product_id, + $totalatt, + $selectedpropertyId, + $selectedsubpropertyId + ); + } + + $moreimage_response = $preselectedresult['response']; + $aHrefImageResponse = $preselectedresult['aHrefImageResponse']; + $aTitleImageResponse = $preselectedresult['aTitleImageResponse']; + + $mainImageResponse = $preselectedresult['product_mainimg']; + + $attrbimg = $preselectedresult['attrbimg']; + + if (!is_null($preselectedresult['pr_number']) && !empty($preselectedresult['pr_number'])) + { + $pr_number = $preselectedresult['pr_number']; + } +} +else +{ + $productAvailabilityDate = strstr($template_desc, "{product_availability_date}"); + $stockNotifyFlag = strstr($template_desc, "{stock_notify_flag}"); + $stockStatus = strstr($template_desc, "{stock_status"); + + if ($productAvailabilityDate || $stockNotifyFlag || $stockStatus) + { + $attributeproductStockStatus = $producthelper->getproductStockStatus($this->data->product_id, $totalatt); + } +} + +$template_desc = \Redshop\Helper\Stockroom::replaceProductStockData( + $this->data->product_id, + $selectedpropertyId, + $selectedsubpropertyId, + $template_desc, + $attributeproductStockStatus +); + +$product_number_output = '' . $pr_number . ''; +$template_desc = str_replace("{product_number}", $product_number_output, $template_desc); + +// Product accessory Start +$accessory = RedshopHelperAccessory::getProductAccessories(0, $this->data->product_id); +$totalAccessory = count($accessory); + +$template_desc = RedshopHelperProductAccessory::replaceAccessoryData($this->data->product_id, 0, $accessory, $template_desc, $isChilds); + +// Product accessory End + +if (strstr($template_desc, $mpimg_tag)) +{ + if ($moreimage_response != "") + { + $more_images = $moreimage_response; + } + else + { + $media_image = RedshopHelperMedia::getAdditionMediaImage($this->data->product_id, "product"); + $more_images = ''; + + for ($m = 0, $mn = count($media_image); $m < $mn; $m++) + { + $filename1 = REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $media_image[$m]->media_name; + + if ($media_image[$m]->media_name != $media_image[$m]->product_full_image && file_exists($filename1)) + { + $alttext = RedshopHelperMedia::getAlternativeText('product', $media_image[$m]->section_id, '', $media_image[$m]->media_id); + + if (!$alttext) + { + $alttext = $media_image [$m]->media_name; + } + + if ($media_image [$m]->media_name) + { + $thumb = $media_image [$m]->media_name; + + if (Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE')) + { + $pimg = $this->redHelper->watermark('product', $thumb, $mpw_thumb, $mph_thumb, Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE'), "1"); + $linkimage = $this->redHelper->watermark('product', $thumb, '', '', Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE'), "0"); + + $hoverimg_path = $this->redHelper->watermark( + 'product', + $thumb, + Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_WIDTH'), + Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_HEIGHT'), + Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE'), + '2' + ); + } + else + { + $pimg = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'product', + $mpw_thumb, + $mph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $linkimage = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $thumb; + + $hoverimg_path = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'product', + Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_WIDTH'), + Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + } + + if (Redshop::getConfig()->get('PRODUCT_ADDIMG_IS_LIGHTBOX')) + { + $more_images_div_start = ""; + $more_images .= $more_images_div_start; + $more_images .= "" . $alttext . ""; + $more_images_hrefend = ""; + } + else + { + if (Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE')) + { + $img_path = $this->redHelper->watermark('product', $thumb, $pw_thumb, $ph_thumb, Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE'), '0'); + } + else + { + $img_path = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'product', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + } + + $hovermore_images = $this->redHelper->watermark('product', $thumb, '', '', Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE'), '0'); + + $filename_org = REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $media_image[$m]->product_full_image; + + if (file_exists($filename_org)) + { + $thumb_original = $media_image[$m]->product_full_image; + } + else + { + $thumb_original = Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'); + } + + if (Redshop::getConfig()->get('WATERMARK_PRODUCT_THUMB_IMAGE')) + { + $img_path_org = $this->redHelper->watermark('product', $thumb_original, $pw_thumb, $ph_thumb, Redshop::getConfig()->get('WATERMARK_PRODUCT_THUMB_IMAGE'), '0'); + } + else + { + $img_path_org = RedshopHelperMedia::getImagePath( + $thumb_original, + '', + 'thumb', + 'product', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + } + + $hovermore_org = RedshopHelperMedia::getImagePath( + $thumb_original, + '', + 'thumb', + 'product', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $oimg_path = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'product', + $mpw_thumb, + $mph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $more_images_div_start = "
    "; + $more_images_div_end = "
    "; + $more_images .= $more_images_div_start; + $more_images .= '' . ""; + $more_images_hrefend = ""; + } + + if (Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_ENABLE')) + { + $more_images .= "" . $alttext . ""; + } + + $more_images .= $more_images_hrefend; + $more_images .= $more_images_div_end; + } + } + } + } + + $insertStr = "
    " . $more_images . "
    "; + $template_desc = str_replace($mpimg_tag, $insertStr, $template_desc); +} + +// More images end + +// More videos (youtube) +if (strstr($template_desc, "{more_videos}")) +{ + $media_product_videos = RedshopHelperMedia::getAdditionMediaImage($this->data->product_id, "product", "youtube"); + + if (count($attributes) > 0 && count($attribute_template) > 0) + { + for ($a = 0, $an = count($attributes); $a < $an; $a++) + { + $selectedId = array(); + $property = RedshopHelperProduct_Attribute::getAttributeProperties(0, $attributes[$a]->attribute_id); + + if ($attributes[$a]->text != "" && count($property) > 0) + { + for ($i = 0, $in = count($property); $i < $in; $i++) + { + if ($property[$i]->setdefault_selected) + { + $media_property_videos = RedshopHelperMedia::getAdditionMediaImage($property[$i]->property_id, "property", "youtube"); + $selectedId[] = $property[$i]->property_id; + } + } + + if (count($selectedId) > 0) + { + $selectedpropertyId = $selectedId[count($selectedId) - 1]; + $subproperty = RedshopHelperProduct_Attribute::getAttributeSubProperties(0, $selectedpropertyId); + $selectedId = array(); + + for ($sp = 0; $sp < count($subproperty); $sp++) + { + if ($subproperty[$sp]->setdefault_selected) + { + $media_subproperty_videos = RedshopHelperMedia::getAdditionMediaImage($subproperty[$sp]->subattribute_color_id, "subproperty", "youtube"); + $selectedId[] = $subproperty[$sp]->subattribute_color_id; + } + } + } + } + } + + } + + if (!empty($media_subproperty_videos)) + { + $media_videos = $media_subproperty_videos; + } + elseif (!empty($media_property_videos)) + { + $media_videos = $media_property_videos; + } + elseif (!empty($media_product_videos)) + { + $media_videos = $media_product_videos; + } + + $insertStr = ''; + + if (count($media_videos) > 0) + { + for ($m = 0, $mn = count($media_videos); $m < $mn; $m++) + { + $insertStr .= "
    "; + } + } + + $template_desc = str_replace("{more_videos}", $insertStr, $template_desc); +} +// More videos (youtube) end + +// More documents +if (strstr($template_desc, "{more_documents}")) +{ + $media_documents = RedshopHelperMedia::getAdditionMediaImage($this->data->product_id, "product", "document"); + $more_doc = ''; + + for ($m = 0, $mn = count($media_documents); $m < $mn; $m++) + { + $alttext = RedshopHelperMedia::getAlternativeText("product", $media_documents[$m]->section_id, "", $media_documents[$m]->media_id, "document"); + + if (!$alttext) + { + $alttext = $media_documents[$m]->media_name; + } + + if (JFile::exists(REDSHOP_FRONT_DOCUMENT_RELPATH . "product/" . $media_documents[$m]->media_name)) + { + $downlink = JURI::root() . 'index.php?tmpl=component&option=com_redshop&view=product&pid=' . $this->data->product_id . + '&task=downloadDocument&fname=' . $media_documents[$m]->media_name . + '&Itemid=' . $this->itemId; + $more_doc .= ""; + } + } + + $insertStr = "" . $more_doc . ""; + $template_desc = str_replace("{more_documents}", $insertStr, $template_desc); +} + +// More documents end + +$hidden_thumb_image = " + "; +$link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $this->data->product_id); + +// Product image +$thum_image = "
    " . + Redshop\Product\Image\Image::getImage($this->data->product_id, $link, $pw_thumb, $ph_thumb, Redshop::getConfig()->get('PRODUCT_DETAIL_IS_LIGHTBOX'), 0, 0, $preselectedresult) . + "
    "; + +$template_desc = str_replace($pimg_tag, $thum_image . $hidden_thumb_image, $template_desc); +// Product image end + +$template_desc = $producthelper->getJcommentEditor($this->data, $template_desc); + +// ProductFinderDatepicker Extra Field Start + +$fieldArray = $extraField->getSectionFieldList(17, 0, 0); +$template_desc = $producthelper->getProductFinderDatepickerValue($template_desc, $this->data->product_id, $fieldArray); + +// ProductFinderDatepicker Extra Field End + +// Product User Field Start +$count_no_user_field = 0; +$returnArr = $producthelper->getProductUserfieldFromTemplate($template_desc); +$template_userfield = $returnArr[0]; +$userfieldArr = $returnArr[1]; + +if (strstr($template_desc, "{if product_userfield}") && strstr($template_desc, "{product_userfield end if}") && $template_userfield != "") +{ + $ufield = ""; + $cart = $this->session->get('cart'); + + if (isset($cart['idx'])) + { + $idx = (int) ($cart['idx']); + } + + $idx = 0; + $cart_id = ''; + + for ($j = 0; $j < $idx; $j++) + { + if ($cart[$j]['product_id'] == $this->data->product_id) + { + $cart_id = $j; + } + } + + for ($ui = 0; $ui < count($userfieldArr); $ui++) + { + if (!$idx) + { + $cart_id = ""; + } + + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', $cart_id, 0, $this->data->product_id); + + $ufield .= $productUserFields[1]; + + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + $template_desc = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $template_desc); + $template_desc = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $template_desc); + } + + $productUserFieldsForm = "
    "; + + if ($ufield != "") + { + $template_desc = str_replace("{if product_userfield}", $productUserFieldsForm, $template_desc); + $template_desc = str_replace("{product_userfield end if}", "
    ", $template_desc); + } + else + { + $template_desc = str_replace("{if product_userfield}", "", $template_desc); + $template_desc = str_replace("{product_userfield end if}", "", $template_desc); + } +} + +// Product User Field End + +// Category front-back image tag... +if (strstr($template_desc, "{category_product_img}")) +{ + $mainsrcPath = RedshopHelperMedia::getImagePath( + $this->data->category_full_image, + '', + 'thumb', + 'category', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $backsrcPath = RedshopHelperMedia::getImagePath( + $this->data->category_back_full_image, + '', + 'thumb', + 'category', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $ahrefpath = REDSHOP_FRONT_IMAGES_ABSPATH . "category/" . $this->data->category_full_image; + $ahrefbackpath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $this->data->category_back_full_image; + + $product_front_image_link = "" . + JText::_('COM_REDSHOP_FRONT_IMAGE') . + ""; + $product_back_image_link = "" . + JText::_('COM_REDSHOP_BACK_IMAGE') . + ""; + + $template_desc = str_replace("{category_front_img_link}", $product_front_image_link, $template_desc); + $template_desc = str_replace("{category_back_img_link}", $product_back_image_link, $template_desc); + + // Display category front image + $thum_catimage = $producthelper->getProductCategoryImage( + $this->data->product_id, + $this->data->category_full_image, + '', + $pw_thumb, $ph_thumb, + Redshop::getConfig()->get('PRODUCT_DETAIL_IS_LIGHTBOX') + ); + $template_desc = str_replace("{category_product_img}", $thum_catimage, $template_desc); + + // Category front-back image tag end +} +else +{ + $template_desc = str_replace("{category_front_img_link}", "", $template_desc); + $template_desc = str_replace("{category_back_img_link}", "", $template_desc); + $template_desc = str_replace("{category_product_img}", "", $template_desc); +} + +if (strstr($template_desc, "{front_img_link}") || strstr($template_desc, "{back_img_link}")) +{ + // Front-back image tag... + if ($this->data->product_thumb_image) + { + $mainsrcPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $this->data->product_thumb_image; + } + else + { + $mainsrcPath = RedshopHelperMedia::getImagePath( + $this->data->product_full_image, + '', + 'thumb', + 'product', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + } + + if ($this->data->product_back_thumb_image) + { + $backsrcPath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $this->data->product_back_thumb_image; + } + else + { + $backsrcPath = RedshopHelperMedia::getImagePath( + $this->data->product_back_full_image, + '', + 'thumb', + 'product', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + } + + $ahrefpath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $this->data->product_full_image; + $ahrefbackpath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $this->data->product_back_full_image; + + $product_front_image_link = "" . + JText::_('COM_REDSHOP_FRONT_IMAGE') . + ""; + $product_back_image_link = "" . + JText::_('COM_REDSHOP_BACK_IMAGE') . + ""; + + $template_desc = str_replace("{front_img_link}", $product_front_image_link, $template_desc); + $template_desc = str_replace("{back_img_link}", $product_back_image_link, $template_desc); +} +else +{ + $template_desc = str_replace("{front_img_link}", "", $template_desc); + $template_desc = str_replace("{back_img_link}", "", $template_desc); +} + +// Front-back image tag end + +// Product preview image. +if (strstr($template_desc, "{product_preview_img}")) +{ + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $this->data->product_preview_image)) + { + $previewsrcPath = RedshopHelperMedia::getImagePath( + $this->data->product_preview_image, + '', + 'thumb', + 'product', + Redshop::getConfig()->get('PRODUCT_PREVIEW_IMAGE_WIDTH'), + Redshop::getConfig()->get('PRODUCT_PREVIEW_IMAGE_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $previewImg = ""; + $template_desc = str_replace("{product_preview_img}", $previewImg, $template_desc); + } + else + { + $template_desc = str_replace("{product_preview_img}", "", $template_desc); + } +} + +// Cart +$template_desc = Redshop\Cart\Render::replace( + $this->data->product_id, + $this->data->category_id, + 0, + 0, + $template_desc, + $isChilds, + $userfieldArr, + $totalatt, + $totalAccessory, + $count_no_user_field +); + +$template_desc = str_replace("{ajaxwishlist_icon}", '', $template_desc); + +// Replace wishlistbutton +$template_desc = $producthelper->replaceWishlistButton($this->data->product_id, $template_desc); + +// Replace compare product button +$template_desc = Redshop\Product\Compare::replaceCompareProductsButton($this->data->product_id, $this->data->category_id, $template_desc); + +// Ajax detail box template +$ajaxdetail_templatedata = \Redshop\Template\Helper::getAjaxDetailBox($this->data); + +if (null !== $ajaxdetail_templatedata) +{ + $template_desc = str_replace("{ajaxdetail_template:" . $ajaxdetail_templatedata->name . "}", "", $template_desc); +} + +// Checking if user logged in then only enabling review button +$reviewform = ""; + +if (($user->id && Redshop::getConfig()->get('RATING_REVIEW_LOGIN_REQUIRED')) || !Redshop::getConfig()->get('RATING_REVIEW_LOGIN_REQUIRED')) +{ + // Write Review link with the products + if (strstr($template_desc, "{form_rating_without_lightbox}")) + { + $reviewlink = JURI::root() . 'index.php?option=com_redshop&view=product_rating&rate=1&product_id=' . $this->data->product_id . + '&category_id=' . $this->data->category_id . + '&Itemid=' . $this->itemId; + $reviewform = '' . JText::_('WRITE_REVIEW') . ''; + $template_desc = str_replace("{form_rating_without_lightbox}", $reviewform, $template_desc); + } + + if (strstr($template_desc, "{form_rating}")) + { + $reviewlink = ""; + $reviewform = ""; + $reviewlink = JURI::root() . 'index.php?option=com_redshop&view=product_rating&tmpl=component&product_id=' . $this->data->product_id . + '&category_id=' . $this->data->category_id . + '&Itemid=' . $this->itemId; + $reviewform = '' . + JText::_('COM_REDSHOP_WRITE_REVIEW') . + ''; + $template_desc = str_replace("{form_rating}", $reviewform, $template_desc); + } +} +else +{ + $reviewform = JText::_('COM_REDSHOP_YOU_NEED_TO_LOGIN_TO_POST_A_REVIEW'); + + if (strstr($template_desc, "{form_rating_without_lightbox}")) + { + $template_desc = str_replace("{form_rating_without_lightbox}", $reviewform, $template_desc); + } + + if (strstr($template_desc, "{form_rating}")) + { + $template_desc = str_replace("{form_rating}", $reviewform, $template_desc); + } +} + +$template_desc = str_replace("{form_rating}", $reviewform, $template_desc); + +// Product Review/Rating +if (strstr($template_desc, "{product_rating_summary}")) +{ + $final_avgreview_data = Redshop\Product\Rating::getRating($this->data->product_id); + + if ($final_avgreview_data != "") + { + $template_desc = str_replace("{product_rating_summary}", $final_avgreview_data, $template_desc); + } + else + { + $template_desc = str_replace("{product_rating_summary}", '', $template_desc); + } +} + +if (strstr($template_desc, "{product_rating}")) +{ + if ((int) Redshop::getConfig()->get('FAVOURED_REVIEWS') !== 0) + { + $mainblock = Redshop::getConfig()->get('FAVOURED_REVIEWS'); + } + else + { + $mainblock = 5; + } + + $main_template = $this->redTemplate->getTemplate("review"); + + if (count($main_template) > 0 && $main_template[0]->template_desc) + { + $main_template = $main_template[0]->template_desc; + } + else + { + $main_template = "
    {product_loop_start}

    {product_title}

    {review_loop_start}
    "; + $main_template .= "
    {fullname}
    {title}
    "; + $main_template .= "
    {comment}
    {stars}
    "; + $main_template .= "
    {review_loop_end}
    {product_loop_end}
    "; + } + + // Fetching reviews + $reviews = $producthelper->getProductReviewList($this->data->product_id); + $reviews_template = ""; + $product_template = ""; + + if (strstr($main_template, "{product_loop_start}") && strstr($main_template, "{product_loop_end}")) + { + $product_start = explode("{product_loop_start}", $main_template); + $product_end = explode("{product_loop_end}", $product_start [1]); + $product_template = $product_end [0]; + + if (strstr($main_template, "{product_loop_start}") && strstr($main_template, "{product_loop_end}")) + { + $review_start = explode("{review_loop_start}", $product_template); + $review_end = explode("{review_loop_end}", $review_start [1]); + $reviews_template = $review_end [0]; + } + } + + $product_data = ''; + $reviews_all = ''; + + if ($product_template != "" && $reviews_template != "" && count($reviews) > 0) + { + $product_data .= str_replace("{product_title}", '', $product_template); + + $reviews_data1 = ""; + $reviews_data2 = ""; + $reviews_data = ""; + + for ($j = 0; $j < $mainblock && $j < count($reviews); $j++) + { + $fullname = $reviews[$j]->firstname . " " . $reviews[$j]->lastname; + $starimage = ''; + + if ($fullname != " ") + { + $displayname = $fullname; + } + else + { + $displayname = $reviews[$j]->username; + } + + $reviews_data1 = str_replace("{fullname}", $displayname, $reviews_template); + $reviews_data1 = str_replace("{email}", $reviews[$j]->email, $reviews_data1); + $reviews_data1 = str_replace("{company_name}", $reviews[$j]->company_name, $reviews_data1); + $reviews_data1 = str_replace("{title}", $reviews [$j]->title, $reviews_data1); + $reviews_data1 = str_replace("{comment}", nl2br($reviews [$j]->comment), $reviews_data1); + $reviews_data1 = str_replace("{stars}", $starimage, $reviews_data1); + $reviews_data1 = str_replace("{reviewdate}", $redshopconfig->convertDateFormat($reviews [$j]->time), $reviews_data1); + $reviews_data .= $reviews_data1; + } + + if ($mainblock < count($reviews)) + { + $reviews_data .= ''; + } + + $reviews_data .= ''; + $reviews_all .= $reviews_data; + } + + $product_data = str_replace("{review_loop_start}" . $reviews_template . "{review_loop_end}", $reviews_all, $product_data); + $main_template = str_replace("{product_loop_start}" . $product_template . "{product_loop_end}", $product_data, $main_template); + + $template_desc = str_replace("{product_rating}", $main_template, $template_desc); +} + +// Send to friend +$rlink = JURI::root() . 'index.php?option=com_redshop&view=send_friend&pid=' . $this->data->product_id . '&tmpl=component&Itemid=' . $this->itemId; +$send_friend_link = '' . JText::_('COM_REDSHOP_SEND_FRIEND') . ''; +$template_desc = str_replace("{send_to_friend}", $send_friend_link, $template_desc); + +// Ask question about this product +if (strstr($template_desc, "{ask_question_about_product}")) +{ + $asklink = JURI::root() . 'index.php?option=com_redshop&view=ask_question&pid=' . $this->data->product_id . + '&tmpl=component&Itemid=' . $this->itemId; + $ask_question_link = '' . + JText::_('COM_REDSHOP_ASK_QUESTION_ABOUT_PRODUCT') . + ''; + $template_desc = str_replace("{ask_question_about_product}", $ask_question_link, $template_desc); +} + +// Product subscription type +if (strstr($template_desc, "{subscription}") || strstr($template_desc, "{product_subscription}")) +{ + if ($this->data->product_type == 'subscription') + { + $subscription = $producthelper->getSubscription($this->data->product_id); + $subscription_data = ""; + $subscription_data .= ""; + $subscription_data .= ""; + + for ($sub = 0; $sub < count($subscription); $sub++) + { + $subscription_data .= ""; + $subscription_data .= ""; + $subscription_data .= ""; + $subscription_data .= ""; + $subscription_data .= ""; + } + + $subscription_data .= "
    " . JText::_('COM_REDSHOP_SUBSCRIPTION_PERIOD') . "" . JText::_('COM_REDSHOP_SUBSCRIPTION_PRICE') . "" . JText::_('COM_REDSHOP_SUBSCRIBE') . "
    " . $subscription [$sub]->subscription_period . " " . $subscription [$sub]->period_type . "" . $producthelper->getProductFormattedPrice($subscription [$sub]->subscription_price) . ""; + $subscription_data .= ""; + $subscription_data .= "subscription_id . ",this.value, " . $this->data->product_id . + ")\" />
    "; + $template_desc = str_replace("{subscription}", $subscription_data, $template_desc); + $template_desc = str_replace("{product_subscription}", $subscription_data, $template_desc); + } + else + { + $template_desc = str_replace("{subscription}", "", $template_desc); + $template_desc = str_replace("{product_subscription}", "", $template_desc); + } +} + +// Product subscription type ene here + +// PRODUCT QUESTION START +if (strstr($template_desc, "{question_loop_start}") && strstr($template_desc, "{question_loop_end}")) +{ + $qstart = $template_desc; + $qmiddle = ""; + $qend = ""; + $question_start = explode("{question_loop_start}", $template_desc); + + if (count($question_start) > 0) + { + $qstart = $question_start [0]; + $question_end = explode("{question_loop_end}", $question_start [1]); + + if (count($question_end) > 1) + { + $qmiddle = $question_end [0]; + $qend = $question_end [1]; + } + } + + $product_question = $producthelper->getQuestionAnswer(0, $this->data->product_id, 0, 1); + $questionloop = ""; + + if ($qmiddle != "") + { + for ($q = 0, $qn = count($product_question); $q < $qn; $q++) + { + $qloop = str_replace("{question}", $product_question [$q]->question, $qmiddle); + $qloop = str_replace("{question_date}", $config->convertDateFormat($product_question [$q]->question_date), $qloop); + $qloop = str_replace("{question_owner}", $product_question [$q]->user_name, $qloop); + + $astart = $qloop; + $amiddle = ""; + $aend = ""; + $answer_start = explode("{answer_loop_start}", $qloop); + + if (count($answer_start) > 0) + { + $astart = $answer_start [0]; + $answer_end = explode("{answer_loop_end}", $answer_start [1]); + + if (count($answer_end) > 0) + { + $amiddle = $answer_end [0]; + $aend = $answer_end [1]; + } + } + + $product_answer = $producthelper->getQuestionAnswer($product_question [$q]->id, 0, 1, 1); + $answerloop = ""; + + for ($a = 0, $an = count($product_answer); $a < $an; $a++) + { + $aloop = str_replace("{answer}", $product_answer [$a]->question, $amiddle); + $aloop = str_replace("{answer_date}", $config->convertDateFormat($product_answer [$a]->question_date), $aloop); + $aloop = str_replace("{answer_owner}", $product_answer [$a]->user_name, $aloop); + + $answerloop .= $aloop; + } + + $questionloop .= $astart . $answerloop . $aend; + } + } + + $template_desc = $qstart . $questionloop . $qend; +} + +// PRODUCT QUESTION END + +$my_tags = ''; + +if (Redshop::getConfig()->get('MY_TAGS') != 0 && $user->id && strstr($template_desc, "{my_tags_button}")) +{ + // Product Tags - New Feature Like Magento Store + $my_tags .= "
    " . JText::_('COM_REDSHOP_PRODUCT_TAGS') . "
    "; + $my_tags .= "
    " . JText::_('COM_REDSHOP_ADD_YOUR_TAGS') . "
    "; + $my_tags .= "
    + + + + + + + +
    " . JText::_('COM_REDSHOP_TAG_NAME') . "
    " . JText::_('COM_REDSHOP_TIP_TAGS') . "
    + + + + + +
    "; + $my_tags .= "
    "; + $my_tags .= "
    "; + + // End Product Tags +} + +$template_desc = str_replace("{my_tags_button}", $my_tags, $template_desc); + +$template_desc = str_replace("{with_vat}", "", $template_desc); +$template_desc = str_replace("{without_vat}", "", $template_desc); + +$template_desc = str_replace("{attribute_price_with_vat}", "", $template_desc); +$template_desc = str_replace("{attribute_price_without_vat}", "", $template_desc); + +// Replace Minimum quantity per order +$minOrderProductQuantity = ''; + +if ((int) $this->data->min_order_product_quantity > 0) +{ + $minOrderProductQuantity = $this->data->min_order_product_quantity; +} + +$template_desc = str_replace( + '{min_order_product_quantity}', + $minOrderProductQuantity, + $template_desc +); + +$template_desc = $this->redTemplate->parseredSHOPplugin($template_desc); + +$template_desc = $this->textHelper->replace_texts($template_desc); + +$template_desc = $producthelper->getRelatedtemplateView($template_desc, $this->data->product_id); + +// Replacing ask_question_about_product_without_lightbox must be after parseredSHOPplugin for not replace in cloak plugin form emails +if (strstr($template_desc, '{ask_question_about_product_without_lightbox}')) +{ + $displayData = array( + 'form' => RedshopModelForm::getInstance('Ask_Question', 'RedshopModel')->getForm(), + 'ask' => 1 + ); + $template_desc = str_replace('{ask_question_about_product_without_lightbox}', RedshopLayoutHelper::render('product.ask_question', $displayData), $template_desc); +} + +// Replacing form_rating_without_link must be after parseredSHOPplugin for not replace in cloak plugin form emails +if (strstr($template_desc, '{form_rating_without_link}')) +{ + $form = RedshopModelForm::getInstance( + 'Product_Rating', + 'RedshopModel', + array( + 'context' => 'com_redshop.edit.product_rating.' . $this->data->product_id + ) + ) + ->getForm(); + $displayData = array( + 'form' => $form, + 'modal' => 0, + 'product_id' => $this->data->product_id + ); + $template_desc = str_replace('{form_rating_without_link}', RedshopLayoutHelper::render('product.product_rating', $displayData), $template_desc); +} + +/** + * Trigger event onAfterDisplayProduct will display content after product display. + * Will we change only $template_desc inside a plugin, that's why only $template_desc should be + * passed by reference. + */ +$this->dispatcher->trigger('onAfterDisplayProduct', array(&$template_desc, $this->params, $this->data)); + +echo eval("?>" . $template_desc . " + + diff --git a/component/site/views/product/tmpl/default.xml b/component/site/views/product/tmpl/default.xml new file mode 100644 index 00000000000..a4340e70738 --- /dev/null +++ b/component/site/views/product/tmpl/default.xml @@ -0,0 +1,19 @@ + + + + + + + + +
    + + +
    +
    +
    diff --git a/component/site/views/product/tmpl/default_calculator.php b/component/site/views/product/tmpl/default_calculator.php new file mode 100644 index 00000000000..7813513a8c2 --- /dev/null +++ b/component/site/views/product/tmpl/default_calculator.php @@ -0,0 +1,86 @@ +data->discount_calc_method; + +// Default calculation unit + +// Calculation prices as per various area +$discount_calc_data = $rsCarthelper->getDiscountCalcData(0, $this->data->product_id); + +// Calculation UNIT +$calcoption = array(); +$calcoption[] = JHTML::_('select.option', 'mm', JText::_('COM_REDSHOP_MILLIMETER')); +$calcoption[] = JHTML::_('select.option', 'cm', JText::_('COM_REDSHOP_CENTIMETER')); +$calcoption[] = JHTML::_('select.option', 'm', JText::_('COM_REDSHOP_METER')); +$discount_calc_unit = JHTML::_('select.genericlist', $calcoption, 'discount_calc_unit', 'class="inputbox" size="1" ', 'value', 'text', Redshop::getConfig()->get('DEFAULT_VOLUME_UNIT')); +unset($calcoption); + +$height = ""; +$width = ""; +$depth = ""; +$radius = ""; +$calculate = " "; +$calculate .= ''; +$hiddenVar = " + "; + +$calc_output = ""; + +$calc_output .= ""; + +switch ($calcMethod) +{ + case "volume": + $calc_output .= $height; + $calc_output .= $width; + $calc_output .= $depth; + break; + + case "area": + $calc_output .= $depth; + $calc_output .= $width; + break; + + case "circumference": + $calc_output .= $radius; + break; +} + +$pdc_extra_output = ""; +$pdc_extra_datas = $rsCarthelper->getDiscountCalcDataExtra("", $this->data->product_id); + +for ($p = 0, $pn = count($pdc_extra_datas); $p < $pn; $p++) +{ + $pdc_extra_data = $pdc_extra_datas[$p]; + $option_name = $pdc_extra_data->option_name; + $pdcextra_id = $pdc_extra_data->pdcextra_id; + $pdcprice = $pdc_extra_data->price; + $pdcoprand = $pdc_extra_data->oprand; + + $pdcstring = $option_name . ' (' . $pdcoprand . ' ' . $pdcprice . ' )'; + + $pdc_extra_output .= ""; + $pdc_extra_output .= ''; + $pdc_extra_output .= ""; +} + +$calc_output .= $pdc_extra_output . $calculate . $hiddenVar; +$calc_output .= "
    " . $discount_calc_unit . "
    ' . $pdcstring . '
    "; + +echo $calc_output; diff --git a/component/site/views/product/tmpl/default_cartbox.php b/component/site/views/product/tmpl/default_cartbox.php new file mode 100644 index 00000000000..12d9ff1726b --- /dev/null +++ b/component/site/views/product/tmpl/default_cartbox.php @@ -0,0 +1,50 @@ +redHelper->getCartItemid(); + +$cart_template = ""; +$ajax_template = $this->redTemplate->getTemplate("ajax_cart_box"); + +if (count($ajax_template) > 0 && $ajax_template[0]->template_desc) +{ + $cart_template = $ajax_template[0]->template_desc; +} +else +{ + $cart_template = "
    \r\n
    {ajax_cart_box_title}
    {show_cart_text}
    \r\n
    \r\n
    \r\n
    {continue_shopping_button}
    \r\n
    {show_cart_button}
    \r\n
    \r\n
    \r\n
    "; +} + +$cart_template = str_replace("{ajax_cart_box_title}", JText::_('COM_REDSHOP_CART_SAVE'), $cart_template); +$cart_template = str_replace("{show_cart_text}", JText::_('COM_REDSHOP_SHOW_CART_TEXT'), $cart_template); + +$viewbutton = ''; + +/* + * continue redirection link + */ +if (Redshop::getConfig()->get('CONTINUE_REDIRECT_LINK') != '') +{ + $shopmorelink = JRoute::_(Redshop::getConfig()->get('CONTINUE_REDIRECT_LINK')); + $countinuebutton = ''; +} +else +{ + $shopmorelink = $_SERVER['HTTP_REFERER']; + $countinuebutton = ''; +} + +$cart_template = str_replace("{show_cart_button}", $viewbutton, $cart_template); +$cart_template = str_replace("{continue_shopping_button}", $countinuebutton, $cart_template); + +echo eval("?>" . $cart_template . "close(); diff --git a/component/site/views/product/tmpl/default_related.php b/component/site/views/product/tmpl/default_related.php new file mode 100644 index 00000000000..f6255e852f2 --- /dev/null +++ b/component/site/views/product/tmpl/default_related.php @@ -0,0 +1,165 @@ +getRelatedProduct($this->pid); +$template = $this->input->getString('template', ''); +$relptemplate = $this->redTemplate->getTemplate("related_product", 0, $template); +$related_template = $relptemplate[0]->template_desc; + +if (count($relptemplate) > 0) +{ + $related_template_data = ''; + $product_start = explode("{related_product_start}", $related_template); + $product_end = explode("{related_product_end}", $product_start [1]); + + $tempdata_div_start = $product_start [0]; + $tempdata_div_middle = $product_end [0]; + $tempdata_div_end = $product_end [1]; + + $extra_field = extraField::getInstance(); + $fieldArray = $extra_field->getSectionFieldList(17, 0, 0); + + $attribute_template = \Redshop\Template\Helper::getAttribute($tempdata_div_middle); + /************************************************************ **********************************************/ + for ($r = 0, $rn = count($related_product); $r < $rn; $r++) + { + $related_template_data .= $tempdata_div_middle; + + $rlink = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $related_product[$r]->product_id . '&Itemid=' . $this->itemId); + + if (strstr($related_template_data, "{relproduct_image_3}")) + { + $rpimg_tag = '{relproduct_image_3}'; + $rph_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_HEIGHT_3'); + $rpw_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_WIDTH_3'); + } + elseif (strstr($related_template_data, "{relproduct_image_2}")) + { + $rpimg_tag = '{relproduct_image_2}'; + $rph_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_HEIGHT_2'); + $rpw_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_WIDTH_2'); + } + elseif (strstr($related_template_data, "{relproduct_image_1}")) + { + $rpimg_tag = '{relproduct_image_1}'; + $rph_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_HEIGHT'); + $rpw_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_WIDTH'); + } + else + { + $rpimg_tag = '{relproduct_image}'; + $rph_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_HEIGHT'); + $rpw_thumb = Redshop::getConfig()->get('RELATED_PRODUCT_THUMB_WIDTH'); + } + + $hidden_thumb_image = ""; + $relimage = Redshop\Product\Image\Image::getImage($related_product [$r]->product_id, $rlink, $rpw_thumb, $rph_thumb); + $related_template_data = str_replace($rpimg_tag, $relimage . $hidden_thumb_image, $related_template_data); + + if (strstr($related_template_data, "{relproduct_link}")) + { + $rpname = "" . $config->maxchar($related_product [$r]->product_name, Redshop::getConfig()->get('RELATED_PRODUCT_TITLE_MAX_CHARS'), Redshop::getConfig()->get('RELATED_PRODUCT_TITLE_END_SUFFIX')) . ""; + } + else + { + $rpname = $config->maxchar($related_product [$r]->product_name, Redshop::getConfig()->get('RELATED_PRODUCT_TITLE_MAX_CHARS'), Redshop::getConfig()->get('RELATED_PRODUCT_TITLE_END_SUFFIX')); + } + + $rpdesc = $config->maxchar($related_product [$r]->product_desc, Redshop::getConfig()->get('RELATED_PRODUCT_DESC_MAX_CHARS'), Redshop::getConfig()->get('RELATED_PRODUCT_DESC_END_SUFFIX')); + $rp_shortdesc = $config->maxchar($related_product [$r]->product_s_desc, Redshop::getConfig()->get('RELATED_PRODUCT_SHORT_DESC_MAX_CHARS'), Redshop::getConfig()->get('RELATED_PRODUCT_SHORT_DESC_END_SUFFIX')); + + $related_template_data = str_replace("{relproduct_link}", '', $related_template_data); + + if (strstr($related_template_data, "{relproduct_link}")) + { + $related_template_data = str_replace("{relproduct_name}", "", $related_template_data); + } + else + { + $related_template_data = str_replace("{relproduct_name}", $rpname, $related_template_data); + } + + $related_template_data = str_replace("{relproduct_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER_LBL'), $related_template_data); + $related_template_data = str_replace("{relproduct_number}", $related_product [$r]->product_number, $related_template_data); + $related_template_data = str_replace("{relproduct_s_desc}", $rp_shortdesc, $related_template_data); + $related_template_data = str_replace("{relproduct_desc}", $rpdesc, $related_template_data); + + $manufacturer = RedshopEntityManufacturer::getInstance($related_product[$r]->manufacturer_id)->getItem(); + + if (count($manufacturer) > 0) + { + $man_url = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $related_product[$r]->manufacturer_id . '&Itemid=' . $this->itemId); + $manufacturerLink = "" . JText::_("COM_REDSHOP_VIEW_ALL_MANUFACTURER_PRODUCTS") . ""; + $related_template_data = str_replace("{manufacturer_name}", $manufacturer->name, $related_template_data); + $related_template_data = str_replace("{manufacturer_link}", $manufacturerLink, $related_template_data); + } + else + { + $related_template_data = str_replace("{manufacturer_name}", '', $related_template_data); + $related_template_data = str_replace("{manufacturer_link}", '', $related_template_data); + } + + // Show Price + if (!$related_product [$r]->not_for_sale) + { + $related_template_data = RedshopHelperProductPrice::getShowPrice($related_product[$r]->product_id, $related_template_data, '', 0, 1); + } + else + { + $related_template_data = str_replace("{price_excluding_vat}", '', $related_template_data); + $related_template_data = str_replace("{relproduct_price_table}", '', $related_template_data); + $related_template_data = str_replace("{relproduct_price_novat}", '', $related_template_data); + $related_template_data = str_replace("{relproduct_old_price}", '', $related_template_data); + $related_template_data = str_replace("{relproduct_old_price_lbl}", '', $related_template_data); + $related_template_data = str_replace("{relproduct_price_saving_lbl}", '', $related_template_data); + $related_template_data = str_replace("{relproduct_price_saving}", '', $related_template_data); + $related_template_data = str_replace("{relproduct_price}", '', $related_template_data); + } + + // End Show Price + + $relmorelinkhref = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $related_product [$r]->product_id . '&cid=' . $related_product[$r]->cat_in_sefurl . '&Itemid=' . $this->itemId); + $relmorelink = 'javascript:window.parent.SqueezeBox.close();window.parent.location.href="' . $relmorelinkhref . '"'; + $rmore = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $related_template_data = str_replace("{read_more}", $rmore, $related_template_data); + $related_template_data = str_replace("{read_more_link}", $relmorelink, $related_template_data); + /* + * related product Required Attribute start + * this will parse only Required Attributes + */ + $relid = $related_product [$r]->product_id; + $attributes_set = array(); + + if ($related_product [$r]->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $related_product [$r]->attribute_set_id); + } + + $attributes = $producthelper->getProductAttribute($relid); + $attributes = array_merge($attributes, $attributes_set); + + $related_template_data = $producthelper->replaceAttributeData($related_product[$r]->mainproduct_id, 0, $related_product[$r]->product_id, $attributes, $related_template_data, $attribute_template); + $related_template_data = Redshop\Cart\Render::replace($related_product[$r]->mainproduct_id, $this->data->category_id, 0, $related_product[$r]->product_id, $related_template_data, false, array(), count($attributes)); + $related_template_data = Redshop\Product\Compare::replaceCompareProductsButton($related_product[$r]->product_id, $this->data->category_id, $related_template_data, 1); + $related_template_data = Redshop\Product\Stock::replaceInStock($related_product[$r]->product_id, $related_template_data); + + $related_template_data = $producthelper->replaceAttributePriceList($related_product[$r]->product_id, $related_template_data); + + $related_template_data = $producthelper->getProductFinderDatepickerValue($related_template_data, $related_product[$r]->product_id, $fieldArray); + } + + $reltemplate = $tempdata_div_start . $related_template_data . $tempdata_div_end; +} + +echo eval("?>" . $reltemplate . "input->get('tid', null); +$model = $this->getModel(); +?> + + +
    + +
    + + + + + + + + + +
    + +
    + + + + +
    +
    +
    + +downloadProduct($tid); + + ?> +
    + + 0 && $downloaddata->media_id != null) + { + ?> + +
    +
    + + media_id; + $name = $downloaddata->file_name; + $addtional_downloaddata = $model->AdditionaldownloadProduct($mid); + + $filetype = strtolower(JFile::getExt($name)); + + $downloadname = substr(basename($name), 11); + ?> + + + + + id; + $additionalname = $addtional_downloaddata [$i]->name; + + $additionalfiletype = strtolower(JFile::getExt($additionalname)); + + $additionaldownloadname = substr(basename($additionalname), 11); + + ?> + + + + + + + + + + +
    + +
    + +
    + + + + + + +
    +
    +
    +
    + + +
    + + + + + + + + + \ No newline at end of file diff --git a/component/site/views/product/tmpl/index.html b/component/site/views/product/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/product/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/product/tmpl/viewajaxdetail.php b/component/site/views/product/tmpl/viewajaxdetail.php new file mode 100644 index 00000000000..87e6a8eb88c --- /dev/null +++ b/component/site/views/product/tmpl/viewajaxdetail.php @@ -0,0 +1,212 @@ +input->getString('layout', ''); +$relatedprd_id = $this->input->getInt('relatedprd_id', 0); +$ajaxdetal_template = \Redshop\Template\Helper::getAjaxDetailBox($this->data); + +?> + +
    +template_desc; + $data_add = $ajaxdetal_templatedata; + $data_add = str_replace('{product_name}', $this->data->product_name, $data_add); + + if ($this->data->product_price != 0) + { + $data_add = str_replace('{product_price}', $this->data->product_price, $data_add); + } + else + { + $data_add = str_replace('{product_price}', " ", $data_add); + } + + if (strstr($data_add, "{product_image}")) + { + if ($this->data->product_full_image && file_exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $this->data->product_full_image)) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $this->data->product_full_image, + '', + 'thumb', + 'product', + Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE'), + Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $productsrcPath = ""; + $productsrcPath .= ""; + $productsrcPath .= ""; + $data_add = str_replace('{product_image}', $productsrcPath, $data_add); + } + else + { + $data_add = str_replace('{product_image}', " ", $data_add); + } + } + + $count_no_user_field = 0; + + $extrafieldNames = $this->input->getString('extrafieldNames', ''); + $nextrafield = $this->input->getInt('nextrafield', 1); + + $data = array(); + $data['property_data'] = $this->input->getString('property_data', ''); + $data['subproperty_data'] = $this->input->getString('subproperty_data', ''); + $data['accessory_data'] = $this->input->getString('accessory_data', ''); + $data['acc_quantity_data'] = $this->input->getString('acc_quantity_data', ''); + $data['acc_property_data'] = $this->input->getString('acc_property_data', ''); + $data['acc_subproperty_data'] = $this->input->getString('acc_subproperty_data', ''); + + $selectAcc = $producthelper->getSelectedAccessoryArray($data); + $selectAtt = $producthelper->getSelectedAttributeArray($data); + + $returnArr = $producthelper->getProductUserfieldFromTemplate($data_add); + $template_userfield = $returnArr[0]; + $userfieldArr = $returnArr[1]; + + if ($template_userfield != "") + { + $ufield = ""; + $cart = $this->session->get('cart'); + + if (isset($cart['idx'])) + { + $idx = (int) ($cart['idx']); + } + + $idx = 0; + $cart_id = ''; + + for ($j = 0; $j < $idx; $j++) + { + if ($cart[$j]['product_id'] == $this->data->product_id) + { + $cart_id = $j; + } + } + + for ($ui = 0; $ui < count($userfieldArr); $ui++) + { + if (!$idx) + { + $cart_id = ""; + } + + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', $cart_id, 1, $this->data->product_id); + $ufield .= $productUserFields[0]; + + if ($productUserFields[0] != "") + { + $count_no_user_field++; + } + + if ($nextrafield <= 0) + { + $data_add = str_replace('{' . $userfieldArr[$ui] . '_lbl}', '', $data_add); + $data_add = str_replace('{' . $userfieldArr[$ui] . '}', '', $data_add); + } + else + { + if ($extrafieldNames) + { + $extrafieldName = @ explode(',', $extrafieldNames); + + if (!in_array($userfieldArr[$ui], $extrafieldName)) + { + $data_add = str_replace('{' . $userfieldArr[$ui] . '_lbl}', '', $data_add); + $data_add = str_replace('{' . $userfieldArr[$ui] . '}', '', $data_add); + } + else + { + $data_add = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $data_add); + $data_add = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $data_add); + } + } + else + { + $data_add = str_replace('{' . $userfieldArr[$ui] . '_lbl}', "", $data_add); + $data_add = str_replace('{' . $userfieldArr[$ui] . '}', "", $data_add); + } + } + } + + $productUserFieldsForm = "
    "; + + if ($ufield != "") + { + $data_add = str_replace("{if product_userfield}", $productUserFieldsForm, $data_add); + $data_add = str_replace("{product_userfield end if}", "
    ", $data_add); + } + else + { + $data_add = str_replace("{if product_userfield}", "", $data_add); + $data_add = str_replace("{product_userfield end if}", "", $data_add); + } + } + else + { + $count_no_user_field = 0; + } + + $childproduct = RedshopHelperProduct::getChildProduct($this->data->product_id); + + if (count($childproduct) > 0 && Redshop::getConfig()->get('PURCHASE_PARENT_WITH_CHILD') == 0) + { + $isChilds = true; + } + else + { + $isChilds = false; + } + + // Get attribute Template data + // Product attribute Start + $attributes_set = array(); + + if ($this->data->attribute_set_id > 0) + { + $attributes_set = $producthelper->getProductAttribute(0, $this->data->attribute_set_id, 0, 1); + } + + $attribute_template = \Redshop\Template\Helper::getAttribute($data_add); + $attributes = $producthelper->getProductAttribute($this->data->product_id); + $attributes = array_merge($attributes, $attributes_set); + $totalatt = count($attributes); + $data_add = $producthelper->replaceAttributeData($this->data->product_id, 0, $relatedprd_id, $attributes, $data_add, $attribute_template, $isChilds, $selectAtt); + + // Product attribute End + + // Product accessory Start ///////////////////////////////// + $accessory = $producthelper->getProductAccessory(0, $this->data->product_id); + $totalAccessory = count($accessory); + + $data_add = RedshopHelperProductAccessory::replaceAccessoryData($this->data->product_id, $relatedprd_id, $accessory, $data_add, $isChilds, $selectAcc); + + // Product accessory End ///////////////////////////////// + + // Cart + $data_add = Redshop\Cart\Render::replace($this->data->product_id, $this->data->category_id, 0, $relatedprd_id, $data_add, $isChilds, $userfieldArr, $totalatt, $totalAccessory, $count_no_user_field); + + $data_add = $data_add . ""; + + echo eval("?>" . $data_add . "wishlists; +$product_id = $this->input->getInt('product_id'); +$user = JFactory::getUser(); + +if (!$user->id) +{ + $rows = $this->wish_products; + echo "
    "; + + if (count($rows) > 0) + { + // Send mail link + $mlink = JURI::root() . "index.php?option=com_redshop&view=account&layout=mywishlist&mail=1&tmpl=component"; + echo $mail_link = '
    '; + display_products($rows); + $reglink = JURI::root() . "index.php?option=com_redshop&view=registration"; + echo "
    "; + } + else + { + echo "
    " . JText::_('COM_REDSHOP_NO_PRODUCTS_IN_WISHLIST') . "
    "; + } + + echo "
    "; +} +else // If user logged in than display this code. +{ + echo "
    "; + + if (count($this->wish_session) > 0) + { + $mlink = JURI::root() . "index.php?option=com_redshop&view=account&layout=mywishlist&mail=1&tmpl=component"; + echo $mail_link = '
    '; + display_products($this->wish_session); + echo "
    "; + $mywishlist_link = "index.php?option=com_redshop&view=wishlist&task=addtowishlist&tmpl=component"; + echo ""; + echo "

    "; + } + + if (count($wishlists) > 0) + { + $wish_products = $this->wish_products; + + // Send mail link + for ($j = 0, $jn = count($wishlists); $j < $jn; $j++) + { + $rows = $wish_products[$wishlists[$j]->wishlist_id]; + $mlink = JURI::root() . "index.php?option=com_redshop&view=account&layout=mywishlist&mail=1&tmpl=component&wishlist_id=" . $wishlists[$j]->wishlist_id; + echo $mail_link = ''; + + display_products($rows); + echo "
    "; + } + } + else + { + echo "
    " . JText::_('COM_REDSHOP_NO_PRODUCTS_IN_WISHLIST') . "
    "; + } + + echo "
    "; +} + +function display_products($rows) +{ + $producthelper = productHelper::getInstance(); + + for ($i = 0, $in = count($rows); $i < $in; $i++) + { + $row = $rows[$i]; + $Itemid = $this->redHelper->getItemid($row->product_id); + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $row->product_id . '&Itemid=' . $Itemid); + $product_price = Redshop\Product\Price::getPrice($row->product_id); + + $productArr = $producthelper->getProductNetPrice($row->product_id); + $product_price_discount = $productArr['productPrice'] + $productArr['productVat']; + + if ($row->product_full_image) + { + echo "
    " + . Redshop\Product\Image\Image::getImage($row->product_id, $link, "100", "100") . '
    '; + } + + echo "" . $row->product_name . "
    "; + + if ($row->product_on_sale && $product_price_discount > 0) + { + if ($product_price > $product_price_discount) + { + $s_price = $product_price - $product_price_discount; + + if ($this->show_discountpricelayout) + { + echo "
    " . $producthelper->getProductFormattedPrice($product_price) . "
    "; + $product_price = $product_price_discount; + echo "
    " . $producthelper->getProductFormattedPrice($product_price_discount) . "
    "; + echo "
    " . JText::_('COM_REDSHOP_PRODCUT_PRICE_YOU_SAVED') . ' ' . $producthelper->getProductFormattedPrice($s_price) . "
    "; + } + else + { + $product_price = $product_price_discount; + echo "
    " . $producthelper->getProductFormattedPrice($product_price) . "
    "; + } + } + else + { + echo "
    " . $producthelper->getProductFormattedPrice($product_price) . "
    "; + } + } + else + { + echo "
    " . $producthelper->getProductFormattedPrice($product_price) . "
    "; + } + + echo "
    " . JText::_('COM_REDSHOP_READ_MORE') . " "; + + echo $addtocartdata = Redshop\Cart\Render::replace($row->product_id); + + echo "
    " . $addtocartdata . "
    "; + } +} diff --git a/component/site/views/product/view.html.php b/component/site/views/product/view.html.php new file mode 100644 index 00000000000..bf3dd46db27 --- /dev/null +++ b/component/site/views/product/view.html.php @@ -0,0 +1,504 @@ +redTemplate = Redtemplate::getInstance(); + $this->redHelper = redhelper::getInstance(); + $this->textHelper = new text_library; + + $this->app = JFactory::getApplication(); + $this->input = $this->app->input; + $this->model = $this->getModel('product'); + $this->document = JFactory::getDocument(); + $this->session = JFactory::getSession(); + $pageheadingtag = ''; + $params = $this->app->getParams('com_redshop'); + $menu_meta_keywords = $params->get('menu-meta_keywords'); + $menu_meta_description = $params->get('menu-meta_description'); + $menu_robots = $params->get('robots'); + $this->data = $this->get('Data'); + $productTemplate = null; + + $this->itemId = $this->input->getInt('Itemid', null); + $this->pid = $this->input->getInt('pid', 0); + $layout = $this->input->getString('layout', 'default'); + $template = $this->input->getString('r_template', ''); + + JPluginHelper::importPlugin('redshop_product'); + $this->dispatcher = RedshopHelperUtility::getDispatcher(); + + if (!$this->pid) + { + $this->pid = $params->get('productid'); + } + + /* + * Include JavaScript. + * But, first check if a plugin wants to use its own jQuery. + */ + $this->dispatcher->trigger('stopProductRedshopJQuery', array($this->data, $layout)); + + JHtml::stylesheet('com_redshop/scrollable-navig.min.css', array(), true); + + if ($layout == "downloadproduct") + { + $this->setLayout('downloadproduct'); + } + elseif ($layout == "compare") + { + $this->setLayout('compare'); + } + elseif ($layout == "viewajaxdetail") + { + $this->setLayout('viewajaxdetail'); + } + else + { + // Ajax box + if ($template == 'cartbox' && Redshop::getConfig()->get('AJAX_CART_BOX') == 1) + { + $this->loadTemplate('cartbox'); + JFactory::getApplication()->close(); + } + else + { + $this->setLayout('default'); + } + + $prodhelperobj_array_main = $prodhelperobj->getProductNetPrice($this->data->product_id); + + if ($this->data->published == 0) + { + JError::raiseError(404, sprintf(JText::_('COM_REDSHOP_PRODUCT_IS_NOT_PUBLISHED'), $this->data->product_name, $this->data->product_number)); + } + + $productTemplate = $this->model->getProductTemplate(); + + /* + * Process the prepare Product plugins + */ + $this->dispatcher->trigger('onPrepareProduct', array(& $productTemplate->template_desc, & $params, $this->data)); + + $pagetitletag = ''; + + // For page title + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_TITLE') != '') + { + $pagetitletag = Redshop::getConfig()->get('SEO_PAGE_TITLE'); + + $pagetitletag = str_replace("{productname}", $this->data->product_name, $pagetitletag); + $pagetitletag = str_replace("{categoryname}", $this->data->category_name, $pagetitletag); + $pagetitletag = str_replace("{manufacturer}", $this->data->manufacturer_name, $pagetitletag); + $pagetitletag = str_replace("{productsku}", $this->data->product_number, $pagetitletag); + $pagetitletag = str_replace("{productnumber}", $this->data->product_number, $pagetitletag); + $pagetitletag = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $pagetitletag); + $pagetitletag = str_replace("{productshortdesc}", strip_tags($this->data->product_s_desc), $pagetitletag); + $pagetitletag = str_replace("{saleprice}", $prodhelperobj->getProductFormattedPrice($prodhelperobj_array_main['product_price']), $pagetitletag); + + $parentcat = ""; + $parentid = $prodhelperobj->getParentCategory($this->data->category_id); + + while ($parentid != 0) + { + $parentdetail = RedshopEntityCategory::getInstance($parentid)->getItem(); + $parentcat = $parentdetail->name . " " . $parentcat; + $parentid = $prodhelperobj->getParentCategory($parentdetail->id); + } + + $pagetitletag = str_replace("{parentcategoryloop}", $parentcat, $pagetitletag); + + $pagetitletag = $prodhelperobj->getProductNotForSaleComment($this->data, $pagetitletag); + } + + if ($this->data->pagetitle != '' && Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_TITLE') != '') + { + if ($this->data->append_to_global_seo == 'append') + { + $pagetitletag .= " " . $this->data->pagetitle; + $this->document->setTitle($pagetitletag); + $this->document->setMetaData("og:title", $pagetitletag); + } + elseif ($this->data->append_to_global_seo == 'prepend') + { + $pagetitletag = $this->data->pagetitle . " " . $pagetitletag; + $this->document->setTitle($pagetitletag); + $this->document->setMetaData("og:title", $pagetitletag); + } + elseif ($this->data->append_to_global_seo == 'replace') + { + $this->document->setTitle($this->data->pagetitle); + $this->document->setMetaData("og:title", $this->data->pagetitle); + } + } + else + { + if ($this->data->pagetitle != '') + { + $this->document->setTitle($this->data->pagetitle); + $this->document->setMetaData("og:title", $this->data->pagetitle); + } + elseif (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_TITLE') != '') + { + $this->document->setTitle($pagetitletag); + $this->document->setMetaData("og:title", $pagetitletag); + } + else + { + $this->document->setTitle( + $this->data->product_name . " | " . + $this->data->category_name . " | " . + $this->app->getCfg('sitename') . " | " . + $this->data->product_number + ); + + $this->document->setMetaData( + "og:title", + $this->data->product_name . " | " . + $this->data->category_name . " | " . + $this->app->getCfg('sitename') . " | " . + $this->data->product_number + ); + } + } + + $uri = JFactory::getURI(); + $scheme = $uri->getScheme(); + $host = $uri->getHost(); + + if ($this->data->product_thumb_image && file_exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $this->data->product_thumb_image)) + { + $imageLink = $scheme . "://" . $host . "/components/com_redshop/assets/images/product/" . $this->data->product_thumb_image; + + list($width, $height, $type, $attr) = @getimagesize(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $this->data->product_thumb_image); + + $openGraphTag = '' . "\n"; + $openGraphTag .= '' . "\n"; + $openGraphTag .= '' . "\n"; + $openGraphTag .= '' . "\n"; + $this->document->addCustomTag($openGraphTag); + } + elseif ($this->data->product_full_image && file_exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $this->data->product_full_image)) + { + $imageLink = $scheme . "://" . $host . "/components/com_redshop/assets/images/product/" . $this->data->product_full_image; + + list($width, $height, $type, $attr) = @getimagesize(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $this->data->product_full_image); + + $openGraphTag = '' . "\n"; + $openGraphTag .= '' . "\n"; + $openGraphTag .= '' . "\n"; + $openGraphTag .= '' . "\n"; + $this->document->addCustomTag($openGraphTag); + } + + $pagekeywordstag = ''; + + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_KEYWORDS') != '') + { + $pagekeywordstag = Redshop::getConfig()->get('SEO_PAGE_KEYWORDS'); + $pagekeywordstag = str_replace("{productname}", $this->data->product_name, $pagekeywordstag); + $pagekeywordstag = str_replace("{categoryname}", $this->data->category_name, $pagekeywordstag); + $pagekeywordstag = str_replace("{manufacturer}", $this->data->manufacturer_name, $pagekeywordstag); + $pagekeywordstag = str_replace("{productsku}", $this->data->product_number, $pagekeywordstag); + $pagekeywordstag = str_replace("{productnumber}", $this->data->product_number, $pagekeywordstag); + $pagekeywordstag = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $pagekeywordstag); + $pagekeywordstag = str_replace("{productshortdesc}", strip_tags($this->data->product_s_desc), $pagekeywordstag); + $pagekeywordstag = str_replace("{saleprice}", $prodhelperobj->getProductFormattedPrice($prodhelperobj_array_main['product_price']), $pagekeywordstag); + $pagekeywordstag = $prodhelperobj->getProductNotForSaleComment($this->data, $pagekeywordstag); + + $this->document->setMetaData('keywords', $pagekeywordstag); + } + + if (trim($this->data->metakey) != '' && Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_KEYWORDS') != '') + { + if ($this->data->append_to_global_seo == 'append') + { + $pagekeywordstag .= "," . trim($this->data->metakey); + $this->document->setMetaData('keywords', $pagekeywordstag); + } + elseif ($this->data->append_to_global_seo == 'prepend') + { + $this->document->setMetaData('keywords', $pagekeywordstag); + } + elseif ($this->data->append_to_global_seo == 'replace') + { + $this->document->setMetaData('keywords', $this->data->metakey); + } + } + else + { + if (trim($this->data->metakey) != '') + { + $this->document->setMetaData('keywords', $this->data->metakey); + } + else + { + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_KEYWORDS') != '') + { + $this->document->setMetaData('keywords', $pagekeywordstag); + } + elseif ($menu_meta_keywords != "") + { + $this->document->setMetaData('keywords', $menu_meta_keywords); + } + else + { + $this->document->setMetaData('keywords', $this->data->product_name . ", " . $this->data->category_name . ", " . Redshop::getConfig()->get('SHOP_NAME') . ", " . $this->data->product_number); + } + } + } + + if (trim($this->data->metarobot_info) != '') + { + $this->document->setMetaData('robots', $this->data->metarobot_info); + } + else + { + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && JFactory::getConfig()->get('robots') != '') + { + $this->document->setMetaData('robots', JFactory::getConfig()->get('robots')); + } + elseif ($menu_robots != "") + { + $this->document->setMetaData('robots', $menu_robots); + } + else + { + $this->document->setMetaData('robots', "INDEX,FOLLOW"); + } + } + + $pagedesctag = ''; + + // For meta description + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION') != '') + { + if ($prodhelperobj_array_main['product_price_saving'] != "") + { + $product_price_saving_main = $prodhelperobj_array_main['product_price_saving']; + } + else + { + $product_price_saving_main = 0; + } + + $pagedesctag = Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION'); + $pagedesctag = str_replace("{productname}", $this->data->product_name, $pagedesctag); + $pagedesctag = str_replace("{categoryname}", $this->data->category_name, $pagedesctag); + $pagedesctag = str_replace("{manufacturer}", $this->data->manufacturer_name, $pagedesctag); + $pagedesctag = str_replace("{productsku}", $this->data->product_number, $pagedesctag); + $pagedesctag = str_replace("{productnumber}", $this->data->product_number, $pagedesctag); + $pagedesctag = str_replace("{shopname}", Redshop::getConfig()->get('SHOP_NAME'), $pagedesctag); + $pagedesctag = str_replace("{productshortdesc}", strip_tags($this->data->product_s_desc), $pagedesctag); + $pagedesctag = str_replace("{productdesc}", strip_tags($this->data->product_desc), $pagedesctag); + $pagedesctag = str_replace("{saleprice}", $prodhelperobj->getProductFormattedPrice($prodhelperobj_array_main['product_price']), $pagedesctag); + $pagedesctag = str_replace("{saving}", $prodhelperobj->getProductFormattedPrice($product_price_saving_main), $pagedesctag); + $pagedesctag = $prodhelperobj->getProductNotForSaleComment($this->data, $pagedesctag); + } + + if (trim($this->data->metadesc) != '' && Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION') != '') + { + if ($this->data->append_to_global_seo == 'append') + { + $pagedesctag .= " " . $this->data->metadesc; + $this->document->setMetaData('description', $pagedesctag); + $this->document->setMetaData("og:description", $pagedesctag); + } + elseif ($this->data->append_to_global_seo == 'prepend') + { + $this->document->setMetaData('description', $pagedesctag); + $this->document->setMetaData("og:description", $pagedesctag); + } + elseif ($this->data->append_to_global_seo == 'replace') + { + $this->document->setMetaData('description', $this->data->metadesc); + $this->document->setMetaData("og:description", $this->data->metadesc); + } + } + else + { + if (trim($this->data->metadesc) != '') + { + $this->document->setMetaData('description', $this->data->metadesc); + $this->document->setMetaData("og:description", $pagedesctag); + } + elseif (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_DESCRIPTION') != '') + { + $this->document->setMetaData('description', $pagedesctag); + $this->document->setMetaData("og:description", $pagedesctag); + } + elseif ($menu_meta_description != "") + { + $this->document->setMetaData('description', $menu_meta_description); + $this->document->setMetaData("og:description", $menu_meta_description); + } + else + { + $prodhelperobj_array = $prodhelperobj->getProductNetPrice($this->data->product_id); + + if ($prodhelperobj_array['product_price_saving'] != '') + { + $product_price_saving_main = $prodhelperobj->getProductFormattedPrice($prodhelperobj_array['product_price_saving']); + } + else + { + $product_price_saving_main = 0; + } + + $this->document->setMetaData( + 'description', + JText::_('COM_REDSHOP_META_BUY') . ' ' . $this->data->product_name . ' ' . + JText::_('COM_REDSHOP_META_AT_ONLY') . ' ' . $prodhelperobj->getProductFormattedPrice($prodhelperobj_array['product_price']) . ' ' . + JText::_('COM_REDSHOP_META_SAVE') . ' ' . $product_price_saving_main + ); + $this->document->setMetaData( + 'og:description', + JText::_('COM_REDSHOP_META_BUY') . ' ' . $this->data->product_name . ' ' . + JText::_('COM_REDSHOP_META_AT_ONLY') . ' ' . $prodhelperobj->getProductFormattedPrice($prodhelperobj_array['product_price']) . ' ' . + JText::_('COM_REDSHOP_META_SAVE') . ' ' . $product_price_saving_main + ); + } + } + + /** + * @var $this->data + * Trigger event onAfterDisplayProduct + * Show content return by plugin directly into product page after display product title + */ + $this->data->event = new stdClass; + $results = $this->dispatcher->trigger('onAfterDisplayProductTitle', array(&$productTemplate->template_desc, $params, $this->data)); + $this->data->event->afterDisplayTitle = trim(implode("\n", $results)); + + /** + * @var $this->data + * + * Trigger event onBeforeDisplayProduct will display content before product display + */ + $results = $this->dispatcher->trigger('onBeforeDisplayProduct', array(&$productTemplate->template_desc, $params, $this->data)); + $this->data->event->beforeDisplayProduct = trim(implode("\n", $results)); + + // For page heading + if (Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_HEADING') != '') + { + $pageheadingtag = Redshop::getConfig()->get('SEO_PAGE_HEADING'); + $pageheadingtag = str_replace("{productname}", $this->data->product_name, $pageheadingtag); + $pageheadingtag = str_replace("{categoryname}", $this->data->category_name, $pageheadingtag); + $pageheadingtag = str_replace("{manufacturer}", $this->data->manufacturer_name, $pageheadingtag); + $pageheadingtag = str_replace("{productsku}", $this->data->product_number, $pageheadingtag); + $pageheadingtag = str_replace("{productnumber}", $this->data->product_number, $pageheadingtag); + $pageheadingtag = str_replace("{productshortdesc}", strip_tags($this->data->product_s_desc), $pageheadingtag); + } + + if (trim($this->data->pageheading) != '' && Redshop::getConfig()->get('AUTOGENERATED_SEO') && Redshop::getConfig()->get('SEO_PAGE_HEADING') != '') + { + $pageheadingtag = $pageheadingtag . " " . $this->data->pageheading; + } + else + { + if (trim($this->data->pageheading) != '') + { + $pageheadingtag = $this->data->pageheading; + } + } + + $visited = array(); + $visited = $this->session->get('visited', $visited); + + if ($this->pid && !(in_array($this->pid, $visited))) + { + $this->model->updateVisited($this->pid); + $visited[] = $this->pid; + $this->session->set('visited', $visited); + } + + // End + } + + // Breadcrumb + if ($this->pid) + { + RedshopHelperBreadcrumb::generate($this->pid); + } + + $this->template = $productTemplate; + $this->pageheadingtag = $pageheadingtag; + $this->params = $params; + + $for = $this->input->getBool("for", false); + + if ($for) + { + parent::display('related'); + + return; + } + + parent::display($tpl); + } +} diff --git a/component/site/views/product_mini/index.html b/component/site/views/product_mini/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/product_mini/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/product_mini/tmpl/default.php b/component/site/views/product_mini/tmpl/default.php new file mode 100644 index 00000000000..ca09aa88f1e --- /dev/null +++ b/component/site/views/product_mini/tmpl/default.php @@ -0,0 +1,134 @@ +input->getString('e_name'); +$eName = preg_replace('#[^A-Z0-9\-\_\[\]]#i', '', $eName); +?> + + +
    + "> + + +
    + + + + + + + + + + + products); $i < $n; $i++) + { + $row = $this->products[$i]; + $row->id = $row->product_id; + $link = JRoute::_('index.php?option=com_redshop&view=product_detail&task=edit&cid[]=' . $row->product_id); + + $published = JHtml::_('jgrid.published', $row->published, $i, '', 1); + + ?> + "> + + + + + + + + + + + +
    + + + lists['order_Dir'], $this->lists['order']); ?> + + lists['order_Dir'], $this->lists['order']); ?> +
    + pagination->getRowOffset($i); ?> + +
    + product_name; ?>
    +
    +
    + product_number;?>
    +
    + pagination->getPagesLinks(); ?> +
    +
    + + + + + + +
    diff --git a/component/site/views/product_mini/tmpl/index.html b/component/site/views/product_mini/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/product_mini/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/product_mini/view.html.php b/component/site/views/product_mini/view.html.php new file mode 100644 index 00000000000..ba7fd97fddb --- /dev/null +++ b/component/site/views/product_mini/view.html.php @@ -0,0 +1,63 @@ +setTitle(JText::_('COM_REDSHOP_PRODUCT')); + + $uri = JFactory::getURI(); + + $filter_order = $app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'product_id'); + $filter_order_Dir = $app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', ''); + $limitstart = $app->getUserStateFromRequest($context . 'limitstart', 'limitstart', '0'); + $limit = $app->getUserStateFromRequest($context . 'limit', 'limit', '10'); + + $search_field = $app->getUserStateFromRequest($context . 'search_field', 'search_field', ''); + $keyword = $app->getUserStateFromRequest($context . 'keyword', 'keyword', ''); + $category_id = $app->getUserStateFromRequest($context . 'category_id', 'category_id', ''); + + $categories = RedshopHelperCategory::getCategoryListArray(); + + $temps = array(); + $temps[0]->id = "0"; + $temps[0]->name = JText::_('COM_REDSHOP_SELECT'); + $categories = @array_merge($temps, $categories); + + $lists['category'] = JHTML::_('select.genericlist', $categories, 'category_id', 'class="inputbox" onchange="document.adminForm2.submit();" ', 'category_id', 'category_name', $category_id); + + $lists['order'] = $filter_order; + $lists['order_Dir'] = $filter_order_Dir; + $total = $this->get('Total'); + $products = $this->get('Data'); + + $pagination = $this->get('Pagination'); + + $this->keyword = $keyword; + $this->search_field = $search_field; + $this->user = JFactory::getUser(); + $this->lists = $lists; + $this->products = $products; + $this->pagination = $pagination; + $this->request_url = $uri->toString(); + JFilterOutput::cleanText($this->request_url); + parent::display($tpl); + } +} diff --git a/component/site/views/product_rating/index.html b/component/site/views/product_rating/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/product_rating/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/product_rating/tmpl/default.php b/component/site/views/product_rating/tmpl/default.php new file mode 100644 index 00000000000..2335bf64299 --- /dev/null +++ b/component/site/views/product_rating/tmpl/default.php @@ -0,0 +1,32 @@ + +input->getInt('rate', 0)) : ?> + params->get('show_page_heading', 1)) : ?> +
    + escape($this->productInfo->product_name); ?> +
    + + $this->form, + 'modal' => 1, + 'product_id' => $this->productId + ); + echo RedshopLayoutHelper::render('product.product_rating', $displayData); + ?> + + + diff --git a/component/site/views/product_rating/tmpl/default.xml b/component/site/views/product_rating/tmpl/default.xml new file mode 100644 index 00000000000..c045f04712f --- /dev/null +++ b/component/site/views/product_rating/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/product_rating/tmpl/index.html b/component/site/views/product_rating/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/product_rating/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/product_rating/view.html.php b/component/site/views/product_rating/view.html.php new file mode 100644 index 00000000000..09d3068e174 --- /dev/null +++ b/component/site/views/product_rating/view.html.php @@ -0,0 +1,61 @@ +state = $this->get('State'); + $this->form = $this->get('Form'); + + $app = JFactory::getApplication(); + $user = JFactory::getUser(); + + // Preform security checks + if (!$user->id && Redshop::getConfig()->get('RATING_REVIEW_LOGIN_REQUIRED')) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_ALERTNOTAUTH_REVIEW'), 'warning'); + + return; + } + + $this->params = $app->getParams('com_redshop'); + $model = $this->getModel('product_rating'); + $this->productId = $app->input->getInt('product_id', 0); + $rate = $app->input->getInt('rate', 0); + $this->productInfo = RedshopHelperProduct::getProductById($this->productId); + + if (!$rate && $user->id && $model->checkRatedProduct($this->productId, $user->id)) + { + $app->input->set('rate', 1); + $app->enqueueMessage(JText::_('COM_REDSHOP_YOU_CAN_NOT_REVIEW_SAME_PRODUCT_AGAIN'), 'warning'); + } + + parent::display($tpl); + } +} diff --git a/component/site/views/quotation/index.html b/component/site/views/quotation/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/quotation/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/quotation/tmpl/default.php b/component/site/views/quotation/tmpl/default.php new file mode 100644 index 00000000000..1f6ad9bde6f --- /dev/null +++ b/component/site/views/quotation/tmpl/default.php @@ -0,0 +1,132 @@ +input->getInt('Itemid'); +$return = $app->input->getString('return'); +$session = JFactory::getSession(); +$cart = $session->get('cart'); + +$detail = $this->detail; +$user = JFactory::getUser(); +$extraField = extraField::getInstance(); + +$quotation_template = RedshopHelperTemplate::getTemplate("quotation_request"); + +if (count($quotation_template) > 0 && $quotation_template[0]->template_desc != "") +{ + $template_desc = $quotation_template[0]->template_desc; +} +else +{ + $template_desc = "
    {order_detail_lbl} \r\n\r\n\r\n\r\n\r\n\r\n\r\n{product_loop_start}\r\n\r\n\r\n\r\n\r\n{product_loop_end}\r\n\r\n
    {product_name_lbl}{quantity_lbl}
    {product_name}
    {product_attribute}
    {product_accessory}
    {product_userfields}
    {update_cart}
    \r\n
    \r\n

    {customer_note_lbl}:{customer_note}

    \r\n
    {billing_address_information_lbl} {billing_address}{quotation_custom_field_list}
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {cancel_btn}{request_quotation_btn}
    "; +}?> + +get('DEFAULT_QUOTATION_MODE')); + $template_desc = $template_start . $template_middle . $template_end; +} + +$template_desc = Redshop\Cart\Render\Label::replace($template_desc); + +if ($user->id) +{ + $template_desc = $carthelper->replaceBillingAddress($template_desc, $detail); + $template_desc .= ''; +} +else +{ + $billing = '
    '; + + $emailField = new stdClass; + $emailField->title = JText::_('COM_REDSHOP_EMAIL'); + $emailField->desc = ''; + $emailField->required = ''; + + $inputField = ''; + + $billing .= RedshopLayoutHelper::render( + 'fields.html', + array( + 'fieldHandle' => $emailField, + 'inputField' => $inputField + ) + ); + + if (strstr($template_desc, "{quotation_custom_field_list}")) + { + $billing .= Redshop\Fields\SiteHelper::renderFields(RedshopHelperExtrafields::SECTION_QUOTATION, $detail->user_info_id, "tbl"); + $template_desc = str_replace("{quotation_custom_field_list}", "", $template_desc); + } + else + { + $template_desc = RedshopHelperExtrafields::listAllField(RedshopHelperExtrafields::SECTION_QUOTATION, $detail->user_info_id, "", $template_desc); + } + + $billing .= '
    '; + + $template_desc = str_replace("{billing_address_information_lbl}", JText::_('COM_REDSHOP_BILLING_ADDRESS_INFORMATION_LBL'), $template_desc); + $template_desc = str_replace("{billing_address}", $billing, $template_desc); +} + +$cancel_btn = ''; +$quotation_btn = ''; +$quotation_btn .= ''; +$quotation_btn .= ''; +$quotation_btn .= ''; +$quotation_btn .= ''; +$quotation_btn .= ''; + +$template_desc = str_replace("{cancel_btn}", $cancel_btn, $template_desc); +$template_desc = str_replace("{request_quotation_btn}", $quotation_btn, $template_desc); + +$template_desc = str_replace("{order_detail_lbl}", JText::_('COM_REDSHOP_ORDER_DETAIL_LBL'), $template_desc); +$template_desc = str_replace("{customer_note_lbl}", JText::_('COM_REDSHOP_CUSTOMER_NOTE_LBL'), $template_desc); +$template_desc = str_replace("{customer_note}", '', $template_desc); + +$template_desc = '
    ' . $template_desc . '
    '; + +echo eval("?>" . $template_desc . " diff --git a/component/site/views/quotation/tmpl/default.xml b/component/site/views/quotation/tmpl/default.xml new file mode 100644 index 00000000000..090b29af510 --- /dev/null +++ b/component/site/views/quotation/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/quotation/tmpl/default_user.php b/component/site/views/quotation/tmpl/default_user.php new file mode 100644 index 00000000000..8b5943e9dd8 --- /dev/null +++ b/component/site/views/quotation/tmpl/default_user.php @@ -0,0 +1,161 @@ +input->getInt('Itemid'); +$return = $app->input->getString('return'); +$post = $app->input->post->getArray(); +$detail = $this->detail; + +$firstname = $detail->firstname; +$lastname = $detail->lastname; +$address = $detail->address; +$zipcode = $detail->zipcode; +$city = $detail->city; +$country = JText::_(RedshopHelperOrder::getCountryName($detail->country_code)); +$state = RedshopHelperOrder::getStateName($detail->state_code, $detail->country_code); +$phone = $detail->phone; +$user_email = $detail->user_email; + +$field = extra_field::getInstance(); + +if (Redshop::getConfig()->get('DEFAULT_CUSTOMER_REGISTER_TYPE') == 1 || !Redshop::getConfig()->get('DEFAULT_CUSTOMER_REGISTER_TYPE')) +{ + $regtype = 0; +} +else +{ + $regtype = 1; +} + +$link = 'index.php?option=com_redshop&view=cart&Itemid=' . $Itemid; +?> + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    :'/>
    :'/>
    :'/>
    :'/>
    :
    + " + onclick="javascript:document.adminForm.task.value='cancel';"/>
    +
    + + + + + + + +
    diff --git a/component/site/views/quotation/tmpl/index.html b/component/site/views/quotation/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/quotation/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/quotation/view.html.php b/component/site/views/quotation/view.html.php new file mode 100644 index 00000000000..b1d326a328d --- /dev/null +++ b/component/site/views/quotation/view.html.php @@ -0,0 +1,47 @@ +input->getInt('Itemid'); + $session = JFactory::getSession(); + $cart = $session->get('cart'); + $return = $app->input->getString('return'); + + if (!$return) + { + if ($cart['idx'] < 1) + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=cart&Itemid=' . $Itemid)); + } + } + + /** @scrutinizer ignore-deprecated */ JHtml::script('com_redshop/redshop.validation.min.js', false, true); + + $model = $this->getModel('quotation'); + + $detail = $model->getData(); + + $this->detail = $detail; + $this->request_url = $uri->toString(); + JFilterOutput::cleanText($this->request_url); + + parent::display($tpl); + } +} diff --git a/component/site/views/quotation_detail/index.html b/component/site/views/quotation_detail/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/quotation_detail/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/quotation_detail/tmpl/default.php b/component/site/views/quotation_detail/tmpl/default.php new file mode 100644 index 00000000000..0da3525715e --- /dev/null +++ b/component/site/views/quotation_detail/tmpl/default.php @@ -0,0 +1,413 @@ +input->getInt('Itemid', 1); +$quoid = $app->input->getInt('quoid'); +$encr = $app->input->getString('encr'); + +$quotationDetail = RedshopHelperQuotation::getQuotationDetail($quoid); + +$quotationProducts = RedshopHelperQuotation::getQuotationProduct($quoid); + +$fieldArray = $extra_field_new->getSectionFieldList(17, 0, 0); + +$template = RedshopHelperTemplate::getTemplate("quotation_detail"); + +if (count($template) > 0 && $template[0]->template_desc != "") +{ + $quotation_template = $template[0]->template_desc; +} +else +{ + $quotation_template = "\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {quotation_information_lbl}{print}
    {quotation_id_lbl} : {quotation_id}
    {quotation_number_lbl} : {quotation_number}
    {quotation_date_lbl} : {quotation_date}
    {quotation_status_lbl} : {quotation_status}
    {quotation_note_lbl} : {quotation_note}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {account_information_lbl}
    {account_information}{quotation_custom_field_list}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {quotation_detail_lbl}
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n{product_loop_start} \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n{product_loop_end}\r\n\r\n
    {product_name_lbl}{note_lbl}{price_lbl}{quantity_lbl}{total_price_lbl}
    {product_thumb_image}{product_name}
    ({product_number_lbl} - {product_number})
    {product_accessory}
    {product_attribute}
    {product_userfields}
    {product_wrapper}{product_price}{product_quantity}{product_total_price}
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    {quotation_subtotal_lbl} : {quotation_subtotal}
    {quotation_vat_lbl} : {quotation_vat}
    {quotation_discount_lbl} : {quotation_discount}
    \r\n
    \r\n
    {total_lbl} :{quotation_total}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    "; +} + +$print = $app->input->getInt('print'); +$p_url = explode('?', $app->input->server->get('REQUEST_URI', '', 'raw')); +$print_tag = ''; + +if ($print) +{ + $print_tag = "" . JText::_("; +} +else +{ + $print_url = $url . "index.php?tmpl=component&option=com_redshop&view=quotation_detail&quoid=" . $quoid . "&print=1"; + $print_tag = "" . JText::_("; +} + +$quotation_template = str_replace("{print}", $print_tag, $quotation_template); + +$search [] = "{quotation_id}"; +$replace [] = $quoid; + +$search [] = "{quotation_number}"; +$replace [] = $quotationDetail->quotation_number; + +$search [] = "{quotation_date}"; +$replace [] = $redconfig->convertDateFormat($quotationDetail->quotation_cdate); + +$search [] = "{quotation_customer_note_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_CUSTOMER_NOTE'); + +$search [] = "{quotation_customer_note}"; +$replace[] = $quotationDetail->quotation_customer_note; + +$statustext = RedshopHelperQuotation::getQuotationStatusName($quotationDetail->quotation_status); + +if ($quotationDetail->quotation_status == '2') +{ + $frm = "
    + " . JText::_('COM_REDSHOP_ACCEPT') . " + " . JText::_('COM_REDSHOP_REJECT') . " + + + + + + + +
    + " + . "
    +
    "; + + $quotation_template = str_replace('{quotation_customer_note_lbl}', '', $quotation_template); + $quotation_template = str_replace('{quotation_customer_note}', '', $quotation_template); +} +elseif ($quotationDetail->quotation_status == '3') +{ + $frm = "
    + + + + + + + +
    "; +} +elseif ($quotationDetail->quotation_status == '5') +{ + $frm = " (" . JText::_('COM_REDSHOP_ORDER_ID') . "-" . $quotationDetail->order_id . " )"; +} +else +{ + $frm = ''; +} + +$search [] = "{quotation_status}"; +$replace[] = $statustext . $frm; + +$search [] = "{quotation_note_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_NOTE'); + +$search [] = "{quotation_note}"; +$replace[] = $quotationDetail->quotation_note; + +$billadd = ""; + +if ($quotationDetail->user_id != 0) +{ + $billadd = RedshopLayoutHelper::render( + 'cart.billing', + array('billingAddresses' => $quotationDetail), + null, + array('client' => 0) + ); +} +else +{ + if (!isset($quotationDetail->user_info_id)) + { + $quotationDetail->user_info_id = 0; + } + + if ($quotationDetail->quotation_email != "") + { + $billadd .= RedshopLayoutHelper::render( + 'fields.display', + array( + 'extra_field_label' => JText::_("COM_REDSHOP_EMAIL"), + 'extra_field_value' => $quotationDetail->quotation_email + ) + ); + } +} + +if (strstr($quotation_template, "{quotation_custom_field_list}")) +{ + $billadd .= RedshopHelperExtrafields::listAllFieldDisplay(16, $quotationDetail->quotation_id); + $quotation_template = str_replace("{quotation_custom_field_list}", "", $quotation_template); +} +else +{ + $quotation_template = RedshopHelperExtrafields::listAllFieldDisplay(16, $quotationDetail->quotation_id, 0, "", $quotation_template); +} + +$search [] = "{account_information}"; +$replace [] = $billadd; + +$product_name = ""; + +$product_note = ""; + +$product_price = ""; + +$product_quantity = ""; + +$product_total_price = ""; + +$template_start = $quotation_template; +$template_end = ""; +$template_middle = ""; +$template_sdata = explode('{product_loop_start}', $quotation_template); + +if (count($template_sdata) > 0) +{ + $template_start = $template_sdata [0]; + + if (count($template_sdata) > 1) + { + $template_edata = explode('{product_loop_end}', $template_sdata[1]); + + if (count($template_edata) > 1) + { + $template_end = $template_edata [1]; + $template_middle = $template_edata [0]; + } + } +} + +$cart_mdata = ''; +$subtotal_excl_vat = 0; + +for ($i = 0, $in = count($quotationProducts); $i < $in; $i++) +{ + $cart_mdata .= $template_middle; + $wrapper_name = ""; + + if ($quotationProducts[$i]->product_wrapperid) + { + $wrapper = $producthelper->getWrapper($quotationProducts[$i]->product_id, $quotationProducts[$i]->product_wrapperid); + + if (count($wrapper) > 0) + { + $wrapper_name = JText::_('COM_REDSHOP_WRAPPER') . ":
    " . $wrapper[0]->wrapper_name . "(" . $producthelper->getProductFormattedPrice($quotationProducts[$i]->wrapper_price) . ")"; + } + } + + if ($quotationProducts [$i]->is_giftcard == 1) + { + $productUserFields = RedshopHelperQuotation::displayQuotationUserField($quotationProducts[$i]->quotation_item_id, 13); + $giftcardData = RedshopEntityGiftcard::getInstance($quotationProducts[$i]->product_id)->getItem(); + + $product_number = ""; + } + else + { + $productUserFields = RedshopHelperQuotation::displayQuotationUserField($quotationProducts[$i]->quotation_item_id, 12); + + $product = $producthelper->getProductById($quotationProducts[$i]->product_id); + + $product_number = $product->product_number; + + $product_image_path = ""; + + if ($product->product_full_image) + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $product->product_full_image)) + { + $product_image_path = $product->product_full_image; + } + else + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'))) + { + $product_image_path = Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'); + } + } + } + else + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'))) + { + $product_image_path = Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'); + } + } + + if ($product_image_path) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $product_image_path, + '', + 'thumb', + 'product', + Redshop::getConfig()->get('CART_THUMB_WIDTH'), + Redshop::getConfig()->get('CART_THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $product_image = "
    "; + } + else + { + $product_image = "
    "; + } + } + + $product_name = "
    " . $quotationProducts[$i]->product_name . "
    "; + $product_note = "
    " . $wrapper_name . "
    "; + $product_price = "
    " . $producthelper->getProductFormattedPrice($quotationProducts[$i]->product_price) . "
    "; + $product_excl_price = "
    " . $producthelper->getProductFormattedPrice($quotationProducts[$i]->product_excl_price) . "
    "; + $product_quantity = '
    ' . $quotationProducts[$i]->product_quantity . '
    '; + + $product_total_price = $quotationProducts[$i]->product_quantity * $quotationProducts[$i]->product_price; + $product_total_excl_price = $quotationProducts[$i]->product_quantity * $quotationProducts[$i]->product_excl_price; + + $cart_mdata = str_replace("{product_thumb_image}", $product_image, $cart_mdata); + $cart_mdata = str_replace("{product_name}", $product_name, $cart_mdata); + $cart_mdata = str_replace("{product_s_desc}", $product->product_s_desc, $cart_mdata); + + $cart_mdata = RedshopTagsReplacer::_( + 'attribute', + $cart_mdata, + array( + 'product_attribute' => $quotationProducts[$i]->product_attribute, + ) + ); + + $cart_mdata = str_replace("{product_accessory}", $quotationProducts[$i]->product_accessory, $cart_mdata); + + $cart_mdata = str_replace("{product_number}", $product_number, $cart_mdata); + $cart_mdata = str_replace("{product_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER_LBL'), $cart_mdata); + $cart_mdata = str_replace("{product_userfields}", $productUserFields, $cart_mdata); + $cart_mdata = str_replace("{product_wrapper}", $product_note, $cart_mdata); + + // ProductFinderDatepicker Extra Field Start + + $cart_mdata = $producthelper->getProductFinderDatepickerValue($cart_mdata, $quotationProducts[$i]->product_id, $fieldArray); + + // ProductFinderDatepicker Extra Field End + + if ($quotationDetail->quotation_status == 1) + { + $cart_mdata = str_replace("{product_price}", "", $cart_mdata); + $cart_mdata = str_replace("{product_total_price}", "", $cart_mdata); + $cart_mdata = str_replace("{product_price_excl_vat}", "", $cart_mdata); + $cart_mdata = str_replace("{product_total_price_excl_vat}", "", $cart_mdata); + } + else + { + $cart_mdata = str_replace("{product_price}", $product_price, $cart_mdata); + $cart_mdata = str_replace("{product_total_price}", $producthelper->getProductFormattedPrice($product_total_price), $cart_mdata); + $cart_mdata = str_replace("{product_price_excl_vat}", $product_excl_price, $cart_mdata); + $cart_mdata = str_replace("{product_total_price_excl_vat}", $producthelper->getProductFormattedPrice($product_total_excl_price), $cart_mdata); + } + + $cart_mdata = str_replace("{product_quantity}", $product_quantity, $cart_mdata); +} + +$quotation_template = $template_start . $cart_mdata . $template_end; + +if ($quotationDetail->quotation_status == 1) +{ + $quotation_total = ""; + $quotation_subtotal = ""; + $quotation_tax = ""; + $quotation_discount = ""; +} +else +{ + $quotation_total = $producthelper->getProductFormattedPrice($quotationDetail->quotation_total); + $quotation_subtotal = $producthelper->getProductFormattedPrice($quotationDetail->quotation_subtotal); + $quotation_tax = $producthelper->getProductFormattedPrice($quotationDetail->quotation_tax); + $quotation_discount = $producthelper->getProductFormattedPrice($quotationDetail->quotation_discount); +} + +$search [] = "{quotation_discount}"; +$replace [] = $quotation_discount; + +$search[] = "{quotation_discount_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_DISCOUNT_LBL'); + +$search [] = "{quotation_subtotal}"; +$replace [] = $quotation_subtotal; + +$search[] = "{quotation_id_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_ID'); + +$search[] = "{quotation_number_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_NUMBER'); + +$search[] = "{quotation_date_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_DATE'); + +$search[] = "{quotation_status_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_STATUS'); + +$search[] = "{quotation_information_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_INFORMATION'); + +$search[] = "{account_information_lbl}"; +$replace[] = JText::_('COM_REDSHOP_ACCOUNT_INFORMATION'); + +$search[] = "{quotation_detail_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_DETAILS'); + +$search[] = "{product_name_lbl}"; +$replace[] = JText::_('COM_REDSHOP_PRODUCT_NAME'); + +$search[] = "{note_lbl}"; +$replace[] = JText::_('COM_REDSHOP_NOTE_LBL'); + +$search[] = "{price_lbl}"; +$replace[] = JText::_('COM_REDSHOP_PRICE_LBL'); + +$search[] = "{quantity_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUANTITY_LBL'); + +$search[] = "{total_price_lbl}"; +$replace[] = JText::_('COM_REDSHOP_TOTAL_PRICE_LBL'); + +$search[] = "{quotation_subtotal_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_SUBTOTAL'); + +$search[] = "{total_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_TOTAL'); + +$search [] = "{quotation_total}"; +$replace [] = $quotation_total; + +$search[] = "{quotation_tax_lbl}"; +$replace[] = JText::_('COM_REDSHOP_QUOTATION_TAX'); + +$search [] = "{quotation_tax}"; +$replace [] = $quotation_tax; + +$message = str_replace($search, $replace, $quotation_template); + +$message = RedshopHelperTemplate::parseRedshopPlugin($message); +echo eval("?>" . $message . " + + \ No newline at end of file diff --git a/component/site/views/quotation_detail/view.html.php b/component/site/views/quotation_detail/view.html.php new file mode 100644 index 00000000000..693b3211084 --- /dev/null +++ b/component/site/views/quotation_detail/view.html.php @@ -0,0 +1,94 @@ +input->getInt('print'); + + if ($print) + { + ?> + + input->getInt('Itemid'); + $quoid = $app->input->getInt('quoid'); + $encr = $app->input->getString('encr'); + + if (!$quoid) + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=account&Itemid=' . $itemId, false)); + } + + $quotationDetail = RedshopHelperQuotation::getQuotationDetail($quoid); + + if (count($quotationDetail) < 1) + { + JError::raiseWarning(404, JText::_('COM_REDSHOP_NOACCESS_QUOTATION')); + echo JText::_('COM_REDSHOP_NOACCESS_QUOTATION'); + + return; + } + + if (!$user->id) + { + if (isset($encr)) + { + $model = $this->getModel('quotation_detail'); + $authorization = $model->checkAuthorization($quoid, $encr); + + if (!$authorization) + { + JError::raiseWarning(404, JText::_('COM_REDSHOP_QUOTATION_ENCKEY_FAILURE')); + echo JText::_('COM_REDSHOP_QUOTATION_ENCKEY_FAILURE'); + + return false; + } + } + else + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=login&Itemid=' . $app->input->getInt('Itemid'))); + + return; + } + } + else + { + if (count($quotationDetail) > 0 && $quotationDetail->user_id != $user->id) + { + JError::raiseWarning(404, JText::_('COM_REDSHOP_NOACCESS_QUOTATION')); + echo JText::_('COM_REDSHOP_NOACCESS_QUOTATION'); + + return; + } + } + + parent::display($tpl); + } +} diff --git a/component/site/views/ratings/index.html b/component/site/views/ratings/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/ratings/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/ratings/tmpl/default.php b/component/site/views/ratings/tmpl/default.php new file mode 100644 index 00000000000..44a0ca17ec0 --- /dev/null +++ b/component/site/views/ratings/tmpl/default.php @@ -0,0 +1,115 @@ +getModel('ratings'); + +$main_template = RedshopHelperTemplate::getTemplate("review"); + +if (count($main_template) > 0 && $main_template[0]->template_desc) +{ + $main_template = $main_template[0]->template_desc; +} +else +{ + $main_template = "
    {product_loop_start}

    {product_title}

    {review_loop_start}
    {fullname}
    {title}
    {comment}
    {stars}
    {review_loop_end}
    {product_loop_end}
    "; +} + +if ($this->params->get('show_page_heading', 1)) +{ + if ($this->params->get('page_title')) + { + ?> +

    + escape($this->params->get('page_title')); ?> +

    + get('FAVOURED_REVIEWS') != "" || Redshop::getConfig()->get('FAVOURED_REVIEWS') != 0) + $mainblock = Redshop::getConfig()->get('FAVOURED_REVIEWS'); +else + $mainblock = 5; + +if (strstr($main_template, "{product_loop_start}") && strstr($main_template, "{product_loop_end}")) +{ + $product_start = explode("{product_loop_start}", $main_template); + $product_end = explode("{product_loop_end}", $product_start[1]); + $product_template = $product_end[0]; + + $product_data = ""; + + for ($i = 0; $i < count($this->detail); $i++) + { + $product_data .= $product_template; + $product_data = str_replace("{product_title}", $this->detail[$i]->product_name, $product_data); + + if (strstr($product_data, "{review_loop_start}") && strstr($product_data, "{review_loop_end}")) + { + $review_start = explode("{review_loop_start}", $product_data); + $review_end = explode("{review_loop_end}", $review_start[1]); + $review_template = $review_end[0]; + + $review_data = ""; + $reviews = $model->getProductreviews($this->detail[$i]->product_id); + + if (count($reviews) > 0) + { + for ($j = 0; $j < $mainblock && $j < count($reviews); $j++) + { + $review_data .= $review_template; + $fullname = $reviews[$j]->firstname . " " . $reviews[$j]->lastname; + $starimage = ''; + + $review_data = str_replace("{fullname}", $fullname, $review_data); + $review_data = str_replace("{title}", $reviews[$j]->title, $review_data); + $review_data = str_replace("{comment}", $reviews[$j]->comment, $review_data); + $review_data = str_replace("{reviewdate}", $redconfig->convertDateFormat($reviews[$j]->time), $review_data); + $review_data = str_replace("{stars}", $starimage, $review_data); + } + + if ($mainblock < count($reviews)) + { + $review_data .= ''; + } + + $review_data .= ''; + } + + $product_data = $review_start[0] . $review_data . $review_end[1]; + } + } + + $main_template = $product_start[0] . $product_data . $product_end[1]; +} + +if (strstr($main_template, "{pagination}")) +{ + $main_template = str_replace("{pagination}", "", $main_template); +} + +echo eval("?>" . $main_template . " + + \ No newline at end of file diff --git a/component/site/views/ratings/view.html.php b/component/site/views/ratings/view.html.php new file mode 100644 index 00000000000..c29fdcdf487 --- /dev/null +++ b/component/site/views/ratings/view.html.php @@ -0,0 +1,29 @@ +getParams('com_redshop'); + + $detail = $this->get('data'); + $pagination = $this->get('pagination'); + + $this->detail = $detail; + $this->pagination = $pagination; + $this->params = $params; + parent::display($tpl); + } +} diff --git a/component/site/views/registration/index.html b/component/site/views/registration/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/registration/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/registration/tmpl/default.php b/component/site/views/registration/tmpl/default.php new file mode 100644 index 00000000000..c8779154c04 --- /dev/null +++ b/component/site/views/registration/tmpl/default.php @@ -0,0 +1,88 @@ +input->getInt('Itemid'); +$post = $app->input->post->getArray(); + +$userhelper = rsUserHelper::getInstance(); +$rsCarthelper = rsCarthelper::getInstance(); + +$is_company = $this->lists['is_company']; + +if ($this->params->get('show_page_heading', 1)) +{ + if ($this->params->get('page_title')) + { + ?> +

    + +

    + + +
    + lists['showCustomerdesc'];?>> + + + lists['showCompanydesc']; ?>> + + +
    + +
    + + +
    + +
    +
    + + + lists, 0, 1, 1); + + echo RedshopLayoutHelper::render('registration.captcha'); + + if (Redshop::getConfig()->get('SHOW_TERMS_AND_CONDITIONS') == 1) + { + echo $rsCarthelper->replaceTermsConditions("{terms_and_conditions}"); + } + + ?> + + + +
    + + + + + + + + + + + + + +
    +
    diff --git a/component/site/views/registration/tmpl/default.xml b/component/site/views/registration/tmpl/default.xml new file mode 100644 index 00000000000..63ec382dcf8 --- /dev/null +++ b/component/site/views/registration/tmpl/default.xml @@ -0,0 +1,16 @@ + + + + + + + + + +
    + +
    +
    +
    \ No newline at end of file diff --git a/component/site/views/registration/tmpl/index.html b/component/site/views/registration/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/registration/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/registration/view.html.php b/component/site/views/registration/view.html.php new file mode 100644 index 00000000000..d0b2e16ff23 --- /dev/null +++ b/component/site/views/registration/view.html.php @@ -0,0 +1,90 @@ +input->getInt('Itemid'); + + $user = JFactory::getUser(); + $session = JFactory::getSession(); + $auth = $session->get('auth'); + + if ($user->id || (isset($auth['users_info_id']) && $auth['users_info_id'] > 0)) + { + $app->redirect(JRoute::_('index.php?option=com_redshop&view=account&Itemid=' . $Itemid)); + } + + $params = $app->getParams('com_redshop'); + JHtml::_('redshopjquery.framework'); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/jquery.validate.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.common.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/jquery.metadata.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.registration.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::stylesheet('com_redshop/redshop.validation.min.css', array(), true); + + JPluginHelper::importPlugin('redshop_vies_registration'); + + $jInput = JFactory::getApplication()->input; + $openToStretcher = 0; + $isCompany = $jInput->getInt('is_company', 0); + + if ($isCompany == 1 || Redshop::getConfig()->get('DEFAULT_CUSTOMER_REGISTER_TYPE') == 2) + { + $openToStretcher = 1; + } + + // Allow registration type settings + $lists['allowCustomer'] = ""; + $lists['allowCompany'] = ""; + $lists['showCustomerdesc'] = ""; + $lists['showCompanydesc'] = "style='display:none;'"; + + if (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') == 1) + { + $lists['allowCompany'] = "style='display:none;'"; + $openToStretcher = 0; + } + elseif (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') == 2) + { + $lists['allowCustomer'] = "style='display:none;'"; + $lists['showCustomerdesc'] = "style='display:none;'"; + $openToStretcher = 1; + } + + if (Redshop::getConfig()->get('DEFAULT_CUSTOMER_REGISTER_TYPE') == 2) + { + $lists['showCompanydesc'] = ''; + $lists['showCustomerdesc'] = "style='display:none;'"; + } + + $lists['is_company'] = ($openToStretcher == 1 || ($isCompany == 1)) ? 1 : 0; + + if ($lists['is_company']) + { + // Field_section 8 : Company Address + $lists['extra_field_company'] = Redshop\Fields\SiteHelper::renderFields(8); + } + else + { + // Field_section 7 : Customer Registration + $lists['extra_field_user'] = Redshop\Fields\SiteHelper::renderFields(7); + } + + $this->lists = $lists; + $this->params = $params; + parent::display($tpl); + } +} diff --git a/component/site/views/search/index.html b/component/site/views/search/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/search/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/search/tmpl/default.php b/component/site/views/search/tmpl/default.php new file mode 100644 index 00000000000..bca02319ec7 --- /dev/null +++ b/component/site/views/search/tmpl/default.php @@ -0,0 +1,13 @@ +onRSProductSearch(); +?> diff --git a/component/site/views/search/tmpl/featuredproduct.php b/component/site/views/search/tmpl/featuredproduct.php new file mode 100644 index 00000000000..bca02319ec7 --- /dev/null +++ b/component/site/views/search/tmpl/featuredproduct.php @@ -0,0 +1,13 @@ +onRSProductSearch(); +?> diff --git a/component/site/views/search/tmpl/featuredproduct.xml b/component/site/views/search/tmpl/featuredproduct.xml new file mode 100644 index 00000000000..46d89de54ab --- /dev/null +++ b/component/site/views/search/tmpl/featuredproduct.xml @@ -0,0 +1,17 @@ + + + + + + + + +
    + +
    +
    +
    + + + diff --git a/component/site/views/search/tmpl/index.html b/component/site/views/search/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/search/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/search/tmpl/newproduct.php b/component/site/views/search/tmpl/newproduct.php new file mode 100644 index 00000000000..bca02319ec7 --- /dev/null +++ b/component/site/views/search/tmpl/newproduct.php @@ -0,0 +1,13 @@ +onRSProductSearch(); +?> diff --git a/component/site/views/search/tmpl/newproduct.xml b/component/site/views/search/tmpl/newproduct.xml new file mode 100644 index 00000000000..949bcb4ed9a --- /dev/null +++ b/component/site/views/search/tmpl/newproduct.xml @@ -0,0 +1,22 @@ + + + + + + + + + +
    + + + + +
    +
    +
    diff --git a/component/site/views/search/tmpl/productonsale.php b/component/site/views/search/tmpl/productonsale.php new file mode 100644 index 00000000000..bca02319ec7 --- /dev/null +++ b/component/site/views/search/tmpl/productonsale.php @@ -0,0 +1,13 @@ +onRSProductSearch(); +?> diff --git a/component/site/views/search/tmpl/productonsale.xml b/component/site/views/search/tmpl/productonsale.xml new file mode 100644 index 00000000000..bcfd3724bae --- /dev/null +++ b/component/site/views/search/tmpl/productonsale.xml @@ -0,0 +1,21 @@ + + + + + + + + + +
    + + + +
    +
    +
    + diff --git a/component/site/views/search/tmpl/redfilter.php b/component/site/views/search/tmpl/redfilter.php new file mode 100644 index 00000000000..bca02319ec7 --- /dev/null +++ b/component/site/views/search/tmpl/redfilter.php @@ -0,0 +1,13 @@ +onRSProductSearch(); +?> diff --git a/component/site/views/search/tmpl/redfilter.xml b/component/site/views/search/tmpl/redfilter.xml new file mode 100644 index 00000000000..8c9baf48daa --- /dev/null +++ b/component/site/views/search/tmpl/redfilter.xml @@ -0,0 +1,17 @@ + + + + + + + + + +
    + + +
    +
    +
    diff --git a/component/site/views/search/view.html.php b/component/site/views/search/view.html.php new file mode 100644 index 00000000000..0a02d992e4f --- /dev/null +++ b/component/site/views/search/view.html.php @@ -0,0 +1,792 @@ +getParams('com_redshop'); + $document = JFactory::getDocument(); + + $layout = $app->input->getCmd('layout', ''); + $model = $this->getModel('search'); + + if ($layout == 'default') + { + $pagetitle = JText::_('COM_REDSHOP_SEARCH'); + $document->setTitle($pagetitle); + } + + if ($layout == 'redfilter') + { + $session = JSession::getInstance('none', array()); + $tagid = $app->input->getInt('tagid', 0); + $typeid = $app->input->getInt('typeid', 0); + $remove = $app->input->getInt('remove', 0); + $Itemid = $app->input->getInt('Itemid', 0); + $cntproduct = $app->input->getInt('cnt', 0); + $getredfilter = $session->get('redfilter'); + + if (empty($getredfilter)) + { + $redfilter = array(); + } + else + { + $redfilter = $getredfilter; + } + + if ($tagid != 0 && $typeid != 0 && !array_key_exists($typeid, $redfilter)) + { + $redfilter[$typeid] = $tagid; + } + + if ($remove == 1) + { + if ($typeid != 0) + { + unset($redfilter[$typeid]); + $session->set('redfilter', $redfilter); + + $this->setLayout('redfilter'); + $model->getRedFilterProduct($remove); + + echo $model->mod_redProductfilter($Itemid, $typeid) . '~'; + } + else + { + $session->destroy('redfilter'); + } + } + + $session->set('redfilter', $redfilter); + + if ($cntproduct == 1) + { + $mypid = $app->input->getInt('pid', 0); + + $app->redirect(JRoute::_('index.php?option=com_redshop&view=product&pid=' . $mypid . '&Itemid=' . $Itemid)); + } + } + + $order_data = RedshopHelperUtility::getOrderByList(); + $getorderby = $app->input->getString('order_by', + $app->getUserState('order_by', Redshop::getConfig()->get('DEFAULT_PRODUCT_ORDERING_METHOD')) + ); + $app->setUserState('order_by', $getorderby); + JFactory::getApplication()->input->set('order_by', $app->getUserState('order_by')); + $lists['order_select'] = JHTML::_('select.genericlist', $order_data, 'order_by', 'class="inputbox" size="1" onchange="document.orderby_form.submit();" ', 'value', 'text', $getorderby); + $search = $this->get('Data'); + $pagination = $this->get('Pagination'); + + $this->params = $params; + $this->lists = $lists; + $this->templatedata = $model->getState('templateDesc'); + $this->search = $search; + $this->pagination = $pagination; + parent::display($tpl); + } + + /** + * Generate product search output + */ + public function onRSProductSearch() + { + if (count($this->search) > 0) + { + JPluginHelper::importPlugin('redshop_product'); + + $app = JFactory::getApplication(); + $input = JFactory::getApplication()->input; + $input->set('order_by', $app->getUserState('order_by')); + + $dispatcher = RedshopHelperUtility::getDispatcher(); + $producthelper = productHelper::getInstance(); + + $Itemid = $app->input->getInt('Itemid'); + $search_type = $app->input->getCmd('search_type'); + $cid = $app->input->getInt('category_id'); + $manufacture_id = $app->input->getInt('manufacture_id'); + + $templateid = $app->input->getInt('templateid'); + + // Cmd removes space between to words + $keyword = $app->input->getString('keyword'); + $layout = $app->input->getCmd('layout', 'default'); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('name')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('id') . ' = ' . $db->q((int) $input->getInt('cid', 0))); + + $cat_name = $db->setQuery($query)->loadResult(); + + $model = $this->getModel('search'); + $total = $model->getTotal(); + + JHTML::_('behavior.modal'); + $url = JURI::base(); + + if ($this->params->get('page_title') != "") + { + $pagetitle = $this->params->get('page_title'); + } + else + { + $pagetitle = JText::_('COM_REDSHOP_SEARCH'); + } + + if ($this->params->get('show_page_heading', 1)) + { + echo '

    '; + echo $pagetitle; + echo '

    '; + } + + echo '
    '; + $category_tmpl = ""; + + if ($this->templatedata != "") + { + $template_desc = $this->templatedata; + } + else + { + $template_desc = "
    {print}
    \r\n
    \r\n
    {category_main_description}
    \r\n

    {if subcats} {category_loop_start}

    \r\n
    \r\n
    \r\n
    {category_thumb_image}
    \r\n
    \r\n

    {category_name}

    \r\n{category_description}
    \r\n
    \r\n
    \r\n

    {category_loop_end} {subcats end if}

    \r\n
    \r\n
    \r\n
    {order_by}
    \r\n
    \r\n
    {product_loop_start}\r\n
    \r\n
    \r\n
    {product_thumb_image}
    \r\n
    \r\n

    {product_name}

    \r\n
    \r\n
    {product_price}
    \r\n
    {read_more}
    \r\n
    {product_rating_summary}
    \r\n
    {form_addtocart:add_to_cart1}
    \r\n
    \r\n
    \r\n{product_loop_end}\r\n
    \r\n
    \r\n
    {pagination}
    "; + } + + $template_org = $template_desc; + $template_d1 = explode("{category_loop_start}", $template_org); + + if (count($template_d1) > 1) + { + $template_d2 = explode("{category_loop_end}", $template_d1[1]); + + if (count($template_d2) > 0) + { + $category_tmpl = $template_d2[0]; + } + } + + $template_org = str_replace($category_tmpl, "", $template_org); + $template_org = str_replace("{category_loop_start}", "", $template_org); + $template_org = str_replace("{category_loop_end}", "", $template_org); + $print = $app->input->getInt('print'); + $p_url = @ explode('?', $app->input->server->get('REQUEST_URI', '', 'raw')); + $print_tag = ''; + + if ($print) + { + $print_tag = "" . JText::_("; + } + else + { + $print_url = $url . "index.php?option=com_redshop&view=search&print=1&tmpl=component"; + $print_tag = "" . JText::_("; + } + + if (strstr($template_org, '{compare_product_div}')) + { + $compareProductDiv = ''; + + if (Redshop::getConfig()->get('PRODUCT_COMPARISON_TYPE') != '') + { + $compareProductDiv = RedshopLayoutHelper::render('product.compare_product'); + } + + $template_org = str_replace('{compare_product_div}', $compareProductDiv, $template_org); + } + + // Skip html if nosubcategory + if (strstr($template_org, "{if subcats}")) + { + $template_d1 = explode("{if subcats}", $template_org); + $template_d2 = explode("{subcats end if}", $template_d1[1]); + $template_org = $template_d1[0] . $template_d2[1]; + } + + // End skip html if nosubcategory + $template_org = str_replace("{print}", $print_tag, $template_org); + $template_org = str_replace("{product_price_slider}", '', $template_org); + $template_org = str_replace("{filter_by}", '', $template_org); + $template_org = str_replace("{template_selector_category_lbl}", '', $template_org); + $template_org = str_replace("{template_selector_category}", '', $template_org); + $template_org = str_replace("{category_main_name}", $cat_name, $template_org); + $template_org = str_replace("{category_main_description}", '', $template_org); + $template_org = str_replace("{category_description}", '', $template_org); + $template_org = str_replace("{category_short_desc}", '', $template_org); + $template_org = str_replace("{category_name}", '', $template_org); + $template_org = str_replace("{if subcats}", '', $template_org); + $template_org = str_replace("{subcats end if}", '', $template_org); + $template_org = str_replace("{category_main_thumb_image_3}", '', $template_org); + $template_org = str_replace("{category_main_short_desc}", '', $template_org); + $template_org = str_replace("{category_main_thumb_image_2}", '', $template_org); + $template_org = str_replace("{category_main_thumb_image_1}", '', $template_org); + $template_org = str_replace("{category_main_thumb_image}", '', $template_org); + $template_org = str_replace("{attribute_price_without_vat}", '', $template_org); + $template_org = str_replace("{redproductfinderfilter_formstart}", '', $template_org); + $template_org = str_replace("{redproductfinderfilter:rp_myfilter}", '', $template_org); + $template_org = str_replace("{redproductfinderfilter_formend}", '', $template_org); + $template_org = str_replace("{total_product}", $total, $template_org); + $template_org = str_replace("{total_product_lbl}", JText::_('COM_REDSHOP_TOTAL_PRODUCT'), $template_org); + + // Replace redproductfilder filter tag + if (strstr($template_org, "{redproductfinderfilter:")) + { + $redProductFinerHelper = JPATH_SITE . "/components/com_redproductfinder/helpers/redproductfinder_helper.php"; + if (file_exists($redProductFinerHelper)) + { + include_once $redProductFinerHelper; + $redproductfinder_helper = new redproductfinder_helper; + $hdnFields = array('texpricemin' => '0', 'texpricemax' => '0', 'manufacturer_id' => $filter_by, 'category_template' => $templateid); + $hide_filter_flag = false; + + if ($this->_id) + { + $prodctofcat = $producthelper->getProductCategory($this->_id); + + if (empty($prodctofcat)) + $hide_filter_flag = true; + } + + $template_org = $redproductfinder_helper->replaceProductfinder_tag($template_org, $hdnFields, $hide_filter_flag); + } + } + + // Replace redproductfilder filter tag end here + $template_d1 = explode("{product_loop_start}", $template_org); + $template_d2 = explode("{product_loop_end}", $template_d1[1]); + $template_tmp_desc = $template_d2[0]; + $template_desc = $template_d2[0]; + + // Order By + $order_by = ""; + $orderby_form = "
    "; + $orderby_form .= $this->lists['order_select']; + $orderby_form .= " + + + + +
    "; + + if (strstr($template_desc, '{order_by}')) + { + $order_by = $orderby_form; + } + + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(1, 1, 1); + $extraFieldsForCurrentTemplate = RedshopHelperTemplate::getExtraFieldsForCurrentTemplate($extraFieldName, $template_desc, 1); + $attribute_template = \Redshop\Template\Helper::getAttribute($template_desc); + + $total_product = $model->getTotal(); + $endlimit = $model->getState('list.limit'); + $start = $model->getState('list.start'); + + $tagarray = RedshopHelperText::getTextLibraryTagArray(); + $data = ""; + $count_no_user_field = 0; + $fieldArray = RedshopHelperExtrafields::getSectionFieldList(17, 0, 0); + + for ($i = 0, $countSearch = count($this->search); $i < $countSearch; $i++) + { + $data_add = $template_desc; + + // RedSHOP Product Plugin + $params = array(); + $dispatcher->trigger('onPrepareProduct', array(&$data_add, &$params, $this->search[$i])); + + $thum_image = ""; + $pname = RedshopHelperUtility::maxChars($this->search[$i]->product_name, Redshop::getConfig()->get('CATEGORY_PRODUCT_TITLE_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_PRODUCT_TITLE_END_SUFFIX')); + + if ($search_type == 'product_number') + { + $product_number = preg_replace("/($keyword)/i", "$1", $this->search[$i]->product_number); + $pro_s_desc = $this->search[$i]->product_s_desc; + $pro_desc = $this->search[$i]->product_desc; + } + else + { + $product_number = $this->search[$i]->product_number; + $pro_s_desc = $this->search[$i]->product_s_desc; + $pro_desc = $this->search[$i]->product_desc; + + if (!empty($keyword) && !in_array($keyword, $tagarray)) + { + $regex = "/" . preg_quote($keyword, "/") . "(?![^<]*>)/"; + $pname = preg_replace($regex, "" . $keyword . "", $pname); + $product_number = preg_replace($regex, "" . $keyword . "", $product_number); + $pro_s_desc = preg_replace($regex, "" . $keyword . "", $pro_s_desc); + $pro_desc = preg_replace($regex, "" . $keyword . "", $pro_desc); + } + } + + $pro_s_desc = RedshopHelperUtility::maxChars($pro_s_desc, Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_MAX_CHARS'), Redshop::getConfig()->get('CATEGORY_PRODUCT_DESC_END_SUFFIX')); + + $ItemData = $producthelper->getMenuInformation(0, 0, '', 'product&pid=' . $this->search[$i]->product_id); + + if (!empty($ItemData)) + { + $pItemid = $ItemData->id; + } + else + { + $pItemid = RedshopHelperRouter::getItemId($this->search[$i]->product_id, $this->search[$i]->category_id); + } + + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $this->search[$i]->product_id . '&Itemid=' . $pItemid); + + if (strstr($data_add, '{product_name}')) + { + $pname = "" . $pname . ""; + $data_add = str_replace("{product_name}", $pname, $data_add); + } + + if (strstr($data_add, '{product_name_nolink}')) + { + $data_add = str_replace("{product_name_nolink}", $pname, $data_add); + } + + $readmore = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $data_add = str_replace("{read_more}", $readmore, $data_add); + $data_add = str_replace("{read_more_link}", $link, $data_add); + + if (strstr($data_add, "{product_delivery_time}")) + { + $product_delivery_time = $producthelper->getProductMinDeliveryTime($this->search[$i]->product_id); + + if ($product_delivery_time != "") + { + $data_add = str_replace("{delivery_time_lbl}", JText::_('DELIVERY_TIME'), $data_add); + $data_add = str_replace("{product_delivery_time}", $product_delivery_time, $data_add); + } + else + { + $data_add = str_replace("{delivery_time_lbl}", "", $data_add); + $data_add = str_replace("{product_delivery_time}", "", $data_add); + } + } + + // Product Review/Rating + // Fetching reviews + $final_avgreview_data = Redshop\Product\Rating::getRating($this->search[$i]->product_id); + + // Attribute ajax chage + $data_add = str_replace("{product_rating_summary}", $final_avgreview_data, $data_add); + $data_add = $producthelper->getJcommentEditor($this->search[$i], $data_add); + + if ($extraFieldsForCurrentTemplate) + { + $data_add = Redshop\Helper\ExtraFields::displayExtraFields(1, $this->search[$i]->product_id, $extraFieldsForCurrentTemplate, $data_add, true); + } + + $data_add = str_replace("{product_s_desc}", $pro_s_desc, $data_add); + $data_add = str_replace("{product_desc}", $pro_desc, $data_add); + $data_add = str_replace("{product_id_lbl}", JText::_('COM_REDSHOP_PRODUCT_ID_LBL'), $data_add); + $data_add = str_replace("{product_id}", $this->search[$i]->product_id, $data_add); + $data_add = str_replace("{product_number_lbl}", JText::_('COM_REDSHOP_PRODUCT_NUMBER_LBL'), $data_add); + $data_add = str_replace("{product_number}", $product_number, $data_add); + + // Product category tags + $data_add = str_replace("{returntocategory_name}", $this->search[$i]->category_name, $data_add); + + if (strstr($data_add, "{returntoparent_category_name}")) + { + $parentCategoryId = $producthelper->getParentCategory($this->search[$i]->category_id); + + if ($parentCategoryId != 0) + { + $parentCategory = RedshopEntityCategory::getInstance($parentCategoryId)->getItem(); + $data_add = str_replace("{returntoparent_category_name}", $parentCategory->category_name, $data_add); + } + else + { + $data_add = str_replace("{returntoparent_category_name}", '', $data_add); + } + } + + /** + * related Product List in Lightbox + * Tag Format = {related_product_lightbox:[:width][:height]} + */ + if (strstr($data_add, '{related_product_lightbox:')) + { + $related_product = $producthelper->getRelatedProduct($this->search[$i]->product_id); + $rtlnone = explode("{related_product_lightbox:", $data_add); + $rtlntwo = explode("}", $rtlnone[1]); + $rtlnthree = explode(":", $rtlntwo[0]); + $rtln = $rtlnthree[0]; + $rtlnfwidth = (isset($rtlnthree[1])) ? $rtlnthree[1] : "900"; + $rtlnwidthtag = (isset($rtlnthree[1])) ? ":" . $rtlnthree[1] : ""; + + $rtlnfheight = (isset($rtlnthree[2])) ? $rtlnthree[2] : "600"; + $rtlnheighttag = (isset($rtlnthree[2])) ? ":" . $rtlnthree[2] : ""; + + $rtlntag = "{related_product_lightbox:$rtln$rtlnwidthtag$rtlnheighttag}"; + + if (count($related_product) > 0) + { + $linktortln = JURI::root() . "index.php?option=com_redshop&view=product&pid=" . $this->search[$i]->product_id . "&tmpl=component&template=" . $rtln . "&for=rtln"; + $rtlna = '' . JText::_('COM_REDSHOP_RELATED_PRODUCT_LIST_IN_LIGHTBOX') . ''; + } + else + { + $rtlna = ""; + } + + $data_add = str_replace($rtlntag, $rtlna, $data_add); + } + + $data_add = RedshopHelperTax::replaceVatInformation($data_add); + + /************************************ + * Conditional tag + * if product on discount : Yes + * {if product_on_sale} This product is on sale {product_on_sale end if} // OUTPUT : This product is on sale + * NO : // OUTPUT : Display blank + ************************************/ + $data_add = $producthelper->getProductOnSaleComment($this->search[$i], $data_add); + + $data_add = RedshopHelperStockroom::replaceStockroomAmountDetail($data_add, $this->search[$i]->product_id); + + if (strstr($data_add, "{product_thumb_image_3}")) + { + $cimg_tag = '{product_thumb_image_3}'; + $ch_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_3'); + $cw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_3'); + } + elseif (strstr($data_add, "{product_thumb_image_2}")) + { + $cimg_tag = '{product_thumb_image_2}'; + $ch_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_2'); + $cw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_2'); + } + elseif (strstr($data_add, "{product_thumb_image_1}")) + { + $cimg_tag = '{product_thumb_image_1}'; + $ch_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $cw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + else + { + $cimg_tag = '{product_thumb_image}'; + $ch_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $cw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + + $hidden_thumb_image = ""; + $thum_image = Redshop\Product\Image\Image::getImage($this->search[$i]->product_id, $link, $cw_thumb, $ch_thumb); + $data_add = str_replace($cimg_tag, $thum_image . $hidden_thumb_image, $data_add); + + // More documents + if (strstr($data_add, "{more_documents}")) + { + $media_documents = RedshopHelperMedia::getAdditionMediaImage($this->search[$i]->product_id, "product", "document"); + $more_doc = ''; + + for ($m = 0, $countMedia = count($media_documents); $m < $countMedia; $m++) + { + $alttext = RedshopHelperMedia::getAlternativeText( + "product", $media_documents[$m]->section_id, "", $media_documents[$m]->media_id, "document" + ); + + if (!$alttext) + { + $alttext = $media_documents[$m]->media_name; + } + + if (JFile::exists(REDSHOP_FRONT_DOCUMENT_RELPATH . "product/" . $media_documents[$m]->media_name)) + { + $downlink = JURI::root() . 'index.php?tmpl=component&option=com_redshop&view=product&pid=' . $this->search[$i]->product_id . '&task=downloadDocument&fname=' . $media_documents[$m]->media_name . '&Itemid=' . $Itemid; + $more_doc .= ""; + } + } + + $data_add = str_replace("{more_documents}", "" . $more_doc . "", $data_add); + } + + // More documents end + + /************************************************ user fields*******************************************************/ + $hidden_userfield = ""; + $returnArr = $producthelper->getProductUserfieldFromTemplate($data_add); + $template_userfield = $returnArr[0]; + $userfieldArr = $returnArr[1]; + $count_no_user_field = 0; + + if ($template_userfield != "") + { + $ufield = ""; + + for ($ui = 0, $countUserField = count($userfieldArr); $ui < $countUserField; $ui++) + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', '', 0, $this->search[$i]->product_id); + $ufield .= $productUserFields[1]; + + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + $data_add = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $data_add); + $data_add = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $data_add); + } + + $productUserFieldsForm = "
    "; + + if ($ufield != "") + { + $data_add = str_replace("{if product_userfield}", $productUserFieldsForm, $data_add); + $data_add = str_replace("{product_userfield end if}", "
    ", $data_add); + } + else + { + $data_add = str_replace("{if product_userfield}", "", $data_add); + $data_add = str_replace("{product_userfield end if}", "", $data_add); + } + } + elseif (Redshop::getConfig()->get('AJAX_CART_BOX')) + { + $ajax_detail_template_desc = ""; + $ajax_detail_template = \Redshop\Template\Helper::getAjaxDetailBox($this->search[$i]); + + if (null !== $ajax_detail_template) + { + $ajax_detail_template_desc = $ajax_detail_template->template_desc; + } + + $returnArr = $producthelper->getProductUserfieldFromTemplate($ajax_detail_template_desc); + $template_userfield = $returnArr[0]; + $userfieldArr = $returnArr[1]; + + if ($template_userfield != "") + { + $ufield = ""; + + for ($ui = 0, $countUserField = count($userfieldArr); $ui < $countUserField; $ui++) + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', '', 0, $this->search[$i]->product_id); + $ufield .= $productUserFields[1]; + + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + $template_userfield = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $template_userfield); + $template_userfield = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $template_userfield); + } + + if ($ufield != "") + { + $hidden_userfield = "
    " . $template_userfield . "
    "; + } + } + } + + $data_add = $data_add . $hidden_userfield; + + /*************** end user fields ***************/ + + // ProductFinderDatepicker Extra Field Start + + $data_add = $producthelper->getProductFinderDatepickerValue($data_add, $this->search[$i]->product_id, $fieldArray); + + // ProductFinderDatepicker Extra Field End + + /* + * manufacturer data + */ + $manufacturer_id = $this->search[$i]->id; + + if ($manufacturer_id != 0) + { + $manufacturer_link_href = JRoute::_('index.php?option=com_redshop&view=manufacturers&layout=detail&mid=' . $manufacturer_id . '&Itemid=' . $Itemid); + $manufacturer_name = $this->search[$i]->name; + $manufacturer_link = '' . $manufacturer_name . ''; + + if (strstr($data_add, "{manufacturer_link}")) + { + $data_add = str_replace("{manufacturer_name}", "", $data_add); + } + else + { + $data_add = str_replace("{manufacturer_name}", $manufacturer_name, $data_add); + } + + $data_add = str_replace("{manufacturer_link}", $manufacturer_link, $data_add); + } + else + { + $data_add = str_replace("{manufacturer_link}", "", $data_add); + $data_add = str_replace("{manufacturer_name}", "", $data_add); + } + + // End + + // Replace wishlistbutton + $data_add = RedshopHelperWishlist::replaceWishlistTag($this->search[$i]->product_id, $data_add); + + // Replace compare product button + $data_add = Redshop\Product\Compare::replaceCompareProductsButton($this->search[$i]->product_id, 0, $data_add); + + // Checking for child products + if ($this->search[$i]->count_child_products > 0) + { + $isChilds = true; + $attributes = array(); + } + else + { + $isChilds = false; + + // Get attributes + $attributes_set = array(); + + if ($this->search[$i]->attribute_set_id > 0) + { + $attributes_set = RedshopHelperProduct_Attribute::getProductAttribute(0, $this->search[$i]->attribute_set_id, 0, 1); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($this->search[$i]->product_id); + $attributes = array_merge($attributes, $attributes_set); + } + + // Product attribute Start + $totalatt = count($attributes); + + // Check product for not for sale + $data_add = $producthelper->getProductNotForSaleComment($this->search[$i], $data_add, $attributes); + + $data_add = Redshop\Product\Stock::replaceInStock($this->search[$i]->product_id, $data_add, $attributes, $attribute_template); + + $data_add = RedshopHelperAttribute::replaceAttributeData($this->search[$i]->product_id, 0, 0, $attributes, $data_add, $attribute_template, $isChilds); + + // Cart Template + $data_add = Redshop\Cart\Render::replace($this->search[$i]->product_id, 0, 0, 0, $data_add, $isChilds, $userfieldArr, $totalatt, 0, $count_no_user_field); + + $data_add = RedshopHelperProductTag::getExtraSectionTag($extraFieldName, $this->search[$i]->product_id, "1", $data_add); + + $productAvailabilityDate = strstr($data_add, "{product_availability_date}"); + $stockNotifyFlag = strstr($data_add, "{stock_notify_flag}"); + $stockStatus = strstr($data_add, "{stock_status"); + + $attributeproductStockStatus = array(); + + if ($productAvailabilityDate || $stockNotifyFlag || $stockStatus) + { + $attributeproductStockStatus = $producthelper->getproductStockStatus($this->search[$i]->product_id, $totalatt); + } + + $data_add = \Redshop\Helper\Stockroom::replaceProductStockData( + $this->search[$i]->product_id, + 0, + 0, + $data_add, + $attributeproductStockStatus + ); + + $dispatcher->trigger('onAfterDisplayProduct', array(&$data_add, array(), $this->search[$i])); + + $data .= $data_add; + } + + $app = JFactory::getApplication(); + $router = $app->getRouter(); + + $getorderby = $app->input->get('order_by', Redshop::getConfig()->get('DEFAULT_PRODUCT_ORDERING_METHOD')); + + $vars = array( + 'option' => 'com_redshop', + 'view' => 'search', + 'layout' => $layout, + 'keyword' => $keyword, + 'manufacture_id' => $manufacture_id, + 'order_by' => $getorderby, + 'category_id' => $cid, + 'Itemid' => $Itemid, + 'search_type' => $search_type + ); + $router->setVars($vars); + unset($vars); + + if (strstr($template_org, "{show_all_products_in_category}")) + { + $template_org = str_replace("{show_all_products_in_category}", "", $template_org); + $template_org = str_replace("{pagination}", "", $template_org); + } + + $pagination = new JPagination($total_product, $start, $endlimit); + + if (strstr($template_org, "{pagination}")) + { + $template_org = str_replace("{pagination}", $pagination->getPagesLinks(), $template_org); + } + + $usePerPageLimit = false; + + if (strstr($template_org, "perpagelimit:")) + { + $usePerPageLimit = true; + $perpage = explode('{perpagelimit:', $template_org); + $perpage = explode('}', $perpage[1]); + $template_org = str_replace("{perpagelimit:" . intval($perpage[0]) . "}", "", $template_org); + } + + if (strstr($template_org, "{product_display_limit}")) + { + if ($usePerPageLimit) + { + $limitBox = ''; + } + else + { + $limitBox = "
    + + + " + . $pagination->getLimitBox() . "
    "; + } + + $template_org = str_replace("{product_display_limit}", $limitBox, $template_org); + } + + $template_org = str_replace("{order_by}", $orderby_form, $template_org); + $template_org = str_replace("{order_by_lbl}", JText::_('COM_REDSHOP_SELECT_ORDER_BY'), $template_org); + $template_org = str_replace("{filter_by_lbl}", JText::_('COM_REDSHOP_SELECT_FILTER_BY'), $template_org); + $template_org = str_replace("{attribute_price_with_vat}", "", $template_org); + $template_org = str_replace("{attribute_price_without_vat}", "", $template_org); + $template_org = str_replace("{product_loop_start}", "", $template_org); + $template_org = str_replace("{product_loop_end}", "", $template_org); + $template_org = str_replace($template_tmp_desc, $data, $template_org); + + $template_org = str_replace("{with_vat}", "", $template_org); + $template_org = str_replace("{without_vat}", "", $template_org); + + $template_org = RedshopHelperTemplate::parseRedshopPlugin($template_org); + $template_org = RedshopHelperText::replaceTexts($template_org); + + eval("?>" . $template_org . "

    " . JText::_('COM_REDSHOP_MSG_SORRY_NO_RESULT_FOUND') . "

    "; + } + } +} diff --git a/component/site/views/send_friend/index.html b/component/site/views/send_friend/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/send_friend/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/send_friend/tmpl/default.php b/component/site/views/send_friend/tmpl/default.php new file mode 100644 index 00000000000..e10b5ce9ab8 --- /dev/null +++ b/component/site/views/send_friend/tmpl/default.php @@ -0,0 +1,85 @@ + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
      + + +
    + + + +
    + + + +
    + + + +
      + +
    + + + + +
    +
    diff --git a/component/site/views/send_friend/tmpl/index.html b/component/site/views/send_friend/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/send_friend/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/send_friend/view.html.php b/component/site/views/send_friend/view.html.php new file mode 100644 index 00000000000..c96732788ae --- /dev/null +++ b/component/site/views/send_friend/view.html.php @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/component/site/views/wishlist/tmpl/default.php b/component/site/views/wishlist/tmpl/default.php new file mode 100644 index 00000000000..733ec9468fa --- /dev/null +++ b/component/site/views/wishlist/tmpl/default.php @@ -0,0 +1,179 @@ +input; +$wishlists = $this->wishlists; +$productId = $input->getString('product_id', ''); +$hasWishlist = ($productId && count($wishlists) > 0) ? true : false; +$itemId = $input->getInt('Itemid', 0); +?> +
    +get('WISHLIST_LIST')) : ?> + + +
    + params->get('show_page_heading', 1)): ?> +

    + +

    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +   + input->getInt('loginwishlist') == 1) : ?> + + + + + + +
    +
    + + + + + + + + +
    +
    + +
    + params->get('show_page_heading', 1)): ?> +

    + +

    +
     
    + +
    +
    + + + + + + + + + + wishlist_id; + } + + ?> + "> + + + + + + + + + +
    + + + + + +
    + + + wishlist_id, false, 'wishlist_id'); ?> + + wishlist_name; ?> +
    +   + +
    +
    + + + + + + + + + +
    +
    + + + + +
    diff --git a/component/site/views/wishlist/tmpl/default.xml b/component/site/views/wishlist/tmpl/default.xml new file mode 100644 index 00000000000..ee7c2345ca8 --- /dev/null +++ b/component/site/views/wishlist/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/component/site/views/wishlist/tmpl/index.html b/component/site/views/wishlist/tmpl/index.html new file mode 100644 index 00000000000..1cbdf58d903 --- /dev/null +++ b/component/site/views/wishlist/tmpl/index.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/component/site/views/wishlist/tmpl/viewloginwishlist.php b/component/site/views/wishlist/tmpl/viewloginwishlist.php new file mode 100644 index 00000000000..af85a4f9bd9 --- /dev/null +++ b/component/site/views/wishlist/tmpl/viewloginwishlist.php @@ -0,0 +1,86 @@ +root(); +$Itemid = $app->input->getInt('Itemid'); +$wishlists = $this->wishlists; +$product_id = $app->input->getInt('product_id'); +$user = JFactory::getUser(); +$session = JFactory::getSession(); +$auth = $session->get('auth'); +?> +
    + +
    + +

    + +

    + +
     
    + +
    + +
    + id || (isset($auth['users_info_id']) && $auth['users_info_id'] > 0)) + { + $wishreturn = JRoute::_('index.php?loginwishlist=1&option=com_redshop&view=wishlist&Itemid=' . $Itemid, false); + $app->redirect($wishreturn); + } + else + { + $pagetitle = JText::_('COM_REDSHOP_LOGIN_PROMPTWISHLIST'); + ?> +
    + +

    + +

    + +
     
    + +
    + + + + + + +
    +   + +
    + + + + + + +
    +
    +input->getInt('Itemid'); +$wishlists = $this->wishlists; +$product_id = $app->input->getInt('product_id'); +$user = JFactory::getUser(); + +$pagetitle = JText::_('COM_REDSHOP_MY_WISHLIST'); + +$redTemplate = Redtemplate::getInstance(); +$extraField = extraField::getInstance(); +$template = RedshopHelperTemplate::getTemplate("wishlist_template"); +$wishlist_data1 = $template[0]->template_desc; +$returnArr = $producthelper->getProductUserfieldFromTemplate($wishlist_data1); +$template_userfield = $returnArr[0]; +$userfieldArr = $returnArr[1]; + + if ($this->params->get('show_page_heading', 1)) + { + ?> +

    +
     
    + id) +{ + $rows = $this->wish_session; + + echo "
    "; + + if (count($rows) > 0) + { + // Send mail link + $mlink = JURI::root() . "index.php?option=com_redshop&view=account&layout=mywishlist&mail=1&tmpl=component"; + + display_products($rows); + $reglink = JRoute::_("index.php?wishlist=1&option=com_redshop&view=login&Itemid=" . $Itemid); + $myproductid = ''; + $count_no_user_field = 0; + + for ($p = 0, $pn = count($rows); $p < $pn; $p++) + { + for ($ui = 0; $ui < count($userfieldArr); $ui++) + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', 0, 0, $rows[$p]->product_id); + + $ufield .= $productUserFields[1]; + + // + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + } + + $myproductid .= $rows[$p]->product_id . ","; + } + ?> + + +
    "; + + if ($count_no_user_field > 0) + { + echo "
    "; + } + else + { + echo "
    "; + } + } + else + { + echo "
    " . JText::_('COM_REDSHOP_NO_PRODUCTS_IN_WISHLIST') . "
    "; + } + echo "
    "; +} +else +{ + // If user logged in than display this code. + echo "
    "; + + if (count($this->wish_session) > 0) + { + $mlink = JURI::root() . "index.php?option=com_redshop&view=account&layout=mywishlist&mail=1&tmpl=component"; + $rows = $this->wish_session; + $myproductid = ''; + $count_no_user_field = 0; + display_products($rows); + + foreach ($rows as $row) + { + for ($ui = 0; $ui < count($userfieldArr); $ui++) + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', 0, 0, $row->product_id); + + $ufield .= $productUserFields[1]; + + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + } + + $myproductid .= $row->product_id . ","; + } + + echo "
    "; + $mywishlist_link = "index.php?tmpl=component&option=com_redshop&view=wishlist&task=addtowishlist&tmpl=component"; + + if ($count_no_user_field > 0) + { + echo "
    "; + } + else + { + echo "


    "; + } + } + + if (count($wishlists) > 0) + { + $wish_products = $this->wish_products; + + // Send mail link + echo ""; + + foreach ($wishlists as $wishlist) + { + $wishlist_link = JRoute::_("index.php?view=account&layout=mywishlist&wishlist_id=" . $wishlist->wishlist_id . "&option=com_redshop&Itemid=" . $Itemid); + $del_wishlist = JRoute::_("index.php?view=wishlist&task=delwishlist&wishlist_id=" . $wishlist->wishlist_id . "&option=com_redshop&Itemid=" . $Itemid); + echo "" + . ""; + } + + echo "
    " . $wishlist->wishlist_name . "" . JText::_('COM_REDSHOP_DELETE') . "
    "; + } + elseif (count($this->wish_session) <= 0 && count($wishlists) <= 0) + { + echo "
    " . JText::_('COM_REDSHOP_NO_PRODUCTS_IN_WISHLIST') . "
    "; + } + + echo "
    "; +} + +function display_products($rows) +{ + $session = JFactory::getSession(); + $producthelper = productHelper::getInstance(); + $template = RedshopHelperTemplate::getTemplate("wishlist_template"); + + if (count($template) <= 0) + { + foreach ($rows as $row) + { + $Itemid = RedshopHelperRouter::getItemId($row->product_id); + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $row->product_id . '&Itemid=' . $Itemid); + + $product_price = Redshop\Product\Price::getPrice($row->product_id); + $product_price_discount = $producthelper->getProductNetPrice($row->product_id); + + echo "
    "; + + if ($row->product_full_image) + { + echo "
    " + . Redshop\Product\Image\Image::getImage($row->product_id, $link, "85", "63") . "
    "; + } + else + { + $maindefaultpath = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'); + echo "
    "; + } + + echo "

    "; + + if (!$row->not_for_sale) + { + if ($row->product_on_sale && $product_price_discount > 0) + { + if ($product_price > $product_price_discount) + { + $s_price = $product_price - $product_price_discount; + + if ($this->show_discountpricelayout) + { + echo "
    " . RedshopHelperProductPrice::formattedPrice($product_price) . "
    "; + $product_price = $product_price_discount; + echo "
    " . RedshopHelperProductPrice::formattedPrice((float)$product_price_discount) . "
    "; + echo "
    " . JText::_('COM_REDSHOP_PRODCUT_PRICE_YOU_SAVED') . ' ' . RedshopHelperProductPrice::formattedPrice($s_price) . "
    "; + } + else + { + $product_price = $product_price_discount; + echo "
    " . RedshopHelperProductPrice::formattedPrice((float)$product_price) . "
    "; + } + } + else + { + echo "
    " . RedshopHelperProductPrice::formattedPrice((float)$product_price) . "
    "; + } + } + else + { + echo "
    " . RedshopHelperProductPrice::formattedPrice((float)$product_price) . "
    "; + } + } + + echo "
     
    "; + + $addtocartdata = Redshop\Cart\Render::replace($row->product_id, 0, 0, $row->product_id); + + echo "
    " . $addtocartdata . "


    "; + } + } + else + { + $ph_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $pw_thumb = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + $wishlist_data1 = $template[0]->template_desc; + + $mlink = JURI::root() . "index.php?option=com_redshop&view=account&layout=mywishlist&mail=1&tmpl=component"; + $mail_link = ''; + $wishlist_data1 = str_replace('{mail_link}', $mail_link, $wishlist_data1); + $template_d1 = explode("{product_loop_start}", $wishlist_data1); + $template_d2 = explode("{product_loop_end}", $template_d1[1]); + $temp_template = ''; + $extraFieldName = Redshop\Helper\ExtraFields::getSectionFieldNames(1, 1, 1); + $mainid = ''; + $totattid = ''; + $totcount_no_user_field = ''; + + foreach ($rows as $row) + { + $wishlist_data = $template_d2[0]; + + $Itemid = RedshopHelperRouter::getItemId($row->product_id); + $link = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $row->product_id . '&Itemid=' . $Itemid); + + $product_price = Redshop\Product\Price::getPrice($row->product_id); + $product_price_discount = $producthelper->getProductNetPrice($row->product_id); + + if ($row->product_full_image) + { + $thum_image = Redshop\Product\Image\Image::getImage($row->product_id, $link, $pw_thumb, $ph_thumb); + $wishlist_data = str_replace('{product_thumb_image}', $thum_image, $wishlist_data); + } + else + { + $maindefaultpath = RedshopHelperMedia::getImagePath( + Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'), + '', + 'thumb', + 'product', + $pw_thumb, + $ph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $thum_image = ""; + $wishlist_data = str_replace('{product_thumb_image}', $thum_image, $wishlist_data); + } + + $pname = "" . $row->product_name . ""; + $pnumber = $row->product_number; + $pdesc = $row->product_s_desc; + + // Checking for child products start + if (strstr($wishlist_data, "{child_products}")) + { + $parentproductid = $row->product_id; + + if ($this->data->product_parent_id != 0) + { + $parentproductid = $producthelper->getMainParentProduct($row->product_id); + } + + $frmChild = ""; + + if ($parentproductid != 0) + { + $productInfo = RedshopHelperProduct::getProductById($parentproductid); + + // Get child products + $childproducts = $model->getAllChildProductArrayList(0, $parentproductid); + + if (count($childproducts) > 0) + { + $childproducts = array_merge(array($productInfo), $childproducts); + + $cld_name = array(); + + if (count($childproducts) > 0) + { + $parentid = 0; + + for ($c = 0, $cn = count($childproducts); $c < $cn; $c++) + { + if ($childproducts[$c]->product_parent_id == 0) + { + $level = ""; + } + else + { + if ($parentid != $childproducts[$c]->product_parent_id) + { + $level = $level; + } + } + + $parentid = $childproducts[$c]->product_parent_id; + + $childproducts[$c]->product_name = $level . $childproducts[$c]->product_name; + } + + $cld_name = @array_merge($cld_name, $childproducts); + } + + $selected = array($row->product_id); + $lists['product_child_id'] = JHTML::_('select.genericlist', $cld_name, 'pid', 'class="inputbox" size="1" onchange="document.frmChild.submit();"', 'product_id', 'product_name', $selected); + + $frmChild .= "
    "; + $frmChild .= JText::_('COM_REDSHOP_CHILD_PRODUCTS') . $lists ['product_child_id']; + $frmChild .= ""; + $frmChild .= ""; + $frmChild .= ""; + $frmChild .= ""; + $frmChild .= "
    "; + + } + } + + $wishlist_data = str_replace("{child_products}", $frmChild, $wishlist_data); + } + + $childproduct = RedshopHelperProduct::getChildProduct($row->product_id); + + if (count($childproduct) > 0) + { + if (Redshop::getConfig()->get('PURCHASE_PARENT_WITH_CHILD') == 1) + { + $isChilds = false; + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($row->product_id); + $attributes = array_merge($attributes, $wishlist_data); + } + else + { + $isChilds = true; + $attributes = array(); + } + } + else + { + $isChilds = false; + $attributes_set = array(); + + if ($row->attribute_set_id > 0) + { + $attributes_set = RedshopHelperProduct_Attribute::getProductAttribute(0, $row->attribute_set_id, 0, 1); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($row->product_id); + $attributes = array_merge($attributes, $attributes_set); + } + + if (empty($row->product_items)) + { + $attributes = null; + } + else + { + foreach ($attributes as $key => $attribute) + { + if (empty($attribute->properties)) + { + continue; + } + + if (!isset($attribute->properties[$row->product_items->property_id])) + { + unset($attributes[$key]); + continue; + } + + $attribute->properties[$row->product_items->property_id]->setdefault_selected = 1; + } + + $attributes = array_values($attributes); + } + + $attribute_template = \Redshop\Template\Helper::getAttribute($wishlist_data); + + // Check product for not for sale + $wishlist_data = $producthelper->getProductNotForSaleComment($row, $wishlist_data, $attributes); + + $wishlist_data = Redshop\Product\Stock::replaceInStock($row->product_id, $wishlist_data, $attributes, $attribute_template); + + /* Product attribute Start */ + $totalatt = count($attributes); + $wishlist_data = RedshopHelperAttribute::replaceAttributeData( + $row->product_id, 0, 0, $attributes, $wishlist_data, $attribute_template, $isChilds, array(), 1, true + ); + + /* Product attribute End. Checking for child products end */ + + if (!$row->not_for_sale) + { + if ($row->product_on_sale && $product_price_discount > 0) + { + if ($product_price > $product_price_discount) + { + $s_price = $product_price - $product_price_discount; + + if ($this->show_discountpricelayout) + { + $product_price = $product_price_discount; + $mainproduct_price = RedshopHelperProductPrice::formattedPrice((float)$product_price_discount); + + } + else + { + $product_price = $product_price_discount; + $mainproduct_price = RedshopHelperProductPrice::formattedPrice((float)$product_price); + } + } + else + { + $mainproduct_price = RedshopHelperProductPrice::formattedPrice((float)$product_price); + + } + } + else + { + $mainproduct_price = RedshopHelperProductPrice::formattedPrice((float)$product_price); + + } + + $wishlist_data = str_replace('{product_price}', $mainproduct_price, $wishlist_data); + } + + // Product User Field Start + $count_no_user_field = 0; + $returnArr = $producthelper->getProductUserfieldFromTemplate($wishlist_data); + $template_userfield = $returnArr[0]; + + $userfieldArr = $returnArr[1]; + + if (strstr($wishlist_data, "{if product_userfield}") && strstr($wishlist_data, "{product_userfield end if}") && $template_userfield != "") + { + $ufield = ""; + $cart = $session->get('cart'); + + if (isset($cart['idx'])) + { + $idx = (int) ($cart['idx']); + } + + $idx = 0; + $cart_id = ''; + + for ($j = 0; $j < $idx; $j++) + { + if ($cart[$j]['product_id'] == $row->product_id) + { + $cart_id = $j; + } + } + + for ($ui = 0, $countUserfield = count($userfieldArr); $ui < $countUserfield; $ui++) + { + if (!$idx) + { + $cart_id = ""; + } + + $mysesspro = "productuserfield_" . $ui; + + for ($check_i = 1; $check_i <= $_SESSION ["no_of_prod"]; $check_i++) + { + if ($_SESSION ['wish_' . $check_i]->product_id == $row->product_id) + { + $productUserFieldsFinal = $_SESSION['wish_' . $check_i]->$mysesspro; + } + } + + if ($productUserFieldsFinal != '') + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', '', 0, $row->product_id, $productUserFieldsFinal, 1); + } + else + { + $productUserFields = Redshop\Fields\SiteHelper::listAllUserFields($userfieldArr[$ui], 12, '', $cart_id, 0, $row->product_id); + } + + $ufield .= $productUserFields[1]; + + // + if ($productUserFields[1] != "") + { + $count_no_user_field++; + } + + if ($productUserFieldsFinal != '') + { + $wishlist_data = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $wishlist_data); + $wishlist_data = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $wishlist_data); + } + else + { + $wishlist_data = str_replace('{' . $userfieldArr[$ui] . '_lbl}', $productUserFields[0], $wishlist_data); + $wishlist_data = str_replace('{' . $userfieldArr[$ui] . '}', $productUserFields[1], $wishlist_data); + } + } + + $productUserFieldsForm = "
    "; + + if ($ufield != "") + { + $wishlist_data = str_replace("{if product_userfield}", $productUserFieldsForm, $wishlist_data); + $wishlist_data = str_replace("{product_userfield end if}", "
    ", $wishlist_data); + } + else + { + $wishlist_data = str_replace("{if product_userfield}", "", $wishlist_data); + $wishlist_data = str_replace("{product_userfield end if}", "", $wishlist_data); + } + } + + // Product User Field End + + /////////////////////////////////// Product accessory Start ///////////////////////////////// + $accessory = RedshopHelperAccessory::getProductAccessories(0, $row->product_id); + $totalAccessory = count($accessory); + + $wishlist_data = RedshopHelperProductAccessory::replaceAccessoryData($row->product_id, 0, $accessory, $wishlist_data, $isChilds); + + /////////////////////////////////// Product accessory End ///////////////////////////////// + + $wishlist_data = str_replace('{product_name}', $pname, $wishlist_data); + $wishlist_data = str_replace('{product_number}', $pnumber, $wishlist_data); + $wishlist_data = str_replace('{product_s_desc}', $pdesc, $wishlist_data); + + $wishlist_data = RedshopHelperProductTag::getExtraSectionTag($extraFieldName, $row->product_id, "1", $wishlist_data, 1); + $wishlist_data = Redshop\Cart\Render::replace($row->product_id, $row->category_id, 0, 0, $wishlist_data, $isChilds, $userfieldArr, $totalatt, $totalAccessory, $count_no_user_field); + + $rmore = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $wishlist_data = str_replace("{read_more}", $rmore, $wishlist_data); + $wishlist_data = str_replace("{read_more_link}", $link, $wishlist_data); + $wishlist_data = str_replace("{product_loop_start}", '', $wishlist_data); + $wishlist_data = str_replace("{product_loop_end}", '', $wishlist_data); + $wishlist_data = str_replace("{back_link}", '', $wishlist_data); + $wishlist_data = str_replace("{back_link}", '', $wishlist_data); + $wishlist_data = str_replace("{mail_link}", '', $wishlist_data); + $wishlist_data = str_replace("{if product_on_sale}", '', $wishlist_data); + $wishlist_data = str_replace("{product_on_sale end if}", '', $wishlist_data); + $wishlist_data = str_replace("
    ", '', $wishlist_data); + $wishlist_data = str_replace("{all_cart}", '', $wishlist_data); + $wishlist_data = str_replace("{if product_on_sale}", "", $wishlist_data); + $wishlist_data = str_replace("{product_on_sale end if}", "", $wishlist_data); + + $regdellink = "index.php?mydel=1&view=wishlist&wishlist_id=" . $row->product_id . "&task=mysessdelwishlist"; + + if (Redshop::getConfig()->get('INDIVIDUAL_ADD_TO_CART_ENABLE')) + { + $regdellink .= isset($row->product_items->attribute_id) ? '&attribute_id=' . $row->product_items->attribute_id : ''; + $regdellink .= isset($row->product_items->property_id) ? '&property_id=' . $row->product_items->property_id : ''; + $regdellink .= isset($row->product_items->subattribute_id) ? '&subattribute_id=' . $row->product_items->subattribute_id : ''; + } + + $regdellink = JRoute::_($regdellink, false); + + $mainregdellink = ""; + + $wishlist_data = str_replace('{remove_product_link}', $mainregdellink, $wishlist_data); + + $mainid .= $row->product_id . ","; + $totattid .= $totalatt . ","; + $totcount_no_user_field .= $count_no_user_field . ","; + + $temp_template .= $wishlist_data; + } + + $my = "
    "; + + $my .= " + + + + +
    "; + $data = $template_d1[0] . $temp_template . $template_d2[1]; + $data = str_replace('{back_link}', '', $data); + $data = str_replace('{all_cart}', $my, $data); + $data = RedshopHelperTemplate::parseRedshopPlugin($data); + echo eval("?>" . $data . " + + + + + + + diff --git a/component/site/views/wishlist/view.html.php b/component/site/views/wishlist/view.html.php new file mode 100644 index 00000000000..5a033a38cb0 --- /dev/null +++ b/component/site/views/wishlist/view.html.php @@ -0,0 +1,57 @@ +input->getCmd('task', 'com_redshop'); + $layout = $app->input->getCmd('layout'); + + $model = $this->getModel("wishlist"); + + $this->params = $app->getParams('com_redshop'); + $this->wishlists = $model->getUserWishlist(); + + if ($task == 'viewwishlist' || $layout == 'viewwishlist') + { + $this->setlayout('viewwishlist'); + $this->wish_products = $model->getWishlistProduct(); + $this->wish_session = $model->getWishlistProductFromSession(); + } + elseif ($task == 'viewloginwishlist') + { + $this->setlayout('viewloginwishlist'); + } + else + { + $this->wish_session = $model->getWishlistProductFromSession(); + } + + parent::display($tpl); + } +} diff --git a/composer.json b/composer.json new file mode 100644 index 00000000000..2b5b9a6a448 --- /dev/null +++ b/composer.json @@ -0,0 +1,39 @@ +{ + "name" : "redcomponent-com/redshop", + "description": "a Joomla e-commerce solution", + "license" : "GPL-2.0+", + "minimum-stability": "stable", + "require" : { + "php": ">=5.6", + "phpmd/phpmd": "^2.6", + "joomla/joomla-cms": "3.7.5" + }, + "require-dev": { + "squizlabs/php_codesniffer": "~2", + "codeception/codeception": "2.3.7", + "joomla-projects/joomla-browser": "v3.9.0", + "consolidation/robo": "~1", + "joomla-projects/joomla-testing-robo": "dev-container-test", + "joomla-projects/joomla-testing": "dev-container-test", + "fzaninotto/faker": "^1.5", + "cloudinary/cloudinary_php": "^1.7", + "knplabs/github-api": "~1", + "joomla-projects/selenium-server-standalone": "3.8.1", + "nette/reflection": "~2.4", + "phpunit/phpunit": "~4.0" + }, + "repositories": [ + { + "type": "package", + "package": { + "name": "joomla/joomla-cms", + "version": "3.7.5", + "source": { + "url": "https://github.com/joomla/joomla-cms.git", + "type": "git", + "reference": "3.7.5" + } + } + } + ] +} \ No newline at end of file diff --git a/composer.phar b/composer.phar new file mode 100755 index 0000000000000000000000000000000000000000..041775a1274ffc0a74952eec9ceedfc062644408 GIT binary patch literal 1861877 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 z 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'; + } + + $html .= RedshopHelperMediaImage::render( + $mediaDOMId, + $mediaType, + $referenceId, + $mediaSection, + $media->get('media_name'), + $showGallery, + $useMediaPath, + $mediaId + ); + + return $html; + } +} diff --git a/libraries/redshop/form/field/order_status.php b/libraries/redshop/form/field/order_status.php new file mode 100644 index 00000000000..699c8d719d2 --- /dev/null +++ b/libraries/redshop/form/field/order_status.php @@ -0,0 +1,45 @@ +value = $this->multiple ? (array) $this->value : (string) $this->value; + $orderStatus = RedshopHelperOrder::getOrderStatusList(); + + // Merge any additional options in the XML definition. + return array_merge(parent::getOptions(), $orderStatus); + } +} diff --git a/libraries/redshop/form/field/payment_method.php b/libraries/redshop/form/field/payment_method.php new file mode 100644 index 00000000000..8ce8ab6e91d --- /dev/null +++ b/libraries/redshop/form/field/payment_method.php @@ -0,0 +1,60 @@ +value = $this->multiple ? (array) $this->value : (string) $this->value; + + foreach ($payments as $payment) + { + $option = new stdClass; + + $option->text = JText::_($payment->name); + $option->value = $payment->element; + + $options[] = $option; + } + + return array_merge(parent::getOptions(), $options); + } +} diff --git a/libraries/redshop/form/field/radio.php b/libraries/redshop/form/field/radio.php new file mode 100644 index 00000000000..d4e4401527b --- /dev/null +++ b/libraries/redshop/form/field/radio.php @@ -0,0 +1,133 @@ +element['debug']) ? ((string) $this->element['debug'] === 'true') : false; + } + + /** + * Method to get the radio button field input markup. + * + * @return string The field input markup. + * + * @since 1.0 + */ + protected function getInput() + { + return RedshopLayoutHelper::render($this->getInputLayout(), $this->getLayoutData()); + } + + /** + * Method to get the radio button field input markup. + * + * @return string The field input markup. + * + * @since 1.0 + */ + protected function getInputLayout() + { + return !empty($this->element['input-layout']) ? (string) $this->element['input-layout'] : $this->inputLayout; + } + + /** + * Get the active label layout + * + * @return string + * + * @since 1.0 + */ + protected function getLabelLayout() + { + return !empty($this->element['label-layout']) ? (string) $this->element['label-layout'] : $this->labelLayout; + } + + /** + * Get the layout information + * + * @return array + */ + protected function getLayoutData() + { + // Label preprocess + $label = $this->element['label'] ? (string) $this->element['label'] : (string) $this->element['name']; + $label = $this->translateLabel ? JText::_($label) : $label; + + // Description preprocess + $description = !empty($this->description) ? $this->description : null; + $description = !empty($description) && $this->translateDescription ? JText::_($description) : $description; + + $alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname); + + return array( + 'autocomplete' => $this->autocomplete, + 'autofocus' => $this->autofocus, + 'class' => $this->class, + 'description' => $description, + 'disabled' => $this->disabled, + 'element' => $this->element, + 'field' => $this, + 'group' => $this->group, + 'hidden' => $this->hidden, + 'hint' => $this->translateHint ? JText::alt($this->hint, $alt) : $this->hint, + 'id' => $this->id, + 'label' => $label, + 'labelclass' => $this->labelclass, + 'multiple' => $this->multiple, + 'name' => $this->name, + 'onchange' => $this->onchange, + 'onclick' => $this->onclick, + 'options' => $this->getOptions(), + 'pattern' => $this->pattern, + 'readonly' => $this->readonly, + 'repeat' => $this->repeat, + 'required' => (bool) $this->required, + 'size' => $this->size, + 'spellcheck' => $this->spellcheck, + 'validate' => $this->validate, + 'value' => $this->value + ); + } +} diff --git a/libraries/redshop/form/field/rules.php b/libraries/redshop/form/field/rules.php new file mode 100644 index 00000000000..d9708bb38c2 --- /dev/null +++ b/libraries/redshop/form/field/rules.php @@ -0,0 +1,181 @@ +element['section'] ? (string) $this->element['section'] : ''; + $component = $this->element['component'] ? (string) $this->element['component'] : ''; + $assetField = $this->element['asset_field'] ? (string) $this->element['asset_field'] : 'asset_id'; + $showGroup = $this->element['show_group'] ? (string) $this->element['show_group'] : ''; + $showGroup = ($showGroup == 'true') ? true : false; + + // Current view is global config? + $isGlobalConfig = $component === 'root.1'; + + // Get the actions for the asset. + $actions = JAccess::getActions($component, $section); + + // Iterate over the children and add to the actions. + foreach ($this->element->children() as $el) + { + if ($el->getName() != 'action') + { + continue; + } + + $actions[] = (object) array( + 'name' => (string) $el['name'], + 'title' => (string) $el['title'], + 'description' => (string) $el['description'] + ); + } + + if ($showGroup === true) + { + $newActions = array(); + + foreach ($actions as $action) + { + $group = explode('.', (string) $action->name); + $group = $group[0]; + + if (!isset($newActions[$group])) + { + $newActions[$group] = array(); + } + + $newActions[$group][] = $action; + } + + $actions = $newActions; + } + + ksort($actions); + + // Get the asset id. + // Note that for global configuration, com_config injects asset_id = 1 into the form. + $assetId = $this->form->getValue($assetField); + $newItem = empty($assetId) && $isGlobalConfig === false && $section !== 'component'; + $parentAssetId = null; + + // If the asset id is empty (component or new item). + if (empty($assetId)) + { + // Get the component asset id as fallback. + $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); + + $assetId = (int) $db->loadResult(); + + /** + * @to do: incorrect info + * When creating a new item (not saving) it uses the calculated permissions from the component (item <-> component <-> global config). + * But if we have a section too (item <-> section(s) <-> component <-> global config) this is not correct. + * Also, currently it uses the component permission, but should use the calculated permissions for achild of the component/section. + */ + } + + // If not in global config we need the parent_id asset to calculate permissions. + if (!$isGlobalConfig) + { + // In this case we need to get the component rules too. + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->quoteName('parent_id')) + ->from($db->quoteName('#__assets')) + ->where($db->quoteName('id') . ' = ' . $assetId); + + $db->setQuery($query); + + $parentAssetId = (int) $db->loadResult(); + } + + // Full width format. + + // Get the rules for just this asset (non-recursive). + $assetRules = JAccess::getAssetRules($assetId, false, false); + + // Get the available user groups. + $groups = $this->getUserGroups(); + + return RedshopLayoutHelper::render( + 'field.rules.wrapper', + array( + 'groups' => $groups, + 'actions' => $actions, + 'field' => $this, + 'newItem' => $newItem, + 'assetRules' => $assetRules, + 'assetId' => $assetId, + 'isGlobalConfig' => $isGlobalConfig, + 'component' => $component, + 'showGroup' => $showGroup, + 'section' => $section + ) + ); + } + + /** + * Get a list of the user groups. + * + * @return array + * + * @since 11.1 + */ + protected function getUserGroups() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('a.id AS value, a.title AS text, COUNT(DISTINCT b.id) AS level, a.parent_id') + ->from('#__usergroups AS a') + ->join('LEFT', $db->quoteName('#__usergroups') . ' AS b ON a.lft > b.lft AND a.rgt < b.rgt') + ->group('a.id, a.title, a.lft, a.rgt, a.parent_id') + ->order('a.lft ASC'); + $db->setQuery($query); + $options = $db->loadObjectList(); + + return $options; + } +} diff --git a/libraries/redshop/form/field/shipping_method.php b/libraries/redshop/form/field/shipping_method.php new file mode 100644 index 00000000000..2e804b731eb --- /dev/null +++ b/libraries/redshop/form/field/shipping_method.php @@ -0,0 +1,64 @@ +value = $this->multiple ? (array) $this->value : (string) $this->value; + + foreach ($shippingMethods as $shipping) + { + $option = new stdClass; + + $option->text = JText::_($shipping->name); + $option->value = $shipping->element; + $option->disable = false; + $option->class = ''; + $option->selected = false; + $option->checked = false; + + $options[] = $option; + } + + return array_merge(parent::getOptions(), $options); + } +} diff --git a/libraries/redshop/form/field/state.php b/libraries/redshop/form/field/state.php new file mode 100644 index 00000000000..296fdcec37e --- /dev/null +++ b/libraries/redshop/form/field/state.php @@ -0,0 +1,73 @@ +element['idfield']) ? (string) $this->element['idfield'] : 'id'; + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn($key, 'value')) + ->select($db->qn('state_name', 'text')) + ->select($db->qn('country_id')) + ->from($db->qn('#__redshop_state', 's')); + + if (!empty($this->form->getData()->get('tax_country'))) + { + $query->leftJoin($db->qn('#__redshop_country', 'c') . ' ON ' . $db->qn('s.country_id') . ' = ' . $db->qn('c.id')) + ->where($db->qn('c.country_3_code') . ' = ' . $db->q($this->form->getData()->get('tax_country'))); + } + + $options = $db->setQuery($query)->loadObjectList(); + + $fieldName = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname); + + foreach ($options as $option) + { + $option->text = JText::alt((string) $option->text, $fieldName); + $option->value = (string) $option->value; + $option->disable = false; + $option->class = ''; + $option->selected = false; + $option->checked = false; + $option->country = $option->country_id; + } + + reset($options); + + $parentOptions = parent::getOptions(); + $options = array_merge($parentOptions, $options); + + return $options; + } +} diff --git a/libraries/redshop/form/field/taxgroup.php b/libraries/redshop/form/field/taxgroup.php new file mode 100644 index 00000000000..2ad343abc5a --- /dev/null +++ b/libraries/redshop/form/field/taxgroup.php @@ -0,0 +1,48 @@ +getQuery(true) + ->select($db->qn('id', 'value')) + ->select($db->qn('name', 'text')) + ->from($db->qn('#__redshop_tax_group')); + $options = $db->setQuery($query)->loadObjectList(); + + $parentOptions = parent::getOptions(); + $options = array_merge($parentOptions, $options); + + return $options; + } +} diff --git a/libraries/redshop/form/field/template.php b/libraries/redshop/form/field/template.php new file mode 100644 index 00000000000..d89dea6ca05 --- /dev/null +++ b/libraries/redshop/form/field/template.php @@ -0,0 +1,64 @@ +element['section']) ? (string) $this->element['section'] : null; + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('id')) + ->select($db->qn('name')) + ->from($db->qn('#__redshop_template')) + ->where($db->qn('published') . ' = 1'); + + if (null !== $section) + { + $query->where($db->qn('section') . ' = ' . $db->q($section)); + } + + $items = $db->setQuery($query)->loadObjectList(); + $options = array(); + + if (count($items) > 0) + { + foreach ($items as $item) + { + $option = JHTML::_('select.option', $item->id, $item->name); + $options[] = $option; + } + } + + return array_merge(parent::getOptions(), $options); + } +} diff --git a/libraries/redshop/form/field/template_section.php b/libraries/redshop/form/field/template_section.php new file mode 100644 index 00000000000..9ffb687f66f --- /dev/null +++ b/libraries/redshop/form/field/template_section.php @@ -0,0 +1,53 @@ +value = $this->multiple ? (array) $this->value : (string) $this->value; + + foreach ($options as $value => $text) + { + $option = new stdClass; + + $option->text = $text; + $option->value = $value; + $option->disable = false; + $option->class = ''; + $option->selected = false; + $option->checked = false; + } + + return array_merge(parent::getOptions(), $options); + } +} diff --git a/libraries/redshop/form/field/text.php b/libraries/redshop/form/field/text.php new file mode 100644 index 00000000000..501f13f7cd4 --- /dev/null +++ b/libraries/redshop/form/field/text.php @@ -0,0 +1,116 @@ +attribs[$name] = (string) $value; + } + } + + /** + * Method to get the field input markup. + * + * @return string The field input markup. + */ + protected function getInput() + { + // Manually handled attributes + $this->attribs['id'] = $this->id; + $this->attribs['name'] = $this->name; + $this->attribs['type'] = 'text'; + $this->attribs['readonly'] = ($this->element['readonly'] == 'true') ? 'readonly' : null; + $this->attribs['disabled'] = ($this->element['disabled'] == 'true') ? 'disabled' : null; + $this->attribs['placeholder'] = $this->element['placeholder'] ? JText::_($this->element['placeholder']) : null; + + if (isset($this->element['filter']) && ($this->element['filter'] == 'float' || $this->element['filter'] == 'integer')) + { + $this->attribs['type'] = 'number'; + } + + $elementAttribs = $this->element->attributes(); + + // Automatically insert any other attribute inserted + if (!empty($elementAttribs)) + { + foreach ($elementAttribs as $name => $value) + { + if (!in_array($name, $this->forbiddenAttributes)) + { + $this->addAttribute($name, $value); + } + } + } + + $html = ''; + + if ($this->multiple == 1 && is_array($this->value)) + { + foreach ($this->value AS $value) + { + $this->attribs['value'] = htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); + + $html .= '
    attribs) . ' />
    '; + } + + return $html; + } + + $this->attribs['value'] = htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8'); + + return 'attribs) . ' />'; + } +} diff --git a/libraries/redshop/form/field/users.php b/libraries/redshop/form/field/users.php new file mode 100644 index 00000000000..a2c096acca1 --- /dev/null +++ b/libraries/redshop/form/field/users.php @@ -0,0 +1,62 @@ +element['address_type']) ? (string) $this->element['address_type'] : false; + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('u.id', 'value')) + ->select( + 'CONCAT(' . $db->qn('ru.firstname') . ',' + . $db->quote(' ') . ',' + . $db->qn('ru.lastname') . ',' + . $db->quote(' (') . ',' + . $db->qn('u.username') . ',' + . $db->quote(')') . ') AS ' . $db->qn('text') + ) + ->from($db->qn('#__users', 'u')) + ->leftJoin($db->qn('#__redshop_users_info', 'ru') . ' ON ' . $db->qn('u.id') . ' = ' . $db->qn('ru.user_id')); + + if ($addressType !== false) + { + $query->where($db->qn('ru.address_type') . ' = ' . $db->quote($addressType)); + } + + $options = $db->setQuery($query)->loadObjectList(); + + return array_merge(parent::getOptions(), $options); + } +} diff --git a/libraries/redshop/form/field/voucher_product.php b/libraries/redshop/form/field/voucher_product.php new file mode 100644 index 00000000000..58e725cfb71 --- /dev/null +++ b/libraries/redshop/form/field/voucher_product.php @@ -0,0 +1,101 @@ +element['voucher_id']) ? (int) $this->element['voucher_id'] : false; + $selected = array(); + $typeField = ', alert:"voucher"'; + + if ($voucherId) + { + $products = RedshopEntityVoucher::getInstance($voucherId)->getProducts(); + $typeField .= ', voucher_id:' . $voucherId; + + if (!$products->isEmpty()) + { + foreach ($products->getAll() as $product) + { + $data = new stdClass; + $data->value = $product->get('product_id'); + $data->text = $product->get('product_name'); + + $selected[$product->get('product_id')] = $data; + } + } + } + + if (!empty($this->value)) + { + $values = !$this->multiple || !is_array($this->value) ? array($this->value) : $this->value; + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn(array('product_id', 'product_name'))) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_id') . ' IN (' . implode(',', $values) . ')'); + + $products = $db->setQuery($query)->loadObjectList(); + + foreach ($products as $product) + { + if (isset($selected[$product->product_id])) + { + continue; + } + + $data = new stdClass; + $data->value = $product->product_id; + $data->text = $product->product_name; + + $selected[$product->product_id] = $data; + } + } + + return JHtml::_( + 'redshopselect.search', + $selected, + 'jform[' . $this->fieldname . ']', + array( + 'select2.ajaxOptions' => array( + 'typeField' => $typeField + ), + 'select2.options' => array('multiple' => true), + 'list.attr' => array('required' => 'required') + ) + ); + } +} diff --git a/libraries/redshop/form/fields/cardtypes.php b/libraries/redshop/form/fields/cardtypes.php new file mode 100644 index 00000000000..b656d02efe8 --- /dev/null +++ b/libraries/redshop/form/fields/cardtypes.php @@ -0,0 +1,98 @@ +load('com_redshop'); + + $cardTypes = array(); + $cardTypes['ALL'] = 'COM_REDSHOP_CARD_TYPE_ALL'; + $cardTypes['DANKORT'] = 'COM_REDSHOP_CARD_TYPE_DANKORT'; + $cardTypes['VD'] = 'COM_REDSHOP_CARD_TYPE_VD'; + $cardTypes['VE'] = 'COM_REDSHOP_CARD_TYPE_VE'; + $cardTypes['MCDK'] = 'COM_REDSHOP_CARD_TYPE_MCDK'; + $cardTypes['MC'] = 'COM_REDSHOP_CARD_TYPE_MC'; + $cardTypes['VEDK'] = 'COM_REDSHOP_CARD_TYPE_VEDK'; + $cardTypes['JCB'] = 'COM_REDSHOP_CARD_TYPE_JCB'; + $cardTypes['DDK'] = 'COM_REDSHOP_CARD_TYPE_DDK'; + $cardTypes['MDK'] = 'COM_REDSHOP_CARD_TYPE_MDK'; + $cardTypes['AEDK'] = 'COM_REDSHOP_CARD_TYPE_AEDK'; + $cardTypes['DINERS'] = 'COM_REDSHOP_CARD_TYPE_DINERS'; + $cardTypes['JCBS'] = 'COM_REDSHOP_CARD_TYPE_JCBS'; + $cardTypes['AE'] = 'COM_REDSHOP_CARD_TYPE_AE'; + $cardTypes['MAESTRO'] = 'COM_REDSHOP_CARD_TYPE_MAESTRO'; + $cardTypes['FORBRUGSFORENINGEN'] = 'COM_REDSHOP_CARD_TYPE_FORBRUGSFORENINGEN'; + $cardTypes['EWIRE'] = 'COM_REDSHOP_CARD_TYPE_EWIRE'; + $cardTypes['VISA'] = 'COM_REDSHOP_CARD_TYPE_VISA'; + $cardTypes['IKANO'] = 'COM_REDSHOP_CARD_TYPE_IKANO'; + $cardTypes['NORDEA'] = 'COM_REDSHOP_CARD_TYPE_NORDEA'; + $cardTypes['DB'] = 'COM_REDSHOP_CARD_TYPE_DB'; + $cardTypes['IKANO'] = 'COM_REDSHOP_CARD_TYPE_IKANO'; + $cardTypes['MASTERCARDDEBETCARD'] = 'COM_REDSHOP_CARD_TYPE_MASTERCARDDEBETCARD'; + $cardTypes['PAII'] = 'COM_REDSHOP_CARD_TYPE_PAII'; + $cardTypes['VIABILL'] = 'COM_REDSHOP_CARD_TYPE_VIABILL'; + + // Allow parent options - This will extends the options added directly from XML + $options = parent::getOptions(); + + foreach ($cardTypes as $value => $text) + { + $tmp = JHtml::_( + 'select.option', + $value, + $text, + 'value', + 'text' + ); + + // Set some option attributes. + $tmp->checked = false; + + // Add the option object to the result set. + $options[] = $tmp; + } + + JFactory::getDocument()->addScriptDeclaration(' + jQuery(document).ready(function (){ + jQuery("#jform_params_cardtypes0").click(function(event) { + jQuery("[id^=jform_params_cardtypes]").attr("checked", jQuery(this).get(0).checked); + }); + });' + ); + + return $options; + } +} diff --git a/libraries/redshop/form/fields/categories.php b/libraries/redshop/form/fields/categories.php new file mode 100644 index 00000000000..5aa6a1c3528 --- /dev/null +++ b/libraries/redshop/form/fields/categories.php @@ -0,0 +1,60 @@ + 0) + { + foreach ($categories as $category) + { + $option = JHtml::_('select.option', $category->id, $category->name); + $options[] = $option; + } + } + + $options = array_merge(parent::getOptions(), $options); + $attr = ''; + + // Initialize some field attributes. + $attr .= $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : ''; + $attr .= $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : ''; + $attr .= $this->element['multiple'] ? ' multiple' : ''; + + // Initialize JavaScript field attributes. + $attr .= $this->element['onchange'] ? ' onchange="' . (string) $this->element['onchange'] . '"' : ''; + + return JHtml::_('select.genericlist', $options, $this->name, trim($attr), 'value', 'text', $this->value, $this->id); + } +} diff --git a/libraries/redshop/form/fields/categoriesparent.php b/libraries/redshop/form/fields/categoriesparent.php new file mode 100644 index 00000000000..c22e0a4a574 --- /dev/null +++ b/libraries/redshop/form/fields/categoriesparent.php @@ -0,0 +1,178 @@ +element['name']; + + // Let's get the id for the current item, either category or content item. + $input = JFactory::getApplication()->input; + $extension = 'com_redshop'; + + // For categories the old category is the category id 0 for new category. + if ($this->element['parent']) + { + $oldCat = $input->get('id', 0); + } + else + // For items the old category is the category they are in when opened or 0 if new. + { + $oldCat = $this->form->getValue($name); + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('a.id AS value, a.name AS text, a.level, a.published') + ->from('#__redshop_category AS a') + ->join('LEFT', $db->quoteName('#__redshop_category') . ' AS b ON a.lft > b.lft AND a.rgt < b.rgt'); + + if ($this->element['parent']) + { + // Prevent parenting to children of this item. + if ($id = $this->form->getValue('id')) + { + $query->join('LEFT', $db->quoteName('#__redshop_category') . ' AS p ON p.id = ' . (int) $id) + ->where('NOT(a.lft >= p.lft AND a.rgt <= p.rgt)'); + + $rowQuery = $db->getQuery(true); + $rowQuery->select('a.id AS value, a.name AS text, a.level, a.parent_id') + ->from('#__redshop_category AS a') + ->where('a.id = ' . (int) $id); + $db->setQuery($rowQuery); + $row = $db->loadObject(); + } + } + + $query->where('a.published IN (0,1)') + ->group('a.id, a.name, a.level, a.lft, a.rgt, a.parent_id') + ->order('a.lft ASC'); + + // Get the options. + $db->setQuery($query); + + try + { + $options = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + + // Pad the option text with spaces using depth level as a multiplier. + for ($i = 0, $n = count($options); $i < $n; $i++) + { + // Translate ROOT + if ($this->element['parent'] == true) + { + if ($options[$i]->level == 0) + { + $options[$i]->text = JText::_('JGLOBAL_ROOT_PARENT'); + } + } + + if ($options[$i]->published == 1) + { + $options[$i]->text = str_repeat('- ', $options[$i]->level) . $options[$i]->text; + } + else + { + $options[$i]->text = str_repeat('- ', $options[$i]->level) . '[' . $options[$i]->text . ']'; + } + } + + // Get the current user object. + $user = JFactory::getUser(); + + // For new items we want a list of categories you are allowed to create in. + if ($oldCat == 0) + { + foreach ($options as $i => $option) + { + /* + * To take save or create in a category you need to have create rights for that category unless the item is already in that category. + * Unset the option if the user isn't authorised for it. In this field assets are always categories. + */ + if ($user->authorise('core.create', $extension . '.category.' . $option->value) != true) + { + unset($options[$i]); + } + } + } + // If you have an existing category id things are more complex. + else + { + foreach ($options as $i => $option) + { + /* + * If you are only allowed to edit in this category but not edit.state, you should not get any + * option to change the category parent for a category or the category for a content item, + * but you should be able to save in that category. + */ + if ($user->authorise('core.edit.state', $extension . '.category.' . $oldCat) != true) + { + if ($option->value != $oldCat) + { + echo 'y'; + unset($options[$i]); + } + } + /* + * However, if you can edit.state you can also move this to another category for which you have + * create permission and you should also still be able to save in the current category. + */ + elseif (($user->authorise('core.create', $extension . '.category.' . $option->value) != true) + && $option->value != $oldCat + ) + { + echo 'x'; + unset($options[$i]); + } + } + } + + if (isset($row) && !isset($options[0]) && $row->parent_id == '1') + { + $parent = new stdClass; + $parent->text = JText::_('JGLOBAL_ROOT_PARENT'); + array_unshift($options, $parent); + } + + // Merge any additional options in the XML definition. + return array_merge(parent::getOptions(), $options); + } +} diff --git a/libraries/redshop/form/fields/categorylist.php b/libraries/redshop/form/fields/categorylist.php new file mode 100644 index 00000000000..ef618bdbb4b --- /dev/null +++ b/libraries/redshop/form/fields/categorylist.php @@ -0,0 +1,400 @@ + tag for the form field object. + * @param mixed $value The form field value to validate. + * @param string $group The field name group control value. This acts as as an array container for the field. + * For example if the field has name="foo" and the group value is set to "bar" then the + * full field name would end up being "bar[foo]". + * + * @return boolean True on success. + * + * @see JFormField::setup() + * @since 3.2 + */ + public function setup(SimpleXMLElement $element, $value, $group = null) + { + $return = parent::setup($element, $value, $group); + + if ($return) + { + $this->allowAdd = isset($this->element['allowAdd']) ? $this->element['allowAdd'] : ''; + } + + return $return; + } + + /** + * Method to get certain otherwise inaccessible properties from the form field object. + * + * @param string $name The property name for which to the the value. + * + * @return mixed The property value or null. + * + * @since 3.6 + */ + public function __get($name) + { + switch ($name) + { + case 'allowAdd': + return $this->$name; + } + + return parent::__get($name); + } + + /** + * Method to set certain otherwise inaccessible properties of the form field object. + * + * @param string $name The property name for which to the the value. + * @param mixed $value The value of the property. + * + * @return void + * + * @since 3.6 + */ + public function __set($name, $value) + { + $value = (string) $value; + + switch ($name) + { + case 'allowAdd': + $value = (string) $value; + $this->$name = ($value === 'true' || $value === $name || $value === '1'); + break; + default: + parent::__set($name, $value); + } + } + + /** + * Method to get a list of categories that respects access controls and can be used for + * either category assignment or parent category assignment in edit screens. + * Use the parent element to indicate that the field will be used for assigning parent categories. + * + * @return array The field option objects. + * + * @since 1.6 + */ + protected function getOptions() + { + $options = array(); + $published = $this->element['published'] ? $this->element['published'] : array(0, 1); + $name = (string) $this->element['name']; + + // Let's get the id for the current item, either category or content item. + $jinput = JFactory::getApplication()->input; + $extension = 'com_redshop'; + + // For categories the old category is the category id or 0 for new category. + if ($this->element['parent']) + { + $oldCat = $jinput->get('id', 0); + $oldParent = $this->form->getValue($name, 0); + + } + // For items the old category is the category they are in when opened or 0 if new. + else + { + $oldCat = $this->form->getValue($name, 0); + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('DISTINCT a.id AS value, a.name AS text, a.level, a.published, a.lft'); + + $subQuery = $db->getQuery(true) + ->select('id, name, level, published, parent_id, lft, rgt') + ->from('#__redshop_category'); + + // Filter on the published state + if (is_numeric($published)) + { + $subQuery->where('published = ' . (int) $published); + } + elseif (is_array($published)) + { + $subQuery->where('published IN (' . implode(',', ArrayHelper::toInteger($published)) . ')'); + } + + $query->from('(' . (string) $subQuery . ') AS a') + ->join('LEFT', $db->qn('#__redshop_category') . ' AS b ON a.lft > b.lft AND a.rgt < b.rgt'); + $query->order('a.lft ASC'); + + // If parent isn't explicitly stated but we are in com_redshop assume we want parents + if ($oldCat != 0 && ($this->element['parent'] == true)) + { + // Prevent parenting to children of this item. + // To rearrange parents and children move the children up, not the parents down. + $query->join('LEFT', $db->qn('#__redshop_category') . ' AS p ON p.id = ' . (int) $oldCat) + ->where('NOT(a.lft >= p.lft AND a.rgt <= p.rgt)'); + + $rowQuery = $db->getQuery(true); + $rowQuery->select('a.id AS value, a.name AS text, a.level, a.parent_id') + ->from('#__redshop_category AS a') + ->where('a.id = ' . (int) $oldCat); + $db->setQuery($rowQuery); + $row = $db->loadObject(); + } + + // Get the options. + $db->setQuery($query); + + try + { + $options = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + + // Pad the option text with spaces using depth level as a multiplier. + for ($i = 0, $n = count($options); $i < $n; $i++) + { + // Translate ROOT + if ($this->element['parent'] == true) + { + if ($options[$i]->level == 0) + { + $options[$i]->text = JText::_('JGLOBAL_ROOT_PARENT'); + } + } + + if ($options[$i]->published == 1) + { + $options[$i]->text = str_repeat('- ', $options[$i]->level) . $options[$i]->text; + } + else + { + $options[$i]->text = str_repeat('- ', $options[$i]->level) . '[' . $options[$i]->text . ']'; + } + } + + // Get the current user object. + $user = JFactory::getUser(); + + // For new items we want a list of categories you are allowed to create in. + if ($oldCat == 0) + { + foreach ($options as $i => $option) + { + /* + * To take save or create in a category you need to have create rights for that category unless the item is already in that category. + * Unset the option if the user isn't authorised for it. In this field assets are always categories. + */ + if ($user->authorise('core.create', $extension . '.category.' . $option->value) != true && $option->level != 0) + { + unset($options[$i]); + } + } + } + // If you have an existing category id things are more complex. + else + { + /* + * If you are only allowed to edit in this category but not edit.state, you should not get any + * option to change the category parent for a category or the category for a content item, + * but you should be able to save in that category. + */ + foreach ($options as $i => $option) + { + if ($user->authorise('core.edit.state', $extension . '.category.' . $oldCat) != true && !isset($oldParent)) + { + if ($option->value != $oldCat) + { + unset($options[$i]); + } + } + + if ($user->authorise('core.edit.state', $extension . '.category.' . $oldCat) != true + && (isset($oldParent)) + && $option->value != $oldParent + ) + { + unset($options[$i]); + } + + /* + * However, if you can edit.state you can also move this to another category for which you have + * create permission and you should also still be able to save in the current category. + */ + if (($user->authorise('core.create', $extension . '.category.' . $option->value) != true) + && ($option->value != $oldCat && !isset($oldParent)) + ) + { + { + unset($options[$i]); + } + } + + if (($user->authorise('core.create', $extension . '.category.' . $option->value) != true) + && (isset($oldParent)) + && $option->value != $oldParent + ) + { + { + unset($options[$i]); + } + } + } + } + + if (($this->element['parent'] == true) + && (isset($row) && !isset($options[0])) + && isset($this->element['show_root']) + ) + { + if ($row->parent_id == '1') + { + $parent = new stdClass; + $parent->text = JText::_('JGLOBAL_ROOT_PARENT'); + + array_unshift($options, $parent); + } + + array_unshift($options, JHtml::_('select.option', '0', JText::_('JGLOBAL_ROOT_PARENT'))); + } + + if (!isset($this->element['show_root'])) + { + $options[0]->value = ''; + $options[0]->text = JText::_('COM_REDSHOP_SELECT_CATEGORY'); + } + + if (isset($this->element['remove_select'])) + { + unset($options[0]); + array_merge($options, array()); + } + + // Merge any additional options in the XML definition. + return array_merge(parent::getOptions(), $options); + } + + /** + * Method to get the field input markup for a generic list. + * Use the multiple attribute to enable multiselect. + * + * @return string The field input markup. + * + * @since 3.6 + */ + protected function getInput() + { + $html = array(); + $class = array(); + $attr = ''; + + // Initialize some field attributes. + $class[] = !empty($this->class) ? $this->class : ''; + + if ($this->allowAdd) + { + $customGroupText = JText::_('JGLOBAL_CUSTOM_CATEGORY'); + + $class[] = 'chzn-custom-value'; + $attr .= ' data-custom_group_text="' . $customGroupText . '" ' + . 'data-no_results_text="' . JText::_('JGLOBAL_ADD_CUSTOM_CATEGORY') . '" ' + . 'data-placeholder="' . JText::_('JGLOBAL_TYPE_OR_SELECT_CATEGORY') . '" '; + } + + if ($class) + { + $attr .= 'class="' . implode(' ', $class) . '"'; + } + + $attr .= !empty($this->size) ? ' size="' . $this->size . '"' : ''; + $attr .= $this->multiple ? ' multiple' : ''; + $attr .= $this->required ? ' required aria-required="true"' : ''; + $attr .= $this->autofocus ? ' autofocus' : ''; + + // To avoid user's confusion, readonly="true" should imply disabled="true". + if ((string) $this->readonly == '1' + || (string) $this->readonly == 'true' + || (string) $this->disabled == '1' + || (string) $this->disabled == 'true' + ) + { + $attr .= ' disabled="disabled"'; + } + + // Initialize JavaScript field attributes. + $attr .= $this->onchange ? ' onchange="' . $this->onchange . '"' : ''; + + // Get the field options. + $options = (array) $this->getOptions(); + + // Create a read-only list (no name) with hidden input(s) to store the value(s). + if ((string) $this->readonly == '1' || (string) $this->readonly == 'true') + { + $html[] = JHtml::_('select.genericlist', $options, '', trim($attr), 'value', 'text', $this->value, $this->id); + + // E.g. form field type tag sends $this->value as array + if ($this->multiple && is_array($this->value)) + { + if (!count($this->value)) + { + $this->value[] = ''; + } + + foreach ($this->value as $value) + { + $html[] = ''; + } + } + else + { + $html[] = ''; + } + } + else + // Create a regular list. + { + $html[] = JHtml::_('select.genericlist', $options, $this->name, trim($attr), 'value', 'text', $this->value, $this->id); + } + + return implode($html); + } +} diff --git a/libraries/redshop/form/fields/creditcards.php b/libraries/redshop/form/fields/creditcards.php new file mode 100644 index 00000000000..29de4d8e919 --- /dev/null +++ b/libraries/redshop/form/fields/creditcards.php @@ -0,0 +1,72 @@ +load('com_redshop'); + + $cardTypes = array(); + $cardTypes['VISA'] = JText::_('COM_REDSHOP_CARD_TYPE_VISA'); + $cardTypes['MC'] = JText::_('COM_REDSHOP_CARD_TYPE_MASTERCARD'); + $cardTypes['amex'] = JText::_('COM_REDSHOP_CARD_TYPE_AMERICAN_EXPRESS'); + $cardTypes['maestro'] = JText::_('COM_REDSHOP_CARD_TYPE_MAESTRO'); + $cardTypes['jcb'] = JText::_('COM_REDSHOP_CARD_TYPE_JCB'); + $cardTypes['diners'] = JText::_('COM_REDSHOP_CARD_TYPE_DINERS_CLUB'); + $cardTypes['discover'] = JText::_('COM_REDSHOP_CARD_TYPE_DISCOVER'); + + // Allow parent options - This will extends the options added directly from XML + $options = parent::getOptions(); + + foreach ($cardTypes as $value => $text) + { + $tmp = JHtml::_( + 'select.option', + $value, + $text, + 'value', + 'text' + ); + + // Set some option attributes. + $tmp->checked = false; + + // Add the option object to the result set. + $options[] = $tmp; + } + + return $options; + } +} diff --git a/libraries/redshop/form/fields/currency.php b/libraries/redshop/form/fields/currency.php new file mode 100644 index 00000000000..3bd2170f307 --- /dev/null +++ b/libraries/redshop/form/fields/currency.php @@ -0,0 +1,115 @@ +get('CURRENCY_LIBRARIES') == 1) + { + $convertedCurrencies = CurrencyLayer::getInstance()->getConvertedCurrencies(); + } + else + { + $convertedCurrencies = Currency::getInstance()->getConvertedCurrencies(); + } + + if (!empty($convertedCurrencies)) + { + foreach ($convertedCurrencies as $key => $val) + { + $currency[] = $key; + } + + $currency = '\'' . implode("','", $currency) . '\''; + } + + $shopCurrency = $this->getCurrency($currency); + $ctrl = $this->name; + + // Construct the various argument calls that are supported. + $attributes = ' '; + + if ($v = $this->element['size']) + { + $attributes .= 'size="' . $v . '"'; + } + + if ($v = $this->element['class']) + { + $attributes .= 'class="' . $v . '"'; + } + else + { + $attributes .= 'class="form-control inputbox"'; + } + + if ($this->element['multiple']) + { + $attributes .= ' multiple="multiple"'; + } + + return JHtml::_('select.genericlist', $shopCurrency, $ctrl, $attributes, 'value', 'text', $this->value, $this->id); + } + + /** + * Get Shop Currency Support + * + * @param string $currency Comma separated countries + * + * @return array Array for Shop country + * + */ + protected function getCurrency($currency = "") + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('code', 'value')) + ->select($db->qn('name', 'text')) + ->from($db->qn('#__redshop_currency')) + ->order($db->qn('name') . ' ASC'); + + if (!empty($currency)) + { + $query->where($db->qn('code') . ' IN (' . $currency . ')'); + } + + return $db->setQuery($query)->loadObjectList(); + } +} diff --git a/libraries/redshop/form/fields/economicaccountgroup.php b/libraries/redshop/form/fields/economicaccountgroup.php new file mode 100644 index 00000000000..0da03804ae6 --- /dev/null +++ b/libraries/redshop/form/fields/economicaccountgroup.php @@ -0,0 +1,56 @@ +getQuery(true); + + $query->select($db->quoteName('accountgroup_id', 'value')) + ->select($db->quoteName('accountgroup_name', 'text')) + ->from($db->quoteName('#__redshop_economic_accountgroup')) + ->where($db->quoteName('published') . ' = 1'); + $db->setQuery($query); + + $options = $db->loadObjectList(); + + // Get other options inserted in the XML file + $parentOptions = parent::getOptions(); + + return array_merge($parentOptions, $options); + } +} diff --git a/libraries/redshop/form/fields/epaycardtypes.php b/libraries/redshop/form/fields/epaycardtypes.php new file mode 100644 index 00000000000..df978f4d38b --- /dev/null +++ b/libraries/redshop/form/fields/epaycardtypes.php @@ -0,0 +1,132 @@ +addScriptDeclaration(' + function enableDisableAll() { + if (document.getElementById("ALL").checked == true) { + document.getElementById("VD").checked = true; + document.getElementById("ED").checked = true; + document.getElementById("VE").checked = true; + document.getElementById("MC").checked = true; + document.getElementById("JCB").checked = true; + document.getElementById("DINERS").checked = true; + document.getElementById("AE").checked = true; + document.getElementById("MAESTRO").checked = true; + document.getElementById("FORBRUGSFORENINGEN").checked = true; + document.getElementById("NORDEA").checked = true; + document.getElementById("DANSKE").checked = true; + document.getElementById("PAYPAL").checked = true; + document.getElementById("MOBILPENGE").checked = true; + } else { + document.getElementById("VD").checked = false; + document.getElementById("ED").checked = false; + document.getElementById("VE").checked = false; + document.getElementById("MC").checked = false; + document.getElementById("JCB").checked = false; + document.getElementById("DINERS").checked = false; + document.getElementById("AE").checked = false; + document.getElementById("MAESTRO").checked = false; + document.getElementById("FORBRUGSFORENINGEN").checked = false; + document.getElementById("NORDEA").checked = false; + document.getElementById("DANSKE").checked = false; + document.getElementById("PAYPAL").checked = false; + document.getElementById("MOBILPENGE").checked = false; + } + } + '); + + // This might get a conflict with the dynamic translation - TODO: search for better solution + + //$selected_cc = explode(",",$this->detail->accepted_credict_card); + $creditCards = array(); + + $creditCards['ALL'] = 'All cards'; + $creditCards['VD'] = 'Dankort/VISA Dankort'; + $creditCards['ED'] = 'eDankort'; + $creditCards['VE'] = 'VISA / VISA Electron'; + $creditCards['MC'] = 'MASTERCARD'; + $creditCards['JCB'] = 'JCB'; + $creditCards['DINERS'] = 'DINERS'; + $creditCards['MAESTRO'] = 'MAESTRO'; + $creditCards['AE'] = 'AMERICAN EXPRESS'; + $creditCards['FORBRUGSFORENINGEN'] = 'FORBRUGSFORENINGEN'; + $creditCards['NORDEA'] = 'NORDEA'; + $creditCards['DANSKE'] = 'Danske Netbetalinger'; + $creditCards['PAYPAL'] = 'PAYPAL'; + $creditCards['MOBILPENGE'] = 'MOBILPENGE'; + + $html = ''; + + foreach ($creditCards as $key => $value) + { + if (count($this->value) != 0 || $this->value != 0) + { + if (is_array($this->value)) + { + $checked = in_array($key, $this->value) ? "checked" : ""; + } + else + { + $checked = ($key == $this->value) ? "checked" : ""; + } + } + else + { + $checked = ''; + } + + + if ($key == 'ALL') + { + if ($key == $this->value) + { + $checked = 'checked'; + } + + $html .= ""; + } + else + { + $html .= ""; + } + } + + return $html; + } +} diff --git a/libraries/redshop/form/fields/extrafieldpayment.php b/libraries/redshop/form/fields/extrafieldpayment.php new file mode 100644 index 00000000000..8d368ff068d --- /dev/null +++ b/libraries/redshop/form/fields/extrafieldpayment.php @@ -0,0 +1,63 @@ +value)) + { + $this->value = explode(',', $this->value); + } + + // Init variables. + $db = JFactory::getDbo(); + + // Create the base select statement. + $query = $db->getQuery(true) + ->select('name as value, title as text') + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('published') . ' = 1') + ->where($db->qn('show_in_front') . ' = 1') + ->where($db->qn('section') . ' = 18') + ->order($db->qn('ordering') . ' ASC'); + + // Set the query and load the result. + $db->setQuery($query); + + return array_merge( + parent::getOptions(), + $db->loadObjectList() + ); + } +} diff --git a/libraries/redshop/form/fields/extrafields.php b/libraries/redshop/form/fields/extrafields.php new file mode 100644 index 00000000000..23daf685152 --- /dev/null +++ b/libraries/redshop/form/fields/extrafields.php @@ -0,0 +1,166 @@ + + * + * @package RedSHOP.Library + * @subpackage Form.Field + * @since 1.5 + */ +class JFormFieldExtraFields extends JFormFieldList +{ + /** + * Element name + * + * @access protected + * @var string + */ + protected $type = 'extrafields'; + + /** + * Extra Field Section Id for field_section database column + * + * @access protected + * @var integer + */ + protected $fieldSection; + + /** + * Extra Field Show In Front flag value for field_show_in_front database column + * + * @access protected + * @var integer + */ + protected $fieldShowInFront; + + /** + * Extra Field Publishing flag value for published database column + * + * @access protected + * @var integer + */ + protected $published; + + /** + * Database Query Select value to set as element value + * + * @access protected + * @var integer + */ + protected $valueField; + + /** + * Database Query Select value to set as element text + * + * @access protected + * @var integer + */ + protected $textField; + + protected $extraFields = array(); + + /** + * Get Extra field info as an option + * + * @return array Extra Field list + */ + protected function getOptions() + { + $this->fieldSection = 1; + + if (isset($this->element['section'])) + { + $this->fieldSection = (int) $this->element['section']; + } + elseif (isset($this->element['field_section'])) + { + $this->fieldSection = (int) $this->element['field_section']; + } + + $this->fieldType = isset($this->element['field_type']) ? $this->element['field_type'] : ""; + $this->fieldShowInFront = isset($this->element['show_in_front']) ? (int) $this->element['show_in_front'] : null; + $this->published = isset($this->element['published']) ? (int) $this->element['published'] : 1; + + // Dynamic query select options + $this->valueField = isset($this->element['value_field']) ? (string) $this->element['value_field'] : 'name'; + $this->textField = isset($this->element['text_field']) ? (string) $this->element['text_field'] : 'title'; + + return array_merge( + parent::getOptions(), + $this->getExtraFields() + ); + } + + /** + * Get Extra Fields using sections. + * + * @return array Extra Fields list + */ + protected function getExtraFields() + { + $db = JFactory::getDbo(); + + $key = $this->fieldSection . $this->fieldShowInFront . $this->published; + + if (array_key_exists($key, $this->extraFields)) + { + return $this->extraFields[$key]; + } + + // Create the base select statement. + $query = $db->getQuery(true) + ->select( + array( + $this->valueField . ' as value', + $this->textField . ' as text' + ) + ) + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('published') . ' = ' . (int) $this->published); + + if ($this->fieldShowInFront !== null) + { + $query->where($db->qn('show_in_front') . ' = ' . (int) $this->fieldShowInFront); + } + + $query->where($db->qn('section') . ' = ' . (int) $this->fieldSection) + ->order($db->qn('ordering') . ' ASC'); + + if ($this->fieldType != "") + { + $query->where($db->qn('type') . 'IN (' . $this->fieldType . ')'); + } + + // Set the query and load the result. + $db->setQuery($query); + + $this->extraFields[$key] = $db->loadObjectList(); + + return $this->extraFields[$key]; + } +} diff --git a/libraries/redshop/form/fields/extrafieldshipping.php b/libraries/redshop/form/fields/extrafieldshipping.php new file mode 100644 index 00000000000..c899c01418c --- /dev/null +++ b/libraries/redshop/form/fields/extrafieldshipping.php @@ -0,0 +1,59 @@ +getQuery(true) + ->select('name as value, title as text') + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('published') . ' = 1') + ->where($db->qn('show_in_front') . ' = 1') + ->where($db->qn('section') . ' = 19') + ->order($db->qn('ordering') . ' ASC'); + + // Set the query and load the result. + $db->setQuery($query); + + return array_merge( + parent::getOptions(), + $db->loadObjectList() + ); + } +} diff --git a/libraries/redshop/form/fields/extrainfo.php b/libraries/redshop/form/fields/extrainfo.php new file mode 100644 index 00000000000..21d6dff0bc0 --- /dev/null +++ b/libraries/redshop/form/fields/extrainfo.php @@ -0,0 +1,38 @@ +name . "'[]' id='" . $this->name . "'[]' rows='8' cols='20'>" . $this->value . ""; + + return $html; + } +} diff --git a/libraries/redshop/form/fields/index.html b/libraries/redshop/form/fields/index.html new file mode 100644 index 00000000000..fa6d84e8055 --- /dev/null +++ b/libraries/redshop/form/fields/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/redshop/form/fields/manufacturer.php b/libraries/redshop/form/fields/manufacturer.php new file mode 100644 index 00000000000..d6cac0404d6 --- /dev/null +++ b/libraries/redshop/form/fields/manufacturer.php @@ -0,0 +1,44 @@ +name; + + // This might get a conflict with the dynamic translation - TODO: search for better solution + $query = 'SELECT id,name ' . + ' FROM #__redshop_manufacturer WHERE published=1'; + $db->setQuery($query); + $options = $db->loadObjectList(); + array_unshift($options, JHTML::_('select.option', '0', '- ' . JText::_('COM_REDSHOP_SELECT_MANUFACTURER') . ' -', 'id', 'name')); + + return JHTML::_('select.genericlist', $options, $name, 'class="inputbox"', 'id', 'name', $this->value, $name); + } +} diff --git a/libraries/redshop/form/fields/mediadragdrop.php b/libraries/redshop/form/fields/mediadragdrop.php new file mode 100644 index 00000000000..7a013fb1d38 --- /dev/null +++ b/libraries/redshop/form/fields/mediadragdrop.php @@ -0,0 +1,54 @@ + $this->id, + 'name' => $this->name, + 'value' => $this->value + ]; + + // Render html in layouts/html + return RedshopLayoutHelper::render( + 'media.dropzone', + $displayData, + null, + array('option' => 'com_redshop') + ); + } +} diff --git a/libraries/redshop/form/fields/orderbymanufacturer.php b/libraries/redshop/form/fields/orderbymanufacturer.php new file mode 100644 index 00000000000..e8a40353a16 --- /dev/null +++ b/libraries/redshop/form/fields/orderbymanufacturer.php @@ -0,0 +1,51 @@ +name; + $value = $this->value; + + if (!$value) + { + $value = Redshop::getConfig()->get('DEFAULT_MANUFACTURER_ORDERING_METHOD'); + } + + $order_data = RedshopHelperUtility::getManufacturerOrderByList(); + + $order_select = JHTML::_('select.genericlist', $order_data, $name, 'class="inputbox"', 'value', 'text', $value, $name); + + return $order_select; + } +} diff --git a/libraries/redshop/form/fields/orderbyproduct.php b/libraries/redshop/form/fields/orderbyproduct.php new file mode 100644 index 00000000000..63d9277fbd8 --- /dev/null +++ b/libraries/redshop/form/fields/orderbyproduct.php @@ -0,0 +1,58 @@ +value) + { + $this->value = Redshop::getConfig()->get('DEFAULT_PRODUCT_ORDERING_METHOD'); + } + + return parent::getInput(); + } + + /** + * Method to get the field options. + * + * @return array The field option objects. + * + * @since 1.6 + */ + protected function getOptions() + { + return array_merge(parent::getOptions(), RedshopHelperUtility::getOrderByList()); + } +} diff --git a/libraries/redshop/form/fields/orderstatus.php b/libraries/redshop/form/fields/orderstatus.php new file mode 100644 index 00000000000..3b31085b744 --- /dev/null +++ b/libraries/redshop/form/fields/orderstatus.php @@ -0,0 +1,44 @@ +setQuery($query); + $options = $db->loadObjectList(); + array_unshift($options, JHTML::_('select.option', '0', '- ' . JText::_('COM_REDSHOP_SELECT_TEMPLATE') . ' -', 'id', 'name')); + + return JHTML::_('select.genericlist', $options, $this->name, 'class="inputbox"', 'id', 'name', $this->value, $this->id); + + + } +} + +?> diff --git a/libraries/redshop/form/fields/productattributes.php b/libraries/redshop/form/fields/productattributes.php new file mode 100644 index 00000000000..f7d524580b2 --- /dev/null +++ b/libraries/redshop/form/fields/productattributes.php @@ -0,0 +1,73 @@ + 0 "; + + if (!empty($this->product_ids)) + { + $subQuery .= " AND a.product_id IN (" . implode(',', $this->product_ids) . ") "; + } + + $query = "SELECT DISTINCT uniq_att.attribute_name AS text, uniq_att.attribute_name AS value FROM (" . $subQuery . ") AS uniq_att"; + + $attributes = $db->setQuery($query)->loadObjectList(); + + return array_merge(parent::getOptions(), $attributes); + } + + /** + * Method to get a control group with label and input. + * + * @param array $options Options to be passed into the rendering of the field + * + * @return string A string containing the html for the control group + * + * @since 3.7.3 + */ + public function renderField($options = array()) + { + if (!empty($options) && isset($options['product_ids'])) + { + $this->product_ids = $options['product_ids']; + } + + return parent::renderField($options); + } +} diff --git a/libraries/redshop/form/fields/products.php b/libraries/redshop/form/fields/products.php new file mode 100644 index 00000000000..2295f80c8e1 --- /dev/null +++ b/libraries/redshop/form/fields/products.php @@ -0,0 +1,79 @@ +name; + $fieldName = $this->name; + + JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_redshop/tables'); + + $product = JTable::getInstance('product_detail', 'Table'); + + if ($this->value) + { + $product->load($this->value); + } + else + { + $product->product_name = JText::_('COM_REDSHOP_SELECT_A_PRODUCT'); + } + + JFactory::getDocument()->addScriptDeclaration(" + function jSelectProduct(id, title, object) { + document.getElementById(object + '_id').value = id; + document.getElementById(object + '_name').value = title; + window.parent.SqueezeBox.close(); + } + "); + + $link = 'index.php?option=com_redshop&view=product&layout=element&tmpl=component&object=' . $name; + + JHTML::_('behavior.modal', 'a.modal'); + + $value = htmlspecialchars($product->product_name, ENT_QUOTES, 'UTF-8'); + $attributes [] = 'style="background: #ffffff;"'; + $attributes [] = ($this->required) ? 'required="required"' : ''; + $class [] = ($this->required) ? 'required=' : ''; + $attributes = array_merge($attributes, $class); + $attributes = trim(implode(' ', array_unique($attributes))); + + $html = '
    '; + $html .= ''; + $html .= '
    '; + $html .= '
    '; + $html .= ''; + + return $html; + } +} diff --git a/libraries/redshop/form/fields/productsearchtype.php b/libraries/redshop/form/fields/productsearchtype.php new file mode 100644 index 00000000000..bf299faaa6b --- /dev/null +++ b/libraries/redshop/form/fields/productsearchtype.php @@ -0,0 +1,45 @@ +name, 'class="inputbox"', 'value', 'text', $this->value, $this->id); + } +} diff --git a/libraries/redshop/form/fields/rajaxproducts.php b/libraries/redshop/form/fields/rajaxproducts.php new file mode 100644 index 00000000000..cbfde171544 --- /dev/null +++ b/libraries/redshop/form/fields/rajaxproducts.php @@ -0,0 +1,46 @@ +value, 'productid', + array( + 'select2.ajaxOptions' => array('typeField' => ', product:1'), + 'select2.options' => array('placeholder' => JText::_('COM_REDSHOP_PRODUCT')) + ) + ); + } +} diff --git a/libraries/redshop/form/fields/rajaxusers.php b/libraries/redshop/form/fields/rajaxusers.php new file mode 100644 index 00000000000..68064c2c58d --- /dev/null +++ b/libraries/redshop/form/fields/rajaxusers.php @@ -0,0 +1,44 @@ +value, 'userid', + array( + 'select2.ajaxOptions' => array('typeField' => ', user:1'), + 'select2.options' => array('placeholder' => JText::_('COM_REDSHOP_USER')) + ) + ); + } +} diff --git a/libraries/redshop/form/fields/rcountries.php b/libraries/redshop/form/fields/rcountries.php new file mode 100644 index 00000000000..ccfdaaa3d87 --- /dev/null +++ b/libraries/redshop/form/fields/rcountries.php @@ -0,0 +1,49 @@ +getQuery(true) + ->select($db->qn('id', 'value')) + ->select($db->qn('country_name', 'text')) + ->from($db->qn('#__redshop_country')) + ->order($db->qn('country_name')); + + $options = $db->setQuery($query)->loadObjectList(); + + $parentOptions = parent::getOptions(); + + return array_merge($parentOptions, $options); + } +} diff --git a/libraries/redshop/form/fields/rcountry3code.php b/libraries/redshop/form/fields/rcountry3code.php new file mode 100644 index 00000000000..6db669c680d --- /dev/null +++ b/libraries/redshop/form/fields/rcountry3code.php @@ -0,0 +1,55 @@ +getQuery(true); + $query->select($db->quoteName('country_3_code', 'value')) + ->select($db->quoteName('country_name', 'text')) + ->from($db->quoteName('#__redshop_country')); + $db->setQuery($query); + + try + { + $options = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + throw new Exception($e->getMessage()); + } + + // Get other options inserted in the XML file + $parentOptions = parent::getOptions(); + + return array_merge($parentOptions, $options); + } +} \ No newline at end of file diff --git a/libraries/redshop/form/fields/rdaterange.php b/libraries/redshop/form/fields/rdaterange.php new file mode 100644 index 00000000000..5f9b47fcc23 --- /dev/null +++ b/libraries/redshop/form/fields/rdaterange.php @@ -0,0 +1,75 @@ +element['format'])) ? (string) $this->element['format'] : 'DD/MM/YYYY'; + $firstDay = (isset($this->element['first_day'])) ? (int) $this->element['first_day'] : 1; + $autoApply = (isset($this->element['auto_apply'])) ? (boolean) $this->element['auto_apply'] : true; + $showButton = (isset($this->element['show_button'])) ? (boolean) $this->element['show_button'] : true; + $class = (isset($this->element['class'])) ? (string) $this->element['class'] : ''; + $onChange = (isset($this->element['onChange'])) ? (string) $this->element['onChange'] : ''; + $phpFormat = (isset($this->element['phpFormat'])) ? (string) $this->element['phpFormat'] : 'd/m/Y'; + + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/moment.min.js', false, true); + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/daterangepicker.min.js', false, true); + JHtml::stylesheet('com_redshop/daterangepicker.min.css', false, true); + + return RedshopLayoutHelper::render( + 'field.date_range', + array( + 'format' => $format, + 'firstDay' => $firstDay, + 'autoApply' => $autoApply, + 'field' => $this, + 'value' => $this->value, + 'class' => $class, + 'showButton' => $showButton, + 'onChange' => $onChange, + 'phpFormat' => $phpFormat + ) + ); + } +} diff --git a/libraries/redshop/form/fields/redshopcategory.php b/libraries/redshop/form/fields/redshopcategory.php new file mode 100644 index 00000000000..c07e325c8e6 --- /dev/null +++ b/libraries/redshop/form/fields/redshopcategory.php @@ -0,0 +1,90 @@ +load('com_redshop', JPATH_ADMINISTRATOR); + +/** + * element for default product layout + * + * @since 1.5.0.1 + */ +class JFormFieldRedshopCategory extends JFormFieldList +{ + /** + * Element name + * + * @var string + */ + public $type = 'redshopcategory'; + + /** + * A static cache. + * + * @var array|null + */ + protected static $cache = null; + + /** + * Method to get the field options. + * + * @return array The field option objects. + */ + protected function getOptions() + { + // Process value + if (!empty($this->value) && $this->multiple && !is_array($this->value)) + { + $this->value = explode(',', $this->value); + } + + $options = array(); + + if (!$this->multiple) + { + $options[] = JHtml::_('select.option', '', JText::_('COM_REDSHOP_SELECT_CATEGORY'), 'value', 'text'); + } + + if (!self::$cache) + { + // Get the categories. + self::$cache = RedshopHelperCategory::getCategoryListArray(); + } + + // Build the field options. + if (!empty(self::$cache)) + { + if ($this->multiple) + { + $options[] = JHtml::_('select.optgroup', JText::_('COM_REDSHOP_SELECT_CATEGORY')); + } + + foreach (self::$cache as $item) + { + $options[] = JHtml::_('select.option', $item->id, $item->name, 'value', 'text'); + } + + if ($this->multiple) + { + $options[] = JHtml::_('select.optgroup', JText::_('COM_REDSHOP_SELECT_CATEGORY')); + } + } + + // Merge any additional options in the XML definition. + $options = array_merge(parent::getOptions(), $options); + + return $options; + } +} diff --git a/libraries/redshop/form/fields/redshopeditor.php b/libraries/redshop/form/fields/redshopeditor.php new file mode 100644 index 00000000000..67e378cd9c1 --- /dev/null +++ b/libraries/redshop/form/fields/redshopeditor.php @@ -0,0 +1,46 @@ +value) + { + $layoutFile = $this->element['layoutFile'] ? (string) $this->element['layoutFile'] : 'sample'; + $this->value = RedshopLayoutHelper::render($layoutFile, null, JPATH_SITE . (string) $this->element['basePath']); + } + + // Style needed for J2.5 + // @todo: remove style in redSHOP 1.6 + return '
    ' . parent::getInput() . '
    '; + } +} diff --git a/libraries/redshop/form/fields/rpredefinedlist.php b/libraries/redshop/form/fields/rpredefinedlist.php new file mode 100644 index 00000000000..abab84b138a --- /dev/null +++ b/libraries/redshop/form/fields/rpredefinedlist.php @@ -0,0 +1,95 @@ +element); + $type = strtolower($this->type); + + if (!isset(static::$options[$type][$hash]) && !empty($this->predefinedOptions)) + { + static::$options[$type][$hash] = parent::getOptions(); + + $options = array(); + + // Allow to only use specific values of the predefined list + $filter = isset($this->element['filter']) ? explode(',', $this->element['filter']) : array(); + + foreach ($this->predefinedOptions as $value => $text) + { + if (empty($filter) || in_array($value, $filter)) + { + $text = $this->translate ? JText::_($text) : $text; + + $options[] = (object) array( + 'value' => $value, + 'text' => $text + ); + } + } + + static::$options[$type][$hash] = array_merge(static::$options[$type][$hash], $options); + } + + return static::$options[$type][$hash]; + } +} diff --git a/libraries/redshop/form/fields/rproducts.php b/libraries/redshop/form/fields/rproducts.php new file mode 100644 index 00000000000..be07bf7bcd8 --- /dev/null +++ b/libraries/redshop/form/fields/rproducts.php @@ -0,0 +1,80 @@ +getQuery(true) + ->select($db->qn('product_id')) + ->select($db->qn('product_name')) + ->select($db->qn('product_number')) + ->from($db->qn('#__redshop_product')) + ->order($db->qn('product_name')); + + if (isset($this->element['parent']) && $this->element['parent'] === '0') + { + $query->where($db->qn('product_parent_id') . ' != 0'); + } + + $items = $db->setQuery($query)->loadObjectList(); + $options = array(); + + if (count($items) > 0) + { + foreach ($items as $item) + { + $option = JHTML::_('select.option', $item->product_id, $item->product_name . '(' . $item->product_number . ')'); + $options[] = $option; + } + } + + $options = array_merge(parent::getOptions(), $options); + $attr = ''; + + // Initialize some field attributes. + $attr .= $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : ''; + $attr .= $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : ''; + $attr .= $this->element['multiple'] ? ' multiple' : ''; + + // Initialize JavaScript field attributes. + $attr .= $this->element['onchange'] ? ' onchange="' . (string) $this->element['onchange'] . '"' : ''; + + // Process value + if (!empty($this->value) && $this->multiple && !is_array($this->value)) + { + $this->value = explode(',', $this->value); + } + + return JHTML::_('select.genericlist', $options, $this->name, trim($attr), 'value', 'text', $this->value, $this->id); + } +} diff --git a/libraries/redshop/form/fields/rpublished.php b/libraries/redshop/form/fields/rpublished.php new file mode 100644 index 00000000000..42b15a96191 --- /dev/null +++ b/libraries/redshop/form/fields/rpublished.php @@ -0,0 +1,77 @@ + 'JPUBLISHED', + 0 => 'JUNPUBLISHED', + 2 => 'JARCHIVED', + -2 => 'JTRASHED', + '*' => 'JALL' + ); + + /** + * Method to get the options to populate list + * + * @return array The field option objects. + * + * @since 1.0 + */ + protected function getOptions() + { + // Hash for caching + $hash = md5($this->element); + $type = strtolower($this->type); + + if (!isset(static::$options[$type][$hash]) && !empty($this->predefinedOptions)) + { + // B/C with statuses options + if (!isset($this->element['filter']) && isset($this->element['statuses'])) + { + $this->element['filter'] = (string) $this->element['statuses']; + } + + static::$options[$type][$hash] = parent::getOptions(); + } + + return static::$options[$type][$hash]; + } +} diff --git a/libraries/redshop/form/fields/rstate2code.php b/libraries/redshop/form/fields/rstate2code.php new file mode 100644 index 00000000000..2852268eb7d --- /dev/null +++ b/libraries/redshop/form/fields/rstate2code.php @@ -0,0 +1,60 @@ +input->get('country_code'); + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select($db->qn('s.state_2_code', 'value')) + ->select($db->qn('s.state_name', 'text')) + ->from($db->qn('#__redshop_state', 's')) + ->leftJoin($db->qn('#__redshop_country', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('s.country_id')) + ->where($db->qn('c.country_3_code') . ' = ' . $db->q($country3Code)); + + $db->setQuery($query); + + try + { + $options = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + throw new Exception($e->getMessage()); + } + + // Get other options inserted in the XML file + $parentOptions = parent::getOptions(); + + return array_merge($parentOptions, $options); + } +} \ No newline at end of file diff --git a/libraries/redshop/form/fields/sample.php b/libraries/redshop/form/fields/sample.php new file mode 100644 index 00000000000..988150db24d --- /dev/null +++ b/libraries/redshop/form/fields/sample.php @@ -0,0 +1,57 @@ +element['layoutFile'] ? (string) $this->element['layoutFile'] : 'sample'; + $html = RedshopLayoutHelper::render($layoutFile, null, JPATH_SITE . (string) $this->element['basePath']); + + // Style needed for J2.5 + // @todo: remove style in redSHOP 1.6 + return '
    ' . htmlentities($html) . '
    '; + } + + /** + * Method to get the field input markup. + * + * @return string The field input markup. + * + * @since 11.1 + */ + protected function getInput() + { + return ''; + } +} diff --git a/libraries/redshop/form/fields/searchtype.php b/libraries/redshop/form/fields/searchtype.php new file mode 100644 index 00000000000..2534792207a --- /dev/null +++ b/libraries/redshop/form/fields/searchtype.php @@ -0,0 +1,44 @@ +name, 'class="inputbox"', 'value', 'text', $this->value, $this->id); + } +} diff --git a/libraries/redshop/form/fields/shoppergrouplist.php b/libraries/redshop/form/fields/shoppergrouplist.php new file mode 100644 index 00000000000..efc3f768060 --- /dev/null +++ b/libraries/redshop/form/fields/shoppergrouplist.php @@ -0,0 +1,47 @@ +load('com_redshop', JPATH_ADMINISTRATOR); + +/** + * Renders a Stockroom List + * + * @since 1.5.0.1 + */ +class JFormFieldStockroomlist extends JFormFieldList +{ + /** + * Element name + * + * @access protected + * @var string + */ + protected $type = 'stockroomlist'; + + /** + * A static cache. + * + * @var array|null + */ + protected static $cache = null; + + /** + * Method to get the field options. + * + * @return array The field option objects. + */ + protected function getOptions() + { + $options = array(); + + if (!$this->multiple) + { + $options[] = JHTML::_('select.option', '', JText::_('COM_REDSHOP_SELECT_STOCKROOM'), 'value', 'text'); + } + + if (!self::$cache) + { + // Get the Stockroom. + self::$cache = RedshopHelperStockroom::getStockroom(); + } + + // Build the field options. + if (!empty(self::$cache)) + { + if ($this->multiple) + { + $options[] = JHtml::_('select.optgroup', JText::_('COM_REDSHOP_SELECT_STOCKROOM')); + } + + foreach (self::$cache as $item) + { + $options[] = JHtml::_('select.option', $item->stockroom_id, $item->stockroom_name, 'value', 'text'); + } + + if ($this->multiple) + { + $options[] = JHtml::_('select.optgroup', JText::_('COM_REDSHOP_SELECT_STOCKROOM')); + } + } + + // Merge any additional options in the XML definition. + $options = array_merge(parent::getOptions(), $options); + + return $options; + } +} diff --git a/libraries/redshop/form/fields/template.php b/libraries/redshop/form/fields/template.php new file mode 100644 index 00000000000..02cdf36d2e8 --- /dev/null +++ b/libraries/redshop/form/fields/template.php @@ -0,0 +1,55 @@ +getQuery(true) + ->select($db->qn('id')) + ->select($db->qn('name')) + ->from($db->qn('#__redshop_template')) + ->where($db->qn('published') . ' = 1') + ->where($db->qn('section') . ' = ' . $db->q('category')); + + $items = $db->setQuery($query)->loadObjectList(); + $options = array(); + + if (count($items) > 0) + { + foreach ($items as $item) + { + $option = JHTML::_('select.option', $item->id, $item->name); + $options[] = $option; + } + } + + return array_merge(parent::getOptions(), $options); + } +} diff --git a/libraries/redshop/form/fields/templatecompare.php b/libraries/redshop/form/fields/templatecompare.php new file mode 100644 index 00000000000..8946b06152b --- /dev/null +++ b/libraries/redshop/form/fields/templatecompare.php @@ -0,0 +1,68 @@ +getQuery(true) + ->select($db->qn('id')) + ->select($db->qn('name')) + ->from($db->qn('#__redshop_template')) + ->where($db->qn('published') . ' = 1') + ->where($db->qn('section') . ' = ' . $db->q('compare_product')); + + $items = $db->setQuery($query)->loadObjectList(); + $options = array(); + + if (count($items) > 0) + { + foreach ($items as $item) + { + $option = JHTML::_('select.option', $item->id, $item->name); + $options[] = $option; + } + } + + $options = array_merge(parent::getOptions(), $options); + + $attr = ''; + + // Initialize some field attributes. + $attr .= $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : ''; + $attr .= $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : ''; + $attr .= $this->element['multiple'] ? ' multiple' : ''; + + // Initialize JavaScript field attributes. + $attr .= $this->element['onchange'] ? ' onchange="' . (string) $this->element['onchange'] . '"' : ''; + + return JHTML::_('select.genericlist', $options, $this->name, trim($attr), 'value', 'text', $this->value, $this->id); + + } +} diff --git a/libraries/redshop/form/fields/timestamp.php b/libraries/redshop/form/fields/timestamp.php new file mode 100644 index 00000000000..b4cffb5d6b5 --- /dev/null +++ b/libraries/redshop/form/fields/timestamp.php @@ -0,0 +1,59 @@ +name . '" id="' . $this->id . '" value="' + . time() . '" />'; + } + + /** + * Method to attach a JForm object to the field. + * + * @param SimpleXMLElement $element The SimpleXMLElement object representing the tag for the form field object. + * @param mixed $value The form field value to validate. + * @param string $group The field name group control value. This acts as as an array container for the field. + * For example if the field has name="foo" and the group value is set to "bar" then the + * full field name would end up being "bar[foo]". + * + * @return boolean True on success. + */ + public function setup(SimpleXMLElement $element, $value, $group = null) + { + if ($return = parent::setup($element, $value, $group)) + { + $this->hidden = true; + } + + return $return; + } +} diff --git a/libraries/redshop/form/index.html b/libraries/redshop/form/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/form/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/form/rules/index.html b/libraries/redshop/form/rules/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/form/rules/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/helper/access.php b/libraries/redshop/helper/access.php new file mode 100644 index 00000000000..b41f3d8c73b --- /dev/null +++ b/libraries/redshop/helper/access.php @@ -0,0 +1,198 @@ +categories)) + { + return false; + } + + foreach ($product->categories as $cid) + { + $checkPermission = self::checkPortalCategoryPermission($cid); + + if (!$checkPermission) + { + return false; + } + } + + return true; + } + + /** + * Check permission for Categories shopper group can access or can't access + * + * @param int $cid Category id that need to be checked. + * + * @return boolean + * + * @since 2.0.3 + */ + public static function checkPortalCategoryPermission($cid = 0) + { + if (array_key_exists($cid, static::$portalCategories)) + { + return true; + } + + $shopperGroupId = RedshopHelperUser::getShopperGroup(JFactory::getUser()->id); + $shopperGroupData = Redshop\Helper\ShopperGroup::generateList($shopperGroupId); + + if (!empty($shopperGroupData)) + { + if (isset($shopperGroupData[0]) && $shopperGroupData[0]->shopper_group_categories) + { + $shopperCategories = explode(',', $shopperGroupData[0]->shopper_group_categories); + + if (array_search((int) $cid, $shopperCategories) !== false) + { + static::$portalCategories = $shopperCategories; + + return true; + } + } + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('shopper_group_id')) + ->from($db->qn('#__redshop_shopper_group')) + ->where('FIND_IN_SET(' . $db->quote($cid) . ', shopper_group_categories)') + ->where($db->qn('shopper_group_id') . ' = ' . (int) $shopperGroupId); + + if (!$db->setQuery($query)->loadResult()) + { + return false; + } + + return true; + } + + /** + * Method for check if user can view this object or not + * + * @param string $target Target name + * @param int $userId ID of user. If null, use current user. + * + * @return boolean True on success. False otherwise. + * + * @since 2.0.6 + */ + public static function canView($target = '', $userId = 0) + { + return self::canDo($target, 'view', $userId); + } + + /** + * Method for check if user can create this object or not + * + * @param string $target Target name + * @param int $userId ID of user. If null, use current user. + * + * @return boolean True on success. False otherwise. + * + * @since 2.0.6 + */ + public static function canCreate($target = '', $userId = 0) + { + return self::canDo($target, 'create', $userId); + } + + /** + * Method for check if user can edit this object or not + * + * @param string $target Target name + * @param int $userId ID of user. If null, use current user. + * + * @return boolean True on success. False otherwise. + * + * @since 2.0.6 + */ + public static function canEdit($target = '', $userId = 0) + { + return self::canDo($target, 'edit', $userId); + } + + /** + * Method for check if user can delete this object or not + * + * @param string $target Target name + * @param int $userId ID of user. If null, use current user. + * + * @return boolean True on success. False otherwise. + * + * @since 2.0.6 + */ + public static function canDelete($target = '', $userId = 0) + { + return self::canDo($target, 'delete', $userId); + } + + /** + * Method for check if user can have permission this object or not + * + * @param string $target Target name + * @param string $task Permission name + * @param int $userId ID of user. If null, use current user. + * + * @return boolean True on success. False otherwise. + * + * @since 2.0.6 + */ + public static function canDo($target = '', $task = '', $userId = 0) + { + if (!$userId) + { + $user = JFactory::getUser(); + } + else + { + $user = JFactory::getUser($userId); + } + + return $user->authorise($target . '.' . $task, 'com_redshop.backend'); + } +} diff --git a/libraries/redshop/helper/accessory.php b/libraries/redshop/helper/accessory.php new file mode 100644 index 00000000000..92ca2eebe34 --- /dev/null +++ b/libraries/redshop/helper/accessory.php @@ -0,0 +1,190 @@ +get('ACCESSORY_AS_PRODUCT_IN_CART_ENABLE')) + { + return $collection; + } + + // Check the accessory as product ids are not null + if (!empty($data[0])) + { + $collection->accessory_data = explode("@@", $data[0]); + $collection->acc_quantity_data = explode("@@", $data[1]); + $collection->acc_attribute_data = explode("@@", $data[2]); + $collection->acc_property_data = explode("@@", $data[3]); + $collection->acc_subproperty_data = explode("@@", $data[4]); + + $info = array(); + + foreach ($collection->accessory_data as $key => $accessoryId) + { + $accessoryDetail = self::getProductAccessories($accessoryId); + $object = $accessoryDetail[0]; + $object->quantity = $collection->acc_quantity_data[$key]; + $object->attributes = $collection->acc_attribute_data[$key]; + $object->properties = $collection->acc_property_data[$key]; + $object->subproperties = $collection->acc_subproperty_data[$key]; + + $info[$object->child_product_id] = $object; + } + + $collection->accessory = $info; + } + + return $collection; + } + + /** + * Method for get Product Accessories. + * + * @param string $accessoryId ID of accessory. + * @param string $productId ID of product. + * @param int $childProductId ID of child product. + * @param int $categoryId ID of category. + * + * @return array List of accessories. + * + * @since 2.0.3 + */ + public static function getProductAccessories($accessoryId = '', $productId = '', $childProductId = 0, $categoryId = 0) + { + $key = $accessoryId . '_' . $productId . '_' . $childProductId . '_' . $categoryId; + + if (!array_key_exists($key, static::$accessories)) + { + $db = JFactory::getDbo(); + + $orderBy = " ORDER BY a.child_product_id ASC"; + + if (Redshop::getConfig()->get('DEFAULT_ACCESSORY_ORDERING_METHOD')) + { + $orderBy = " ORDER BY " . Redshop::getConfig()->get('DEFAULT_ACCESSORY_ORDERING_METHOD'); + } + + $and = ""; + $groupBy = ""; + + if ($accessoryId != 0) + { + // Sanitize ids + $accessoryId = explode(',', $accessoryId); + $accessoryId = ArrayHelper::toInteger($accessoryId); + + $and .= " AND a.accessory_id IN (" . implode(',', $accessoryId) . ")"; + } + + if ($productId != 0) + { + // Sanitize ids + $productId = explode(',', $productId); + $productId = ArrayHelper::toInteger($productId); + + $and .= " AND a.product_id IN (" . implode(',', $productId) . ")"; + } + + if ($childProductId != 0) + { + $and .= " AND a.child_product_id = " . (int) $childProductId; + } + + if ($categoryId != 0) + { + $and .= " AND a.category_id = " . (int) $categoryId; + $groupBy = " GROUP BY a.child_product_id"; + } + + $switchQuery = ", CASE a.oprand " + . "WHEN '+' THEN IF ( (p.product_on_sale>0 && ((p.discount_enddate='' AND p.discount_stratdate='') OR ( p.discount_enddate>='" + . time() . "' AND p.discount_stratdate<='" . time() . "'))), p.discount_price, p.product_price ) + accessory_price " + . "WHEN '-' THEN IF ( (p.product_on_sale>0 && ((p.discount_enddate='' AND p.discount_stratdate='') OR ( p.discount_enddate>='" + . time() . "' AND p.discount_stratdate<='" . time() . "'))), p.discount_price, p.product_price ) - accessory_price " + . "WHEN '=' THEN accessory_price " + . "END AS newaccessory_price "; + + $priceQuery = "IF ( (p.product_on_sale>0 && ((p.discount_enddate='' AND p.discount_stratdate='') OR ( p.discount_enddate>='" + . time() . "' AND p.discount_stratdate<='" . time() . "'))), p.discount_price, p.product_price ) AS accessory_main_price "; + + $query = "SELECT a.*,p.product_number, p.product_name, " . $priceQuery + . ", p.product_s_desc, p.product_full_image, p.product_on_sale " + . $switchQuery + . "FROM " . $db->qn('#__redshop_product_accessory') . " AS a " + . "LEFT JOIN " . $db->qn('#__redshop_product') . " AS p ON p.product_id = a.child_product_id " + . "WHERE p.published = 1 " + . $and . $groupBy + . $orderBy; + + static::$accessories[$key] = $db->setQuery($query)->loadObjectList(); + } + + return static::$accessories[$key]; + } + + /** + * Check if Accessory is existed + * + * @param integer $productId Product ID + * @param integer $accessoryId Accessory ID + * + * @return integer + * + * @since 2.0.0.3 + */ + public static function checkAccessoryExists($productId, $accessoryId) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn(array('pa.accessory_id', 'pa.product_id'))) + ->from($db->qn('#__redshop_product_accessory', 'pa')) + ->where($db->qn('pa.product_id') . ' = ' . (int) $productId) + ->where($db->qn('pa.child_product_id') . ' = ' . (int) $accessoryId); + + $db->setQuery($query); + $result = $db->loadObjectList(); + + if (count($result) > 0) + { + $return = $result[0]->accessory_id; + } + else + { + $return = 0; + } + + return $return; + } +} diff --git a/libraries/redshop/helper/ajax.php b/libraries/redshop/helper/ajax.php new file mode 100644 index 00000000000..89eaa082cd8 --- /dev/null +++ b/libraries/redshop/helper/ajax.php @@ -0,0 +1,48 @@ + $isApplyAttributeVAT + ); + + $session->set('chkvat', $isApplyAttributeVATTags); + + if ($displayIndCart && Redshop::getConfig()->getInt('INDIVIDUAL_ADD_TO_CART_ENABLE') === 1) + { + $attributeTemplate = empty($attributeTemplate) ? + \Redshop\Template\Helper::getAttribute($templateContent, false) : $attributeTemplate; + + if (!empty($attributeTemplate)) + { + $templateContent = str_replace("{attribute_template:$attributeTemplate->name}", '', $templateContent); + } + + return self::replaceAttributeWithCartData( + $productId, $accessoryId, $relatedProductId, $attributes, $templateContent, $attributeTemplate, $isChild, $onlySelected + ); + } + + $attributeTemplate = empty($attributeTemplate) ? \Redshop\Template\Helper::getAttribute($templateContent, false) : $attributeTemplate; + + if (empty($attributeTemplate) || $attributeTemplate == new stdClass) + { + return $templateContent; + } + + $templateContent = str_replace("{attributewithcart_template:$attributeTemplate->name}", "", $templateContent); + + if ($isChild || count($attributes) <= 0) + { + $templateContent = str_replace("{attribute_template:$attributeTemplate->name}", "", $templateContent); + + return $templateContent; + } + + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.thumbscroller.min.js', false, true); + $layout = JFactory::getApplication()->input->getCmd('layout', ''); + + $preprefix = ""; + $isAjax = 0; + + if ($layout == "viewajaxdetail") + { + $preprefix = "ajax_"; + $isAjax = 1; + } + + if ($accessoryId != 0) + { + $prefix = $preprefix . "acc_"; + } + elseif ($relatedProductId != 0) + { + $prefix = $preprefix . "rel_"; + } + else + { + $prefix = $preprefix . "prd_"; + } + + if ($relatedProductId != 0) + { + $productId = $relatedProductId; + } + + $selectProperty = array(); + $selectSubproperty = array(); + + if (count($selectedAttributes) > 0) + { + $selectProperty = $selectedAttributes[0]; + $selectSubproperty = $selectedAttributes[1]; + } + + $attribute_template_data = $attributeTemplate->template_desc; + + $product = RedshopHelperProduct::getProductById($productId); + $producttemplate = RedshopHelperTemplate::getTemplate("product", $product->product_template); + + if (strpos($producttemplate[0]->template_desc, "{more_images_3}") !== false) + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_3'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_3'); + } + elseif (strpos($producttemplate[0]->template_desc, "{more_images_2}") !== false) + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_2'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_2'); + } + elseif (strpos($producttemplate[0]->template_desc, "{more_images_1}") !== false) + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); + } + else + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); + } + + JText::script('COM_REDSHOP_ATTRIBUTE_IS_REQUIRED'); + + if (count($attributes) > 0) + { + $attribute_table = ""; + + // Import plugin group + JPluginHelper::importPlugin('redshop_product'); + + for ($a = 0, $an = count($attributes); $a < $an; $a++) + { + $subdisplay = false; + + $property_all = empty($attributes[$a]->properties) ? + RedshopHelperProduct_Attribute::getAttributeProperties(0, $attributes[$a]->attribute_id) : + $attributes[$a]->properties; + $property_all = array_values($property_all); + + if (!Redshop::getConfig()->get('DISPLAY_OUT_OF_STOCK_ATTRIBUTE_DATA') && Redshop::getConfig()->get('USE_STOCKROOM')) + { + $property = \Redshop\Helper\Stockroom::getAttributePropertyWithStock($property_all); + } + else + { + $property = $property_all; + } + + $propertyIds = array_map( + function ($object) { + return $object->value; + }, + $property + ); + + $propertyStockrooms = RedshopHelperStockroom::getMultiSectionsStock($propertyIds, 'property'); + $propertyPreOrderStockrooms = RedshopHelperStockroom::getMultiSectionsPreOrderStock($propertyIds, 'property'); + + if ($attributes[$a]->text != "" && count($property) > 0) + { + $attribute_table .= $attribute_template_data; + + $commonid = $prefix . $productId . '_' . $accessoryId . '_' . $attributes[$a]->value; + $hiddenattid = 'attribute_id_' . $prefix . $productId . '_' . $accessoryId; + $propertyid = 'property_id_' . $commonid; + + $imgAdded = 0; + $selectedProperty = 0; + $property_woscrollerdiv = ""; + $preSelected = true; + + if (strpos($attribute_table, "{property_image_without_scroller}") !== false) + { + $attribute_table = str_replace("{property_image_scroller}", "", $attribute_table); + $property_woscrollerdiv = "
    "; + } + + for ($i = 0, $in = count($property); $i < $in; $i++) + { + if (count($selectProperty) > 0) + { + if (in_array($property[$i]->value, $selectProperty)) + { + $selectedProperty = $property[$i]->value; + } + } + else + { + if ($property[$i]->setdefault_selected) + { + $selectedProperty = $property[$i]->value; + } + } + + if (isset($property[$i]->sub_properties)) + { + $subproperty_all = $property[$i]->sub_properties; + } + else + { + $subproperty_all = RedshopHelperProduct_Attribute::getAttributeSubProperties(0, $property[$i]->value); + } + + // Filter Out of stock data + if (!Redshop::getConfig()->get('DISPLAY_OUT_OF_STOCK_ATTRIBUTE_DATA') && Redshop::getConfig()->get('USE_STOCKROOM')) + { + $subproperty = \Redshop\Helper\Stockroom::getAttributeSubPropertyWithStock($subproperty_all); + } + else + { + $subproperty = $subproperty_all; + } + + $subpropertystock = 0; + $preorder_subpropertystock = 0; + + $subPropertyIds = array_map( + function ($item) { + return $item->value; + }, + $subproperty + ); + $subPropertyStockrooms = RedshopHelperStockroom::getMultiSectionsStock($subPropertyIds, 'subproperty'); + $subPropertyPreOrderStockrooms = RedshopHelperStockroom::getMultiSectionsPreOrderStock($subPropertyIds, 'subproperty'); + + foreach ($subproperty as $sub) + { + $subpropertystock += isset($subPropertyStockrooms[$sub->value]) ? (int) $subPropertyStockrooms[$sub->value] : 0; + $preorder_subpropertystock += isset($subPropertyPreOrderStockrooms[$sub->value]) ? + (int) $subPropertyPreOrderStockrooms[$sub->value] : 0; + } + + $property_stock = isset($propertyStockrooms[$property[$i]->value]) ? (int) $propertyStockrooms[$property[$i]->value] : 0; + $property_stock += $subpropertystock; + + // Preorder stock data + $preorder_property_stock = isset($propertyPreOrderStockrooms[$property[$i]->value]) ? + (int) $propertyPreOrderStockrooms[$property[$i]->value] : 0; + $preorder_property_stock += $preorder_subpropertystock; + + if ($property[$i]->property_image) + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product_attributes/" . $property[$i]->property_image)) + { + $borderstyle = ($selectedProperty == $property[$i]->value) ? " 1px solid " : ""; + + $thumbUrl = RedshopHelperMedia::getImagePath( + $property[$i]->property_image, + '', + 'thumb', + 'product_attributes', + $mpw_thumb, + $mph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $style = null; + + if ($property[$i]->setdefault_selected && $preSelected) + { + $style = ' style="border: 1px solid;"'; + $preSelected = false; + } + + $property_woscrollerdiv .= "
    "; + $imgAdded++; + } + } + + $attributes_property_vat_show = 0; + $attributes_property_withoutvat = 0; + $attributes_property_oldprice = 0; + + if ($property [$i]->property_price > 0) + { + $attributes_property_oldprice = $property [$i]->property_price; + + $pricelist = $productHelper->getPropertyPrice($property[$i]->value, 1, 'property'); + + if (!empty($pricelist)) + { + $property[$i]->property_price = $pricelist->product_price; + } + + $attributes_property_withoutvat = $property [$i]->property_price; + + /* + * changes for {without_vat} tag output parsing + * only for display purpose + */ + $attributes_property_vat_show = 0; + $attributes_property_oldprice_vat = 0; + + if (!empty($isApplyAttributeVAT)) + { + if ($property [$i]->oprand != '*' && $property [$i]->oprand != '/') + { + $attributes_property_vat_show = $productHelper->getProducttax($productId, $property [$i]->property_price, $userId); + $attributes_property_oldprice_vat = $productHelper->getProducttax($productId, $attributes_property_oldprice, $userId); + } + } + + $attributes_property_vat_show += $property [$i]->property_price; + $attributes_property_oldprice += $attributes_property_oldprice_vat; + + /* + * get product vat to include + */ + $attributes_property_vat = $productHelper->getProducttax($productId, $property [$i]->property_price, $userId); + $property [$i]->property_price += $attributes_property_vat; + + if (Redshop::getConfig()->get('SHOW_PRICE') + && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') + || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) + && (!$attributes[$a]->hide_attribute_price)) + { + $property[$i]->text = urldecode($property[$i]->property_name) . " (" . $property [$i]->oprand + . strip_tags($productHelper->getProductFormattedPrice($attributes_property_vat_show)) . ")"; + } + else + { + $property[$i]->text = urldecode($property[$i]->property_name); + } + } + else + { + $property[$i]->text = urldecode($property[$i]->property_name); + } + + // Add stock data into property data. + $property[$i]->stock = $property_stock; + + // Add pre-order stock data into property data. + $property[$i]->preorder_stock = $preorder_property_stock; + + + $attribute_table .= ''; + $attribute_table .= ''; + $attribute_table .= ''; + $attribute_table .= ''; + $attribute_table .= ''; + $attribute_table .= ''; + } + + if (!$mph_thumb) + { + $mph_thumb = 50; + } + + if (!$mpw_thumb) + { + $mpw_thumb = 50; + } + + $atth = 50; + $attw = 50; + + if (Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_HEIGHT')) + { + $atth = Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_HEIGHT'); + } + + if (Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_WIDTH')) + { + $attw = Redshop::getConfig()->get('ATTRIBUTE_SCROLLER_THUMB_WIDTH'); + } + + if (strpos($attribute_table, "{property_image_without_scroller}") !== false) + { + $property_woscrollerdiv .= "
    "; + } + + // Run event for prepare product properties. + RedshopHelperUtility::getDispatcher()->trigger('onPrepareProductProperties', array($product, &$property)); + + $properties = array_merge( + array(JHtml::_('select.option', 0, JText::_('COM_REDSHOP_SELECT') . ' ' . urldecode($attributes[$a]->text))), + $property + ); + $defaultPropertyId = array(); + $attDisplayType = $attributes[$a]->display_type; + + // Init listing html-attributes + $chkListAttributes = array( + 'attribute_name' => urldecode($attributes[$a]->attribute_name) + ); + + // Only add required html-attibute if needed. + if ($attributes[$a]->attribute_required) + { + $chkListAttributes['required'] = 'true'; + } + + // Prepare Javascript OnChange or OnClick function + $changePropertyDropdown = "changePropertyDropdown('" . $productId . "','" . $accessoryId . "','" + . $relatedProductId . "', '" . $attributes[$a]->value . "',this.value, '" . $mpw_thumb . "', '" . $mph_thumb . "');"; + + // Radio or Checkbox + if ($attDisplayType == 'radio') + { + unset($properties[0]); + + $attributeListType = ($attributes[$a]->allow_multiple_selection) ? 'redshopselect.checklist' : 'redshopselect.radiolist'; + + $chkListAttributes['cssClassSuffix'] = ' no-group'; + $chkListAttributes['onClick'] = "javascript:" . $changePropertyDropdown; + } + // Dropdown list + else + { + $attributeListType = 'select.genericlist'; + $scrollerFunction = ''; + + if ($imgAdded > 0 && strpos($attribute_table, "{property_image_scroller}") !== false) + { + $scrollerFunction = "isFlowers" . $commonid . ".scrollImageCenter(this.selectedIndex-1);"; + } + + $chkListAttributes['onchange'] = "javascript:" . $scrollerFunction . $changePropertyDropdown; + } + + if ($selectedProperty) + { + $subdisplay = true; + $defaultPropertyId[] = $selectedProperty; + } + + $lists['property_id'] = JHTML::_( + $attributeListType, + $properties, + $propertyid . '[]', + $chkListAttributes, + 'value', + 'text', + $selectedProperty, + $propertyid + ); + + $attribute_table .= ""; + + if ($attributes [$a]->attribute_required > 0) + { + $pos = Redshop::getConfig()->get('ASTERISK_POSITION') > 0 ? urldecode($attributes [$a]->text) . " * " : "* " . urldecode($attributes[$a]->text); + $attr_title = $pos; + } + else + { + $attr_title = urldecode($attributes[$a]->text); + } + + if (strpos($attribute_table, '{attribute_tooltip}') !== false) + { + if (!empty($attributes[$a]->attribute_description)) + { + $tooltip = JHTML::tooltip($attributes[$a]->attribute_description, $attributes[$a]->attribute_description, 'tooltip.png', '', ''); + $attribute_table = str_replace("{attribute_tooltip}", $tooltip, $attribute_table); + } + else + { + $attribute_table = str_replace("{attribute_tooltip}", "", $attribute_table); + } + } + + $attribute_table = str_replace("{attribute_title}", $attr_title, $attribute_table); + $attribute_table = str_replace("{property_dropdown}", $lists ['property_id'], $attribute_table); + + $propertyScroller = RedshopLayoutHelper::render( + 'product.property_scroller', + array( + 'attribute' => $attributes[$a], + 'properties' => $property, + 'commonId' => $commonid, + 'productId' => $productId, + 'propertyId' => $propertyid, + 'accessoryId' => $accessoryId, + 'relatedProductId' => $relatedProductId, + 'selectedProperty' => $selectedProperty, + 'width' => $mpw_thumb, + 'height' => $mph_thumb + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + + // Changes for attribue Image Scroll + if ($imgAdded == 0 || $isAjax == 1) + { + $propertyScroller = ""; + } + + $attribute_table = str_replace("{property_image_scroller}", $propertyScroller, $attribute_table); + $attribute_table = str_replace("{property_image_without_scroller}", $property_woscrollerdiv, $attribute_table); + + if ($subdisplay) + { + $style = ' style="display:block" '; + } + else + { + $style = ' style="display:none" '; + } + + $subpropertydata = ""; + $subpropertystart = $attribute_table; + $subpropertyend = ""; + $subattdata = explode("{subproperty_start}", $attribute_table); + + if (count($subattdata) > 0) + { + $subpropertystart = $subattdata[0]; + } + + $replaceMiddle = ''; + + if (count($subattdata) > 1) + { + $subattdata = explode("{subproperty_end}", $subattdata[1]); + + if (count($subattdata) > 0) + { + $subpropertydata = $subattdata[0]; + $replaceMiddle = "{replace_subprodata}"; + } + + if (count($subattdata) > 1) + { + $subpropertyend = $subattdata[1]; + } + } + + $subproperty_start = '
    '; + + $displaySubproperty = ""; + + foreach ($defaultPropertyId as $aDefaultPropertyId) + { + $displaySubproperty .= $productHelper->replaceSubPropertyData( + $productId, $accessoryId, $relatedProductId, $attributes[$a]->attribute_id, $aDefaultPropertyId, $subpropertydata, + $layout, $selectSubproperty + ); + } + + if ($subdisplay) + { + $attribute_table = $subpropertystart . "{subproperty_start}" . $replaceMiddle . "{subproperty_end}" . $subpropertyend; + $attribute_table = str_replace($replaceMiddle, $displaySubproperty, $attribute_table); + } + + $attribute_table .= ""; + $attribute_table = str_replace("{subproperty_start}", $subproperty_start, $attribute_table); + $attribute_table = str_replace("{subproperty_end}", "
    ", $attribute_table); + } + } + + $attribute_table .= "
    "; + + $templateContent = str_replace("{attribute_template:$attributeTemplate->name}", $attribute_table, $templateContent); + } + else + { + $templateContent = str_replace("{attribute_template:$attributeTemplate->name}", "", $templateContent); + } + + return $templateContent; + } + + /** + * Method for replace attribute data with allow add to cart in template. + * + * @param int $productId Product ID + * @param int $accessoryId Accessory ID + * @param int $relatedProductId Related product ID + * @param array $attributes List of attribute data. + * @param string $templateContent HTML content of template. + * @param object $attributeTemplate List of attribute templates. + * @param bool $isChild Is child? + * @param bool $onlySelected True for just render selected / pre-selected attribute. False as normal. + * + * @return string HTML content with replaced data. + * + * @since 2.0.3 + */ + public static function replaceAttributeWithCartData($productId = 0, $accessoryId = 0, $relatedProductId = 0, $attributes = array(), + $templateContent = '', $attributeTemplate = null, $isChild = false, $onlySelected = false) + { + $user_id = 0; + $productHelper = productHelper::getInstance(); + + if (empty($attributeTemplate)) + { + return $templateContent; + } + + if ($isChild || !count($attributes)) + { + return str_replace("{attributewithcart_template:$attributeTemplate->name}", "", $templateContent); + } + + $layout = JFactory::getApplication()->input->getCmd('layout', ''); + $prePrefix = ""; + $isAjax = false; + + if ($layout == 'viewajaxdetail') + { + $prePrefix = "ajax_"; + $isAjax = true; + } + + if ($accessoryId != 0) + { + $prefix = $prePrefix . "acc_"; + } + elseif ($relatedProductId != 0) + { + $prefix = $prePrefix . "rel_"; + } + else + { + $prefix = $prePrefix . "prd_"; + } + + if ($relatedProductId != 0) + { + $productId = $relatedProductId; + } + + $product = RedshopHelperProduct::getProductById($productId); + $productTemplate = RedshopHelperTemplate::getTemplate("product", $product->product_template); + $productTemplate = $productTemplate[0]; + + if (strpos($productTemplate->template_desc, "{more_images_3}") !== false) + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_3'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_3'); + } + elseif (strpos($productTemplate->template_desc, "{more_images_2}") !== false) + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_2'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_2'); + } + elseif (strpos($productTemplate->template_desc, "{more_images_1}") !== false) + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); + } + else + { + $mph_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $mpw_thumb = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); + } + + $cartTemplate = array(); + $attributeTable = ""; + + foreach ($attributes as $attribute) + { + $attributeTable .= $attributeTemplate->template_desc; + + $attributeTable = str_replace("{property_image_lbl}", JText::_('COM_REDSHOP_PROPERTY_IMAGE_LBL'), $attributeTable); + $attributeTable = str_replace("{virtual_number_lbl}", JText::_('COM_REDSHOP_VIRTUAL_NUMBER_LBL'), $attributeTable); + $attributeTable = str_replace("{property_name_lbl}", JText::_('COM_REDSHOP_PROPERTY_NAME_LBL'), $attributeTable); + $attributeTable = str_replace("{property_price_lbl}", JText::_('COM_REDSHOP_PROPERTY_PRICE_LBL'), $attributeTable); + $attributeTable = str_replace("{property_stock_lbl}", JText::_('COM_REDSHOP_PROPERTY_STOCK_LBL'), $attributeTable); + $attributeTable = str_replace("{add_to_cart_lbl}", JText::_('COM_REDSHOP_ADD_TO_CART_LBL'), $attributeTable); + + if (empty($attribute->properties)) + { + $properties = RedshopHelperProduct_Attribute::getAttributeProperties(0, $attribute->attribute_id); + } + else + { + $properties = $attribute->properties; + } + + if (empty($attribute->text) || empty($properties) + || strpos($attributeTable, "{property_start}") === false || strpos($attributeTable, "{property_start}") === false) + { + continue; + } + + $start = explode("{property_start}", $attributeTable); + $end = explode("{property_end}", $start[1]); + $propertyTemplate = $end[0]; + + $commonId = $prefix . $productId . '_' . $accessoryId . '_' . $attribute->value; + $propertyId = 'property_id_' . $commonId; + + $propertyData = ""; + + foreach ($properties as $property) + { + // Skip if "onlySelected" is true and this property not set as selected. + if ($onlySelected && !$property->setdefault_selected) + { + continue; + } + + $propertyData .= $propertyTemplate; + + $priceWithVat = 0; + $priceWithoutVat = 0; + $propertyStock = RedshopHelperStockroom::getStockAmountWithReserve($property->value, "property"); + $preOrderPropertyStock = RedshopHelperStockroom::getPreorderStockAmountwithReserve($property->value, "property"); + + $propertyData = str_replace("{property_name}", urldecode($property->property_name), $propertyData); + $propertyData = str_replace("{virtual_number}", $property->property_number, $propertyData); + + // Replace {property_stock} + if (strpos($propertyData, '{property_stock}') !== false) + { + $displayStock = ($propertyStock) ? JText::_('COM_REDSHOP_IN_STOCK') : JText::_('COM_REDSHOP_NOT_IN_STOCK'); + $propertyData = str_replace("{property_stock}", $displayStock, $propertyData); + } + + // Replace {property_image} + if (strpos($propertyData, '{property_image}') !== false) + { + $propertyImage = ""; + + if ($property->property_image + && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product_attributes/" . $property->property_image)) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $property->property_image, + '', + 'thumb', + 'product_attributes', + $mpw_thumb, + $mph_thumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $propertyImage = ""; + } + + $propertyData = str_replace("{property_image}", $propertyImage, $propertyData); + } + + if (strpos($propertyData, '{property_oprand}') !== false || strpos($propertyData, '{property_price}') !== false) + { + $price = ''; + $opRand = ''; + + if ($property->property_price > 0) + { + $prices = $productHelper->getPropertyPrice($property->value, 1, 'property'); + + if (count($prices) > 0) + { + $property->property_price = $prices->product_price; + } + + $priceWithoutVat = $property->property_price; + + if (\Redshop\Template\Helper::isApplyAttributeVat($propertyData)) + { + $priceWithVat = $productHelper->getProducttax($productId, $property->property_price, $user_id); + } + + $priceWithVat += $property->property_price; + + if (Redshop::getConfig()->get('SHOW_PRICE') + && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') + || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) + && !$attribute->hide_attribute_price) + { + $opRand = $property->oprand; + $price = $productHelper->getProductFormattedPrice($priceWithVat); + } + } + + $propertyData = str_replace("{property_oprand}", $opRand, $propertyData); + $propertyData = str_replace("{property_price}", $price, $propertyData); + } + + if (empty($cartTemplate)) + { + $cartTemplate = \Redshop\Template\Helper::getAddToCart($propertyData); + } + + if (null !== $cartTemplate) + { + $propertyData = Redshop\Product\Property::replaceAddToCart( + $productId, $property->value, 0, $propertyId, $propertyStock, + $propertyData, $cartTemplate, $templateContent + ); + } + + $propertyData .= ''; + $propertyData .= ''; + $propertyData .= ''; + + $propertyData .= ''; + $propertyData .= ''; + + $formId = 'addtocart_' . $propertyId . '_' . $property->value; + + $propertyData = RedshopHelperWishlist::replaceWishlistTag($productId, $propertyData, $formId); + } + + $attributeTitle = urldecode($attribute->text); + + if ($attribute->attribute_required > 0) + { + $pos = Redshop::getConfig()->get('ASTERISK_POSITION') > 0 ? urldecode($attribute->text) + . " * " : "* " + . urldecode($attribute->text); + $attributeTitle = $pos; + } + + $attributeTable = str_replace("{attribute_title}", $attributeTitle, $attributeTable); + $attributeTable = str_replace("{property_start}", "", $attributeTable); + $attributeTable = str_replace("{property_end}", "", $attributeTable); + $attributeTable = str_replace($propertyTemplate, $propertyData, $attributeTable); + } + + if ($attributeTable != "") + { + $cart_template = \Redshop\Template\Helper::getAddToCart($templateContent); + + if (null !== $cart_template) + { + $templateContent = str_replace("{form_addtocart:$cart_template->name}", "", $templateContent); + } + } + + return str_replace("{attributewithcart_template:$attributeTemplate->name}", $attributeTable, $templateContent); + } +} diff --git a/libraries/redshop/helper/billing.php b/libraries/redshop/helper/billing.php new file mode 100644 index 00000000000..faa9343199d --- /dev/null +++ b/libraries/redshop/helper/billing.php @@ -0,0 +1,569 @@ +get('OPTIONAL_SHIPPING_ADDRESS')) + { + $billingIsShipping = "checked='checked'"; + } + + $billingTemplate = RedshopHelperTemplate::getTemplate("billing_template"); + + if (!empty($billingTemplate) && !empty($billingTemplate[0]->template_desc) + && strpos($billingTemplate[0]->template_desc, "private_billing_template:") !== false + && strpos($billingTemplate[0]->template_desc, "company_billing_template:") !== false) + { + $templateHtml = $billingTemplate[0]->template_desc; + } + else + { + $templateHtml = self::getDefaultTemplate(); + } + + /* + * Billing template for private customer + */ + $privateTemplates = RedshopHelperTemplate::getTemplate("private_billing_template"); + + if (empty($privateTemplates)) + { + $tmpTemplate = new stdClass; + $tmpTemplate->name = 'private_billing_template'; + $tmpTemplate->id = 0; + + $privateTemplates = array($tmpTemplate); + } + + foreach ($privateTemplates as $privateTemplate) + { + if (strpos($templateHtml, "{private_billing_template:" . $privateTemplate->name . "}") === false) + { + continue; + } + + $html = ''; + + if ($isCompany != 1) + { + $html = !empty($privateTemplate->template_desc) ? + $privateTemplate->template_desc : self::getDefaultPrivateTemplate(); + + $html = self::replacePrivateCustomer($html, $post, $lists); + } + + $html = '
    ' . $html . '
    ' + . ''; + + $templateHtml = str_replace( + '{private_billing_template:' . $privateTemplate->name . '}', + $html, + $templateHtml + ); + + break; + } + + /* + * Billing template for company customer + */ + $companyTemplates = RedshopHelperTemplate::getTemplate("company_billing_template"); + + if (empty($companyTemplates)) + { + $tmpTemplate = new stdClass; + $tmpTemplate->name = 'company_billing_template'; + $tmpTemplate->id = 0; + + $companyTemplates = array($tmpTemplate); + } + + foreach ($companyTemplates as $companyTemplate) + { + if (strpos($templateHtml, "{company_billing_template:" . $companyTemplate->name . "}") === false) + { + continue; + } + + $html = ''; + + if ($isCompany == 1) + { + $html = !empty($companyTemplate->template_desc) ? + $companyTemplate->template_desc : self::getDefaultCompanyTemplate(); + + $html = self::replaceCompanyCustomer($html, $post, $lists); + } + + $html = '
    ' . $html . '
    ' + . ''; + + $templateHtml = str_replace( + '{company_billing_template:' . $companyTemplate->name . '}', + $html, + $templateHtml + ); + + break; + } + + $templateHtml = str_replace("{required_lbl}", JText::_('COM_REDSHOP_REQUIRED'), $templateHtml); + + if ($showShipping && Redshop::getConfig()->get('SHIPPING_METHOD_ENABLE')) + { + $templateHtml = str_replace( + '{shipping_same_as_billing_lbl}', + JText::_('COM_REDSHOP_SHIPPING_SAME_AS_BILLING'), + $templateHtml + ); + + $html = ''; + + $templateHtml = str_replace('{shipping_same_as_billing}', $html, $templateHtml); + } + else + { + $templateHtml = str_replace("{shipping_same_as_billing_lbl}", '', $templateHtml); + $templateHtml = str_replace("{shipping_same_as_billing}", '', $templateHtml); + } + + if (strpos($templateHtml, "{account_creation_start}") !== false && strpos($templateHtml, "{account_creation_end}") !== false) + { + $createAccountHtmlStart = explode('{account_creation_start}', $templateHtml); + $createAccountHtmlEnd = explode('{account_creation_end}', $createAccountHtmlStart [1]); + $createAccountHtml = ''; + $checkboxStyle = ''; + + if (Redshop::getConfig()->get('REGISTER_METHOD') != 1 && Redshop::getConfig()->get('REGISTER_METHOD') != 3) + { + $createAccountHtml = $createAccountHtmlEnd[0]; + + if (Redshop::getConfig()->get('REGISTER_METHOD') == 2) + { + $checkboxStyle = $createAccount == 1 ? 'style="display:block"' : 'style="display:none"'; + } + else + { + $checkboxStyle = 'style="display:block"'; + } + + $createAccountHtml = str_replace("{username_lbl}", JText::_('COM_REDSHOP_USERNAME_REGISTER'), $createAccountHtml); + + $html = ''; + $createAccountHtml = str_replace("{username}", $html, $createAccountHtml); + + $createAccountHtml = str_replace("{password_lbl}", JText::_('COM_REDSHOP_PASSWORD_REGISTER'), $createAccountHtml); + $createAccountHtml = str_replace( + "{password}", + '', + $createAccountHtml + ); + + $createAccountHtml = str_replace("{confirm_password_lbl}", JText::_('COM_REDSHOP_CONFIRM_PASSWORD'), $createAccountHtml); + + $createAccountHtml = str_replace("{confirm_password}", + '', + $createAccountHtml + ); + + $newsletterSignupLabel = ""; + $newsletterSignupCheckHtml = ""; + + if ($showNewsletter && Redshop::getConfig()->get('NEWSLETTER_ENABLE')) + { + $newsletterSignupLabel = JText::_('COM_REDSHOP_SIGN_UP_FOR_NEWSLETTER'); + $newsletterSignupCheckHtml = ''; + } + + $createAccountHtml = str_replace("{newsletter_signup_lbl}", $newsletterSignupLabel, $createAccountHtml); + $createAccountHtml = str_replace("{newsletter_signup_chk}", $newsletterSignupCheckHtml, $createAccountHtml); + } + + if (!empty(\JFactory::getUser()->id)) + { + $templateHtml = $createAccountHtmlStart[0] . $createAccountHtmlEnd[1]; + } + else + { + $templateHtml = $createAccountHtmlStart[0] . '
    ' . $createAccountHtml . '
    ' . + $createAccountHtmlEnd[1]; + } + } + + $templateHtml .= ''; + + JPluginHelper::importPlugin('redshop_checkout'); + RedshopHelperUtility::getDispatcher()->trigger('onRenderBillingCheckout', array(&$templateHtml)); + + return $templateHtml; + } + + /** + * Method for replace billing common fields + * + * @param string $templateHtml Html content + * @param array $data Data + * @param array $lists Array select + * @param string $prefix Prefix for DOM ID + * + * @return string + * + * @since 2.0.7 + */ + public static function replaceCommonFields($templateHtml, $data, $lists, $prefix = '') + { + $data = is_null($data) || !is_array($data) ? array() : $data; + + $countries = RedshopHelperWorld::getCountryList($data); + $data['country_code'] = $countries['country_code']; + $lists['country_code'] = $countries['country_dropdown']; + $states = RedshopHelperWorld::getStateList($data); + $lists['state_code'] = $states['state_dropdown']; + $countryStyle = count($countries['countrylist']) == 1 && count($states['statelist']) == 0 ? 'display:none;' : ''; + $stateStyle = ($states['is_states'] <= 0) ? 'display:none;' : ''; + + $readOnly = ""; + + $templateHtml = str_replace("{email_lbl}", JText::_('COM_REDSHOP_EMAIL'), $templateHtml); + $templateHtml = str_replace( + "{email}", + '', + $templateHtml + ); + + if (strstr($templateHtml, "{retype_email_start}") && strstr($templateHtml, "{retype_email_end}")) + { + $htmlStart = explode('{retype_email_start}', $templateHtml); + $htmlEnd = explode('{retype_email_end}', $htmlStart[1]); + $htmlContent = ''; + + if (Redshop::getConfig()->get('SHOW_EMAIL_VERIFICATION')) + { + $htmlContent = $htmlEnd[0]; + $htmlContent = str_replace("{retype_email_lbl}", JText::_('COM_REDSHOP_RETYPE_CUSTOMER_EMAIL'), $htmlContent); + $htmlContent = str_replace( + '{retype_email}', + '', + $htmlContent + ); + } + + $templateHtml = $htmlStart[0] . $htmlContent . $htmlEnd[1]; + } + + $templateHtml = str_replace("{company_name_lbl}", JText::_('COM_REDSHOP_COMPANY_NAME'), $templateHtml); + + $templateHtml = str_replace( + "{company_name}", + '', + $templateHtml + ); + + $templateHtml = str_replace("{firstname_lbl}", JText::_('COM_REDSHOP_FIRSTNAME'), $templateHtml); + + $templateHtml = str_replace( + "{firstname}", + '', + $templateHtml + ); + + $templateHtml = str_replace("{lastname_lbl}", JText::_('COM_REDSHOP_LASTNAME'), $templateHtml); + + $templateHtml = str_replace( + "{lastname}", + '', + $templateHtml + ); + + $templateHtml = str_replace("{address_lbl}", JText::_('COM_REDSHOP_ADDRESS'), $templateHtml); + + $templateHtml = str_replace( + "{address}", + '', + $templateHtml + ); + + $templateHtml = str_replace("{zipcode_lbl}", JText::_('COM_REDSHOP_ZIP'), $templateHtml); + + $templateHtml = str_replace( + "{zipcode}", + '', + $templateHtml + ); + + $templateHtml = str_replace("{city_lbl}", JText::_('COM_REDSHOP_CITY'), $templateHtml); + + $templateHtml = str_replace( + "{city}", + '', + $templateHtml + ); + + // Allow phone number to be optional using template tags. + $phoneIsRequired = strpos($templateHtml, '{phone_optional}') !== false ? '' : 'required'; + $templateHtml = str_replace("{phone_optional}", '', $templateHtml); + $templateHtml = str_replace( + "{phone}", + '', + $templateHtml + ); + + $templateHtml = str_replace("{phone_lbl}", JText::_('COM_REDSHOP_PHONE'), $templateHtml); + $templateHtml = str_replace("{country_txtid}", "div_country_txt", $templateHtml); + $templateHtml = str_replace("{country_style}", $countryStyle, $templateHtml); + $templateHtml = str_replace("{state_txtid}", "div_state_txt", $templateHtml); + $templateHtml = str_replace("{state_style}", $stateStyle, $templateHtml); + + $templateHtml = str_replace("{country_lbl}", JText::_('COM_REDSHOP_COUNTRY'), $templateHtml); + $templateHtml = str_replace("{country}", $lists['country_code'], $templateHtml); + $templateHtml = str_replace("{state_lbl}", JText::_('COM_REDSHOP_STATE'), $templateHtml); + $templateHtml = str_replace("{state}", $lists['state_code'], $templateHtml); + + return $templateHtml; + } + + /** + * Method for replace private customer billing fields. + * + * @param string $templateHtml Template content + * @param array $post Available data. + * @param array $lists Available list data. + * + * @return string Html content after replace + * + * @since 2.0.7 + */ + public static function replacePrivateCustomer($templateHtml = '', $post = array(), $lists = array()) + { + $templateHtml = self::replaceCommonFields($templateHtml, $post, $lists, 'private-'); + + if (strpos($templateHtml, "{private_extrafield}") === false) + { + return $templateHtml; + } + + $userExtraFields = Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') != 2 && $lists['extra_field_user'] != "" ? + $lists['extra_field_user'] : ''; + + return str_replace("{private_extrafield}", $userExtraFields, $templateHtml); + } + + /** + * Method for replace company billing fields. + * + * @param string $templateHtml Template content + * @param array $post Available data. + * @param array $lists Available list data. + * + * @return string Html content after replace + * + * @since 2.0.7 + */ + public static function replaceCompanyCustomer($templateHtml = '', $post = array(), $lists = array()) + { + $templateHtml = self::replaceCommonFields($templateHtml, $post, $lists, 'company-'); + $templateHtml = str_replace("{company_name_lbl}", JText::_('COM_REDSHOP_COMPANY_NAME'), $templateHtml); + $templateHtml = str_replace( + "{company_name}", + '', + $templateHtml + ); + $templateHtml = str_replace("{ean_number_lbl}", JText::_('COM_REDSHOP_EAN_NUMBER'), $templateHtml); + $templateHtml = str_replace( + "{ean_number}", + '', + $templateHtml + ); + + if (strpos($templateHtml, "{vat_number_start}") !== false && strpos($templateHtml, "{vat_number_end}") !== false) + { + $htmlStart = explode('{vat_number_start}', $templateHtml); + $htmlEnd = explode('{vat_number_end}', $htmlStart[1]); + $htmlMiddle = ''; + + if (Redshop::getConfig()->get('USE_TAX_EXEMPT') == 1) + { + $htmlMiddle = $htmlEnd[0]; + $classRequired = Redshop::getConfig()->get('REQUIRED_VAT_NUMBER') == 1 ? "required" : ""; + $htmlMiddle = str_replace("{vat_number_lbl}", JText::_('COM_REDSHOP_VAT_NUMBER'), $htmlMiddle); + $htmlMiddle = str_replace( + "{vat_number}", + '', + $htmlMiddle + ); + } + + $templateHtml = $htmlStart[0] . $htmlMiddle . $htmlEnd[1]; + } + + if (Redshop::getConfig()->get('USE_TAX_EXEMPT') == 1 && Redshop::getConfig()->get('SHOW_TAX_EXEMPT_INFRONT')) + { + $allowCompany = isset($post['is_company']) && 1 != (int) $post['is_company'] ? 'style="display:none;"' : ''; + $taxExempt = isset($post["tax_exempt"]) ? $post["tax_exempt"] : ''; + + $taxExemptHtml = JHtml::_( + 'select.booleanlist', + 'tax_exempt', + 'class="inputbox form-control" ', + $taxExempt, + JText::_('COM_REDSHOP_COMPANY_IS_VAT_EXEMPTED'), + JText::_('COM_REDSHOP_COMPANY_IS_NOT_VAT_EXEMPTED') + ); + + $templateHtml = str_replace( + "{tax_exempt_lbl}", + '
    ' . JText::_('COM_REDSHOP_TAX_EXEMPT') . '
    ', + $templateHtml + ); + + $templateHtml = str_replace( + "{tax_exempt}", + '
    ' . $taxExemptHtml . '
    ', + $templateHtml + ); + } + else + { + $templateHtml = str_replace("{tax_exempt_lbl}", '', $templateHtml); + $templateHtml = str_replace("{tax_exempt}", '', $templateHtml); + } + + if (strpos($templateHtml, "{company_extrafield}") !== false) + { + $companyExtraFields = (Redshop::getConfig()->get('ALLOW_CUSTOMER_REGISTER_TYPE') != 1 && $lists['extra_field_company'] != "") ? + $lists['extra_field_company'] : ""; + + $templateHtml = str_replace("{company_extrafield}", $companyExtraFields, $templateHtml); + } + + return $templateHtml; + } + + /** + * Method for return default html content + * + * @return string HTML content of default template. + * + * @since 2.0.7 + */ + public static function getDefaultTemplate() + { + return '' + . '' + . '
    ' + . '{private_billing_template:private_billing_template}{company_billing_template:company_billing_template}' + . '{account_creation_start}' + . '' + . '' + . '' + . '
    {username_lbl}{username}*' + . '
    {password_lbl}{password}' + . '*
    {confirm_password_lbl}{confirm_password}*
    {newsletter_signup_chk}{newsletter_signup_lbl}
    {account_creation_end}
    ' + . '*{required_lbl}
    {shipping_same_as_billing_lbl} {shipping_same_as_billing}
    '; + } + + /** + * Method for return default html content for private customer + * + * @return string HTML content of default template. + * + * @since 2.0.7 + */ + public static function getDefaultPrivateTemplate() + { + return '' + . '' . + '' . + '' . + '' . + '' . + '' . + '' . + '' . + '
    {email_lbl}:{email}*
    ' . + '{retype_email_lbl}{retype_email}*
    {firstname_lbl}{firstname}*
    {lastname_lbl}{lastname}*
    {address_lbl}{address}*
    {zipcode_lbl}{zipcode}*
    {city_lbl}{city}*
    {country_lbl}{country}' . + '*
    {state_lbl}{state}*
    {phone_lbl}{phone}' . + '*
    {private_extrafield}
    '; + } + + /** + * Method for return default html content for company customer + * + * @return string HTML content of default template. + * + * @since 2.0.7 + */ + public static function getDefaultCompanyTemplate() + { + return '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '
    {email_lbl}:{email}*
    ' + . '{retype_email_lbl}{retype_email}*
    {company_name_lbl}{company_name}*
    {vat_number_lbl}{vat_number}' + . '*
    {firstname_lbl}{firstname}*
    {lastname_lbl}{lastname}*
    {address_lbl}{address}*
    {zipcode_lbl}{zipcode}*
    {city_lbl}{city}' + . '*
    {country_lbl}{country}*
    {state_lbl}{state}' + . '*
    {phone_lbl}{phone}' + . '*
    {ean_number_lbl}{ean_number}
    {tax_exempt_lbl}{tax_exempt}
    {company_extrafield}
    '; + } +} diff --git a/libraries/redshop/helper/billing/tag.php b/libraries/redshop/helper/billing/tag.php new file mode 100644 index 00000000000..109522e54dc --- /dev/null +++ b/libraries/redshop/helper/billing/tag.php @@ -0,0 +1,275 @@ +trigger('onBeforeRenderBillingAddress', array(&$billingAddress)); + + $billingContent = RedshopLayoutHelper::render( + $billingLayout, + array('billingAddresses' => $billingAddress), + null, + array('client' => 0) + ); + + if (strpos($content, '{quotation_custom_field_list}') !== false) + { + $content = str_replace('{quotation_custom_field_list}', '', $content); + + if (Redshop::getConfig()->getBool('DEFAULT_QUOTATION_MODE')) + { + $billingContent .= RedshopHelperExtrafields::listAllField( + RedshopHelperExtrafields::SECTION_QUOTATION, $billingAddress->users_info_id + ); + } + } + elseif (Redshop::getConfig()->getBool('DEFAULT_QUOTATION_MODE')) + { + $content = RedshopHelperExtrafields::listAllField( + RedshopHelperExtrafields::SECTION_QUOTATION, $billingAddress->users_info_id, '', $content + ); + } + + $content = str_replace('{billing_address}', $billingContent, $content); + } + + /** + * Method for replace Billing Address tags between {billing_address_start} and {billing_address_end} + * + * @param string $content Template content + * @param object $billingAddress Billing data + * + * @return void + * @since 2.0.7 + */ + public static function replaceBlock(&$content, $billingAddress) + { + if (strpos($content, '{billing_address_start}') === false || strpos($content, '{billing_address_end}') === false) + { + return; + } + + $templateStart = explode('{billing_address_start}', $content); + $templateEnd = explode('{billing_address_end}', $templateStart[1]); + $billingTemplate = $templateEnd[0]; + + $extraFields = ''; + $companyName = ''; + $companyNameLabel = ''; + $firstName = ''; + $firstNameLabel = ''; + $lastName = ''; + $lastNameLabel = ''; + $fullName = ''; + $fullNameLabel = ''; + $address = ''; + $addressLabel = ''; + $zip = ''; + $zipLabel = ''; + $city = ''; + $cityLabel = ''; + $country = ''; + $countryLabel = ''; + $state = ''; + $stateLabel = ''; + $phone = ''; + $phoneLabel = ''; + $email = ''; + $emailLabel = ''; + $vatNumber = ''; + $vatNumberLabel = ''; + $eanNumber = ''; + $eanNumberLabel = ''; + $taxExempt = ''; + $taxExemptLabel = ''; + $taxExemptRequest = ''; + $taxExemptRequestLabel = ''; + + if (null !== $billingAddress) + { + if (!empty($billingAddress->firstname)) + { + $firstName = $billingAddress->firstname; + $firstNameLabel = JText::_('COM_REDSHOP_FIRSTNAME'); + } + + if (!empty($billingAddress->lastname)) + { + $lastName = $billingAddress->lastname; + $lastNameLabel = JText::_('COM_REDSHOP_LASTNAME'); + } + + if (!empty($billingAddress->lastname) || !empty($billingAddress->firstname)) + { + $fullName = $billingAddress->lastname . ' ' . $billingAddress->firstname; + $fullNameLabel = JText::_('COM_REDSHOP_FULLNAME'); + } + + if (!empty($billingAddress->address)) + { + $address = $billingAddress->address; + $addressLabel = JText::_('COM_REDSHOP_ADDRESS'); + } + + if (!empty($billingAddress->zipcode)) + { + $zip = $billingAddress->zipcode; + $zipLabel = JText::_('COM_REDSHOP_ZIP'); + } + + if (!empty($billingAddress->city)) + { + $city = $billingAddress->city; + $cityLabel = JText::_('COM_REDSHOP_CITY'); + } + + $countryName = RedshopHelperOrder::getCountryName($billingAddress->country_code); + + if (!empty($countryName)) + { + $country = JText::_($countryName); + $countryLabel = JText::_('COM_REDSCOM_REDSHOP_COUNTRYHOP_CITY'); + } + + $stateName = RedshopHelperOrder::getStateName($billingAddress->state_code, $billingAddress->country_code); + + if (!empty($stateName)) + { + $state = JText::_($stateName); + $stateLabel = JText::_('COM_REDSHOP_STATE'); + } + + if (!empty($billingAddress->phone)) + { + $phone = $billingAddress->phone; + $phoneLabel = JText::_('COM_REDSHOP_PHONE'); + } + + if (!empty($billingAddress->user_email)) + { + $email = $billingAddress->user_email; + $emailLabel = JText::_('COM_REDSHOP_EMAIL'); + } + elseif (!empty(JFactory::getUser()->email)) + { + $email = JFactory::getUser()->email; + $emailLabel = JText::_('COM_REDSHOP_EMAIL'); + } + + if ((int) $billingAddress->is_company === 1) + { + if (!empty($billingAddress->company_name)) + { + $companyName = $billingAddress->company_name; + $companyNameLabel = JText::_('COM_REDSHOP_COMPANY_NAME'); + } + + if (!empty($billingAddress->vat_number)) + { + $vatNumber = $billingAddress->vat_number; + $vatNumberLabel = JText::_('COM_REDSHOP_VAT_NUMBER'); + } + + if (!empty($billingAddress->ean_number)) + { + $eanNumber = $billingAddress->ean_number; + $eanNumberLabel = JText::_('COM_REDSHOP_EAN_NUMBER'); + } + + if (Redshop::getConfig()->getBool('SHOW_TAX_EXEMPT_INFRONT')) + { + $taxExempt = $billingAddress->tax_exempt === 1 ? JText::_('COM_REDSHOP_TAX_YES') : JText::_('COM_REDSHOP_TAX_NO'); + + $taxExemptLabel = JText::_('COM_REDSHOP_TAX_EXEMPT'); + + $taxExemptRequest = $billingAddress->requesting_tax_exempt === 1 ? + JText::_('COM_REDSHOP_TAX_YES') : JText::_('COM_REDSHOP_TAX_NO'); + + $taxExemptRequestLabel = JText::_('COM_REDSHOP_USER_TAX_EXEMPT_REQUEST_LBL'); + } + } + + $fieldSection = $billingAddress->is_company === 1 ? + RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS : RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS; + + $extraFields = RedshopHelperExtrafields::listAllFieldDisplay($fieldSection, $billingAddress->users_info_id, 1); + } + + $tags = array('{companyname}', '{companyname_lbl}', '{firstname}', '{firstname_lbl}', '{lastname}', + '{lastname_lbl}', '{fullname}', '{fullname_lbl}','{address}', '{address_lbl}', '{zip}', '{zip_lbl}', + '{city}', '{city_lbl}', '{country}', '{country_lbl}', '{state}', '{state_lbl}', '{email}', '{email_lbl}', '{phone}', + '{phone_lbl}', '{vatnumber}', '{vatnumber_lbl}', '{ean_number}', '{ean_number_lbl}', '{taxexempt}', + '{taxexempt_lbl}', '{user_taxexempt_request}', '{user_taxexempt_request_lbl}', '{billing_extrafield}'); + + $replace = array($companyName, $companyNameLabel, $firstName, $firstNameLabel, $lastName, $lastNameLabel, + $fullName, $fullNameLabel, $address, $addressLabel, $zip, $zipLabel, $city, $cityLabel, $country, + $countryLabel, $state, $stateLabel, $email, $emailLabel, $phone, $phoneLabel, $vatNumber, $vatNumberLabel, + $eanNumber, $eanNumberLabel, $taxExempt, $taxExemptLabel, $taxExemptRequest, $taxExemptRequestLabel, + $extraFields); + + // Merge content + $content = $templateStart[0] . str_replace($tags, $replace, $billingTemplate) . $templateEnd[1]; + + // Remove {billing_address} tag from content if already run through this function + $content = str_replace('{billing_address}', '', $content); + } +} diff --git a/libraries/redshop/helper/breadcrumb.php b/libraries/redshop/helper/breadcrumb.php new file mode 100644 index 00000000000..a9e075df227 --- /dev/null +++ b/libraries/redshop/helper/breadcrumb.php @@ -0,0 +1,391 @@ +getPathway(); + + $view = $app->input->getCmd('view'); + $layout = $app->input->getCmd('layout'); + $itemId = $app->input->getInt('Itemid'); + $categoryId = $app->input->getInt('cid'); + $customPathways = array(); + + // Clean up current pathway. + $paths = $pathway->getPathway(); + $menuPaths = $paths; + + foreach ($paths as $j => $path) + { + unset($paths[$j]); + } + + $pathway->setPathway($paths); + + switch ($view) + { + case "category": + // Use menu path if menu of category detail is same. + if ($sectionId) + { + $manufacturerId = $app->input->getInt('manufacturer_id', 0); + + $link = "index.php?option=com_redshop&view=category&layout=detail&cid=" . $sectionId . "&manufacturer_id=" . $manufacturerId; + $menu = productHelper::getInstance()->getMenuDetail($link); + + if ($menu) + { + $pathway->setPathway($menuPaths); + + return; + } + } + + $customPathways = array(); + $newLink = 'index.php?option=com_redshop&view=category'; + + if ($layout === 'categoryproduct') + { + $newLink = 'index.php?option=com_redshop&view=category&layout=' . $layout; + } + + $menu = productHelper::getInstance()->getMenuDetail($newLink); + + if (!empty($menu) && $menu->home !== 1) + { + $main = new stdClass; + $main->name = $menu->title; + $main->link = JRoute::_($newLink . '&Itemid=' . $menu->id); + $customPathways[] = $main; + } + + if ($sectionId != 0) + { + $category_list = array_reverse(productHelper::getInstance()->getCategoryNavigationlist($sectionId)); + $customPathways = array_merge($customPathways, self::getPathway($category_list)); + } + + break; + + case "product": + $menu = productHelper::getInstance()->getMenuInformation($itemId); + + if (!is_null($menu) + && (strpos($menu->params, "manufacturer") !== false && strpos($menu->params, '"manufacturer_id":"0"') === false)) + { + $customPathways = array(); + $menu = productHelper::getInstance()->getMenuDetail("index.php?option=com_redshop&view=manufacturers"); + + if (count($menu) > 0 && $menu->home != 1) + { + if (isset($menu->parent)) + { + $parentMenu = productHelper::getInstance()->getMenuInformation($menu->parent); + + if (count($parentMenu) > 0) + { + $main = new stdClass; + $main->name = $parentMenu->name; + $main->link = JRoute::_($parentMenu->link . '&Itemid=' . $parentMenu->id); + $customPathways[] = $main; + } + } + + $main = new stdClass; + $main->name = $menu->title; + $main->link = JRoute::_('index.php?option=com_redshop&view=manufacturers&Itemid=' . $menu->id); + $customPathways[] = $main; + } + + if ($sectionId != 0) + { + $prd = RedshopHelperProduct::getProductById($sectionId); + $menu = RedshopEntityManufacturer::getInstance($prd->manufacturer_id)->getItem(); + + if (!empty($menu)) + { + $main = new stdClass; + $main->name = $menu->name; + $main->link = JRoute::_( + 'index.php?option=com_redshop&view=manufacturers&layout=products&mid=' . $prd->manufacturer_id + . '&Itemid=' . $itemId + ); + $customPathways[] = $main; + } + + $main = new stdClass; + $main->name = $prd->product_name; + $main->link = ""; + $customPathways[] = $main; + } + } + else + { + $customPathways = array(); + $menu = productHelper::getInstance()->getMenuDetail("index.php?option=com_redshop&view=category"); + + if (!empty($menu) && $menu->home != 1) + { + $main = new stdClass; + $main->name = $menu->title; + $main->link = JRoute::_('index.php?option=com_redshop&view=category&Itemid=' . $menu->id); + $customPathways[] = $main; + } + else + { + $menu = productHelper::getInstance()->getMenuDetail("index.php?option=com_redshop&view=product&pid=" . $sectionId); + + if (!empty($menu) && $menu->home != 1 && property_exists($menu, 'parent')) + { + $parentMenu = productHelper::getInstance()->getMenuInformation($menu->parent); + + if (!empty($parentMenu)) + { + $main = new stdClass; + $main->name = $parentMenu->name; + $main->link = JRoute::_($parentMenu->link . '&Itemid=' . $parentMenu->id); + $customPathways[] = $main; + } + } + } + + if ($sectionId != 0) + { + $prd = RedshopHelperProduct::getProductById($sectionId); + + if (!$categoryId) + { + $categoryId = productHelper::getInstance()->getCategoryProduct($sectionId); + } + + if ($categoryId) + { + $category_list = array_reverse(productHelper::getInstance()->getCategoryNavigationlist($categoryId)); + $customPathways = array_merge($customPathways, self::getPathway($category_list)); + } + + $main = new stdClass; + $main->name = $prd->product_name; + $main->link = ""; + $customPathways[] = $main; + } + } + + break; + + case "manufacturers": + + $customPathways = array(); + $menu = productHelper::getInstance()->getMenuDetail("index.php?option=com_redshop&view=manufacturers"); + + if (count($menu) > 0 && $menu->home != 1) + { + if (property_exists($menu, 'parent')) + { + $parentMenu = productHelper::getInstance()->getMenuInformation($menu->parent); + + if (count($parentMenu) > 0) + { + $main = new stdClass; + $main->name = $parentMenu->name; + $main->link = JRoute::_($parentMenu->link . '&Itemid=' . $parentMenu->id); + $customPathways[] = $main; + } + } + + $main = new stdClass; + $main->name = $menu->title; + $main->link = JRoute::_('index.php?option=com_redshop&view=manufacturers&Itemid=' . $menu->id); + $customPathways[] = $main; + } + + if ($sectionId != 0) + { + $menu = productHelper::getInstance()->getMenuInformation(0, $sectionId, "manufacturerid", "manufacturers"); + + if (!empty((array) $menu)) + { + $main = new stdClass; + $main->name = $menu->title; + $main->link = ""; + $customPathways[] = $main; + } + else + { + $menu = RedshopEntityManufacturer::getInstance($sectionId)->getItem(); + + if (!empty((array) $menu)) + { + $main = new stdClass; + $main->name = $menu->name; + $main->link = ""; + $customPathways[] = $main; + } + } + } + + break; + + case "account": + $customPathways = array(); + $menu = productHelper::getInstance()->getMenuInformation($itemId); + + if (count($menu) > 0) + { + $main = new stdClass; + $main->name = $menu->title; + $main->link = ""; + } + else + { + $main = new stdClass; + $main->name = JText::_('COM_REDSHOP_ACCOUNT_MAINTAINANCE'); + $main->link = ""; + } + + $customPathways[] = $main; + + break; + + case "order_detail": + $customPathways = array(); + $menu = productHelper::getInstance()->getMenuInformation(0, 0, "", "account"); + + if (!empty($menu)) + { + $main = new stdClass; + $main->name = $menu->title; + $main->link = JRoute::_('index.php?option=com_redshop&view=account&Itemid=' . $menu->id); + $customPathways[] = $main; + } + else + { + $main = new stdClass; + $main->name = JText::_('COM_REDSHOP_ACCOUNT_MAINTAINANCE'); + $main->link = JRoute::_('index.php?option=com_redshop&view=account&Itemid=' . $itemId); + $customPathways[] = $main; + } + + $main = new stdClass; + $main->name = JText::_('COM_REDSHOP_ORDER_DETAILS'); + $main->link = ""; + $customPathways[] = $main; + + break; + + case "orders": + case "account_billto": + case "account_shipto": + $customPathways = array(); + $menu = productHelper::getInstance()->getMenuInformation(0, 0, "", "account"); + + if (is_object($menu) && count(get_object_vars($menu)) > 0) + { + $main = new stdClass; + $main->name = $menu->title; + $main->link = JRoute::_('index.php?option=com_redshop&view=account&Itemid=' . $menu->id); + $customPathways[] = $main; + } + else + { + $main = new stdClass; + $main->name = JText::_('COM_REDSHOP_ACCOUNT_MAINTAINANCE'); + $main->link = JRoute::_('index.php?option=com_redshop&view=account&Itemid=' . $itemId); + $customPathways[] = $main; + } + + if ($view == 'orders') + { + $lastlink = JText::_('COM_REDSHOP_ORDER_LIST'); + } + elseif ($view == 'account_billto') + { + $lastlink = JText::_('COM_REDSHOP_BILLING_ADDRESS_INFORMATION_LBL'); + } + elseif ($view == 'account_shipto') + { + $lastlink = JText::_('COM_REDSHOP_SHIPPING_ADDRESS_INFO_LBL'); + } + + $main = new stdClass; + $main->name = $lastlink; + $main->link = ""; + $customPathways[] = $main; + + break; + + default: + break; + } + + if (empty($customPathways)) + { + return; + } + + $customPathways[count($customPathways) - 1]->link = ''; + + foreach ($customPathways as $customPathway) + { + $pathway->addItem($customPathway->name, $customPathway->link); + } + } + + /** + * Method for get list of pathway + * + * @param array $categories List of category + * + * @return array List of pathway + * + * @since 2.0.7 + */ + public static function getPathway($categories = array()) + { + $items = array(); + + foreach ($categories as $category) + { + $item = new stdClass; + $item->name = $category['category_name']; + $item->link = JRoute::_( + 'index.php?option=com_redshop&view=category&layout=detail&cid=' . $category['category_id'] . '&Itemid=' . $category['catItemid'] + ); + + $items[] = $item; + } + + return $items; + } +} diff --git a/libraries/redshop/helper/cart.php b/libraries/redshop/helper/cart.php new file mode 100644 index 00000000000..620840b8016 --- /dev/null +++ b/libraries/redshop/helper/cart.php @@ -0,0 +1,947 @@ +id; + } + + $db = JFactory::getDbo(); + + if ($cartId === 0) + { + $query = $db->getQuery(true) + ->select($db->qn('cart_id')) + ->from($db->qn('#__redshop_usercart')) + ->where($db->qn('user_id') . ' = ' . (int) $userId); + + $cartId = $db->setQuery($query)->loadResult(); + } + + if (!$cartId) + { + return true; + } + + $query = $db->getQuery(true) + ->select($db->qn('cart_item_id')) + ->from($db->qn('#__redshop_usercart_item')) + ->where($db->qn('cart_id') . ' = ' . (int) $cartId); + + $cartItemIds = $db->setQuery($query)->loadColumn(); + + try + { + $db->transactionStart(); + + if ($cartItemIds) + { + $cartItemIds = ArrayHelper::toInteger($cartItemIds); + + // Delete accessory + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_usercart_accessory_item')) + ->where($db->qn('cart_item_id') . ' IN (' . implode(',', $cartItemIds) . ')'); + + $db->setQuery($query)->execute(); + + // Delete attribute + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_usercart_attribute_item')) + ->where($db->qn('cart_item_id') . ' IN (' . implode(',', $cartItemIds) . ')'); + + $db->setQuery($query)->execute(); + } + + // Delete cart item + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_usercart_item')) + ->where($db->qn('cart_id') . ' = ' . (int) $cartId); + + $db->setQuery($query)->execute(); + + if ($delCart) + { + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_usercart')) + ->where($db->qn('cart_id') . ' = ' . (int) $cartId); + + $db->setQuery($query)->execute(); + } + + $db->transactionCommit(); + } + catch (Exception $e) + { + $db->transactionRollback(); + + return false; + } + + return true; + } + + /** + * Store Cart to Database + * + * @param array $cart Cart data. + * + * @return boolean True on success. False otherwise. + * @throws Exception + * + * @since 2.0.3 + */ + public static function addCartToDatabase($cart = array()) + { + $user = JFactory::getUser(); + + // If user is not logged in don't save in db + if ($user->guest) + { + return false; + } + + $cart = empty($cart) ? RedshopHelperCartSession::getCart() : $cart; + + JPluginHelper::importPlugin('redshop_product'); + RedshopHelperUtility::getDispatcher()->trigger('onAddCartToDatabase', array(&$cart)); + + $idx = isset($cart['idx']) ? (int) $cart['idx'] : 0; + $db = JFactory::getDbo(); + + // Get cart ID. + + /** @var RedshopTableUsercart $userCartTable */ + $userCartTable = RedshopTable::getInstance('Usercart', 'RedshopTable'); + + if (!$userCartTable->load(array('user_id' => $user->id))) + { + $userCartTable->user_id = $user->id; + $userCartTable->cdate = time(); + $userCartTable->mdate = time(); + + if (!$userCartTable->store()) + { + return false; + } + + $cartId = $userCartTable->cart_id; + } + else + { + $cartId = $userCartTable->cart_id; + } + + try + { + $db->transactionStart(); + + $delCart = (!$idx) ? true : false; + + // Clean current cart. + if (!self::removeCartFromDatabase($cartId, $user->id, $delCart)) + { + return false; + } + + for ($i = 0; $i < $idx; $i++) + { + /** @var RedshopTableUsercart_Item $userCartItem */ + $userCartItem = RedshopTable::getInstance('Usercart_Item', 'RedshopTable'); + + $userCartItem->cart_idx = $i; + $userCartItem->cart_id = $cartId; + $userCartItem->product_id = $cart[$i]['product_id']; + $userCartItem->attribs = serialize($cart[$i]); + + if (isset($cart[$i]['giftcard_id']) === false) + { + $cart[$i]['giftcard_id'] = 0; + } + + if (isset($cart[$i]['wrapper_id']) === false) + { + $cart[$i]['wrapper_id'] = 0; + } + + $userCartItem->giftcard_id = $cart[$i]['giftcard_id']; + $userCartItem->product_quantity = $cart[$i]['quantity']; + $userCartItem->product_wrapper_id = $cart[$i]['wrapper_id']; + + if (isset($cart[$i]['subscription_id']) === false) + { + $cart[$i]['subscription_id'] = 0; + } + + $userCartItem->product_subscription_id = $cart[$i]['subscription_id']; + + if (!$userCartItem->store()) + { + throw new Exception(/** @scrutinizer ignore-deprecated */ $userCartItem->getError()); + } + + $cartItemId = $userCartItem->cart_item_id; + $cartAttributes = array(); + + if (isset($cart[$i]['cart_attribute'])) + { + $cartAttributes = $cart[$i]['cart_attribute']; + } + + // Store attribute in db + self::addCartAttributeToDatabase($cartAttributes, $cartItemId, $userCartItem->product_id); + + $cartAccessories = !empty($cart[$i]['cart_accessory']) ? (array) $cart[$i]['cart_accessory'] : array(); + + foreach ($cartAccessories as $cartAccessory) + { + /** @var RedshopTableUsercart_Accessory_Item $userCartItemAccessory */ + $userCartItemAccessory = RedshopTable::getInstance('Usercart_Accessory_Item', 'RedshopTable'); + $userCartItemAccessory->accessory_id = $cartAccessory['accessory_id']; + + // Store product quantity as accessory quantity. + $userCartItemAccessory->accessory_quantity = $cart[$i]['quantity']; + + if (!$userCartItemAccessory->store()) + { + throw new Exception(/** @scrutinizer ignore-deprecated */ $userCartItemAccessory->getError()); + } + + self::addCartAttributeToDatabase( + $cartAccessory['accessory_childs'], $cartItemId, $userCartItemAccessory->accessory_id, true + ); + } + } + + $db->transactionCommit(); + } + catch (Exception $e) + { + $db->transactionRollback(); + + return false; + } + + return true; + } + + /** + * Store Cart Attribute to Database + * + * @param array $attributes Cart attribute data. + * @param integer $cartItemId Cart item ID + * @param integer $productId Cart product ID. + * @param boolean $isAccessory Is this accessory? + * + * @return boolean True on success. False otherwise. + * + * @since 2.0.3 + * @throws Exception + */ + public static function addCartAttributeToDatabase($attributes = array(), $cartItemId = 0, $productId = 0, $isAccessory = false) + { + if (!$cartItemId) + { + return false; + } + + $db = JFactory::getDbo(); + + try + { + $db->transactionStart(); + + foreach ($attributes as $attribute) + { + /** @var RedshopTableUsercart_Attribute_Item $table */ + $table = RedshopTable::getInstance('Usercart_Attribute_Item', 'RedshopTable'); + + $table->cart_item_id = $cartItemId; + $table->section_id = $attribute['attribute_id']; + $table->section = 'attribute'; + $table->parent_section_id = $productId; + $table->is_accessory_att = (int) $isAccessory; + + if (!$table->store()) + { + throw new Exception($table->getError()); + } + + $attributeChildren = (array) $attribute['attribute_childs']; + + foreach ($attributeChildren as $attributeChild) + { + /** @var RedshopTableUsercart_Attribute_Item $itemTable */ + $itemTable = RedshopTable::getInstance('Usercart_Attribute_Item', 'RedshopTable'); + + $itemTable->cart_item_id = $cartItemId; + $itemTable->section_id = $attributeChild['property_id']; + $itemTable->section = 'property'; + $itemTable->parent_section_id = $attribute['attribute_id']; + $itemTable->is_accessory_att = (int) $isAccessory; + + if (!$itemTable->store()) + { + throw new Exception($table->getError()); + } + + if (empty($attributeChild['property_childs'])) + { + continue; + } + + foreach ($attributeChild['property_childs'] as $property) + { + /** @var RedshopTableUsercart_Attribute_Item $propertyTable */ + $propertyTable = RedshopTable::getInstance('usercart_attribute_item', 'RedshopTable'); + + $propertyTable->section_id = $property['subproperty_id']; + $propertyTable->section = 'subproperty'; + $propertyTable->parent_section_id = $attributeChild['property_id']; + $propertyTable->is_accessory_att = (int) $isAccessory; + + if (!$propertyTable->store()) + { + throw new Exception($table->getError()); + } + } + } + } + + $db->transactionCommit(); + } + catch (Exception $e) + { + $db->transactionRollback(); + + return false; + } + + return true; + } + + /** + * Method for convert data from database to cart. + * + * @param int $userId ID of user. + * + * @return void + * + * @since 2.0.3 + * @throws Exception + */ + public static function databaseToCart($userId = 0) + { + if (!$userId) + { + $user = JFactory::getUser(); + $userId = $user->id; + } + + JPluginHelper::importPlugin('redshop_product'); + + $productHelper = productHelper::getInstance(); + $cartHelper = rsCarthelper::getInstance(); + + if (!array_key_exists($userId, self::$cart)) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select( + $db->qn( + array( + 'ci.cart_item_id', 'ci.cart_idx', 'ci.product_id', 'ci.product_quantity', + 'ci.product_wrapper_id', 'ci.product_subscription_id', 'ci.giftcard_id', 'ci.attribs') + ) + ) + ->from($db->qn('#__redshop_usercart_item', 'ci')) + ->leftJoin($db->qn('#__redshop_usercart', 'c') . ' ON ' . $db->qn('c.cart_id') . ' = ' . $db->qn('ci.cart_id')) + ->where($db->qn('c.user_id') . ' = ' . $userId) + ->order($db->qn('ci.cart_idx')); + + self::$cart[$userId] = $db->setQuery($query)->loadObjectList(); + } + + $cartItems = self::$cart[$userId]; + + if (empty($cartItems)) + { + return; + } + + $cart = array(); + $idx = 0; + + foreach ($cartItems as $cartItem) + { + RedshopHelperUtility::getDispatcher()->trigger('onDatabaseToCart', array(&$cartItem)); + + $setCartItem = true; + $quantity = $cartItem->product_quantity; + $calcOutput = ""; + $calcOutputs = array(); + $productId = $cartItem->product_id; + $subscriptionId = 0; + $wrapperPrice = 0; + $productVatPrice = 0; + $productOldPrice = 0; + $productOldPriceNoVat = 0; + $generateAttributeCart = ''; + $generateAccessoryCart = ''; + $giftCardId = ''; + $attributes = unserialize($cartItem->attribs); + + if ($cartItem->giftcard_id) + { + $section = 13; + $giftCardId = $cartItem->giftcard_id; + $giftCardPrice = 0; + $giftCardData = RedshopEntityGiftcard::getInstance($giftCardId)->getItem(); + + if (!empty($giftCardData)) + { + if ($giftCardData->customer_amount) + { + $customerAmount = ''; + + if (isset($attributes['customer_amount'])) + { + $customerAmount = $attributes['customer_amount']; + } + + $giftCardPrice = $customerAmount; + } + else + { + $giftCardPrice = $giftCardData->giftcard_price; + } + } + + $productPrice = $giftCardPrice; + $productPriceNoVat = $giftCardPrice; + } + else + { + $section = 12; + $cartItemId = $cartItem->cart_item_id; + $productPrice = 0; + $productData = RedshopHelperProduct::getProductById($productId); + + if ($productData->published === 0) + { + continue; + } + + // Attribute price added + $generateAttributeCart = self::generateAttributeFromCart($cartItemId, 0, $productId, $quantity); + $cartAttributes = $productHelper->makeAttributeCart($generateAttributeCart, $productId, 0, $productPrice, $quantity); + + $productPriceNoVat = $cartAttributes[1]; + $productVatPrice = $cartAttributes[2]; + $selectedAttributeId = $cartAttributes[3]; + $isStock = $cartAttributes[4]; + $productOldPrice = $cartAttributes[5] + $cartAttributes[6]; + $productOldPriceNoVat = $cartAttributes[5]; + $productPrice = $productPriceNoVat + $productVatPrice; + + if (!$isStock) + { + $setCartItem = false; + $msg = JText::_('COM_REDSHOP_PRODUCT_OUTOFSTOCK_MESSAGE'); + } + + if ($productData->product_type === 'subscription') + { + $productSubscription = $productHelper->getProductSubscriptionDetail($productId, $cartItem->product_subscription_id); + + if (!empty($productSubscription->subscription_id)) + { + $subscriptionId = $productSubscription->subscription_id; + $subscriptionPrice = $productSubscription->subscription_price; + $subscriptionVAT = 0; + + if ($subscriptionPrice) + { + $subscriptionVAT = $productHelper->getProductTax($productId, $subscriptionPrice); + } + + $productVatPrice += $subscriptionVAT; + $productPrice += $subscriptionPrice + $subscriptionVAT; + $productOldPrice = $productOldPrice + $subscriptionPrice + $subscriptionVAT; + $productOldPriceNoVat += $subscriptionPrice; + $productPriceNoVat += $subscriptionPrice; + } + else + { + $setCartItem = false; + $msg = JText::_('COM_REDSHOP_SELECT_PRODUCT_SUBSCRIPTION'); + } + } + + // Accessory price + $generateAccessoryCart = $cartHelper->generateAccessoryFromCart($cartItemId, $productId, $quantity); + $accessoriesData = $productHelper->makeAccessoryCart($generateAccessoryCart, $productId); + $accessoryTotalPrice = $accessoriesData[1]; + $accessoryVATPrice = $accessoriesData[2]; + + $productPriceNoVat += $accessoryTotalPrice; + $productPrice += $accessoryTotalPrice + $accessoryVATPrice; + $productOldPrice += $accessoryTotalPrice + $accessoryVATPrice; + $productOldPriceNoVat += $accessoryTotalPrice; + $productVatPrice = $productVatPrice + $accessoryVATPrice; + + // Check if required attribute is filled or not + if (count($selectedAttributeId) > 0) + { + $selectedAttributeId = implode(",", $selectedAttributeId); + } + + $requiredAttributeData = RedshopHelperProduct_Attribute::getProductAttribute( + $productId, 0, 0, 0, 1, $selectedAttributeId + ); + + if (count($requiredAttributeData) > 0) + { + $requiredAttributes = array(); + + foreach ($requiredAttributeData as $requiredAttribute) + { + $requiredAttributes = $requiredAttribute->attribute_name; + } + + $requiredAttributeName = implode(', ', $requiredAttributes); + + // Throw an error as first attribute is required + $msg = $requiredAttributeName . " " . JText::_('COM_REDSHOP_IS_REQUIRED'); + $setCartItem = false; + } + + // ADD WRAPPER PRICE + $wrapperVAT = 0; + + if ($cartItem->product_wrapper_id) + { + $wrapperArr = $cartHelper->getWrapperPriceArr(array('product_id' => $productId, 'wrapper_id' => $cartItem->product_wrapper_id)); + $wrapperVAT = $wrapperArr['wrapper_vat']; + $wrapperPrice = $wrapperArr['wrapper_price']; + } + + $productVatPrice += $wrapperVAT; + $productPrice += $wrapperPrice + $wrapperVAT; + $productOldPrice += $wrapperPrice + $wrapperVAT; + $productOldPriceNoVat += $wrapperPrice; + $productPriceNoVat += $wrapperPrice; + } + + // END WRAPPER PRICE + if ($setCartItem) + { + if ($productPrice < 0) + { + $productPrice = 0; + } + + if ($fields = RedshopHelperExtrafields::getSectionFieldList($section)) + { + foreach ($fields as $field) + { + $dataTxt = isset($attributes[$field->name]) ? $attributes[$field->name] : ''; + $text = strpbrk($dataTxt, '`'); + + if ($text) + { + $list = explode('`', $dataTxt); + + if (is_array($list)) + { + $dataTxt = implode(",", $list); + } + } + + $cart[$idx][$field->name] = $dataTxt; + } + } + + $cart[$idx]['product_price'] = $productPrice; + $cart[$idx]['product_price_excl_vat'] = $productPriceNoVat; + $cart[$idx]['giftcard_id'] = $giftCardId; + + if ($giftCardId) + { + $cart[$idx]['reciver_email'] = $attributes['reciver_email']; + $cart[$idx]['reciver_name'] = $attributes['reciver_name']; + $cart[$idx]['customer_amount'] = ''; + + if (isset($attributes['customer_amount'])) + { + $cart[$idx]['customer_amount'] = $attributes['customer_amount']; + } + + $cart[$idx]['product_vat'] = 0; + $cart[$idx]['product_id'] = ''; + $cart[$idx]['quantity'] = $quantity; + } + else + { + $cart[$idx]['product_id'] = $productId; + $cart[$idx]['discount_calc_output'] = $calcOutput; + $cart[$idx]['discount_calc'] = $calcOutputs; + $cart[$idx]['product_vat'] = $productVatPrice; + $cart[$idx]['product_old_price'] = $productOldPrice; + $cart[$idx]['product_old_price_excl_vat'] = $productOldPriceNoVat; + $cart[$idx]['cart_attribute'] = $generateAttributeCart; + $cart[$idx]['cart_accessory'] = $generateAccessoryCart; + $cart[$idx]['subscription_id'] = $subscriptionId; + $cart[$idx]['category_id'] = 0; + $cart[$idx]['wrapper_id'] = $cartItem->product_wrapper_id; + $cart[$idx]['wrapper_price'] = $wrapperPrice; + $cart[$idx]['quantity'] = $cartHelper->checkQuantityInStock($cart[$idx], $quantity); + } + + if ($cart[$idx]['quantity'] <= 0) + { + $msg = JText::_('COM_REDSHOP_PRODUCT_OUTOFSTOCK_MESSAGE'); + + if (!empty(Redshop::getConfig()->getString('CART_RESERVATION_MESSAGE'))) + { + $msg = Redshop::getConfig()->get('CART_RESERVATION_MESSAGE'); + } + } + else + { + $idx++; + } + } + } + + $shopperGroup = RedshopHelperUser::getShopperGroup($userId); + + $cart['idx'] = $idx; + $cart['discount_type'] = 0; + $cart['discount'] = 0; + $cart['user_shopper_group_id'] = $shopperGroup; + + // Set 0 as default.. + $cart['free_shipping'] = 0; + $cart['voucher_discount'] = 0; + $cart['coupon_discount'] = 0; + $cart['cart_discount'] = 0; + + JFactory::getSession()->set('cart', $cart); + + self::cartFinalCalculation(); + } + + /** + * Method for generate attribute from cart. + * + * @param integer $cartItemId ID of cart item. + * @param integer $isAccessory Is accessory? + * @param integer $parentSectionId ID of parent section + * @param integer $quantity Quantity of product. + * + * @return array + * @throws Exception + * + * @since 2.0.3 + */ + public static function generateAttributeFromCart($cartItemId = 0, $isAccessory = 0, $parentSectionId = 0, $quantity = 1) + { + $cartAttributes = (array) rsCarthelper::getInstance()->getCartItemAttributeDetail( + $cartItemId, $isAccessory, 'attribute', $parentSectionId + ); + + if (empty($cartAttributes)) + { + return array(); + } + + $generateAttributes = array(); + + foreach ($cartAttributes as $i => $cartAttribute) + { + $attribute = RedshopHelperProduct_Attribute::getProductAttribute(0, 0, $cartAttribute->section_id); + $generateProperties = array(); + + $generateAttributes[$i]['attribute_id'] = $cartAttribute->section_id; + $generateAttributes[$i]['attribute_name'] = $attribute[0]->text; + + $cartProperties = (array) rsCarthelper::getInstance()->getCartItemAttributeDetail( + $cartItemId, $isAccessory, 'property', $cartAttribute->section_id + ); + + foreach ($cartProperties as $p => $cartProperty) + { + $generateSubProperties = array(); + $property = RedshopHelperProduct_Attribute::getAttributeProperties($cartProperty->section_id); + $priceList = RedshopHelperProduct_Attribute::getPropertyPrice($cartProperty->section_id, $quantity, 'property'); + + if (!empty($priceList->product_price)) + { + $propertyPrice = $priceList->product_price; + } + else + { + $propertyPrice = $property[0]->property_price; + } + + $generateProperties[$p]['property_id'] = $cartProperty->section_id; + $generateProperties[$p]['property_name'] = $property[0]->text; + $generateProperties[$p]['property_oprand'] = $property[0]->oprand; + $generateProperties[$p]['property_price'] = $propertyPrice; + + $cartSubProperties = (array) rsCarthelper::getInstance()->getCartItemAttributeDetail( + $cartItemId, $isAccessory, 'subproperty', $cartProperty->section_id + ); + + foreach ($cartSubProperties as $index => $cartSubProperty) + { + $subProperty = RedshopHelperProduct_Attribute::getAttributeSubProperties($cartSubProperty->section_id); + $price = RedshopHelperProduct_Attribute::getPropertyPrice($cartSubProperty->section_id, $quantity, 'subproperty'); + $subPropertyPrice = $subProperty[0]->subattribute_color_price; + + if (!empty($price)) + { + $subPropertyPrice = $price->product_price; + } + + $generateSubProperties[$index]['subproperty_id'] = $cartSubProperty->section_id; + $generateSubProperties[$index]['subproperty_name'] = $subProperty[0]->text; + $generateSubProperties[$index]['subproperty_oprand'] = $subProperty[0]->oprand; + $generateSubProperties[$index]['subproperty_price'] = $subPropertyPrice; + } + + $generateProperties[$p]['property_childs'] = $generateSubProperties; + } + + $generateAttributes[$i]['attribute_childs'] = $generateProperties; + } + + return $generateAttributes; + } + + /** + * Method for calculate final price of cart. + * + * @param bool $isModify Is modify cart? + * + * @return array + * + * @since 2.0.3 + * + * @throws Exception + */ + public static function cartFinalCalculation($isModify = true) + { + $ajax = JFactory::getApplication()->input->getInt('ajax_cart_box'); + $cart = RedshopHelperCartSession::getCart(); + + if ($isModify === true) + { + $cart = rsCarthelper::getInstance()->modifyDiscount($cart); + } + + $cartOutput = array(); + $carts = self::generateCartOutput($cart); + + $cartOutput['cart_output'] = $carts[0]; + $cartOutput['total_quantity'] = $carts[1]; + $text = Redshop\Shipping\Rate::getFreeShippingRate(); + + if ($ajax === 1 &&Redshop::getConfig()->getBool('AJAX_CART_BOX')) + { + echo '`' . $carts[0] . '`' . $text; + JFactory::getApplication()->close(); + } + + return $cartOutput; + } + + /** + * Method for render cart. + * + * @param array $cart Cart data + * + * @return array + * + * @since 2.0.3 + */ + public static function generateCartOutput($cart = array()) + { + $return = array(); + $totalQuantity = 0; + $idx = $cart['idx']; + $cartParams = \Redshop\Cart\Module::getParams(); + $html = (string) $cartParams->get('cart_output', 'simple'); + $showShippingLine = (int) $cartParams->get('show_shipping_line', 0); + $showWithVAT = (int) $cartParams->get('show_with_vat', 0); + + for ($i = 0; $i < $idx; $i++) + { + $totalQuantity += $cart[$i]['quantity']; + } + + // Load cart module language + $lang = JFactory::getLanguage(); + $lang->load('mod_redshop_cart', JPATH_SITE); + + $return[] = RedshopLayoutHelper::render( + 'cart.cart', + array( + 'cartOutput' => $html, + 'totalQuantity' => $totalQuantity, + 'cart' => $cart, + 'showWithVat' => $showWithVAT, + 'showShippingLine' => $showShippingLine + ), + '', + array('option' => 'com_redshop') + ); + + $return[] = $totalQuantity; + + return $return; + } + + /** + * Calculate tax after Discount is apply + * + * @param float $tax Tax amount + * @param float $discount Discount amount. + * + * @return float Tax after apply discount. + * + * @since 2.0.3 + */ + public static function calculateTaxAfterDiscount($tax = 0.0, $discount = 0.0) + { + $taxAfterDiscount = 0; + $cart = JFactory::getSession()->get('cart'); + + if (Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT') && (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')) + { + if ($discount > 0.0) + { + $applyTax = (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') * $discount; + $taxAfterDiscount = $tax - $applyTax; + } + } + + $cart['tax_after_discount'] = $taxAfterDiscount; + JFactory::getSession()->set('cart', $cart); + + return $taxAfterDiscount; + } + + /** + * Check user for Tax Exemption approved + * + * @param integer $userId User Information Id - Login user id + * @param boolean $isShowButtonAddToCart Display Add to cart button for tax exemption user + * + * @return boolean True if VAT applied else false + * + * @since 2.0.6 + */ + public static function taxExemptAddToCart($userId = 0, $isShowButtonAddToCart = false) + { + $userId = !$userId ? JFactory::getUser()->id : $userId; + + if (!$userId) + { + return true; + } + + $userInformation = RedshopHelperUser::getUserInformation($userId); + + if (empty($userInformation->user_id)) + { + return true; + } + + if ($userInformation->requesting_tax_exempt === 0) + { + return true; + } + + if ($userInformation->requesting_tax_exempt === 1 && $userInformation->tax_exempt_approved === 0) + { + if ($isShowButtonAddToCart) + { + return false; + } + + return true; + } + + if ($userInformation->requesting_tax_exempt === 1 && $userInformation->tax_exempt_approved === 1) + { + if ($isShowButtonAddToCart) + { + return true; + } + + return false; + } + + return true; + } + + /** + * Empty and delete current cart + * + * @return boolean + * + * @since 2.0.6 + */ + public static function emptyCart() + { + $cart = RedshopHelperCartSession::getCart(); + unset($cart); + + setcookie('redSHOPcart', '', time() - 3600, '/'); + + $cart['idx'] = 0; + RedshopHelperCartSession::setCart($cart); + + return RedshopHelperStockroom::deleteCartAfterEmpty(); + } +} diff --git a/libraries/redshop/helper/cart/discount.php b/libraries/redshop/helper/cart/discount.php new file mode 100644 index 00000000000..f60f4591048 --- /dev/null +++ b/libraries/redshop/helper/cart/discount.php @@ -0,0 +1,552 @@ + + * + * @since 2.0.7 + */ + public static function getDiscountCalcDataExtra($extraIds = "", $productId = 0) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('*')->from($db->qn('#__redshop_product_discount_calc_extra')); + + if (!empty($extraIds)) + { + // Secure + $extraIds = explode(',', $extraIds); + $extraIds = ArrayHelper::toInteger($extraIds); + + $query->where($db->qn('pdcextra_id') . ' IN (' . implode(',', $extraIds) . ')'); + } + + if ($productId) + { + $query->where($db->qn('product_id') . ' = ' . (int) $productId); + } + + $query->order($db->qn('option_name')); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Method for apply coupon to cart. + * + * @param array $cartData Cart data + * @param string $couponCode Coupon code for apply + * + * @return array|bool Array of cart or boolean value. + * + * @since 2.0.7 + * + * @throws Exception + */ + public static function applyCoupon($cartData = array(), $couponCode = '') + { + $couponCode = empty($couponCode) ? JFactory::getApplication()->input->getString('discount_code', '') : $couponCode; + $cart = empty($cartData) ? RedshopHelperCartSession::getCart() : $cartData; + + if (empty($couponCode)) + { + return !empty($cartData) ? $cart : false; + } + + $view = JFactory::getApplication()->input->getCmd('view', ''); + $user = JFactory::getUser(); + $db = JFactory::getDbo(); + $return = false; + + $coupon = rsCarthelper::getInstance()->getCouponData($couponCode, $cart['product_subtotal']); + + foreach ($cart['coupon'] as $cartCoupon) + { + if ($coupon->id == $cartCoupon['coupon_id']) + { + return false; + } + } + + if (!empty($coupon)) + { + $discountType = $coupon->type; + $couponId = $coupon->id; + $couponType = $coupon->effect; + $couponUser = $coupon->userid; + $userType = false; + $return = true; + $counter = 0; + + foreach ($cart['coupon'] as $key => $val) + { + if ($val['coupon_code'] == $couponCode) + { + $counter++; + } + } + + if ($coupon->amount_left <= $counter) + { + return false; + } + + if ($couponType == 1) + { + if (!$user->id) + { + return false; + } + + $query = $db->getQuery(true) + ->select('SUM(' . $db->qn('coupon_value') . ') AS usertotal') + ->from($db->qn('#__redshop_coupons_transaction')) + ->where($db->qn('userid') . ' = ' . (int) $user->id) + ->group($db->qn('userid')); + + // Set the query and load the result. + $userData = $db->setQuery($query)->loadResult(); + + if (!empty($userData)) + { + $userType = $couponUser != $userData->userid; + } + else + { + if ($couponUser != $user->id) + { + return false; + } + + $return = false; + } + } + + if (!$userType) + { + $return = true; + } + + $productSubtotal = $cart['product_subtotal']; + + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 2 || Redshop::getConfig()->get('DISCOUNT_TYPE') == 1) + { + unset($cart['voucher']); + $cart['voucher_discount'] = 0; + } + + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 4) + { + $subTotal = $productSubtotal - $cart['voucher_discount'] - $cart['cart_discount'] - $cart['coupon_discount']; + } + else + { + $subTotal = $productSubtotal - $cart['voucher_discount'] - $cart['cart_discount']; + } + + if ($subTotal <= 0) + { + $subTotal = 0; + } + + if ($discountType == 0) + { + $avgVAT = 1; + + if ((float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT') && !Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT')) + { + $avgVAT = $subTotal / $cart['product_subtotal_excl_vat']; + } + + $couponValue = $avgVAT * $coupon->value; + } + else + { + $couponValue = ($subTotal * $coupon->value) / (100); + } + + $key = rsCarthelper::getInstance()->rs_multi_array_key_exists('coupon', $cart); + + $coupons = array(); + + if (!$key) + { + $oldCoupons = array(); + $couponIndex = 0; + } + else + { + $oldCoupons = $cart['coupon']; + $couponIndex = count($oldCoupons) + 1; + } + + if ($couponValue < 0) + { + return; + } + + if (!Redshop::getConfig()->get('APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT')) + { + $couponValue = RedshopHelperDiscount::calculateAlreadyDiscount($couponValue, $cart); + } + else + { + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 1) + { + $couponValue = RedshopHelperDiscount::calculateAlreadyDiscount($couponValue, $cart); + } + } + + $couponRemaining = 0; + + if ($couponValue > $subTotal && $couponIndex === 1) + { + $couponRemaining = $couponValue - $subTotal; + $couponValue = $subTotal; + } + + if (!is_null($cart['total']) && $cart['total'] == 0 && $view != 'cart') + { + $couponValue = 0; + } + + $valueExist = is_array($cart['coupon']) ? rsCarthelper::getInstance()->rs_recursiveArraySearch($cart['coupon'], $couponCode) : 0; + + switch (Redshop::getConfig()->getInt('DISCOUNT_TYPE')) + { + case 4: + if ($valueExist) + { + $return = true; + } + + break; + + case 3: + $coupons = array(); + $oldCoupons = array(); + unset($cart['coupon']); + $return = true; + + break; + + case 2: + $coupons = array(); + $oldCoupons = array(); + unset($cart['voucher']); + unset($cart['coupon']); + $cart['voucher_discount'] = 0; + $return = true; + + break; + + case 1: + default: + $coupons = array(); + $oldCoupons = array(); + unset($cart['voucher']); + unset($cart['coupon']); + $cart['voucher_discount'] = 0; + + $return = true; + + break; + } + + if ($return) + { + $transactionCouponId = 0; + + if (rsCarthelper::getInstance()->rs_multi_array_key_exists('transaction_coupon_id', $coupon)) + { + $transactionCouponId = $coupon->transaction_coupon_id; + } + + $coupons['coupon'][$couponIndex]['coupon_code'] = $couponCode; + $coupons['coupon'][$couponIndex]['coupon_id'] = $couponId; + $coupons['coupon'][$couponIndex]['used_coupon'] = 1; + $coupons['coupon'][$couponIndex]['coupon_value'] = $couponValue; + $coupons['coupon'][$couponIndex]['remaining_coupon_discount'] = $couponRemaining; + $coupons['coupon'][$couponIndex]['transaction_coupon_id'] = $transactionCouponId; + + $coupons['coupon'] = array_merge($coupons['coupon'], $oldCoupons); + + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 1) + { + foreach ($cart as $index => $value) + { + if (!is_numeric($index)) + { + continue; + } + + $checkDiscountPrice = RedshopHelperDiscount::getDiscountPriceBaseDiscountDate($value['product_id']); + + if ($checkDiscountPrice != 0) + { + return false; + } + } + } + + $cart = array_merge($cart, $coupons); + $cart['free_shipping'] = $coupon->free_shipping; + RedshopHelperCartSession::setCart($cart); + } + } + elseif (Redshop::getConfig()->getBool('VOUCHERS_ENABLE') === true) + { + $return = self::applyVoucher(); + } + + if (!empty($cartData)) + { + return $cart; + } + + return $return; + } + + /** + * Method for apply voucher to cart. + * + * @param array $cartData Cart data + * @param string $voucherCode Voucher code + * + * @return array|bool Array of cart or boolean value. + * + * @since 2.0.7 + * + * @throws Exception + */ + public static function applyVoucher($cartData = array(), $voucherCode = '') + { + $voucherCode = empty($voucherCode) ? JFactory::getApplication()->input->getString('discount_code', '') : $voucherCode; + $cart = empty($cartData) ? RedshopHelperCartSession::getCart() : $cartData; + + if (empty($voucherCode)) + { + return !empty($cartData) ? $cart : false; + } + + $voucher = rsCarthelper::getInstance()->getVoucherData($voucherCode); + + foreach ($cart['voucher'] as $cartVoucher) + { + if ($voucher->id == $cartVoucher['voucher_id']) + { + return false; + } + } + + if (null === $voucher) + { + return !empty($cartData) ? $cart : false; + } + + $counter = 0; + + foreach ($cart['voucher'] as $val) + { + if ($val['voucher_code'] == $voucherCode) + { + $counter++; + } + } + + if ($voucher->voucher_left <= $counter) + { + return false; + } + + $return = true; + $type = $voucher->type; + $voucherId = $voucher->id; + $productId = isset($voucher->nproduct) ? $voucher->nproduct : 0; + $productArr = rsCarthelper::getInstance()->getCartProductPrice($productId, $cart); + + if (empty($productArr['product_ids'])) + { + return false; + } + + $productPrice = $productArr['product_price']; + $productIds = $productArr['product_ids']; + $productQuantity = $productArr['product_quantity']; + $productQuantity = $productQuantity > $voucher->voucher_left ? $voucher->voucher_left : $productQuantity; + + if ($type != 'Percentage') + { + $voucher->total *= $productQuantity; + $voucherValue = $voucher->total; + } + else + { + $voucherValue = ($productPrice * $voucher->total) / (100); + } + + $vouchers = array(); + $oldVouchers = array(); + + $multiArrayKeyExists = rsCarthelper::getInstance()->rs_multi_array_key_exists('voucher', $cart); + + if (!$multiArrayKeyExists) + { + $voucherIndex = 0; + } + else + { + $oldVouchers = $cart['voucher']; + $voucherIndex = count($oldVouchers) + 1; + } + + if (!Redshop::getConfig()->get('APPLY_VOUCHER_COUPON_ALREADY_DISCOUNT')) + { + $voucherValue = RedshopHelperDiscount::calculateAlreadyDiscount($voucherValue, $cart); + } + else + { + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 1) + { + $voucherValue = RedshopHelperDiscount::calculateAlreadyDiscount($voucherValue, $cart); + } + } + + $remainingVoucherDiscount = 0; + + if ($productPrice < $voucherValue) + { + $remainingVoucherDiscount = $voucherValue - $productPrice; + $voucherValue = $productPrice; + } + elseif ($cart['voucher_discount'] > 0 && ($productPrice - $cart['voucher_discount']) <= 0) + { + $remainingVoucherDiscount = $voucherValue; + $voucherValue = 0; + } + + $valueExist = is_array($cart['voucher']) ? rsCarthelper::getInstance()->rs_recursiveArraySearch($cart['voucher'], $voucherCode) : 0; + + switch (Redshop::getConfig()->get('DISCOUNT_TYPE')) + { + case 4: + if ($valueExist) + { + $return = true; + } + + break; + + case 3: + + $vouchers = array(); + $oldVouchers = array(); + unset($cart['voucher']); + $return = true; + + break; + + case 2: + if ($cart['voucher']['voucher_code'] == $voucherCode) + { + $return = false; + } + else + { + $vouchers = array(); + $oldVouchers = array(); + unset($cart['voucher']); + unset($cart['coupon']); + $cart['voucher_discount'] = 0; + $return = true; + } + + break; + + case 1: + default: + $vouchers = array(); + $oldVouchers = array(); + + unset($cart['coupon']); + + $cart['cart_discount'] = 0; + $cart['coupon_discount'] = 0; + $cart['voucher_discount'] = 0; + + $return = true; + + break; + } + + if ($return) + { + $transactionVoucherId = 0; + + if (rsCarthelper::getInstance()->rs_multi_array_key_exists('transaction_voucher_id', $voucher)) + { + $transactionVoucherId = $voucher->transaction_voucher_id; + } + + $vouchers['voucher'][$voucherIndex]['voucher_code'] = $voucherCode; + $vouchers['voucher'][$voucherIndex]['voucher_id'] = $voucherId; + $vouchers['voucher'][$voucherIndex]['product_id'] = $productIds; + $vouchers['voucher'][$voucherIndex]['used_voucher'] = $productQuantity; + $vouchers['voucher'][$voucherIndex]['voucher_value'] = $voucherValue; + $vouchers['voucher'][$voucherIndex]['remaining_voucher_discount'] = $remainingVoucherDiscount; + $vouchers['voucher'][$voucherIndex]['transaction_voucher_id'] = $transactionVoucherId; + + $vouchers['voucher'] = array_merge($vouchers['voucher'], $oldVouchers); + + if (Redshop::getConfig()->get('DISCOUNT_TYPE') == 1) + { + foreach ($cart as $index => $value) + { + if (!is_numeric($index)) + { + continue; + } + + $checkDiscountPrice = RedshopHelperDiscount::getDiscountPriceBaseDiscountDate($value['product_id']); + + if ($checkDiscountPrice != 0) + { + return false; + } + } + } + + $cart = array_merge($cart, $vouchers); + $cart['free_shipping'] = $voucher->free_ship; + + RedshopHelperCartSession::setCart($cart); + } + + if (!empty($cartData)) + { + return $cart; + } + + return $return; + } +} diff --git a/libraries/redshop/helper/cart/index.html b/libraries/redshop/helper/cart/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/helper/cart/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/helper/cart/session.php b/libraries/redshop/helper/cart/session.php new file mode 100644 index 00000000000..1e5833e0350 --- /dev/null +++ b/libraries/redshop/helper/cart/session.php @@ -0,0 +1,55 @@ +get('cart', array()); + } + + /** + * @param array $cart Cart array + * + * @return boolean|array + * + * @since 2.0.7 + */ + public static function setCart($cart) + { + return JFactory::getSession()->set('cart', $cart); + } + + /** + * Reset cart session + * + * @return void + * + * @since 2.0.7 + */ + public static function reset() + { + self::setCart(null); + } +} diff --git a/libraries/redshop/helper/cart/shipping.php b/libraries/redshop/helper/cart/shipping.php new file mode 100644 index 00000000000..06c55adaa0d --- /dev/null +++ b/libraries/redshop/helper/cart/shipping.php @@ -0,0 +1,386 @@ +get('DEFAULT_SHIPPING_COUNTRY'); + $state = ''; + $isCompany = 0; + $whereState = ''; + $whereShopper = ''; + $userId = JFactory::getUser()->id; + + if ($userInfo) + { + $country = $userInfo->country_code; + $isCompany = (int) $userInfo->is_company; + $userId = $userInfo->user_id; + $state = $userInfo->state_code; + } + + $shopperGroup = RedshopHelperUser::getShopperGroupData($userId); + + if (null !== $shopperGroup) + { + $whereShopper = ' AND (FIND_IN_SET(' . $db->quote((int) $shopperGroup->shopper_group_id) . ', ' + . $db->qn('shipping_rate_on_shopper_group') . ' ) OR ' + . $db->qn('shipping_rate_on_shopper_group') . ' = "") '; + } + + $whereCountry = '(FIND_IN_SET(' . (string) $db->quote($country) . ', ' . $db->qn('shipping_rate_country') . ') OR ' + . $db->qn('shipping_rate_country') . ' = ' . $db->quote(0) . ' OR ' . $db->qn('shipping_rate_country') . ' = "")'; + + if ($state) + { + $whereState = ' AND (FIND_IN_SET(' . (string) $db->quote($state) . ', ' . $db->qn('shipping_rate_state') . ') OR ' + . $db->qn('shipping_rate_state') . ' = ' . $db->quote(0) . ' OR ' . $db->qn('shipping_rate_state') . ' = "")'; + } + + $companyOnly = !$isCompany ? 2 : 1; + $isWhere = ' AND (' . $db->qn('company_only') . ' = ' . $companyOnly . ' OR ' . $db->qn('company_only') . ' = 0) '; + + $shippingRate = self::getShippingRateFirst( + $volume, $weightTotal, $orderSubtotal, $whereCountry, $isWhere, $whereState, $whereShopper + ); + + if (null === $shippingRate) + { + $shippingRate = self::getShippingRateSecond($volume, $weightTotal, $orderSubtotal, $whereCountry, $isWhere, $whereState, $whereShopper); + } + + if (null === $shippingRate) + { + $shippingRate = self::getShippingRateThird($volume, $weightTotal, $orderSubtotal, $whereCountry, $isWhere, $whereState, $whereShopper); + } + + self::$defaultShipping[$key] = array('shipping_rate' => 0, 'shipping_vat' => 0); + + if (null === $shippingRate) + { + return self::$defaultShipping[$key]; + } + + if ($shippingRate->apply_vat != 1) + { + self::$defaultShipping[$key]['shipping_rate'] = $shippingRate->shipping_rate_value; + + return self::$defaultShipping[$key]; + } + + $result = RedshopHelperShipping::getShippingVatRates($shippingRate->shipping_tax_group_id, $data); + $addVat = RedshopHelperCart::taxExemptAddToCart($userId); + + if (!empty($result) && $addVat && $result->tax_rate > 0) + { + $shippingVat = $shippingRate->shipping_rate_value * $result->tax_rate; + $total = $shippingVat + $shippingRate->shipping_rate_value; + + self::$defaultShipping[$key]['shipping_rate'] = $total; + self::$defaultShipping[$key]['shipping_vat'] = $shippingVat; + } + + return self::$defaultShipping[$key]; + } + + /** + * Method for get shipping rate base on weight and volume + * + * @param integer $volume Volume + * @param float $weightTotal Weight total + * @param integer $orderSubtotal Order subtotal + * @param string $whereCountry Where country + * @param string $isWhere Is where + * @param string $whereState Where state + * @param string $whereShopper Where shopper + * + * @return mixed + * + * @since 2.1.0 + */ + public static function getShippingRateFirst($volume = 0, $weightTotal = 0.0, $orderSubtotal = 0, $whereCountry = '', $isWhere = '', + $whereState = '', $whereShopper = '') + { + $cart = RedshopHelperCartSession::getCart(); + $idx = (int) $cart['idx']; + + if (!$idx) + { + return null; + } + + $db = JFactory::getDbo(); + + $productWhere = self::prepareProductWhere(); + $sql = ' SELECT * ' + . ' FROM ' . $db->qn('#__redshop_shipping_rate', 'sr') + . ' LEFT JOIN ' . $db->qn('#__extensions', 's') + . ' ON ' . $db->qn('sr.shipping_class') . ' = ' . $db->qn('s.element') + . ' WHERE ' . $db->qn('s.folder') . ' = ' . $db->quote('redshop_shipping') + . ' AND ' . $db->qn('s.enabled') . ' = 1 ' + . ' AND ' . $whereCountry . $isWhere + . ' AND ( ' + . ' ( ' . $db->qn('shipping_rate_volume_start') . ' <= ' . $db->quote($volume) + . ' AND ' . $db->qn('shipping_rate_volume_end') . ' >= ' . $db->quote($volume) . ' ) ' + . ' OR ( ' . $db->qn('shipping_rate_volume_end') . ' = 0) ' + . ' ) ' + . ' AND ( ' + . ' ( ' . $db->qn('shipping_rate_ordertotal_start') . ' <= ' . $db->quote($orderSubtotal) + . ' AND ' . $db->qn('shipping_rate_ordertotal_end') . ' >= ' . $db->quote($orderSubtotal) . ' ) ' + . ' OR ( ' . $db->qn('shipping_rate_ordertotal_end') . ' = 0 ' + . ' ) ' + . ' ) ' + . ' AND ( ' + . ' ( ' . $db->qn('shipping_rate_weight_start') . ' <= ' . $db->quote($weightTotal) + . ' AND ' . $db->qn('shipping_rate_weight_end') . ' >= ' . $db->quote($weightTotal) + . ' ) ' + . ' OR ( ' . $db->qn('shipping_rate_weight_end') . ' = 0 ) ' + . ' ) ' + . $productWhere . $whereState . $whereShopper + . ' ORDER BY ' . $db->qn('s.ordering') . ' , ' . $db->qn('sr.shipping_rate_priority') . ' LIMIT 0,1 '; + + return $db->setQuery($sql)->loadObject(); + } + + /** + * Method for prepare where product + * + * @return string + * + * @since 2.1.0 + */ + public static function prepareProductWhere() + { + $cart = RedshopHelperCartSession::getCart(); + $idx = (int) $cart['idx']; + + if (!$idx) + { + return ''; + } + + $db = JFactory::getDbo(); + + $pWhere = 'AND ( '; + + for ($i = 0; $i < $idx; $i++) + { + $productId = (int) $cart[$i]['product_id']; + + $pWhere .= 'FIND_IN_SET(' . $productId . ', ' . $db->qn('shipping_rate_on_product') . ')'; + + if ($i != $idx - 1) + { + $pWhere .= " OR "; + } + } + + $pWhere .= ")"; + + return $pWhere; + } + + /** + * Method for get shipping rate second round + * + * @param integer $volume Volume + * @param float $weightTotal Weight total + * @param integer $orderSubtotal Order subtotal + * @param string $whereCountry Where country + * @param string $isWhere Is where + * @param string $whereState Where state + * @param string $whereShopper Where shopper + * + * @return mixed + * + * @since 2.1.0 + */ + public static function getShippingRateSecond($volume = 0, $weightTotal = 0.0, $orderSubtotal = 0, $whereCountry = '', $isWhere = '', + $whereState = '', $whereShopper = '') + { + $cart = RedshopHelperCartSession::getCart(); + $idx = (int) $cart['idx']; + + if (!$idx) + { + return null; + } + + $db = JFactory::getDbo(); + + $where = self::prepareCategoryWhere(); + + $sql = "SELECT * FROM " . $db->qn('#__redshop_shipping_rate') . " AS sr + LEFT JOIN " . $db->qn('#__extensions') . " AS s + ON + " . $db->qn('sr.shipping_class') . " = " . $db->qn('s.element') . " + WHERE " . $db->qn('s.folder') . " = " . $db->quote('redshop_shipping') + . " AND " . $db->qn('s.enabled') . " = 1 AND" . $whereCountry . $whereShopper . $isWhere . " + AND ((" . $db->qn('shipping_rate_volume_start') . " <= " . $db->quote($volume) + . " AND " . $db->qn('shipping_rate_volume_end') . " >= " + . $db->quote($volume) . ") OR (" . $db->qn('shipping_rate_volume_end') . " = 0) ) + AND ((" . $db->qn('shipping_rate_ordertotal_start') . " <= " . $db->quote($orderSubtotal) + . " AND " . $db->qn('shipping_rate_ordertotal_end') . " >= " + . $db->quote($orderSubtotal) . ") OR (" . $db->qn('shipping_rate_ordertotal_end') . " = 0)) + AND ((" . $db->qn('shipping_rate_weight_start') . " <= " . $db->quote($weightTotal) + . " AND " . $db->qn('shipping_rate_weight_end') . " >= " + . $db->quote($weightTotal) . ") OR (" . $db->qn('shipping_rate_weight_end') . " = 0))" + . $where . $whereState . " + ORDER BY " . $db->qn('s.ordering') . ", " . $db->qn('sr.shipping_rate_priority') . " LIMIT 0,1"; + + return $db->setQuery($sql)->loadObject(); + } + + /** + * Method for prepare where category + * + * @return string + * + * @since 2.1.0 + */ + public static function prepareCategoryWhere() + { + $cart = RedshopHelperCartSession::getCart(); + $idx = (int) $cart['idx']; + + if (!$idx) + { + return ''; + } + + $db = JFactory::getDbo(); + + $where = ''; + + for ($i = 0; $i < $idx; $i++) + { + if (!array_key_exists('product_id', $cart[$i])) + { + continue; + } + + $productId = (int) $cart[$i]['product_id']; + $product = RedshopHelperProduct::getProductById($productId); + + if (empty($product->categories)) + { + continue; + } + + $where .= ' AND ( '; + $index = 0; + + foreach ($product->categories as $category) + { + $where .= " FIND_IN_SET(" . (int) $category . ", " . $db->qn('shipping_rate_on_category') . ") "; + + if ($index != count($product->categories) - 1) + { + $where .= " OR "; + } + + $index++; + } + + $where .= ")"; + } + + return $where; + } + + /** + * Method for get shipping rate base on weight and volume + * + * @param integer $volume Volume + * @param float $weightTotal Weight total + * @param integer $orderSubtotal Order subtotal + * @param string $whereCountry Where country + * @param string $isWhere Is where + * @param string $whereState Where state + * @param string $whereShopper Where shopper + * + * @return mixed + * + * @since 2.1.0 + */ + public static function getShippingRateThird($volume = 0, $weightTotal = 0.0, $orderSubtotal = 0, $whereCountry = '', $isWhere = '', + $whereState = '', $whereShopper = '') + { + $db = JFactory::getDbo(); + + $newProductWhere = str_replace("AND (", "OR (", self::prepareProductWhere()); + $newCwhere = str_replace("AND (", "OR (", self::prepareCategoryWhere()); + + $sql = "SELECT * FROM " . $db->qn('#__redshop_shipping_rate') . " AS sr + LEFT JOIN " . $db->qn('#__extensions') . " AS s + ON + " . $db->qn('sr.shipping_class') . " = " . $db->qn('s.element') . " + WHERE " . $db->qn('s.folder') . " = " . $db->quote('redshop_shipping') . " AND " . $db->qn('s.enabled') . " = 1 AND " + . $whereCountry . $whereShopper . $isWhere . $whereState . " + AND ((" . $db->qn('shipping_rate_volume_start') . " <= " . $db->quote($volume) + . " AND " . $db->qn('shipping_rate_volume_end') . " >= " + . $db->quote($volume) . ") OR (" . $db->qn('shipping_rate_volume_end') . " = 0) ) + AND ((" . $db->qn('shipping_rate_ordertotal_start') . " <= " . $db->quote($orderSubtotal) + . " AND " . $db->qn('shipping_rate_ordertotal_end') . " >= " + . $db->quote($orderSubtotal) . ") OR (" . $db->qn('shipping_rate_ordertotal_end') . " = 0)) + AND ((" . $db->qn('shipping_rate_weight_start') . " <= " . $db->quote($weightTotal) + . " AND " . $db->qn('shipping_rate_weight_end') . " >= " . $db->quote($weightTotal) . ")" + . " OR (" . $db->qn('shipping_rate_weight_end') . " = 0)) + AND (" . $db->qn('shipping_rate_on_product') . " = '' " . $newProductWhere . ")" + . " AND (" . $db->qn('shipping_rate_on_category') . " = '' " . $newCwhere . " ) + ORDER BY " . $db->qn('s.ordering') . ", " . $db->qn('sr.shipping_rate_priority') . " LIMIT 0,1"; + + return $db->setQuery($sql)->loadObject(); + } +} diff --git a/libraries/redshop/helper/cart/tag.php b/libraries/redshop/helper/cart/tag.php new file mode 100644 index 00000000000..c01635f67ae --- /dev/null +++ b/libraries/redshop/helper/cart/tag.php @@ -0,0 +1,833 @@ +get('SHOW_QUOTATION_PRICE')) + { + $template = str_replace("{tax}", "", $template); + $template = str_replace("{order_tax}", "", $template); + } + else + { + $template = str_replace("{tax}", RedshopHelperProductPrice::formattedPrice($amount, true), $template); + $template = str_replace("{order_tax}", RedshopHelperProductPrice::formattedPrice($amount, true), $template); + } + + if (strpos($template, '{tax_after_discount}') !== false) + { + if (Redshop::getConfig()->get('APPLY_VAT_ON_DISCOUNT') && (float) Redshop::getConfig()->get('VAT_RATE_AFTER_DISCOUNT')) + { + if ($check) + { + $taxAfterDiscount = $discount; + } + else + { + if (!isset($cart['tax_after_discount'])) + { + $taxAfterDiscount = RedshopHelperCart::calculateTaxAfterDiscount($amount, $discount); + } + else + { + $taxAfterDiscount = $cart['tax_after_discount']; + } + } + + if ($taxAfterDiscount > 0) + { + $template = str_replace("{tax_after_discount}", RedshopHelperProductPrice::formattedPrice($taxAfterDiscount), $template); + } + else + { + $template = str_replace("{tax_after_discount}", RedshopHelperProductPrice::formattedPrice($cart['tax']), $template); + } + } + else + { + $template = str_replace("{tax_after_discount}", RedshopHelperProductPrice::formattedPrice($cart['tax']), $template); + } + } + + $template = str_replace("{vat_lbl}", JText::_('COM_REDSHOP_CHECKOUT_VAT_LBL'), $template); + $template = str_replace("{if vat}", '', $template); + $template = str_replace("{vat end if}", '', $template); + + return $template; + } + + /** + * @param string $template Template + * @param int $discount Discount + * @param int $subTotal Subtotal + * @param int $quotationMode Quotation mode + * + * @return string + * + * @since 2.0.7 + */ + public static function replaceDiscount($template = '', $discount = 0, $subTotal = 0, $quotationMode = 0) + { + if (!self::isBlockTagExists($template, '{if discount}', '{discount end if}')) + { + return $template; + } + + $percentage = ''; + + if ($discount <= 0) + { + $templateDiscountSdata = explode('{if discount}', $template); + $templateDiscountEdata = explode('{discount end if}', $templateDiscountSdata[1]); + $template = $templateDiscountSdata[0] . $templateDiscountEdata[1]; + } + else + { + $template = str_replace("{if discount}", '', $template); + + if ($quotationMode && !Redshop::getConfig()->get('SHOW_QUOTATION_PRICE')) + { + $template = str_replace("{discount}", "", $template); + $template = str_replace("{discount_in_percentage}", $percentage, $template); + } + else + { + $template = str_replace("{discount}", RedshopHelperProductPrice::formattedPrice($discount, true), $template); + $template = str_replace("{order_discount}", RedshopHelperProductPrice::formattedPrice($discount, true), $template); + + if (!empty($subTotal) && $subTotal > 0) + { + $percentage = round(($discount * 100 / $subTotal), 2) . " %"; + } + + $template = str_replace("{discount_in_percentage}", $percentage, $template); + } + + $template = str_replace("{discount_lbl}", JText::_('COM_REDSHOP_CHECKOUT_DISCOUNT_LBL'), $template); + $template = str_replace("{discount end if}", '', $template); + } + + return $template; + } + + /** + * Method for replace cart item + * + * @param string $data Template Html + * @param array $cart Cart data + * @param boolean $isReplaceButton Is replace button? + * @param integer $quotationMode Is in Quotation Mode + * + * @return string + * @throws Exception + * + * @since 2.1.0 + */ + public static function replaceCartItem($data, $cart = array(), $isReplaceButton = false, $quotationMode = 0) + { + JPluginHelper::importPlugin('redshop_product'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + + $input = JFactory::getApplication()->input; + $itemId = RedshopHelperRouter::getCheckoutItemId(); + $view = $input->getCmd('view'); + + if ($itemId == 0) + { + $itemId = $input->getInt('Itemid'); + } + + $cartResponse = ''; + $idx = $cart['idx']; + $fieldArray = RedshopHelperExtrafields::getSectionFieldList( + RedshopHelperExtrafields::SECTION_PRODUCT_FINDER_DATE_PICKER, 0, 0 + ); + + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . Redshop::getConfig()->get('ADDTOCART_DELETE'))) + { + $deleteImg = Redshop::getConfig()->get('ADDTOCART_DELETE'); + } + else + { + $deleteImg = "defaultcross.png"; + } + + for ($i = 0; $i < $idx; $i++) + { + $cartHtml = $data; + + // Plugin support: Process the product plugin for cart item + $dispatcher->trigger('onCartItemDisplay', array(&$cartHtml, $cart, $i)); + + $quantity = $cart[$i]['quantity']; + + if (isset($cart[$i]['giftcard_id']) && $cart[$i]['giftcard_id']) + { + $giftCardId = $cart[$i]['giftcard_id']; + $giftcard = RedshopEntityGiftcard::getInstance($giftCardId)->getItem(); + $link = JRoute::_('index.php?option=com_redshop&view=giftcard&gid=' . $giftCardId . '&Itemid=' . $itemId); + $receiverInfor = '
    ' . JText::_('LIB_REDSHOP_GIFTCARD_RECIVER_NAME_LBL') . ': ' . $cart[$i]['reciver_name'] + . '
    ' . JText::_('LIB_REDSHOP_GIFTCARD_RECIVER_EMAIL_LBL') . ': ' . $cart[$i]['reciver_email'] . '
    '; + $productName = "" . $receiverInfor; + + if (strpos($cartHtml, "{product_name_nolink}") !== false) + { + $productNameNoLink = "
    " . $giftcard->giftcard_name . "
    <" . $receiverInfor; + $cartHtml = str_replace("{product_name_nolink}", $productNameNoLink, $cartHtml); + + if (strpos($cartHtml, "{product_name}") !== false) + { + $cartHtml = str_replace("{product_name}", "", $cartHtml); + } + } + else + { + $cartHtml = str_replace("{product_name}", $productName, $cartHtml); + } + + $cartHtml = str_replace("{product_attribute}", '', $cartHtml); + $cartHtml = str_replace("{product_accessory}", '', $cartHtml); + $cartHtml = str_replace("{product_wrapper}", '', $cartHtml); + $cartHtml = str_replace("{product_old_price}", '', $cartHtml); + $cartHtml = str_replace("{vat_info}", '', $cartHtml); + $cartHtml = str_replace("{product_number_lbl}", '', $cartHtml); + $cartHtml = str_replace("{product_number}", '', $cartHtml); + $cartHtml = str_replace("{attribute_price_without_vat}", '', $cartHtml); + $cartHtml = str_replace("{attribute_price_with_vat}", '', $cartHtml); + + if ($quotationMode && !Redshop::getConfig()->getBool('SHOW_QUOTATION_PRICE')) + { + $cartHtml = str_replace("{product_total_price}", "", $cartHtml); + $cartHtml = str_replace("{product_price}", "", $cartHtml); + } + else + { + $cartHtml = str_replace("{product_price}", RedshopHelperProductPrice::formattedPrice($cart[$i]['product_price']), $cartHtml); + $cartHtml = str_replace( + "{product_total_price}", + RedshopHelperProductPrice::formattedPrice($cart[$i]['product_price'] * $cart[$i]['quantity'], true), + $cartHtml + ); + } + + $cartHtml = str_replace("{if product_on_sale}", '', $cartHtml); + $cartHtml = str_replace("{product_on_sale end if}", '', $cartHtml); + + $thumbUrl = RedshopHelperMedia::getImagePath( + $giftcard->giftcard_image, + '', + 'thumb', + 'giftcard', + Redshop::getConfig()->get('CART_THUMB_WIDTH'), + Redshop::getConfig()->get('CART_THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $giftCardImage = " "; + + if ($thumbUrl) + { + $giftCardImage = "
    "; + } + + $cartHtml = str_replace("{product_thumb_image}", $giftCardImage, $cartHtml); + $productUserFields = productHelper::getInstance()->GetProdcutUserfield($i, 13); + $cartHtml = str_replace("{product_userfields}", $productUserFields, $cartHtml); + $cartHtml = str_replace( + "{product_price_excl_vat}", + RedshopHelperProductPrice::formattedPrice($cart[$i]['product_price']), + $cartHtml + ); + $cartHtml = str_replace( + "{product_total_price_excl_vat}", + RedshopHelperProductPrice::formattedPrice($cart[$i]['product_price'] * $cart[$i]['quantity']), + $cartHtml + ); + $cartHtml = str_replace("{attribute_change}", '', $cartHtml); + $cartHtml = str_replace("{product_attribute_price}", "", $cartHtml); + $cartHtml = str_replace("{product_attribute_number}", "", $cartHtml); + $cartHtml = str_replace("{product_tax}", "", $cartHtml); + + // ProductFinderDatepicker Extra Field + $cartHtml = productHelper::getInstance()->getProductFinderDatepickerValue($cartHtml, $giftCardId, $fieldArray, 1); + + $removeProduct = '
    + + + + + ' . JText::_('COM_REDSHOP_DELETE_PRODUCT_FROM_CART_LBL')
+					. '
    '; + + if (Redshop::getConfig()->getBool('QUANTITY_TEXT_DISPLAY')) + { + $cartHtml = str_replace("{remove_product}", $removeProduct, $cartHtml); + } + else + { + $cartHtml = str_replace("{remove_product}", $removeProduct, $cartHtml); + } + + // Replace attribute tags to empty on giftcard + if (strpos($cartHtml, "{product_attribute_loop_start}") !== false && strpos($cartHtml, "{product_attribute_loop_end}") !== false) + { + $templateAttrStart = explode('{product_attribute_loop_start}', $cartHtml); + $templateAttrEnd = explode('{product_attribute_loop_end}', $templateAttrStart[1]); + $templateAttrMiddle = $templateAttrEnd[0]; + + $cartHtml = str_replace($templateAttrMiddle, "", $cartHtml); + } + + $cartItem = 'giftCardId'; + } + else + { + $productId = $cart[$i]['product_id']; + $product = RedshopHelperProduct::getProductById($productId); + $catId = $product->cat_in_sefurl; + $attributeCart = productHelper::getInstance()->makeAttributeCart( + $cart[$i]['cart_attribute'], $productId, 0, 0, $quantity, $cartHtml + ); + $cartAttribute = $attributeCart[0]; + $retAccArr = productHelper::getInstance()->makeAccessoryCart($cart [$i] ['cart_accessory'], $productId, $cartHtml); + $cartAccessory = $retAccArr[0]; + + $itemData = productHelper::getInstance()->getMenuInformation(0, 0, '', 'product&pid=' . $productId); + + if (!empty($itemData)) + { + $itemId = $itemData->id; + } + else + { + $itemId = RedshopHelperUtility::getCategoryItemid($catId); + } + + $link = JRoute::_('index.php?option=com_redshop&view=product&cid='. $catId .'&pid=' . $productId . '&Itemid=' . $itemId); + + // Trigger to change product link. + $dispatcher->trigger('onSetCartOrderItemProductLink', array(&$cart, &$link, $product, $i)); + + $productName = ""; + $productImage = ""; + $productImg = ''; + $type = 'product'; + + if (Redshop::getConfig()->get('WANT_TO_SHOW_ATTRIBUTE_IMAGE_INCART') && isset($cart[$i]['hidden_attribute_cartimage'])) + { + $imagePath = REDSHOP_FRONT_IMAGES_ABSPATH; + $productImage = str_replace($imagePath, '', $cart[$i]['hidden_attribute_cartimage']); + } + + if ($productImage && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . $productImage)) + { + $val = explode("/", $productImage); + $productImg = $val[1]; + $type = $val[0]; + } + elseif ($product->product_full_image && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $product->product_full_image)) + { + $productImg = $product->product_full_image; + $type = 'product'; + } + elseif (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'))) + { + $productImg = Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'); + $type = 'product'; + } + + $isAttributeImage = false; + + if (isset($cart[$i]['attributeImage'])) + { + $isAttributeImage = JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "mergeImages/" . $cart[$i]['attributeImage']); + } + + if ($isAttributeImage) + { + $productImg = $cart[$i]['attributeImage']; + $type = 'mergeImages'; + } + + if ($productImg !== '') + { + if (Redshop::getConfig()->getBool('WATERMARK_CART_THUMB_IMAGE') + && JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . Redshop::getConfig()->get('WATERMARK_IMAGE'))) + { + $productCartImg = RedshopHelperMedia::watermark( + $type, + $productImg, + Redshop::getConfig()->getInt('CART_THUMB_WIDTH'), + Redshop::getConfig()->getInt('CART_THUMB_HEIGHT'), + Redshop::getConfig()->get('WATERMARK_CART_THUMB_IMAGE') + ); + + $productImage = "
    "; + } + else + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $productImg, + '', + 'thumb', + $type, + Redshop::getConfig()->getInt('CART_THUMB_WIDTH'), + Redshop::getConfig()->getInt('CART_THUMB_HEIGHT'), + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $productImage = "
    "; + } + } + else + { + $productImage = "
    "; + } + + // Trigger to change product image. + $dispatcher->trigger('onSetCartOrderItemImage', array(&$cart, &$productImage, $product, $i)); + + $isApplyVAT = \Redshop\Template\Helper::isApplyVat($data); + $productTotalPrice = "
    "; + + if (!$quotationMode || ($quotationMode && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) + { + if (!$isApplyVAT) + { + $productTotalPrice .= RedshopHelperProductPrice::formattedPrice($cart[$i]['product_price_excl_vat'] * $quantity); + } + else + { + $productTotalPrice .= RedshopHelperProductPrice::formattedPrice($cart[$i]['product_price'] * $quantity); + } + } + + $productTotalPrice .= "
    "; + + $productOldPrice = ""; + $productOldPriceNoFormat = ''; + $productPrice = "
    "; + + if (!$quotationMode || ($quotationMode && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) + { + if (!$isApplyVAT) + { + $productPrice .= RedshopHelperProductPrice::formattedPrice($cart[$i]['product_price_excl_vat'], true); + } + else + { + $productPrice .= RedshopHelperProductPrice::formattedPrice($cart[$i]['product_price'], true); + } + + if (isset($cart[$i]['product_old_price'])) + { + $productOldPrice = $cart[$i]['product_old_price']; + + if (!$isApplyVAT) + { + $productOldPrice = $cart[$i]['product_old_price_excl_vat']; + } + + // Set Product Old Price without format + $productOldPriceNoFormat = $productOldPrice; + + $productOldPrice = RedshopHelperProductPrice::formattedPrice($productOldPrice, true); + } + } + + $productPrice .= "
    "; + $wrapperName = ""; + + if ((array_key_exists('wrapper_id', $cart[$i])) && $cart[$i]['wrapper_id']) + { + $wrapper = productHelper::getInstance()->getWrapper($productId, $cart[$i]['wrapper_id']); + + if (count($wrapper) > 0) + { + $wrapperName = JText::_('COM_REDSHOP_WRAPPER') . ": " . $wrapper[0]->wrapper_name; + + if (!$quotationMode || ($quotationMode && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) + { + $wrapperName .= "(" . RedshopHelperProductPrice::formattedPrice($cart[$i]['wrapper_price'], true) . ")"; + } + } + } + + if (strpos($cartHtml, "{product_name_nolink}") !== false) + { + $productNameNoLink = "
    $product->product_name
    "; + $cartHtml = str_replace("{product_name_nolink}", $productNameNoLink, $cartHtml); + + if (strpos($cartHtml, "{product_name}") !== false) + { + $cartHtml = str_replace("{product_name}", "", $cartHtml); + } + } + else + { + $cartHtml = str_replace("{product_name}", $productName, $cartHtml); + } + + $cartHtml = str_replace("{product_s_desc}", $product->product_s_desc, $cartHtml); + + // Replace Attribute data + if (strpos($cartHtml, "{product_attribute_loop_start}") !== false && strpos($cartHtml, "{product_attribute_loop_end}") !== false) + { + $templateAttrStart = explode('{product_attribute_loop_start}', $cartHtml); + $templateAttrEnd = explode('{product_attribute_loop_end}', $templateAttrStart[1]); + $templateAttrMiddle = $templateAttrEnd[0]; + $productDetail = ''; + $sumTotal = count($cart[$i]['cart_attribute']); + $tempAttribute = $cart[$i]['cart_attribute']; + + if ($sumTotal > 0) + { + $propertyCalculatedPriceSum = $productOldPriceNoFormat; + + for ($tpi = 0; $tpi < $sumTotal; $tpi++) + { + $productAttributeValue = ""; + $productAttributeValuePrice = ""; + $productAttributeName = $tempAttribute[$tpi]['attribute_name']; + + $productAttributeCalculatedPrice = ''; + + if (count($tempAttribute[$tpi]['attribute_childs']) > 0) + { + $productAttributeValue = ": " . $tempAttribute[$tpi]['attribute_childs'][0]['property_name']; + + if (count($tempAttribute[$tpi]['attribute_childs'][0]['property_childs']) > 0) + { + $productAttributeValue .= ": " + . $tempAttribute[$tpi]['attribute_childs'][0]['property_childs'][0]['subattribute_color_title'] + . ": " . $tempAttribute[$tpi]['attribute_childs'][0]['property_childs'][0]['subproperty_name']; + } + + $productAttributeValuePrice = $tempAttribute[$tpi]['attribute_childs'][0]['property_price']; + $propertyOperand = $tempAttribute[$tpi]['attribute_childs'][0]['property_oprand']; + + if (count($tempAttribute[$tpi]['attribute_childs'][0]['property_childs']) > 0) + { + $productAttributeValuePrice = $productAttributeValuePrice + + $tempAttribute[$tpi]['attribute_childs'][0]['property_childs'][0]['subproperty_price']; + + $propertyOperand = $tempAttribute[$tpi]['attribute_childs'][0]['property_childs'][0]['subproperty_oprand']; + } + + // Show actual productive price + if ($productAttributeValuePrice > 0) + { + $productAttributeCalculatedPriceBase = RedshopHelperUtility::setOperandForValues( + $propertyCalculatedPriceSum, $propertyOperand, $productAttributeValuePrice + ); + + $productAttributeCalculatedPrice = $productAttributeCalculatedPriceBase - $propertyCalculatedPriceSum; + $propertyCalculatedPriceSum = $productAttributeCalculatedPriceBase; + } + + $productAttributeValuePrice = RedshopHelperProductPrice::formattedPrice((double) $productAttributeValuePrice); + } + + $productAttributeCalculatedPrice = RedshopHelperProductPrice::formattedPrice((double) $productAttributeCalculatedPrice); + $productAttributeCalculatedPrice = JText::sprintf( + 'COM_REDSHOP_CART_PRODUCT_ATTRIBUTE_CALCULATED_PRICE', + $productAttributeCalculatedPrice + ); + + $productHtml = $templateAttrMiddle; + $productHtml = str_replace("{product_attribute_name}", $productAttributeName, $productHtml); + $productHtml = str_replace("{product_attribute_value}", $productAttributeValue, $productHtml); + $productHtml = str_replace("{product_attribute_value_price}", $productAttributeValuePrice, $productHtml); + $productHtml = str_replace( + "{product_attribute_calculated_price}", + $productAttributeCalculatedPrice, + $productHtml + ); + + $productDetail .= $productHtml; + } + } + + $cartHtml = str_replace($templateAttrMiddle, $productDetail, $cartHtml); + } + + if (count($cart [$i] ['cart_attribute']) > 0) + { + $cartHtml = str_replace("{attribute_label}", JText::_("COM_REDSHOP_ATTRIBUTE"), $cartHtml); + } + else + { + $cartHtml = str_replace("{attribute_label}", "", $cartHtml); + } + + $cartHtml = str_replace("{product_number}", $product->product_number, $cartHtml); + $cartHtml = str_replace("{product_vat}", $cart[$i]['product_vat'] * $cart[$i]['quantity'], $cartHtml); + $productUserFields = productHelper::getInstance()->GetProdcutUserfield($i); + $cartHtml = str_replace("{product_userfields}", $productUserFields, $cartHtml); + $productFields = productHelper::getInstance()->GetProdcutfield($i); + $cartHtml = str_replace("{product_customfields}", $productFields, $cartHtml); + $cartHtml = str_replace("{product_customfields_lbl}", JText::_("COM_REDSHOP_PRODUCT_CUSTOM_FIELD"), $cartHtml); + $discountCalcOutput = isset($cart[$i]['discount_calc_output']) && $cart[$i]['discount_calc_output'] + ? $cart[$i]['discount_calc_output'] . "
    " : ""; + + $cartHtml = RedshopTagsReplacer::_( + 'attribute', + $cartHtml, + array( + 'product_attribute' => $discountCalcOutput . $cartAttribute, + ) + ); + + $cartHtml = str_replace("{product_accessory}", $cartAccessory, $cartHtml); + $cartHtml = str_replace("{product_attribute_price}", "", $cartHtml); + $cartHtml = str_replace("{product_attribute_number}", "", $cartHtml); + $cartHtml = productHelper::getInstance()->getProductOnSaleComment($product, $cartHtml); + $cartHtml = str_replace("{product_old_price}", $productOldPrice, $cartHtml); + $cartHtml = str_replace("{product_wrapper}", $wrapperName, $cartHtml); + $cartHtml = str_replace("{product_thumb_image}", $productImage, $cartHtml); + $cartHtml = str_replace("{attribute_price_without_vat}", '', $cartHtml); + $cartHtml = str_replace("{attribute_price_with_vat}", '', $cartHtml); + + // ProductFinderDatepicker Extra Field Start + $cartHtml = productHelper::getInstance()->getProductFinderDatepickerValue($cartHtml, $productId, $fieldArray); + + $productPriceNoVAT = $cart[$i]['product_price_excl_vat']; + + if (!$quotationMode || ($quotationMode && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE'))) + { + $cartHtml = str_replace( + "{product_price_excl_vat}", + RedshopHelperProductPrice::formattedPrice($productPriceNoVAT), + $cartHtml + ); + + $cartHtml = str_replace( + "{product_total_price_excl_vat}", + RedshopHelperProductPrice::formattedPrice($productPriceNoVAT * $quantity), + $cartHtml + ); + } + else + { + $cartHtml = str_replace("{product_price_excl_vat}", "", $cartHtml); + $cartHtml = str_replace("{product_total_price_excl_vat}", "", $cartHtml); + } + + if ($product->product_type == 'subscription') + { + $subscriptionDetail = productHelper::getInstance()->getProductSubscriptionDetail( + $product->product_id, $cart[$i]['subscription_id'] + ); + $selectedSubscription = $subscriptionDetail->subscription_period . " " . $subscriptionDetail->period_type; + $cartHtml = str_replace("{product_subscription_lbl}", JText::_('COM_REDSHOP_SUBSCRIPTION'), $cartHtml); + $cartHtml = str_replace("{product_subscription}", $selectedSubscription, $cartHtml); + } + else + { + $cartHtml = str_replace("{product_subscription_lbl}", "", $cartHtml); + $cartHtml = str_replace("{product_subscription}", "", $cartHtml); + } + + if ($isReplaceButton) + { + $updateAttribute = ''; + + if ($view == 'cart') + { + $attrChange = JURI::root() . 'index.php?option=com_redshop&view=cart&layout=change_attribute&tmpl=component&pid=' . $productId . '&cart_index=' . $i; + $updateAttribute = '' . JText::_('COM_REDSHOP_CHANGE_ATTRIBUTE') . ''; + } + + if ($cartAttribute != "") + { + $cartHtml = str_replace("{attribute_change}", $updateAttribute, $cartHtml); + } + else + { + $cartHtml = str_replace("{attribute_change}", "", $cartHtml); + } + } + else + { + $cartHtml = str_replace("{attribute_change}", '', $cartHtml); + } + + // Product extra fields. + $cartHtml = RedshopHelperProductTag::getExtraSectionTag( + Redshop\Helper\ExtraFields::getSectionFieldNames(RedshopHelperExtrafields::SECTION_PRODUCT), $productId, "1", $cartHtml + ); + + $cartItem = 'productId'; + $cartHtml = RedshopHelperTax::replaceVatInformation($cartHtml); + $cartHtml = str_replace("{product_price}", $productPrice, $cartHtml); + $cartHtml = str_replace("{product_total_price}", $productTotalPrice, $cartHtml); + } + + if ($isReplaceButton) + { + $updateCartNone = ''; + $updateImage = ''; + + if ($view == 'checkout') + { + $updateCart = $quantity; + } + else + { + $updateCart = '
    ' + . '' + . '' + . '' + . '' + . ''; + + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . Redshop::getConfig()->get('ADDTOCART_UPDATE'))) + { + $updateImage = Redshop::getConfig()->get('ADDTOCART_UPDATE'); + } + else + { + $updateImage = "defaultupdate.png"; + } + + $updateCart .= ''
+						. JText::_('COM_REDSHOP_UPDATE_PRODUCT_FROM_CART_LBL')
+						. ''; + + $updateCart .= '
    '; + } + + $updateCartMinusPlus = '
    '; + + $updateCartMinusPlus .= ''; + + $updateCartMinusPlus .= ' + + + ' . JText::_('COM_REDSHOP_UPDATE_PRODUCT_FROM_CART_LBL') . ' +
    '; + + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . Redshop::getConfig()->get('ADDTOCART_DELETE'))) + { + $deleteImg = Redshop::getConfig()->get('ADDTOCART_DELETE'); + } + else + { + $deleteImg = "defaultcross.png"; + } + + if ($view == 'checkout') + { + $removeProduct = ''; + } + else + { + $removeProduct = '
    + + + + + ' . JText::_('COM_REDSHOP_DELETE_PRODUCT_FROM_CART_LBL') . '
    '; + } + + if (Redshop::getConfig()->get('QUANTITY_TEXT_DISPLAY')) + { + if (strstr($cartHtml, "{quantity_increase_decrease}") && $view != 'checkout') + { + $cartHtml = str_replace("{quantity_increase_decrease}", $updateCartMinusPlus, $cartHtml); + $cartHtml = str_replace("{update_cart}", '', $cartHtml); + } + else + { + $cartHtml = str_replace("{quantity_increase_decrease}", $updateCart, $cartHtml); + $cartHtml = str_replace("{update_cart}", $updateCart, $cartHtml); + } + + $cartHtml = str_replace("{remove_product}", $removeProduct, $cartHtml); + } + else + { + $cartHtml = str_replace("{quantity_increase_decrease}", $updateCartMinusPlus, $cartHtml); + $cartHtml = str_replace("{update_cart}", $updateCartNone, $cartHtml); + $cartHtml = str_replace("{remove_product}", $removeProduct, $cartHtml); + } + } + else + { + $cartHtml = str_replace("{update_cart}", $quantity, $cartHtml); + $cartHtml = str_replace("{remove_product}", '', $cartHtml); + } + + $cartResponse .= $cartHtml; + } + + return $cartResponse; + } +} diff --git a/libraries/redshop/helper/catalog.php b/libraries/redshop/helper/catalog.php new file mode 100644 index 00000000000..3d872aeea94 --- /dev/null +++ b/libraries/redshop/helper/catalog.php @@ -0,0 +1,303 @@ +getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_catalog_request')) + ->where($db->qn('block') . ' = 0'); + + $catalogs = $db->setQuery($query)->loadObjectList(); + + if (empty($catalogs)) + { + return; + } + + $config = JFactory::getConfig(); + $from = $config->get('mailfrom'); + $fromName = $config->get('fromname'); + $formattedDate = JFactory::getDate()->format('Y-m-d'); + + foreach ($catalogs as $catalog) + { + self::sendFirstReminder($catalog, $formattedDate, $from, $fromName); + + if ($catalog->reminder_2 == 0) + { + self::sendSecondReminder($catalog, $formattedDate, $from, $fromName); + } + elseif ($catalog->reminder_3 == 0) + { + self::sendThirdReminder($catalog, $formattedDate, $from, $fromName); + } + } + } + + /** + * Method for send first reminder of catalog + * + * @param object $catalog Catalog data + * @param string $currentDate Current date + * @param string $from Email from for send mail + * @param string $fromName Name for send mail + * + * @return void + * + * @since 2.0.6 + */ + public static function sendFirstReminder($catalog = null, $currentDate = '', $from = '', $fromName = '') + { + if (empty($catalog) || !is_object($catalog) || $catalog->reminder_1 != 0) + { + return; + } + + $currentDate = empty($currentDate) ? JFactory::getDate()->format('Y-m-d') : $currentDate; + $sendDate = date("Y-m-d", $catalog->registerDate + (Redshop::getConfig()->get('CATALOG_REMINDER_1') * (60 * 60 * 24))); + + if ($currentDate != $sendDate) + { + return; + } + + $from = empty($from) ? JFactory::getConfig()->get('mailfrom') : $from; + $fromName = empty($fromName) ? JFactory::getConfig()->get('fromname') : $fromName; + + $mailBody = ""; + $subject = ""; + $mailBcc = null; + $mailData = Redshop\Mail\Helper::getTemplate(0, "catalog_first_reminder"); + + if (count($mailData) > 0) + { + $mailData = $mailData[0]; + $mailBody = $mailData->mail_body; + $subject = $mailData->mail_subject; + + if (trim($mailData->mail_bcc) != "") + { + $mailBcc = explode(",", $mailData->mail_bcc); + } + } + + $body = str_replace("{name}", $catalog->name, $mailBody); + $body = str_replace("{discount}", Redshop::getConfig()->get('DISCOUNT_PERCENTAGE'), $body); + + Redshop\Mail\Helper::imgInMail($body); + + if (JFactory::getMailer()->sendMail($from, $fromName, $catalog->email, $subject, $body, 1, null, $mailBcc)) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_catalog_request')) + ->set($db->qn('reminder_1') . ' = ' . $db->quote(1)) + ->where($db->qn('catalog_user_id') . ' = ' . $catalog->catalog_user_id); + + $db->setQuery($query)->execute(); + } + } + + /** + * Method for send second reminder of catalog + * + * @param object $catalog Catalog data + * @param string $currentDate Current date + * @param string $from Email from for send mail + * @param string $fromName Name for send mail + * + * @return void + * + * @since 2.0.6 + */ + public static function sendSecondReminder($catalog = null, $currentDate = '', $from = '', $fromName = '') + { + if (empty($catalog) || !is_object($catalog) || $catalog->reminder_2 != 0) + { + return; + } + + $currentDate = empty($currentDate) ? JFactory::getDate()->format('Y-m-d') : $currentDate; + $sendDate = date("Y-m-d", $catalog->registerDate + (Redshop::getConfig()->get('CATALOG_REMINDER_2') * (60 * 60 * 24))); + + if ($currentDate != $sendDate) + { + return; + } + + $from = empty($from) ? JFactory::getConfig()->get('mailfrom') : $from; + $fromName = empty($fromName) ? JFactory::getConfig()->get('fromname') : $fromName; + $token = md5(uniqid(mt_rand(), true)); + $token = substr($token, 0, 10); + $startDate = mktime(0, 0, 0, date("m"), date("d"), date("Y")); + $endDate = $startDate + (Redshop::getConfig()->get('DISCOUNT_DURATION') * 23 * 59 * 59); + + $mailBody = ""; + $subject = ""; + $mailBcc = null; + $mailData = Redshop\Mail\Helper::getTemplate(0, "catalog_second_reminder"); + + if (count($mailData) > 0) + { + $mailData = $mailData[0]; + $mailBody = $mailData->mail_body; + $subject = $mailData->mail_subject; + + if (trim($mailData->mail_bcc) != "") + { + $mailBcc = explode(",", $mailData->mail_bcc); + } + } + + $body = str_replace("{name}", $catalog->name, $mailBody); + $body = str_replace("{days}", Redshop::getConfig()->get('DISCOUNT_DURATION'), $body); + $body = str_replace("{discount}", Redshop::getConfig()->get('DISCOUNT_PERCENTAGE'), $body); + $body = str_replace("{coupon_code}", $token, $body); + Redshop\Mail\Helper::imgInMail($body); + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('id')) + ->from($db->qn('#__users')) + ->where($db->qn('email') . ' = ' . $db->quote($catalog->email)); + + $uid = $db->setQuery($query)->loadResult(); + + $query->clear() + ->insert($db->qn('#__redshop_coupons')) + ->columns( + $db->qn( + array('code', 'type', 'value', 'start_date', 'end_date', 'effect', 'userid', 'published') + ) + ) + ->values( + $db->quote($token) . ',' . $db->quote(1) . ',' . $db->quote(Redshop::getConfig()->get('DISCOUNT_PERCENTAGE')) . ',' . + $db->quote($startDate) . ',' . $db->quote($endDate) . ',' . $db->quote(1) . ',' . $db->quote($uid) . ',' . $db->quote(1) + ); + + $db->setQuery($query)->execute(); + + if (JFactory::getMailer()->sendMail($from, $fromName, $catalog->email, $subject, $body, 1, null, $mailBcc)) + { + $query->clear() + ->update($db->qn('#__redshop_catalog_request')) + ->set($db->qn('reminder_2') . ' = ' . $db->quote(1)) + ->where($db->qn('catalog_user_id') . ' = ' . $catalog->catalog_user_id); + + $db->setQuery($query)->execute(); + } + } + + /** + * Method for send second reminder of catalog + * + * @param object $catalog Catalog data + * @param string $currentDate Current date + * @param string $from Email from for send mail + * @param string $fromName Name for send mail + * + * @return void + * + * @since 2.0.6 + */ + public static function sendThirdReminder($catalog = null, $currentDate = '', $from = '', $fromName = '') + { + if (empty($catalog) || !is_object($catalog) || $catalog->reminder_3 != 0) + { + return; + } + + $currentDate = empty($currentDate) ? JFactory::getDate()->format('Y-m-d') : $currentDate; + + // Coupon reminder + $sendDate = date( + "Y-m-d", + $catalog->registerDate + (Redshop::getConfig()->get('DISCOUNT_DURATION') * (60 * 60 * 24)) + (4 * 60 * 60 * 24) + ); + + if ($currentDate != $sendDate) + { + return; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('id')) + ->from($db->qn('#__users')) + ->where($db->qn('email') . ' = ' . $db->quote($catalog->email)); + + $uid = $db->setQuery($query)->loadResult(); + + $query->clear() + ->select($db->qn('id')) + ->from($db->qn('#__redshop_coupons')) + ->where($db->qn('userid') . ' = ' . $db->quote($uid)); + + $couponCode = $db->setQuery($query)->loadResult(); + + $from = empty($from) ? JFactory::getConfig()->get('mailfrom') : $from; + $fromName = empty($fromName) ? JFactory::getConfig()->get('fromname') : $fromName; + + $mailBody = ""; + $subject = ""; + $mailBcc = null; + $mailData = Redshop\Mail\Helper::getTemplate(0, "catalog_coupon_reminder"); + + if (count($mailData) > 0) + { + $mailData = $mailData[0]; + $mailBody = $mailData->mail_body; + $subject = $mailData->mail_subject; + + if (trim($mailData->mail_bcc) != "") + { + $mailBcc = explode(",", $mailData->mail_bcc); + } + } + + $body = str_replace("{name}", $catalog->name, $mailBody); + $body = str_replace("{discount}", Redshop::getConfig()->get('DISCOUNT_PERCENTAGE'), $body); + $body = str_replace("{coupon_code}", $couponCode, $body); + Redshop\Mail\Helper::imgInMail($body); + + if (JFactory::getMailer()->sendMail($from, $fromName, $catalog->email, $subject, $body, 1, null, $mailBcc)) + { + $query->clear() + ->update($db->qn('#__redshop_catalog_request')) + ->set($db->qn('reminder_3') . ' = ' . $db->quote(1)) + ->where($db->qn('catalog_user_id') . ' = ' . $catalog->catalog_user_id); + + $db->setQuery($query)->execute(); + } + } +} diff --git a/libraries/redshop/helper/category.php b/libraries/redshop/helper/category.php new file mode 100644 index 00000000000..6c3abe0714a --- /dev/null +++ b/libraries/redshop/helper/category.php @@ -0,0 +1,578 @@ +getItem(); + } + + /** + * Get Category List Reverse Array + * + * @param string $cid Category id + * + * @return array + */ + public static function getCategoryListReverseArray($cid = '0') + { + self::$categoryListReverse = array(); + + if ($category = self::getCategoryById($cid)) + { + if (isset($category->parent_id)) + { + self::getCategoryListRecursion($category->parent_id); + } + } + + return self::$categoryListReverse; + } + + /** + * Get Category List Recursion + * + * @param string $cid Category id + * + * @return void + */ + private static function getCategoryListRecursion($cid = '0') + { + if ($category = self::getCategoryById($cid)) + { + if (isset($category->parent_id)) + { + self::$categoryListReverse[] = $category; + self::getCategoryListRecursion($category->parent_id); + } + } + } + + /** + * Get Category List Array + * + * @param int $categoryId First category level in filter + * @param int $cid Current category id + * + * @return array|mixed + * + * @throws Exception + */ + public static function getCategoryListArray($categoryId = null, $cid = null) + { + global $context; + + $app = JFactory::getApplication(); + $db = JFactory::getDbo(); + $view = $app->input->getCmd('view', ''); + + $categoryMainFilter = $app->getUserStateFromRequest($context . 'category_main_filter', 'category_main_filter', 0); + + if ($categoryId) + { + $cid = (int) $categoryId; + } + + $key = $context . '_' . $view . '_' . $categoryMainFilter . '_' . $cid; + + if (array_key_exists($key, static::$categoryChildListReverse)) + { + return static::$categoryChildListReverse[$key]; + } + + $query = $db->getQuery(true) + ->select( + $db->qn( + array( + 'id', 'parent_id', 'name', 'description', + 'published', 'ordering', 'category_full_image' + ) + ) + ) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('parent_id') . ' != 0') + ->where($db->qn('level') . ' > 0') + ->where($db->qn('published') . ' = 1') + ->order($db->qn('lft')); + + if ($view == 'category') + { + $filter_order = urldecode($app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'ordering')); + $filter_order_Dir = urldecode($app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', '')); + $query->order($db->escape($filter_order . ' ' . $filter_order_Dir)); + } + else + { + $query->order($db->qn('name')); + } + + if ($categoryMainFilter) + { + $query->where($db->qn('name') . ' LIKE ' . $db->q('%' . $categoryMainFilter . '%')); + } + else + { + if ($cid !== null) + { + $query->where($db->qn('parent_id') . ' = ' . (int) $cid); + } + } + + static::$categoryChildListReverse[$key] = null; + + if ($cats = $db->setQuery($query)->loadObjectList()) + { + if ($categoryMainFilter) + { + static::$categoryChildListReverse[$key] = $cats; + + return $cats; + } + + static::$categoryChildListReverse[$key] = array(); + + foreach ($cats as $cat) + { + $cat->name = '- ' . $cat->name; + + static::$categoryChildListReverse[$key][] = $cat; + self::getCategoryChildListRecursion($key, $cat->id); + } + } + + return self::$categoryChildListReverse[$key]; + } + + /** + * Get Category Child List Recursion + * + * @param string $key Key in array Child List + * @param int $cid Category id + * @param int $level Level current category + * + * @return void + */ + protected static function getCategoryChildListRecursion($key, $cid, $level = 1) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select( + $db->qn( + array( + 'id', 'parent_id', 'name', 'description', + 'published', 'ordering', 'category_full_image' + ) + ) + ) + ->from($db->qn('#__redshop_category')) + ->where('parent_id = ' . (int) $cid); + $level++; + + $cats = $db->setQuery($query)->loadObjectList(); + + if (!empty($cats)) + { + foreach ($cats as $cat) + { + $cat->name = str_repeat('- ', $level) . $cat->name; + + static::$categoryChildListReverse[$key][] = $cat; + self::getCategoryChildListRecursion($key, $cat->id, $level); + } + } + } + + /** + * List all categories and return HTML format + * + * @param string $name Name of list + * @param integer $categoryId Only category to show + * @param array $selectedCategories Only select categories from this + * @param integer $size Size of dropdown + * @param boolean $topLevel Add option '-Top-' + * @param boolean $multiple Dropdown is multiple or not + * @param array $disabledFields Fields need to be disabled + * @param integer $width Width in pixel + * + * @return string HTML of dropdown + * + * @since 2.0.0.3 + * + * @throws Exception + */ + public static function listAll($name, $categoryId, $selectedCategories = array(), $size = 1, $topLevel = false, + $multiple = false, $disabledFields = array(), $width = 250) + { + $db = JFactory::getDbo(); + $html = ''; + $query = $db->getQuery(true) + ->select($db->qn('parent_id')) + ->from($db->qn('#__redshop_category')) + ->order($db->qn('lft')); + + if ($categoryId) + { + $query->where($db->qn('id') . ' = ' . $db->q((int) $categoryId)); + } + + // Categories nested + $query->where($db->qn('level') . ' > 0'); + + $db->setQuery($query); + $cats = $db->loadObjectList(); + + if ($cats && Redshop::getConfig()->getBool('PRODUCT_DEFAULT_CATEGORY')) + { + $selectedCategories[] = $cats[0]->parent_id; + } + + $multiple = $multiple ? "multiple=\"multiple\"" : ""; + $id = str_replace('[]', '', $name); + $html .= "\n"; + + return $html; + } + + /** + * List children of category into dropdown with level, + * this is a function will be called recursively. + * + * @param array $selectedCategories Only show selected categories + * @param array $disabledFields Disable fields + * + * @return string HTML of + * + * @since 2.0.0.3 + * + * @throws Exception + */ + public static function listTree($selectedCategories = array(), $disabledFields = array()) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('DISTINCT a.id AS value, a.name AS text, a.level, a.published, a.lft'); + + $subQuery = $db->getQuery(true) + ->select('id, name, level, published, parent_id, lft, rgt') + ->from('#__redshop_category'); + + $query->from('(' . (string) $subQuery . ') AS a') + ->join('LEFT', $db->qn('#__redshop_category') . ' AS b ON a.lft > b.lft AND a.rgt < b.rgt') + ->where($db->qn('a.level') . ' > 0'); + $query->order('a.lft ASC'); + + // Get the options. + $db->setQuery($query); + + try + { + $options = $db->loadObjectList(); + } + catch (RuntimeException $exception) + { + throw new Exception($exception->getMessage(), 500); + } + + $html = ""; + + foreach ($options as $key => $option) + { + // Pad the option text with spaces using depth level as a multiplier. + if ($option->published == 1) + { + $option->text = str_repeat('- ', $option->level) . $option->text; + } + else + { + $option->text = str_repeat('- ', $option->level) . '[' . $option->text . ']'; + } + + $selected = ''; + $disabled = ''; + + if (in_array($option->value, $selectedCategories)) + { + $selected = ' selected="selected" '; + } + + if (in_array($option->value, $disabledFields)) + { + $disabled = ' disabled="disabled" '; + } + + $html .= ''; + } + + return $html; + } + + /** + * Build content order by user state from request + * + * @return string + * + * @since 2.0.0.3 + * + * @throws Exception + */ + public static function buildContentOrderBy() + { + $db = JFactory::getDbo(); + global $context; + $app = JFactory::getApplication(); + + $filterOrder = urldecode($app->getUserStateFromRequest($context . 'filter_order', 'filter_order', 'ordering')); + $filterOrderDir = urldecode($app->getUserStateFromRequest($context . 'filter_order_Dir', 'filter_order_Dir', '')); + + $orderBy = ' ORDER BY ' . $db->escape($filterOrder . ' ' . $filterOrderDir); + + return $orderBy; + } + + /** + * Get root parent categories + * + * @return object + * + * @since 2.0.0.3 + */ + public static function getParentCategories() + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('DISTINCT ' . $db->qn('name')) + ->select($db->qn('id')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('level') . ' = 1'); + + $db->setQuery($query); + + return $db->loadObjectList(); + } + + /** + * Get category tree + * + * @param string $cid Category ID + * + * @return array + * + * @since 2.0.0.3 + */ + public static function getCategoryTree($cid = '0') + { + if (!isset($GLOBALS['catlist'])) + { + $GLOBALS['catlist'] = array(); + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn(array('id', 'name', 'parent_id'))) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('parent_id') . ' = ' . $db->q((int) $cid)); + + $db->setQuery($query); + + $cats = $db->loadObjectList(); + + for ($x = 0, $xn = count($cats); $x < $xn; $x++) + { + $cat = $cats[$x]; + $parentId = $cat->id; + $GLOBALS['catlist'][] = $cat; + self::getCategoryTree($parentId); + } + + return $GLOBALS['catlist']; + } + + /** + * Get category product list + * + * @param integer $cid Category ID + * + * @return array + * + * @since 2.0.0.3 + * + */ + public static function getCategoryProductList($cid, $includeProductsFromSubCat = false) + { + return RedshopEntityCategory::getInstance($cid)->getProducts($includeProductsFromSubCat); + } + + /** + * get Root ID + * + * @return integer + * + * @since 2.0.5 + */ + public static function getRootId() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('id')) + ->from($db->qn('#__redshop_category')) + ->where($db->qn('name') . ' = ' . $db->q('ROOT')) + ->where($db->qn('parent_id') . ' = 0') + ->where($db->qn('level') . ' = 0'); + + return $db->setQuery($query)->loadResult(); + } + + /** + * buildQueryFilterProduct + * + * @param integer $categoryId id of main category + * @param array $allCategories array of all categories id (main category or main category & its subcategories) + * @param array $filter Filter data + * + * @return bool|JDatabaseQuery $query The result query + * + * @since 2.1.2 + */ + public static function buildQueryFilterProduct($categoryId, $allCategories = array(), $filters) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('DISTINCT(p.product_id)') + ->from($db->qn('#__redshop_product', 'p')) + ->leftJoin($db->qn('#__redshop_product_category_xref', 'pc') . ' ON ' . $db->qn('pc.product_id') . ' = ' . $db->qn('p.product_id')) + ->where($db->qn('p.published') . ' = 1') + ->where($db->qn('p.expired') . ' = 0') + ->where($db->qn('p.product_parent_id') . ' = 0') + ->group($db->qn('p.product_id')); + + /* query builder for category filters */ + if (empty($allCategories)) + { + $allCategories = array($categoryId); + } + + $query->where($db->qn('pc.category_id') . ' IN (' . implode(',', $allCategories) . ')'); + $filterCategory = $filters['category']; + + if (!empty($filterCategory)) + { + $filterCategory = array_merge(array($categoryId), $filterCategory); + $query->where($db->qn('pc.category_id') . ' IN (' . implode(',', $filterCategory) . ')'); + } + + /* query builder for manufacturer filters */ + $manufacturer = $filters['manufacturer']; + + if ((int) $filters['mid'] > 0) + { + $query->where($db->qn('p.manufacturer_id') . ' = ' . (int) $filters['mid']); + } + elseif (!empty($manufacturer)) + { + $query->where($db->qn('p.manufacturer_id') . ' IN (' . implode(',', $manufacturer) . ')'); + } + + /* query builder for price range filters */ + $priceRange = $filters['filterprice']; + + if (!empty($priceRange)) + { + $min = $priceRange['min']; + $max = $priceRange['max']; + $comparePrice = $db->qn('p.product_price') . ' >= ' . $db->q($min) . ' AND ' . $db->qn('p.product_price') . ' <= ' . $db->q(($max)); + $compareDiscountPrice = $db->qn('p.discount_price') . ' >= ' . $db->q($min) . ' AND ' . $db->qn('p.discount_price') . ' <= ' . $db->q(($max)); + $saleTime = $db->qn('p.discount_stratdate') . ' AND ' . $db->qn('p.discount_enddate'); + $query->where('( CASE WHEN( ' . $db->qn('p.product_on_sale') . ' = 1 AND UNIX_TIMESTAMP() BETWEEN ' + . $saleTime . ') THEN (' + . $compareDiscountPrice . ') ELSE (' + . $comparePrice . ') END )' + ); + } + + /* query builder for attributes */ + $attribute = $filters['attribute_name']; + + foreach ($attribute as $key => $value) + { + $query->leftJoin($db->qn('#__redshop_product_attribute', 'a' . $key) + . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('a' . $key . '.product_id')) + ->where($db->qn('a' . $key . '.attribute_name') . ' = ' . $db->q($key)); + + if (empty($value['property'])) + { + continue; + } + + $query->leftJoin($db->qn('#__redshop_product_attribute_property', 'ap' . $key) + . ' ON ' . $db->qn('a' . $key . '.attribute_id') . ' = ' . $db->qn('ap' . $key . '.attribute_id')) + ->where($db->qn('ap' . $key . '.property_name') . ' IN ("' . implode('","', $value['property']) . '")'); + } + + /* query builder for product's custom fields */ + $customField = $filters['custom_field']; + $key = 0; + $subQuery = array(); + + foreach ($customField as $fieldId => $fieldValues) + { + if (empty($fieldValues)) + { + continue; + } + + foreach ($fieldValues as $value) + { + $subQuery[] = 'FIND_IN_SET("' . $value . '", ' . $db->qn('fd' . $key . '.data_txt') . ')'; + } + + $query->leftJoin($db->qn('#__redshop_fields_data', 'fd' . $key) . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('fd' . $key . '.itemid')) + ->where($db->qn('fd' . $key . '.fieldid') . ' = ' . $db->q((int) $fieldId)); + $key++; + } + + if (!empty($subQuery)) + { + $query->where('(' . implode(' OR ', $subQuery) . ')'); + } + + return $query; + } +} diff --git a/libraries/redshop/helper/clickatell.php b/libraries/redshop/helper/clickatell.php new file mode 100644 index 00000000000..5d70165a897 --- /dev/null +++ b/libraries/redshop/helper/clickatell.php @@ -0,0 +1,216 @@ +get('CLICKATELL_ENABLE') <= 0) + { + return; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_order_users_info', 'oui')) + ->leftJoin($db->qn('#__redshop_orders', 'o') . ' ON ' . $db->qn('o.order_id') . ' = ' . $db->qn('oui.order_id')) + ->where($db->qn('oui.order_id') . ' = ' . (int) $orderId) + ->where($db->qn('oui.address_type') . ' = ' . $db->quote('ST')); + + $orderData = $db->setQuery($query)->loadObject(); + + $query->clear() + ->select($db->qn('p.payment_method_name')) + ->select($db->qn('op.payment_method_id')) + ->from($db->qn('#__redshop_order_payment', 'op')) + ->leftJoin($db->qn('#__redshop_orders', 'o') . ' ON ' . $db->qn('o.order_id') . ' = ' . $db->qn('op.order_id')) + ->leftJoin($db->qn('#__redshop_payment_method', 'p') . ' ON ' . $db->qn('p.payment_method_id') . ' = ' . $db->qn('op.payment_method_id')) + ->where($db->qn('op.order_id') . ' = ' . (int) $orderId); + + $paymentData = $db->setQuery($query)->loadObject(); + + $paymentName = $paymentData->payment_method_name; + $paymentMethodId = $paymentData->payment_method_id; + $to = $orderData->phone; + $templateDetail = RedshopHelperTemplate::getTemplate("clicktell_sms_message"); + + $orderShippingClass = 0; + $orderShipping = Redshop\Shipping\Rate::decrypt($orderData->ship_method_id); + + if (isset($orderShipping[0])) + { + $orderShippingClass = $orderShipping[0]; + } + + $query->clear() + ->select('*') + ->from($db->qn('#__redshop_template', 't')) + ->where($db->qn('t.template_section') . ' = ' . $db->quote('clicktell_sms_message')) + ->where('FIND_IN_SET(' . $db->quote($orderData->order_status) . ', order_status)') + ->where('FIND_IN_SET(' . $db->quote($paymentMethodId) . ', payment_methods)') + ->order($db->qn('id') . ' DESC'); + + $paymentMethod = $db->setQuery($query, 0, 1)->loadObject(); + + $templateDesc = RedshopHelperTemplate::readTemplateFile($paymentMethod->section, $paymentMethod->file_name); + + $message = self::replaceMessage($templateDesc, $orderData, $paymentName); + + if ($message) + { + self::sendMessage(urlencode($message), $to); + } + + $query->clear() + ->select('*') + ->from($db->qn('#__redshop_template', 't')) + ->where($db->qn('t.template_section') . ' = ' . $db->quote('clicktell_sms_message')) + ->where('FIND_IN_SET(' . $db->quote($orderData->order_status) . ', order_status)') + ->where('FIND_IN_SET(' . $db->quote($orderShippingClass) . ', shipping_methods)') + ->order($db->qn('id') . ' DESC'); + + $shippingMethod = $db->setQuery($query)->loadObject(); + + $message = self::replaceMessage($shippingMethod->template_desc, $orderData, $paymentName); + + if ($message) + { + self::sendMessage(urlencode($message), $to); + } + + if (Redshop::getConfig()->get('CLICKATELL_ORDER_STATUS') == $orderData->order_status) + { + $message = self::replaceMessage($templateDetail[0]->template_desc, $orderData, $paymentName); + + if ($message) + { + self::sendMessage(urlencode($message), $to); + } + } + } + + /** + * Method for replace message + * + * @param string $message Message text + * @param object $orderData Object data + * @param string $paymentName Name of payment + * + * @return mixed + * + * @since 2.0.6 + */ + public static function replaceMessage($message, $orderData, $paymentName) + { + $shippingMethod = ''; + $details = Redshop\Shipping\Rate::decrypt($orderData->ship_method_id); + + if (count($details) > 1) + { + $text = ""; + + if (array_key_exists(2, $details)) + { + $text = " (" . $details[2] . ")"; + } + + $shippingMethod = $details[1] . $text; + } + + $userData = RedshopHelperUser::getUserInformation($orderData->user_id); + + $message = str_replace('{order_id}', $orderData->order_id, $message); + $message = str_replace('{order_status}', $orderData->order_status, $message); + $message = str_replace('{customer_name}', $userData->firstname, $message); + $message = str_replace('{payment_status}', $orderData->order_payment_status, $message); + $message = str_replace('{order_comment}', $orderData->customer_note, $message); + $message = str_replace('{shipping_method}', $shippingMethod, $message); + $message = str_replace('{payment_method}', $paymentName, $message); + + return $message; + } + + /** + * Method for send message + * + * @param string $text Message text + * @param string $to Phone number for send + * + * @return void + * + * @since 2.0.6 + */ + public static function sendMessage($text, $to) + { + // ClickATell username + $user = Redshop::getConfig()->get('CLICKATELL_USERNAME'); + + // ClickATell password + $password = Redshop::getConfig()->get('CLICKATELL_PASSWORD'); + + // Clickatell_api_id + $clickATellAPI = Redshop::getConfig()->get('CLICKATELL_API_ID'); + $baseUrl = "http://api.clickatell.com"; + + // Auth call + $url = $baseUrl . '/http/auth?user=' . $user . '&password=' . $password . '&api_id=' . $clickATellAPI; + + // Do auth call + $result = file($url); + + // Split our response. return string is on first line of the data returned + $session = explode(":", $result[0]); + + if ($session[0] == "OK") + { + // Remove any whitespace + $sessionId = trim($session[1]); + $url = $baseUrl . '/http/sendmsg?session_id=' . $sessionId . '&to=' . $to . '&text=' . $text; + + // Do send sms call + $result = file($url); + $send = explode(":", $result[0]); + + if ($send[0] == "ID") + { + echo "success message ID: " . $send[1]; + } + else + { + JError::raiseWarning(21, "send message failed: "); + } + } + else + { + JError::raiseWarning(21, "Authentication failure: " . $result[0]); + } + } +} diff --git a/libraries/redshop/helper/config.php b/libraries/redshop/helper/config.php new file mode 100644 index 00000000000..e02885cd2fe --- /dev/null +++ b/libraries/redshop/helper/config.php @@ -0,0 +1,536 @@ +loadConfig($namespace); + } + + /** + * Magic method to transparently use registry methods on config + * + * @param string $name Name of the function. + * @param array $arguments [0] The name of the variable [1] The default value. + * + * @return mixed + */ + public function __call($name, $arguments) + { + if (method_exists($this->config, $name)) + { + return call_user_func_array(array($this->config, $name), $arguments); + } + + trigger_error('Call to undefined method ' . __CLASS__ . '::' . $name . '()', E_USER_ERROR); + + return false; + } + + /** + * Get the path to this station configuration file + * + * @return string + */ + protected function getConfigurationFilePath() + { + return JPATH_ADMINISTRATOR . '/components/com_redshop/config/config.php'; + } + + /** + * Get the path to this configuration distinct file + * + * @return string + */ + protected function getConfigurationDistFilePath() + { + return JPATH_ADMINISTRATOR . '/components/com_redshop/config/config.dist.php'; + } + + /** + * Check config file is exist + * + * @return boolean Returns TRUE if the file or directory specified by filename exists; FALSE otherwise. + */ + public function isExists() + { + return file_exists($this->getConfigurationFilePath()); + } + + /** + * Default loading is trying to use the associated table + * + * @param mixed $namespace Namespace. + * + * @return self + */ + public function loadConfig($namespace = '') + { + $this->config = new Registry; + + $file = $this->getConfigurationFilePath(); + + if (!JFile::exists($file)) + { + return $this; + } + + include_once $file; + + // Sanitize the namespace. + $namespace = ucfirst((string) preg_replace('/[^A-Z_]/i', '', $namespace)); + + // Build the config name. + $name = 'RedshopConfig' . $namespace; + + // Handle the PHP configuration type. + if (class_exists($name)) + { + // Create the JConfig object + $class = new $name; + + // Load the configuration values into the registry + $this->config->loadObject($class); + } + + return $this; + } + + /** + * Save configuration to file + * + * @param mixed $config Null to avoid binding any data | JRegistry to bind config and save + * + * @throws Exception + * @return boolean + */ + public function save($config = null) + { + if ($config instanceof JRegistry || $config instanceof Registry) + { + $this->config->merge($config); + } + + jimport('joomla.filesystem.path'); + jimport('joomla.filesystem.file'); + + // Set the configuration file path. + $file = $this->getConfigurationFilePath(); + $configFolder = dirname($file); + + if (!is_dir($configFolder) && !mkdir($configFolder, 0755, true)) + { + throw new Exception('Unable to create configuration folder'); + } + + $app = JFactory::getApplication(); + + // Attempt to make the file writable if using FTP. + if (file_exists($file) && JPath::isOwner($file) && !JPath::setPermissions($file, '0644')) + { + $app->enqueueMessage(JText::_('LIB_REDSHOP_ERROR_CONFIGURATION_PHP_NOTWRITABLE'), 'notice'); + } + + // Attempt to write the configuration file as a PHP class named RedshopConfig. + $configuration = $config->toString('PHP', array('class' => 'RedshopConfig', 'closingtag' => false)); + + if (!JFile::write($file, $configuration)) + { + throw new RuntimeException(JText::_('LIB_REDSHOP_ERROR_WRITE_FAILED')); + } + + // Attempt to make the file unwriteable if using FTP. + if (JPath::isOwner($file) && !JPath::setPermissions($file, '0444')) + { + $app->enqueueMessage(JText::_('LIB_REDSHOP_ERROR_CONFIGURATION_PHP_NOTUNWRITABLE'), 'notice'); + } + + return true; + } + + /** + * Save new config file using legacy or legacy styled custom configuration files. + * + * @param string $configFile Path to legacy styled configuration file + * + * @throws exception Throw invalid argument and exception if file is not exist and invalid. + * @return boolean True on success + */ + public function loadLegacy($configFile = null) + { + if ($this->isExists()) + { + return false; + } + + // Try to migrate old configuration + if ($this->loadOldConfig()) + { + return true; + } + + // Check if custom file path is given and exist + if ($configFile && !file_exists($configFile)) + { + throw new InvalidArgumentException(JText::sprintf('LIB_REDSHOP_FILE_IS_NOT_EXIST', $configFile)); + } + + // Priority to custom file given in method argument + if (!$configFile) + { + $legacyConfig = new Redconfiguration; + + // Load from old version configuration + if (file_exists($legacyConfig->configPath)) + { + $configFile = $legacyConfig->configPath; + } + + // Check for distinct configuration file + elseif (file_exists($legacyConfig->configDistPath)) + { + $configFile = $legacyConfig->configDistPath; + } + else + { + throw new Exception(JText::_('LIB_REDSHOP_LEGACY_CONFIG_FILE_IS_NOT_EXIST')); + } + } + + require_once $configFile; + + $allDefinedConstants = get_defined_constants(true); + $configDataArray = $allDefinedConstants['user']; + + if (empty($configDataArray)) + { + throw new Exception(JText::sprintf('LIB_REDSHOP_LEGACY_CONFIG_FILE_IS_NOT_VALID', $configFile)); + } + + try + { + $this->save(new Registry($configDataArray)); + + return true; + } + catch (Exception $e) + { + JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); + + return false; + } + } + + /** + * Load Distinct configuration file + * + * @since 1.7 + * + * @return boolean True on success + */ + public function loadDist() + { + // Only load dist file when config file is not exist. + if (!$this->isExists()) + { + jimport('joomla.filesystem.file'); + + if ($this->loadOldConfig()) + { + return true; + } + + return JFile::copy($this->getConfigurationDistFilePath(), $this->getConfigurationFilePath()); + } + + return true; + } + + /** + * Load previous configuration + * + * @return boolean + * + * @throws Exception + */ + protected function loadOldConfig() + { + // Since 1.6 we started moving to new config than try to migrate it + if (version_compare(RedshopHelperJoomla::getManifestValue('version'), '1.6', '<')) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_TRY_TO_MIGRATE_PREVIOUS_CONFIGURATION'), 'notice'); + + $oldConfigFile = JPATH_ADMINISTRATOR . '/components/com_redshop/helpers/redshop.cfg.php'; + + // Old configuration file + if (JFile::exists($oldConfigFile)) + { + // New configuration file + require_once JPATH_ADMINISTRATOR . '/components/com_redshop/config/config.dist.php'; + + // Old configuration file + require_once $oldConfigFile; + + // Get new configuration properties + $configClass = new RedshopConfig; + $properties = get_object_vars($configClass); + + // Get old configiration properties + $defined = get_defined_constants(); + + // Replace new configuration values with old one + foreach ($properties as $name => $value) + { + if (in_array($name, $defined)) + { + if (isset($defined[$name])) + { + $properties[$name] = $defined[$name]; + } + } + } + + // Save to config file + $this->save(new Registry($properties)); + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_MIGRATED_PREVIOUS_CONFIGURATION'), 'notice'); + + return JFile::delete($oldConfigFile); + } + + JFactory::getApplication()->enqueueMessage(JText::_('COM_REDSHOP_PREVIOUS_CONFIGURATION_NOT_FOUND'), 'warning'); + + return false; + } + + return false; + } + + /** + * Stores redshop configuration strings in the JavaScript language store. + * + * @param string $key The Javascript config string key. + * @param string $value The Javascript config string value. + * + * @return array + * + * @since 1.5 + */ + public static function script($key = null, $value = null) + { + // Add the key to the array if not null. + if ($key !== null) + { + // Assign key to the value + self::$jsStrings[strtoupper($key)] = $value; + } + + return self::$jsStrings; + } + + /** + * Set javascript strings + * + * @return void + */ + public static function scriptDeclaration() + { + if (self::$isLoadScriptDeclaration) + { + return; + } + + // Load redshop script + /** @scrutinizer ignore-deprecated */JHtml::script('com_redshop/redshop.min.js', false, true); + + JFactory::getDocument()->addScriptDeclaration(' + (function($) { + var RedshopStrings = ' . json_encode(self::script()) . '; + if (typeof redSHOP == "undefined") { + redSHOP = {}; + redSHOP.RSConfig = {}; + redSHOP.RSConfig.strings = RedshopStrings; + } + else { + redSHOP.RSConfig.load(RedshopStrings); + } + + $(document).ready(function(){ + var bootstrapLoaded = (typeof $().carousel == "function"); + var mootoolsLoaded = (typeof MooTools != "undefined"); + if (bootstrapLoaded && mootoolsLoaded) { + Element.implement({ + hide: function () { + return this; + }, + show: function (v) { + return this; + }, + slide: function (v) { + return this; + } + }); + } + }); + })(jQuery); + '); + + self::$isLoadScriptDeclaration = true; + } + + /** + * Method for get config variable of redshop + * + * @param string $name Name of variable. + * @param mixed $default Default data if not found. + * + * @return mixed + * + * @since 2.0.3 + */ + public function get($name = '', $default = null) + { + return empty($this->config) ? $default : $this->config->get($name, $default); + } + + /** + * Method for get config variable of redshop + * + * @param string $name Name of variable. + * @param mixed $value Value of configuration + * + * @return void + * + * @since 2.0.6 + */ + public function set($name = '', $value = null) + { + if (empty($this->config)) + { + return; + } + + $this->config->set($name, $value); + } + + /** + * Method for get config force boolean variable of redshop + * + * @param string $name Name of variable. + * @param boolean $default Default data if not found. + * + * @return boolean + * + * @since 2.0.3 + */ + public function getBool($name = '', $default = false) + { + return empty($this->config) ? boolval($default) : boolval($this->config->get($name, $default)); + } + + /** + * Method for return all config in array format + * + * @return array + * + * @since 2.0.4 + */ + public function toArray() + { + if (empty($this->config)) + { + return array(); + } + + return $this->config->toArray(); + } + + /** + * Method for get config force integer variable of redshop + * + * @param string $name Name of variable. + * @param integer $default Default data if not found. + * + * @return integer + * + * @since 2.1.0 + */ + public function getInt($name = '', $default = 0) + { + return empty($this->config) ? (int) $default : (int) $this->config->get($name, $default); + } + + /** + * Method for get config force string variable of redshop + * + * @param string $name Name of variable. + * @param string $default Default data if not found. + * + * @return string + * + * @since 2.1.0 + */ + public function getString($name = '', $default = '') + { + return empty($this->config) ? (string) $default : (string) $this->config->get($name, $default); + } + + /** + * Method for get config force float variable of redshop + * + * @param string $name Name of variable. + * @param float $default Default data if not found. + * + * @return float + * + * @since 2.1.0 + */ + public function getFloat($name = '', $default = 0.0) + { + return empty($this->config) ? (float) $default : (float) $this->config->get($name, $default); + } +} diff --git a/libraries/redshop/helper/cron.php b/libraries/redshop/helper/cron.php new file mode 100644 index 00000000000..a3b355a4c54 --- /dev/null +++ b/libraries/redshop/helper/cron.php @@ -0,0 +1,360 @@ +get('DISCOUNT_MAIL_SEND')) + { + self::sendMailAfterPurchaseOrder(); + } + + // Calculation to run once in day + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('count(id)') + ->from($db->qn('#__redshop_cron')) + ->where($db->qn('date') . ' = ' . $db->quote($formatDate)); + + $result = $db->setQuery($query)->loadResult(); + + if ($result == 1) + { + return; + } + + // Default $data != 1 + $query->clear() + ->update($db->qn('#__redshop_cron')) + ->set($db->qn('date') . ' = ' . $db->quote($formatDate)) + ->where($db->qn('id') . ' = 1'); + $db->setQuery($query)->execute(); + + if (Redshop::getConfig()->get('SEND_CATALOG_REMINDER_MAIL')) + { + RedshopHelperCatalog::sendMail(); + } + + RedshopHelperSample::sendMail(); + + // Send subscription renewal mail. + self::sendSubscriptionRenewalMail(); + } + + /** + * Catalog mail function + * + * @return void + * + * @deprecated 2.0.6 + */ + public static function sendCatalogMail() + { + RedshopHelperCatalog::sendMail(); + } + + /** + * After purchased order mail function + * + * @return void + */ + public static function sendMailAfterPurchaseOrder() + { + $db = JFactory::getDbo(); + $date = JFactory::getDate(); + $formattedDate = $date->format('Y-m-d'); + $config = JFactory::getConfig(); + $from = $config->get('mailfrom'); + $fromName = $config->get('fromname'); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_payment_status') . ' = ' . $db->quote('Paid')) + ->where($db->qn('order_status') . ' = ' . $db->quote('C')); + + $mails = $db->setQuery($query)->loadObjectList(); + + JTable::addIncludePath(JPATH_SITE . '/administrator/components/com_redshop/tables'); + + foreach ($mails as $mail) + { + $mailBody = ""; + $subject = ""; + $orderId = $mail->order_id; + $mailBcc = null; + $startDate = mktime(0, 0, 0, date("m"), date("d"), date("Y")); + $endDate = $startDate + (Redshop::getConfig()->get('DISCOUPON_DURATION') * 23 * 59 * 59); + $validEndDate = RedshopHelperDatetime::convertDateFormat($endDate); + + if (Redshop::getConfig()->get('DISCOUPON_PERCENT_OR_TOTAL') == 0) + { + $discountCouponValue = Redshop::getConfig()->get('REDCURRENCY_SYMBOL') . " " + . number_format( + Redshop::getConfig()->get('DISCOUPON_VALUE'), + 2, + Redshop::getConfig()->get('PRICE_SEPERATOR'), + Redshop::getConfig()->get('THOUSAND_SEPERATOR') + ); + } + else + { + $discountCouponValue = Redshop::getConfig()->get('DISCOUPON_VALUE') . " %"; + } + + $query->clear() + ->select('CONCAT(' . $db->qn('firstname') . ',' . $db->quote(' ') . ',' . $db->qn('lastname') . ') AS ' . $db->qn('name')) + ->select($db->qn('user_email', 'email')) + ->from($db->qn('#__redshop_order_users_info')) + ->where($db->qn('order_id') . ' = ' . $orderId) + ->where($db->qn('address_type') . ' = ' . $db->quote('BT')); + + $orderUser = $db->setQuery($query)->loadObject(); + + $query->clear() + ->select($db->qn('amount_left', 'total')) + ->select($db->qn('code')) + ->select($db->qn('end_date')) + ->from($db->qn('#__redshop_coupons')) + ->where($db->qn('order_id') . ' = ' . $orderId) + ->where($db->qn('amount_left') . ' <> 0'); + + $coupon = $db->setQuery($query)->loadObject(); + + if (empty($coupon) && $mail->mail1_status != 0) + { + continue; + } + + $couponCode = ''; + $total = 0; + $couponEndDate = ''; + + if (!empty($coupon)) + { + $total = $coupon->total; + $couponCode = $coupon->code; + $couponEndDate = $coupon->end_date; + } + + $name = ""; + $recipient = ""; + + if (!empty($orderUser)) + { + $recipient = $orderUser->email; + $name = $orderUser->name; + } + + if ($mail->mail1_status == 0 && Redshop::getConfig()->get('DAYS_MAIL1')) + { + $sendDate = date("Y-m-d", $mail->cdate + (Redshop::getConfig()->get('DAYS_MAIL1') * (60 * 60 * 24))); + $firstMailData = Redshop\Mail\Helper::getTemplate(0, "first_mail_after_order_purchased"); + + if (count($firstMailData) > 0) + { + $mailBody = $firstMailData[0]->mail_body; + $subject = $firstMailData[0]->mail_subject; + + if (trim($firstMailData[0]->mail_bcc) != "") + { + $mailBcc = explode(",", $firstMailData[0]->mail_bcc); + } + } + + $pathUrl = '' . JUri::root() . ''; + $body = str_replace("{name}", $name, $mailBody); + $body = str_replace("{url}", $pathUrl, $body); + $body = str_replace("{coupon_amount}", $discountCouponValue, $body); + + if ($formattedDate == $sendDate) + { + $token = md5(uniqid(mt_rand(), true)); + $token = substr($token, 0, 10); + $body = str_replace("{coupon_code}", $token, $body); + $body = str_replace("{coupon_duration}", $validEndDate, $body); + Redshop\Mail\Helper::imgInMail($body); + + if (JFactory::getMailer()->sendMail($from, $fromName, $recipient, $subject, $body, 1, null, $mailBcc)) + { + $couponTable = RedshopTable::getAdminInstance('Coupon'); + $couponTable->code = $token; + $couponTable->type = Redshop::getConfig()->get('DISCOUPON_PERCENT_OR_TOTAL'); + $couponTable->value = Redshop::getConfig()->get('DISCOUPON_VALUE'); + $couponTable->start_date = $startDate; + $couponTable->end_date = $endDate; + $couponTable->effect = 1; + $couponTable->userid = $mail->user_id; + $couponTable->amount_left = 1; + $couponTable->published = 1; + $couponTable->order_id = $orderId; + $couponTable->store(); + + $query->clear() + ->update($db->qn('#__redshop_orders')) + ->set($db->qn('mail1_status') . ' = ' . $db->quote('1')) + ->where($db->qn('order_id') . ' = ' . $orderId); + $db->setQuery($query)->execute(); + } + } + } + elseif ($mail->mail2_status == 0 && Redshop::getConfig()->get('DAYS_MAIL2') && $total != 0) + { + $sendDate = date("Y-m-d", $mail->cdate + (Redshop::getConfig()->get('DAYS_MAIL2') * (59 * 59 * 23))); + $secondMailData = Redshop\Mail\Helper::getTemplate(0, "second_mail_after_order_purchased"); + + if (count($secondMailData) > 0) + { + $mailBody = $secondMailData[0]->mail_body; + $subject = $secondMailData[0]->mail_subject; + + if (trim($secondMailData[0]->mail_bcc) != "") + { + $mailBcc = explode(",", $secondMailData[0]->mail_bcc); + } + } + + $days = RedshopHelperStockroom::getDateDiff($couponEndDate, $startDate); + $pathUrl = '' . JUri::root() . ''; + $body = str_replace("{name}", $name, $mailBody); + $body = str_replace("{url}", $pathUrl, $body); + $body = str_replace("{coupon_amount}", $discountCouponValue, $body); + + if ($days && $formattedDate == $sendDate) + { + $validEndDate = RedshopHelperDatetime::convertDateFormat($couponEndDate); + $body = str_replace("{coupon_code}", $couponCode, $body); + $body = str_replace("{coupon_duration}", $validEndDate, $body); + Redshop\Mail\Helper::imgInMail($body); + + if (JFactory::getMailer()->sendMail($from, $fromName, $recipient, $subject, $body, 1, null, $mailBcc)) + { + $query->clear() + ->update($db->qn('#__redshop_orders')) + ->set($db->qn('mail2_status') . ' = ' . $db->quote('1')) + ->where($db->qn('order_id') . ' = ' . $orderId); + $db->setQuery($query)->execute(); + } + } + } + elseif ($mail->mail3_status == 0 + && (Redshop::getConfig()->get('DAYS_MAIL3') != 0 || Redshop::getConfig()->get('DAYS_MAIL3') != '') && $total != 0 + ) + { + // Coupon reminder + $thirdMailData = Redshop\Mail\Helper::getTemplate(0, "third_mail_after_order_purchased"); + + if (count($thirdMailData) > 0) + { + $mailBody = $thirdMailData[0]->mail_body; + $subject = $thirdMailData[0]->mail_subject; + + if (trim($thirdMailData[0]->mail_bcc) != "") + { + $mailBcc = explode(",", $thirdMailData[0]->mail_bcc); + } + } + + $sendDate = date("Y-m-d", $mail->cdate + (Redshop::getConfig()->get('DAYS_MAIL3') * (60 * 60 * 24))); + $days = RedshopHelperStockroom::getDateDiff($couponEndDate, $startDate); + $pathUrl = '' . JUri::root() . ''; + $body = str_replace("{name}", $name, $mailBody); + $body = str_replace("{url}", $pathUrl, $body); + $body = str_replace("{coupon_amount}", $discountCouponValue, $body); + + if ($days && $formattedDate == $sendDate) + { + $validEndDate = RedshopHelperDatetime::convertDateFormat($couponEndDate); + $body = str_replace("{coupon_code}", $couponCode, $body); + $body = str_replace("{coupon_duration}", $validEndDate, $body); + Redshop\Mail\Helper::imgInMail($body); + + if (JFactory::getMailer()->sendMail($from, $fromName, $recipient, $subject, $body, 1, null, $mailBcc)) + { + $query->clear() + ->update($db->qn('#__redshop_orders')) + ->set($db->qn('mail3_status') . ' = ' . $db->quote('1')) + ->where($db->qn('order_id') . ' = ' . $orderId); + $db->setQuery($query)->execute(); + } + } + } + } + } + + /** + * Color mail function. + * + * @return void + * + * @deprecated 2.0.6 + */ + public static function sendColorMail() + { + RedshopHelperSample::sendMail(); + } + + /** + * Subscription renewal mail function + * + * @return void + */ + public static function sendSubscriptionRenewalMail() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('ps.*') + ->from($db->qn('#__redshop_product_subscribe_detail', 'ps')) + ->leftJoin($db->qn('#__redshop_subscription_renewal', 'r') . ' ON ' . $db->qn('r.product_id') . ' = ' . $db->qn('ps.product_id')) + ->where($db->qn('r.before_no_days') . ' >= DATEDIFF(FROM_UNIXTIME( ps.end_date ),curdate())') + ->where($db->qn('ps.renewal_reminder') . ' = 1'); + + $subscriptions = $db->setQuery($query)->loadObjectList(); + + if (empty($subscriptions)) + { + return; + } + + $productSubscribeIds = array(); + + foreach ($subscriptions as $subscription) + { + // Subscription renewal mail + Redshop\Mail\User::sendSubscriptionRenewal($subscription); + + $productSubscribeIds[] = (int) $subscription->product_subscribe_id; + } + + // Update mail sent field to 0 + $query->clear() + ->update($db->qn('#__redshop_product_subscribe_detail')) + ->set($db->qn('renewal_reminder') . ' = 0') + ->where($db->qn('product_subscribe_id') . ' IN (' . implode(',', $productSubscribeIds) . ')'); + $db->setQuery($query)->execute(); + } +} diff --git a/libraries/redshop/helper/currency.php b/libraries/redshop/helper/currency.php new file mode 100644 index 00000000000..5263dc472e0 --- /dev/null +++ b/libraries/redshop/helper/currency.php @@ -0,0 +1,82 @@ +init(); + } + + /** + * Convert currency + * + * @param float $amountA Amount to convert + * @param string $currA Base Currency code + * @param string $currB Currency code in which need amount to be converted + * + * @return float Converted amount + * + * @since 2.0.6 + */ + public static function convert($amountA, $currA = '', $currB = '') + { + JPluginHelper::importPlugin('redshop_product'); + $result = RedshopHelperUtility::getDispatcher()->trigger('onConverCurrency', array(&$amountA, $currA, $currB)); + + if (in_array(true, $result, true)) + { + return $amountA; + } + + if (Redshop::getConfig()->get('CURRENCY_LIBRARIES') == 1) + { + return CurrencyLayer::getInstance()->convert($amountA, $currA, $currB); + } + else + { + return Currency::getInstance()->convert($amountA, $currA, $currB); + } + } + + /** + * Method to get Currency Numeric code / ISO code + * + * @param string $code Currency Code + * + * @todo Add numeric code into table #_redshop_currency "redSHOP Currency Detail" + * + * @return string Currency Numeric Code + * + * @since 2.0.6 Use Redshop\Currency\Currency instead. + */ + public static function getISOCode($code) + { + return Currency::getInstance()->getISOCode($code); + } +} diff --git a/libraries/redshop/helper/datetime.php b/libraries/redshop/helper/datetime.php new file mode 100644 index 00000000000..af4805cfb3a --- /dev/null +++ b/libraries/redshop/helper/datetime.php @@ -0,0 +1,233 @@ +getTimestamp(); + } + + if ($night) + { + $date = $date . ' 23:59:59'; + $date = new DateTime($date); + } + else + { + $date = $date . ' 00:00:01'; + $date = new DateTime($date); + } + + return $date->getTimestamp(); + } + + /** + * Method to convert date according to format + * + * @param int $date Date time (Unix format). + * + * @return string + * + * @since 2.0.3 + */ + public static function convertDateFormat($date = 0) + { + if ($date <= 0) + { + $date = time(); + } + + $format = Redshop::getConfig()->get('DEFAULT_DATEFORMAT', 'Y-m-d'); + $format = empty($format) ? 'Y-m-d' : $format; + + $convertFormat = date($format, $date); + + if (strpos($format, "M") !== false) + { + $convertFormat = str_replace("Jan", JText::_('COM_REDSHOP_JAN'), $convertFormat); + $convertFormat = str_replace("Feb", JText::_('COM_REDSHOP_FEB'), $convertFormat); + $convertFormat = str_replace("Mar", JText::_('COM_REDSHOP_MAR'), $convertFormat); + $convertFormat = str_replace("Apr", JText::_('COM_REDSHOP_APR'), $convertFormat); + $convertFormat = str_replace("May", JText::_('COM_REDSHOP_MAY'), $convertFormat); + $convertFormat = str_replace("Jun", JText::_('COM_REDSHOP_JUN'), $convertFormat); + $convertFormat = str_replace("Jul", JText::_('COM_REDSHOP_JUL'), $convertFormat); + $convertFormat = str_replace("Aug", JText::_('COM_REDSHOP_AUG'), $convertFormat); + $convertFormat = str_replace("Sep", JText::_('COM_REDSHOP_SEP'), $convertFormat); + $convertFormat = str_replace("Oct", JText::_('COM_REDSHOP_OCT'), $convertFormat); + $convertFormat = str_replace("Nov", JText::_('COM_REDSHOP_NOV'), $convertFormat); + $convertFormat = str_replace("Dec", JText::_('COM_REDSHOP_DEC'), $convertFormat); + } + + if (strpos($format, "F") !== false) + { + $convertFormat = str_replace("January", JText::_('COM_REDSHOP_JANUARY'), $convertFormat); + $convertFormat = str_replace("February", JText::_('COM_REDSHOP_FEBRUARY'), $convertFormat); + $convertFormat = str_replace("March", JText::_('COM_REDSHOP_MARCH'), $convertFormat); + $convertFormat = str_replace("April", JText::_('COM_REDSHOP_APRIL'), $convertFormat); + $convertFormat = str_replace("May", JText::_('COM_REDSHOP_MAY'), $convertFormat); + $convertFormat = str_replace("June", JText::_('COM_REDSHOP_JUNE'), $convertFormat); + $convertFormat = str_replace("July", JText::_('COM_REDSHOP_JULY'), $convertFormat); + $convertFormat = str_replace("August", JText::_('COM_REDSHOP_AUGUST'), $convertFormat); + $convertFormat = str_replace("September", JText::_('COM_REDSHOP_SEPTEMBER'), $convertFormat); + $convertFormat = str_replace("October", JText::_('COM_REDSHOP_OCTOBER'), $convertFormat); + $convertFormat = str_replace("November", JText::_('COM_REDSHOP_NOVEMBER'), $convertFormat); + $convertFormat = str_replace("December", JText::_('COM_REDSHOP_DECEMBER'), $convertFormat); + } + + if (strpos($format, "D") !== false) + { + $convertFormat = str_replace("Mon", JText::_('COM_REDSHOP_MON'), $convertFormat); + $convertFormat = str_replace("Tue", JText::_('COM_REDSHOP_TUE'), $convertFormat); + $convertFormat = str_replace("Wed", JText::_('COM_REDSHOP_WED'), $convertFormat); + $convertFormat = str_replace("Thu", JText::_('COM_REDSHOP_THU'), $convertFormat); + $convertFormat = str_replace("Fri", JText::_('COM_REDSHOP_FRI'), $convertFormat); + $convertFormat = str_replace("Sat", JText::_('COM_REDSHOP_SAT'), $convertFormat); + $convertFormat = str_replace("Sun", JText::_('COM_REDSHOP_SUN'), $convertFormat); + } + + if (strpos($format, "l") !== false) + { + $convertFormat = str_replace("Monday", JText::_('COM_REDSHOP_MONDAY'), $convertFormat); + $convertFormat = str_replace("Tuesday", JText::_('COM_REDSHOP_TUESDAY'), $convertFormat); + $convertFormat = str_replace("Wednesday", JText::_('COM_REDSHOP_WEDNESDAY'), $convertFormat); + $convertFormat = str_replace("Thursday", JText::_('COM_REDSHOP_THURSDAY'), $convertFormat); + $convertFormat = str_replace("Friday", JText::_('COM_REDSHOP_FRIDAY'), $convertFormat); + $convertFormat = str_replace("Saturday", JText::_('COM_REDSHOP_SATURDAY'), $convertFormat); + $convertFormat = str_replace("Sunday", JText::_('COM_REDSHOP_SUNDAY'), $convertFormat); + } + + return $convertFormat; + } + + /** + * Method to get date format + * + * @return array + * + * @since 2.0.6 + */ + public static function getDateFormat() + { + $option = array(); + $mon = JText::_(strtoupper(date("M"))); + $month = JText::_(strtoupper(date("F"))); + $wk = JText::_(strtoupper(date("D"))); + $week = JText::_(strtoupper(date("l"))); + + $option[] = JHtml::_('select.option', '0', JText::_('COM_REDSHOP_SELECT')); + $option[] = JHtml::_('select.option', 'Y-m-d', date("Y-m-d")); + $option[] = JHtml::_('select.option', 'd-m-Y', date("d-m-Y")); + $option[] = JHtml::_('select.option', 'd.m.Y', date("d.m.Y")); + $option[] = JHtml::_('select.option', 'Y/m/d', date("Y/m/d")); + $option[] = JHtml::_('select.option', 'd/m/Y', date("d/m/Y")); + $option[] = JHtml::_('select.option', 'm/d/y', date("m/d/y")); + $option[] = JHtml::_('select.option', 'm-d-y', date("m-d-y")); + $option[] = JHtml::_('select.option', 'm.d.y', date("m.d.y")); + $option[] = JHtml::_('select.option', 'm/d/Y', date("m/d/Y")); + $option[] = JHtml::_('select.option', 'm-d-Y', date("m-d-Y")); + $option[] = JHtml::_('select.option', 'm.d.Y', date("m.d.Y")); + $option[] = JHtml::_('select.option', 'd/M/Y', date("d/") . $mon . date("/Y")); + $option[] = JHtml::_('select.option', 'M d,Y', $mon . date(" d, Y")); + $option[] = JHtml::_('select.option', 'd M Y', date("d ") . $mon . date(" Y")); + $option[] = JHtml::_('select.option', 'd M Y, h:i:s', date("d ") . $mon . date(" Y, h:i:s")); + $option[] = JHtml::_('select.option', 'd M Y, h:i A', date("d ") . $mon . date(" Y, h:i A")); + $option[] = JHtml::_('select.option', 'd-m-Y, h:i:A', date("d-m-Y, h:i:A")); + $option[] = JHtml::_('select.option', 'd.m.Y, h:i:A', date("d.m.Y, h:i:A")); + $option[] = JHtml::_('select.option', 'd/m/Y, h:i:A', date("d/m/Y, h:i:A")); + $option[] = JHtml::_('select.option', 'd M Y, H:i:s', date("d ") . $mon . date(" Y, H:i:s")); + $option[] = JHtml::_('select.option', 'd-m-Y, H:i:s', date("d-m-Y, H:i:s")); + $option[] = JHtml::_('select.option', 'd.m.Y, H:i:s', date("d.m.Y, H:i:s")); + $option[] = JHtml::_('select.option', 'd/m/Y, H:i:s', date("d/m/Y, H:i:s")); + $option[] = JHtml::_('select.option', 'F d, Y', $month . date(" d, Y")); + $option[] = JHtml::_('select.option', 'D M d, Y', $wk . " " . $mon . date(" d, Y")); + $option[] = JHtml::_('select.option', 'l F d, Y', $week . " " . $month . date(" d, Y")); + + return $option; + } + + /** + * Method for convert PHP date format to MomentJS date format. + * + * @param string $format PHP date format + * + * @return string + * + * @since 2.1.0 + */ + public static function convertPHPToMomentFormat($format) + { + $replacements = [ + 'd' => 'DD', + 'D' => 'ddd', + 'j' => 'D', + 'l' => 'dddd', + 'N' => 'E', + 'S' => 'o', + 'w' => 'e', + 'z' => 'DDD', + 'W' => 'W', + 'F' => 'MMMM', + 'm' => 'MM', + 'M' => 'MMM', + 'n' => 'M', + 't' => '', // No equivalent + 'L' => '', // No equivalent + 'o' => 'YYYY', + 'Y' => 'YYYY', + 'y' => 'YY', + 'a' => 'a', + 'A' => 'A', + 'B' => '', // No equivalent + 'g' => 'h', + 'G' => 'H', + 'h' => 'hh', + 'H' => 'HH', + 'i' => 'mm', + 's' => 'ss', + 'u' => 'SSS', + 'e' => 'zz', // Deprecated since version 1.6.0 of moment.js + 'I' => '', // No equivalent + 'O' => '', // No equivalent + 'P' => '', // No equivalent + 'T' => '', // No equivalent + 'Z' => '', // No equivalent + 'c' => '', // No equivalent + 'r' => '', // No equivalent + 'U' => 'X', + ]; + + return strtr($format, $replacements); + } +} diff --git a/libraries/redshop/helper/discount.php b/libraries/redshop/helper/discount.php new file mode 100644 index 00000000000..b8a6e5a0e46 --- /dev/null +++ b/libraries/redshop/helper/discount.php @@ -0,0 +1,260 @@ +id; + } + + $userData = RedshopHelperUser::createUserSession($userId); + $shopperGroupId = (int) $userData['rs_user_shopperGroup']; + + $shopperGroupDiscounts = RedshopEntityShopper_Group::getInstance($shopperGroupId)->getDiscounts(); + + if ($shopperGroupDiscounts->isEmpty()) + { + return false; + } + + $result = false; + $currentTime = time(); + + foreach ($shopperGroupDiscounts->getAll() as $discount) + { + /** @var RedshopEntityDiscount $discount */ + $potentialDiscount = null; + + // Skip if this discount is not published + if (!$discount->get('published', false)) + { + continue; + } + + $startDate = $discount->get('start_date', 0); + $endDate = $discount->get('end_date', 0); + $condition = $discount->get('condition', 0); + $amount = $discount->get('amount', 0); + + /** + * Discount condition + * 1. Start date and End date not set + * 2. Had only start date and start date smaller than current time. + * 3. Had only end date and end date higher than current time. + * 4. Start date exist and smaller than current time. End date exist and higher than current time. + */ + if ((!$startDate && !$endDate) + || ($startDate && !$endDate && $startDate <= $currentTime) + || (!$startDate && $endDate && $endDate >= $currentTime) + || ($startDate && $startDate <= $currentTime && $endDate && $endDate >= $currentTime)) + { + if (($condition == 1 && $amount > $subTotal) + || ($condition == 2 && $amount == $subTotal) + || ($condition == 3 && $amount < $subTotal)) + { + $potentialDiscount = $discount; + } + else + { + continue; + } + } + else + { + continue; + } + + if (false === $result || $result->get('amount') > $potentialDiscount->get('amount')) + { + $result = $potentialDiscount; + } + } + + return $result; + } + + /** + * Get discount price from product with check discount date. + * + * @param int $productId Product id + * + * @return float + * + * @since 2.0.7 + */ + public static function getDiscountPriceBaseDiscountDate($productId) + { + $productData = RedshopHelperProduct::getProductById($productId); + + if (empty($productData)) + { + return 0.0; + } + + $today = time(); + + // Convert discount_enddate to middle night + $productData->discount_enddate = RedshopHelperDatetime::generateTimestamp($productData->discount_enddate); + + if (Redshop::getConfig()->getInt('DISCOUNT_ENABLE') == 0) + { + $productData->discount_price = 0; + } + else + { + if (($productData->discount_enddate == '0' && $productData->discount_stratdate == '0') + || ((int)$productData->discount_enddate >= $today && (int)$productData->discount_stratdate <= $today) + || ($productData->discount_enddate == '0' && (int)$productData->discount_stratdate <= $today)) + { + return (float)$productData->discount_price; + } + } + + return 0.0; + } + + /** + * Add GiftCard To Cart + * + * @param array $cartItem Cart item + * @param array $data User cart data + * + * @return void + * + * @since 2.1.0 + */ + public static function addGiftCardToCart(&$cartItem, $data) + { + $cartItem['giftcard_id'] = $data['giftcard_id']; + $cartItem['reciver_email'] = $data['reciver_email']; + $cartItem['reciver_name'] = $data['reciver_name']; + $cartItem['customer_amount'] = ""; + + if (isset($data['customer_amount'])) + { + $cartItem['customer_amount'] = $data['customer_amount']; + } + + $giftCard = RedshopEntityGiftcard::getInstance($data['giftcard_id'])->getItem(); + $giftCardPrice = $giftCard && $giftCard->customer_amount ? $cartItem['customer_amount'] : $giftCard->giftcard_price; + + $fields = RedshopHelperExtrafields::getSectionFieldList(RedshopHelperExtrafields::SECTION_GIFT_CARD_USER_FIELD); + + foreach ($fields as $field) + { + $dataTxt = (isset($data[$field->name])) ? $data[$field->name] : ''; + $tmpText = strpbrk($dataTxt, '`'); + + if ($tmpText) + { + $tmpData = explode('`', $dataTxt); + + if (is_array($tmpData)) + { + $dataTxt = implode(",", $tmpData); + } + } + + $cartItem[$field->name] = $dataTxt; + } + + $cartItem['product_price'] = $giftCardPrice; + $cartItem['product_price_excl_vat'] = $giftCardPrice; + $cartItem['product_vat'] = 0; + $cartItem['product_id'] = ''; + } + + /** + * Re-calculate the Voucher/Coupon value when the product is already discount + * + * @param float $value Voucher/Coupon value + * @param array $cart Cart array + * + * @return float Voucher/Coupon value + * + * @since 2.1.0 + */ + public static function calculateAlreadyDiscount($value, $cart) + { + $idx = 0; + + if (isset($cart['idx'])) + { + $idx = $cart['idx']; + } + + $percent = ($value * 100) / $cart['product_subtotal']; + + for ($i = 0; $i < $idx; $i++) + { + $productPriceArray = RedshopHelperProductPrice::getNetPrice($cart[$i]['product_id']); + + // If the product is already discount + if ($productPriceArray['product_price_saving_percentage'] > 0 && empty($cart[$i]['cart_attribute'])) + { + $amount = $percent * $productPriceArray['product_price'] / 100; + $value -= $amount * $cart[$i]['quantity']; + } + } + + return $value < 0 ? 0 : $value; + } + + /** + * Method for calculate discount. + * + * @param string $type Type of discount + * @param array $types List of type + * + * @return float + * + * @since 2.1.0 + */ + public static function calculate($type, $types) + { + if (empty($types)) + { + return 0; + } + + $value = $type == 'voucher' ? 'voucher_value' : 'coupon_value'; + $discount = 0; + + $idx = count($types); + + for ($i = 0; $i < $idx; $i++) + { + $discount += $types[$i][$value]; + } + + return $discount; + } +} diff --git a/libraries/redshop/helper/document.php b/libraries/redshop/helper/document.php new file mode 100644 index 00000000000..f4bd8a7a8ac --- /dev/null +++ b/libraries/redshop/helper/document.php @@ -0,0 +1,538 @@ +addScriptVersion($url, null, $type, $defer, $async); + + return $this; + } + + /** + * Add a script to the top of the document scripts + * + * @param string $url URL to the linked script + * @param string $type Type of script. Defaults to 'text/javascript' + * @param boolean $defer Adds the defer attribute. + * @param boolean $async Adds the async attribute. + * + * @return self + */ + public function addTopScript($url, $type = "text/javascript", $defer = false, $async = false) + { + $script = array( + 'mime' => $type, + 'defer' => $defer, + 'async' => $async + ); + + static::$topScripts[$url] = $script; + + return $this; + } + + /** + * Add a script to the top of the document scripts + * + * @param string $url URL to the linked style sheet + * @param string $type Mime encoding type + * @param string $media Media type that this stylesheet applies to + * @param array $attributes Array of attributes + * + * @return self + */ + public function addTopStylesheet($url, $type = 'text/css', $media = null, $attributes = array()) + { + return self::addStylesheet('top', $url, $type, $media, $attributes); + } + + /** + * Add a script to the bottom of the document scripts + * + * @param string $url URL to the linked style sheet + * @param string $type Mime encoding type + * @param string $media Media type that this stylesheet applies to + * @param array $attributes Array of attributes + * + * @return self + */ + public function addBottomStylesheet($url, $type = 'text/css', $media = null, $attributes = array()) + { + return self::addStylesheet('bottom', $url, $type, $media, $attributes); + } + + /** + * Add a script to the bottom of the document scripts + * + * @param string $position Position for put stylesheet. + * @param string $url URL to the linked style sheet + * @param string $type Mime encoding type + * @param string $media Media type that this stylesheet applies to + * @param array $attributes Array of attributes + * + * @return self + */ + public function addStylesheet($position = 'top', $url = '', $type = 'text/css', $media = null, $attributes = array()) + { + if (version_compare(JVERSION, '3.7.0', '<')) + { + $stylesheet = array( + 'mime' => $type, + 'media' => $media, + 'attribs' => $attributes + ); + } + else + { + $stylesheet = array('mime' => $type); + + if (!is_null($media)) + { + $stylesheet['media'] = $media; + } + + if (!empty($attributes)) + { + $stylesheet['attribs'] = $attributes; + } + } + + if ($position == 'top') + { + static::$topStylesheets[$url] = $stylesheet; + } + else + { + static::$bottomStylesheets[$url] = $stylesheet; + } + + return $this; + } + + /** + * Clean header assets + * + * @return void + */ + public function cleanHeader() + { + $this->cleanHeaderScripts(); + $this->cleanHeaderStylesheets(); + $this->injectTopScripts(); + $this->injectTopStylesheets(); + $this->injectBottomStylesheets(); + } + + /** + * Injects the pending scripts on the top of the scripts + * + * @return self + */ + protected function injectTopScripts() + { + if (empty(static::$topScripts)) + { + return $this; + } + + $doc = JFactory::getDocument(); + + $doc->_scripts = array_merge(static::$topScripts, $doc->_scripts); + + return $this; + } + + /** + * Injects the top stylesheets on the top of the document stylesheets + * + * @return self + */ + protected function injectTopStylesheets() + { + if (empty(static::$topStylesheets)) + { + return $this; + } + + $doc = JFactory::getDocument(); + + $doc->_styleSheets = array_merge(static::$topStylesheets, $doc->_styleSheets); + + return $this; + } + + /** + * Injects the bottom stylesheets on the bottom of the document stylesheets + * + * @return self + */ + protected function injectBottomStylesheets() + { + if (empty(static::$bottomStylesheets)) + { + return $this; + } + + $doc = JFactory::getDocument(); + + $doc->_styleSheets = array_merge($doc->_styleSheets, static::$bottomStylesheets); + + return $this; + } + + /** + * Clear all the scripts marked as disabled + * + * @return void + */ + protected function cleanHeaderScripts() + { + if (!empty(static::$disabledScripts)) + { + foreach (static::$disabledScripts as $script) + { + $this->removeScript($script); + } + } + } + + /** + * Clear all the stylesheets marked as disabled + * + * @return void + */ + protected function cleanHeaderStylesheets() + { + if (!empty(static::$disabledStylesheets)) + { + foreach (static::$disabledStylesheets as $stylesheet) + { + $this->removeStylesheet($stylesheet); + } + } + } + + /** + * Disable Joomla Core JS mainly because before 3.2 it was using Mootools + * + * @param boolean $disableOnDebug Disable it also when debug is enabled on config + * + * @return void + */ + public function disableCoreJs($disableOnDebug = true) + { + $doc = JFactory::getDocument(); + + if ($doc->_scripts) + { + $this->disableScript('/media/system/js/core.js'); + + if ($disableOnDebug) + { + $this->disableScript('/media/system/js/core-uncompressed.js'); + } + } + } + + /** + * Avoid loading mootools in the current page + * + * @param boolean $disableCore Disable core.js scripts + * @param boolean $disableOnDebug Disable it also when debug is enabled on config + * + * @return void + */ + public function disableMootools($disableCore = false, $disableOnDebug = true) + { + $doc = JFactory::getDocument(); + + if ($doc->_scripts) + { + // Function used to replace window.addEvent() + $doc->addScriptDeclaration("function do_nothing() { return; }"); + + // Disable mootools javascript + $this->disableScript('/media/system/js/mootools-core.js'); + $this->disableScript('/media/system/js/caption.js'); + $this->disableScript('/media/system/js/modal.js'); + $this->disableScript('/media/system/js/mootools.js'); + $this->disableScript('/plugins/system/mtupgrade/mootools.js'); + + // Disabled mootools javascript when debugging site + if ($disableOnDebug) + { + $this->disableScript('/media/system/js/mootools-core-uncompressed.js'); + $this->disableScript('/media/system/js/mootools-core-uncompressed.js'); + $this->disableScript('/media/system/js/caption-uncompressed.js'); + } + + // Disable Mootools More scripts too + $this->disableMootoolsMore($disableOnDebug); + + // Core was using Mootools before v3.2 + if (version_compare(JVERSION, '3.2', 'lt')) + { + $this->disableCoreJs($disableOnDebug); + } + } + + // Disable css stylesheets + if ($doc->_styleSheets) + { + $this->disableStylesheet('/media/system/css/modal.css'); + } + } + + /** + * Disable mootools-more scripts + * + * @param boolean $disableOnDebug Disable it also when debug is enabled on config + * + * @return void + */ + public function disableMootoolsMore($disableOnDebug = true) + { + $doc = JFactory::getDocument(); + + if ($doc->_scripts) + { + $this->disableScript('/media/system/js/mootools-more.js'); + + if ($disableOnDebug) + { + $this->disableScript('/media/system/js/mootools-more-uncompressed.js'); + } + } + } + + /** + * Mark a script as disabled + * + * @param string $script Script to disable + * @param boolean $disableOnDebug Disable also uncompressed version + * + * @return void + */ + public function disableScript($script, $disableOnDebug = true) + { + $script = trim($script); + + if ($script && !in_array($script, static::$disabledScripts)) + { + array_push(static::$disabledScripts, $script); + + if ($disableOnDebug) + { + array_push(static::$disabledScripts, $this->getUncompressedPath($script)); + } + } + } + + /** + * Mark a stylesheet as disabled + * + * @param string $stylesheet Stylesheets to disable + * @param boolean $disableOnDebug Disable also uncompressed version + * + * @return void + */ + public function disableStylesheet($stylesheet, $disableOnDebug = true) + { + $stylesheet = trim($stylesheet); + + if ($stylesheet && !in_array($stylesheet, static::$disabledStylesheets)) + { + array_push(static::$disabledStylesheets, $stylesheet); + + if ($disableOnDebug) + { + array_push(static::$disabledScripts, $this->getUncompressedPath($stylesheet)); + } + } + } + + /** + * Get the route to an uncompressed asset bassed on the compressed path + * + * @param string $assetPath Path to the asset + * + * @return string + */ + protected function getUncompressedPath($assetPath) + { + $fileName = basename($assetPath); + $fileNameOnly = pathinfo($fileName, PATHINFO_FILENAME); + $fileExtension = pathinfo($assetPath, PATHINFO_EXTENSION); + + if (strrpos($fileNameOnly, '.min', '-4')) + { + $position = strrpos($fileNameOnly, '.min', '-4'); + $uncompressedFileName = str_replace('.min', '.', $fileNameOnly, $position); + $uncompressedFileName = $uncompressedFileName . $fileExtension; + } + else + { + $uncompressedFileName = $fileNameOnly . '-uncompressed.' . $fileExtension; + } + + return str_replace($fileName, $uncompressedFileName, $assetPath); + } + + /** + * Remove a script from the JDocument header + * + * @param string $script Script path + * + * @return void + */ + public function removeScript($script) + { + $doc = JFactory::getDocument(); + + $script = trim($script); + + if (!empty($script)) + { + $uri = JUri::getInstance(); + + $relativePath = trim(str_replace($uri->getPath(), '', JUri::root()), '/'); + $relativeScript = trim(str_replace($uri->getPath(), '', $script), '/'); + $relativeUrl = str_replace($relativePath, '', $script); + + $mediaVersion = $doc->getMediaVersion(); + + // Try to disable relative and full URLs + unset($doc->_scripts[$script]); + unset($doc->_scripts[$script . '?' . $mediaVersion]); + + unset($doc->_scripts[$relativeUrl]); + unset($doc->_scripts[$relativeUrl . '?' . $mediaVersion]); + + unset($doc->_scripts[JUri::root(true) . $script]); + unset($doc->_scripts[JUri::root(true) . $script . '?' . $mediaVersion]); + + unset($doc->_scripts[JUri::root(true) . '/' . $script]); + unset($doc->_scripts[JUri::root(true) . '/' . $script . '?' . $mediaVersion]); + + unset($doc->_scripts[$relativeScript]); + unset($doc->_scripts[$relativeScript . '?' . $mediaVersion]); + } + } + + /** + * Remove a stylesheet from the JDocument header + * + * @param string $stylesheet URL to the stylesheet (both global/relative should work) + * + * @return void + */ + public function removeStylesheet($stylesheet) + { + $stylesheet = trim($stylesheet); + + if (!empty($stylesheet)) + { + $doc = JFactory::getDocument(); + $uri = JUri::getInstance(); + + $relativePath = trim(str_replace($uri->getPath(), '', JUri::root()), '/'); + $relativeStylesheet = trim(str_replace($uri->getPath(), '', $stylesheet), '/'); + $relativeUrl = str_replace($relativePath, '', $stylesheet); + + $mediaVersion = $doc->getMediaVersion(); + + // Try to disable relative and full URLs + unset($doc->_styleSheets[$stylesheet]); + unset($doc->_styleSheets[$stylesheet . '?' . $mediaVersion]); + + unset($doc->_styleSheets[$relativeUrl]); + unset($doc->_styleSheets[$relativeUrl . '?' . $mediaVersion]); + + unset($doc->_styleSheets[JUri::root(true) . $stylesheet]); + unset($doc->_styleSheets[JUri::root(true) . $stylesheet . '?' . $mediaVersion]); + + unset($doc->_styleSheets[JUri::root(true) . '/' . $stylesheet]); + unset($doc->_styleSheets[JUri::root(true) . '/' . $stylesheet . '?' . $mediaVersion]); + + unset($doc->_styleSheets[$relativeStylesheet]); + unset($doc->_styleSheets[$relativeStylesheet . '?' . $mediaVersion]); + } + } + + /** + * Redirect any non-existing method to JDocument + * + * @param string $method Method called + * @param array $arguments Arguments passed to the method + * + * @return mixed + */ + public function __call($method, $arguments) + { + $doc = JFactory::getDocument(); + + return call_user_func_array(array($doc, $method), $arguments); + } +} diff --git a/libraries/redshop/helper/extrafields.php b/libraries/redshop/helper/extrafields.php new file mode 100644 index 00000000000..082c8d59a01 --- /dev/null +++ b/libraries/redshop/helper/extrafields.php @@ -0,0 +1,1917 @@ +getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_fields')); + + if ($published >= 0) + { + $query->where($db->qn('published') . ' = ' . (int) $published); + } + + self::$fieldsName = $db->setQuery($query, $limitStart, $limit)->loadObjectList('name'); + + return self::$fieldsName; + } + + /** + * Get field information from field name. + * + * @param string $name Field name prefixed with `rs_` + * + * @return object|null Field information object otherwise null. + */ + public static function getField($name) + { + $fields = self::getList(); + + if (array_key_exists($name, $fields)) + { + return $fields[$name]; + } + + return null; + } + + /** + * Get Section Field Data List + * + * @param int $name Name of the field - Typically contains `rs_` prefix. + * @param int $section Section id of the field. + * @param int $sectionItem Section item id + * + * @return mixed|null + */ + public static function getDataByName($name, $section, $sectionItem) + { + // Get Field id + if (!self::getField($name)) + { + return null; + } + + $fieldId = self::getField($name)->id; + + return self::getData($fieldId, $section, $sectionItem); + } + + /** + * Get Section Field Data List + * + * @param integer $fieldId Field id + * @param integer $section Section id of the field. + * @param integer $sectionItem Section item id + * + * @return mixed|null + */ + public static function getData($fieldId, $section, $sectionItem) + { + $key = $fieldId . '.' . $section . '.' . $sectionItem; + + if (array_key_exists($key, self::$fieldsData)) + { + return self::$fieldsData[$key]; + } + + // Init null. + self::$fieldsData[$key] = null; + + if ($section == 1) + { + $product = Redshop::product((int) $sectionItem); + + if ($product && isset($product->extraFields[$fieldId])) + { + self::$fieldsData[$key] = $product->extraFields[$fieldId]; + } + } + + if (($section == 1 && !self::$fieldsData[$key]) || $section != 1) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('fd.*') + ->select($db->qn('f.title')) + ->from($db->qn('#__redshop_fields_data', 'fd')) + ->leftJoin($db->qn('#__redshop_fields', 'f') . ' ON ' . $db->qn('fd.fieldid') . ' = ' . $db->qn('f.id')) + ->where($db->qn('fd.itemid') . ' = ' . (int) $sectionItem) + ->where($db->qn('fd.fieldid') . ' = ' . (int) $fieldId) + ->where($db->qn('fd.section') . ' = ' . $db->quote($section)); + self::$fieldsData[$key] = $db->setQuery($query)->loadObject(); + } + + return self::$fieldsData[$key]; + } + + /** + * List all field in product + * + * @param integer $section Section product + * + * @return array + * + * @since 2.0.3 + */ + public static function listAllFieldInProduct($section = self::SECTION_PRODUCT) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('*') + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('section') . ' = ' . (int) $section) + ->where($db->qn('display_in_product') . ' = 1') + ->where($db->qn('published') . ' = 1') + ->order($db->qn('ordering')); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * List all fields + * + * @param string $fieldSection Field section + * @param integer $sectionId Section ID + * @param string $fieldName Field name + * @param string $templateDesc Template + * @param int $front Show field in front + * @param int $checkout Show field in checkout + * + * @return string HTML + * + * @since 2.0.3 + */ + public static function listAllField($fieldSection = '', $sectionId = 0, $fieldName = '', $templateDesc = '', $front = 0, $checkout = 0) + { + $db = JFactory::getDbo(); + + JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_redshop/models', 'RedshopModel'); + + /** @var RedshopModelFields $model */ + $model = JModelLegacy::getInstance('Fields', 'RedshopModel'); + $customFields = $model->getFieldsBySection($fieldSection, $fieldName, $front, $checkout); + + if (!count($customFields)) + { + return ''; + } + + // Grouping + $customFieldsGrouped = array(0 => array()); + + foreach ($customFields as $customField) + { + if (empty($customField->groupName)) + { + $customFieldsGrouped[0][] = $customField; + } + else + { + $customFieldsGrouped[$customField->groupName][] = $customField; + } + } + + if (empty($customFieldsGrouped[0])) + { + unset($customFieldsGrouped[0]); + } + + $active = key($customFieldsGrouped); + $active = !$active ? JText::_('COM_REDSHOP_FIELD_GROUP_NOGROUP') : $active; + $active = 'customfield-group-' . JFilterOutput::stringURLSafe($active); + $setName = 'customfields-section-' . $fieldSection . '-pane'; + $exField = '
    '; + $exField .= JHtml::_('bootstrap.startTabSet', $setName, array('active' => $active)); + + foreach ($customFieldsGrouped as $groupName => $customFieldGroup) + { + if (empty($customFieldGroup)) + { + continue; + } + + $tabName = !$groupName ? JText::_('COM_REDSHOP_FIELD_GROUP_NOGROUP') : $groupName; + $exField .= JHtml::_('bootstrap.addTab', $setName, 'customfield-group-' . JFilterOutput::stringURLSafe($tabName), $tabName); + $exField .= ''; + + foreach ($customFieldGroup as $customField) + { + $type = $customField->type; + $dataValue = self::getSectionFieldDataList($customField->id, $fieldSection, $sectionId); + $exField .= ''; + $extraFieldValue = ""; + $extraFieldLabel = JText::_($customField->title); + $required = ''; + $reqlbl = ' reqlbl="" '; + $errormsg = ' errormsg="" '; + + if ($fieldSection == self::SECTION_QUOTATION && $customField->required == 1) + { + $required = ' required="1" '; + $reqlbl = ' reqlbl="' . $extraFieldLabel . '" '; + $errormsg = ' errormsg="' . JText::_('COM_REDSHOP_THIS_FIELD_IS_REQUIRED') . '" '; + } + + switch ($type) + { + case self::TYPE_TEXT: + $textValue = ($dataValue && $dataValue->data_txt) ? $dataValue->data_txt : ''; + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.text', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'textValue' => $textValue + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_TEXT_AREA: + $textareaValue = ($dataValue && $dataValue->data_txt) ? $dataValue->data_txt : ''; + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.textarea', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'textValue' => $textareaValue + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_CHECK_BOX: + $fieldChk = RedshopEntityField::getInstance($customField->id)->getFieldValues(); + $chkData = explode(",", $dataValue->data_txt); + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.checkbox', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_RADIO_BUTTON: + $fieldChk = RedshopEntityField::getInstance($customField->id)->getFieldValues(); + $chkData = explode(",", $dataValue->data_txt); + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.radio', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_SELECT_BOX_SINGLE: + $fieldChk = RedshopEntityField::getInstance($customField->id)->getFieldValues(); + $chkData = explode(",", $dataValue->data_txt); + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.select', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_SELECT_BOX_MULTIPLE: + $fieldChk = RedshopEntityField::getInstance($customField->id)->getFieldValues(); + $chkData = explode(",", $dataValue->data_txt); + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.multiple', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_SELECT_COUNTRY_BOX: + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_country')); + $db->setQuery($query); + $fieldChk = $db->loadObjectList(); + $chkData = explode(",", $dataValue->data_txt); + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.multiple', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_WYSIWYG: + $editor = JFactory::getEditor(); + $textareaValue = ($dataValue && $dataValue->data_txt) ? $dataValue->data_txt : ''; + + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.editor', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'textValue' => $textareaValue, + 'editor' => $editor + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_DOCUMENTS: + $dataTxt = array(); + + if (is_object($dataValue) && property_exists($dataValue, 'data_txt')) + { + // Support Legacy string. + if (preg_match('/\n/', $dataValue->data_txt)) + { + $documentExplode = explode("\n", $dataValue->data_txt); + $dataTxt = array($documentExplode[0] => $documentExplode[1]); + } + else + { + // Support for multiple file upload using JSON for better string handling + $dataTxt = json_decode($dataValue->data_txt); + } + } + + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.document', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'dataTxt' => $dataTxt, + 'dataValue' => $dataValue + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_IMAGE_SELECT: + + $fieldChk = RedshopEntityField::getInstance($customField->id)->getFieldValues(); + $dataValue = self::getSectionFieldDataList($customField->id, $fieldSection, $sectionId); + $value = ''; + + if ($dataValue) + { + $value = $dataValue->data_txt; + } + + $chkData = explode(',', $value); + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.image', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData, + 'value' => $value, + 'sectionId' => $sectionId + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + break; + + case self::TYPE_DATE_PICKER: + + $format = Redshop::getConfig()->get('DEFAULT_DATEFORMAT', 'Y-m-d'); + $date = ''; + + if ($customField->section != 17) + { + $date = date($format, time()); + } + + if ($dataValue) + { + if ($dataValue->data_txt) + { + $date = date($format, strtotime($dataValue->data_txt)); + } + } + + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.date_picker', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'date' => $date + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + + break; + + case self::TYPE_IMAGE_WITH_LINK: + + $fieldChk = RedshopEntityField::getInstance($customField->id)->getFieldValues(); + $dataValue = self::getSectionFieldDataList($customField->id, $fieldSection, $sectionId); + $value = ($dataValue) ? $dataValue->data_txt : ''; + $tmpImageHover = array(); + $tmpImageLink = array(); + + if ($dataValue->altText) + { + $tmpImageHover = explode(',,,,,', $dataValue->altText); + } + + if ($dataValue->image_link) + { + $tmpImageLink = explode(',,,,,', $dataValue->image_link); + } + + $chkData = explode(",", $dataValue->data_txt); + $imageLink = array(); + $imageHover = array(); + + if ($chkData !== false) + { + foreach ($chkData as $index => $aChkData) + { + $imageLink[$aChkData] = $tmpImageLink[$index]; + $imageHover[$aChkData] = $tmpImageHover[$index]; + } + } + + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.image_link', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData, + 'value' => $value, + 'sectionId' => $sectionId, + 'imageLink' => $imageLink, + 'imageHover' => $imageHover + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + + break; + + case self::TYPE_SELECTION_BASED_ON_SELECTED_CONDITIONS: + + if ($dataValue) + { + if ($dataValue->data_txt) + { + $mainSplitDateTotal = explode(" ", $dataValue->data_txt); + $mainSplitDate = explode(":", $mainSplitDateTotal[0]); + $mainSplitDateExtra = explode(":", $mainSplitDateTotal[1]); + $datePublish = date("d-m-Y", $mainSplitDate[0]); + $dateExpiry = date("d-m-Y", $mainSplitDate[1]); + } + else + { + $datePublish = date("d-m-Y"); + $dateExpiry = date("d-m-Y"); + $mainSplitDateExtra = array(); + } + } + else + { + $datePublish = date("d-m-Y"); + $dateExpiry = date("d-m-Y"); + $mainSplitDateExtra = array(); + } + + $exField .= RedshopLayoutHelper::render( + 'extrafields.field.selected_condition', + array( + 'rowData' => $customField, + 'extraFieldLabel' => $extraFieldLabel, + 'required' => $required, + 'requiredLabel' => $reqlbl, + 'errorMsg' => $errormsg, + 'datePublish' => $datePublish, + 'dateExpiry' => $dateExpiry, + 'mainSplitDateExtra' => $mainSplitDateExtra + ), + '', + array( + 'component' => 'com_redshop', + 'client' => 0 + ) + ); + + break; + + default: + JPluginHelper::importPlugin('redshop'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + + $dispatcher->trigger('onDisplayListField', array(&$exField, $customField, $dataValue)); + } + + if (trim($templateDesc) != '') + { + if (strstr($templateDesc, "{" . $customField->name . "}")) + { + $templateDesc = str_replace("{" . $customField->name . "}", $extraFieldValue, $templateDesc); + $templateDesc = str_replace("{" . $customField->name . "_lbl}", $extraFieldLabel, $templateDesc); + } + + $templateDesc = str_replace("{" . $customField->name . "}", "", $templateDesc); + $templateDesc = str_replace("{" . $customField->name . "_lbl}", "", $templateDesc); + } + else + { + if (trim($customField->desc) == '') + { + $exField .= ''; + } + else + { + $exField .= ''; + } + } + + $exField .= ''; + } + + $exField .= '
      ' + . JHtml::tooltip($customField->desc, $customField->name, 'tooltip.png', '', '') . '
    '; + $exField .= JHtml::_('bootstrap.endTab'); + } + + $exField .= JHtml::_('bootstrap.endTabSet'); + $exField .= '
    '; + + if (trim($templateDesc) != '') + { + return $templateDesc; + } + + return $exField; + } + + /** + * Save extra fields + * + * @param array $data Data to insert + * @param integer $fieldSection Field section to match + * @param string $sectionId Section ID + * @param string $userEmail User to match by email + * + * @return void + * @throws Exception + * + * @since 2.0.3 + */ + public static function extraFieldSave($data, $fieldSection, $sectionId = "", $userEmail = "") + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('*') + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('section') . ' = ' . (int) $fieldSection) + ->where($db->qn('published') . ' = 1'); + + $rows = (array) $db->setQuery($query)->loadObjectList(); + + if (empty($rows)) + { + return; + } + + foreach ($rows as $row) + { + $dataTxt = ''; + + if (isset($data[$row->name])) + { + if ($row->type == self::TYPE_WYSIWYG || $row->type == self::TYPE_TEXT || $row->type == self::TYPE_TEXT_AREA) + { + $dataTxt = JFactory::getApplication()->input->get($row->name, '', 'RAW'); + } + else + { + $dataTxt = $data[$row->name]; + } + } + + // Save Document Extra Field + if ($row->type == self::TYPE_DOCUMENTS) + { + $files = $_FILES[$row->name]['name']; + $texts = $data['text_' . $row->name]; + + $documentsValue = array(); + + if (isset($data[$row->name])) + { + $documentsValue = $data[$row->name]; + } + + if (is_array($files) && !empty($files)) + { + $documents = array(); + + foreach ($files as $index => $file) + { + // Editing uploaded file + if (!empty($documentsValue[$index])) + { + if (!empty(trim($texts[$index]))) + { + $documents[trim($texts[$index])] = $documentsValue[$index]; + } + else + { + $documents[$index] = $documentsValue[$index]; + } + } + + if (!empty($file)) + { + $name = RedshopHelperMedia::cleanFileName($file); + $src = $_FILES[$row->name]['tmp_name'][$index]; + $destination = REDSHOP_FRONT_DOCUMENT_RELPATH . 'extrafields/' . $name; + + JFile::upload($src, $destination); + + if (!empty(trim($texts[$index]))) + { + $documents[trim($texts[$index])] = $name; + } + else + { + $documents[$index] = $name; + } + } + } + + // Convert array into JSON string for better handler. + $dataTxt = json_encode($documents); + } + } + + if ($row->type == self::TYPE_SELECTION_BASED_ON_SELECTED_CONDITIONS && $data[$row->name] !== "" && $data[$row->name . "_expiry"] !== "") + { + $dataTxt = strtotime($data[$row->name]) . ":" . strtotime($data[$row->name . "_expiry"]) . " "; + + if (!empty($data[$row->name . "_extra_name"])) + { + foreach ($data[$row->name . "_extra_name"] as $aData) + { + $dataTxt .= strtotime($aData) . ':'; + } + } + } + + if (is_array($dataTxt)) + { + $dataTxt = implode(',', $dataTxt); + } + + $sections = explode(',', $fieldSection); + + if ($row->type == self::TYPE_IMAGE_SELECT || $row->type == self::TYPE_IMAGE_WITH_LINK) + { + $list = self::getSectionFieldDataList($row->id, $fieldSection, $sectionId, $userEmail); + $strImageHover = ''; + $strImageLink = ''; + + if ($row->type === self::TYPE_IMAGE_WITH_LINK) + { + $fieldValueArray = explode(',', $data['imgFieldId' . $row->id]); + $imageHover = array(); + $imageLink = array(); + + foreach ($fieldValueArray as $index => $fieldValue) + { + $imageHover[$index] = $data['image_hover' . $fieldValue]; + $imageLink[$index] = $data['image_link' . $fieldValue]; + } + + $strImageHover = implode(',,,,,', $imageHover); + $strImageLink = implode(',,,,,', $imageLink); + + $sql = $db->getQuery(true); + $sql->update($db->qn('#__redshop_fields_data')) + ->set($db->qn('alt_text') . ' = ' . $db->quote($strImageHover)) + ->set($db->qn('image_link') . ' = ' . $db->quote($strImageLink)) + ->where($db->qn('itemid') . ' = ' . (int) $sectionId) + ->where($db->qn('section') . ' = ' . $db->quote($fieldSection)) + ->where($db->qn('user_email') . ' = ' . $db->quote($userEmail)) + ->where($db->qn('fieldid') . ' = ' . (int) $row->id); + + $db->setQuery($sql)->execute(); + } + + // Reset $sql query + $sql = $db->getQuery(true); + + if (!empty($list)) + { + $sql->update($db->qn('#__redshop_fields_data')) + ->set($db->qn('data_txt') . ' = ' . $db->quote((string) $data['imgFieldId' . $row->id])) + ->where($db->qn('itemid') . ' = ' . (int) $sectionId) + ->where($db->qn('section') . ' = ' . $db->quote($fieldSection)) + ->where($db->qn('user_email') . ' = ' . $db->quote($userEmail)) + ->where($db->qn('fieldid') . ' = ' . (int) $row->id); + } + else + { + $sql->insert($db->qn('#__redshop_fields_data')) + ->columns($db->qn(array('fieldid', 'data_txt', 'itemid', 'section', 'alt_text', 'image_link', 'user_email'))) + ->values( + implode( + ',', + array( + (int) $row->id, + $db->quote($data['imgFieldId' . $row->id]), + (int) $sectionId, + $db->quote($fieldSection), + $db->quote($strImageHover), + $db->quote($strImageLink), + $db->quote($userEmail) + ) + ) + ); + } + + $db->setQuery($sql); + $db->execute(); + } + else + { + if ($row->type == self::TYPE_CHECK_BOX || $row->type == self::TYPE_RADIO_BUTTON) + { + $dataTxt = urldecode($dataTxt); + } + + foreach ($sections as $section) + { + $list = self::getSectionFieldDataList($row->id, (int) $section, (int) $sectionId, $userEmail); + $sql = $db->getQuery(true); + + if (!empty($list)) + { + $sql->update($db->qn('#__redshop_fields_data')) + ->set($db->qn('data_txt') . ' = ' . $db->quote($dataTxt)) + ->where($db->qn('itemid') . ' = ' . (int) $sectionId) + ->where($db->qn('section') . ' = ' . (int) $section) + ->where($db->qn('user_email') . ' = ' . $db->quote($userEmail)) + ->where($db->qn('fieldid') . ' = ' . (int) $row->id); + + $db->setQuery($sql)->execute(); + + continue; + } + + if (!empty($dataTxt)) + { + $sql->insert($db->qn('#__redshop_fields_data')) + ->columns($db->qn(array('fieldid', 'data_txt', 'itemid', 'section', 'user_email'))) + ->values( + implode( + ',', + array( + (int) $row->id, + $db->quote($dataTxt), + (int) $sectionId, + (int) $section, + $db->quote($userEmail) + ) + ) + ); + + $db->setQuery($sql)->execute(); + } + } + } + } + } + + /** + * Validate Extra Field + * + * @param integer $fieldSection Field Section List + * @param integer $sectionId Section ID + * + * @return boolean + * + * @since 2.0.3 + */ + public static function CheckExtraFieldValidation($fieldSection = 0, $sectionId = 0) + { + $rowData = self::getSectionFieldList($fieldSection); + + for ($i = 0, $in = count($rowData); $i < $in; $i++) + { + $required = $rowData[$i]->required; + $dataValue = self::getSectionFieldDataList($rowData[$i]->id, $fieldSection, $sectionId); + + if (empty($dataValue) && $required) + { + return $rowData[$i]->title; + } + } + + return false; + } + + /** + * List all fields and display + * + * @param integer $fieldSection Field section + * @param integer $sectionId Section ID + * @param integer $flag Flag + * @param string $userEmail User email + * @param string $templateDesc Template description + * @param boolean $sendmail True/ False + * + * @return string + * + * @since 2.0.3 + */ + public static function listAllFieldDisplay($fieldSection = 0, $sectionId = 0, $flag = 0, $userEmail = "", $templateDesc = "", $sendmail = false) + { + $rowData = self::getSectionFieldList($fieldSection); + + $exField = ''; + + for ($i = 0, $in = count($rowData); $i < $in; $i++) + { + $type = $rowData[$i]->type; + $extraFieldValue = ""; + $extraFieldLabel = $rowData[$i]->title; + + if ($flag == 1) + { + if ($i > 0) + { + $exField .= "
    "; + } + + $exField .= JText::_($extraFieldLabel) . ' : '; + } + + $dataValue = self::getSectionFieldDataList($rowData[$i]->id, $fieldSection, $sectionId, $userEmail); + + switch ($type) + { + case self::TYPE_TEXT: + $extraFieldValue = ($dataValue && $dataValue->data_txt) ? $dataValue->data_txt : ''; + $exField .= RedshopLayoutHelper::render( + 'field_display.text', + array( + 'extraFieldLabel' => $extraFieldLabel, + 'extraFieldValue' => $extraFieldValue, + 'sendMail' => $sendmail + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + break; + + case self::TYPE_TEXT_AREA: + $extraFieldValue = ($dataValue && $dataValue->data_txt) ? $dataValue->data_txt : ''; + $exField .= RedshopLayoutHelper::render( + 'field_display.textarea', + array( + 'extraFieldLabel' => $extraFieldLabel, + 'extraFieldValue' => $extraFieldValue, + 'sendMail' => $sendmail + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + break; + + case self::TYPE_CHECK_BOX: + $fieldChk = RedshopEntityField::getInstance($rowData[$i]->id)->getFieldValues(); + $chkData = !empty($dataValue->data_txt) ? explode(",", $dataValue->data_txt) : array(); + $extraFieldValue = ''; + + foreach ($fieldChk as $key => $data) + { + if (!in_array($data->field_value, $chkData)) + { + continue; + } + + $extraFieldValue .= $data->field_value; + } + + $exField .= RedshopLayoutHelper::render( + 'field_display.checkbox', + array( + 'extraFieldLabel' => $extraFieldLabel, + 'extraFieldValue' => $extraFieldValue, + 'sendMail' => $sendmail + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + break; + + case self::TYPE_RADIO_BUTTON: + $fieldChk = RedshopEntityField::getInstance($rowData[$i]->id)->getFieldValues(); + $chkData = !empty($dataValue->data_txt) ? explode(",", $dataValue->data_txt) : array(); + $extraFieldValue = ''; + + foreach ($fieldChk as $key => $data) + { + if (!in_array($data->field_value, $chkData)) + { + continue; + } + + $extraFieldValue .= $data->field_value; + } + + $exField .= RedshopLayoutHelper::render( + 'field_display.radio', + array( + 'extraFieldLabel' => $extraFieldLabel, + 'extraFieldValue' => $extraFieldValue, + 'sendMail' => $sendmail + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + break; + + case self::TYPE_SELECT_BOX_SINGLE: + $fieldChk = RedshopEntityField::getInstance($rowData[$i]->id)->getFieldValues(); + $chkData = !empty($dataValue->data_txt) ? explode(",", $dataValue->data_txt) : array(); + $extraFieldValue = ''; + + foreach ($fieldChk as $key => $data) + { + if (!in_array($data->field_value, $chkData)) + { + continue; + } + + $extraFieldValue .= $data->field_value; + } + + $exField .= RedshopLayoutHelper::render( + 'field_display.select', + array( + 'extraFieldLabel' => $extraFieldLabel, + 'extraFieldValue' => $extraFieldValue, + 'sendMail' => $sendmail + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + break; + + case self::TYPE_SELECT_BOX_MULTIPLE: + $fieldChk = RedshopEntityField::getInstance($rowData[$i]->id)->getFieldValues(); + $chkData = !empty($dataValue->data_txt) ? explode(",", $dataValue->data_txt) : array(); + $extraFieldValue = array(); + + foreach ($fieldChk as $key => $data) + { + if (!in_array($data->field_value, $chkData)) + { + continue; + } + + $extraFieldValue[] = $data->field_value; + } + + $exField .= RedshopLayoutHelper::render( + 'field_display.multiple', + array( + 'extraFieldLabel' => $extraFieldLabel, + 'extraFieldValue' => $extraFieldValue, + 'sendMail' => $sendmail + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + break; + + case self::TYPE_SELECT_COUNTRY_BOX: + $extraFieldValue = ""; + + if ($dataValue && $dataValue->data_txt) + { + $fieldChk = RedshopEntityCountry::getInstance($dataValue->data_txt); + $extraFieldValue = $fieldChk->get('country_name'); + } + + $exField .= RedshopLayoutHelper::render( + 'field_display.country', + array( + 'extraFieldLabel' => $extraFieldLabel, + 'extraFieldValue' => $extraFieldValue, + 'sendMail' => $sendmail + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + break; + + // 12 :- Date Picker + case self::TYPE_DATE_PICKER: + $extraFieldValue = ($dataValue && $dataValue->data_txt) ? $dataValue->data_txt : ''; + $exField .= RedshopLayoutHelper::render( + 'field_display.datepicker', + array( + 'extraFieldLabel' => $extraFieldLabel, + 'extraFieldValue' => $extraFieldValue, + 'sendMail' => $sendmail + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + break; + } + + if (trim($templateDesc) != '') + { + if (strstr($templateDesc, "{" . $rowData[$i]->name . "}")) + { + $templateDesc = str_replace("{" . $rowData[$i]->name . "}", $extraFieldValue, $templateDesc); + $templateDesc = str_replace("{" . $rowData[$i]->name . "_lbl}", $extraFieldLabel, $templateDesc); + } + + $templateDesc = str_replace("{" . $rowData[$i]->name . "}", "", $templateDesc); + $templateDesc = str_replace("{" . $rowData[$i]->name . "_lbl}", "", $templateDesc); + } + } + + if (trim($templateDesc) != '') + { + return $templateDesc; + } + + if ($flag == 0 && !empty($extraFieldLabel)) + { + $client = null; + $fieldLayout = 'fields.display'; + + if ($sendmail) + { + $fieldLayout = 'fields.mail'; + $client = array('client' => 0); + } + + return RedshopLayoutHelper::render( + $fieldLayout, + array('extraFieldValue' => $exField), + null, + $client + ); + } + + return $exField; + } + + /** + * List all user fields + * + * @param string $fieldSection Field Section + * @param integer $sectionId Section ID + * @param string $fieldType Field type + * @param string $uniqueId Unique ID + * + * @return array + * + * @since 2.0.3 + */ + public static function listAllUserFields($fieldSection = "", $sectionId = self::SECTION_PRODUCT_USERFIELD, $fieldType = '', $uniqueId = '') + { + /** @scrutinizer ignore-deprecated */ + JHtml::script('com_redshop/redshop.attribute.min.js', false, true); + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('*') + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('section') . ' = ' . (int) $sectionId) + ->where($db->qn('name') . ' = ' . $db->quote($fieldSection)) + ->where($db->qn('published') . ' = 1'); + + $rowData = $db->setQuery($query)->loadObjectList(); + $exField = ''; + $exFieldTitle = ''; + $cart = RedshopHelperCartSession::getCart(); + $idx = 0; + + if (isset($cart['idx'])) + { + $idx = (int) ($cart['idx']); + } + + for ($i = 0, $in = count($rowData); $i < $in; $i++) + { + $type = $rowData[$i]->type; + $asterisk = $rowData[$i]->required > 0 ? '* ' : ''; + + if ($fieldType != 'hidden') + { + $exFieldTitle .= '
    ' . $asterisk . $rowData[$i]->title . '
    '; + } + + if ($fieldType == 'hidden') + { + $exField .= ''; + } + else + { + $req = ' required = "' . $rowData[$i]->required . '"'; + + switch ($type) + { + case self::TYPE_TEXT: + $exField .= RedshopLayoutHelper::render( + 'extrafields.userfield.text', + array( + 'rowData' => $rowData[$i], + 'required' => $req, + 'uniqueId' => $uniqueId + ) + ); + break; + + case self::TYPE_TEXT_AREA: + $exField .= RedshopLayoutHelper::render( + 'extrafields.userfield.textarea', + array( + 'rowData' => $rowData[$i], + 'required' => $req, + 'uniqueId' => $uniqueId + ) + ); + break; + + case self::TYPE_CHECK_BOX: + $fieldChk = RedshopEntityField::getInstance($rowData[$i]->id)->getFieldValues(); + $chkData = explode(",", $cart[$idx][$rowData[$i]->name]); + $exField .= RedshopLayoutHelper::render( + 'extrafields.userfield.checkbox', + array( + 'rowData' => $rowData[$i], + 'required' => $req, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData, + 'uniqueId' => $uniqueId + ) + ); + break; + + case self::TYPE_RADIO_BUTTON: + $fieldChk = RedshopEntityField::getInstance($rowData[$i]->id)->getFieldValues(); + $chkData = explode(",", $cart[$idx][$rowData[$i]->name]); + $exField .= RedshopLayoutHelper::render( + 'extrafields.userfield.radio', + array( + 'rowData' => $rowData[$i], + 'required' => $req, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData, + 'uniqueId' => $uniqueId + ) + ); + break; + + case self::TYPE_SELECT_BOX_SINGLE: + $fieldChk = RedshopEntityField::getInstance($rowData[$i]->id)->getFieldValues(); + $chkData = explode(",", $cart[$idx][$rowData[$i]->name]); + $exField .= RedshopLayoutHelper::render( + 'extrafields.userfield.select', + array( + 'rowData' => $rowData[$i], + 'required' => $req, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData, + 'uniqueId' => $uniqueId + ) + ); + break; + + case self::TYPE_SELECT_BOX_MULTIPLE: + $fieldChk = RedshopEntityField::getInstance($rowData[$i]->id)->getFieldValues(); + $chkData = explode(",", $cart[$idx][$rowData[$i]->name]); + $exField .= RedshopLayoutHelper::render( + 'extrafields.userfield.multiple', + array( + 'rowData' => $rowData[$i], + 'required' => $req, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData, + 'uniqueId' => $uniqueId + ) + ); + break; + + case self::TYPE_DOCUMENTS: + $exField .= RedshopLayoutHelper::render( + 'extrafields.userfield.document', + array( + 'rowData' => $rowData[$i], + 'required' => $req, + 'fieldCheck' => $req, + 'uniqueId' => $uniqueId + ) + ); + break; + + case self::TYPE_IMAGE_SELECT: + $fieldChk = RedshopEntityField::getInstance($rowData[$i]->id)->getFieldValues(); + $chkData = explode(",", $cart[$idx][$rowData[$i]->name]); + $exField .= RedshopLayoutHelper::render( + 'extrafields.userfield.image', + array( + 'rowData' => $rowData[$i], + 'required' => $req, + 'fieldCheck' => $fieldChk, + 'checkData' => $chkData, + 'uniqueId' => $uniqueId + ) + ); + break; + + case self::TYPE_DATE_PICKER: + $req = $rowData[$i]->required; + $exField .= RedshopLayoutHelper::render( + 'extrafields.userfield.date_picker', + array( + 'rowData' => $rowData[$i], + 'required' => $req, + 'fieldCheck' => $req, + 'uniqueId' => $uniqueId + ) + ); + break; + } + } + + if (trim($rowData[$i]->desc) != '' && $fieldType != 'hidden') + { + $exField .= '
      ' + . JHtml::tooltip($rowData[$i]->desc, $rowData[$i]->name, 'tooltip.png', '', '', false) + . '
    '; + } + } + + return array($exFieldTitle, $exField); + } + + /** + * Render HTML radio list + * + * @param string $name Name of radio checkbox + * @param mixed $attribs Attribute values + * @param array $selected The name of the object variable for the option text + * @param string $yes Option Days + * @param string $no Option Weeks + * @param boolean $id ID of radio checkbox + * + * @return string + * + * @since 2.0.3 + */ + public static function booleanList($name, $attribs = null, $selected = null, $yes = 'yes', $no = 'no', $id = false) + { + $arr = array( + JHtml::_('select.option', "Days", JText::_($yes)), + JHtml::_('select.option', "Weeks", JText::_($no)) + ); + + return JHtml::_('select.radiolist', $arr, $name, $attribs, 'value', 'text', $selected, $id); + } + + /** + * Render HTML radio list with options + * + * @param string $name Name of radio checkbox + * @param mixed $attribs Attribute values + * @param array $selected The name of the object variable for the option text + * @param string $yes Option Days + * @param string $no Option Weeks + * @param boolean $id ID of radio checkbox + * @param string $yesValue ID of radio checkbox + * @param string $noValue ID of radio checkbox + * + * @return string + * + * @since 2.0.3 + */ + public static function rsBooleanList($name, $attribs = null, $selected = null, $yes = 'yes', $no = 'no', $id = false, $yesValue = 'Days', $noValue = 'Weeks') + { + $arr = array( + JHtml::_('select.option', $yesValue, JText::_($yes)), + JHtml::_('select.option', $noValue, JText::_($no)) + ); + + return JHtml::_('redshopselect.radiolist', $arr, $name, $attribs, 'value', 'text', $selected, $id); + } + + /** + * Get fields value by ID + * + * @param integer $id ID of field + * + * @return array + * + * @since 2.0.3 + * + * @deprecated 2.0.6 Use RedshopEntityField::getFieldValues instead. + */ + public static function getFieldValue($id) + { + return RedshopEntityField::getInstance($id)->getFieldValues(); + } + + /** + * Get Section Field List + * + * @param integer $section Section ID + * @param integer $front Field show in front + * @param integer $published Field show in front + * @param integer $required Field show in front + * + * @return array + * + * @since 2.0.3 + */ + public static function getSectionFieldList($section = self::SECTION_PRODUCT_USERFIELD, $front = null, $published = 1, $required = 0) + { + $key = $section . '_' . $front . '_' . $published . '_' . $required; + + if (!array_key_exists($key, static::$sectionFields)) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select('*') + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('section') . ' = ' . (int) $section) + ->order($db->qn('ordering')); + + if (null !== $front) + { + $query->where($db->qn('show_in_front') . ' = ' . (int) $front); + } + + if ($published) + { + $query->where($db->qn('published') . ' = ' . (int) $published); + } + + if ($required) + { + $query->where($db->qn('required') . ' = ' . (int) $required); + } + + static::$sectionFields[$key] = $db->setQuery($query)->loadObjectList(); + } + + return static::$sectionFields[$key]; + } + + /** + * Get section field data list + * + * @param integer $fieldId Field ID + * @param integer $section Section ID + * @param integer $orderItemId Order Item ID + * @param string $userEmail User Email + * + * @return object + * + * @since 2.0.3 + */ + public static function getSectionFieldDataList($fieldId, $section = 0, $orderItemId = 0, $userEmail = "") + { + JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_redshop/models', 'RedshopModel'); + + /** @var RedshopModelFields $model */ + $model = JModelLegacy::getInstance('Fields', 'RedshopModel'); + + return $model->getFieldDataList($fieldId, $section, $orderItemId, $userEmail); + } + + /** + * Copy product extra field + * + * @param integer $oldProductId Old Product ID + * @param integer $newPid New Product ID + * + * @return void + * + * @since 2.0.3 + */ + public static function copyProductExtraField($oldProductId, $newPid) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->select('*') + ->from($db->qn('#__redshop_fields_data')) + ->where($db->qn('itemid') . ' = ' . (int) $oldProductId) + ->where( + '(' . $db->qn('section') . ' = ' . $db->quote('1') + . ' or ' . + $db->qn('section') . ' = ' . $db->quote('12') + . ' or ' . + $db->qn('section') . ' = ' . $db->quote('17') . ')' + ); + + $db->setQuery($query); + $list = $db->loadObjectList(); + + // Skip process if there are no custom fields. + if (empty($list)) + { + return; + } + + $query->clear() + ->insert($db->qn('#__redshop_fields_data')) + ->columns($db->qn(array('fieldid', 'data_txt', 'itemid', 'section', 'alt_text', 'image_link', 'user_email'))); + + foreach ($list as $row) + { + $query->values( + implode(',', array( + (int) $row->fieldid, + $db->quote($row->data_txt), + (int) $newPid, + (int) $row->section, + $db->quote($row->alt_text), + $db->quote($row->image_link), + $db->quote($row->user_email)) + ) + ); + } + + $db->setQuery($query)->execute(); + } + + /** + * Delete extra field data + * + * @param integer $dataId Data ID + * + * @return void + * + * @since 2.0.3 + */ + public static function deleteExtraFieldData($dataId) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->delete($db->qn('#__redshop_fields_data')) + ->where($db->qn('data_id') . ' = ' . (int) $dataId); + + $db->setQuery($query); + $db->execute(); + } + + /** + * Method for render HTML of extra fields + * + * @param integer $fieldSection Field section + * @param integer $sectionId ID of section + * @param string $fieldName Field name + * @param string $templateContent HTML template content + * @param integer $categoryPage Category page + * + * @return mixed + * @throws Exception + * + * @since 2.0.6 + * + * @deprecated 2.1.0 + */ + public static function extraFieldDisplay($fieldSection = 0, $sectionId = 0, $fieldName = "", $templateContent = "", $categoryPage = 0) + { + return ExtraFields::displayExtraFields($fieldSection, $sectionId, $fieldName, $templateContent, (boolean) $categoryPage); + } +} diff --git a/libraries/redshop/helper/googleanalytics.php b/libraries/redshop/helper/googleanalytics.php new file mode 100644 index 00000000000..bf05f1278f5 --- /dev/null +++ b/libraries/redshop/helper/googleanalytics.php @@ -0,0 +1,92 @@ + diff --git a/libraries/redshop/helper/joomla.php b/libraries/redshop/helper/joomla.php new file mode 100644 index 00000000000..9aca98bd5a2 --- /dev/null +++ b/libraries/redshop/helper/joomla.php @@ -0,0 +1,314 @@ +getQuery(true) + ->select('manifest_cache') + ->from($db->qn('#__extensions')) + ->where('type = ' . $db->q('component')) + ->where('element = ' . $db->q('com_redshop')); + $oldManifest = json_decode($db->setQuery($query)->loadResult(), true); + } + + if (isset($oldManifest[$name])) + { + return $oldManifest[$name]; + } + else + { + return $default; + } + } + + /** + * Method for create Joomla user. + * + * @param array $data User data. + * @param boolean $createUser Create user + * + * @return boolean|JUser|stdClass JUser if success. False otherwise. + * + * @since 2.0.7 + * + * @throws Exception + */ + public static function createJoomlaUser($data, $createUser = false) + { + $app = JFactory::getApplication(); + $input = $app->input; + + $createUser = isset($data['createaccount']) ? (boolean) $data['createaccount'] : $createUser; + + // Registration is without account creation REGISTER_METHOD = 1 + // Or Optional account creation + if (Redshop::getConfig()->get('REGISTER_METHOD') == 1 || (Redshop::getConfig()->get('REGISTER_METHOD') == 2 && !$createUser)) + { + $user = new stdClass; + $user->id = 0; + + return $user; + } + + $data['password'] = $input->post->get('password1', '', 'RAW'); + $data['password2'] = $input->post->get('password2', '', 'RAW'); + $data['email'] = $data['email1']; + $data['name'] = $name = $data['firstname']; + + $userParams = JComponentHelper::getParams('com_users'); + + // Prevent front-end user to change user group in the form and then being able to register on any Joomla! user group. + if ($app->isSite()) + { + $data['groups'] = array($userParams->get('new_usertype', 2)); + } + + // Do a password safety check + if (Redshop::getConfig()->get('REGISTER_METHOD') == 3) + { + // Silent registration + $betterToken = substr(uniqid(md5(rand()), true), 0, 10); + + $data['username'] = $data['email']; + $data['password'] = $betterToken; + $data['password2'] = $betterToken; + + $input->post->set('password1', $betterToken); + } + + if (trim($data['email']) == "") + { + JError::raiseWarning('', JText::_('COM_REDSHOP_EMPTY_EMAIL')); + + return false; + } + + if (trim($data['username']) == "") + { + JError::raiseWarning('', JText::_('COM_REDSHOP_EMPTY_USERNAME')); + + return false; + } + + if (RedshopHelperUser::validateUser($data['username']) > 0) + { + JError::raiseWarning('', JText::_('COM_REDSHOP_USERNAME_ALREADY_EXISTS')); + + return false; + } + + if (RedshopHelperUser::validateEmail($data['email']) > 0) + { + JError::raiseWarning('', JText::_('COM_REDSHOP_EMAIL_ALREADY_EXISTS')); + + return false; + } + + // Check: Password is empty + if (trim($data['password']) == "") + { + JError::raiseWarning('', JText::_('COM_REDSHOP_EMPTY_PASSWORD')); + + return false; + } + + // Check: Password not match + if ($data['password'] != $data['password2']) + { + JError::raiseWarning('', JText::_('COM_REDSHOP_PASSWORDS_DO_NOT_MATCH')); + + return false; + } + + JPluginHelper::importPlugin('redshop_user'); + RedshopHelperUtility::getDispatcher()->trigger('onBeforeCreateJoomlaUser', array(&$data)); + + // Get required system objects + $user = clone JFactory::getUser(); + + // If user registration is not allowed, show 403 not authorized. + if (!$user->bind($data)) + { + JError::raiseError(500, $user->getError()); + + return false; + } + + $date = JFactory::getDate(); + $user->set('id', 0); + $user->set('registerDate', $date->toSql()); + + // If user activation is turned on, we need to set the activation information + $activationMethod = $userParams->get('useractivation'); + + if ($activationMethod == '1') + { + $user->set('activation', JApplication::getHash(JUserHelper::genRandomPassword())); + $user->set('block', '0'); + } + + $user->set('name', $name); + $user->name = $name; + + // If there was an error with registration, set the message and display form + if (!$user->save()) + { + JError::raiseWarning('', JText::_($user->getError())); + + return false; + } + + $credentials = array(); + $credentials['username'] = $data['username']; + $credentials['password'] = $data['password2']; + + // Perform the login action + if (!JFactory::getUser()->id) + { + $app->login($credentials); + } + + RedshopHelperUtility::getDispatcher()->trigger('onAfterCreateJoomlaUser', array(&$user)); + + return $user; + } + + /** + * Method for update Joomla user. + * + * @param array $data User data. + * + * @return boolean|JUser|stdClass JUser if success. False otherwise. + * + * @since 2.0.7 + * + * @throws Exception + */ + public static function updateJoomlaUser($data) + { + $app = JFactory::getApplication(); + + if ((!$app->isAdmin() && (Redshop::getConfig()->get('REGISTER_METHOD') == 1 || $data['user_id'] < 0)) + || $app->isAdmin() && $data['user_id'] < 0 && isset($data['users_info_id'])) + { + $reduser = new stdClass; + $reduser->id = $data['user_id']; + + return $reduser; + } + + $me = JFactory::getUser(); + + $data['name'] = $name = $data['firstname']; + + // Check: Username is not empty + if (trim($data['username']) == "") + { + JError::raiseWarning('', JText::_('COM_REDSHOP_EMPTY_USERNAME')); + + return false; + } + + // Check: Validate username. + if (RedshopHelperUser::validateUser($data['username'], $data['user_id'])) + { + JError::raiseWarning('', JText::_('COM_REDSHOP_USERNAME_ALREADY_EXISTS')); + + return false; + } + + // Check: Email not empty. + if (trim($data['email']) == "") + { + JError::raiseWarning('', JText::_('EMPTY_EMAIL')); + + return false; + } + + // Check: Validate email + if (RedshopHelperUser::validateEmail($data['email'], $data['user_id'])) + { + JError::raiseWarning('', JText::_('COM_REDSHOP_EMAIL_ALREADY_EXISTS')); + + return false; + } + + // Get required system objects + $user = new JUser($data['user_id']); + + if (!$user->bind($data)) + { + JError::raiseError(500, $user->getError()); + + return false; + } + + // Initialise variables; + $pk = $user->get('id'); + + if ($user->get('block') && $pk == $me->id && !$me->block) + { + $app->enqueueMessage(JText::_('YOU_CANNOT_BLOCK_YOURSELF!'), 'error'); + + return false; + } + + // Make sure that we are not removing ourself from Super Admin group + if ($me->authorise('core.admin') && $me->get('id') == $pk) + { + // Check that at least one of our new groups is Super Admin + $stillSuperAdmin = false; + $myNewGroups = $user->groups; + + foreach ($myNewGroups as $group) + { + $stillSuperAdmin = ($stillSuperAdmin) ? ($stillSuperAdmin) : JAccess::checkGroup($group, 'core.admin'); + } + + if (!$stillSuperAdmin) + { + $app->enqueueMessage(JText::_('COM_USERS_USERS_ERROR_CANNOT_DEMOTE_SELF'), 'error'); + + return false; + } + } + + // If there was an error with registration, set the message and display form + if (!$user->save()) + { + JError::raiseWarning('', JText::_($user->getError())); + + return false; + } + + return $user; + } +} diff --git a/libraries/redshop/helper/js.php b/libraries/redshop/helper/js.php new file mode 100644 index 00000000000..3716e811f0a --- /dev/null +++ b/libraries/redshop/helper/js.php @@ -0,0 +1,183 @@ +input; + $session = JFactory::getSession(); + + $view = $input->getCmd('view'); + $layout = $input->getCmd('layout'); + $config = Redshop::getConfig(); + $post = $input->post->getArray(); + + $currencySymbol = $config->get('REDCURRENCY_SYMBOL', ''); + $currencyConvert = 1; + + if (isset($post['product_currency'])) + { + $session->set('product_currency', $post['product_currency']); + } + + if ($session->get('product_currency')) + { + $currencySymbol = RedshopEntityCurrency::getInstance((int) $session->get('product_currency'))->get('code'); + $currencyConvert = round(RedshopHelperCurrency::convert(1), 2); + } + + $token = JSession::getFormToken(); + + // Prepare dynamic variables to add them in javascript stack + $dynamicVars = array( + 'SITE_URL' => JUri::root(), + 'AJAX_TOKEN' => $token, + 'AJAX_BASE_URL' => "index.php?tmpl=component&option=com_redshop&" . $token . "=1", + 'AJAX_CART_BOX' => $config->get('AJAX_CART_BOX'), + 'REDSHOP_VIEW' => $view, + 'REDSHOP_LAYOUT' => $layout, + 'CURRENCY_SYMBOL_CONVERT' => $currencySymbol, + 'CURRENCY_CONVERT' => $currencyConvert, + 'PRICE_SEPERATOR' => $config->get('PRICE_SEPERATOR'), + 'CURRENCY_SYMBOL_POSITION' => $config->get('CURRENCY_SYMBOL_POSITION'), + 'PRICE_DECIMAL' => $config->get('PRICE_DECIMAL'), + 'THOUSAND_SEPERATOR' => $config->get('THOUSAND_SEPERATOR', ''), + 'USE_STOCKROOM' => $config->get('USE_STOCKROOM'), + 'USE_AS_CATALOG' => $config->get('USE_AS_CATALOG'), + 'AJAX_CART_DISPLAY_TIME' => $config->get('AJAX_CART_DISPLAY_TIME'), + 'SHOW_PRICE' => $config->get('SHOW_PRICE'), + 'BASE_TAX' => RedshopHelperProduct::getProductTax(0, 1), + 'DEFAULT_QUOTATION_MODE' => $config->get('DEFAULT_QUOTATION_MODE'), + 'PRICE_REPLACE' => $config->get('PRICE_REPLACE'), + 'ALLOW_PRE_ORDER' => $config->get('ALLOW_PRE_ORDER'), + 'ATTRIBUTE_SCROLLER_THUMB_WIDTH' => $config->get('ATTRIBUTE_SCROLLER_THUMB_WIDTH'), + 'ATTRIBUTE_SCROLLER_THUMB_HEIGHT' => $config->get('ATTRIBUTE_SCROLLER_THUMB_HEIGHT'), + 'PRODUCT_DETAIL_IS_LIGHTBOX' => $config->get('PRODUCT_DETAIL_IS_LIGHTBOX'), + 'REQUIRED_VAT_NUMBER' => $config->get('REQUIRED_VAT_NUMBER'), + 'NOOF_SUBATTRIB_THUMB_FOR_SCROLLER' => $config->get('NOOF_SUBATTRIB_THUMB_FOR_SCROLLER'), + 'SHOW_QUOTATION_PRICE' => $config->get('SHOW_QUOTATION_PRICE'), + 'AJAX_DETAIL_BOX_WIDTH' => $config->get('AJAX_DETAIL_BOX_WIDTH'), + 'AJAX_DETAIL_BOX_HEIGHT' => $config->get('AJAX_DETAIL_BOX_HEIGHT'), + 'AJAX_BOX_WIDTH' => $config->get('AJAX_BOX_WIDTH'), + 'AJAX_BOX_HEIGHT' => $config->get('AJAX_BOX_HEIGHT'), + 'PRICE_REPLACE_URL' => $config->get('PRICE_REPLACE_URL'), + 'ZERO_PRICE_REPLACE_URL' => $config->get('ZERO_PRICE_REPLACE_URL'), + 'ZERO_PRICE_REPLACE' => $config->get('ZERO_PRICE_REPLACE') + ); + + // Current Shopper Group - Show price with VAT config + $shopperGroupData = RedshopEntityShopper_Group::getInstance(RedshopHelperUser::getShopperGroup(JFactory::getUser()->id))->getItem(); + + $dynamicVars['SHOW_PRICE_WITHOUT_VAT'] = $shopperGroupData ? (int) $shopperGroupData->show_price_without_vat : 0; + + $backwardJS = array(); + + // Now looping to add dynamic vars into javascript stack + foreach ($dynamicVars as $key => $value) + { + if (Redshop::getConfig()->get('BACKWARD_COMPATIBLE_JS') == 1) + { + $backwardJS[] = 'window.' . $key . ' = "' . $value . '";'; + } + + RedshopHelperConfig::script($key, $value); + } + + if (Redshop::getConfig()->get('BACKWARD_COMPATIBLE_JS') == 1) + { + JFactory::getDocument()->addScriptDeclaration(implode("\n", $backwardJS)); + } + + // Prepare language string to add in javascript store + $languages = array( + 'COM_REDSHOP_YOUR_MUST_PROVIDE_A_FIRSTNAME', + 'COM_REDSHOP_USERNAME_ALREADY_EXISTS', + 'COM_REDSHOP_PRODUCT_OUTOFSTOCK_MESSAGE', + 'COM_REDSHOP_PREORDER_PRODUCT_OUTOFSTOCK_MESSAGE', + 'COM_REDSHOP_PASSWORD_MIN_CHARACTER_LIMIT', + 'COM_REDSHOP_YOUR_MUST_PROVIDE_A_VALID_PHONE', + 'COM_REDSHOP_IS_REQUIRED', + 'COM_REDSHOP_ENTER_NUMBER', + 'COM_REDSHOP_PLEASE_ENTER_COMPANY_NAME', + 'COM_REDSHOP_YOUR_MUST_PROVIDE_A_LASTNAME', + 'COM_REDSHOP_YOUR_MUST_PROVIDE_A_ADDRESS', + 'COM_REDSHOP_YOUR_MUST_PROVIDE_A_ZIP', + 'COM_REDSHOP_YOUR_MUST_PROVIDE_A_CITY', + 'COM_REDSHOP_YOUR_MUST_PROVIDE_A_PHONE', + 'COM_REDSHOP_YOU_MUST_PROVIDE_LOGIN_NAME', + 'COM_REDSHOP_PROVIDE_EMAIL_ADDRESS', + 'COM_REDSHOP_EMAIL_NOT_MATCH', + 'COM_REDSHOP_PASSWORD_NOT_MATCH', + 'COM_REDSHOP_PLEASE_SELECT_TEMS_CONDITIONS', + 'COM_REDSHOP_NOT_AVAILABLE', + 'COM_REDSHOP_PLEASE_INSERT_HEIGHT', + 'COM_REDSHOP_PLEASE_INSERT_WIDTH', + 'COM_REDSHOP_PLEASE_INSERT_DEPTH', + 'COM_REDSHOP_PLEASE_INSERT_RADIUS', + 'COM_REDSHOP_PLEASE_INSERT_UNIT', + 'COM_REDSHOP_THIS_FIELD_IS_REQUIRED', + 'COM_REDSHOP_SELECT_SUBSCRIPTION_PLAN', + 'COM_REDSHOP_USERNAME_MIN_CHARACTER_LIMIT', + 'COM_REDSHOP_EAN_MIN_CHARACTER_LIMIT', + 'COM_REDSHOP_AVAILABLE_STOCK', + 'COM_REDSHOP_PLEASE_ENTER_VALID_EMAIL_ADDRESS' + ); + + $backwardJS = array(); + + // Now looping to add language strings into javascript store + foreach ($languages as $value) + { + JText::script($value); + + if (Redshop::getConfig()->get('BACKWARD_COMPATIBLE_JS') == 1) + { + $backwardJS[] = 'window.' . $value . ' = "' . JText::_($value) . '";'; + } + } + + if (Redshop::getConfig()->get('BACKWARD_COMPATIBLE_JS') == 1) + { + JFactory::getDocument()->addScriptDeclaration(implode("\n", $backwardJS)); + } + + if ($view == 'product') + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'slimbox/' . $config->get('PRODUCT_DETAIL_LIGHTBOX_CLOSE_BUTTON_IMAGE'))) + { + $slimboxCloseButton = "#sbox-btn-close {background: transparent url( \"" + . REDSHOP_FRONT_IMAGES_ABSPATH . "slimbox/" . $config->get('PRODUCT_DETAIL_LIGHTBOX_CLOSE_BUTTON_IMAGE') + . "\" ) no-repeat center;}"; + } + else + { + $slimboxCloseButton = "#sbox-btn-close {background: transparent url( \"" + . REDSHOP_FRONT_IMAGES_ABSPATH . "slimbox/closelabel.gif\" ) no-repeat center;}"; + } + + $doc->addStyleDeclaration($slimboxCloseButton); + } + } +} diff --git a/libraries/redshop/helper/mail.php b/libraries/redshop/helper/mail.php new file mode 100644 index 00000000000..2ab10ac9d06 --- /dev/null +++ b/libraries/redshop/helper/mail.php @@ -0,0 +1,319 @@ +getQuery(true) + ->select($db->qn(array('id', 'name'))) + ->from($db->qn('#__redshop_manufacturer')); + + return $db->setQuery($query)->loadObjectlist(); + } +} diff --git a/libraries/redshop/helper/media.php b/libraries/redshop/helper/media.php new file mode 100644 index 00000000000..162727ce5fe --- /dev/null +++ b/libraries/redshop/helper/media.php @@ -0,0 +1,1014 @@ += 1024 && $size < 1024 * 1024) + { + return sprintf('%01.2f', $size / 1024.0) . ' Kb'; + } + + else + { + return sprintf('%01.2f', $size / (1024.0 * 1024)) . ' Mb'; + } + } + } + + /** + * Resize current resolution of an image to new width and height + * + * @param integer $width New width in pixel + * @param integer $height New height in pixel + * @param integer $target Current resolution + * + * @return array + * + * @since 2.0.0.3 + */ + public static function imageResize($width, $height, $target) + { + /** + * takes the larger size of the width and height and applies the + * formula accordingly...this is so this script will work + * dynamically with any size image + */ + if ($width > $height) + { + $percentage = ($target / $width); + } + else + { + $percentage = ($target / $height); + } + + // Gets the new value and applies the percentage, then rounds the value + $width = round($width * $percentage); + $height = round($height * $percentage); + + return array($width, $height); + } + + /** + * Checks amount of files in a directory + * + * @param string $dir Directory need to be checked + * + * @return array + * + * @since 2.0.0.3 + */ + public static function countFiles($dir) + { + return \Redshop\Environment\Directory::count($dir); + } + + /** + * Rework and standardlize file name. + * + * @param string $fileName File name + * @param integer $id ID current item + * + * @return string + * + * @since 2.0.0.3 + */ + public static function cleanFileName($fileName, $id = null) + { + $fileExt = strtolower(JFile::getExt($fileName)); + $fileNameNoExt = JFile::stripExt(basename($fileName)); + $fileNameNoExt = preg_replace("/[&'#]/", '', $fileNameNoExt); + $fileNameNoExt = JApplicationHelper::stringURLSafe($fileNameNoExt); + $fileName = JPath::clean($fileName); + $segments = explode(DIRECTORY_SEPARATOR, $fileName); + + if (strlen($fileNameNoExt) === 0) + { + $fileNameNoExt = $id; + } + + $fileNameNoExt = substr($fileNameNoExt, 0, 40); + $fileName = time() . '_' . $fileNameNoExt . '.' . $fileExt; + + if (!empty($segments)) + { + $segments[count($segments) - 1] = $fileName; + + return implode(DIRECTORY_SEPARATOR, $segments); + } + + return $fileName; + } + + /** + * Get redSHOP images live thumbnail path + * + * @param string $imageName Image Name + * @param string $dest Image Destination path + * @param string $command Commands like thumb, upload etc... + * @param string $type Thumbnail for types like, product, category, subcolor etc... + * @param integer $width Thumbnail Width + * @param integer $height Thumbnail Height + * @param integer $proportional Thumbnail Proportional sizing enable / disable. + * @param string $section Use on new structure of media folders. + * @param integer $sectionId Use on new structure of media folders. ID of section. + * + * @return string Thumbnail Live path + * @throws Exception + * + * @since 2.0.0.3 + */ + public static function getImagePath($imageName, $dest, $command = 'upload', $type = 'product', $width = 50, + $height = 50, $proportional = -1, $section = '', $sectionId = 0) + { + // Trying to set an optional argument + if ($proportional === -1) + { + $proportional = Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + } + + // Set Default Type + if (empty($type) || !$imageName) + { + return REDSHOP_FRONT_IMAGES_ABSPATH . 'noimage.jpg'; + } + + // Set Default Width + $width = $width <= 0 ? 50 : $width; + + // Set Default Height + $height = $height <= 0 ? 50 : $height; + + // Check section if in new media structure. + $filePath = JPATH_SITE . '/components/com_redshop/assets/images/' . $type . '/' . $imageName; + + if (in_array($section, array('manufacturer', 'category'))) + { + $filePath = REDSHOP_MEDIA_IMAGE_RELPATH . $section . '/' . $sectionId . '/' . $imageName; + } + + $physicalPath = self::generateImages($filePath, $dest, $width, $height, $command, $proportional); + + // Can not generate image + if (!$physicalPath) + { + return false; + } + + // Prevent space in file path + $physicalPath = str_replace(' ', '%20', $physicalPath); + + // Check section if in new media structure. + if (in_array($section, array('manufacturer', 'category'))) + { + return REDSHOP_MEDIA_IMAGE_ABSPATH . $section . '/' . $sectionId . '/thumb/' . basename($physicalPath); + } + + return REDSHOP_FRONT_IMAGES_ABSPATH . $type . '/thumb/' . basename($physicalPath); + } + + /** + * Generate thumbnail for image file + * + * @param string $filePath Path of an image + * @param string $dest Destination to generate is a new file path + * @param integer $width New width in pixel + * @param integer $height New height in pixel + * @param string $command Have 2 options: 'copy' or 'upload' + * @param integer $proportional Try to make image proportionally + * + * @return string Return destination of new thumbnail + * @throws Exception + * + * @since 2.0.0.3 + */ + public static function generateImages($filePath, $dest, $width, $height, $command = 'upload', $proportional = -1) + { + // Trying to set an optional argument + if ($proportional === -1) + { + $proportional = Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + } + + if (!JFile::exists($filePath)) + { + return false; + } + + $ret = false; + + switch (exif_imagetype($filePath)) + { + // IMAGETYPE_GIF + case '1': + + // IMAGETYPE_JPEG + case '2': + + // IMAGETYPE_PNG + case '3': + + // This method should be expanded to be usable for other purposes not just making thumbs + // But for now it just makes thumbs and proceed to the else part + if ($command != 'thumb') + { + switch ($command) + { + case 'copy': + if (!JFile::copy($filePath, $dest)) + { + return false; + } + + break; + case 'upload': + default: + if (!JFile::upload($filePath, $dest)) + { + return false; + } + break; + } + } + // Thumb + else + { + $srcPathInfo = pathinfo($filePath); + $dest = $srcPathInfo['dirname'] . '/thumb/' . $srcPathInfo['filename'] . '_w' + . $width . '_h' . $height . '.' . $srcPathInfo['extension']; + $ret = $dest; + + if (!JFile::exists($dest)) + { + $ret = self::writeImage($filePath, $dest, '', $width, $height, $proportional); + } + } + + break; + } + + return $ret; + } + + /** + * Copy an image to new destination + * + * @param string $src Source path need to copy + * @param string $dest Destination path to copy + * @param string $altDest If exist alternative path will replace destination path + * @param integer $width New width in pixel + * @param integer $height New height in pixel + * @param integer $proportional Try to make image proportionally + * + * @return string Return destination path + * @throws Exception + * + * @since 2.0.0.3 + */ + public static function writeImage($src, $dest, $altDest, $width, $height, $proportional = -1) + { + // Trying to set an optional argument + if ($proportional == -1) + { + $proportional = Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + } + + ob_start(); + self::resizeImage($src, $width, $height, $proportional, 'browser', false); + $contents = ob_get_contents(); + ob_end_clean(); + + if (JFile::exists($dest) && $altDest != '') + { + if (JFile::exists($altDest)) + { + return false; + } + + $dest = $altDest; + } + + if (!JFile::write($dest, $contents)) + { + return false; + } + + return $dest; + } + + /** + * Create a directory + * + * @param string $path New directory path + * + * @return boolean Return true or false + * + * @since 2.0.0.3 + */ + public static function createDir($path) + { + return \Redshop\Environment\Directory::create($path); + } + + /** + * Resize image to new resolution + * + * @param string $file Current image to resize + * @param integer $width Width in pixel + * @param integer $height Height in pixel + * @param integer $proportional Try to make image proportionally + * @param string $output Have 3 options: 'browser','file', 'return' + * @param boolean $deleteOriginal Default is true, delete originial file after resize + * @param boolean $useLinuxCommands Default is false use @unlink(), if true use 'rm' instead + * + * @return mixed If $output is set by 'return': Return new file path, else return boolean + * @throws Exception + * + * @since 2.0.0.3 + */ + public static function resizeImage( + $file, $width = 0, $height = 0, $proportional = -1, $output = 'file', + $deleteOriginal = true, $useLinuxCommands = false + ) + { + // Trying to set an optional argument + if ($proportional === -1) + { + $proportional = Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + } + + if ($height <= 0 && $width <= 0) + { + return false; + } + + // Setting defaults and meta + $info = getimagesize($file); + list($widthOld, $heightOld) = $info; + $horizontalCenter = 0; + $verticalCenter = 0; + + // Calculating proportionality resize + switch ($proportional) + { + case '1': + if ($width === 0) + { + $factor = $height / $heightOld; + } + elseif ($height === 0) + { + $factor = $width / $widthOld; + } + else + { + $factor = min($width / $widthOld, $height / $heightOld); + } + + $finalWidth = round($widthOld * $factor); + $finalHeight = round($heightOld * $factor); + break; + + // Resize and cropped + case '2': + $width = ($width <= 0) ? $widthOld : $width; + $height = ($height <= 0) ? $heightOld : $height; + $ratioOrig = $widthOld / $heightOld; + + if ($width / $height > $ratioOrig) + { + $finalHeight = $width / $ratioOrig; + $finalWidth = $width; + } + else + { + $finalWidth = $height * $ratioOrig; + $finalHeight = $height; + } + + $xMid = $finalWidth / 2; + $yMid = $finalHeight / 2; + $horizontalCenter = $xMid - ($width / 2); + $verticalCenter = $yMid - ($height / 2); + break; + + // Not proportionality resize + case '0': + default: + $finalWidth = ($width <= 0) ? $widthOld : $width; + $finalHeight = ($height <= 0) ? $heightOld : $height; + } + + // Loading image to memory according to type + switch ($info[2]) + { + case IMAGETYPE_GIF: + $image = imagecreatefromgif($file); + break; + case IMAGETYPE_JPEG: + $image = imagecreatefromjpeg($file); + break; + case IMAGETYPE_PNG: + $image = imagecreatefrompng($file); + break; + default: + return false; + } + + // This is the resizing/resampling/transparency-preserving magic + $imageResized = imagecreatetruecolor($finalWidth, $finalHeight); + + if ($info[2] == IMAGETYPE_GIF || $info[2] == IMAGETYPE_PNG) + { + $transparency = imagecolortransparent($image); + + if ($info[2] == IMAGETYPE_PNG) + { + imagealphablending($imageResized, false); + $color = imagecolorallocatealpha($imageResized, 0, 0, 0, 127); + imagefill($imageResized, 0, 0, $color); + imagesavealpha($imageResized, true); + } + elseif ($transparency >= 0) + { + $transparentColor = imagecolorsforindex($image, $transparency); + + $transparency = imagecolorallocate($imageResized, $transparentColor['red'], $transparentColor['green'], $transparentColor['blue']); + + imagefill($imageResized, 0, 0, $transparency); + imagecolortransparent($imageResized, $transparency); + } + } + + imagecopyresampled($imageResized, $image, 0, 0, 0, 0, $finalWidth, $finalHeight, $widthOld, $heightOld); + + if ($proportional === 2) + { + $thumb = imagecreatetruecolor($width, $height); + imagecopyresampled($thumb, $imageResized, 0, 0, $horizontalCenter, $verticalCenter, $width, $height, $width, $height); + $imageResized = $thumb; + } + + // Taking care of original, if needed + if ($deleteOriginal) + { + if ($useLinuxCommands) + { + exec('rm ' . $file); + } + + else + { + JFile::delete($file); + } + } + + // Preparing a method of providing result + switch (strtolower($output)) + { + case 'browser': + $output = null; + break; + + case 'file': + $output = $file; + break; + + case 'return': + return $imageResized; + + default: + break; + } + + // Writing image according to type to the output destination + switch ($info[2]) + { + case IMAGETYPE_GIF: + imagegif($imageResized, $output); + break; + case IMAGETYPE_JPEG: + imagejpeg($imageResized, $output, Redshop::getConfig()->get('IMAGE_QUALITY_OUTPUT')); + break; + case IMAGETYPE_PNG: + $pngQuality = (Redshop::getConfig()->get('IMAGE_QUALITY_OUTPUT') - 100) / 11.111111; + $pngQuality = round(abs($pngQuality)); + imagepng($imageResized, $output, $pngQuality); + break; + default: + self::cleanup($imageResized); + self::cleanup($image); + + return false; + } + + self::cleanup($imageResized); + self::cleanup($image); + + return true; + } + + /** + * Create thumbnail from gif/jpg/png image + * + * @param string $fileType Have 3 options: gif, png, jpg + * @param string $srcImg Source image + * @param string $destImg Destination to create thumbnail + * @param integer $nWidth Width in pixel + * @param integer $nHeight Height in pixel + * + * @return string Destination of new thumbnail + * + * @since 2.0.0.3 + */ + public static function createThumb($fileType, $srcImg, $destImg, $nWidth, $nHeight) + { + $newImg = null; + + if ($fileType === "gif") + { + $im = imagecreatefromgif($destImg); + + // Original picture width is stored + $width = imagesx($im); + + // Original picture height is stored + $height = imagesy($im); + $newImg = imagecreatetruecolor($nWidth, $nHeight); + imagecopyresized($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $width, $height); + + imagegif($newImg, $srcImg); + JPath::setPermissions($srcImg, '0644'); + } + + if ($fileType === "jpg") + { + $im = imagecreatefromjpeg($destImg); + + // Original picture width is stored + $width = imagesx($im); + + // Original picture height is stored + $height = imagesy($im); + $newImg = imagecreatetruecolor($nWidth, $nHeight); + imagecopyresized($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $width, $height); + imagejpeg($newImg, $srcImg); + JPath::setPermissions($srcImg, '0644'); + } + + if ($fileType === "png") + { + $im = imagecreatefrompng($destImg); + + // Original picture width is stored + $width = imagesx($im); + + // Original picture height is stored + $height = imagesy($im); + $newImg = imagecreatetruecolor($nWidth, $nHeight); + imagecopyresized($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $width, $height); + imagepng($newImg, $srcImg); + JPath::setPermissions($srcImg, '0644'); + } + + return $newImg; + } + + /** + * Method for get additional media images + * + * @param int $sectionId Section Id + * @param string $section Section name + * @param string $mediaType Media type + * + * @return array + * + * @since 2.0.3 + */ + public static function getAdditionMediaImage($sectionId = 0, $section = '', $mediaType = 'images') + { + $key = $sectionId . '_' . $section . '_' . $mediaType; + + if (array_key_exists($key, static::$medias)) + { + return static::$medias[$key]; + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('m.*') + ->from($db->qn('#__redshop_media', 'm')) + ->where($db->qn('m.media_section') . ' = ' . $db->quote($section)) + ->where($db->qn('m.media_type') . ' = ' . $db->quote($mediaType)) + ->where($db->qn('m.section_id') . ' = ' . (int) $sectionId) + ->where($db->qn('m.published') . ' = 1') + ->order($db->qn('m.ordering') . ',' . $db->qn('m.media_id') . ' ASC'); + + switch ($section) + { + case 'product': + $query->select('p.*') + ->leftJoin( + $db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('m.section_id') + ); + break; + + case 'property': + $query->select('p.*') + ->leftJoin( + $db->qn('#__redshop_product_attribute_property', 'p') + . ' ON ' . $db->qn('p.property_id') . ' = ' . $db->qn('m.section_id') + ); + break; + + case 'subproperty': + $query->select('p.*') + ->leftJoin( + $db->qn('#__redshop_product_subattribute_color', 'p') + . ' ON ' . $db->qn('p.subattribute_color_id') . ' = ' . $db->qn('m.section_id') + ); + break; + + case 'manufacturer': + $query->select('p.*') + ->leftJoin( + $db->qn('#__redshop_manufacturer', 'p') . ' ON ' . $db->qn('p.id') . ' = ' . $db->qn('m.section_id') + ); + break; + + default: + break; + } + + static::$medias[$key] = $db->setQuery($query)->loadObjectList(); + + return static::$medias[$key]; + } + + /** + * Generate thumb image with watermark + * + * @param string $section Image section + * @param string $imageName Image name + * @param string $thumbWidth Thumb width + * @param string $thumbHeight Thumb height + * @param integer $enableWatermark Enable watermark + * + * @return string + * @throws Exception + * + * @since 2.0.6 + */ + public static function watermark($section, $imageName = '', $thumbWidth = '', $thumbHeight = '', $enableWatermark = -1) + { + if ($enableWatermark == -1) + { + $enableWatermark = Redshop::getConfig()->get('WATERMARK_PRODUCT_IMAGE'); + } + + $pathMainImage = $section . '/' . $imageName; + + try + { + // If main image not exists - display noimage + if (!JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . $pathMainImage)) + { + $pathMainImage = 'noimage.jpg'; + + throw new Exception; + } + + // If watermark not exists or disable - display simple thumb + if ($enableWatermark <= 0 + || !file_exists(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . Redshop::getConfig()->get('WATERMARK_IMAGE')) + ) + { + throw new Exception; + } + + // If width and height not set - use with and height original image + if (((int) $thumbWidth == 0 && (int) $thumbHeight == 0) + || ((int) $thumbWidth != 0 && (int) $thumbHeight == 0) + || ((int) $thumbWidth == 0 && (int) $thumbHeight != 0) + ) + { + list($thumbWidth, $thumbHeight) = getimagesize(REDSHOP_FRONT_IMAGES_RELPATH . $pathMainImage); + } + + $imageNameWithPrefix = JFile::stripExt($imageName) . '_w' . (int) $thumbWidth . '_h' . (int) $thumbHeight . '_i' + . JFile::stripExt(basename(Redshop::getConfig()->get('WATERMARK_IMAGE'))) . '.' . JFile::getExt($imageName); + + $destinationFile = REDSHOP_FRONT_IMAGES_RELPATH . $section . '/thumb/' . $imageNameWithPrefix; + + if (JFile::exists($destinationFile)) + { + return REDSHOP_FRONT_IMAGES_ABSPATH . $section . '/thumb/' . $imageNameWithPrefix; + } + + $filePath = JPATH_SITE . '/components/com_redshop/assets/images/product/' . Redshop::getConfig()->get('WATERMARK_IMAGE'); + + $fileName = self::generateImages($filePath, '', $thumbWidth, $thumbHeight, 'thumb', Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING')); + + $fileInfo = pathinfo($fileName); + $watermark = REDSHOP_FRONT_IMAGES_RELPATH . 'product/thumb/' . $fileInfo['basename']; + + ob_start(); + self::resizeImage( + REDSHOP_FRONT_IMAGES_RELPATH . $pathMainImage, + $thumbWidth, + $thumbHeight, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'), + 'browser', + false + ); + $contents = ob_get_contents(); + ob_end_clean(); + + if (!JFile::write($destinationFile, $contents)) + { + return REDSHOP_FRONT_IMAGES_ABSPATH . $section . "/" . $imageName; + } + + switch (JFile::getExt(Redshop::getConfig()->get('WATERMARK_IMAGE'))) + { + case 'gif': + $dest = imagecreatefromjpeg($destinationFile); + $src = imagecreatefromgif($watermark); + + list($width, $height) = getimagesize($destinationFile); + list($watermarkWidth, $watermarkHeight) = getimagesize($watermark); + + imagecopymerge( + $dest, $src, ($width - $watermarkWidth) >> 1, ($height - $watermarkHeight) >> 1, 0, 0, $watermarkWidth, $watermarkHeight, 50 + ); + + imagejpeg($dest, $destinationFile); + + break; + + case 'png': + $im = imagecreatefrompng($watermark); + + switch (JFile::getExt($destinationFile)) + { + case 'gif': + $im2 = imagecreatefromgif($destinationFile); + break; + case 'jpg': + $im2 = imagecreatefromjpeg($destinationFile); + break; + case 'png': + $im2 = imagecreatefrompng($destinationFile); + break; + default: + throw new Exception; + } + + imagecopy( + $im2, + $im, + (imagesx($im2) / 2) - (imagesx($im) / 2), (imagesy($im2) / 2) - (imagesy($im) / 2), + 0, + 0, + imagesx($im), + imagesy($im) + ); + + $waterless = imagesx($im2) - imagesx($im); + $rest = ceil($waterless / imagesx($im) / 2); + + for ($n = 1; $n <= $rest; $n++) + { + imagecopy( + $im2, $im, ((imagesx($im2) / 2) - (imagesx($im) / 2)) - (imagesx($im) * $n), + (imagesy($im2) / 2) - (imagesy($im) / 2), 0, 0, imagesx($im), imagesy($im) + ); + + imagecopy( + $im2, $im, ((imagesx($im2) / 2) - (imagesx($im) / 2)) + (imagesx($im) * $n), + (imagesy($im2) / 2) - (imagesy($im) / 2), 0, 0, imagesx($im), imagesy($im) + ); + } + + imagejpeg($im2, $destinationFile); + + break; + + default: + throw new Exception; + } + + return REDSHOP_FRONT_IMAGES_ABSPATH . $section . '/thumb/' . $imageNameWithPrefix; + } + catch (Exception $e) + { + if ($e->getMessage()) + { + JFactory::getApplication()->enqueueMessage($e->getMessage(), 'warning'); + } + + $fileName = REDSHOP_FRONT_IMAGES_ABSPATH . $pathMainImage; + + if ((int) $thumbWidth != 0 || (int) $thumbHeight != 0) + { + $filePath = JPATH_SITE . '/components/com_redshop/assets/images/' . $pathMainImage; + $fileName = self::generateImages( + $filePath, '', $thumbWidth, $thumbHeight, 'thumb', Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + $fileInfo = pathinfo($fileName); + $fileName = REDSHOP_FRONT_IMAGES_ABSPATH . $section . '/thumb/' . $fileInfo['basename']; + } + + return $fileName; + } + } + + /** + * Get alternative text for media + * + * @param string $mediaSection Media section + * @param int $sectionId Section id + * @param string $mediaName Media name + * @param int $mediaId Media id + * @param string $mediaType Media type + * + * @return string Alternative text from media + * + * @since 2.0.7 + * @throws Exception + */ + public static function getAlternativeText($mediaSection, $sectionId, $mediaName = '', $mediaId = 0, $mediaType = 'images') + { + if ($mediaSection == 'product' && $mediaType == 'images') + { + $productData = RedshopHelperProduct::getProductById($sectionId); + + if ($mediaName == $productData->product_full_image || $mediaId == $productData->media_id) + { + return $productData->media_alternate_text; + } + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('media_alternate_text')) + ->from($db->qn('#__redshop_media')) + ->where($db->qn('media_section') . ' = ' . $db->quote($mediaSection)) + ->where($db->qn('section_id') . ' = ' . (int) $sectionId) + ->where($db->qn('media_type') . ' = ' . $db->quote($mediaType)); + + if (!empty($mediaName)) + { + $query->where($db->qn('media_name') . ' = ' . $db->q($mediaName)); + } + + if ($mediaId) + { + $query->where($db->qn('media_id') . ' = ' . (int) $mediaId); + } + + return $db->setQuery($query)->loadResult(); + } + + /** + * Method for get list of medias + * + * @param string $section Media section (product, category,...) + * @param integer $sectionId Media section ID + * @param string $scope Scope of media + * @param string $type Media type. + * + * @return mixed + * + * @since 2.1.0 + */ + public static function getMedia($section = '', $sectionId = 0, $scope = '', $type = '') + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_media')); + + if (!empty($section)) + { + $query->where($db->qn('media_section') . ' = ' . $db->quote($section)); + } + + if (!empty($sectionId)) + { + $query->where($db->qn('section_id') . ' = ' . (int) $sectionId); + } + + if (!empty($scope)) + { + $query->where($db->qn('scope') . ' = ' . $db->quote($scope)); + } + + if (!empty($type)) + { + $query->where($db->qn('media_type') . ' = ' . $db->quote($type)); + } + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Method for clean up image resource. + * + * @param resource $res Image resource + * + * @return boolean + * @throws Exception + * + * @since 2.1.0 + */ + protected static function cleanup($res) + { + if (!is_resource($res)) + { + return false; + } + + try + { + return imagedestroy($res); + } + catch (Exception $exception) + { + JFactory::getApplication()->enqueueMessage($exception->getMessage(), 'warning'); + + return false; + } + } +} diff --git a/libraries/redshop/helper/media/image.php b/libraries/redshop/helper/media/image.php new file mode 100644 index 00000000000..23cf317c12a --- /dev/null +++ b/libraries/redshop/helper/media/image.php @@ -0,0 +1,289 @@ + $imgUrl, + 'name' => $image, + 'size' => filesize($imgFile) ? filesize($imgFile) : 0, + 'blob' => 'data: ' . self::getMimeType($imgFile) . ';base64,' . base64_encode(file_get_contents($imgFile)) + ); + } + + return RedshopLayoutHelper::render( + 'media.dropzone', + array( + 'id' => $id, + 'type' => $type, + 'sectionId' => $sectionId, + 'mediaSection' => $mediaSection, + 'file' => $file, + 'showMedia' => $showMedia, + 'mediaId' => $mediaId + ) + ); + } + + /** + * Require dependencies from bower.js. + * Checking dependencies are existed or not then require them to header + * + * @return boolean + */ + public static function requireDependencies() + { + JHtml::stylesheet('com_redshop/dropzone.min.css', array(), true); + JHtml::stylesheet('com_redshop/cropper.min.css', array(), true); + JHtml::stylesheet('com_redshop/lightbox2/css/lightbox.min.css', array(), true); + JHtml::stylesheet('com_redshop/redshop.media.min.css', array(), true); + + JHtml::script('com_redshop/dropzone.min.js', false, true); + JHtml::script('com_redshop/cropper.min.js', false, true); + JHtml::script('com_redshop/lightbox2.min.js', false, true); + JHtml::script('com_redshop/redshop.media.min.js', false, true); + + return true; + } + + /** + * Render gallery pop-up for media + * + * @param string $id ID of media input name + * @param string $type Type of item want to show gallery + * @param string $sectionId Section ID to show + * @param string $mediaSection Section type to show + * @param string $image URL of featured image + * + * @return void + */ + public static function renderGallery($id, $type, $sectionId, $mediaSection, $image) + { + $imgUrl = JUri::root() . 'components/com_redshop/assets/images/' . $type . '/' . $image; + $imgFile = REDSHOP_FRONT_IMAGES_RELPATH . $type . '/' . $image; + + $file = array(); + + JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_redshop/models'); + $media = JModelLegacy::getInstance('Media', 'RedshopModel'); + + $listMedia = $media->all(); + $gallery = array(); + + if (!empty($listMedia)) + { + foreach ($listMedia as $lk => $lm) + { + $tmpFile = REDSHOP_FRONT_IMAGES_RELPATH . $lm->media_section . '/' . $lm->media_name; + + if (file_exists($tmpFile)) + { + $dimension = getimagesize($tmpFile); + + if ($dimension) + { + $dimension = $dimension[0] . ' x ' . $dimension[1]; + } + + $tmpImg = array( + 'id' => $lm->media_id, + 'url' => JUri::root() . 'components/com_redshop/assets/images/' . $lm->media_section . '/' . $lm->media_name, + 'name' => $lm->media_name, + 'size' => self::sizeFilter(filesize($tmpFile)), + 'dimension' => $dimension, + 'media' => $lm->media_section, + 'mime' => substr($lm->media_type, 0, -1), + 'status' => $lm->published ? '' : '-slash' + ); + + if ($image === $lm->media_name) + { + $tmpImg['attached'] = "true"; + } + else + { + $tmpImg['attached'] = "false"; + } + + $gallery[] = $tmpImg; + } + } + } + + if (!empty($image) && file_exists($imgFile)) + { + $file = array( + 'path' => $imgUrl, + 'name' => $image, + 'size' => filesize($imgFile), + 'blob' => 'data: ' . mime_content_type($imgFile) . ';base64,' . base64_encode(file_get_contents($imgFile)) + ); + } + + echo RedshopLayoutHelper::render( + 'media.gallery', + array( + 'id' => $id, + 'type' => $type, + 'sectionId' => $sectionId, + 'mediaSection' => $mediaSection, + 'file' => $file, + 'gallery' => $gallery + ) + ); + } + + /** + * Show file size in KB, MB, GB... + * + * @param integer $bytes Volume of item + * + * @return string + */ + public static function sizeFilter($bytes) + { + $label = array('B', 'KB', 'MB', 'GB', 'TB', 'PB'); + + for ($i = 0; $bytes >= 1024 && $i < (count($label) - 1); $i++) + { + $bytes /= 1024; + } + + return round($bytes, 2) . " " . $label[$i]; + } + + /** + * Method for get all media files of redSHOP + * + * @param string $selectedImage Selected file. + * + * @return array List of media files. + * + * @since 2.0.3 + */ + public static function getMediaFiles($selectedImage = '') + { + JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_redshop/models'); + $media = JModelLegacy::getInstance('Media', 'RedshopModel'); + $listMedia = $media->all(); + + if (empty($listMedia)) + { + return array(); + } + + $gallery = array(); + + foreach ($listMedia as $lk => $lm) + { + $tmpFile = REDSHOP_FRONT_IMAGES_RELPATH . $lm->media_section . '/' . $lm->media_name; + + if (file_exists($tmpFile)) + { + $dimension = getimagesize($tmpFile); + + if ($dimension) + { + $dimension = $dimension[0] . ' x ' . $dimension[1]; + } + + $tmpImg = array( + 'id' => $lm->media_id, + 'url' => JUri::root() . 'components/com_redshop/assets/images/' . $lm->media_section . '/' . $lm->media_name, + 'name' => $lm->media_name, + 'size' => self::sizeFilter(filesize($tmpFile)), + 'dimension' => $dimension, + 'media' => $lm->media_section, + 'mime' => substr($lm->media_type, 0, -1), + 'status' => $lm->published ? '' : '-slash' + ); + + if ($selectedImage === $lm->media_name) + { + $tmpImg['attached'] = "true"; + } + else + { + $tmpImg['attached'] = "false"; + } + + $gallery[] = $tmpImg; + } + } + + return $gallery; + } + + /** + * Method for get MIME Type of specific file. + * + * @param string $path Path of file. + * + * @return mixed Mime type of file. + * + * @since 2.0.3 + */ + public static function getMimeType($path) + { + if (empty($path) || !JFile::exists($path)) + { + return false; + } + + if (function_exists('mime_content_type')) + { + return mime_content_type($path); + } + + if (function_exists('finfo_file') && function_exists('finfo_open')) + { + return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path); + } + + return false; + } +} diff --git a/libraries/redshop/helper/media/index.html b/libraries/redshop/helper/media/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/helper/media/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/helper/module.php b/libraries/redshop/helper/module.php new file mode 100644 index 00000000000..a18dff08185 --- /dev/null +++ b/libraries/redshop/helper/module.php @@ -0,0 +1,42 @@ +element; + $language->load($extension, JPATH_SITE, $language->getTag(), true); + $language->load($extension, JPATH_ADMINISTRATOR, $language->getTag(), true); + $language->load($extension, JPATH_ROOT . '/modules/' . $extension, $language->getTag(), true); + } + } +} diff --git a/libraries/redshop/helper/newsletter.php b/libraries/redshop/helper/newsletter.php new file mode 100644 index 00000000000..4644feaab46 --- /dev/null +++ b/libraries/redshop/helper/newsletter.php @@ -0,0 +1,156 @@ +get('DEFAULT_NEWSLETTER') > 0) + { + $newsletter = Redshop::getConfig()->get('DEFAULT_NEWSLETTER'); + } + + if (!$userId) + { + $userId = $user->id; + } + + if (empty($data)) + { + if (!$user->guest) + { + $data['user_id'] = $user->id; + $data['username'] = $user->username; + $data['email'] = $user->email; + $data['name'] = $user->name . " (" . $user->username . ")"; + } + else + { + $redshopUser = RedshopHelperUser::getUserInformation(); + + $data['user_id'] = $redshopUser->user_id; + $data['username'] = $redshopUser->username; + $data['email'] = $redshopUser->user_email; + $data['name'] = $redshopUser->firstname . ' ' . $redshopUser->lastname; + } + } + else + { + $data['user_id'] = $userId; + + if (isset($data['username'])) + { + $data['name'] = $data['username']; + } + + if ($user->id && $user->email == $data['email']) + { + $data['name'] = $user->name . " (" . $user->username . ")"; + } + } + + $data['date'] = time(); + $data['newsletter_id'] = $newsletter; + $data['published'] = 1; + + $needSendMail = Redshop::getConfig()->getBool('NEWSLETTER_CONFIRMATION') && $sendMail ? true : false; + + if ($needSendMail) + { + $data['published'] = 0; + } + + JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_redshop/tables'); + + /** @var Tablenewslettersubscr_detail $row */ + $row = JTable::getInstance('newslettersubscr_detail', 'Table'); + + if (!$row->bind($data) || !$row->store()) + { + JFactory::getApplication()->enqueueMessage($row->getError(), 'error'); + } + + if ($needSendMail) + { + Redshop\Mail\Newsletter::sendConfirmationMail($row->subscription_id); + } + + return true; + } + + /** + * Method for un-subscribe email from newsletter + * + * @param string $email Email + * + * @return boolean + * + * @since 2.0.7 + */ + public static function removeSubscribe($email = "") + { + $db = JFactory::getDbo(); + $user = JFactory::getUser(); + + // Skip if user is guest and empty email. + if (empty($email) && $user->guest) + { + return true; + } + + $query = $db->getQuery(true) + ->delete($db->qn('#__redshop_newsletter_subscription')); + + if (!$user->guest) + { + $email = $user->email; + $query->where($db->qn('user_id') . ' = ' . $user->id); + } + + $query->where($db->qn('email') . ' = ' . $db->quote($email)); + + if (Redshop::getConfig()->get('DEFAULT_NEWSLETTER') != '') + { + $query->where($db->qn('newsletter_id') . ' = ' . $db->quote(Redshop::getConfig()->get('DEFAULT_NEWSLETTER'))); + } + + $db->setQuery($query)->execute(); + + Redshop\Mail\Newsletter::sendCancellationMail($email); + + return true; + } +} diff --git a/libraries/redshop/helper/order.php b/libraries/redshop/helper/order.php new file mode 100644 index 00000000000..5f9de8c7049 --- /dev/null +++ b/libraries/redshop/helper/order.php @@ -0,0 +1,2945 @@ +reset(); + } + + return $order->getItem(); + } + + /** + * Generate Invoice number in chronological order + * + * @param integer $orderId Order Id + * + * @return mixed Invoice number clean and formatted value + */ + public static function generateInvoiceNumber($orderId) + { + $db = JFactory::getDbo(); + + // Use entity instead query directly. Do reset for make sure + $orderEntity = RedshopEntityOrder::getInstance($orderId); + + if (!$orderEntity->isValid()) + { + return false; + } + + $orderInfo = $orderEntity->getItem(); + + // Don't generate invoice number for free orders if disabled from config + if ($orderInfo->order_total <= 0 && !Redshop::getConfig()->getBool('INVOICE_NUMBER_FOR_FREE_ORDER')) + { + return false; + } + + $number = $orderInfo->invoice_number_chrono; + $formattedNumber = $orderInfo->invoice_number; + + // Check if number is not set and order status is confirm or number is set and order status is refund. + if (($number <= 0 && 'C' == $orderInfo->order_status && 'Paid' == $orderInfo->order_payment_status) + || ($number > 0 && ('R' == $orderInfo->order_status || 'X' == $orderInfo->order_status))) + { + $query = $db->getQuery(true) + ->select('MAX(invoice_number_chrono) as max_invoice_number') + ->from($db->qn('#__redshop_orders')); + + // Set the query and load the result. + $db->setQuery($query); + + $maxInvoiceNo = $db->loadResult(); + $firstInvoiceNo = (int) Redshop::getConfig()->get('FIRST_INVOICE_NUMBER'); + + // It will apply only for the first number ideally! + if ($maxInvoiceNo <= $firstInvoiceNo) + { + $maxInvoiceNo += $firstInvoiceNo; + } + + $number = $maxInvoiceNo + 1; + + self::updateInvoiceNumber($number, $orderId); + + $formattedNumber = self::formatInvoiceNumber($number); + } + + $invoiceNo = new stdClass; + $invoiceNo->clean = $number; + $invoiceNo->value = $formattedNumber; + + return $invoiceNo; + } + + /** + * Format the given invoice number + * + * @param integer $invoiceNo Order Invoice Number + * + * @return string Formatted invoice number + */ + public static function formatInvoiceNumber($invoiceNo) + { + if ($invoiceNo == 0) + { + return ''; + } + + if (!Redshop::getConfig()->get('REAL_INVOICE_NUMBER_TEMPLATE')) + { + return $invoiceNo; + } + + return self::parseNumberTemplate( + Redshop::getConfig()->get('REAL_INVOICE_NUMBER_TEMPLATE'), + $invoiceNo + ); + } + + /** + * Parse Invoice or Order Number template. + * + * @param string $template Number Template + * @param float $number Source number to be replaced + * + * @return string Formatted Invoice Number + */ + public static function parseNumberTemplate($template, $number) + { + $format = sprintf("%06d", $number); + $formattedInvoiceNo = str_replace("XXXXXX", $format, $template); + $formattedInvoiceNo = str_replace("xxxxxx", $format, $formattedInvoiceNo); + $formattedInvoiceNo = str_replace("######", $format, $formattedInvoiceNo); + + $format = sprintf("%05d", $number); + $formattedInvoiceNo = str_replace("XXXXX", $format, $formattedInvoiceNo); + $formattedInvoiceNo = str_replace("xxxxx", $format, $formattedInvoiceNo); + $formattedInvoiceNo = str_replace("#####", $format, $formattedInvoiceNo); + + $format = sprintf("%04d", $number); + $formattedInvoiceNo = str_replace("XXXX", $format, $formattedInvoiceNo); + $formattedInvoiceNo = str_replace("xxxx", $format, $formattedInvoiceNo); + $formattedInvoiceNo = str_replace("####", $format, $formattedInvoiceNo); + + $format = sprintf("%03d", $number); + $formattedInvoiceNo = str_replace("XXX", $format, $formattedInvoiceNo); + $formattedInvoiceNo = str_replace("xxx", $format, $formattedInvoiceNo); + $formattedInvoiceNo = str_replace("###", $format, $formattedInvoiceNo); + + $format = sprintf("%02d", $number); + $formattedInvoiceNo = str_replace("XX", $format, $formattedInvoiceNo); + $formattedInvoiceNo = str_replace("xx", $format, $formattedInvoiceNo); + $formattedInvoiceNo = str_replace("##", $format, $formattedInvoiceNo); + + return $formattedInvoiceNo; + } + + /** + * Update invoice number in database + * + * @param integer $number Order Invoice Number + * @param integer $orderId Order Id + * + * @return void + * + * @deprecated 2.0.6 + */ + public static function updateInvoiceNumber($number, $orderId) + { + $order = RedshopEntityOrder::getInstance($orderId); + + if ($order->isValid()) + { + $order->set('invoice_number_chrono', (int) $number) + ->set('invoice_number', self::formatInvoiceNumber($number)) + ->save(); + } + } + + /** + * Get all the order status code information list + * + * @return array Order Status info + */ + public static function getOrderStatusList() + { + if (!empty(self::$allStatus)) + { + return self::$allStatus; + } + + // Initialiase variables. + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select( + array( + $db->qn('order_status_code', 'value'), + $db->qn('order_status_name', 'text') + ) + ) + ->from($db->qn('#__redshop_order_status')) + ->where($db->qn('published') . ' = ' . $db->q('1')); + + // Set the query and load the result. + $db->setQuery($query); + self::$allStatus = $db->loadObjectList(); + + // Check for a database error. + if ($db->getErrorNum()) + { + JError::raiseWarning(500, $db->getErrorMsg()); + + return null; + } + + return self::$allStatus; + } + + /** + * Get Order Payment Information + * + * @param integer $orderId Order Id + * + * @return object Payment Information for orders + * + * @deprecated 2.0.6 + */ + public static function getPaymentInfo($orderId) + { + $payment = RedshopEntityOrder::getInstance($orderId)->getPayment(); + + if (null === $payment) + { + return null; + } + + return $payment->getItem(); + } + + /** + * Prepare Order Query + * + * @param integer $orderId Order Information Id + * + * @return object Query Object + * + * @deprecated 2.0.6 + */ + public static function getOrderUserQuery($orderId) + { + $db = JFactory::getDbo(); + + return $db->getQuery(true) + ->select('*, `user_email` as email') + ->from($db->qn('#__redshop_order_users_info')) + ->where($db->qn('order_id') . ' = ' . (int) $orderId); + } + + /** + * Get Order billing user information + * + * @param integer $orderId Order Id + * @param boolean $force Force get information + * + * @return object Order Billing information object + * + * @deprecated 2.0.6 + */ + public static function getOrderBillingUserInfo($orderId, $force = false) + { + if (!$orderId) + { + return null; + } + + /** @var RedshopEntityOrder_User $userBilling */ + $userBilling = RedshopEntityOrder::getInstance($orderId)->getBilling(); + + if ($force) + { + $userBilling->reset()->loadExtraFields(); + } + + return $userBilling->getItem(); + } + + /** + * Get Order shipping user information + * + * @param integer $orderId Order Id + * @param boolean $force Order Id + * + * @return object Order Shipping information object + * + * @deprecated 2.0.6 + */ + public static function getOrderShippingUserInfo($orderId, $force = false) + { + if (!$orderId) + { + return null; + } + + /** @var RedshopEntityOrder_User $userBilling */ + $userBilling = RedshopEntityOrder::getInstance($orderId)->getShipping(); + + if ($force) + { + $userBilling->reset()->loadExtraFields(); + } + + return $userBilling->getItem(); + } + + /** + * Get order Billing extra field information in array + * + * @param integer $orderUserInfoId Order Info id + * @param string $section Section to get information + * @param boolean $force Force to get information + * + * @return array Extra Field name as a key of an array + * + * @deprecated 2.0.6 + */ + public static function getOrderExtraFieldsData($orderUserInfoId, $section = 'billing', $force = false) + { + $key = $section . '.' . $orderUserInfoId; + + if (array_key_exists($key, self::$orderExtraFieldData) && !$force) + { + return self::$orderExtraFieldData[$key]; + } + + $privateSection = RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS; + $companySection = RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS; + + if ('shipping' == $section) + { + $privateSection = RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS; + $companySection = RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS; + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('f.name') . ',' . $db->qn('fd.data_txt')) + ->from($db->qn('#__redshop_fields_data', 'fd')) + ->where( + '(' + . $db->qn('fd.section') . ' = ' . $privateSection + . ' OR ' + . $db->qn('fd.section') . ' = ' . $companySection + . ')' + ) + ->where($db->qn('fd.itemid') . ' = ' . (int) $orderUserInfoId); + + $query->leftJoin( + $db->qn('#__redshop_fields', 'f') + . ' ON ' . $db->qn('f.id') . '=' . $db->qn('fd.fieldid') + ); + + // Set the query and load the result. + $fields = $db->setQuery($query)->loadObjectList(); + + // Check for a database error. + if ($db->getErrorNum()) + { + JError::raiseWarning(500, $db->getErrorMsg()); + + return null; + } + + $fieldsData = array(); + + if (!empty($fields)) + { + foreach ($fields as $field) + { + $fieldsData[$field->name] = $field->data_txt; + } + } + + self::$orderExtraFieldData[$key] = $fieldsData; + + return $fieldsData; + } + + /** + * Get all the items from order + * + * @param integer $orderId Valid Integer order Id + * + * @return array Order Items + * + * @deprecated 2.0.6 Use RedshopEntityOrder::getOrderItems instead + */ + public static function getItems($orderId) + { + if (!$orderId) + { + return null; + } + + return RedshopEntityOrder::getInstance($orderId)->getOrderItems()->toObjects(); + } + + /** + * Get all gift card items from order items array + * + * @param integer $orderId A valid integer Order Id + * + * @return array Contains gift card item. + */ + public static function giftCardItems($orderId) + { + $orderItems = RedshopEntityOrder::getInstance($orderId)->getOrderItems(); + + if (!$orderItems->count()) + { + return array(); + } + + return array_filter( + $orderItems->toObjects(), function ($item) { + return $item->is_giftcard; + } + ); + } + + /** + * Truncate tables orders and relatives + * + * @return void + * + * @since 2.0.3 + */ + public static function resetOrderId() + { + $db = JFactory::getDbo(); + + $db->truncateTable('#__redshop_orders'); + $db->truncateTable('#__redshop_order_item'); + $db->truncateTable('#__redshop_order_users_info'); + $db->truncateTable('#__redshop_order_status_log'); + $db->truncateTable('#__redshop_order_attribute_item'); + $db->truncateTable('#__redshop_order_payment'); + $db->truncateTable('#__redshop_product_download'); + $db->truncateTable('#__redshop_product_download_log'); + } + + /** + * Get order status title + * + * @param string $orderStatusCode Order status code to get title + * + * @return string + * + * @since 2.0.3 + */ + public static function getOrderStatusTitle($orderStatusCode) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('order_status_name')) + ->from($db->qn('#__redshop_order_status')) + ->where($db->qn('order_status_code') . ' = ' . $db->quote($orderStatusCode)); + $db->setQuery($query); + + return $db->loadResult(); + } + + /** + * Update order status + * + * @param integer $orderId Order ID to update + * @param string $newStatus New status + * + * @return void + * + * @since 2.0.3 + */ + public static function updateOrderStatus($orderId, $newStatus) + { + $order = RedshopEntityOrder::getInstance($orderId); + + if ($order->get('order_status', '') == $newStatus) + { + return; + } + + if ($order->isValid()) + { + $order->set('order_status', $newStatus) + ->set('mdate', (int) time()) + ->save(); + } + + self::generateInvoiceNumber($orderId); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select( + $db->qn( + array( + 'e.element', 'op.order_transfee', 'op.order_payment_trans_id', 'op.order_payment_amount', 'op.authorize_status' + ) + ) + ) + ->from($db->qn('#__extensions', 'e')) + ->leftJoin($db->qn('#__redshop_order_payment', 'op') . ' ON ' . $db->qn('op.payment_method_class') . ' = ' . $db->qn('e.element')) + ->where($db->qn('op.order_id') . ' = ' . (int) $orderId) + ->where($db->qn('e.folder') . ' = ' . $db->quote('redshop_payment')); + $result = $db->setQuery($query, 0, 1)->loadObject(); + + $authorizeStatus = $result->authorize_status; + + $paymentMethod = self::getPaymentMethodInfo($result->element); + $paymentMethod = $paymentMethod[0]; + + // Getting the order details + $orderDetail = RedshopEntityOrder::getInstance($orderId)->getItem(); + $paymentParams = new Registry($paymentMethod->params); + $orderStatusCapture = $paymentParams->get('capture_status', ''); + $orderStatusCode = $orderStatusCapture; + + if ($orderStatusCapture == $newStatus + && ($authorizeStatus == "Authorized" || $authorizeStatus == "")) + { + $values["order_number"] = $orderDetail->order_number; + $values["order_id"] = $orderId; + $values["order_transactionid"] = $result->order_payment_trans_id; + $values["order_amount"] = $orderDetail->order_total + $result->order_transfee; + $values['shippinginfo'] = self::getOrderShippingUserInfo($orderId); + $values['billinginfo'] = self::getOrderBillingUserInfo($orderId); + $values["order_userid"] = $values['billinginfo']->user_id; + + JPluginHelper::importPlugin('redshop_payment'); + $data = RedshopHelperUtility::getDispatcher()->trigger('onCapture_Payment' . $result->element, array($result->element, $values)); + $results = $data[0]; + + if (!empty($data)) + { + $message = $results->message; + + $orderStatusLog = JTable::getInstance('order_status_log', 'Table'); + $orderStatusLog->order_id = $orderId; + $orderStatusLog->order_status = $orderStatusCode; + $orderStatusLog->date_changed = time(); + $orderStatusLog->customer_note = $message; + $orderStatusLog->store(); + } + } + + if (($newStatus == "X" || $newStatus == "R") + && $paymentParams->get('refund', 0) == 1) + { + $values["order_number"] = $orderDetail->order_number; + $values["order_id"] = $orderId; + $values["order_transactionid"] = $result->order_payment_trans_id; + $values["order_amount"] = $orderDetail->order_total + $result->order_transfee; + $values["order_userid"] = $values['billinginfo']->user_id; + + JPluginHelper::importPlugin('redshop_payment'); + + // Get status and refund if capture/cancel if authorize (for quickpay only) + $data = RedshopHelperUtility::getDispatcher()->trigger('onStatus_Payment' . $result->element, array($result->element, $values)); + $results = $data[0]; + + if (!empty($data)) + { + $message = $results->message; + $orderStatusLog = JTable::getInstance('order_status_log', 'Table'); + $orderStatusLog->order_id = $orderId; + $orderStatusLog->order_status = $newStatus; + $orderStatusLog->date_changed = time(); + $orderStatusLog->customer_note = $message; + $orderStatusLog->store(); + } + } + } + + /** + * Generate parcel + * + * @param integer $orderId Order ID to generate + * + * @return string 'success' or error message + * + * @since 2.0.3 + */ + public static function generateParcel($orderId) + { + $db = JFactory::getDbo(); + $orderDetail = self::getOrderDetails($orderId); + $orderProducts = self::getOrderItemDetail($orderId); + $billingInfo = self::getOrderBillingUserInfo($orderId); + $shippingInfo = self::getOrderShippingUserInfo($orderId); + $shippingRateDecryptDetail = Redshop\Shipping\Rate::decrypt($orderDetail->ship_method_id); + + // Get Shipping Delivery Type + $shippingDeliveryType = 1; + + if (isset($shippingRateDecryptDetail[8]) === true) + { + $shippingDeliveryType = (int) $shippingRateDecryptDetail[8]; + } + + $query = $db->getQuery(true) + ->select($db->qn('country_2_code')) + ->from($db->qn('#__redshop_country')) + ->where($db->qn('country_3_code') . ' = ' . $db->quote(Redshop::getConfig()->get('SHOP_COUNTRY'))); + $db->setQuery($query); + $billingInfo->country_code = $db->loadResult(); + + $query = $db->getQuery(true) + ->select($db->qn('country_2_code')) + ->from($db->qn('#__redshop_country')) + ->where($db->qn('country_3_code') . ' = ' . $db->quote($shippingInfo->country_code)); + $db->setQuery($query); + $shippingInfo->country_code = $db->loadResult(); + + // For product content + $totalWeight = 0; + $contentProducts = array(); + $qty = 0; + + for ($c = 0, $cn = count($orderProducts); $c < $cn; $c++) + { + $qty += $orderProducts [$c]->product_quantity; + $contentProducts[] = $orderProducts[$c]->order_item_name; + + // Product Weight + $query = $db->getQuery(true) + ->select($db->qn('weight')) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_id') . ' = ' . (int) $orderProducts [$c]->product_id); + $db->setQuery($query); + $weight = $db->loadResult(); + + // Accessory Weight + $orderAccItemData = self::getOrderItemAccessoryDetail($orderProducts[$c]->order_item_id); + $accWeight = 0; + + if (count($orderAccItemData) > 0) + { + for ($a = 0, $an = count($orderAccItemData); $a < $an; $a++) + { + $accessoryQuantity = $orderAccItemData[$a]->product_quantity; + $query = $db->getQuery(true) + ->select($db->qn('weight')) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_id') . ' = ' . (int) $orderAccItemData[$a]->product_id); + $db->setQuery($query); + $accessoryWeight = $db->loadResult(); + $accWeight += ($accessoryWeight * $accessoryQuantity); + } + } + + // Total weight + $totalWeight += (($weight * $orderProducts [$c]->product_quantity) + $accWeight); + } + + $unitRatio = \Redshop\Helper\Utility::getUnitConversation('kg', Redshop::getConfig()->get('DEFAULT_WEIGHT_UNIT')); + + if ($unitRatio != 0) + { + // Converting weight in pounds + $totalWeight = $totalWeight * $unitRatio; + } + + if (Redshop::getConfig()->get('SHOW_PRODUCT_DETAIL')) + { + $contentProducts = array_unique($contentProducts); + $contentProducts = implode(",", $contentProducts); + $contentProducts = mb_convert_encoding($contentProducts, "ISO-8859-1", "UTF-8"); + $contentProductsRemark = substr(mb_convert_encoding($contentProducts, "ISO-8859-1", "UTF-8"), 0, 29); + } + else + { + $contentProducts = " "; + $contentProductsRemark = " "; + } + + $filter = JFilterInput::getInstance(); + + // Filter name to remove special characters + // We are using $billingInfo instead $shippingInfo because $shippingInfo stored information of service point not buyer + $firstName = $filter->clean( + mb_convert_encoding($billingInfo->firstname, "ISO-8859-1", "UTF-8"), + 'username' + ); + $lastName = $filter->clean( + mb_convert_encoding($billingInfo->lastname, "ISO-8859-1", "UTF-8"), + 'username' + ); + $fullName = $firstName . " " . $lastName; + + $address = mb_convert_encoding($billingInfo->address, "ISO-8859-1", "UTF-8"); + $city = mb_convert_encoding($billingInfo->city, "ISO-8859-1", "UTF-8"); + + if ($billingInfo->is_company) + { + $companyName = mb_convert_encoding($shippingInfo->company_name, "ISO-8859-1", "UTF-8"); + $fProductCode = "PDKEP"; + $addon = ""; + $finalAddress1 = $companyName; + $finalAddress2 = $address; + } + else + { + // Post Danmark MyPack Home + $fProductCode = "PDK17"; + $addon = ""; + $finalAddress1 = $address; + $finalAddress2 = ""; + } + + // When shipping delivery set to post office don't need to send DLV or POD addon. + if ($shippingDeliveryType == 0) + { + // Post Danmark MyPack Collect + $fProductCode = "P19DK"; + $addon = ""; + } + + if (Redshop::getConfig()->get('WEBPACK_ENABLE_EMAIL_TRACK')) + { + $addon .= ''; + } + + if (Redshop::getConfig()->get('WEBPACK_ENABLE_SMS')) + { + $addon .= ''; + } + + // No pickup agent by default + $agentEle = ''; + + // Only when we have store to send parcel - i.e Pickup Location + if ('' != trim($orderDetail->shop_id)) + { + // Get shop location stored using postdanmark plugin or other similar plugin. + $shopLocation = explode('|', $orderDetail->shop_id); + + // Sending shop location id as an agent code. + $agentEle = '' . $shopLocation[0] . ''; + + // PUPOPT is stands for "Optional Service Point". + $addon .= ''; + } + + $xmlnew = ' + + + "' . date('Y-m-d H:i') . '" + + + + + + ' . $billingInfo->zipcode . ' + ' . $city . ' + ' . $billingInfo->country_code . ' + + ' . $shippingInfo->phone . ' + + ' . $shippingInfo->user_email . ' + ' . $shippingInfo->phone . ' + + + 1 + ' . $shippingInfo->users_info_id . ' + ' . $orderDetail->order_number . ' + ' . $agentEle . ' + + ' . $addon . ' + + + 1 + ' . $totalWeight . ' + ' . $contentProducts . ' + PC + + + '; + + $postURL = "https://www.pacsoftonline.com/ufoweb/order?session=po_DK" + . "&user=" . Redshop::getConfig()->get('POSTDK_CUSTOMER_NO') + . "&pin=" . Redshop::getConfig()->get('POSTDK_CUSTOMER_PASSWORD') + . "&developerid=000000075" + . "&type=xml"; + + try + { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $postURL); + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_VERBOSE, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlnew); + $response = curl_exec($ch); + curl_close($ch); + + $xmlResponse = JFactory::getXML($response, false); + + if (empty($xmlResponse) || !empty($error)) + { + return JText::_('LIB_REDSHOP_PACSOFT_ERROR_NO_RESPONSE'); + } + + $xmlResponse = $xmlResponse->val; + + if ('201' === (string) $xmlResponse[1] && 'Created' === (string) $xmlResponse[2]) + { + // Update current order success entry. + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_orders')) + ->set($db->qn('order_label_create') . ' = 1') + ->where($db->qn('order_id') . ' = ' . (int) $orderId); + + // Set the query and execute the update. + $db->setQuery($query); + $db->execute(); + + return "success"; + } + else + { + return (string) $xmlResponse[1] . "-" . (string) $xmlResponse[2] . "-" . (string) $xmlResponse[0]; + } + } + catch (Exception $e) + { + return $e->getMessage(); + } + } + + /** + * Change Order status + * + * @param object $data Data to change + * + * @return void + * + * @since 2.0.3 + */ + public static function changeOrderStatus($data) + { + $db = JFactory::getDbo(); + $orderId = $data->order_id; + + $data->order_status_code = trim($data->order_status_code); + $data->order_payment_status_code = trim($data->order_payment_status_code); + $checkUpdateOrders = self::checkUpdateOrders($data); + + if ($checkUpdateOrders == 0 && $data->order_status_code != "" && $data->order_payment_status_code != "") + { + // Order status valid and change the status + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_orders')) + ->set($db->qn('order_status') . ' = ' . $db->quote($data->order_status_code)) + ->set($db->qn('order_payment_status') . ' = ' . $db->quote($data->order_payment_status_code)) + ->where($db->qn('order_id') . ' = ' . (int) $orderId); + $db->setQuery($query); + $db->execute(); + + // Generate Invoice Number + if ("C" == $data->order_status_code + && "Paid" == $data->order_payment_status_code) + { + self::sendDownload($orderId); + self::generateInvoiceNumber($orderId); + } + + if (!isset($data->transfee)) + { + $data->transfee = null; + } + + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_order_payment')) + ->set($db->qn('order_transfee') . ' = ' . $db->quote($data->transfee)) + ->set($db->qn('order_payment_trans_id') . ' = ' . $db->quote($data->transaction_id)) + ->where($db->qn('order_id') . ' = ' . (int) $orderId); + $db->setQuery($query); + $db->execute(); + + $query = $db->getQuery(true) + ->insert($db->qn('#__redshop_order_status_log')) + ->columns($db->qn(array('order_status', 'order_payment_status', 'date_changed', 'order_id', 'customer_note'))) + ->values( + implode(',', + array( + $db->quote($data->order_status_code), + $db->quote($data->order_payment_status_code), + (int) time(), + (int) $orderId, + $db->quote($data->log) + ) + ) + ); + $db->setQuery($query); + $db->execute(); + + // Send status change email only if config is set to Before order mail or Order is not confirmed. + if (!Redshop::getConfig()->get('ORDER_MAIL_AFTER') + || (Redshop::getConfig()->get('ORDER_MAIL_AFTER') && $data->order_status_code != "C")) + { + self::changeOrderStatusMail($orderId, $data->order_status_code); + } + + if ($data->order_payment_status_code == "Paid") + { + JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_redshop/models'); + $checkoutModelCheckout = JModelLegacy::getInstance('Checkout', 'RedshopModel'); + $checkoutModelCheckout->sendGiftCard($orderId); + + // Send the Order mail + + // Send Order Mail After Payment + if (Redshop::getConfig()->get('ORDER_MAIL_AFTER') && $data->order_status_code == "C") + { + Redshop\Mail\Order::sendMail($orderId); + } + + // Send Invoice mail only if order mail is set to before payment. + elseif (Redshop::getConfig()->get('INVOICE_MAIL_ENABLE')) + { + Redshop\Mail\Invoice::sendMail($orderId); + } + } + + // Trigger function on Order Status change + JPluginHelper::importPlugin('redshop_order'); + RedshopHelperUtility::getDispatcher()->trigger( + 'onAfterOrderStatusUpdate', + array( + self::getOrderDetails($orderId), + $data->order_status_code + ) + ); + + JPluginHelper::importPlugin('redshop_shipping'); + RedshopHelperUtility::getDispatcher()->trigger( + 'sendOrderShipping' + , array( + $orderId, + $data->order_payment_status_code, + $data->order_status_code + ) + ); + + // For Webpack Postdk Label Generation + self::createWebPackLabel($orderId, $data->order_status_code, $data->order_payment_status_code); + self::createBookInvoice($orderId, $data->order_status_code); + } + } + + /** + * Update Order Payment Status + * + * @param integer $orderId Order ID + * @param string $newStatus New status + * + * @return void + * + * @since 2.0.3 + * + * @deprecated 2.0.6 + */ + public static function updateOrderPaymentStatus($orderId, $newStatus) + { + $order = RedshopEntityOrder::getInstance($orderId); + + if ($order->isValid()) + { + $order->set('order_payment_status', $newStatus) + ->set('mdate', time()) + ->save(); + } + } + + /** + * Update order comment + * + * @param integer $orderId Order ID + * @param string $comment New Comment + * + * @return void + * + * @since 2.0.3 + * + * @deprecated 2.0.6 + */ + public static function updateOrderComment($orderId, $comment = '') + { + $order = RedshopEntityOrder::getInstance($orderId); + + if ($order->isValid()) + { + $order->set('customer_note', $comment) + ->save(); + } + } + + /** + * Update Order Requisition Number + * + * @param integer $orderId Order ID + * @param string $requisitionNumber Number required + * + * @return void + * + * @since 2.0.3 + */ + public static function updateOrderRequisitionNumber($orderId, $requisitionNumber = '') + { + $order = RedshopEntityOrder::getInstance($orderId); + + if (!$order->isValid()) + { + return; + } + + $order->set('requisition_number', $requisitionNumber); + + if ($order->save()) + { + // Economic Integration start for invoice generate and book current invoice + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1) + { + RedshopEconomic::renewInvoiceInEconomic($order->getItem()); + } + } + } + + /** + * Update Order Item Status + * + * @param integer $orderId Order id + * @param integer $productId Product id + * @param string $newStatus New status + * @param string $comment Comment + * @param integer $orderItemId Order item id + * + * @return void + * + * @since 2.0.3 + */ + public static function updateOrderItemStatus($orderId = 0, $productId = 0, $newStatus = '', $comment = '', $orderItemId = 0) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->update($db->qn('#__redshop_order_item')) + ->set($db->qn('order_status') . ' = ' . $db->q($newStatus)) + ->where($db->qn('order_id') . ' = ' . (int) $orderId); + + if ($productId != 0) + { + $query->set($db->qn('customer_note') . ' = ' . $db->q($comment)) + ->where($db->qn('product_id') . ' = ' . (int) $productId); + } + + if ($orderItemId != 0) + { + $query->where($db->qn('order_item_id') . ' = ' . (int) $orderItemId); + } + + $db->setQuery($query); + + if (!$db->execute()) + { + JFactory::getApplication()->enqueueMessage($db->getErrorMsg(), 'error'); + } + } + + /** + * Get status list + * + * @param string $name Name of status list + * @param string $selected Selet status name + * @param string $attributes Attributes of html + * + * @return string HTML of status list + * + * @since 2.0.3 + */ + public static function getStatusList($name = 'statuslist', $selected = '', $attributes = ' class="inputbox" size="1" ') + { + if (!self::$orderStatusList) + { + self::$orderStatusList = self::getOrderStatusList(); + } + + $types[] = JHtml::_('select.option', '0', '- ' . JText::_('COM_REDSHOP_SELECT_STATUS_LBL') . ' -'); + $types = array_merge($types, self::$orderStatusList); + $totStatus = explode(",", $selected); + + return JHtml::_('select.genericlist', $types, $name, $attributes, 'value', 'text', $totStatus); + } + + /** + * Get filter by list + * + * @param string $name Name of filter by list + * @param string $selected Select filter list + * @param string $attributes Attributes of HTML + * + * @return string HTML of filter list + * + * @since 2.0.3 + */ + public static function getFilterByList($name = 'filterbylist', $selected = 'all', $attributes = ' class="inputbox" size="1" ') + { + $filterByList = array( + 'orderid' => JText::_('COM_REDSHOP_ORDERID'), + 'ordernumber' => JText::_('COM_REDSHOP_ORDERNUMBER'), + 'fullname' => JText::_('COM_REDSHOP_FULLNAME'), + 'useremail' => JText::_('COM_REDSHOP_USEREMAIL') + ); + + $types[] = JHtml::_('select.option', '', 'All'); + $types = array_merge($types, $filterByList); + $totStatus = explode(",", $selected); + + return JHtml::_('select.genericlist', $types, $name, $attributes, 'value', 'text', $totStatus); + } + + /** + * Get payment status list + * + * @param string $name Name of payment status list + * @param string $selected Select option + * @param string $attributes Attributes of HTML + * + * @return string HTML of payment status list + * + * @since 2.0.3 + */ + public static function getPaymentStatusList($name = 'paymentstatuslist', $selected = '', $attributes = ' class="inputbox" size="1" ') + { + $types[] = JHtml::_('select.option', '', JText::_('COM_REDSHOP_SELECT_PAYMENT_STATUS')); + $types[] = JHtml::_('select.option', 'Paid', JText::_('COM_REDSHOP_PAYMENT_STA_PAID')); + $types[] = JHtml::_('select.option', 'Unpaid', JText::_('COM_REDSHOP_PAYMENT_STA_UNPAID')); + $types[] = JHtml::_('select.option', 'Partial Paid', JText::_('COM_REDSHOP_PAYMENT_STA_PARTIAL_PAID')); + + return JHtml::_('select.genericlist', $types, $name, $attributes, 'value', 'text', $selected); + } + + /** + * Update order status and trigger emails based on status. + * + * @return void + * + * @since 2.0.3 + * + * @throws Exception + */ + public static function updateStatus() + { + JPluginHelper::importPlugin('redshop_shipping'); + $app = JFactory::getApplication(); + $productHelper = productHelper::getInstance(); + + $newStatus = $app->input->getCmd('status'); + $paymentStatus = $app->input->getString('order_paymentstatus'); + $return = $app->input->getCmd('return'); + + $customerNote = $app->input->get('customer_note', array(), 'array'); + $customerNote = stripslashes($customerNote[0]); + + $oid = $app->input->get('order_id', array(), 'method', 'array'); + $orderId = (int) $oid[0]; + + $isProduct = $app->input->getInt('isproduct', 0); + $productId = $app->input->getInt('product_id', 0); + $orderItemId = $app->input->getInt('order_item_id', 0); + + // Get order detail before processing + $prevOrderStatus = RedshopEntityOrder::getInstance($orderId)->getItem()->order_status; + + if (isset($paymentStatus)) + { + self::updateOrderPaymentStatus($orderId, $paymentStatus); + } + + JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_redshop/tables'); + $orderLog = JTable::getInstance('order_status_log', 'Table'); + + if (!$isProduct) + { + $data['order_id'] = $orderId; + $data['order_status'] = $newStatus; + $data['order_payment_status'] = $paymentStatus; + $data['date_changed'] = time(); + $data['customer_note'] = $customerNote; + + if (!$orderLog->bind($data)) + { + JFactory::getApplication()->enqueueMessage($orderLog->getError(), 'error'); + + return; + } + + if (!$orderLog->store()) + { + throw new Exception($orderLog->getError()); + } + + self::updateOrderComment($orderId, $customerNote); + + $requisitionNumber = $app->input->getString('requisition_number', ''); + + if ('' != $requisitionNumber) + { + self::updateOrderRequisitionNumber($orderId, $requisitionNumber); + } + + // Changing the status of the order + self::updateOrderStatus($orderId, $newStatus); + + // Trigger function on Order Status change + JPluginHelper::importPlugin('redshop_order'); + + RedshopHelperUtility::getDispatcher()->trigger( + 'onAfterOrderStatusUpdate', + array( + RedshopEntityOrder::getInstance($orderId)->getItem(), + $newStatus + ) + ); + + if ($paymentStatus == "Paid") + { + JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_redshop/models'); + $checkoutModel = JModelLegacy::getInstance('Checkout', 'RedshopModel'); + $checkoutModel->sendGiftCard($orderId); + + // Send the Order mail + if (Redshop::getConfig()->get('ORDER_MAIL_AFTER') && $newStatus == 'C') + { + if ( + JFactory::getApplication()->isClient('site') || + ( + JFactory::getApplication()->isClient('administrator') && + $app->input->getCmd('order_sendordermail') === 'true' + ) + ) + { + // Only send email if order_sendordermail checked or frontend + Redshop\Mail\Order::sendMail($orderId); + } + } + elseif (Redshop::getConfig()->get('INVOICE_MAIL_ENABLE')) + { + Redshop\Mail\Invoice::sendMail($orderId); + } + } + + self::createWebPackLabel($orderId, $newStatus, $paymentStatus); + } + + self::updateOrderItemStatus($orderId, $productId, $newStatus, $customerNote, $orderItemId); + RedshopHelperClickatell::clickatellSMS($orderId); + + switch ($newStatus) + { + // Cancel & return + case 'X': + case 'R': + + $orderProducts = self::getOrderItemDetail($orderId); + + for ($i = 0, $in = count($orderProducts); $i < $in; $i++) + { + $prodid = $orderProducts[$i]->product_id; + $prodqty = $orderProducts[$i]->stockroom_quantity; + + // Do not process update stock if this order already "returned" before + if ($prevOrderStatus != 'RT') + { + // When the order is set to "cancelled",product will return to stock + RedshopHelperStockroom::manageStockAmount($prodid, $prodqty, $orderProducts[$i]->stockroom_id); + } + + $productHelper->makeAttributeOrder($orderProducts[$i]->order_item_id, 0, $prodid, 1); + } + + break; + + // Returned + case "RT": + + if ($isProduct) + { + // Changing the status of the order item to Returned + self::updateOrderItemStatus($orderId, $productId, "RT", $customerNote, $orderItemId); + + // Changing the status of the order to Partially Returned + self::updateOrderStatus($orderId, "PRT"); + } + + break; + + case "RC": + + if ($isProduct) + { + // Changing the status of the order item to Reclamation + self::updateOrderItemStatus($orderId, $productId, "RC", $customerNote, $orderItemId); + + // Changing the status of the order to Partially Reclamation + self::updateOrderStatus($orderId, "PRC"); + } + + break; + + // Shipped + case "S": + + if ($isProduct) + { + // Changing the status of the order item to Reclamation + self::updateOrderItemStatus($orderId, $productId, "S", $customerNote, $orderItemId); + + // Changing the status of the order to Partially Reclamation + self::updateOrderStatus($orderId, "PS"); + } + + break; + + // Completed + case "C": + + // SensDownload Products + if ($paymentStatus == "Paid") + { + self::sendDownload($orderId); + } + + break; + } + + RedshopHelperUtility::getDispatcher()->trigger( + 'sendOrderShipping', + array( + $orderId, + $paymentStatus, + $newStatus + ) + ); + + if ($app->input->getCmd('order_sendordermail') == 'true' && JFactory::getApplication()->isClient('administrator')) + { + self::changeOrderStatusMail($orderId, $newStatus, $customerNote); + } + + self::createBookInvoice($orderId, $newStatus); + + $msg = JText::_('COM_REDSHOP_ORDER_STATUS_SUCCESSFULLY_SAVED_FOR_ORDER_ID') . " " . $orderId; + + $isArchive = ($app->input->getInt('isarchive')) ? '&isarchive=1' : ''; + + if ($return == 'order') + { + $app->redirect('index.php?option=com_redshop&view=' . $return . '' . $isArchive . '', $msg); + } + else + { + $tmpl = $app->input->getCmd('tmpl'); + + if ('' != $tmpl) + { + $app->redirect('index.php?option=com_redshop&view=' . $return . '&cid[]=' . $orderId . '&tmpl=' . $tmpl . '' . $isArchive . '', $msg); + } + else + { + $app->redirect('index.php?option=com_redshop&view=' . $return . '&cid[]=' . $orderId . '' . $isArchive . '', $msg); + } + } + } + + /** + * Get order details + * + * @param integer $orderId Order ID + * + * @return object + * + * @since 2.0.3 + * + * @deprecated 2.0.6 + */ + public static function getOrderDetails($orderId) + { + return self::getOrderDetail($orderId); + } + + /** + * Get list order details + * + * @param integer $orderId Order ID + * + * @return object + * + * @since 2.0.3 + * @deprecated Use RedshopEntityOrder::getInstance($orderId)->getItem(); + */ + public static function getMultiOrderDetails($orderId) + { + return RedshopEntityOrder::getInstance($orderId)->getItem(); + } + + /** + * Get User Order Details + * + * @param integer $userId User ID + * + * @return object + * + * @since 2.0.3 + */ + public static function getUserOrderDetails($userId = 0) + { + $db = JFactory::getDbo(); + $user = JFactory::getUser(); + + if ($userId == 0) + { + $userId = $user->id; + } + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('user_id') . ' = ' . (int) $userId) + ->order($db->qn('order_id')); + $db->setQuery($query); + + return $db->loadObjectlist(); + } + + /** + * Get list item of an specific order. + * + * @param mixed $orderId Order ID + * @param integer $productId Product ID + * @param integer $orderItemId Order Item ID + * + * @return mixed + * + * @since 2.0.3 + */ + public static function getOrderItemDetail($orderId = 0, $productId = 0, $orderItemId = 0, $force = false) + { + // Make sure at least one options has been pass. + if (empty($orderId) && !$productId && !$orderItemId) + { + return false; + } + + $key = $orderId . '_' . $productId . '_' . $orderItemId; + + if (!array_key_exists($key, self::$orderItems) || $force) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_order_item')); + + if (!empty($orderId)) + { + $orderId = explode(',', $orderId); + $orderId = ArrayHelper::toInteger($orderId); + $orderId = implode(',', $orderId); + + $query->where($db->qn('order_id') . ' IN (' . $orderId . ')'); + } + + if ($productId != 0) + { + $query->where($db->qn('product_id') . ' = ' . (int) $productId); + } + + if ($orderItemId != 0) + { + $query->where($db->qn('order_item_id') . ' = ' . (int) $orderItemId); + } + + self::$orderItems[$key] = $db->setQuery($query)->loadObjectList(); + } + + return self::$orderItems[$key]; + } + + /** + * Get Order Partial Payment + * + * @param integer $orderId Order ID + * + * @return array + * + * @since 2.0.3 + */ + public static function getOrderPartialPayment($orderId) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('order_payment_amount')) + ->from($db->qn('#__redshop_order_payment')) + ->where($db->qn('order_id') . ' = ' . (int) $orderId); + $db->setQuery($query); + $list = $db->loadObjectlist(); + + $spiltPaymentAmount = 0; + + for ($i = 0, $in = count($list); $i < $in; $i++) + { + if ($list[$i]->order_payment_amount > 0) + { + $spiltPaymentAmount = $list[$i]->order_payment_amount; + } + } + + return $spiltPaymentAmount; + } + + /** + * Get Shipping Method Info + * + * @param string $shippingClass Shipping class + * + * @return array + * + * @since 2.0.3 + */ + public static function getShippingMethodInfo($shippingClass = '') + { + $key = (!empty($shippingClass)) ? $shippingClass : '0'; + + if (!array_key_exists($key, static::$shippingMethods)) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__extensions')) + ->where($db->qn('enabled') . ' = ' . $db->quote('1')) + ->where('LOWER(' . $db->qn('folder') . ') = ' . $db->quote('redshop_shipping')) + ->order($db->qn('ordering') . ' ASC'); + + if (!empty($shippingClass)) + { + $query->where($db->qn('element') . ' = ' . $db->quote($shippingClass)); + } + + static::$shippingMethods = $db->setQuery($query)->loadObjectList(); + } + + return static::$shippingMethods; + } + + /** + * Get payment method info + * + * @param string $paymentMethodClass Payment method class + * @param boolean $includeDiscover Include all plugins even not discover install yet + * + * @return array + * + * @since 2.0.3 + */ + public static function getPaymentMethodInfo($paymentMethodClass = '', $includeDiscover = true) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__extensions')) + ->where($db->qn('enabled') . ' = ' . $db->quote('1')) + ->where('LOWER(' . $db->qn('folder') . ') = ' . $db->quote('redshop_payment')) + ->order($db->qn('ordering') . ' ASC'); + + if ($paymentMethodClass != '') + { + $query->where($db->qn('element') . ' = ' . $db->quote($paymentMethodClass)); + } + + if (!$includeDiscover) + { + $query->where($db->qn('state') . ' >= 0'); + } + + $db->setQuery($query); + + return $db->loadObjectList(); + } + + /** + * Get billing address + * + * @param integer $userId User ID + * + * @return object|false|null Object data if success. False otherwise. + * + * @since 2.0.3 + */ + public static function getBillingAddress($userId = 0) + { + if ($userId == 0) + { + $user = JFactory::getUser(); + $userId = $user->id; + } + + if (!$userId) + { + return false; + } + + if (!array_key_exists($userId, static::$billingAddresses)) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->select('CONCAT(' . $db->qn('firstname') . '," ",' . $db->qn('lastname') . ') AS text') + ->from($db->qn('#__redshop_users_info')) + ->where($db->qn('address_type') . ' = ' . $db->quote('BT')) + ->where($db->qn('user_id') . ' = ' . (int) $userId); + + static::$billingAddresses[$userId] = $db->setQuery($query)->loadObject(); + } + + return static::$billingAddresses[$userId]; + } + + /** + * Get Shipping address + * + * @param integer $userId User Id + * + * @return array + * + * @since 2.0.3 + */ + public static function getShippingAddress($userId = 0) + { + if ($userId == 0) + { + $user = JFactory::getUser(); + $userId = $user->id; + } + + if (!$userId) + { + return false; + } + + if (!array_key_exists($userId, static::$shippingAddresses)) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->select('CONCAT(' . $db->qn('firstname') . '," ",' . $db->qn('lastname') . ') AS text') + ->from($db->qn('#__redshop_users_info')) + ->where($db->qn('address_type') . ' = ' . $db->quote('ST')) + ->where($db->qn('user_id') . ' = ' . (int) $userId); + + static::$shippingAddresses[$userId] = $db->setQuery($query)->loadObjectList(); + } + + return static::$shippingAddresses[$userId]; + } + + /** + * Get User full name + * + * @param integer $userId User ID + * + * @return string + * + * @since 2.0.3 + */ + public static function getUserFullName($userId) + { + $fullName = ""; + $user = JFactory::getUser(); + $db = JFactory::getDbo(); + + if ($userId == 0) + { + $userId = $user->id; + } + + $query = $db->getQuery(true) + ->select($db->qn(array('firstname', 'lastname'))) + ->from($db->qn('#__redshop_users_info')) + ->where($db->qn('address_type') . ' LIKE ' . $db->quote('BT')) + ->where($db->qn('user_id') . ' = ' . (int) $userId); + $db->setQuery($query); + $list = $db->loadObject(); + + if ($list) + { + $fullName = $list->firstname . " " . $list->lastname; + } + else + { + $query = $db->getQuery(true) + ->select($db->qn('name')) + ->from($db->qn('#__users')) + ->where($db->qn('id') . ' = ' . (int) $userId); + $db->setQuery($query); + $list = $db->loadObject(); + + if ($list) + { + $fullName = $list->name; + } + } + + return $fullName; + } + + /** + * Get order item accessory detail + * + * @param integer $orderItemId Order Item ID + * + * @return null|array + * + * @since 2.0.3 + */ + public static function getOrderItemAccessoryDetail($orderItemId = 0) + { + if (!$orderItemId) + { + return null; + } + + return RedshopEntityOrder_Item::getInstance($orderItemId)->getAccessoryItems()->toObjects(); + } + + /** + * Get order item attribute detail + * + * @param integer $orderItemId Order Item ID + * @param integer $isAccessory Is accessory + * @param string $section Section text + * @param integer $parentSectionId Parent section ID + * + * @return array + * + * @since 2.0.3 + */ + public static function getOrderItemAttributeDetail($orderItemId = 0, $isAccessory = 0, $section = "attribute", $parentSectionId = 0) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_order_attribute_item')) + ->where($db->qn('is_accessory_att') . ' = ' . (int) $isAccessory) + ->where($db->qn('section') . ' = ' . $db->quote($section)); + + if ($orderItemId != 0) + { + $query->where($db->qn('order_item_id') . ' = ' . (int) $orderItemId); + } + + if ($parentSectionId != 0) + { + $query->where($db->qn('parent_section_id') . ' = ' . (int) $parentSectionId); + } + + $db->setQuery($query); + + return $db->loadObjectlist(); + } + + /** + * Get Order User Field Data + * + * @param integer $orderItemId Order Item ID + * @param integer $section Section ID + * + * @return object + * + * @since 2.0.3 + */ + public static function getOrderUserFieldData($orderItemId = 0, $section = 0) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('fd.*') + ->select($db->qn(array('f.title', 'f.type', 'f.name'))) + ->from($db->qn('#__redshop_fields_data', 'fd')) + ->leftJoin($db->qn('#__redshop_fields', 'f') . ' ON ' . $db->qn('f.id') . ' = ' . $db->qn('fd.fieldid')) + ->where($db->qn('fd.itemid') . ' = ' . (int) $orderItemId) + ->where($db->qn('fd.section') . ' = ' . $db->quote($section)); + + return $db->setQuery($query)->loadObjectList(); + } + + /** + * Generate Order Number + * + * @return integer + * + * @since 2.0.3 + */ + public static function generateOrderNumber() + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('MAX(' . $db->qn('order_id') . ')') + ->from($db->qn('#__redshop_orders')); + $db->setQuery($query); + $maxId = $db->loadResult(); + + /* + * if Economic Integration is on !!! + * We are not using Order Invoice Number Template + * Economic Order Number Only Support (int) value. + * Invoice Number May be varchar or int. + */ + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') && JPluginHelper::isEnabled('economic')) + { + $query = $db->getQuery(true) + ->select($db->qn('order_number')) + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_id') . ' = ' . (int) $maxId); + $db->setQuery($query); + + $maxOrderNumber = $db->loadResult(); + $maxInvoice = RedshopEconomic::getMaxOrderNumberInEconomic(); + $maxId = max((int) $maxOrderNumber, $maxInvoice); + } + elseif (Redshop::getConfig()->get('INVOICE_NUMBER_TEMPLATE')) + { + $maxId = ($maxId + Redshop::getConfig()->get('FIRST_INVOICE_NUMBER') + 1); + + return self::parseNumberTemplate( + Redshop::getConfig()->get('INVOICE_NUMBER_TEMPLATE'), + $maxId + ); + } + + return $maxId + 1; + } + + /** + * Random Generate Encrypt Key + * + * @param string $pLength Length of string + * + * @return string + * + * @since 2.0.3 + * @deprecated Use \Redshop\Crypto\Helper\Encrypt::generateCustomRandomEncryptKey + */ + public static function randomGenerateEncryptKey($pLength = '30') + { + return \Redshop\Crypto\Helper\Encrypt::generateCustomRandomEncryptKey((int) $pLength); + } + + /** + * Get Country name by 3 characters of country code + * + * @param string $cnt3 Country code + * + * @return string + * + * @since 2.0.3 + */ + public static function getCountryName($cnt3 = '') + { + if (empty($cnt3)) + { + return ''; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('country_3_code', 'value')) + ->select($db->qn('country_name', 'text')) + ->select($db->qn('country_jtext')) + ->from($db->qn('#__redshop_country')); + + if ($cnt3 != '') + { + $query->where($db->qn('country_3_code') . ' = ' . $db->quote($cnt3)); + } + + $countries = $db->setQuery($query)->loadObjectList(); + + $countries = RedshopHelperUtility::convertLanguageString($countries); + + if (count($countries) > 0) + { + return $countries[0]->text; + } + + return ''; + } + + /** + * Get state name + * + * @param string $st3 State code + * @param string $cnt3 Country code + * + * @return string + * + * @since 2.0.3 + */ + public static function getStateName($st3 = "", $cnt3 = "") + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('s.state_name')) + ->from($db->qn('#__redshop_state', 's')) + ->leftJoin($db->qn('#__redshop_country', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('s.country_id')); + + if ($st3 != "") + { + $query->where($db->qn('s.state_2_code') . ' = ' . $db->quote($st3)); + } + + if ($cnt3 != "") + { + $query->where($db->qn('c.country_3_code') . ' = ' . $db->quote($cnt3)); + } + + $db->setQuery($query); + + return $db->loadResult(); + } + + /** + * Send download by email + * + * @param integer $orderId Order ID + * + * @return boolean + * + * @since 2.0.3 + */ + public static function sendDownload($orderId = 0) + { + $app = JFactory::getApplication(); + + // Getting the order status changed template from mail center end + $mailFrom = $app->get('mailfrom'); + $fromName = $app->get('fromname'); + + $mailData = ""; + $mailSubject = ""; + $mailBcc = null; + $mailInfo = Redshop\Mail\Helper::getTemplate(0, "downloadable_product_mail"); + + if (count($mailInfo) > 0) + { + $mailData = $mailInfo[0]->mail_body; + $mailSubject = $mailInfo[0]->mail_subject; + + if (trim($mailInfo[0]->mail_bcc) != "") + { + $mailBcc = explode(",", $mailInfo[0]->mail_bcc); + } + } + + // Get Downloadable Product + $rows = self::getDownloadProduct($orderId); + + // There is no downloadable product + if ($rows === null || count($rows) == 0) + { + return false; + } + + // Getting the order details + $orderDetail = self::getOrderDetails($orderId); + $userDetail = self::getOrderBillingUserInfo($orderId); + + $userFullname = $userDetail->firstname . " " . $userDetail->lastname; + $userEmail = $userDetail->email; + + $mailData = str_replace("{fullname}", $userFullname, $mailData); + $mailData = str_replace("{order_id}", $orderDetail->order_id, $mailData); + $mailData = str_replace("{order_number}", $orderDetail->order_number, $mailData); + $mailData = str_replace("{order_date}", RedshopHelperDatetime::convertDateFormat($orderDetail->cdate), $mailData); + + $productStart = ""; + $productEnd = ""; + $productMiddle = ""; + $pMiddle = ""; + $mailFirst = explode("{product_serial_loop_start}", $mailData); + + if (count($mailFirst) > 1) + { + $productStart = $mailFirst[0]; + $mailSec = explode("{product_serial_loop_end}", $mailFirst[1]); + + if (count($mailSec) > 1) + { + $productMiddle = $mailSec[0]; + $productEnd = $mailSec[1]; + } + } + + foreach ($rows as $row) + { + $dataMessage = $productMiddle; + $downloadFilename = substr(basename($row->file_name), 11); + + $mailToken = "" . $downloadFilename . ""; + + $dataMessage = str_replace("{product_serial_number}", $row->product_serial_number, $dataMessage); + $dataMessage = str_replace("{product_name}", $row->product_name, $dataMessage); + $dataMessage = str_replace("{token}", $mailToken, $dataMessage); + + $pMiddle .= $dataMessage; + } + + $mailData = $productStart . $pMiddle . $productEnd; + $mailBody = $mailData; + Redshop\Mail\Helper::imgInMail($mailBody); + $mailSubject = str_replace("{order_number}", $orderDetail->order_number, $mailSubject); + + if ($mailBody && $userEmail != "") + { + if (!JFactory::getMailer()->sendMail($mailFrom, $fromName, $userEmail, $mailSubject, $mailBody, 1, null, $mailBcc)) + { + $app->enqueueMessage(JText::_('COM_REDSHOP_ERROR_DOWNLOAD_MAIL_FAIL'), 'error'); + } + } + + return true; + } + + /** + * Get download product + * + * @param integer $orderId Order ID + * + * @return array + * + * @since 2.0.3 + */ + public static function getDownloadProduct($orderId) + { + if (!array_key_exists($orderId, self::$orderProductsDownload)) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('pd.*') + ->select($db->qn('product_name')) + ->from($db->qn('#__redshop_product_download', 'pd')) + ->leftJoin($db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('pd.product_id') . ' = ' . $db->qn('p.product_id')) + ->where($db->qn('order_id') . ' = ' . (int) $orderId); + + + self::$orderProductsDownload[$orderId] = $db->setQuery($query)->loadObjectList(); + } + + return self::$orderProductsDownload[$orderId]; + } + + /** + * Get download product log + * + * @param integer $orderId Order Id + * @param string $did Download id + * + * @return array + * + * @since 2.0.3 + */ + public static function getDownloadProductLog($orderId, $did = '') + { + $key = $orderId . '_' . $did; + + if (!array_key_exists($key, self::$orderProductsDownloadLog)) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('pdl.*') + ->select($db->qn(array('pd.order_id', 'pd.product_id', 'pd.file_name'))) + ->from($db->qn('#__redshop_product_download_log', 'pdl')) + ->leftJoin($db->qn('#__redshop_product_download', 'pd') . ' ON ' . $db->qn('pd.download_id') . ' = ' . $db->qn('pdl.download_id')) + ->where($db->qn('pd.order_id') . ' = ' . (int) $orderId); + + if ($did != '') + { + $query->where($db->qn('pdl.download_id') . ' = ' . $db->quote($did)); + } + + self::$orderProductsDownloadLog[$key] = $db->setQuery($query)->loadObjectList(); + } + + return self::$orderProductsDownloadLog[$key]; + } + + /** + * Get payment parameters + * + * @param string $payment Payment type + * + * @return array + * + * @since 2.0.3 + */ + public static function getParameters($payment) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__extensions')) + ->where($db->qn('element') . ' = ' . $db->quote($payment)); + $db->setQuery($query); + + return $db->loadObjectList(); + } + + /** + * Get payment information + * + * @param object $row Payment info row + * @param array $post payment method class + * + * @return void + * + * @since 2.0.3 + */ + public static function getPaymentInformation($row, $post) + { + $app = JFactory::getApplication(); + $pluginParameters = self::getParameters($post['payment_method_class']); + $paymentInfo = $pluginParameters[0]; + $paymentParams = new Registry($paymentInfo->params); + + $isCreditCard = $paymentParams->get('is_creditcard', ''); + + $order = self::getOrderDetails($row->order_id); + + if ($userBillingInfo = self::getOrderBillingUserInfo($row->order_id)) + { + $userBillingInfo->country_2_code = RedshopHelperWorld::getCountryCode2($userBillingInfo->country_code); + $userBillingInfo->state_2_code = RedshopHelperWorld::getStateCode2($userBillingInfo->state_code); + } + + $task = $app->input->getCmd('task'); + + if ($shippingAddress = self::getOrderShippingUserInfo($row->order_id)) + { + $shippingAddress->country_2_code = RedshopHelperWorld::getCountryCode2($shippingAddress->country_code); + $shippingAddress->state_2_code = RedshopHelperWorld::getStateCode2($shippingAddress->state_code); + } + + $values = array(); + $values['shippinginfo'] = $shippingAddress; + $values['billinginfo'] = $userBillingInfo; + $values['carttotal'] = $order->order_total; + $values['order_subtotal'] = $order->order_subtotal; + $values["order_id"] = $row->order_id; + $values['payment_plugin'] = $post['payment_method_class']; + $values['task'] = $task; + $values['order'] = $order; + + if ($isCreditCard == 0) + { + // Check for bank transfer payment type plugin - `rs_payment_banktransfer` suffixed + $isBankTransferPaymentType = RedshopHelperPayment::isPaymentType($values['payment_plugin']); + + if ($isBankTransferPaymentType) + { + $app->redirect( + JUri::base() . "index.php?option=com_redshop&view=order_detail&layout=creditcardpayment&plugin=" + . $values['payment_plugin'] . "&order_id=" . $row->order_id + ); + } + + JPluginHelper::importPlugin('redshop_payment'); + RedshopHelperUtility::getDispatcher()->trigger('onPrePayment', array($values['payment_plugin'], $values)); + + $app->redirect( + JUri::base() . "index.php?option=com_redshop&view=order_detail&task=edit&cid[]=" . $row->order_id + ); + } + else + { + $app->redirect( + JUri::base() . "index.php?option=com_redshop&view=order_detail&layout=creditcardpayment&plugin=" + . $values['payment_plugin'] . "&order_id=" . $row->order_id + ); + } + } + + /** + * Get shipping location information + * + * @param string $shippingName Shipping name + * + * @return object + * + * @since 2.0.3 + */ + public static function getShippingLocationInfo($shippingName) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('shipping_location_info')) + ->from($db->qn('#__redshop_shipping_rate')) + ->where($db->qn('shipping_rate_name') . ' = ' . $db->quote($shippingName)); + + $db->setQuery($query); + + return $db->loadObjectList(); + } + + /** + * Check update Orders + * + * @param object $data Data to check + * + * @return integer + * + * @since 2.0.3 + */ + public static function checkUpdateOrders($data) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_orders')) + ->where($db->qn('order_status') . ' = ' . $db->quote($data->order_status_code)) + ->where($db->qn('order_payment_status') . ' = ' . $db->quote($data->order_payment_status_code)) + ->where($db->qn('order_id') . ' = ' . (int) $data->order_id); + $db->setQuery($query); + + if (count($db->loadObjectList()) == 0) + { + return 0; + } + + return 1; + } + + /** + * Change order status mail + * + * @param integer $orderId Order ID + * @param string $newStatus New status + * @param string $orderComment Order Comment + * + * @return void + * + * @since 2.0.3 + */ + public static function changeOrderStatusMail($orderId, $newStatus, $orderComment = '') + { + $app = JFactory::getApplication(); + + // Changes to parse all tags same as order mail end + $userDetail = self::getOrderBillingUserInfo($orderId); + + $mailFrom = $app->get('mailfrom'); + $fromName = $app->get('fromname'); + $mailBcc = null; + $mailSection = "order_status"; + $mailTemplate = Redshop\Mail\Helper::getTemplate( + 0, '', '`mail_section` LIKE "' . $mailSection . '" AND `mail_order_status` LIKE "' . $newStatus . '"' + ); + + if (count($mailTemplate) > 0) + { + $mailData = $mailTemplate[0]->mail_body; + $mailSubject = $mailTemplate[0]->mail_subject; + + $fieldArray = RedshopHelperExtrafields::getSectionFieldList(RedshopHelperExtrafields::SECTION_ORDER, 0); + + if (count($fieldArray) > 0) + { + for ($i = 0, $in = count($fieldArray); $i < $in; $i++) + { + $fieldValueArray = RedshopHelperExtrafields::getSectionFieldDataList( + $fieldArray[$i]->id, RedshopHelperExtrafields::SECTION_ORDER, $orderId, $userDetail->user_email + ); + + if ($fieldValueArray->data_txt != "") + { + $mailData = str_replace('{' . $fieldArray[$i]->name . '}', $fieldValueArray->data_txt, $mailData); + $mailData = str_replace('{' . $fieldArray[$i]->name . '_lbl}', $fieldArray[$i]->title, $mailData); + } + else + { + $mailData = str_replace('{' . $fieldArray[$i]->name . '}', "", $mailData); + $mailData = str_replace('{' . $fieldArray[$i]->name . '_lbl}', "", $mailData); + } + } + } + + if (trim($mailTemplate[0]->mail_bcc) != "") + { + $mailBcc = explode(",", $mailTemplate[0]->mail_bcc); + } + + // Changes to parse all tags same as order mail start + $orderDetail = self::getOrderDetails($orderId); + $mailData = str_replace("{order_mail_intro_text_title}", JText::_('COM_REDSHOP_ORDER_MAIL_INTRO_TEXT_TITLE'), $mailData); + $mailData = str_replace("{order_mail_intro_text}", JText::_('COM_REDSHOP_ORDER_MAIL_INTRO_TEXT'), $mailData); + + $mailData = Template::replaceTemplate($orderDetail, $mailData, true); + + $arrDiscount = explode('@', $orderDetail->discount_type); + $discountType = ''; + + for ($d = 0, $dn = count($arrDiscount); $d < $dn; $d++) + { + if ($arrDiscount [$d]) + { + $arrDiscountType = explode(':', $arrDiscount [$d]); + + if ($arrDiscountType [0] == 'c') + { + $discountType .= JText::_('COM_REDSHOP_COUPON_CODE') . ' : ' . $arrDiscountType [1] . '
    '; + } + + if ($arrDiscountType [0] == 'v') + { + $discountType .= JText::_('COM_REDSHOP_VOUCHER_CODE') . ' : ' . $arrDiscountType [1] . '
    '; + } + } + } + + if (!$discountType) + { + $discountType = JText::_('COM_REDSHOP_NO_DISCOUNT_AVAILABLE'); + } + + $search [] = "{discount_type}"; + $replace [] = $discountType; + + // Getting the order status changed template from mail center end + $mailData = RedshopHelperBillingTag::replaceBillingAddress($mailData, $userDetail); + + // Get ShippingAddress From order Users info + $shippingAddresses = self::getOrderShippingUserInfo($orderId); + + if (count($shippingAddresses) <= 0) + { + $shippingAddresses = $userDetail; + } + + $mailData = Redshop\Shipping\Tag::replaceShippingAddress($mailData, $shippingAddresses); + + $search[] = "{shopname}"; + $replace[] = Redshop::getConfig()->get('SHOP_NAME'); + + $search[] = "{fullname}"; + $replace[] = $userDetail->firstname . " " . $userDetail->lastname; + + $search[] = "{email}"; + $replace[] = $userDetail->user_email; + + $search[] = "{customer_id}"; + $replace[] = $userDetail->users_info_id; + + $search[] = "{order_id}"; + $replace[] = $orderId; + + $search[] = "{order_number}"; + $replace[] = $orderDetail->order_number; + + $search[] = "{order_date}"; + $replace[] = RedshopHelperDatetime::convertDateFormat($orderDetail->cdate); + + $search[] = "{customer_note_lbl}"; + $replace[] = JText::_('COM_REDSHOP_COMMENT'); + + $search[] = "{customer_note}"; + $replace[] = $orderComment; + + $search[] = "{order_detail_link_lbl}"; + $replace[] = JText::_('COM_REDSHOP_ORDER_DETAIL_LBL'); + + $orderDetailurl = JUri::root() . 'index.php?option=com_redshop&view=order_detail&oid=' . $orderId . '&encr=' . $orderDetail->encr_key; + $search[] = "{order_detail_link}"; + $replace[] = "" . JText::_("COM_REDSHOP_ORDER_DETAIL_LINK_LBL") . ""; + + // Todo: Move to the shipping plugin to return track no and track url + $details = Redshop\Shipping\Rate::decrypt($orderDetail->ship_method_id); + + if (count($details) <= 1) + { + $details = explode("|", $orderDetail->ship_method_id); + } + + if ($details[0] == 'plgredshop_shippingdefault_shipping_gls') + { + $arrLocationDetails = explode('|', $orderDetail->shop_id); + $orderDetail->track_no = $arrLocationDetails[0]; + } + + if (strpos($mailData, "{if track_no}") !== false && strpos($mailData, "{track_no end if}") !== false) + { + if (empty($orderDetail->track_no)) + { + $template_pd_sdata = explode('{if track_no}', $mailData); + $template_pd_edata = explode('{track_no end if}', $template_pd_sdata [1]); + $mailData = $template_pd_sdata[0] . $template_pd_edata[1]; + } + + $mailData = str_replace("{if track_no}", '', $mailData); + $mailData = str_replace("{track_no end if}", '', $mailData); + } + + $search[] = "{order_track_no}"; + $replace[] = trim($orderDetail->track_no); + + $orderTrackURL = 'http://www.pacsoftonline.com/ext.po.dk.dk.track?key=' . Redshop::getConfig()->get('POSTDK_CUSTOMER_NO') . '&order=' . $orderId; + + JPluginHelper::importPlugin('redshop_shipping'); + RedshopHelperUtility::getDispatcher()->trigger( + 'onReplaceTrackingUrl', + array( + $orderId, + &$orderTrackURL + ) + ); + + $search[] = "{order_track_url}"; + $replace[] = "" . JText::_("COM_REDSHOP_TRACK_LINK_LBL") . ""; + + $mailBody = str_replace($search, $replace, $mailData); + Redshop\Mail\Helper::imgInMail($mailBody); + $mailSubject = str_replace($search, $replace, $mailSubject); + + if ('' != $userDetail->thirdparty_email && $mailBody) + { + Redshop\Mail\Helper::sendEmail( + $mailFrom, + $fromName, + $userDetail->thirdparty_email, + $mailSubject, + $mailBody, + true, + null, + null, + null, + $mailSection, + func_get_args() + ); + } + + if ('' != $userDetail->user_email && $mailBody) + { + Redshop\Mail\Helper::sendEmail( + $mailFrom, + $fromName, + $userDetail->user_email, + $mailSubject, + $mailBody, + true, + null, + $mailBcc, + null, + $mailSection, + func_get_args() + ); + } + } + } + + /** + * Create book invoice + * + * @param integer $orderId Order ID + * @param string $orderStatus Order status + * + * @return void + * + * @since 2.0.3 + */ + public static function createBookInvoice($orderId, $orderStatus) + { + // Economic Integration start for invoice generate and book current invoice + if (Redshop::getConfig()->get('ECONOMIC_INTEGRATION') == 1 && Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT') != 1) + { + if (Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT') == 2 && $orderStatus == Redshop::getConfig()->get('BOOKING_ORDER_STATUS')) + { + $paymentInfo = self::getPaymentInfo($orderId); + $economicData = array(); + + if (!empty($paymentInfo)) + { + $paymentName = $paymentInfo->payment_method_class; + $paymentArr = explode("rs_payment_", $paymentInfo->payment_method_class); + + if (count($paymentArr) > 0) + { + $paymentName = $paymentArr[1]; + } + + $economicData['economic_payment_method'] = $paymentName; + $paymentMethod = self::getPaymentMethodInfo($paymentInfo->payment_method_class); + + if (count($paymentMethod) > 0) + { + $paymentParams = new Registry($paymentMethod[0]->params); + $economicData['economic_payment_terms_id'] = $paymentParams->get('economic_payment_terms_id'); + $economicData['economic_design_layout'] = $paymentParams->get('economic_design_layout'); + $economicData['economic_is_creditcard'] = $paymentParams->get('is_creditcard'); + } + } + + RedshopEconomic::createInvoiceInEconomic($orderId, $economicData); + } + + $bookInvoicePdf = RedshopEconomic::bookInvoiceInEconomic($orderId, Redshop::getConfig()->get('ECONOMIC_INVOICE_DRAFT')); + + if (JFile::exists($bookInvoicePdf)) + { + Redshop\Mail\Invoice::sendEconomicBookInvoiceMail($orderId, $bookInvoicePdf); + } + } + } + + /** + * Create Multi Print Invoice PDF + * + * @param array $orderIds Order ID + * + * @return string File name of generated pdf. + * + * @since 2.0.3 + */ + public static function createMultiPrintInvoicePdf($orderIds) + { + return RedshopHelperMail::createMultiprintInvoicePdf($orderIds); + } + + /** + * Method for generate Invoice PDF of specific Order + * + * @param int $orderId ID of order. + * @param string $code Code when generate PDF. + * @param boolean $isEmail Is generate for use in Email? + * + * @return void + * + * @since 2.0.3 + */ + public static function generateInvoicePdf($orderId, $code = 'F', $isEmail = false) + { + if (!$orderId) + { + return; + } + + $plugins = JPluginHelper::getPlugin('redshop_pdf'); + + if (empty($plugins)) + { + return; + } + + $orderDetail = self::getOrderDetails($orderId); + $orderTemplate = RedshopHelperTemplate::getTemplate('order_print'); + + if (count($orderTemplate) > 0 && $orderTemplate[0]->template_desc != "") + { + $message = $orderTemplate[0]->template_desc; + } + else + { + $message = ' +
    + + + +
    {order_information_lbl}{print}
    {order_id_lbl} : {order_id}
    {order_number_lbl} : {order_number}
    {order_date_lbl} : {order_date}
    {order_status_lbl} : {order_status}
    {shipping_method_lbl} : {shipping_method} : {shipping_rate_name}
    {payment_lbl} : {payment_method}
    + +
    {billing_address_information_lbl}
    {billing_address}
    + + +
    {shipping_address_info_lbl}
    {shipping_address}
    + +
    {order_detail_lbl}
    + + {product_loop_start} + + + {product_loop_end}
    {product_name_lbl}{note_lbl}{price_lbl}{quantity_lbl}Total Price

    {product_name}
    {product_attribute}{product_accessory}{product_userfields}

    {product_wrapper}{product_thumb_image}{product_price}{product_quantity}{product_total_price}
    + + {if vat} + {vat end if}{if discount} + {discount end if} +
    {order_subtotal_lbl} : {order_subtotal}
    {vat_lbl} : {order_tax}
    {discount_lbl} : {order_discount}
    + {shipping_lbl} : {order_shipping}

    {total_lbl} : + {order_total}


    +
    '; + } + + $print_tag = "" + . "" . JText::_("; + + $message = str_replace("{print}", $print_tag, $message); + $message = str_replace("{order_mail_intro_text_title}", JText::_('COM_REDSHOP_ORDER_MAIL_INTRO_TEXT_TITLE'), $message); + $message = str_replace("{order_mail_intro_text}", JText::_('COM_REDSHOP_ORDER_MAIL_INTRO_TEXT'), $message); + + $message = Template::replaceTemplate($orderDetail, $message, true); + + JPluginHelper::importPlugin('redshop_pdf'); + RedshopHelperUtility::getDispatcher()->trigger('onRedshopOrderCreateInvoicePdf', array($orderId, $message, $code, $isEmail)); + } + + /** + * Create PacSoft Label from Order Status Change functions + * + * @param integer $orderId Order Information ID + * @param string $orderStatus Order Status Code + * @param string $paymentStatus Order Payment Status Code + * + * @return void + * + * @since 2.0.3 + */ + public static function createWebPackLabel($orderId, $orderStatus, $paymentStatus) + { + // If PacSoft is not enable then return + if (!Redshop::getConfig()->get('POSTDK_INTEGRATION')) + { + return; + } + + // If auto generation is disable then return + if (!Redshop::getConfig()->get('AUTO_GENERATE_LABEL')) + { + return; + } + + // Only Execute this function for selected status match + if ($orderStatus == Redshop::getConfig()->get('GENERATE_LABEL_ON_STATUS') && $paymentStatus == "Paid") + { + $orderDetails = self::getOrderDetails($orderId); + $details = Redshop\Shipping\Rate::decrypt($orderDetails->ship_method_id); + + $shippingParams = new Registry( + JPluginHelper::getPlugin( + 'redshop_shipping', + str_replace( + 'plgredshop_shipping', + '', + strtolower($details[0]) + ) + )->params + ); + + // Checking 'plgredshop_shippingdefault_shipping' to support backward compatibility + $allowPacsoftLabel = ($details[0] === 'plgredshop_shippingdefault_shipping' || (boolean) $shippingParams->get('allowPacsoftLabel')); + + if ($allowPacsoftLabel && !$orderDetails->order_label_create) + { + $generateLabel = self::generateParcel($orderId); + + if ($generateLabel != "success") + { + JFactory::getApplication()->enqueueMessage($generateLabel, 'error'); + } + } + } + } + + /** + * Order status update + * + * @param integer $orderId Order ID + * @param array $post Post array + * + * @return boolean/mixed + * + * @since 2.0.3 + */ + public static function orderStatusUpdate($orderId, $post = array()) + { + $productHelper = productHelper::getInstance(); + $newStatus = $post['mass_change_order_status']; + $customerNote = $post['customer_note' . $orderId]; + $isProduct = (isset($post['isproduct'])) ? $post['isproduct'] : 0; + $productId = (isset($post['product_id'])) ? $post['product_id'] : 0; + $paymentStatus = $post['mass_change_payment_status']; + + JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_redshop/tables'); + + // Add status log... + $orderLog = JTable::getInstance('order_status_log', 'Table'); + $orderLog->order_id = $customerNote; + $orderLog->customer_note = $customerNote; + $orderLog->order_status = $newStatus; + $orderLog->date_changed = time(); + + if (!$orderLog->store()) + { + return JError::raiseWarning('', $orderLog->getError()); + } + + // Changing the status of the order + self::updateOrderStatus($orderId, $newStatus); + + // Changing the status of the order + if (isset($paymentStatus)) + { + self::updateOrderPaymentStatus($orderId, $paymentStatus); + } + + if ($post['isPacsoft']) + { + // For Webpack Postdk Label Generation + self::createWebPackLabel($orderId, $newStatus, $paymentStatus); + } + + if (Redshop::getConfig()->get('CLICKATELL_ENABLE')) + { + // Changing the status of the order end + RedshopHelperClickatell::clickatellSMS($orderId); + } + + // If changing the status of the order then there item status need to change + if ($isProduct != 1) + { + self::updateOrderItemStatus($orderId, 0, $newStatus); + } + + // If order is cancelled then + if ($newStatus == 'X') + { + $orderProducts = self::getOrderItemDetail($orderId); + + for ($j = 0, $jn = count($orderProducts); $j < $jn; $j++) + { + $prodid = $orderProducts[$j]->product_id; + $prodqty = $orderProducts[$j]->stockroom_quantity; + + // When the order is set to "cancelled",product will return to stock + RedshopHelperStockroom::manageStockAmount($prodid, $prodqty, $orderProducts[$j]->stockroom_id); + $productHelper->makeAttributeOrder($orderProducts[$j]->order_item_id, 0, $prodid, 1); + } + } + elseif ($newStatus == 'RT') + { + // If any of the item from the order is returuned back then, + // change the status of whole order and also put back to stock. + if ($isProduct) + { + $orderProductDetail = self::getOrderItemDetail($orderId, $productId); + $prodid = $orderProductDetail[0]->product_id; + + // Changing the status of the order item to Returned + self::updateOrderItemStatus($orderId, $prodid, "RT"); + + // Changing the status of the order to Partially Returned + self::updateOrderStatus($orderId, "PRT"); + } + } + elseif ($newStatus == 'RC') + { + // If any of the item from the order is reclamation back then, + // change the status of whole order and also put back to stock. + if ($isProduct) + { + // Changing the status of the order item to Reclamation + self::updateOrderItemStatus($orderId, $productId, "RC"); + + // Changing the status of the order to Partially Reclamation + self::updateOrderStatus($orderId, "PRC"); + } + } + elseif ($newStatus == 'S') + { + if ($isProduct) + { + // Changing the status of the order item to Reclamation + self::updateOrderItemStatus($orderId, $productId, "S"); + + // Changing the status of the order to Partially Reclamation + self::updateOrderStatus($orderId, "PS"); + } + } + + // Mail to customer of order status change + if ($post['mass_mail_sending'] == 1) + { + self::changeOrderStatusMail($orderId, $newStatus, $customerNote); + } + + self::createBookInvoice($orderId, $newStatus); + + // GENERATE PDF CODE WRITE + return true; + } + + /** + * Get Order Payment Detail + * + * @param int $orderPaymentId Payment order id + * + * @return object Order payment info + * + * @since 2.0.3 + * + * @deprecated 2.0.6 + */ + public static function getOrderPaymentDetail($orderPaymentId = 0) + { + return RedshopEntityOrder_Payment::getInstance($orderPaymentId)->getItem(); + } +} diff --git a/libraries/redshop/helper/payment.php b/libraries/redshop/helper/payment.php new file mode 100644 index 00000000000..4b00c8df30f --- /dev/null +++ b/libraries/redshop/helper/payment.php @@ -0,0 +1,516 @@ +params = new Registry($plugin->params); + }); + } + else + { + $plugins->params = new Registry($plugins->params); + } + + return $plugins; + } + + /** + * Load payment languages + * + * @param boolean $all True for all (discover, enabled, disabled). False for just enabled only. + * + * @return void + * + * @since 2.0.2 + */ + public static function loadLanguages($all = false) + { + // Load payment plugin language file + if ($all) + { + $paymentsLangList = RedshopHelperUtility::getPlugins("redshop_payment"); + } + else + { + $paymentsLangList = RedshopHelperUtility::getPlugins("redshop_payment", 1); + } + + $language = JFactory::getLanguage(); + + for ($index = 0, $ln = count($paymentsLangList); $index < $ln; $index++) + { + $extension = 'plg_redshop_payment_' . $paymentsLangList[$index]->element; + $language->load($extension, JPATH_ADMINISTRATOR, $language->getTag(), true); + $language->load( + $extension, + JPATH_PLUGINS . '/' . $paymentsLangList[$index]->folder . '/' . $paymentsLangList[$index]->element, + $language->getTag(), + true + ); + } + } + + /** + * Method for check if order has this payment is update yet? + * + * @param integer $orderId Order ID + * @param mixed $transactionId Order payment transaction id + * + * @return boolean + * + * @since 2.0.6 + */ + public static function orderPaymentNotYetUpdated($orderId, $transactionId) + { + if (empty($orderId) || empty($transactionId)) + { + return false; + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from($db->qn('#__redshop_order_payment')) + ->where($db->qn('order_id') . ' = ' . (int) $orderId) + ->where($db->qn('order_payment_trans_id') . ' = ' . $db->quote((int) $transactionId)); + + $result = $db->setQuery($query)->loadResult(); + + if (!$result) + { + return true; + } + + return false; + } + + /** + * Replace conditional tag from Redshop payment Discount/charges + * + * @param string $template Template html + * @param integer $amount Amount of cart + * @param integer $cart Is in cart? + * @param string $paymentOprand Payment oprand + * + * @return string + * + * @since 2.0.7 + */ + public static function replaceConditionTag($template = '', $amount = 0, $cart = 0, $paymentOprand = '-') + { + if (strpos($template, '{if payment_discount}') === false || strpos($template, '{payment_discount end if}') === false) + { + return $template; + } + + if ($cart == 1 || $amount == 0) + { + $templateDiscountStart = explode('{if payment_discount}', $template); + $templateDiscountEnd = explode('{payment_discount end if}', $templateDiscountStart[1]); + + return $templateDiscountStart[0] . $templateDiscountEnd[1]; + } + + if ($amount <= 0) + { + $templateStart = explode('{if payment_discount}', $template); + $templateEnd = explode('{payment_discount end if}', $templateStart[1]); + + return $templateStart[0] . $templateEnd[1]; + } + + $template = str_replace("{payment_order_discount}", RedshopHelperProductPrice::formattedPrice($amount), $template); + $payText = ($paymentOprand == '+') ? JText::_('COM_REDSHOP_PAYMENT_CHARGES_LBL') : JText::_('COM_REDSHOP_PAYMENT_DISCOUNT_LBL'); + $template = str_replace("{payment_discount_lbl}", $payText, $template); + $template = str_replace("{payment_discount end if}", '', $template); + $template = str_replace("{if payment_discount}", '', $template); + + return $template; + } + + /** + * List all categories and return HTML format + * + * @param string $name Name of list + * @param integer $productId Only product to show + * @param integer $size Size of dropdown + * @param boolean $multiple Dropdown is multiple or not + * @param integer $width Width in pixel + * + * @return string HTML of dropdown + * + * @since 2.1.0 + * + * @throws Exception + */ + public static function listAll($name, $productId, $size = 1, $multiple = false, $width = 250) + { + $db = JFactory::getDbo(); + $html = ''; + $query = $db->getQuery(true) + ->select($db->qn('payment_id')) + ->from($db->qn('#__redshop_product_payment_xref')); + + if ($productId) + { + $query->where($db->qn('product_id') . ' = ' . $db->q((int) $productId)); + } + + $selectedPayments = $db->setQuery($query)->loadObjectList(); + + if ($selectedPayments) + { + $selectedPayments = array_column($selectedPayments, 'payment_id'); + } + + $multiple = $multiple ? "multiple=\"multiple\"" : ""; + $id = str_replace('[]', '', $name); + $html .= "\n"; + + return $html; + } + + /** + * Get payment method by id product + * + * @param integer $productId Only product to show + * + * @return array + * + * @since 2.1.0 + * + * @throws Exception + */ + public static function getPaymentByIdProduct($productId) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('payment_id')) + ->from($db->qn('#__redshop_product_payment_xref')) + ->where($db->qn('product_id') . ' = ' . $db->q((int) $productId)); + + return $db->setQuery($query)->loadColumn(); + } + + /** + * List payment into dropdown + * + * @param array $selectedPayments Only show selected payments + * @param string $html Before HTML + * + * @return string HTML of + * + * @since 2.1.0 + * + * @throws Exception + */ + public static function listTree($selectedPayments = array(), $html = '') + { + self::loadLanguages(); + + $paymentMethods = self::info(); + + if (empty($paymentMethods)) + { + return $html; + } + + $userBrowser = new Parser($_SERVER['HTTP_USER_AGENT']); + $isMsIE = $userBrowser->browser->isFamily('Internet Explorer'); + + foreach ($paymentMethods as $p => $oneMethod) + { + $paymentPath = JPATH_SITE . '/plugins/redshop_payment/' . $oneMethod->name . '/' . $oneMethod->name . '.php'; + + include_once $paymentPath; + + $value = $oneMethod->name; + $disabled = ''; + $selected = ''; + + if (in_array($oneMethod->name, $selectedPayments)) + { + $selected = "selected=\"selected\""; + } + + if (in_array($oneMethod->id, $selectedPayments)) + { + $disabled = 'disabled="disabled"'; + } + + if ($disabled != '' && $isMsIE) + { + // IE7 suffers from a bug, which makes disabled option fields selectable + $html .= ""; + } + else + { + $html .= ""; + } + } + + return $html; + } + /** + * Get payment method in Checkout, + * + * @param array $paymentMethods Array PaymentMethods + * + * @return array Common PaymentMethods + * + * @since 2.1.0 + */ + public static function getPaymentMethodInCheckOut($paymentMethods=array()) + { + $currentPaymentMethods = array(); + + if (!empty($paymentMethods)) + { + foreach ($paymentMethods as $p => $oneMethod) + { + $currentPaymentMethods[] = $oneMethod->name; + } + } + + $cart = RedshopHelperCartSession::getCart(); + + $idx = 0; + + if (isset($cart['idx'])) + { + $idx = $cart['idx']; + } + + $db = JFactory::getDbo(); + + $paymentMethods = array(); + $flag = true; + $commonPaymentMethod = $currentPaymentMethods; + + for ($i = 0; $i < $idx; $i++) + { + $productId = $cart[$i]['product_id']; + + $query = $db->getQuery(true) + ->select($db->qn('a.payment_id')) + ->from($db->qn('#__redshop_product_payment_xref', 'a')) + ->join('INNER', $db->qn('#__redshop_product', 'b') . ' ON (' . $db->qn('a.product_id') . ' = ' . $db->qn('b.product_id') . ')') + ->where($db->qn('b.use_individual_payment_method') . ' = 1'); + + if ($productId) + { + $query->where($db->qn('a.product_id') . ' = ' . $db->q((int) $productId)); + } + + $db->setQuery($query); + $payments = $db->loadObjectList(); + + if ($payments) + { + $payments = array_column($payments, 'payment_id'); + } + else + { + $payments = $currentPaymentMethods; + } + + if ($idx == 1) + { + return $payments; + } + + $paymentMethods[] = array('product_id' => $productId, 'payments' => $payments); + + if ($i > 0 && $flag) + { + $commonPaymentMethod = array_intersect($paymentMethods[$i - 1]['payments'], $paymentMethods[$i]['payments']); + + if (!empty($commonPaymentMethod)) + { + $flag = false; + } + } + } + + // Product in cart use these payment method + return $commonPaymentMethod; + } + /** + * List common payment methods of products cart in checkout, + * + * @param array $paymentMethods All active payment methods + * + * @return string HTML of
    + * + * @since 2.1.0 + */ + public static function displayPaymentMethodInCheckOut($paymentMethods=array()) + { + $currentPaymentMethods = array(); + + if (count($paymentMethods) > 0) + { + foreach ($paymentMethods as $p => $oneMethod) + { + $currentPaymentMethods[] = $oneMethod->name; + } + } + + $cart = RedshopHelperCartSession::getCart(); + $db = JFactory::getDbo(); + $html = ''; + + foreach ($cart as $index => $product) + { + if (!is_array($product) || empty($product)) + { + continue; + } + + $productId = $product['product_id']; + + $query = $db->getQuery(true); + $query + ->select($db->qn('a.payment_id')) + ->from($db->qn('#__redshop_product_payment_xref', 'a')) + ->join('INNER', $db->qn('#__redshop_product', 'b') . ' ON (' . $db->qn('a.product_id') . ' = ' . $db->qn('b.product_id') . ')') + ->where($db->qn('b.use_individual_payment_method') . ' = 1'); + + if ($productId) + { + $query->where($db->qn('a.product_id') . ' = ' . $db->q((int) $productId)); + } + + $db->setQuery($query); + $payments = $db->loadObjectList(); + + if ($payments) + { + $payments = array_column($payments, 'payment_id'); + } + else + { + $payments = $currentPaymentMethods; + } + + $product = RedshopHelperProduct::getProductById($productId); + $html .= '
    '; + $tmp = ''; + + foreach ($payments as $p) + { + $tmp .= JText::_('PLG_' . strtoupper($p)) . ','; + } + + $tmp = rtrim($tmp, ","); + $html .= $tmp . '
    '; + } + + return $html; + } + + /** + * Calculate payment Discount/charges + * + * @param float $total Total + * @param object $payment Payment information + * @param float $finalAmount Final amount + * + * @return array + * + * @since 2.1.0 + */ + public static function calculate($total, $payment, $finalAmount) + { + $discount = 0; + + if ($payment->payment_discount_is_percent == 0) + { + $discount = $payment->payment_price; + } + elseif ($payment->payment_price > 0) + { + $discount = $total * $payment->payment_price / 100; + } + + $discount = $discount ? round($discount, 2) : 0; + + if (!$discount) + { + return array($finalAmount, 0); + } + + $discount = $total < $discount ? $total : $discount; + $finalAmount = $payment->payment_oprand == '+' ? $finalAmount + $discount : $finalAmount - $discount; + + return array($finalAmount, $discount); + } +} diff --git a/libraries/redshop/helper/pdf.php b/libraries/redshop/helper/pdf.php new file mode 100644 index 00000000000..0eb7b24773a --- /dev/null +++ b/libraries/redshop/helper/pdf.php @@ -0,0 +1,113 @@ + + + + + +
    {order_information_lbl}{print}
    {order_id_lbl} : {order_id}
    {order_number_lbl} : {order_number}
    {order_date_lbl} : {order_date}
    {order_status_lbl} : {order_status}
    {shipping_method_lbl} : {shipping_method} : {shipping_rate_name}
    {payment_lbl} : {payment_method}
    + +
    {billing_address_information_lbl}
    {billing_address}
    + + +
    {shipping_address_info_lbl}
    {shipping_address}
    + +
    {order_detail_lbl}
    + + {product_loop_start} + + + {product_loop_end}
    {product_name_lbl}{note_lbl}{price_lbl}{quantity_lbl}Total Price

    {product_name}
    {product_attribute}{product_accessory}{product_userfields}

    {product_wrapper}{product_thumb_image}{product_price}{product_quantity}{product_total_price}
    + + {if vat} + {vat end if}{if discount} + {discount end if} +
    {order_subtotal_lbl} : {order_subtotal}
    {vat_lbl} : {order_tax}
    {discount_lbl} : {order_discount}
    + {shipping_lbl} : {order_shipping}

    {total_lbl} : + {order_total}


    +
    '; + + $orderPrintTemplate = RedshopHelperTemplate::getTemplate('order_print'); + + if (!empty($orderPrintTemplate) > 0 && !empty($orderPrintTemplate[0]->template_desc)) + { + $message = $orderPrintTemplate[0]->template_desc; + } + else + { + $message = $defaultTemplate; + } + + JPluginHelper::importPlugin('redshop_pdf'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + + $result = $dispatcher->trigger('onRedshopOrderCreateMultiInvoicePdf', array($orderIds, $message)); + + if (!empty($result)) + { + return $result[0]; + } + + return ''; + } + + /** + * Method for check if there are any available PDF plugin support. + * + * @return boolean True if has available plugins. False other wise. + * + * @since 2.0.3 + */ + public static function isAvailablePdfPlugins() + { + $pdfPlugins = JPluginHelper::getPlugin('redshop_pdf'); + + return empty($pdfPlugins) ? false : true; + } +} diff --git a/libraries/redshop/helper/pdf_merge.php b/libraries/redshop/helper/pdf_merge.php new file mode 100644 index 00000000000..92f9ec4aebe --- /dev/null +++ b/libraries/redshop/helper/pdf_merge.php @@ -0,0 +1,200 @@ +rewritePages($pages); + } + + $this->files[] = array($filePath, $pages); + + return $this; + } + + /** + * Merges your provided PDFs and outputs to specified location. + * + * @param string $outputMode Output mode + * @param string $outputPath Output path + * + * @return boolean + * + * @throws Exception + */ + public function merge($outputMode = 'browser', $outputPath = 'newfile.pdf') + { + if (!isset($this->files) || !is_array($this->files)) + { + throw new exception("No PDFs to merge."); + } + + $fpdi = new FPDI; + + // Merger operations + foreach ($this->files as $file) + { + $fileName = $file[0]; + $pages = $file[1]; + $count = $fpdi->setSourceFile($fileName); + + // Add the pages + if ($pages == 'all') + { + for ($i = 1; $i <= $count; $i++) + { + $template = $fpdi->importPage($i); + $size = $fpdi->getTemplateSize($template); + + $fpdi->AddPage('P', array($size['w'], $size['h'])); + $fpdi->useTemplate($template); + } + } + else + { + foreach ($pages as $page) + { + if (!$template = $fpdi->importPage($page)) + { + throw new exception("Could not load page '$page' in PDF '$fileName'. Check that the page exists."); + } + + $size = $fpdi->getTemplateSize($template); + + $fpdi->AddPage('P', array($size['w'], $size['h'])); + $fpdi->useTemplate($template); + } + } + } + + // Output operations + $mode = $this->switchMode($outputMode); + + return $fpdi->Output($outputPath, $mode); + } + + /** + * FPDI uses single characters for specifying the output location. Change our more descriptive string into proper format. + * + * @param string $mode Mode + * + * @return string + */ + private function switchMode($mode) + { + switch (strtolower($mode)) + { + case 'download': + return 'D'; + break; + + case 'browser': + return 'I'; + break; + + case 'file': + return 'F'; + break; + + case 'string': + return 'S'; + break; + + default: + return 'I'; + break; + } + } + + /** + * Takes our provided pages in the form of 1,3,4,16-50 and creates an array of all pages + * + * @param string $pages Page + * + * @return mixed + * + * @throws Exception + */ + private function rewritePages($pages) + { + $pages = str_replace(' ', '', $pages); + $parts = explode(',', $pages); + $newPages = array(); + + if (empty($parts)) + { + return $newPages; + } + + // Parse hyphens + foreach ($parts as $part) + { + $ind = explode('-', $part); + + if (count($ind) != 2) + { + $newPages[] = (int) $ind[0]; + + continue; + } + + // Start page + $x = $ind[0]; + + // End page + $y = $ind[1]; + + if ($x > $y) + { + throw new exception("Starting page, '$x' is greater than ending page '$y'."); + } + + // Add middle pages + while ($x <= $y) + { + $newPages[] = (int) $x; + $x++; + } + } + + return $newPages; + } +} diff --git a/libraries/redshop/helper/product.php b/libraries/redshop/helper/product.php new file mode 100644 index 00000000000..654e0874d2c --- /dev/null +++ b/libraries/redshop/helper/product.php @@ -0,0 +1,1289 @@ +select( + array( + 'p.product_name as text', + 'p.product_id as value' + ) + ); + + $db->setQuery($query); + + static::$allProducts = $db->loadObjectList('product_id'); + } + + return static::$allProducts; + } + + /** + * Get product information base on list of Ids + * + * @param array $productIds Product ids + * @param int $userId User id + * @param boolean $setRelated Is need to set related or not + * + * @return array + * @throws Exception + * + * @since 2.1.0 + */ + public static function getProductsByIds($productIds = array(), $userId = 0, $setRelated = true) + { + if (!$userId) + { + $user = JFactory::getUser(); + $userId = $user->id; + } + + $productIds = \Joomla\Utilities\ArrayHelper::toInteger($productIds); + + if (empty($productIds)) + { + return array(); + } + + $results = array(); + $newProductIds = array(); + + foreach ($productIds as $productId) + { + $key = $productId . '.' . $userId; + + // Load from static cache if already exist. + if (array_key_exists($key, static::$products)) + { + $results[] = static::$products[$key]; + + if ($setRelated) + { + self::setProductRelates(array($key => static::$products[$key]), $userId); + } + + continue; + } + + // Check if data is already loaded while getting list + if (array_key_exists($productId, static::$allProducts)) + { + static::$products[$key] = static::$allProducts[$productId]; + + if ($setRelated) + { + self::setProductRelates(array($key => static::$products[$key]), $userId); + } + + continue; + } + + $newProductIds[] = $productId; + } + + if (empty($newProductIds)) + { + return $results; + } + + // Otherwise load product info + $db = JFactory::getDbo(); + $query = self::getMainProductQuery(false, $userId); + + // Select product + $query->where($db->qn('p.product_id') . ' IN (' . implode(',', $productIds) . ')'); + + $items = (array) $db->setQuery($query)->loadObjectList(); + + if (empty($items)) + { + return $results; + } + + foreach ($items as $item) + { + $key = $item->product_id . '.' . $userId; + static::$products[$key] = $item; + $results[] = $item; + + if ($setRelated === true) + { + self::setProductRelates(array($key => static::$products[$key]), $userId); + } + } + + return $results; + } + + /** + * Get product information + * + * @param integer $productId Product id + * @param integer $userId User id + * @param boolean $setRelated Is need to set related or not + * + * @return mixed + * @throws Exception + */ + public static function getProductById($productId, $userId = 0, $setRelated = true) + { + if (!$userId) + { + $user = JFactory::getUser(); + $userId = $user->id; + } + + $key = $productId . '.' . $userId; + + if (!array_key_exists($key, static::$products)) + { + // Check if data is already loaded while getting list + if (array_key_exists($productId, static::$allProducts)) + { + static::$products[$key] = static::$allProducts[$productId]; + } + // Otherwise load product info + else + { + $db = JFactory::getDbo(); + $query = self::getMainProductQuery(false, $userId); + + // Select product + $query->where($db->qn('p.product_id') . ' = ' . (int) $productId); + + $db->setQuery($query); + static::$products[$key] = $db->loadObject(); + } + + if ($setRelated === true && static::$products[$key]) + { + self::setProductRelates(array($key => static::$products[$key]), $userId); + } + } + + return static::$products[$key]; + } + + /** + * Get Main Product Query + * + * @param bool|JDatabaseQuery $query Get query or false + * @param int $userId User id + * + * @return JDatabaseQuery + */ + public static function getMainProductQuery($query = false, $userId = 0) + { + $shopperGroupId = RedshopHelperUser::getShopperGroup($userId); + $db = JFactory::getDbo(); + + if (!$query) + { + $query = $db->getQuery(true); + } + + $query->select(array('p.*', 'p.product_id')) + ->from($db->qn('#__redshop_product', 'p')); + + // Require condition + $query->group($db->qn('p.product_id')); + + // Select price + $query->select( + array( + 'pp.price_id', $db->qn('pp.product_price', 'price_product_price'), + $db->qn('pp.product_currency', 'price_product_currency'), $db->qn('pp.discount_price', 'price_discount_price'), + $db->qn('pp.discount_start_date', 'price_discount_start_date'), $db->qn('pp.discount_end_date', 'price_discount_end_date') + ) + ) + ->leftJoin( + $db->qn('#__redshop_product_price', 'pp') + . ' ON p.product_id = pp.product_id AND ((pp.price_quantity_start <= 1 AND pp.price_quantity_end >= 1)' + . ' OR (pp.price_quantity_start = 0 AND pp.price_quantity_end = 0)) AND pp.shopper_group_id = ' . (int) $shopperGroupId + ) + ->order('pp.price_quantity_start ASC'); + + // Select category + $query->select(array('pc.category_id')) + ->leftJoin($db->qn('#__redshop_product_category_xref', 'pc') . ' ON pc.product_id = p.product_id'); + + // Getting cat_in_sefurl as main category id if it available + $query->leftJoin( + $db->qn('#__redshop_product_category_xref', 'pc3') . ' ON pc3.product_id = p.product_id AND pc3.category_id = p.cat_in_sefurl' + ) + ->leftJoin($db->qn('#__redshop_category', 'c3') . ' ON pc3.category_id = c3.id AND c3.published = 1'); + + $subQuery = $db->getQuery(true) + ->select('GROUP_CONCAT(DISTINCT c2.id ORDER BY c2.id ASC SEPARATOR ' . $db->q(',') . ')') + ->from($db->qn('#__redshop_category', 'c2')) + ->leftJoin($db->qn('#__redshop_product_category_xref', 'pc2') . ' ON c2.id = pc2.category_id') + ->where('p.product_id = pc2.product_id') + ->where('((p.cat_in_sefurl != ' . $db->q('') . ' AND p.cat_in_sefurl != pc2.category_id) OR p.cat_in_sefurl = ' . $db->q('') . ')') + ->where('c2.published = 1'); + + // In first position set main category id + $query->select('CONCAT_WS(' . $db->q(',') . ', c3.id, (' . $subQuery . ')) AS categories'); + + // Select media + $query->select(array('media.media_alternate_text', 'media.media_id')) + ->leftJoin( + $db->qn('#__redshop_media', 'media') + . ' ON media.section_id = p.product_id AND media.media_section = ' . $db->q('product') + . ' AND media.media_type = ' . $db->q('images') . ' AND media.media_name = p.product_full_image' + ); + + // Select ratings + $subQuery = $db->getQuery(true) + ->select('COUNT(pr1.rating_id)') + ->from($db->qn('#__redshop_product_rating', 'pr1')) + ->where('pr1.product_id = p.product_id') + ->where('pr1.published = 1'); + + $query->select('(' . $subQuery . ') AS count_rating'); + + $subQuery = $db->getQuery(true) + ->select('SUM(pr2.user_rating)') + ->from($db->qn('#__redshop_product_rating', 'pr2')) + ->where('pr2.product_id = p.product_id') + ->where('pr2.published = 1'); + + $query->select('(' . $subQuery . ') AS sum_rating'); + + // Count Accessories + $subQuery = $db->getQuery(true) + ->select('COUNT(pa.accessory_id)') + ->from($db->qn('#__redshop_product_accessory', 'pa')) + ->leftJoin($db->qn('#__redshop_product', 'parent_product') . ' ON parent_product.product_id = pa.child_product_id') + ->where('pa.product_id = p.product_id') + ->where('parent_product.published = 1'); + + $query->select('(' . $subQuery . ') AS total_accessories'); + + // Count child products + $subQuery = $db->getQuery(true) + ->select('COUNT(child.product_id) AS count_child_products, child.product_parent_id') + ->from($db->qn('#__redshop_product', 'child')) + ->where('child.product_parent_id > 0') + ->where('child.published = 1') + ->group('child.product_parent_id'); + + $query->select('child_product_table.count_child_products') + ->leftJoin('(' . $subQuery . ') AS child_product_table ON child_product_table.product_parent_id = p.product_id'); + + // Sum quantity + if (Redshop::getConfig()->get('USE_STOCKROOM') == 1) + { + $subQuery = $db->getQuery(true) + ->select('SUM(psx.quantity)') + ->from($db->qn('#__redshop_product_stockroom_xref', 'psx')) + ->where('psx.product_id = p.product_id') + ->where('psx.quantity >= 0') + ->where('psx.stockroom_id > 0'); + + $query->select('(' . $subQuery . ') AS sum_quanity'); + } + + return $query; + } + + /** + * Set product relates + * + * @param array $products Products + * @param int $userId User id + * + * @return void + */ + public static function setProductRelates($products, $userId = 0) + { + if (empty($products) || !is_array($products)) + { + return; + } + + $userId = !$userId ? JFactory::getUser()->id : $userId; + + $getAttributeKeys = array(); + $getExtraFieldKeys = array(); + + foreach ($products as $product) + { + if (!isset($product->product_id)) + { + continue; + } + + $key = $product->product_id . '.' . $userId; + + if (!array_key_exists($key, static::$products)) + { + continue; + } + + static::$products[$product->product_id . '.' . $userId]->categories = explode(',', $product->categories); + + // If this product not has attributes yet. Put this in array of product which need to get attributes. + if (!isset(static::$products[$key]->attributes)) + { + static::$products[$key]->attributes = array(); + $getAttributeKeys[] = $product->product_id; + } + + // If this product not has extra fields yet. Put this in array of product which need to get extra fields. + if (!isset(static::$products[$key]->extraFields)) + { + static::$products[$key]->extraFields = array(); + $getExtraFieldKeys[] = $product->product_id; + } + } + + self::setProductAttributes($getAttributeKeys, $userId); + self::setProductExtraFields($getExtraFieldKeys, $userId); + } + + /** + * Set product array + * + * @param array $products Array product/s values + * + * @return void + */ + public static function setProduct($products) + { + static::$products = $products + static::$products; + self::setProductRelates($products); + } + + /** + * Replace Accessory Data + * + * @param int $productId Product id + * @param array $accessory Accessory list + * @param int $userId User id + * @param string $uniqueId Unique id + * + * @return mixed + * + * @since 2.0.3 + */ + public static function replaceAccessoryData($productId = 0, $accessory = array(), $userId = 0, $uniqueId = "") + { + $totalAccessory = count($accessory); + $accessoryList = ""; + + if (!$totalAccessory) + { + return ''; + } + + $accessoryList .= "" . JText::_('COM_REDSHOP_ACCESSORY_PRODUCT') . ""; + + for ($a = 0, $an = count($accessory); $a < $an; $a++) + { + $acId = $accessory[$a]->child_product_id; + $cpData = Redshop::product((int) $acId); + + $accessoryName = RedshopHelperUtility::maxChars( + $accessory[$a]->product_name, + Redshop::getConfig()->getInt('ACCESSORY_PRODUCT_TITLE_MAX_CHARS'), + Redshop::getConfig()->getString('ACCESSORY_PRODUCT_TITLE_END_SUFFIX') + ); + + // Get accessory final price with VAT rules + $accessoryPriceList = \Redshop\Product\Accessory::getPrice( + $productId, $accessory[$a]->newaccessory_price, $accessory[$a]->accessory_main_price + ); + + $accessoryPrice = $accessoryPriceList[0]; + + $accessoryPriceWithoutvat = \Redshop\Product\Accessory::getPrice( + $productId, $accessory[$a]->newaccessory_price, + $accessory[$a]->accessory_main_price, 1 + ); + $accessoryPriceWithoutVat = $accessoryPriceWithoutvat[0]; + $accessoryPriceVat = $accessoryPrice - $accessoryPriceWithoutVat; + + $commonid = $productId . '_' . $accessory[$a]->accessory_id . $uniqueId; + + // Accessory attribute Start + $attributesSet = array(); + + if ($cpData->attribute_set_id > 0) + { + $attributesSet = RedshopHelperProduct_Attribute::getProductAttribute(0, $cpData->attribute_set_id); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($acId); + $attributes = array_merge($attributes, $attributesSet); + + $accessoryCheckbox = ""; + + $accessoryList .= "" . $accessoryCheckbox . " " . $accessoryName . ' : ' + . RedshopHelperProductPrice::formattedPrice($accessoryPrice) . ""; + + $accessoryList .= RedshopHelperProductTag::replaceAttributeData( + $productId, $accessory[$a]->accessory_id, $attributes, $userId, $uniqueId + ); + } + + return $accessoryList; + } + + /** + * Replace Attribute Data + * + * @param int $productId Product id + * @param int $accessoryId Accessory id + * @param array $attributes Attribute list + * @param int $userId User id + * @param string $uniqueId Unique id + * + * @return mixed + * + * @since 2.0.3 + * + * @deprecated 2.1.0 + */ + public static function replaceAttributeData($productId = 0, $accessoryId = 0, $attributes = array(), $userId = 0, $uniqueId = "") + { + return RedshopHelperProductTag::replaceAttributeData($productId, $accessoryId, $attributes, $userId, $uniqueId); + } + + /** + * Replace Accessory Data + * + * @param int $productId Product id + * @param int $userId User id + * @param string $uniqueId Unique id + * + * @return mixed + * + * @since 2.0.3 + */ + public static function replaceWrapperData($productId = 0, $userId = 0, $uniqueId = "") + { + $productHelper = productHelper::getInstance(); + $wrapperList = ''; + + $wrapper = $productHelper->getWrapper($productId, 0, 1); + + if (empty($wrapper)) + { + return ''; + } + + $wArray = array(); + $wArray[0] = new stdClass; + $wArray[0]->wrapper_id = 0; + $wArray[0]->wrapper_name = JText::_('COM_REDSHOP_SELECT'); + $commonId = $productId . $uniqueId; + + for ($i = 0, $in = count($wrapper); $i < $in; $i++) + { + $wrapperVat = 0; + + if ($wrapper[$i]->wrapper_price > 0) + { + $wrapperVat = self::getProductTax($productId, $wrapper[$i]->wrapper_price, $userId); + } + + $wrapper[$i]->wrapper_price += $wrapperVat; + $wrapper[$i]->wrapper_name = $wrapper [$i]->wrapper_name . " (" + . RedshopHelperProductPrice::formattedPrice($wrapper[$i]->wrapper_price) . ")"; + + $wrapperList .= ""; + $wrapperList .= ""; + } + + $wrapper = array_merge($wArray, $wrapper); + + $lists['wrapper_id'] = JHtml::_( + 'select.genericlist', + $wrapper, 'wrapper_id_' . $commonId . '[]', + 'id="wrapper_id_' . $commonId . '" class="inputbox" onchange="calculateOfflineTotalPrice(\'' . $uniqueId . '\');" ', + 'wrapper_id', 'wrapper_name', + 0 + ); + + $wrapperList .= "" . JText::_('COM_REDSHOP_WRAPPER') . " : " . $lists ['wrapper_id'] . ""; + + return $wrapperList; + } + + /** + * Get product item info + * + * @param integer $productId Product id + * @param integer $quantity Product quantity + * @param string $uniqueId Unique id + * @param integer $userId User id + * @param integer $newProductPrice New product price + * + * @return mixed + * + * @since 2.0.3 + * + * @throws Exception + */ + public static function getProductItemInfo($productId = 0, $quantity = 1, $uniqueId = "", $userId = 0, $newProductPrice = 0) + { + $wrapperList = ""; + $accessoryList = ""; + $attributeList = ""; + $productUserField = ""; + $productPriceExclVat = 0; + $productTax = 0; + + if ($productId) + { + $productInfo = Redshop::product((int) $productId); + + if ($newProductPrice != 0) + { + $productPriceExclVat = $newProductPrice; + $productTax = self::getProductTax($productId, $newProductPrice, $userId); + } + + else + { + $productArr = RedshopHelperProductPrice::getNetPrice($productId, $userId, $quantity); + $productPriceExclVat = $productArr['productPrice']; + $productTax = $productArr['productVat']; + + // Attribute start + $attributesSet = array(); + + if ($productInfo->attribute_set_id > 0) + { + $attributesSet = RedshopHelperProduct_Attribute::getProductAttribute(0, $productInfo->attribute_set_id, 0, 1); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($productId); + $attributes = array_merge($attributes, $attributesSet); + $attributeList = RedshopHelperProductTag::replaceAttributeData($productId, 0, $attributes, $userId, $uniqueId); + + // Accessory start + $accessory = RedshopHelperAccessory::getProductAccessories(0, $productId); + $accessoryList = self::replaceAccessoryData($productId, $accessory, $userId, $uniqueId); + + // Wrapper selection box generate + $wrapperList = self::replaceWrapperData($productId, $userId, $uniqueId); + $productUserField = self::replaceUserField($productId, $productInfo->product_template, $uniqueId); + } + } + + $productPrice = $productPriceExclVat + $productTax; + $total_price = $productPrice * $quantity; + $totalTax = $productTax * $quantity; + + $displayRespoce = ""; + $displayRespoce .= "
    " . $productPriceExclVat . "
    "; + $displayRespoce .= "
    " . $productTax . "
    "; + $displayRespoce .= "
    " . $productPrice . "
    "; + $displayRespoce .= "
    " . $total_price . "
    "; + $displayRespoce .= "
    " . $totalTax . "
    "; + $displayRespoce .= "
    " . $attributeList . "
    "; + $displayRespoce .= "
    " . $productUserField . "
    "; + $displayRespoce .= "
    " . $accessoryList . "
    "; + $displayRespoce .= "
    " . $wrapperList . "
    "; + + return $displayRespoce; + } + + /** + * Replace Shipping method + * + * @param array $data Data + * @param int $shippUsersInfoId Shipping User info id + * @param int $shippingRateId Shipping rate id + * + * @return mixed + * + * @since 2.0.3 + */ + public static function replaceShippingMethod($data = array(), $shippUsersInfoId = 0, $shippingRateId = 0) + { + if (!$shippUsersInfoId) + { + return '
    ' . JText::_('COM_REDSHOP_FILL_SHIPPING_ADDRESS') . '
    '; + } + + $language = JFactory::getLanguage(); + $shippingMethod = RedshopHelperOrder::getShippingMethodInfo(); + + JPluginHelper::importPlugin('redshop_shipping'); + $dispatcher = RedshopHelperUtility::getDispatcher(); + $shippingRate = $dispatcher->trigger('onListRates', array(&$data)); + + $rateArr = array(); + $r = 0; + + for ($s = 0, $sn = count($shippingMethod); $s < $sn; $s++) + { + if (isset($shippingRate[$s]) === false) + { + continue; + } + + $rate = $shippingRate[$s]; + $extension = 'plg_redshop_shipping_' . strtolower($shippingMethod[$s]->element); + $language->load($extension, JPATH_ADMINISTRATOR); + $rs = $shippingMethod[$s]; + + if (count($rate) > 0) + { + for ($i = 0, $in = count($rate); $i < $in; $i++) + { + $displayrate = ($rate[$i]->rate > 0) ? " (" . RedshopHelperProductPrice::formattedPrice($rate[$i]->rate) . " )" : ""; + $rateArr[$r] = new stdClass; + $rateArr[$r]->text = JText::_($rs->name) . " - " . $rate[$i]->text . $displayrate; + $rateArr[$r]->value = $rate[$i]->value; + $r++; + } + } + } + + if (empty($rateArr)) + { + return JText::_('COM_REDSHOP_NO_SHIPPING_METHODS_TO_DISPLAY'); + } + + if (!$shippingRateId) + { + $shippingRateId = $rateArr[0]->value; + } + + return JHtml::_( + 'select.genericlist', + $rateArr, 'shipping_rate_id', + 'class="inputbox" onchange="calculateOfflineShipping();" ', + 'value', + 'text', + $shippingRateId + ); + } + + /** + * Redesign product item + * + * @param array $post Data + * + * @return array + * + * @since 2.0.3 + * + * @deprecated 2.1.0 + */ + public static function redesignProductItem($post = array()) + { + return Redshop\Order\Helper::redesignProductItem($post); + } + + /** + * Replace User Field + * + * @param int $productId Product id + * @param int $templateId Template id + * @param string $uniqueId Unique id + * + * @return mixed + * + * @since 2.0.3 + * + * @throws Exception + */ + public static function replaceUserField($productId = 0, $templateId = 0, $uniqueId = "") + { + $productHelper = productHelper::getInstance(); + $templateDesc = RedshopHelperTemplate::getTemplate("product", $templateId); + $returnArr = $productHelper->getProductUserfieldFromTemplate($templateDesc[0]->template_desc); + $commonId = $productId . $uniqueId; + + if (empty($returnArr[1])) + { + return ''; + } + + $productUserFields = ""; + + foreach ($returnArr[1] as $index => $return) + { + $resultArr = RedshopHelperExtrafields::listAllUserFields( + $return, RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, "", $commonId + ); + $hiddenArr = RedshopHelperExtrafields::listAllUserFields( + $return, RedshopHelperExtrafields::SECTION_PRODUCT_USERFIELD, "hidden", $commonId + ); + + if (!empty($resultArr[0])) + { + $productUserFields .= ""; + } + } + + return $productUserFields . "
    " . $resultArr[0] . "" . $resultArr[1] . $hiddenArr[1] . "
    "; + } + + /** + * Insert Product user field + * + * @param int $fieldId Field id + * @param int $orderItemId Order item id + * @param int $sectionId Section id + * @param string $value Unique id + * + * @return boolean + * + * @since 2.0.3 + */ + public static function insertProductUserField($fieldId = 0, $orderItemId = 0, $sectionId = 12, $value = '') + { + $db = JFactory::getDbo(); + $columns = array('fieldid', 'data_txt', 'itemid', 'section'); + $values = array($db->q((int) $fieldId), $db->q($value), $db->q((int) $orderItemId), $db->q((int) $sectionId)); + + $query = $db->getQuery(true) + ->insert($db->qn('#__redshop_fields_data')) + ->columns($db->qn($columns)) + ->values(implode(',', $values)); + + return $db->setQuery($query)->execute(); + } + + /** + * Get product by sort list + * + * @return array + * + * @since 2.0.3 + */ + public static function getProductsSortByList() + { + $productData = array(); + $productData[0] = new stdClass; + $productData[0]->value = "0"; + $productData[0]->text = JText::_('COM_REDSHOP_SELECT_PUBLISHED'); + + $productData[1] = new stdClass; + $productData[1]->value = "p.published"; + $productData[1]->text = JText::_('COM_REDSHOP_PRODUCT_PUBLISHED'); + + $productData[2] = new stdClass; + $productData[2]->value = "p.unpublished"; + $productData[2]->text = JText::_('COM_REDSHOP_PRODUCT_UNPUBLISHED'); + + $productData[3] = new stdClass; + $productData[3]->value = "p.product_on_sale"; + $productData[3]->text = JText::_('COM_REDSHOP_PRODUCT_ON_SALE'); + + $productData[4] = new stdClass; + $productData[4]->value = "p.product_not_on_sale"; + $productData[4]->text = JText::_('COM_REDSHOP_PRODUCT_NOT_ON_SALE'); + + $productData[5] = new stdClass; + $productData[5]->value = "p.product_special"; + $productData[5]->text = JText::_('COM_REDSHOP_PRODUCT_SPECIAL'); + + $productData[6] = new stdClass; + $productData[6]->value = "p.expired"; + $productData[6]->text = JText::_('COM_REDSHOP_PRODUCT_EXPIRED'); + + $productData[7] = new stdClass; + $productData[7]->value = "p.not_for_sale"; + $productData[7]->text = JText::_('COM_REDSHOP_PRODUCT_NOT_FOR_SALE'); + + $productData[8] = new stdClass; + $productData[8]->value = "p.sold_out"; + $productData[8]->text = JText::_('COM_REDSHOP_PRODUCT_SOLD_OUT'); + + return $productData; + } + + /** + * Method for get all payment method of this product set in backend + * + * @param integer $productId If exist. + * + * @return array List of payment method + * + * @since 2.1.0 + */ + public static function getAllAvailableProductPayment($productId = 0) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('payment_id')) + ->from($db->qn('#__redshop_product_payment_xref')); + + if ($productId) + { + $query->where($db->qn('product_id') . ' = ' . $db->quote($productId)); + } + + // Set the query and load the result. + return $db->setQuery($query)->loadColumn(); + } + + /** + * Method for get all product number exist in system + * + * @param int $productId If exist. Exclude product number from this product Id from list + * + * @return array List of product number + * + * @since 2.0.4 + */ + public static function getAllAvailableProductNumber($productId = 0) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('product_number')) + ->from($db->qn('#__redshop_product')); + + if ($productId) + { + $query->where($db->qn('product_id') . ' <> ' . $db->quote($productId)); + } + + // Set the query and load the result. + return $db->setQuery($query)->loadColumn(); + } + + /** + * Get Layout product quantity price + * + * @param int $productId Product Id + * @param int $userId User Id + * + * @return mixed Redshop Layout + * + * @since 2.0.5 + */ + public static function getProductQuantityPrice($productId, $userId) + { + $db = JFactory::getDbo(); + $userArr = JFactory::getSession()->get('rs_user'); + + if (empty($userArr)) + { + RedshopHelperUser::createUserSession($userId); + } + + $shopperGroupId = RedshopHelperUser::getShopperGroup($userId); + + if ($userId) + { + $query = $db->getQuery(true) + ->select('p.*') + ->from($db->qn('#__redshop_users_info', 'u')) + ->leftJoin($db->qn('#__redshop_product_price', 'p') . ' ON ' . $db->qn('u.shopper_group_id') . ' = ' . $db->qn('p.shopper_group_id')) + ->where($db->qn('p.product_id') . ' = ' . $db->q((int) $productId)) + ->where($db->qn('u.user_id') . ' = ' . $db->q((int) $userId)) + ->where($db->qn('u.address_type') . ' = ' . $db->q('BT')) + ->order($db->qn('p.price_quantity_start') . ' ASC'); + } + else + { + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_product_price')) + ->where($db->qn('product_id') . ' = ' . $db->q((int) $productId)) + ->where($db->qn('shopper_group_id') . ' = ' . $db->q((int) $shopperGroupId)) + ->order($db->qn('price_quantity_start') . ' ASC'); + } + + $result = $db->setQuery($query)->loadObjectList(); + + if (empty($result)) + { + return ''; + } + + return RedshopLayoutHelper::render( + 'product.product_price_table', + array( + 'result' => $result, + 'productId' => $productId, + 'userId' => $userId + ), + '', + array( + 'component' => 'com_redshop' + ) + ); + } + + /** + * Method for get product tax + * + * @param integer $productId Product Id + * @param float $productPrice Product price + * @param integer $userId User ID + * @param integer $taxExempt Tax exempt + * + * @return integer + * + * @since 2.0.6 + */ + public static function getProductTax($productId = 0, $productPrice = 0.0, $userId = 0, $taxExempt = 0) + { + $redshopUser = JFactory::getSession()->get('rs_user'); + $app = JFactory::getApplication(); + + if ($userId == 0 && !$app->isClient('administrator')) + { + $user = JFactory::getUser(); + $userId = $user->id; + } + else + { + $userId = $app->input->getInt('user_id', 0); + } + + $productInfor = $productId != 0 ? self::getProductById($productId) : array(); + $productTax = 0; + $redshopUser = empty($redshopUser) ? array('rs_is_user_login' => 0) : $redshopUser; + + if ($redshopUser['rs_is_user_login'] == 0 && $userId != 0) + { + RedshopHelperUser::createUserSession($userId); + } + + $vatRateData = RedshopHelperTax::getVatRates($productId, $userId); + $taxRate = !empty($vatRateData) ? $vatRateData->tax_rate : 0; + + $productPrice = $productPrice <= 0 && isset($productInfor->product_price) ? $productInfor->product_price : $productPrice; + $productPrice = RedshopHelperProductPrice::priceRound($productPrice); + + if ($taxExempt) + { + return $productPrice * $taxRate; + } + + if (!$taxRate) + { + return RedshopHelperProductPrice::priceRound($productTax); + } + + if (!$userId) + { + $productTax = $productPrice * $taxRate; + } + else + { + $userInformation = RedshopHelperUser::getUserInformation($userId); + + if (null === $userInformation || $userInformation->requesting_tax_exempt !== 1 || !$userInformation->tax_exempt_approved) + { + $productTax = $productPrice * $taxRate; + } + } + + return RedshopHelperProductPrice::priceRound($productTax); + } + + /** + * Get Product Prices + * + * @param int $productId Product id + * @param int $userId User id + * @param int $quantity Quantity + * + * @return object Product price object + * + * @since 2.0.6 + */ + public static function getProductPrices($productId, $userId, $quantity = 1) + { + $key = $productId . '_' . $userId . '_' . $quantity; + + if (array_key_exists($key, self::$productPrices)) + { + return self::$productPrices[$key]; + } + + $userArr = JFactory::getSession()->get('rs_user'); + $result = null; + + if (empty($userArr)) + { + $userArr = RedshopHelperUser::createUserSession($userId); + } + + $shopperGroupId = $userArr['rs_user_shopperGroup']; + + if ($quantity != 1) + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select( + $db->qn(array( + 'p.price_id', 'p.product_price', 'p.product_currency', 'p.discount_price', 'p.discount_start_date', 'p.discount_end_date' + ) + ) + ) + ->from($db->qn('#__redshop_product_price', 'p')); + + if ($userId) + { + $query->leftJoin($db->qn('#__redshop_users_info', 'u') . ' ON u.shopper_group_id = p.shopper_group_id') + ->where('u.user_id = ' . (int) $userId) + ->where('u.address_type = ' . $db->quote('BT')); + } + else + { + $query->where('p.shopper_group_id = ' . (int) $shopperGroupId); + } + + $query->where('p.product_id = ' . (int) $productId) + ->where( + '((p.price_quantity_start <= ' . (int) $quantity . ' AND p.price_quantity_end >= ' + . (int) $quantity . ') OR (p.price_quantity_start = 0 AND p.price_quantity_end = 0))' + ) + ->order('p.price_quantity_start ASC'); + + $result = $db->setQuery($query)->loadObject(); + } + else + { + $productData = self::getProductById($productId, $userId); + + if (null !== $productData && isset($productData->price_id)) + { + $result = new stdClass; + $result->price_id = $productData->price_id; + $result->product_price = $productData->price_product_price; + $result->discount_price = $productData->price_discount_price; + $result->product_currency = $productData->price_product_currency; + $result->discount_start_date = $productData->price_discount_start_date; + $result->discount_end_date = $productData->price_discount_end_date; + } + } + + if (!empty($result) && $result->discount_price != 0 + && $result->discount_start_date != 0 && $result->discount_end_date != 0 + && $result->discount_start_date <= time() + && $result->discount_end_date >= time() + && $result->discount_price < $result->product_price) + { + $result->product_price = $result->discount_price; + } + + self::$productPrices[$key] = $result; + + return self::$productPrices[$key]; + } + + /** + * Method for set product attributes + * + * @param array $getAttributeKeys Attributes key + * @param integer $userId Current user ID + * + * @return void + * + * @since 2.1.0 + */ + public static function setProductAttributes($getAttributeKeys = array(), $userId = 0) + { + if (empty($getAttributeKeys)) + { + return; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('a.attribute_id', 'value')) + ->select($db->qn('a.attribute_name', 'text')) + ->select('a.*') + ->select($db->qn('ast.attribute_set_name')) + ->select($db->qn('ast.published', 'attribute_set_published')) + ->from($db->qn('#__redshop_product_attribute', 'a')) + ->leftJoin( + $db->qn('#__redshop_attribute_set', 'ast') . ' ON ' . $db->qn('ast.attribute_set_id') . ' = ' . $db->qn('a.attribute_set_id') + ) + ->where($db->qn('a.attribute_name') . ' != ' . $db->quote('')) + ->where($db->qn('a.attribute_published') . ' = 1') + ->where($db->qn('a.product_id') . ' IN (' . implode(',', $getAttributeKeys) . ')') + ->order($db->qn('a.ordering') . ' ASC'); + + $attributes = $db->setQuery($query)->loadObjectList(); + + if (empty($attributes)) + { + return; + } + + foreach ($attributes as $attribute) + { + $key = $attribute->product_id . '.' . $userId; + + static::$products[$key]->attributes[$attribute->attribute_id] = $attribute; + static::$products[$key]->attributes[$attribute->attribute_id]->properties = array(); + } + + $query->clear() + ->select($db->qn('ap.property_id', 'value')) + ->select($db->qn('ap.property_name', 'text')) + ->select('ap.*') + ->select('a.attribute_name') + ->select('a.attribute_id') + ->select('a.product_id') + ->select('a.attribute_set_id') + ->from($db->qn('#__redshop_product_attribute_property', 'ap')) + ->leftJoin( + $db->qn('#__redshop_product_attribute', 'a') . ' ON ' . $db->qn('a.attribute_id') . ' = ' . $db->qn('ap.attribute_id') + ) + ->where($db->qn('a.product_id') . ' IN (' . implode(',', $getAttributeKeys) . ')') + ->where($db->qn('ap.property_published') . ' = 1') + ->where($db->qn('a.attribute_published') . ' = 1') + ->where($db->qn('a.attribute_name') . ' != ' . $db->quote('')) + ->order($db->qn('ap.ordering') . ' ASC'); + + $properties = $db->setQuery($query)->loadObjectList(); + + if (empty($properties)) + { + return; + } + + foreach ($properties as $property) + { + $key = $property->product_id . '.' . $userId; + + static::$products[$key]->attributes[$property->attribute_id]->properties[$property->property_id] = $property; + } + } + + /** + * Method for set product extra fields + * + * @param array $getExtraFieldKeys Attributes key + * @param integer $userId Current user ID + * + * @return void + * + * @since 2.1.0 + */ + public static function setProductExtraFields($getExtraFieldKeys = array(), $userId = 0) + { + if (empty($getExtraFieldKeys)) + { + return; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('fd.*') + ->select($db->qn('f.title')) + ->from($db->qn('#__redshop_fields_data', 'fd') . ' FORCE INDEX(' . $db->qn('#__field_data_common') . ')') + ->leftJoin($db->qn('#__redshop_fields', 'f') . ' ON ' . $db->qn('fd.fieldid') . ' = ' . $db->qn('f.id')) + ->where($db->qn('fd.itemid') . ' IN (' . implode(',', $getExtraFieldKeys) . ')') + ->where($db->qn('fd.section') . ' = 1'); + + $extraFields = $db->setQuery($query)->loadObjectList(); + + if (empty($extraFields)) + { + return; + } + + foreach ($extraFields as $extraField) + { + $key = $extraField->itemid . '.' . $userId; + + static::$products[$key]->extraFields[$extraField->fieldid] = $extraField; + } + } + + /** + * Method for get child products of specific product + * + * @param integer $productId Product ID + * + * @return array + * @since 2.1.0 + */ + public static function getChildProduct($productId = 0) + { + $childProducts = RedshopEntityProduct::getInstance($productId)->getChildProducts(); + + if ($childProducts->isEmpty()) + { + return array(); + } + + $results = array(); + + foreach ($childProducts->getAll() as $child) + { + /** @var RedshopEntityProduct $child */ + $results[] = $child->getItem(); + } + + return $results; + } +} diff --git a/libraries/redshop/helper/product/accessory.php b/libraries/redshop/helper/product/accessory.php new file mode 100644 index 00000000000..cd50a36be3f --- /dev/null +++ b/libraries/redshop/helper/product/accessory.php @@ -0,0 +1,603 @@ +input; + $viewAcc = $input->get('viewacc', 1); + $layout = $input->get('layout'); + $itemId = $input->get('Itemid'); + $isAjax = 0; + $prefix = ""; + + if ($layout == "viewajaxdetail") + { + $isAjax = 1; + $prefix = "ajax_"; + } + + $productId = $relProductId != 0 ? $relProductId : $productId; + + $selectedAccessory = array(); + $selectedAccessoryQua = array(); + $selectAtt = array(); + + if (count($selectedAccessories) > 0) + { + $selectedAccessory = $selectedAccessories[0]; + $selectedAccessoryQua = $selectedAccessories[3]; + $selectAtt = array($selectedAccessories[1], $selectedAccessories[2]); + } + + $product = RedshopHelperProduct::getProductById($productId); + $accessoryTemplate = \Redshop\Template\Helper::getAccessory($templateContent); + + if (null === $accessoryTemplate) + { + return $templateContent; + } + + $accessoryTemplateData = $accessoryTemplate->template_desc; + $attributeTemplate = (object) \Redshop\Template\Helper::getAttribute($accessoryTemplateData); + + if (empty($accessory)) + { + $templateContent = str_replace("{accessory_template:" . $accessoryTemplate->name . "}", "", $templateContent); + + return $templateContent; + } + + $accessoryTemplateData2 = $accessoryTemplateData; + $productPrices = array(); + + self::replaceMainAccessory($accessoryTemplateData2, $templateContent, $product, $userId); + + $accessoryWrapper = ''; + + if (strpos($accessoryTemplateData2, "{accessory_product_start}") !== false + && strpos($accessoryTemplateData2, "{accessory_product_end}") !== false) + { + $accessoryTemplateData2 = explode('{accessory_product_start}', $accessoryTemplateData2); + $accessoryWrapperStart = $accessoryTemplateData2 [0]; + $accessoryTemplateData2 = explode('{accessory_product_end}', $accessoryTemplateData2 [1]); + $accessoryWrapperEnd = $accessoryTemplateData2[1]; + + $accessoryWrapperMiddle = $accessoryTemplateData2[0]; + + for ($a = 0, $an = count($accessory); $a < $an; $a++) + { + $accessoryId = $accessory[$a]->child_product_id; + $accessoryProduct = RedshopHelperProduct::getProductById($accessoryId); + + $commonId = $prefix . $productId . '_' . $accessory[$a]->accessory_id; + $accessoryWrapper .= "
    " . $accessoryWrapperMiddle . "
    "; + + $accessoryProductName = RedshopHelperUtility::maxChars( + $accessory[$a]->product_name, + Redshop::getConfig()->get('ACCESSORY_PRODUCT_TITLE_MAX_CHARS'), + Redshop::getConfig()->get('ACCESSORY_PRODUCT_TITLE_END_SUFFIX') + ); + + $accessoryWrapper = str_replace("{accessory_title}", $accessoryProductName, $accessoryWrapper); + $accessoryWrapper = str_replace("{product_number}", $accessory[$a]->product_number, $accessoryWrapper); + + $accessoryImage = $accessory[$a]->product_full_image; + $accessoryImg = ''; + + if (strpos($accessoryWrapper, "{accessory_image_3}") !== false) + { + $accessoryImgTag = '{accessory_image_3}'; + $accessoryHeightThumb = Redshop::getConfig()->get('ACCESSORY_THUMB_HEIGHT_3'); + $accessoryWidthThumb = Redshop::getConfig()->get('ACCESSORY_THUMB_WIDTH_3'); + } + elseif (strpos($accessoryWrapper, "{accessory_image_2}") !== false) + { + $accessoryImgTag = '{accessory_image_2}'; + $accessoryHeightThumb = Redshop::getConfig()->get('ACCESSORY_THUMB_HEIGHT_2'); + $accessoryWidthThumb = Redshop::getConfig()->get('ACCESSORY_THUMB_WIDTH_2'); + } + elseif (strpos($accessoryWrapper, "{accessory_image_1}") !== false) + { + $accessoryImgTag = '{accessory_image_1}'; + $accessoryHeightThumb = Redshop::getConfig()->get('ACCESSORY_THUMB_HEIGHT'); + $accessoryWidthThumb = Redshop::getConfig()->get('ACCESSORY_THUMB_WIDTH'); + } + else + { + $accessoryImgTag = '{accessory_image}'; + $accessoryHeightThumb = Redshop::getConfig()->get('ACCESSORY_THUMB_HEIGHT'); + $accessoryWidthThumb = Redshop::getConfig()->get('ACCESSORY_THUMB_WIDTH'); + } + + $accessoryProductLink = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $accessoryId . '&Itemid=' . $itemId, false); + $hiddenThumbImage = ""; + + // Trigger to change product image. + $dispatcher->trigger( + 'changeProductImage', + array( + &$accessoryImg, + $accessory[$a], + $accessoryProductLink, + $accessoryWidthThumb, + $accessoryHeightThumb, + Redshop::getConfig()->get('ACCESSORY_PRODUCT_IN_LIGHTBOX'), + '' + ) + ); + + if (empty($accessoryImg)) + { + if (Redshop::getConfig()->get('ACCESSORY_PRODUCT_IN_LIGHTBOX') == 1) + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $accessoryImage)) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $accessoryImage, + '', + 'thumb', + 'product', + $accessoryWidthThumb, + $accessoryHeightThumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $accessoryImg = "" + . "" + . ""; + } + else + { + $thumbUrl = RedshopHelperMedia::getImagePath( + 'noimage.jpg', + '', + 'thumb', + '', + $accessoryWidthThumb, + $accessoryHeightThumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $accessoryImg = "" + . ""; + } + } + else + { + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $accessoryImage)) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $accessoryImage, + '', + 'thumb', + 'product', + $accessoryWidthThumb, + $accessoryHeightThumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $accessoryImg = ""; + } + else + { + $thumbUrl = RedshopHelperMedia::getImagePath( + 'noimage.jpg', + '', + 'thumb', + '', + $accessoryWidthThumb, + $accessoryHeightThumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + $accessoryImg = ""; + } + } + } + + $accessoryWrapper = str_replace($accessoryImgTag, $accessoryImg . $hiddenThumbImage, $accessoryWrapper); + $accessoryShortDesc = RedshopHelperUtility::maxChars( + $accessory[$a]->product_s_desc, + Redshop::getConfig()->get('ACCESSORY_PRODUCT_DESC_MAX_CHARS'), + Redshop::getConfig()->get('ACCESSORY_PRODUCT_DESC_END_SUFFIX') + ); + $accessoryWrapper = str_replace("{accessory_short_desc}", $accessoryShortDesc, $accessoryWrapper); + + // Add manufacturer + if (strpos($accessoryWrapper, "{manufacturer_name}") !== false || strpos($accessoryWrapper, "{manufacturer_link}") !== false) + { + $manufacturer = RedshopEntityManufacturer::getInstance($accessory[$a]->manufacturer_id)->getItem(); + + if (count($manufacturer) > 0) + { + $manufacturerUrl = JRoute::_( + 'index.php?option=com_redshop&view=manufacturers&layout=products&mid=' + . $accessory[$a]->manufacturer_id . '&Itemid=' . $itemId + ); + + $manufacturerLink = "" + . JText::_("VIEW_ALL_MANUFACTURER_PRODUCTS") . ""; + $accessoryWrapper = str_replace("{manufacturer_name}", $manufacturer->name, $accessoryWrapper); + $accessoryWrapper = str_replace("{manufacturer_link}", $manufacturerLink, $accessoryWrapper); + } + else + { + $accessoryWrapper = str_replace("{manufacturer_name}", '', $accessoryWrapper); + $accessoryWrapper = str_replace("{manufacturer_link}", '', $accessoryWrapper); + } + } + + // Get accessory final price with VAT rules + $accessoryPriceWithoutVAT = \Redshop\Product\Accessory::getPrice( + $productId, + $accessory[$a]->newaccessory_price, + $accessory[$a]->accessory_main_price, + 1 + ); + + if (strpos($accessoryWrapper, "{without_vat}") === false) + { + $accessoryPrices = \Redshop\Product\Accessory::getPrice( + $productId, + $accessory[$a]->newaccessory_price, + $accessory[$a]->accessory_main_price + ); + } + else + { + $accessoryPrices = $accessoryPriceWithoutVAT; + } + + $accessoryPriceWithoutVAT = $accessoryPriceWithoutVAT[0]; + + $accessoryPrice = $accessoryPrices[0]; + $accessoryMainPrice = $accessoryPrices[1]; + $accessorySavedPrice = $accessoryPrices[2]; + + // Get Formatted prices + $accessorySavedPrice = RedshopHelperProductPrice::formattedPrice($accessorySavedPrice); + $accessoryMainPrice = RedshopHelperProductPrice::formattedPrice($accessoryMainPrice); + $accessoryShowPrice = RedshopHelperProductPrice::formattedPrice($accessoryPrice); + + if (Redshop::getConfig()->get('SHOW_PRICE') && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') + || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE')))) + { + $accessoryWrapper = str_replace("{accessory_price}", $accessoryShowPrice, $accessoryWrapper); + $accessoryWrapper = str_replace("{accessory_main_price}", $accessoryMainPrice, $accessoryWrapper); + $accessoryWrapper = str_replace("{accessory_price_saving}", $accessorySavedPrice, $accessoryWrapper); + } + else + { + $accessoryWrapper = str_replace("{accessory_price}", '', $accessoryWrapper); + $accessoryWrapper = str_replace("{accessory_main_price}", '', $accessoryWrapper); + $accessoryWrapper = str_replace("{accessory_price_saving}", '', $accessoryWrapper); + } + + $readMoreLink = JRoute::_('index.php?option=com_redshop&view=product&pid=' . $accessoryId . '&Itemid=' . $itemId, false); + + $accessoryProductDetail = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + + $accessoryWrapper = str_replace("{accessory_readmore}", $accessoryProductDetail, $accessoryWrapper); + $accessoryWrapper = str_replace("{accessory_readmore_link}", $readMoreLink, $accessoryWrapper); + + // Accessory attribute Start + $attributeSet = array(); + + if ($accessoryProduct->attribute_set_id > 0) + { + $attributeSet = RedshopHelperProduct_Attribute::getProductAttribute(0, $accessoryProduct->attribute_set_id); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($accessoryId); + $attributes = array_merge($attributes, $attributeSet); + + $accessoryWrapper = RedshopHelperAttribute::replaceAttributeData( + $productId, + $accessory[$a]->accessory_id, + $relProductId, + $attributes, + $accessoryWrapper, + $attributeTemplate, + $isChild, + $selectAtt + ); + + $accessoryWrapper = Redshop\Product\Stock::replaceInStock($accessory[$a]->child_product_id, $accessoryWrapper); + + // Accessory attribute End + $accessoryChecked = ""; + + if (($isAjax == 1 && in_array($accessory[$a]->accessory_id, $selectedAccessory)) + || ($isAjax == 0 && $accessory[$a]->setdefault_selected)) + { + $accessoryChecked = "checked"; + } + + $accessory_checkbox = ""; + $accessoryWrapper = str_replace("{accessory_add_chkbox}", $accessory_checkbox, $accessoryWrapper); + $accessoryWrapper = str_replace( + "{accessory_add_chkbox_lbl}", + JText::_('COM_REDSHOP_ACCESSORY_ADD_CHKBOX_LBL') . ' ' . $accessory[$a]->product_name, + $accessoryWrapper + ); + + if (strpos($accessoryWrapper, "{accessory_quantity}") !== false) + { + if (Redshop::getConfig()->get('ACCESSORY_AS_PRODUCT_IN_CART_ENABLE')) + { + $key = array_search($accessory[$a]->accessory_id, $selectedAccessory); + $accqua = ($accessoryChecked != "" && isset($selectedAccessoryQua[$key]) && $selectedAccessoryQua[$key]) + ? $selectedAccessoryQua[$key] : 1; + $accessory_quantity = ""; + $accessoryWrapper = str_replace("{accessory_quantity}", $accessory_quantity, $accessoryWrapper); + $accessoryWrapper = str_replace("{accessory_quantity_lbl}", JText::_('COM_REDSHOP_QUANTITY'), $accessoryWrapper); + } + else + { + $accessoryWrapper = str_replace("{accessory_quantity}", "", $accessoryWrapper); + $accessoryWrapper = str_replace("{accessory_quantity_lbl}", "", $accessoryWrapper); + } + } + + $fields = RedshopHelperExtrafields::getSectionFieldList( + RedshopHelperExtrafields::SECTION_PRODUCT, 1, 1 + ); + + if (count($fields) > 0) + { + foreach ($fields as $field) + { + $fieldValues = RedshopHelperExtrafields::getSectionFieldDataList( + $field->id, 1, $accessory[$a]->child_product_id + ); + + if ($fieldValues && $fieldValues->data_txt != "" + && $field->show_in_front == 1 && $field->published == 1) + { + $accessoryWrapper = str_replace('{' . $field->name . '}', $fieldValues->data_txt, $accessoryWrapper); + $accessoryWrapper = str_replace('{' . $field->name . '_lbl}', $field->title, $accessoryWrapper); + } + else + { + $accessoryWrapper = str_replace('{' . $field->name . '}', "", $accessoryWrapper); + $accessoryWrapper = str_replace('{' . $field->name . '_lbl}', "", $accessoryWrapper); + } + } + } + } + + $accessoryWrapper = $accessoryWrapperStart . $accessoryWrapper . $accessoryWrapperEnd; + } + + // Attribute ajax change + if ($viewAcc != 1 && Redshop::getConfig()->getInt('AJAX_CART_BOX') != 0) + { + $accessoryWrapper = ''; + } + + $templateContent = str_replace( + "{accessory_template:" . $accessoryTemplate->name . "}", + $accessoryWrapper, + $templateContent + ); + + $selectedAccessoriesHtml = ''; + + if (strpos($templateContent, "{selected_accessory_price}") !== false && $isAjax == 0) + { + $selectedAccessoryPrice = RedshopHelperProductPrice::priceReplacement($productPrices['product_price']); + $selectedAccessoriesHtml = "
    " + . $selectedAccessoryPrice . "
    "; + } + + $templateContent = str_replace("{selected_accessory_price}", $selectedAccessoriesHtml, $templateContent); + + // New tags replacement for accessory template section + $templateContent = RedshopTagsReplacer::_('accessory', $templateContent, array('accessory' => $accessory)); + $templateContent = str_replace("{accessory_product_start}", "", $templateContent); + $templateContent = str_replace("{accessory_product_end}", "", $templateContent); + + return $templateContent; + } + + /** + * Method for get image width height from tags in template + * + * @param string $template Template content + * @param string $imageTag Accessory image tag + * @param integer $width Return variable width + * @param integer $height Return variable height + * + * @return void + * + * @since 2.1.0 + */ + public static function getWidthHeight($template, &$imageTag, &$width, &$height) + { + if (strpos($template, "{accessory_main_image_3}") !== false) + { + $imageTag = '{accessory_main_image_3}'; + $height = Redshop::getConfig()->get('ACCESSORY_THUMB_HEIGHT_3'); + $width = Redshop::getConfig()->get('ACCESSORY_THUMB_WIDTH_3'); + } + elseif (strpos($template, "{accessory_main_image_2}") !== false) + { + $imageTag = '{accessory_main_image_2}'; + $height = Redshop::getConfig()->get('ACCESSORY_THUMB_HEIGHT_2'); + $width = Redshop::getConfig()->get('ACCESSORY_THUMB_WIDTH_2'); + } + elseif (strpos($template, "{accessory_main_image_1}") !== false) + { + $imageTag = '{accessory_main_image_1}'; + $height = Redshop::getConfig()->get('ACCESSORY_THUMB_HEIGHT'); + $width = Redshop::getConfig()->get('ACCESSORY_THUMB_WIDTH'); + } + else + { + $imageTag = '{accessory_main_image}'; + $height = Redshop::getConfig()->get('ACCESSORY_THUMB_HEIGHT'); + $width = Redshop::getConfig()->get('ACCESSORY_THUMB_WIDTH'); + } + } + + /** + * Method for replace main accessory tags. + * + * @param string $accessoryTemplate Accessory template data + * @param string $templateContent Template content + * @param object $product Product Data + * @param integer $userId User ID + * + * @return void + * + * @since 2.1.0 + */ + public static function replaceMainAccessory(&$accessoryTemplate, $templateContent, $product, $userId) + { + if (strpos($accessoryTemplate, "{if accessory_main}") === false + || strpos($accessoryTemplate, "{accessory_main end if}") === false) + { + return; + } + + $accessoryTemplate = explode('{if accessory_main}', $accessoryTemplate); + $accessoryStart = $accessoryTemplate[0]; + $accessoryTemplate = explode('{accessory_main end if}', $accessoryTemplate[1]); + $accessoryEnd = $accessoryTemplate[1]; + $accessoryMiddle = $accessoryTemplate[0]; + + if (strpos($accessoryMiddle, "{accessory_main_short_desc}") !== false) + { + $accessoryMiddle = str_replace( + "{accessory_main_short_desc}", + RedshopHelperUtility::limitText( + $product->product_s_desc, + Redshop::getConfig()->get('ACCESSORY_PRODUCT_DESC_MAX_CHARS'), + Redshop::getConfig()->get('ACCESSORY_PRODUCT_DESC_END_SUFFIX') + ), + $accessoryMiddle + ); + } + + if (strpos($accessoryMiddle, "{accessory_main_title}") !== false) + { + $accessoryMiddle = str_replace( + "{accessory_main_title}", + RedshopHelperUtility::limitText( + $product->product_name, + Redshop::getConfig()->get('ACCESSORY_PRODUCT_TITLE_MAX_CHARS'), + Redshop::getConfig()->get('ACCESSORY_PRODUCT_TITLE_END_SUFFIX') + ), + $accessoryMiddle + ); + } + + $accessoryProductDetail = "" . JText::_('COM_REDSHOP_READ_MORE') . ""; + $accessoryMiddle = str_replace("{accessory_main_readmore}", $accessoryProductDetail, $accessoryMiddle); + $accessoryMainImage = $product->product_full_image; + $accessoryMainImage2 = ''; + + self::getWidthHeight($accessoryMiddle, $accessoryImgTag, $accessoryWidthThumb, $accessoryHeightThumb); + + if (JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $accessoryMainImage)) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $accessoryMainImage, + '', + 'thumb', + 'product', + $accessoryWidthThumb, + $accessoryHeightThumb, + Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING') + ); + + if (Redshop::getConfig()->get('ACCESSORY_PRODUCT_IN_LIGHTBOX') == 1) + { + $accessoryMainImage2 = "" + . ""; + } + else + { + $accessoryMainImage2 = ""; + } + } + + $accessoryMiddle = str_replace($accessoryImgTag, $accessoryMainImage2, $accessoryMiddle); + $productPrices = array(); + + if (strpos($accessoryMiddle, "{accessory_mainproduct_price}") !== false + || strpos($templateContent, "{selected_accessory_price}") !== false) + { + $productPrices = RedshopHelperProductPrice::getNetPrice($product->product_id, $userId, 1, $templateContent); + } + + if (strpos($accessoryMiddle, "{accessory_mainproduct_price}") !== false) + { + if (Redshop::getConfig()->get('SHOW_PRICE') + && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') + || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') + && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE')))) + { + $accessoryMainProductPrice = RedshopHelperProductPrice::priceReplacement($productPrices['product_price']); + + $accessoryMiddle = str_replace("{accessory_mainproduct_price}", $accessoryMainProductPrice, $accessoryMiddle); + } + } + + $accessoryMiddle = Redshop\Product\Stock::replaceInStock($product->product_id, $accessoryMiddle); + $accessoryTemplate = $accessoryStart . $accessoryMiddle . $accessoryEnd; + } +} diff --git a/libraries/redshop/helper/product/download.php b/libraries/redshop/helper/product/download.php new file mode 100644 index 00000000000..0024f944454 --- /dev/null +++ b/libraries/redshop/helper/product/download.php @@ -0,0 +1,59 @@ +getQuery(true) + ->select( + $db->qn( + array( + 'product_download', 'product_download_days', 'product_download_limit', 'product_download_clock', + 'product_download_clock_min', 'product_download_infinite' + ) + ) + ) + ->from($db->qn('#__redshop_product')) + ->where($db->qn('product_id') . ' = ' . (int) $productId); + + $result = $db->setQuery($query)->loadObject(); + + if ($return) + { + return $result; + } + + return !$result ? 0 : (int) $result->product_download; + } +} diff --git a/libraries/redshop/helper/product/index.html b/libraries/redshop/helper/product/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/helper/product/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/helper/product/price.php b/libraries/redshop/helper/product/price.php new file mode 100644 index 00000000000..56fb63680e2 --- /dev/null +++ b/libraries/redshop/helper/product/price.php @@ -0,0 +1,701 @@ +getCategoryProduct($productId) : ''; + + // Get shopper group Id + $userArr = JFactory::getSession()->get('rs_user'); + + if (empty($userArr)) + { + $user = JFactory::getUser(); + $userArr = RedshopHelperUser::createUserSession($user->id); + } + + // Shopper Group Id from user session + $shopperGroupId = $userArr['rs_user_shopperGroup']; + + $key = $discountStringIds . '.' . $categoryProduct; + + if (!array_key_exists($key, self::$productSpecialPrices)) + { + $time = time(); + $db = JFactory::getDbo(); + + // Secure discount ids + $discountIds = !empty($discountStringIds) ? ArrayHelper::toInteger(explode(',', $discountStringIds)) : array(); + $discountIds = array_values(array_filter($discountIds)); + + // Secure category ids + $catIds = !empty($categoryProduct) ? ArrayHelper::toInteger(explode(',', $categoryProduct)) : array(); + $catIds = array_values(array_filter($catIds)); + + $query = $db->getQuery(true) + ->select('dp.*') + ->from($db->qn('#__redshop_discount_product', 'dp')) + ->where($db->qn('dp.published') . ' = 1'); + + if (!empty($catIds)) + { + $categoriesSub = array(); + + foreach ($catIds as $categoryId) + { + // Search by categories if configured + $categoriesSub[] = ('FIND_IN_SET(' . $categoryId . ', dp.category_ids)'); + } + + // Or just take all categories if it's not provided + $categoriesSub[] = $db->qn('dp.category_ids') . '=' . $db->quote(''); + + if (!empty($discountIds)) + { + $query->where('(dp.discount_product_id IN (' . implode(',', $discountIds) . ')'); + $query->where('((' . implode(') OR (', $categoriesSub) . ')))'); + } + else + { + $query->where('((' . implode(') OR (', $categoriesSub) . '))'); + } + } + elseif (!empty($discountIds)) + { + $query->where('dp.discount_product_id IN (' . implode(',', $discountIds) . ')'); + } + + $query->where('(' . $db->qn('dp.start_date') . ' = 0 OR ' . $db->qn('dp.start_date') . ' <= ' . (int) $time . ')') + ->where('(' . $db->qn('dp.end_date') . ' = 0 OR ' . $db->qn('dp.end_date') . ' >= ' . (int) $time . ')') + ->order($db->qn('dp.amount') . ' DESC'); + + // Get all discount based on current shopper group + $subQuery = $db->getQuery(true) + ->select('dps.discount_product_id') + ->from($db->qn('#__redshop_discount_product_shoppers', 'dps')) + ->where('dps.shopper_group_id = ' . (int) $shopperGroupId); + + // Filter by requested discounts only + $query->where($db->qn('dp.discount_product_id') . ' IN (' . $subQuery . ')'); + + self::$productSpecialPrices[$key] = $db->setQuery($query)->loadObjectList(); + } + + if (empty(self::$productSpecialPrices[$key])) + { + return null; + } + + foreach (self::$productSpecialPrices[$key] as $item) + { + if (($item->condition == 1 && $item->amount > $productPrice) + || ($item->condition == 2 && $item->amount == $productPrice) + || ($item->condition == 3 && $item->amount < $productPrice)) + { + return $item; + } + } + + return null; + } + + /** + * Method for replace price. + * + * @param float $productPrice Product price + * + * @return string + * + * @since 2.0.7 + */ + public static function priceReplacement($productPrice) + { + if ($productPrice) + { + return self::formattedPrice($productPrice); + } + + if (!Redshop::getConfig()->get('SHOW_PRICE') + || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') == '1' && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE') != '1')) // && DEFAULT_QUOTATION_MODE==1) + { + return Redshop::getConfig()->get('PRICE_REPLACE_URL') ? + "" + . Redshop::getConfig()->get('PRICE_REPLACE') . "" : Redshop::getConfig()->get('PRICE_REPLACE'); + } + + if (Redshop::getConfig()->get('SHOW_PRICE')) + { + if ((Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') == '0') + || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') == '1' && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE') == '1')) + { + return Redshop::getConfig()->get('ZERO_PRICE_REPLACE_URL') ? + "" + . Redshop::getConfig()->get('ZERO_PRICE_REPLACE') . "" : Redshop::getConfig()->get('ZERO_PRICE_REPLACE'); + } + } + + return ''; + } + + /** + * Format Product Price + * + * @param float $productPrice Product price + * @param boolean $convert Decide to convert price in Multi Currency + * @param string $currencySymbol Product Formatted Price + * + * @return string Formatted Product Price + * + * @since 2.0.7 + */ + public static function formattedPrice($productPrice, $convert = true, $currencySymbol = '_NON_') + { + $currencySymbol = $currencySymbol === '_NON_' ? Redshop::getConfig()->get('REDCURRENCY_SYMBOL') : $currencySymbol; + + // Get Current Currency of SHOP + $session = JFactory::getSession(); + + // If convert set true than use conversation + if ($convert && $session->get('product_currency')) + { + $productPrice = RedshopHelperCurrency::convert($productPrice); + $productCurrency = $session->get('product_currency'); + $currencySymbol = (int) $productCurrency; + $currencySymbol = !$currencySymbol ? + $productCurrency : RedshopEntityCurrency::getInstance((int) $productCurrency)->get('code'); + } + + if (!is_numeric($productPrice)) + { + return ''; + } + + // Prepare currency symbol + $position = Redshop::getConfig()->getString('CURRENCY_SYMBOL_POSITION', 'front'); + + if ($position === 'behind') + { + $currencySymbol = ' ' . (string) $currencySymbol . ''; + } + else + { + $currencySymbol = '' . (string) $currencySymbol . ' '; + } + + $priceDecimal = (int) Redshop::getConfig()->get('PRICE_DECIMAL'); + $priceSeparator = Redshop::getConfig()->get('PRICE_SEPERATOR'); + $thousandSeparator = Redshop::getConfig()->get('THOUSAND_SEPERATOR', ''); + $productPrice = (double) $productPrice; + $productPrice = number_format($productPrice, $priceDecimal, $priceSeparator, $thousandSeparator); + + switch ($position) + { + case 'behind': + return $productPrice . $currencySymbol; + + case 'none': + return $productPrice; + + case 'front': + default: + return $currencySymbol . $productPrice; + } + } + + /** + * Method for round product price + * + * @param float $productPrice Product price + * + * @return float + * + * @since 2.0.7 + */ + public static function priceRound($productPrice) + { + return round($productPrice, Redshop::getConfig()->get('CALCULATION_PRICE_DECIMAL', 4)); + } + + /** + * Method for get product net price + * + * @param integer $productId ID of product + * @param integer $userId ID of user + * @param integer $quantity Quantity for get + * @param string $templateHtml Template data + * @param array $attributes Attributes list. + * + * @return array + * @throws Exception + * + * @since 2.0.7 + */ + public static function getNetPrice($productId, $userId = 0, $quantity = 1, $templateHtml = '', $attributes = array()) + { + $row = RedshopHelperProduct::getProductById($productId); + $productId = $row->product_id; + $newPrice = $row->product_price; + + $userId = !$userId ? JFactory::getUser()->id : $userId; + $productPrices = array(); + $priceText = JText::_('COM_REDSHOP_REGULAR_PRICE') . ""; + $productVatLabel = ''; + $priceLabel = ''; + $oldPriceLabel = ''; + $priceSavingLabel = ''; + $oldPriceExcludeVat = ''; + + $result = RedshopHelperProduct::getProductPrices($productId, $userId, $quantity); + + if (!empty($result)) + { + $newPrice = $result->product_price; + } + + // Set Product Custom Price through product plugin + $dispatcher = RedshopHelperUtility::getDispatcher(); + JPluginHelper::importPlugin('redshop_product'); + $results = $dispatcher->trigger('setProductCustomPrice', array($productId, $quantity)); + + if (count($results) > 0 && $results[0]) + { + $newPrice = $results[0]; + } + + $isApplyTax = \Redshop\Template\Helper::isApplyVat($templateHtml, $userId); + $specialPrice = self::getProductSpecialPrice($newPrice, productHelper::getInstance()->getProductSpecialId($userId), $productId); + + if (!is_null($specialPrice)) + { + $discountAmount = $specialPrice->discount_type == 0 ? + $specialPrice->discount_amount : ($newPrice * $specialPrice->discount_amount) / (100); + + $newPrice = $newPrice < 0 ? 0 : $newPrice; + $regPrice = $row->product_price; + + if ($isApplyTax) + { + $priceTax = RedshopHelperProduct::getProductTax($row->product_id, $newPrice, $userId); + $regPrice = $row->product_price + $priceTax; + } + + $formattedPrice = self::formattedPrice($regPrice); + $productPrice = $newPrice - $discountAmount; + $productPrice = $productPrice < 0 ? 0 : $productPrice; + + $priceText = $priceText . '' . $formattedPrice + . '
    ' . JText::_('COM_REDSHOP_SPECIAL_PRICE'); + } + else + { + $productPrice = $newPrice; + } + + $dispatcher->trigger('onSetProductPrice', array(&$productPrice, $productId)); + + $excludeVat = RedshopHelperProduct_Attribute::defaultAttributePrice($productId, $productPrice, $templateHtml, $userId, 0, $attributes); + $formattedPrice = self::formattedPrice($excludeVat); + $priceText = $priceText . '' . $formattedPrice . '' + . ''; + + $defaultTaxAmount = RedshopHelperProduct::getProductTax($productId, $productPrice, $userId, 1); + $taxAmount = RedshopHelperProduct::getProductTax($productId, $productPrice, $userId); + $productPriceExcludingVat = $productPrice; + $productPriceIncludingVat = $defaultTaxAmount + $productPriceExcludingVat; + + if ($isApplyTax) + { + $productPrice = $taxAmount + $productPrice; + } + + $productPrice = $productPrice < 0 ? 0 : $productPrice; + + if (Redshop::getConfig()->getBool('SHOW_PRICE')) + { + $priceExcludingVat = $priceText; + if (Redshop::getConfig()->getInt('DISCOUNT_ENABLE') == 0) + { + $row->product_on_sale = 0; + } + $productDiscountPriceTemp = RedshopHelperDiscount::getDiscountPriceBaseDiscountDate($productId); + $oldPriceExcludeVat = $productPriceExcludingVat; + + $dispatcher->trigger('onSetProductDiscountPrice', array(&$productDiscountPriceTemp, $productId)); + + if ($row->product_on_sale && $productDiscountPriceTemp > 0) + { + $discountPriceExcludingVat = $productDiscountPriceTemp; + + $taxAmount = RedshopHelperProduct::getProductTax($productId, $productDiscountPriceTemp, $userId); + + if (intval($isApplyTax) && $productDiscountPriceTemp) + { + $productDiscountPriceTemp = $productDiscountPriceTemp + $taxAmount; + } + + if ($productPrice < $productDiscountPriceTemp) + { + $productPrice = RedshopHelperProduct_Attribute::defaultAttributePrice( + $productId, $productPrice, $templateHtml, $userId, intval($isApplyTax), $attributes + ); + + $mainPrice = $productPrice; + $discountPrice = ''; + $oldPrice = ''; + $priceSaving = ''; + $priceSavingPercentage = ''; + $priceNoVAT = $productPriceExcludingVat; + $seoProductSavingPrice = ''; + $seoProductPrice = $productPrice; + $taxAmount = RedshopHelperProduct::getProductTax($productId, $priceNoVAT, $userId); + } + else + { + $priceSaving = $productPriceExcludingVat - $discountPriceExcludingVat; + + // Calculate total price saving in percentage + $priceSavingPercentage = ($priceSaving / $productPriceExcludingVat) * 100; + + // Only apply VAT if set to apply in config or tag + if (intval($isApplyTax) && $priceSaving) + { + // Adding VAT in saving price + $priceSaving += RedshopHelperProduct::getProductTax($productId, $priceSaving, $userId); + } + + $productPriceIncludingVat = $productDiscountPriceTemp + $taxAmount; + + $oldPrice = RedshopHelperProduct_Attribute::defaultAttributePrice( + $productId, $productPrice, $templateHtml, $userId, intval($isApplyTax), $attributes + ); + + $productDiscountPriceTemp = RedshopHelperProduct_Attribute::defaultAttributePrice( + $productId, $productDiscountPriceTemp, $templateHtml, $userId, intval($isApplyTax), $attributes + ); + + $discountPrice = $productDiscountPriceTemp; + $mainPrice = $productDiscountPriceTemp; + $productPrice = $productDiscountPriceTemp; + + $priceNoVAT = RedshopHelperProduct_Attribute::defaultAttributePrice( + $productId, $discountPriceExcludingVat, $templateHtml, $userId, 0, $attributes + ); + + $seoProductPrice = $productDiscountPriceTemp; + $seoProductSavingPrice = $priceSaving; + + $priceSavingLabel = JText::_('COM_REDSHOP_PRODUCT_PRICE_SAVING_LBL'); + $oldPriceLabel = JText::_('COM_REDSHOP_PRODUCT_OLD_PRICE_LBL'); + } + } + else + { + $mainPrice = $productPrice; + + $productPrice = RedshopHelperProduct_Attribute::defaultAttributePrice( + $productId, $productPrice, $templateHtml, $userId, intval($isApplyTax), $attributes + ); + + $discountPrice = ''; + $priceSaving = ''; + $priceSavingPercentage = ''; + $oldPrice = ''; + $priceNoVAT = $productPriceExcludingVat; + $seoProductPrice = $productPrice; + $seoProductSavingPrice = ''; + } + + if ($taxAmount && intval($isApplyTax)) + { + $productVatLabel = ' ' . JText::_('COM_REDSHOP_PRICE_INCLUDING_TAX'); + } + else + { + $productVatLabel = ' ' . JText::_('COM_REDSHOP_PRICE_EXCLUDING_TAX'); + } + + $priceLabel = JText::_('COM_REDSHOP_PRODUCT_PRICE'); + } + else + { + $seoProductPrice = ''; + $seoProductSavingPrice = ''; + $discountPrice = ''; + $oldPrice = ''; + $priceSaving = ''; + $priceSavingPercentage = ''; + $priceNoVAT = ''; + $mainPrice = ''; + $productPrice = ''; + $priceExcludingVat = ''; + } + + $productPrices['productPrice'] = (float) $priceNoVAT; + $productPrices['product_price'] = (float) $productPrice; + $productPrices['price_excluding_vat'] = (float) $priceExcludingVat; + $productPrices['product_main_price'] = (float) $mainPrice; + $productPrices['product_price_novat'] = (float) $priceNoVAT; + $productPrices['product_price_saving'] = (float) $priceSaving; + $productPrices['product_price_saving_percentage'] = (float) $priceSavingPercentage; + $productPrices['product_price_saving_lbl'] = $priceSavingLabel; + $productPrices['product_old_price'] = (float) $oldPrice; + $productPrices['product_discount_price'] = (float) $discountPrice; + $productPrices['seoProductSavingPrice'] = (float) $seoProductSavingPrice; + $productPrices['seoProductPrice'] = (float) $seoProductPrice; + $productPrices['product_old_price_lbl'] = $oldPriceLabel; + $productPrices['product_price_lbl'] = $priceLabel; + $productPrices['product_vat_lbl'] = $productVatLabel; + $productPrices['productVat'] = (float) $taxAmount; + $productPrices['product_old_price_excl_vat'] = (float) $oldPriceExcludeVat; + $productPrices['product_price_incl_vat'] = (float) $productPriceIncludingVat; + + return $productPrices; + } + + /** + * Method for get product show price + * + * @param integer $productId Product ID + * @param string $templateHtml Template content + * @param string $seoTemplate SEO template + * @param int $userId User ID + * @param boolean $isRel Is Rel + * @param array $attributes Attributes + * + * @return mixed|string + * @throws Exception + * + * @since 2.0.7 + */ + public static function getShowPrice($productId, $templateHtml, $seoTemplate = "", $userId = 0, $isRel = false, $attributes = array()) + { + $price = ''; + $priceNoVat = ''; + $displayPriceDiscount = ''; + $displayOldPrice = ''; + $displayPriceSaving = ''; + $displayPriceSavingPercentage = ''; + $displayPriceNoVAT = ''; + $displayPriceWithVAT = ''; + $priceSavingLabel = ''; + $oldPriceLabel = ''; + $vatLabel = ''; + $priceLabel = ''; + $seoProductPrice = ''; + $seoProductSavingPrice = ''; + $oldPriceNoVat = ''; + + $userId = !$userId ? JFactory::getUser()->id : $userId; + $relPrefix = !$isRel ? '' : 'rel'; + + $defaultQuantity = \Redshop\Cart\Helper::getDefaultQuantity($productId, $templateHtml); + $productPrices = self::getNetPrice($productId, $userId, $defaultQuantity, $templateHtml, $attributes); + + if (Redshop::getConfig()->get('SHOW_PRICE') && (!Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') + || (Redshop::getConfig()->get('DEFAULT_QUOTATION_MODE') && Redshop::getConfig()->get('SHOW_QUOTATION_PRICE')))) + { + $price = self::priceReplacement($productPrices['product_price'] * $defaultQuantity); + $mainPrice = self::priceReplacement($productPrices['product_main_price'] * $defaultQuantity); + $oldPrice = self::priceReplacement((float) $productPrices['product_old_price'] * $defaultQuantity); + $priceSaving = self::priceReplacement($productPrices['product_price_saving'] * $defaultQuantity); + $discountPrice = self::priceReplacement($productPrices['product_discount_price'] * $defaultQuantity); + $priceNoVAT = self::priceReplacement($productPrices['product_price_novat'] * $defaultQuantity); + $priceWithVAT = self::priceReplacement($productPrices['product_price_incl_vat'] * $defaultQuantity); + $oldPriceNoVat = self::priceReplacement($productPrices['product_old_price_excl_vat'] * $defaultQuantity); + + $isStockExists = RedshopHelperStockroom::isStockExists($productId); + + if ($isStockExists && strpos($templateHtml, "{" . $relPrefix . "product_price_table}") !== false) + { + $productPriceTable = RedshopHelperProduct::getProductQuantityPrice($productId, $userId); + $templateHtml = str_replace("{" . $relPrefix . "product_price_table}", $productPriceTable, $templateHtml); + } + + $priceNoVat = $productPrices['price_excluding_vat']; + $seoProductPrice = self::priceReplacement($productPrices['seoProductPrice'] * $defaultQuantity); + $seoProductSavingPrice = self::priceReplacement((float) $productPrices['seoProductSavingPrice'] * $defaultQuantity); + + $oldPriceLabel = $productPrices['product_old_price_lbl']; + $priceSavingLabel = $productPrices['product_price_saving_lbl']; + $priceLabel = $productPrices['product_price_lbl']; + $vatLabel = $productPrices['product_vat_lbl']; + + $displayOldPrice = $oldPrice; + $displayPriceDiscount = $discountPrice; + $displayPriceSaving = $priceSaving; + $displayPriceNoVAT = $priceNoVAT; + + if ($productPrices['product_discount_price']) + { + $displayPriceDiscount = '' . $discountPrice . ''; + } + + if ($productPrices['product_old_price']) + { + $displayOldPrice = '' . $oldPrice . ''; + } + + if ($productPrices['product_price_saving']) + { + $displayPriceSaving = '' . $priceSaving . ''; + $displayPriceSavingPercentage = '' + . JText::sprintf('COM_REDSHOP_PRODUCT_PRICE_SAVING_PERCENTAGE_LBL', round($productPrices['product_price_saving_percentage'])) + . '%'; + } + + if ($productPrices['product_price_novat'] != "") + { + $displayPriceNoVAT = '' . $priceNoVAT . ''; + } + + if ($productPrices['product_price_incl_vat'] != "") + { + $displayPriceWithVAT = '' . $priceWithVAT . ''; + } + } + + if (strpos($templateHtml, "{" . $relPrefix . "product_price_table}") !== false) + { + $templateHtml = str_replace("{" . $relPrefix . "product_price_table}", '', $templateHtml); + } + + if ($seoTemplate != "") + { + $seoTemplate = str_replace("{" . $relPrefix . "saleprice}", $seoProductPrice, $seoTemplate); + $seoTemplate = str_replace("{" . $relPrefix . "saving}", $seoProductSavingPrice, $seoTemplate); + + return $seoTemplate; + } + + if (strpos($templateHtml, "{" . $relPrefix . "lowest_price}") !== false + || strpos($templateHtml, "{" . $relPrefix . "highest_price}") !== false) + { + $productPriceMinMax = productHelper::getInstance()->getProductMinMaxPrice($productId); + + if (strpos($templateHtml, "{" . $relPrefix . "lowest_price}") !== false) + { + if (!empty($productPriceMinMax['min'])) + { + $productMinPrice = self::priceReplacement($productPriceMinMax['min'] * $defaultQuantity); + + $templateHtml = str_replace( + "{" . $relPrefix . "lowest_price}", + '' . $productMinPrice . '', + $templateHtml + ); + } + else + { + $templateHtml = str_replace( + "{" . $relPrefix . "lowest_price}", + '' . $price . '', + $templateHtml + ); + } + } + + if (strpos($templateHtml, "{" . $relPrefix . "highest_price}") !== false) + { + if (!empty($productPriceMinMax['min'])) + { + $productMaxPrice = self::priceReplacement($productPriceMinMax['max'] * $defaultQuantity); + + $templateHtml = str_replace( + "{" . $relPrefix . "highest_price}", + '' . $productMaxPrice . '', + $templateHtml + ); + } + else + { + $templateHtml = str_replace( + "{" . $relPrefix . "highest_price}", + '' . $price . '', + $templateHtml + ); + } + } + } + + $templateHtml = str_replace( + "{" . $relPrefix . "product_price}", + '' . $price . '', + $templateHtml + ); + + $templateHtml = str_replace("{" . $relPrefix . "price_excluding_vat}", $priceNoVat, $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_discount_price}", $displayPriceDiscount, $templateHtml); + + if ($productPrices['product_price_saving']) + { + $templateHtml = str_replace("{" . $relPrefix . "product_price_saving}", $displayPriceSaving, $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_price_saving_excl_vat}", $displayPriceSaving, $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_price_saving_lbl}", $priceSavingLabel, $templateHtml); + + $templateHtml = str_replace("{" . $relPrefix . "product_price_saving_percentage}", $displayPriceSavingPercentage, $templateHtml); + } + else + { + $templateHtml = str_replace("{" . $relPrefix . "product_price_saving}", '', $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_price_saving_lbl}", '', $templateHtml); + + $templateHtml = str_replace("{" . $relPrefix . "product_price_saving_percentage}", '', $templateHtml); + } + + if ($productPrices['product_old_price']) + { + $pricePercentDiscount = 100 - ($productPrices['product_discount_price'] / $productPrices['product_old_price'] * 100); + $templateHtml = str_replace("{" . $relPrefix . "product_old_price}", $displayOldPrice, $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_old_price_lbl}", $oldPriceLabel, $templateHtml); + } + else + { + $templateHtml = str_replace("{" . $relPrefix . "product_old_price}", '', $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_old_price_lbl}", '', $templateHtml); + } + + $oldPriceNoVat = '' . $oldPriceNoVat . ''; + + $templateHtml = str_replace("{" . $relPrefix . "product_old_price_excl_vat}", $oldPriceNoVat, $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_price_novat}", $displayPriceNoVAT, $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_price_incl_vat}", $displayPriceWithVAT, $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_vat_lbl}", $vatLabel, $templateHtml); + $templateHtml = str_replace("{" . $relPrefix . "product_price_lbl}", $priceLabel, $templateHtml); + + return $templateHtml; + } +} diff --git a/libraries/redshop/helper/product/tag.php b/libraries/redshop/helper/product/tag.php new file mode 100644 index 00000000000..9e44f96553b --- /dev/null +++ b/libraries/redshop/helper/product/tag.php @@ -0,0 +1,1122 @@ +child_product_id; + } + + $product = RedshopHelperProduct::getProductById($productId); + + $productTemplate = RedshopHelperTemplate::getTemplate("product", $product->product_template); + + // Get template for stockroom status + if ($accessoryId != 0) + { + $templateHtml = RedshopHelperTemplate::getTemplate("accessory_product"); + $templateHtml = $templateHtml[0]->template_desc; + } + elseif ($relatedProductId != 0) + { + $templateHtml = RedshopHelperTemplate::getTemplate("related_product"); + $templateHtml = $templateHtml[0]->template_desc; + } + else + { + $templateHtml = $productTemplate[0]->template_desc; + } + + $productTemplate = $productTemplate[0]->template_desc; + + if ($redLayout == 'categoryproduct' || $redLayout == 'detail') + { + if (strpos($productTemplate, "{product_thumb_image_3}") !== false) + { + $productImgTag = '{product_thumb_image_3}'; + $productImgThumbHeight = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_3'); + $productImgThumbWidth = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_3'); + } + elseif (strpos($productTemplate, "{product_thumb_image_2}") !== false) + { + $productImgTag = '{product_thumb_image_2}'; + $productImgThumbHeight = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT_2'); + $productImgThumbWidth = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH_2'); + } + elseif (strpos($productTemplate, "{product_thumb_image_1}") !== false) + { + $productImgTag = '{product_thumb_image_1}'; + $productImgThumbHeight = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $productImgThumbWidth = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + else + { + $productImgTag = '{product_thumb_image}'; + $productImgThumbHeight = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_HEIGHT'); + $productImgThumbWidth = Redshop::getConfig()->get('CATEGORY_PRODUCT_THUMB_WIDTH'); + } + } + else + { + if (strpos($productTemplate, "{product_thumb_image_3}") !== false) + { + $productImgTag = '{product_thumb_image_3}'; + $productImgThumbHeight = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT_3'); + $productImgThumbWidth = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_3'); + } + elseif (strpos($productTemplate, "{product_thumb_image_2}") !== false) + { + $productImgTag = '{product_thumb_image_2}'; + $productImgThumbHeight = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT_2'); + $productImgThumbWidth = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_2'); + } + elseif (strpos($productTemplate, "{product_thumb_image_1}") !== false) + { + $productImgTag = '{product_thumb_image_1}'; + $productImgThumbHeight = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT'); + $productImgThumbWidth = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE'); + } + else + { + $productImgTag = '{product_thumb_image}'; + $productImgThumbHeight = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE_HEIGHT'); + $productImgThumbWidth = Redshop::getConfig()->get('PRODUCT_MAIN_IMAGE'); + } + } + + if (strpos($productTemplate, "{more_images_3}") !== false) + { + $moreProductsImgThumbHeight = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_3'); + $moreProductsImgThumbWidth = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_3'); + } + elseif (strpos($productTemplate, "{more_images_2}") !== false) + { + $moreProductsImgThumbHeight = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT_2'); + $moreProductsImgThumbWidth = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_2'); + } + elseif (strpos($productTemplate, "{more_images_1}") !== false) + { + $moreProductsImgThumbHeight = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $moreProductsImgThumbWidth = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); + } + else + { + $moreProductsImgThumbHeight = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE_HEIGHT'); + $moreProductsImgThumbWidth = Redshop::getConfig()->get('PRODUCT_ADDITIONAL_IMAGE'); + } + + if ($mainImgWidth != 0 || $mainImgHeight != 0) + { + $productImgThumbWidth = $mainImgWidth; + $productImgThumbHeight = $mainImgHeight; + } + + $imageAttributes = Redshop\Product\Image\Image::getDisplayMain( + $productId, $propertyId, $subPropertyId, $productImgThumbWidth, $productImgThumbHeight, $redView + ); + + $aHrefImageResponse = $imageAttributes['aHrefImageResponse']; + $mainImageResponse = $imageAttributes['mainImageResponse']; + $productMainImg = $imageAttributes['productmainimg']; + $aTitleImageResponse = $imageAttributes['aTitleImageResponse']; + $imgName = $imageAttributes['imagename']; + // $ImageAttributes['type'] = $type; + $attributeImg = $imageAttributes['attrbimg']; + $productNumber = $imageAttributes['pr_number']; + // $view = $ImageAttributes['view']; + + $propertyAdditionalImages = ""; + $subPropertyAdditionalImages = ""; + $propertyAdditionalVideos = ""; + $subPropertyAdditionalVideos = ""; + $productAvailabilityDateLabel = ''; + $productAvailabilityDate = ''; + $mediaImages = RedshopHelperMedia::getAdditionMediaImage($productId, "product"); + $mediaVideos = RedshopHelperMedia::getAdditionMediaImage($productId, "product", "youtube"); + + // Prepare additional media images. + $productAdditionalImages = self::prepareAdditionalImages( + $mediaImages, $product, $productImgThumbWidth, $productImgThumbHeight, $moreProductsImgThumbWidth, $moreProductsImgThumbHeight, true + ); + $tmpProductImages = $productAdditionalImages; + + // Prepare additional media videos. + $productAdditionalVideos = self::prepareAdditionalVideos($mediaVideos); + $tmpProductVideos = $productAdditionalVideos; + + // Prepare for property if necessary + if ($propertyId > 0) + { + $mediaImages = RedshopHelperMedia::getAdditionMediaImage($propertyId, "property"); + $mediaVideos = RedshopHelperMedia::getAdditionMediaImage($propertyId, "property", "youtube"); + + $propertyAdditionalImages = empty($mediaImages) ? $tmpProductImages : self::preparePropertyAdditionalImages( + $mediaImages, $product, $productImgThumbWidth, $productImgThumbHeight, $moreProductsImgThumbWidth, $moreProductsImgThumbHeight + ); + + $propertyAdditionalVideos = empty($mediaVideos) ? $tmpProductVideos : self::preparePropertyAdditionalVideos($mediaVideos); + } + + // Prepare for sub-property if necessary + if ($subPropertyId > 0) + { + $mediaImages = RedshopHelperMedia::getAdditionMediaImage($subPropertyId, "subproperty"); + $mediaVideos = RedshopHelperMedia::getAdditionMediaImage($subPropertyId, "subproperty", "youtube"); + + $subPropertyAdditionalImages = self::prepareSubPropertyAdditionalImages( + $mediaImages, $product, $productImgThumbWidth, $productImgThumbHeight, $moreProductsImgThumbWidth, $moreProductsImgThumbHeight + ); + + $subPropertyAdditionalVideos = self::prepareSubPropertyAdditionalVideos($mediaVideos); + } + + $response = ""; + $additionalVideos = ""; + + if (!empty($subPropertyAdditionalImages)) + { + $response = "
    " . $subPropertyAdditionalImages . "
    "; + } + elseif (!empty($propertyAdditionalImages)) + { + $response = "
    " . $propertyAdditionalImages . "
    "; + } + elseif (!empty($productAdditionalImages)) + { + $response = "
    " . $productAdditionalImages . "
    "; + } + + if (!empty($subPropertyAdditionalVideos)) + { + $additionalVideos = $subPropertyAdditionalVideos; + } + elseif (!empty($propertyAdditionalVideos)) + { + $additionalVideos = $propertyAdditionalVideos; + } + elseif (!empty($productAdditionalVideos)) + { + $additionalVideos = $productAdditionalVideos; + } + + $productAttributeDelivery = ""; + $attributeFlag = false; + + if (empty($accessoryId)) + { + if ($subPropertyId) + { + $productAttributeDelivery = productHelper::getInstance()->getProductMinDeliveryTime($productId, $subPropertyId, "subproperty", 0); + + $attributeFlag = !empty($productAttributeDelivery) ? true : false; + } + + if ($propertyId && !$attributeFlag) + { + $productAttributeDelivery = productHelper::getInstance()->getProductMinDeliveryTime($productId, $propertyId, "property", 0); + + $attributeFlag = !empty($productAttributeDelivery) ? true : false; + } + + if ($productId && !$attributeFlag) + { + $productAttributeDelivery = productHelper::getInstance()->getProductMinDeliveryTime($productId); + } + } + + $stockStatus = ''; + $stockAmountTooltip = ""; + $productInStock = 0; + $stockAmountSrc = ""; + $stockImgFlag = false; + $notifyStock = ''; + + if (Redshop::getConfig()->get('USE_STOCKROOM') == 1 && empty($accessoryId)) + { + $stockAmounts = array(); + + if ($subPropertyId) + { + $productInStock = RedshopHelperStockroom::getStockAmountWithReserve($subPropertyId, "subproperty"); + $stockAmounts = RedshopHelperStockroom::getStockAmountImage($subPropertyId, "subproperty", $productInStock); + $stockImgFlag = true; + } + + if ($propertyId && $stockImgFlag == false) + { + $productInStock = RedshopHelperStockroom::getStockAmountWithReserve($propertyId, "property"); + $stockAmounts = RedshopHelperStockroom::getStockAmountImage($propertyId, "property", $productInStock); + $stockImgFlag = true; + } + + if ($productId && $stockImgFlag == false) + { + $productInStock = RedshopHelperStockroom::getStockAmountWithReserve($productId); + $stockAmounts = RedshopHelperStockroom::getStockAmountImage($productId, "product", $productInStock); + } + + if (!empty($stockAmounts)) + { + $stockAmountTooltip = $stockAmounts[0]->stock_amount_image_tooltip; + $stockAmountSrc = REDSHOP_FRONT_IMAGES_ABSPATH . 'stockroom/' . $stockAmounts[0]->stock_amount_image; + } + } + + // Stockroom status code + if (strpos($templateHtml, "{stock_status") !== false + || strpos($templateHtml, "{stock_notify_flag}") !== false + || strpos($templateHtml, "{product_availability_date}") !== false) + { + // For current attributes + $attributeSets = array(); + + if ($product->attribute_set_id > 0) + { + $attributeSets = RedshopHelperProduct_Attribute::getProductAttribute(0, $product->attribute_set_id, 0, 1); + } + + $attributes = RedshopHelperProduct_Attribute::getProductAttribute($product->product_id); + $attributes = array_merge($attributes, $attributeSets); + $productStockStatus = productHelper::getInstance()->getproductStockStatus( + $product->product_id, count($attributes), $propertyId, $subPropertyId + ); + + if (strpos($templateHtml, "{stock_status") !== false) + { + $stockTags = strstr($templateHtml, "{stock_status:"); + $newStockTag = explode("}", $stockTags); + + $stockTag = substr($newStockTag[0], 1); + $stockTagList = explode(":", $stockTag); + + $availableClass = "available_stock_cls"; + + if (isset($stockTagList[1]) && $stockTagList[1] != "") + { + $availableClass = $stockTagList[1]; + } + + $outStockClass = "out_stock_cls"; + + if (isset($stockTagList[2]) && $stockTagList[2] != "") + { + $outStockClass = $stockTagList[2]; + } + + $preOrderClass = "pre_order_cls"; + + if (isset($stockTagList[3]) && $stockTagList[3] != "") + { + $preOrderClass = $stockTagList[3]; + } + + if (!isset($productStockStatus['regular_stock']) || !$productStockStatus['regular_stock']) + { + if (($productStockStatus['preorder'] && !$productStockStatus['preorder_stock']) + || !$productStockStatus['preorder']) + { + $stockStatus = '
    ' . JText::_('COM_REDSHOP_OUT_OF_STOCK') . '
    '; + } + else + { + $stockStatus = "
    " . JText::_('COM_REDSHOP_PRE_ORDER') . "
    "; + } + + } + else + { + $stockStatus = "
    " . JText::_('COM_REDSHOP_AVAILABLE_STOCK') . "
    "; + } + } + + RedshopLayoutHelper::renderTag( + '{stock_notify_flag}', + $templateHtml, + 'product', + array( + 'productId' => $productId, + 'propertyId' => $propertyId, + 'subPropertyId' => $subPropertyId, + 'productStockStatus' => $productStockStatus, + 'isAjax' => true + ) + ); + + if (strpos($templateHtml, "{product_availability_date}") !== false) + { + $productAvailabilityDateLabel = ""; + $productAvailabilityDate = ""; + + if ((!isset($productStockStatus['regular_stock']) || !$productStockStatus['regular_stock']) && $productStockStatus['preorder'] + && $product->product_availability_date != "") + { + $productAvailabilityDateLabel = JText::_('COM_REDSHOP_PRODUCT_AVAILABILITY_DATE_LBL') . ": "; + $productAvailabilityDate = RedshopHelperDatetime::convertDateFormat($product->product_availability_date); + } + } + } + + return array( + 'response' => $response, + 'aHrefImageResponse' => $aHrefImageResponse, + 'aTitleImageResponse' => $aTitleImageResponse, + 'mainImageResponse' => $mainImageResponse, + 'stockamountSrc' => $stockAmountSrc, + 'stockamountTooltip' => $stockAmountTooltip, + 'ProductAttributeDelivery' => $productAttributeDelivery, + 'attrbimg' => $attributeImg, + 'pr_number' => $productNumber, + 'productinstock' => $productInStock, + 'stock_status' => $stockStatus, + 'product_mainimg' => $productMainImg, + 'ImageName' => $imgName, + 'notifyStock' => $notifyStock, + 'product_availability_date_lbl' => $productAvailabilityDateLabel, + 'product_availability_date' => $productAvailabilityDate, + 'additional_vids' => $additionalVideos + ); + } + + /** + * Method for prepare additional images for product. + * + * @param array $images Array of media images. + * @param object $product Product data. + * @param integer $thumbWidth Product image thumb width. + * @param integer $thumbHeight Product image thumb height. + * @param integer $moreThumbWidth More image thumb width. + * @param integer $moreThumbHeight More image thumb height. + * @param boolean $includeProductFullImage Include product full images in list? + * + * @return string + * + * @since 2.0.7 + */ + public static function prepareAdditionalImages($images, $product, $thumbWidth, $thumbHeight, $moreThumbWidth, $moreThumbHeight, $includeProductFullImage = false) + { + if (empty($images)) + { + return ''; + } + + $return = ''; + + $isWaterMarkProductAdditionalImage = Redshop::getConfig()->get('WATERMARK_PRODUCT_ADDITIONAL_IMAGE'); + $isWaterMarkProductThumbImage = Redshop::getConfig()->get('WATERMARK_PRODUCT_THUMB_IMAGE'); + $additionalHoverImgWidth = Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_WIDTH'); + $additionalHoverImgHeight = Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_WIDTH'); + $isUseImageSizeSwapping = Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + $productAddingIsLightbox = Redshop::getConfig()->get('PRODUCT_ADDIMG_IS_LIGHTBOX'); + $defaultProductImage = Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'); + $isAdditionalHoverImage = Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_ENABLE'); + $productFullImage = null; + + // Process image list + foreach ($images as $index => $image) + { + $thumb = $image->media_name; + + if (empty($thumb) || !JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'product/' . $thumb)) + { + unset($images[$index]); + + continue; + } + + if ($thumb === $image->product_full_image) + { + unset($images[$index]); + + if (!$includeProductFullImage) + { + continue; + } + + $productFullImage = $image; + } + } + + if (null !== $productFullImage && $includeProductFullImage) + { + array_unshift($images, $productFullImage); + } + + $images = array_values($images); + + // Prepare additional media images. + foreach ($images as $index => $image) + { + $thumb = $image->media_name; + $altText = RedshopHelperMedia::getAlternativeText('product', $image->section_id, '', $image->media_id); + $altText = !$altText ? $image->media_name : $altText; + + if ($isWaterMarkProductAdditionalImage) + { + $productImg = RedshopHelperMedia::watermark('product', $thumb, $moreThumbWidth, $moreThumbHeight, "1"); + $linkImage = RedshopHelperMedia::watermark('product', $thumb, '', '', "0"); + $imageHoverPath = RedshopHelperMedia::watermark('product', $thumb, $additionalHoverImgWidth, $additionalHoverImgHeight, '2'); + } + else + { + $productImg = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'product', + $moreThumbWidth, + $moreThumbHeight, + $isUseImageSizeSwapping + ); + + $linkImage = REDSHOP_FRONT_IMAGES_ABSPATH . "product/" . $thumb; + + $imageHoverPath = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'product', + $additionalHoverImgWidth, + $additionalHoverImgHeight, + $isUseImageSizeSwapping + ); + } + + if ($productAddingIsLightbox) + { + $productAdditionalImageDivStart = '"; + $return .= $productAdditionalImageDivStart; + $return .= '' . $altText . ''; + $productHrefEnd = ""; + } + else + { + if ($isWaterMarkProductAdditionalImage) + { + $imagePath = RedshopHelperMedia::watermark('product', $thumb, $thumbWidth, $thumbHeight, '0'); + } + else + { + $imagePath = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'product', + $thumbWidth, + $thumbHeight, + $isUseImageSizeSwapping + ); + } + + $thumbFileName = REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $product->product_thumb_image; + $originalFileName = REDSHOP_FRONT_IMAGES_RELPATH . "product/" . $image->product_full_image; + + if (JFile::exists($thumbFileName)) + { + $thumbOriginal = $product->product_thumb_image; + } + elseif (JFile::exists($originalFileName)) + { + $thumbOriginal = $image->product_full_image; + } + else + { + $thumbOriginal = $defaultProductImage; + } + + if ($isWaterMarkProductThumbImage) + { + $imagePathOriginal = RedshopHelperMedia::watermark('product', $thumbOriginal, $thumbWidth, $thumbHeight, '0'); + } + else + { + $imagePathOriginal = RedshopHelperMedia::getImagePath( + $thumbOriginal, + '', + 'thumb', + 'product', + $thumbWidth, + $thumbHeight, + $isUseImageSizeSwapping + ); + } + + $productAdditionalImageDivStart = '
    '; + $productAdditionalImageDivEnd = "
    "; + $return .= $productAdditionalImageDivStart; + $return .= '' . $altText . ''; + $productHrefEnd = ""; + } + + if ($isAdditionalHoverImage) + { + $return .= '' . $altText . ''; + } + + $return .= $productHrefEnd; + $return .= $productAdditionalImageDivEnd; + } + + return $return; + } + + /** + * Method for prepare additional videos for product. + * + * @param array $videos Array of media images. + * + * @return string + * + * @since 2.0.7 + */ + public static function prepareAdditionalVideos($videos = array()) + { + if (empty($videos)) + { + return ''; + } + + $return = ''; + + foreach ($videos as $video) + { + $altText = !empty($video->media_alternate_text) ? $video->media_alternate_text : $video->media_name; + + $return .= '
    ' + . '' + . '
    '; + } + + return $return; + } + + /** + * Method for prepare additional images for product property. + * + * @param array $images Array of media images. + * @param object $product Product data. + * @param integer $thumbWidth Product image thumb width. + * @param integer $thumbHeight Product image thumb height. + * @param integer $moreThumbWidth More image thumb width. + * @param integer $moreThumbHeight More image thumb height. + * + * @return string + * + * @since 2.0.7 + */ + public static function preparePropertyAdditionalImages($images, $product, $thumbWidth, $thumbHeight, $moreThumbWidth, $moreThumbHeight) + { + if (empty($images)) + { + return ''; + } + + $return = ''; + + $productAddingIsLightbox = Redshop::getConfig()->get('PRODUCT_ADDIMG_IS_LIGHTBOX'); + $defaultProductImage = Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'); + $isUseImageSizeSwapping = Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + $isAdditionalHoverImage = Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_ENABLE'); + $additionalHoverImgWidth = Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_WIDTH'); + $additionalHoverImgHeight = Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_WIDTH'); + + foreach ($images as $image) + { + $thumb = $image->media_name; + + if (empty($thumb) || $thumb == $image->property_main_image || !JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . 'property/' . $thumb)) + { + continue; + } + + $altText = RedshopHelperMedia::getAlternativeText('property', $image->section_id, '', $image->media_id); + $altText = !$altText ? $thumb : $altText; + + if ($productAddingIsLightbox) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'property', + $moreThumbWidth, + $moreThumbHeight, + $isUseImageSizeSwapping + ); + + $propAdditionImgDivStart = '"; + $return .= $propAdditionImgDivStart; + $return .= "" . $altText . ""; + $propHrefEnd = ""; + } + else + { + $imagePath = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'property', + $thumbWidth, + $thumbHeight, + $isUseImageSizeSwapping + ); + + $propertyFileNameOriginal = REDSHOP_FRONT_IMAGES_RELPATH . "property/" . $thumb; + + if (JFile::exists($propertyFileNameOriginal)) + { + $propertyImgPathOriginal = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'property', + $thumbWidth, + $thumbHeight, + $isUseImageSizeSwapping + ); + } + else + { + $propertyImgPathOriginal = RedshopHelperMedia::getImagePath( + $defaultProductImage, + '', + 'thumb', + 'product', + $thumbWidth, + $thumbHeight, + $isUseImageSizeSwapping + ); + } + + $propAdditionImgDivStart = '
    '; + $propAdditionImgDivEnd = "
    "; + + $thumbUrl = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'property', + $moreThumbWidth, + $moreThumbHeight, + $isUseImageSizeSwapping + ); + + $return .= $propAdditionImgDivStart; + $return .= '' . $altText . ''; + + $propHrefEnd = ""; + } + + if ($isAdditionalHoverImage) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + 'property', + $additionalHoverImgWidth, + $additionalHoverImgHeight, + $isUseImageSizeSwapping + ); + + $return .= '' . $altText . ''; + } + + $return .= $propHrefEnd; + $return .= $propAdditionImgDivEnd; + } + + return $return; + } + + /** + * Method for prepare additional videos for product property. + * + * @param array $videos Array of media images. + * + * @return string + * + * @since 2.0.7 + */ + public static function preparePropertyAdditionalVideos($videos = array()) + { + if (empty($videos)) + { + return ''; + } + + $return = ''; + + foreach ($videos as $video) + { + $altText = !empty($video->media_alternate_text) ? $video->media_alternate_text : $video->media_name; + + $return .= '
    ' + . '' + . '
    '; + } + + return $return; + } + + /** + * Method for prepare additional images for product sub-property. + * + * @param array $images Array of media images. + * @param object $product Product data. + * @param integer $thumbWidth Product image thumb width. + * @param integer $thumbHeight Product image thumb height. + * @param integer $moreThumbWidth More image thumb width. + * @param integer $moreThumbHeight More image thumb height. + * + * @return string + * + * @since 2.0.7 + */ + public static function prepareSubPropertyAdditionalImages($images, $product, $thumbWidth, $thumbHeight, $moreThumbWidth, $moreThumbHeight) + { + if (empty($images)) + { + return ''; + } + + $result = ''; + + $productAddingIsLightbox = Redshop::getConfig()->get('PRODUCT_ADDIMG_IS_LIGHTBOX'); + $defaultProductImage = Redshop::getConfig()->get('PRODUCT_DEFAULT_IMAGE'); + $useImgSizeSwapping = Redshop::getConfig()->get('USE_IMAGE_SIZE_SWAPPING'); + $isAdditionalHoverImage = Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_ENABLE'); + $additionalHoverImgWidth = Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_WIDTH'); + $additionalHoverImgHeight = Redshop::getConfig()->get('ADDITIONAL_HOVER_IMAGE_WIDTH'); + + foreach ($images as $image) + { + $thumb = $image->media_name; + $folder = JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . "subproperty/" . $thumb) ? 'subproperty' : 'property'; + + if (empty($thumb) || $thumb == $image->subattribute_color_main_image + || !JFile::exists(REDSHOP_FRONT_IMAGES_RELPATH . $folder . "/" . $thumb)) + { + continue; + } + + $altText = RedshopHelperMedia::getAlternativeText('subproperty', $image->section_id, '', $image->media_id); + $altText = empty($altText) ? $thumb : $altText; + + if ($productAddingIsLightbox) + { + $divStart = '"; + + $thumbUrl = RedshopHelperMedia::getImagePath($thumb, '', 'thumb', $folder, $moreThumbWidth, $moreThumbHeight, $useImgSizeSwapping); + + $result .= $divStart; + $result .= "" . $altText . ""; + + $hrefEnd = ""; + } + else + { + $imagePath = RedshopHelperMedia::getImagePath($thumb, '', 'thumb', $folder, $thumbWidth, $thumbHeight, $useImgSizeSwapping); + + $subPropertyFileNameOriginal = REDSHOP_FRONT_IMAGES_RELPATH . "subproperty/" . $thumb; + + if (JFile::exists($subPropertyFileNameOriginal)) + { + $subPropertyImgPath = RedshopHelperMedia::getImagePath( + $image->subattribute_color_image, + '', + 'thumb', + 'subproperty', + $thumbWidth, + $thumbHeight, + $useImgSizeSwapping + ); + } + else + { + $subPropertyImgPath = $defaultProductImage; + } + + $divStart = '
    '; + $divEnd = "
    "; + + $thumbUrl = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + $folder, + $moreThumbWidth, + $moreThumbHeight, + $useImgSizeSwapping + ); + + $result .= $divStart; + $result .= '' + . '' . $altText . ''; + $hrefEnd = ""; + } + + if ($isAdditionalHoverImage) + { + $thumbUrl = RedshopHelperMedia::getImagePath( + $thumb, + '', + 'thumb', + $folder, + $additionalHoverImgWidth, + $additionalHoverImgHeight, + $useImgSizeSwapping + ); + $result .= '' . $altText . ''; + } + + $result .= $hrefEnd; + $result .= $divEnd; + } + + return $result; + } + + /** + * Method for prepare additional videos for product sub-property. + * + * @param array $videos Array of media images. + * + * @return string + * + * @since 2.0.7 + */ + public static function prepareSubPropertyAdditionalVideos($videos = array()) + { + if (empty($videos)) + { + return ''; + } + + $return = ''; + + foreach ($videos as $video) + { + $altText = !empty($video->media_alternate_text) ? $video->media_alternate_text : $video->media_name; + + $return .= '
    ' + . '' + . '
    '; + } + + return $return; + } + + /** + * Replace Attribute Data + * + * @param integer $productId Product id + * @param integer $accessoryId Accessory id + * @param array $attributes Attribute list + * @param integer $userId User id + * @param string $uniqueId Unique id + * + * @return mixed + * + * @since 2.1.0 + */ + public static function replaceAttributeData($productId = 0, $accessoryId = 0, $attributes = array(), $userId = 0, $uniqueId = "") + { + $attributeList = ""; + + $prefix = $accessoryId != 0 ? $uniqueId . "acc_" : $uniqueId . "prd_"; + + JText::script('COM_REDSHOP_ATTRIBUTE_IS_REQUIRED'); + + foreach ($attributes as $attribute) + { + $properties = RedshopHelperProduct_Attribute::getAttributeProperties(0, $attribute->attribute_id); + + if (empty($attribute->text) || empty($properties)) + { + continue; + } + + $commonId = $prefix . $productId . '_' . $accessoryId . '_' . $attribute->attribute_id; + $hiddenAttId = 'attribute_id_' . $prefix . $productId . '_' . $accessoryId; + $propertyId = 'property_id_' . $commonId; + + foreach ($properties as $property) + { + $attributesPropertyVat = 0; + + if ($property->property_price > 0) + { + $propertyOprand = $property->oprand; + $propertyPrice = RedshopHelperProductPrice::formattedPrice($property->property_price); + + // Get product vat to include. + $attributesPropertyVat = RedshopHelperProduct::getProductTax($productId, $property->property_price, $userId); + $property->property_price += $attributesPropertyVat; + + $propertyPriceWithVat = RedshopHelperProductPrice::formattedPrice($property->property_price); + + $property->text = urldecode($property->property_name) . ' (' . $propertyOprand . ' ' . $propertyPrice + . "excl. vat / " + . $propertyPriceWithVat . ")"; + } + else + { + $property->text = urldecode($property->property_name); + } + + $attributeList .= ''; + $attributeList .= ''; + $attributeList .= ''; + } + + $tmpArray = array(); + $tmpArray[0] = new stdClass; + $tmpArray[0]->value = 0; + $tmpArray[0]->text = JText::_('COM_REDSHOP_SELECT') . " " . urldecode($attribute->text); + + $newProperty = array_merge($tmpArray, $properties); + $checkList = ""; + + if ($attribute->allow_multiple_selection) + { + foreach ($properties as $property) + { + if ($attribute->attribute_required == 1) + { + $required = "required='" . $attribute->attribute_required . "'"; + } + else + { + $required = ""; + } + + $checkList .= "
     " . $property->text; + } + } + else + { + $checkList = JHtml::_( + 'select.genericlist', $newProperty, $propertyId . '[]', 'id="' . $propertyId + . '" class="inputbox" size="1" attribute_name="' . $attribute->attribute_name . '" required="' + . $attribute->attribute_required . '" onchange="javascript:changeOfflinePropertyDropdown(\'' + . $productId . '\',\'' . $accessoryId . '\',\'' . $attribute->attribute_id . '\',\'' . $uniqueId + . '\');" ', 'value', 'text', '' + ); + } + + $lists['property_id'] = $checkList; + + $attributeList .= ""; + + if ($attribute->attribute_required > 0) + { + $pos = Redshop::getConfig()->get('ASTERISK_POSITION') > 0 ? urldecode($attribute->text) + . " * " : "* " + . urldecode($attribute->text); + $attrTitle = $pos; + } + else + { + $attrTitle = urldecode($attribute->text); + } + + $attributeList .= "" . $attrTitle . " : " . $lists['property_id'] . ""; + $attributeList .= "

    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℞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%0DIjPZA0K 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 + /component/admin/language/en-GB/en-GB.com_redshop.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.com_redshop.ini + - source: >- + /component/admin/language/en-GB/en-GB.com_redshop.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.com_redshop.sys.ini + - source: >- + /component/site/language/en-GB/en-GB.com_redshop.ini + translation: >- + /src/lang/%locale%/site/%locale%/%locale%.com_redshop.ini + - source: >- + /libraries/redshop/language/en-GB/en-GB.lib_redshop.ini + translation: >- + /src/lang/%locale%/site/%locale%/%locale%.lib_redshop.ini + - source: >- + /libraries/redshop/language/en-GB/en-GB.lib_redshop.sys.ini + translation: >- + /src/lang/%locale%/site/%locale%/%locale%.lib_redshop.sys.ini + - source: >- + /modules/site/mod_redshop_cart/language/en-GB/en-GB.mod_redshop_cart.ini + translation: >- + /src/lang/%locale%/site/%locale%/%locale%.mod_redshop_cart.ini + - source: >- + /modules/site/mod_redshop_cart/language/en-GB/en-GB.mod_redshop_cart.sys.ini + translation: >- + /src/lang/%locale%/site/%locale%/%locale%.mod_redshop_cart.sys.ini + - source: >- + /modules/site/mod_redshop_search/language/en-GB/en-GB.mod_redshop_search.ini + translation: >- + /src/lang/%locale%/site/%locale%/%locale%.mod_redshop_search.ini + - source: >- + /modules/site/mod_redshop_search/language/en-GB/en-GB.mod_redshop_search.sys.ini + translation: >- + /src/lang/%locale%/site/%locale%/%locale%.mod_redshop_search.sys.ini + - source: >- + /plugins/finder/redshop/language/en-GB/en-GB.plg_finder_redshop.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_finder_redshop.ini + - source: >- + /plugins/finder/redshop/language/en-GB/en-GB.plg_finder_redshop.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_finder_redshop.sys.ini + - source: >- + /plugins/quickicon/redshop/language/en-GB/en-GB.plg_quickicon_redshop.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_quickicon_redshop.ini + - source: >- + /plugins/quickicon/redshop/language/en-GB/en-GB.plg_quickicon_redshop.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_quickicon_redshop.sys.ini + - source: >- + /plugins/redshop_alert/alert/language/en-GB/en-GB.plg_redshop_alert_alert.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_alert_alert.ini + - source: >- + /plugins/redshop_alert/alert/language/en-GB/en-GB.plg_redshop_alert_alert.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_alert_alert.sys.ini + - source: >- + /plugins/redshop_export/attribute/language/en-GB/en-GB.plg_redshop_export_attribute.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_attribute.ini + - source: >- + /plugins/redshop_export/attribute/language/en-GB/en-GB.plg_redshop_export_attribute.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_attribute.sys.ini + - source: >- + /plugins/redshop_export/category/language/en-GB/en-GB.plg_redshop_export_category.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_category.ini + - source: >- + /plugins/redshop_export/category/language/en-GB/en-GB.plg_redshop_export_category.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_category.sys.ini + - source: >- + /plugins/redshop_export/field/language/en-GB/en-GB.plg_redshop_export_field.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_field.ini + - source: >- + /plugins/redshop_export/field/language/en-GB/en-GB.plg_redshop_export_field.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_field.sys.ini + - source: >- + /plugins/redshop_export/manufacturer/language/en-GB/en-GB.plg_redshop_export_manufacturer.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_manufacturer.ini + - source: >- + /plugins/redshop_export/manufacturer/language/en-GB/en-GB.plg_redshop_export_manufacturer.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_manufacturer.sys.ini + - source: >- + /plugins/redshop_export/newsletter_subscriber/language/en-GB/en-GB.plg_redshop_export_newsletter_subscriber.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_newsletter_subscriber.ini + - source: >- + /plugins/redshop_export/newsletter_subscriber/language/en-GB/en-GB.plg_redshop_export_newsletter_subscriber.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_newsletter_subscriber.sys.ini + - source: >- + /plugins/redshop_export/product/language/en-GB/en-GB.plg_redshop_export_product.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_product.ini + - source: >- + /plugins/redshop_export/product/language/en-GB/en-GB.plg_redshop_export_product.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_product.sys.ini + - source: >- + /plugins/redshop_export/product_stockroom_data/language/en-GB/en-GB.plg_redshop_export_product_stockroom_data.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_product_stockroom_data.ini + - source: >- + /plugins/redshop_export/product_stockroom_data/language/en-GB/en-GB.plg_redshop_export_product_stockroom_data.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_product_stockroom_data.sys.ini + - source: >- + /plugins/redshop_export/related_product/language/en-GB/en-GB.plg_redshop_export_related_product.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_related_product.ini + - source: >- + /plugins/redshop_export/related_product/language/en-GB/en-GB.plg_redshop_export_related_product.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_related_product.sys.ini + - source: >- + /plugins/redshop_export/shipping_address/language/en-GB/en-GB.plg_redshop_export_shipping_address.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_shipping_address.ini + - source: >- + /plugins/redshop_export/shipping_address/language/en-GB/en-GB.plg_redshop_export_shipping_address.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_shipping_address.sys.ini + - source: >- + /plugins/redshop_export/shopper_group_attribute_price/language/en-GB/en-GB.plg_redshop_export_shopper_group_attribute_price.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_shopper_group_attribute_price.ini + - source: >- + /plugins/redshop_export/shopper_group_attribute_price/language/en-GB/en-GB.plg_redshop_export_shopper_group_attribute_price.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_shopper_group_attribute_price.sys.ini + - source: >- + /plugins/redshop_export/shopper_group_product_price/language/en-GB/en-GB.plg_redshop_export_shopper_group_product_price.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_shopper_group_product_price.ini + - source: >- + /plugins/redshop_export/shopper_group_product_price/language/en-GB/en-GB.plg_redshop_export_shopper_group_product_price.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_shopper_group_product_price.sys.ini + - source: >- + /plugins/redshop_export/user/language/en-GB/en-GB.plg_redshop_export_user.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_user.ini + - source: >- + /plugins/redshop_export/user/language/en-GB/en-GB.plg_redshop_export_user.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_export_user.sys.ini + - source: >- + /plugins/redshop_import/attribute/language/en-GB/en-GB.plg_redshop_import_attribute.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_attribute.ini + - source: >- + /plugins/redshop_import/attribute/language/en-GB/en-GB.plg_redshop_import_attribute.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_attribute.sys.ini + - source: >- + /plugins/redshop_import/category/language/en-GB/en-GB.plg_redshop_import_category.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_category.ini + - source: >- + /plugins/redshop_import/category/language/en-GB/en-GB.plg_redshop_import_category.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_category.sys.ini + - source: >- + /plugins/redshop_import/field/language/en-GB/en-GB.plg_redshop_import_field.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_field.ini + - source: >- + /plugins/redshop_import/field/language/en-GB/en-GB.plg_redshop_import_field.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_field.sys.ini + - source: >- + /plugins/redshop_import/manufacturer/language/en-GB/en-GB.plg_redshop_import_manufacturer.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_manufacturer.ini + - source: >- + /plugins/redshop_import/manufacturer/language/en-GB/en-GB.plg_redshop_import_manufacturer.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_manufacturer.sys.ini + - source: >- + /plugins/redshop_import/newsletter_subscriber/language/en-GB/en-GB.plg_redshop_import_newsletter_subscriber.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_newsletter_subscriber.ini + - source: >- + /plugins/redshop_import/newsletter_subscriber/language/en-GB/en-GB.plg_redshop_import_newsletter_subscriber.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_newsletter_subscriber.sys.ini + - source: >- + /plugins/redshop_import/product/language/en-GB/en-GB.plg_redshop_import_product.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_product.ini + - source: >- + /plugins/redshop_import/product/language/en-GB/en-GB.plg_redshop_import_product.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_product.sys.ini + - source: >- + /plugins/redshop_import/product_stockroom_data/language/en-GB/en-GB.plg_redshop_import_product_stockroom_data.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_product_stockroom_data.ini + - source: >- + /plugins/redshop_import/product_stockroom_data/language/en-GB/en-GB.plg_redshop_import_product_stockroom_data.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_product_stockroom_data.sys.ini + - source: >- + /plugins/redshop_import/related_product/language/en-GB/en-GB.plg_redshop_import_related_product.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_related_product.ini + - source: >- + /plugins/redshop_import/related_product/language/en-GB/en-GB.plg_redshop_import_related_product.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_related_product.sys.ini + - source: >- + /plugins/redshop_import/shipping_address/language/en-GB/en-GB.plg_redshop_import_shipping_address.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_shipping_address.ini + - source: >- + /plugins/redshop_import/shipping_address/language/en-GB/en-GB.plg_redshop_import_shipping_address.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_shipping_address.sys.ini + - source: >- + /plugins/redshop_import/shopper_group_attribute_price/language/en-GB/en-GB.plg_redshop_import_shopper_group_attribute_price.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_shopper_group_attribute_price.ini + - source: >- + /plugins/redshop_import/shopper_group_attribute_price/language/en-GB/en-GB.plg_redshop_import_shopper_group_attribute_price.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_shopper_group_attribute_price.sys.ini + - source: >- + /plugins/redshop_import/shopper_group_product_price/language/en-GB/en-GB.plg_redshop_import_shopper_group_product_price.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_shopper_group_product_price.ini + - source: >- + /plugins/redshop_import/shopper_group_product_price/language/en-GB/en-GB.plg_redshop_import_shopper_group_product_price.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_shopper_group_product_price.sys.ini + - source: >- + /plugins/redshop_import/user/language/en-GB/en-GB.plg_redshop_import_user.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_user.ini + - source: >- + /plugins/redshop_import/user/language/en-GB/en-GB.plg_redshop_import_user.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_import_user.sys.ini + - source: >- + /plugins/redshop_payment/rs_payment_banktransfer/language/en-GB/en-GB.plg_redshop_payment_rs_payment_banktransfer.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_payment_rs_payment_banktransfer.ini + - source: >- + /plugins/redshop_payment/rs_payment_banktransfer/language/en-GB/en-GB.plg_redshop_payment_rs_payment_banktransfer.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_payment_rs_payment_banktransfer.sys.ini + - source: >- + /plugins/redshop_payment/rs_payment_paypal/language/en-GB/en-GB.plg_redshop_payment_rs_payment_paypal.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_payment_rs_payment_paypal.ini + - source: >- + /plugins/redshop_payment/rs_payment_paypal/language/en-GB/en-GB.plg_redshop_payment_rs_payment_paypal.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_payment_rs_payment_paypal.sys.ini + - source: >- + /plugins/redshop_pdf/tcpdf/language/en-GB/en-GB.plg_redshop_pdf_tcpdf.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_pdf_tcpdf.ini + - source: >- + /plugins/redshop_pdf/tcpdf/language/en-GB/en-GB.plg_redshop_pdf_tcpdf.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_pdf_tcpdf.sys.ini + - source: >- + /plugins/redshop_shipping/default_shipping/language/en-GB/en-GB.plg_redshop_shipping_default_shipping.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_shipping_default_shipping.ini + - source: >- + /plugins/redshop_shipping/default_shipping/language/en-GB/en-GB.plg_redshop_shipping_default_shipping.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_redshop_shipping_default_shipping.sys.ini + - source: >- + /plugins/search/redshop_categories/language/en-GB/en-GB.plg_search_redshop_categories.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_search_redshop_categories.ini + - source: >- + /plugins/search/redshop_categories/language/en-GB/en-GB.plg_search_redshop_categories.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_search_redshop_categories.sys.ini + - source: >- + /plugins/search/redshop_products/language/en-GB/en-GB.plg_search_redshop_products.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_search_redshop_products.ini + - source: >- + /plugins/search/redshop_products/language/en-GB/en-GB.plg_search_redshop_products.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_search_redshop_products.sys.ini + - source: >- + /plugins/sh404sefextplugins/sh404sefextplugincom_redshop/language/en-GB/en-GB.plg_sh404sefextplugins_sh404sefextplugincom_redshop.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_sh404sefextplugins_sh404sefextplugincom_redshop.ini + - source: >- + /plugins/sh404sefextplugins/sh404sefextplugincom_redshop/language/en-GB/en-GB.plg_sh404sefextplugins_sh404sefextplugincom_redshop.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_sh404sefextplugins_sh404sefextplugincom_redshop.sys.ini + - source: >- + /plugins/system/redgoogleanalytics/language/en-GB/en-GB.plg_system_redgoogleanalytics.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_system_redgoogleanalytics.ini + - source: >- + /plugins/system/redgoogleanalytics/language/en-GB/en-GB.plg_system_redgoogleanalytics.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_system_redgoogleanalytics.sys.ini + - source: >- + /plugins/system/redshop/language/en-GB/en-GB.plg_system_redshop.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_system_redshop.ini + - source: >- + /plugins/system/redshop/language/en-GB/en-GB.plg_system_redshop.sys.ini + translation: >- + /src/lang/%locale%/admin/%locale%/%locale%.plg_system_redshop.sys.ini \ No newline at end of file diff --git a/docs/releases/2.0.7.md b/docs/releases/2.0.7.md new file mode 100644 index 00000000000..1c12ca3cc16 --- /dev/null +++ b/docs/releases/2.0.7.md @@ -0,0 +1,35 @@ +# 2.0.7 Release notes + + +## Task + +* [REDSHOP-4508] - Remove ROOT in Breadcrumb +* [REDSHOP-4522] - Move replace shipping GLS to plugin +* [REDSHOP-4564] - Create order status log tag in Order detail +* [REDSHOP-4611] - Update Nganluong payment plugin to the lastest verion +* [REDSHOP-4613] - Cannot save custom fields in category detail page +* [REDSHOP-3774] - Replace JRequest with JInput in component/admin/models +* [REDSHOP-3787] - Replace JRequest with JInput in component/admin/view & /wizard + + +## Improvement + +* [REDSHOP-2486] - move all JRequest to JInput +* [REDSHOP-3572] - Improve query filter when search with keyword +* [REDSHOP-3617] - REFACTOR: plugins/rs_vies_registration/rs_vies_registration +* [REDSHOP-4088] - REFACTOR: Mail +* [REDSHOP-4350] - Checkout - missing product inside cart. +* [REDSHOP-4425] - Prevent space in image URL when render invoice PDF +* [REDSHOP-4550] - [Refactor] Voucher + + +## Bug + +* [REDSHOP-3879] - Order - New order - "Special discount" and " Special discount" is working incorrect. +* [REDSHOP-3928] - Create mass discount - Fill on date is text. Get error 0 Failed to parse time string +* [REDSHOP-4133] - redSHOP Category Module disappear +* [REDSHOP-4548] - Custom fields settings are not working +* [REDSHOP-4549] - Missing categories in product management filter +* [REDSHOP-4597] - Radio buttons for credit cards are hidden on checkout page +* [REDSHOP-4700] - Voucher working incorrect . +* [REDSHOP-4817] - [Export] Missing number of users when exporting list of user redshop \ No newline at end of file diff --git a/docs/releases/2.1.0.md b/docs/releases/2.1.0.md new file mode 100644 index 00000000000..d9b28f364bd --- /dev/null +++ b/docs/releases/2.1.0.md @@ -0,0 +1,68 @@ +# 2.1.0 Release notes + +## New Feature + +* [REDSHOP-4759] - Allow system can config products can have individual payment. +* [REDSHOP-4844] - Administrator > Group for fields +* [REDSHOP-4875] - Tool > Fix image size + Clean thumbnail +* [REDSHOP-4910] - Tools > Migrate Files & DB + + +## Task + +* [REDSHOP-4708] - Adding plugin event for Quantity on Stock + + +## Improvement + +* [REDSHOP-3396] - REFACTOR: Coupon +* [REDSHOP-3399] - REFACTOR: Currency +* [REDSHOP-3415] - REFACTOR: Manufacturer +* [REDSHOP-3610] - REFACTOR: plugins/finder/redshop +* [REDSHOP-4099] - REFACTOR: Shipping Box +* [REDSHOP-4107] - REFACTOR: Text Library +* [REDSHOP-4792] - REFACTOR: Template layout file path +* [REDSHOP-4813] - REFACTOR: Discount on order total +* [REDSHOP-4118] - Implement new structure for store image +* [REDSHOP-4311] - Re-write "Import from VirtueMart 3.x" +* [REDSHOP-4730] - Adding Plugin event for User Edit +* [REDSHOP-4734] - Search Module - Add param for exclude categories +* [REDSHOP-4739] - Implement IF tag for custom field +* [REDSHOP-4760] - Improve Onestepchekout validate shipping information for anonymous user +* [REDSHOP-4761] - Implement Procedure SQL to prevent SQL errors when update from old version. +* [REDSHOP-4768] - Move Payment radio button to layout +* [REDSHOP-4839] - Use Bootstrap DateTimePicker for calendar, replace current Joomla calendar +* [REDSHOP-4865] - Economic: Refactor plugin and change to use RESTFUL +* [REDSHOP-4892] - Standardlize Javascript & CSS folders structure and files + + +## Bug + +* [REDSHOP-4709] - GLS pickup locations error +* [REDSHOP-4711] - Image title missing on attribute images +* [REDSHOP-4712] - The image has the watermark even Watermark config disabled +* [REDSHOP-4713] - Modal box for wishlist doesn't work +* [REDSHOP-4714] - Delete cart item not working +* [REDSHOP-4728] - Edit Additional Images, it disappear +* [REDSHOP-4732] - GLS label printer start printing out labels when client goes to page 2 in the order overview. He does not click on "Export GLS" it simply just starts printing out labels +* [REDSHOP-4737] - Import Stockroom is not working +* [REDSHOP-4741] - Can not download PDF files from product documents +* [REDSHOP-4752] - One step checkout - Choose shipping address different with billing address is not work. +* [REDSHOP-4753] - Coupons doesn't seem to work correct when more than one item (one with discount and one without) is added to Cart +* [REDSHOP-4755] - Can not update / change attribute in cart +* [REDSHOP-4756] - Add to cart - check minimum value working incorrect +* [REDSHOP-4815] - Can not add attribute price +* [REDSHOP-4842] - Search bar returns non-sh404sef urls +* [REDSHOP-4851] - Media alternative text for product image always display media name +* [REDSHOP-4852] - Product link not work if use in category detail with {include_sub_category_product} tag +* [REDSHOP-4856] - One step checkout - Bussiness - check wrong value +* [REDSHOP-4864] - Value of template tag {product_old_price} does not include VAT +* [REDSHOP-4894] - Category ID - SH404SEF error link +* [REDSHOP-4895] - Product detail attributes - can not save attribute images which is selected from media button +* [REDSHOP-4901] - Fixing wrong syntax when saving Quotation Userfield on frontend +* [REDSHOP-4904] - VAT working incorrect at frontpage +* [REDSHOP-4907] - Editor auto strip comment "" and we lost some tags after save in template editor +* [REDSHOP-4920] - Site > Category detail, tag {pagination} not show pagination +* [REDSHOP-4926] - GLS location not showing in order details +* [REDSHOP-4927] - Required field for file upload (product userfield, type = "Documents") is not promting with JS alert when adding to cart +* [REDSHOP-4938] - Modifying prices in "Products Price", lost all discount prices of all products \ No newline at end of file diff --git a/gulp-config.json.dist b/gulp-config.json.dist new file mode 100644 index 00000000000..54aa5a91e8f --- /dev/null +++ b/gulp-config.json.dist @@ -0,0 +1,11 @@ +{ + "wwwDir" : "/home/travis/build/redCOMPONENT-COM/redSHOP/tests/joomla-cms", + "browserConfig" : { + "proxy" : "redshop.local" + }, + "releaseDir" : "./tests/releases/", + "basePaths": { + "plugins" : "./plugins", + "modules" : "./modules" + } +} \ No newline at end of file diff --git a/gulp-config.json.jenkins.dist b/gulp-config.json.jenkins.dist new file mode 100644 index 00000000000..61bc61f5e90 --- /dev/null +++ b/gulp-config.json.jenkins.dist @@ -0,0 +1,12 @@ +{ + "wwwDir" : "/tests/www/tests/joomla-cms", + "browserConfig" : { + "proxy" : "redshop.local" + }, + "releaseDir" : "/tests/www/tests/releases/", + "basePaths": { + "plugins" : "./plugins", + "modules" : "./modules" + }, + "php_dir" : "php" +} diff --git a/gulp-config.sample.json b/gulp-config.sample.json new file mode 100644 index 00000000000..54aa5a91e8f --- /dev/null +++ b/gulp-config.sample.json @@ -0,0 +1,11 @@ +{ + "wwwDir" : "/home/travis/build/redCOMPONENT-COM/redSHOP/tests/joomla-cms", + "browserConfig" : { + "proxy" : "redshop.local" + }, + "releaseDir" : "./tests/releases/", + "basePaths": { + "plugins" : "./plugins", + "modules" : "./modules" + } +} \ No newline at end of file diff --git a/gulp-extensions.json b/gulp-extensions.json new file mode 100644 index 00000000000..1bb8a2346ec --- /dev/null +++ b/gulp-extensions.json @@ -0,0 +1,78 @@ +{ + "components": [ + "redshop", + "redshop.assets" + ], + "libraries": [ + "redshop" + ], + "modules": { + "frontend": [ + "redshop_cart", + "redshop_search" + ] + }, + "plugins": { + "finder": [ + "redshop" + ], + "quickicon": [ + "redshop" + ], + "redshop_alert": [ + "alert" + ], + "redshop_export": [ + "attribute", + "category", + "field", + "manufacturer", + "newsletter_subscriber", + "product", + "product_stockroom_data", + "related_product", + "shipping_address", + "shopper_group_attribute_price", + "shopper_group_product_price", + "user" + ], + "redshop_import": [ + "attribute", + "category", + "field", + "manufacturer", + "newsletter_subscriber", + "product", + "product_stockroom_data", + "shipping_address", + "shopper_group_product_price", + "shopper_group_attribute_price", + "user", + "related_product" + ], + "redshop_payment": [ + "rs_payment_banktransfer", + "rs_payment_paypal" + ], + "redshop_pdf": [ + "tcpdf" + ], + "redshop_shipping": [ + "default_shipping" + ], + "search": [ + "redshop_categories", + "redshop_products" + ], + "sh404sefextplugins": [ + "sh404sefextplugincom_redshop" + ], + "system": [ + "redgoogleanalytics", + "redshop" + ], + "redshop_product": [ + "sh404urls" + ] + } +} diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000000..57611172ec0 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,132 @@ +var gulp = require("gulp"); +var gutil = require('gulp-util'); +var sass = require("gulp-sass"); +var composer = require('gulp-composer'); +var zip = require("gulp-zip"); +var hashsum = require("gulp-hashsum"); +var clean = require('gulp-clean'); +var argv = require("yargs").argv; +var requireDir = require("require-dir"); +var fs = require("fs"); +var path = require("path"); +var glob = require('glob'); +// XML parser +var xml2js = require("xml2js"); + +var extension = require("./package.json"); +var joomlaGulp = requireDir("./node_modules/joomla-gulp", {recurse: true}); +var jgulp = requireDir("./jgulp", {recurse: true}); +var parser = new xml2js.Parser(); + +global.config = require("./gulp-config.json"); +/** + * Function for read list folder + * + * @param string dir Path of folder + * + * @return array Subfolder list. + */ +global.getFolders = function getFolders(dir){ + return fs.readdirSync(dir) + .filter(function(file){ + return fs.statSync(path.join(dir, file)).isDirectory(); + } + ); +} + +/** + * Output log + * + * @param extension + * @param group + * @param extName + * @param version + * @param releasePath + */ +global.renderLog = function renderLog(extension, group, extName, version, releasePath){ + // We will output where release package is going so it is easier to find + gutil.log( + gutil.colors.green(extension), + " | ", + gutil.colors.white(group), + " | ", + gutil.colors.blue(extName), + " | ", + gutil.colors.yellow(version), + "| ", + gutil.colors.grey(releasePath) + ); +} + +/** + * Get glob of an extension + * + * @param extensionType + * @param group + * @param extName + * @returns {[*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*]} + */ +global.getGlobExtensionPattern = function getGlobExtensionPattern(extensionType, group, extName) +{ + return [ + './' + extensionType + '/' + group + '/' + extName + '/**', + '!./' + extensionType + '/' + group + '/' + extName + '/**/composer.json', + '!./' + extensionType + '/' + group + '/' + extName + '/**/composer.lock', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/*.md', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/*.txt', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/*.TXT', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/*.pdf', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/LICENSE', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/CHANGES', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/README', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/VERSION', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/composer.json', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/.gitignore', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/docs', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/docs/**', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/tests', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/tests/**', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/unitTests', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/unitTests/**', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/.git', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/.git/**', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/examples', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/examples/**', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/build.xml', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/phpunit.xml', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/phpunit.xml.dist', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/**/phpcs.xml', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/mpdf/mpdf/ttfonts/!(DejaVu*.ttf)', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/setasign/fpdi', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/setasign/fpdi/**', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/tecnickcom/tcpdf/fonts/!(courier*.php|helvetica*.php|symbol*.php|times*.php|uni2cid_a*.php|zapfdingbats*.php)', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/tecnickcom/tcpdf/fonts/ae_fonts*/**', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/tecnickcom/tcpdf/fonts/dejavu-fonts-ttf*/**', + '!./' + extensionType + '/' + group + '/' + extName + '/**/vendor/tecnickcom/tcpdf/fonts/freefont-*/**' + ] +} + +/** + * Execute composer to get vendor + * + * @param composerPath + */ +global.executeComposer = function executeComposer (composerPath) +{ + gutil.log("Composer found: ", gutil.colors.blue(composerPath)); + composer({cwd: composerPath, bin: 'php ./composer.phar'}); +} + +gulp.task("composer", function(){ + glob("**/composer.json", [], function (er, files) { + for (var i = 0; i < files.length; i++) { + var composerPath = path.dirname(files[i]); + + // Make sure this is not composer.json inside vendor library + if (composerPath.indexOf("vendor") == -1 && composerPath != '.') { + gutil.log("Composer found: ", gutil.colors.blue(composerPath)); + composer({cwd: composerPath, bin: 'php ./composer.phar'}); + } + } + }); +}); diff --git a/install.php b/install.php new file mode 100644 index 00000000000..707ade823c7 --- /dev/null +++ b/install.php @@ -0,0 +1,928 @@ +installLibraries($parent); + $this->installModules($parent); + $this->installPlugins($parent); + } + + /** + * method to run after an install/update/uninstall method + * + * @param string $type Type of method + * @param object $parent Parent class call this method + * + * @return void + * + * @since 2.0.0 + * + * @throws Exception + */ + public function postflight($type, $parent) + { + // Respond json for ajax request and redirect with standard request + if( + isset($_SERVER['HTTP_X_REQUESTED_WITH']) && + strcasecmp($_SERVER['HTTP_X_REQUESTED_WITH'], 'xmlhttprequest') == 0 + ){ + + $response = new JResponseJson(array('redirect' =>'index.php?option=com_redshop&view=install&install_type=' . $type)); + + header('Content-type: application/json'); + echo $response; + + JFactory::getApplication()->close(); + } + + JFactory::getApplication()->redirect('index.php?option=com_redshop&view=install&install_type=' . $type); + } + + /** + * method to uninstall the component + * + * @param object $parent Class calling this method + * + * @return void + */ + public function uninstall($parent) + { + // Uninstall extensions + $this->uninstallPlugins($parent); + $this->uninstallModules($parent); + $this->uninstallLibraries($parent); + } + + /** + * Method to update the component + * + * @param object $parent Class calling this method + * + * @return void + */ + public function update($parent) + { + $this->installLibraries($parent); + $this->installModules($parent); + $this->installPlugins($parent); + } + + /** + * method to run before an install/update/uninstall method + * + * @param object $type Type of change (install, update or discover_install) + * @param object $parent Class calling this method + * + * @return void + * + * @throws Exception + */ + public function preflight($type, $parent) + { + $this->type = $type; + + $this->implementProcedure(); + + if ($type == 'update' || $type == 'discover_install') + { + if (!class_exists('RedshopHelperJoomla')) + { + require_once __DIR__ . '/libraries/redshop/helper/joomla.php'; + } + + // Store redSHOP old version. + JFactory::getApplication()->setUserState('redshop.old_version', RedshopHelperJoomla::getManifestValue('version')); + } + } + + /** + * Get the common JInstaller instance used to install all the extensions + * + * @return JInstaller The JInstaller object + */ + public function getInstaller() + { + $this->installer = new JInstaller; + + return $this->installer; + } + + /** + * Install the package libraries + * + * @param object $parent Class calling this method + * + * @return void + */ + protected function installLibraries($parent) + { + // Required objects + $manifest = $parent->get('manifest'); + $src = $parent->getParent()->getPath('source'); + + if ($nodes = $manifest->libraries->library) + { + $installer = $this->getInstaller(); + + foreach ($nodes as $node) + { + $extName = $node->attributes()->name; + $extPath = $src . '/libraries/' . $extName; + + // Standard install + if (is_dir($extPath)) + { + $installer->install($extPath); + } + // Discover install + elseif ($extId = $this->searchExtension($extName, 'library', '-1')) + { + $installer->discover_install($extId); + } + } + } + } + + /** + * Install the package modules + * + * @param object $parent Class calling this method + * + * @return void + */ + protected function installModules($parent) + { + // Required objects + $manifest = $parent->get('manifest'); + $src = $parent->getParent()->getPath('source'); + + if ($nodes = $manifest->modules->module) + { + foreach ($nodes as $node) + { + $extName = (string) $node->attributes()->name; + $extClient = (string) $node->attributes()->client; + $extPath = $src . '/modules/' . $extClient . '/' . $extName; + + if (is_dir($extPath)) + { + $this->getInstaller()->install($extPath); + } + // Discover install + elseif ($extId = $this->searchExtension($extName, 'module', '-1')) + { + $this->getInstaller()->discover_install($extId); + } + } + } + } + + /** + * Install the package libraries + * + * @param object $parent Class calling this method + * + * @return void + */ + protected function installPlugins($parent) + { + // Required objects + $manifest = $parent->get('manifest'); + $src = $parent->getParent()->getPath('source'); + + if ($nodes = $manifest->plugins->plugin) + { + $installer = $this->getInstaller(); + + foreach ($nodes as $node) + { + $extName = (string) $node->attributes()->name; + $extGroup = (string) $node->attributes()->group; + $extPath = $src . '/plugins/' . $extGroup . '/' . $extName; + $result = 0; + + // Install or upgrade plugin + if (is_dir($extPath)) + { + $installer->setAdapter('plugin'); + $result = $installer->install($extPath); + } + // Discover install + elseif ($extId = $this->searchExtension($extName, 'plugin', '-1', $extGroup)) + { + $result = $installer->discover_install($extId); + } + + // We'll not enable plugin for update case + if ($this->type != 'update' && $result) + { + /* + * For another rest type cases + * Do not change plugin state if it's installed + * If plugin is installed successfully and it didn't exist before we enable it. + */ + $this->enablePlugin($extName, $extGroup); + } + + // Force to enable redSHOP - System plugin by anyways + $this->enablePlugin('redshop', 'system'); + + // Force to enable redSHOP PDF - TcPDF plugin by anyways + $this->enablePlugin('tcpdf', 'redshop_pdf'); + + // Force to enable redSHOP Export - Attribute plugin by anyways + $this->enablePlugin('attribute', 'redshop_export'); + + // Force to enable redSHOP Export - Category plugin by anyways + $this->enablePlugin('category', 'redshop_export'); + + // Force to enable redSHOP Export - Field plugin by anyways + $this->enablePlugin('field', 'redshop_export'); + + // Force to enable redSHOP Export - Manufacturer plugin by anyways + $this->enablePlugin('manufacturer', 'redshop_export'); + + // Force to enable redSHOP Export - Newsletter Subscriber plugin by anyways + $this->enablePlugin('newsletter_subscriber', 'redshop_export'); + + // Force to enable redSHOP Export - Product plugin by anyways + $this->enablePlugin('product', 'redshop_export'); + + // Force to enable redSHOP Export - Product Stockroom Data plugin by anyways + $this->enablePlugin('product_stockroom_data', 'redshop_export'); + + // Force to enable redSHOP Export - Related Product plugin by anyways + $this->enablePlugin('related_product', 'redshop_export'); + + // Force to enable redSHOP Export - Shipping Address plugin by anyways + $this->enablePlugin('shipping_address', 'redshop_export'); + + // Force to enable redSHOP Export - Shopper Group Attribute Price plugin by anyways + $this->enablePlugin('shopper_group_attribute_price', 'redshop_export'); + + // Force to enable redSHOP Export - Shopper Group Product Price plugin by anyways + $this->enablePlugin('shopper_group_product_price', 'redshop_export'); + + // Force to enable redSHOP Export - User plugin by anyways + $this->enablePlugin('user', 'redshop_export'); + + // Force to enable redSHOP Import - Attribute plugin by anyways + $this->enablePlugin('attribute', 'redshop_import'); + + // Force to enable redSHOP Import - Category plugin by anyways + $this->enablePlugin('category', 'redshop_import'); + + // Force to enable redSHOP Import - Field plugin by anyways + $this->enablePlugin('field', 'redshop_import'); + + // Force to enable redSHOP Import - Manufacturer plugin by anyways + $this->enablePlugin('manufacturer', 'redshop_import'); + + // Force to enable redSHOP Import - Newsletter Subscriber plugin by anyways + $this->enablePlugin('newsletter_subscriber', 'redshop_import'); + + // Force to enable redSHOP Import - Product plugin by anyways + $this->enablePlugin('product', 'redshop_import'); + + // Force to enable redSHOP Import - Product Stockroom Data plugin by anyways + $this->enablePlugin('product_stockroom_data', 'redshop_import'); + + // Force to enable redSHOP Import - Related Product plugin by anyways + $this->enablePlugin('related_product', 'redshop_import'); + + // Force to enable redSHOP Import - Shipping Address plugin by anyways + $this->enablePlugin('shipping_address', 'redshop_import'); + + // Force to enable redSHOP Import - Shopper Group Attribute Price plugin by anyways + $this->enablePlugin('shopper_group_attribute_price', 'redshop_import'); + + // Force to enable redSHOP Import - Shopper Group Product Price plugin by anyways + $this->enablePlugin('shopper_group_product_price', 'redshop_import'); + + // Force to enable redSHOP Import - User plugin by anyways + $this->enablePlugin('user', 'redshop_import'); + } + } + } + + /** + * Method for enable plugins + * + * @param string $extName Plugin name + * @param string $extGroup Plugin group + * @param int $state State of plugins + * + * @return mixed + */ + protected function enablePlugin($extName, $extGroup, $state = 1) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + $query->update($db->qn("#__extensions")) + ->set("enabled = " . (int) $state) + ->where('type = ' . $db->quote('plugin')) + ->where('element = ' . $db->quote($extName)) + ->where('folder = ' . $db->quote($extGroup)); + + return $db->setQuery($query)->execute(); + } + + /** + * Uninstall the package libraries + * + * @param object $parent Class calling this method + * + * @return void + */ + protected function uninstallLibraries($parent) + { + // Required objects + $manifest = $parent->get('manifest'); + + if ($nodes = $manifest->libraries->library) + { + foreach ($nodes as $node) + { + $extName = (string) $node->attributes()->name; + + if ($extId = $this->searchExtension($extName, 'library')) + { + $this->getInstaller()->uninstall('library', $extId); + } + } + } + } + + /** + * Uninstall the package modules + * + * @param object $parent Class calling this method + * + * @return void + */ + protected function uninstallModules($parent) + { + // Required objects + $manifest = $parent->get('manifest'); + + if ($nodes = $manifest->modules->module) + { + foreach ($nodes as $node) + { + $extName = (string) $node->attributes()->name; + $extClient = (string) $node->attributes()->client; + + if ($extId = $this->searchExtension($extName, 'module')) + { + $this->getInstaller()->uninstall('module', $extId); + } + } + } + } + + /** + * Uninstall the package plugins + * + * @param object $parent Class calling this method + * + * @return void + */ + protected function uninstallPlugins($parent) + { + // Required objects + $manifest = $parent->get('manifest'); + + if ($nodes = $manifest->plugins->plugin) + { + $installer = $this->getInstaller(); + + foreach ($nodes as $node) + { + $extName = (string) $node->attributes()->name; + $extGroup = (string) $node->attributes()->group; + + if ($extId = $this->searchExtension($extName, 'plugin', null, $extGroup)) + { + $installer->uninstall('plugin', $extId); + } + } + } + } + + /** + * Search a extension in the database + * + * @param string $element Extension technical name/alias + * @param string $type Type of extension (component, file, language, library, module, plugin) + * @param string $state State of the searched extension + * @param string $folder Folder name used mainly in plugins + * + * @return integer Extension identifier + */ + protected function searchExtension($element, $type, $state = null, $folder = null) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('extension_id') + ->from($db->quoteName("#__extensions")) + ->where("type = " . $db->quote($type)) + ->where("element = " . $db->quote($element)); + + if (!is_null($state)) + { + $query->where("state = " . (int) $state); + } + + if (!is_null($folder)) + { + $query->where("folder = " . $db->quote($folder)); + } + + $db->setQuery($query); + + return $db->loadResult(); + } + + /** + * Method for implement procedure function for MySQL server only + * + * @return void + * + * @since 2.1.0 + */ + protected function implementProcedure() + { + $this->procedureRemoveColumn(); + $this->procedureUpdateColumn(); + $this->procedureIndexRemove(); + $this->procedureIndexAdd(); + $this->procedureUniqueIndexAdd(); + $this->procedureFulltextIndexAdd(); + $this->procedureConstraintRemove(); + $this->procedureConstraintUpdate(); + $this->procedurePrimaryRemove(); + $this->procedurePrimaryAdd(); + } + + /** + * Method for implement procedure "redSHOP_Column_Update" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedureUpdateColumn() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Column_Update'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Column_Update") . "( + IN " . $db->qn('tableName') . " VARCHAR(50), + IN " . $db->qn('columnName') . " VARCHAR(50), + IN " . $db->qn('newColumnName') . " VARCHAR(50), + IN " . $db->qn('columnDetail') . " VARCHAR(255) + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to update / add column to table avoid unexpected errors.') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET columnDetail = REPLACE(columnDetail, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + set @ColOldExist = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE COLUMN_NAME=columnName AND TABLE_NAME=tableName AND table_schema = DATABASE()); + set @ColNewExist = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE COLUMN_NAME=newColumnName AND TABLE_NAME=tableName AND table_schema = DATABASE()); + IF (@ColOldExist = 0 AND @ColNewExist = 0) THEN + /* Both column doesn't exist. Just add column */ + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` ADD COLUMN `',newColumnName,'` ',columnDetail); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + ELSEIF (@ColOldExist = 1 AND @ColNewExist = 0) THEN + /* Old column exist. New column not exist. Change column */ + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` CHANGE `',columnName,'` ','`',newColumnName,'` ',columnDetail); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + ELSEIF (@ColOldExist = 0 AND @ColNewExist = 1) THEN + /* Old column not exist. New column exist. Update column */ + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` CHANGE `',newColumnName,'` ','`',newColumnName,'` ',columnDetail); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + ELSE + /* Old column exist. New column exist. */ + IF (columnName <> newColumnName) THEN + /* Old column is different with new column and both exist => The old column had to be remove */ + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` DROP COLUMN `',columnName,'`'); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + END IF ; + + /* Update structure of new column column */ + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` CHANGE `',newColumnName,'` ','`',newColumnName,'` ',columnDetail); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + END IF; + END"; + + $db->setQuery($query)->execute(); + } + + /** + * Method for implement procedure "redSHOP_Column_Remove" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedureRemoveColumn() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Column_Remove'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Column_Remove") . "( + IN " . $db->qn('tableName') . " VARCHAR(50), + IN " . $db->qn('columnName') . " VARCHAR(50) + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to remove column to table avoid unexpected errors.') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + IF ((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE COLUMN_NAME=columnName AND TABLE_NAME=tableName AND table_schema = DATABASE()) >= 1) + THEN + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` DROP COLUMN `',columnName,'`'); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + END IF ; + END"; + + $db->setQuery($query)->execute(); + } + + /** + * Method for implement procedure "redSHOP_Index_Remove" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedureIndexRemove() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Index_Remove'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Index_Remove") . "( + IN " . $db->qn('tableName') . " VARCHAR(50), + IN " . $db->qn('indexName') . " VARCHAR(50) + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to remove index from table avoid unexpected errors.') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET indexName = REPLACE(indexName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + IF ((SELECT COUNT(*) AS index_exists FROM information_schema.statistics WHERE TABLE_SCHEMA = DATABASE() and table_name = tableName AND index_name = indexName) >= 1) + THEN + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` DROP INDEX `',indexName,'`'); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + END IF ; + END"; + + $db->setQuery($query)->execute(); + } + + /** + * Method for implement procedure "redSHOP_Index_Add" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedureIndexAdd() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Index_Add'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Index_Add") . "( + IN " . $db->qn('tableName') . " VARCHAR(50), + IN " . $db->qn('indexName') . " VARCHAR(50), + IN " . $db->qn('indexData') . " VARCHAR(255) + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to Add index to table avoid unexpected errors..') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET indexName = REPLACE(indexName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET indexData = REPLACE(indexData, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + CALL redSHOP_Index_Remove(tableName, indexName) ; + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` ADD INDEX `',indexName,'` ',indexData); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + END"; + + $db->setQuery($query)->execute(); + } + + /** + * Method for implement procedure "redSHOP_Index_Unique_Add" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedureUniqueIndexAdd() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Index_Unique_Add'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Index_Unique_Add") . "( + IN " . $db->qn('tableName') . " VARCHAR(50), + IN " . $db->qn('indexName') . " VARCHAR(50), + IN " . $db->qn('indexData') . " VARCHAR(255) + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to Add Unique Index to table avoid unexpected errors..') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET indexName = REPLACE(indexName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET indexData = REPLACE(indexData, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + CALL redSHOP_Index_Remove(tableName, indexName); + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` ADD UNIQUE INDEX `',indexName,'` ',indexData); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + END"; + + $db->setQuery($query)->execute(); + } + + /** + * Method for implement procedure "redSHOP_Index_Fulltext_Add" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedureFulltextIndexAdd() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Index_Fulltext_Add'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Index_Fulltext_Add") . "( + IN " . $db->qn('tableName') . " VARCHAR(50), + IN " . $db->qn('indexName') . " VARCHAR(50), + IN " . $db->qn('indexData') . " VARCHAR(255) + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to Add Unique Index to table avoid unexpected errors..') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET indexName = REPLACE(indexName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET indexData = REPLACE(indexData, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + CALL redSHOP_Index_Remove(tableName, indexName); + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` ADD FULLTEXT INDEX `',indexName,'` ',indexData); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + END"; + + $db->setQuery($query)->execute(); + } + + /** + * Method for implement procedure "redSHOP_Constraint_Remove" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedureConstraintRemove() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Constraint_Remove'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Constraint_Remove") . "( + IN " . $db->qn('tableName') . " VARCHAR(50), + IN " . $db->qn('refName') . " VARCHAR(50) + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to Add Constraint (Foreign Key) to table avoid unexpected errors..') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET refName = REPLACE(refName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + IF ((SELECT COUNT(*) AS constraint_exists FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = DATABASE() and TABLE_NAME = tableName AND CONSTRAINT_NAME = refName AND CONSTRAINT_TYPE = 'FOREIGN KEY') >= 1) + THEN + SET FOREIGN_KEY_CHECKS = 0; + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` DROP FOREIGN KEY `',refName,'`'); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + SET FOREIGN_KEY_CHECKS = 1; + END IF ; + END"; + + $db->setQuery($query)->execute(); + } + + /** + * Method for implement procedure "redSHOP_Constraint_Update" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedureConstraintUpdate() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Constraint_Update'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Constraint_Update") . "( + IN " . $db->qn('tableName') . " VARCHAR(50), + IN " . $db->qn('constraintName') . " VARCHAR(50), + IN " . $db->qn('columnName') . " VARCHAR(50), + IN " . $db->qn('tableRef') . " VARCHAR(50), + IN " . $db->qn('columnRef') . " VARCHAR(50), + IN " . $db->qn('onUpdateAction') . " ENUM('RESTRICT','CASCADE','SET NULL','NO ACTION'), + IN " . $db->qn('onDeleteAction') . " ENUM('RESTRICT','CASCADE','SET NULL','NO ACTION') + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to Update/Create Constraint (Foreign Key) to table avoid unexpected errors..') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET constraintName = REPLACE(constraintName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET columnName = REPLACE(columnName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET tableRef = REPLACE(tableRef, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET columnRef = REPLACE(columnRef, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + CALL redSHOP_Constraint_Remove(tableName, constraintName); + SET FOREIGN_KEY_CHECKS = 0; + SET @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` ADD CONSTRAINT `',constraintName,'` FOREIGN KEY (`',columnName,'`) REFERENCES `',tableRef,'` (`',columnRef,'`) ON UPDATE ',onUpdateAction,' ON DELETE ',onDeleteAction); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + SET FOREIGN_KEY_CHECKS = 1; + END"; + + $db->setQuery($query)->execute(); + } + + /** + * Method for implement procedure "redSHOP_Primary_Remove" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedurePrimaryRemove() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Primary_Remove'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Primary_Remove") . "( + IN " . $db->qn('tableName') . " VARCHAR(50) + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to remove primary key from table avoid unexpected errors.') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + IF ((SELECT COUNT(*) AS index_exists FROM information_schema.table_constraints WHERE TABLE_SCHEMA = DATABASE() and table_name = tableName AND constraint_name = " . $db->quote('PRIMARY') . ") >= 1) + THEN + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` DROP PRIMARY KEY'); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + END IF ; + END"; + + $db->setQuery($query)->execute(); + } + + /** + * Method for implement procedure "redSHOP_Primary_Add" + * + * @return void + * + * @since 2.1.0 + */ + protected function procedurePrimaryAdd() + { + $db = JFactory::getDbo(); + + $query = "DROP PROCEDURE IF EXISTS " . $db->qn('redSHOP_Primary_Add'); + + $db->setQuery($query)->execute(); + + $query = "CREATE PROCEDURE " . $db->qn("redSHOP_Primary_Add") . "( + IN " . $db->qn('tableName') . " VARCHAR(50), + IN " . $db->qn('keyData') . " VARCHAR(255) + ) + LANGUAGE SQL + NOT DETERMINISTIC + CONTAINS SQL + COMMENT " . $db->quote('Procedure for use in redSHOP to Add primary to table avoid unexpected errors..') . " + BEGIN + SET tableName = REPLACE(tableName, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + SET keyData = REPLACE(keyData, " . $db->quote('#__') . ", " . $db->quote(JFactory::getConfig()->get('dbprefix')) . ") ; + CALL redSHOP_Primary_Remove(tableName) ; + set @StatementToExecute = concat('ALTER TABLE `',DATABASE(),'`.`',tableName,'` ADD PRIMARY KEY(',keyData,')'); + prepare DynamicStatement from @StatementToExecute ; + execute DynamicStatement ; + deallocate prepare DynamicStatement ; + END"; + + $db->setQuery($query)->execute(); + } +} diff --git a/jgulp/components/redshop.assets.js b/jgulp/components/redshop.assets.js new file mode 100644 index 00000000000..cf3bfd02030 --- /dev/null +++ b/jgulp/components/redshop.assets.js @@ -0,0 +1,106 @@ +/** + * Gulp components for redSHOP, + * This is for developer mode only. + * Don't ever use this on live site. + * + * Short Tag: + * - gulp watch + * - gulp copy + * + * Every task begin with :components.redshop + * + * There are 3 task types: + * - clean + * - copy + * - watch + * + * We handle scripts by gulp pipe and uglify. + * We handle css by sass and minify + * + * For more details: + * - https://www.npmjs.com/package/gulp-watch + * - http://sass-lang.com + * - https://github.com/mishoo/UglifyJS + */ + +/// Define gulp and its config +var gulp = require('gulp'); +var config = require('../../gulp-config.json'); + +/// Define dependencies +var del = require('del'); +var sass = require('gulp-sass'); +var rename = require('gulp-rename'); +var concat = require('gulp-concat'); +var uglify = require('gulp-uglify'); +var path = require("path"); +var fs = require('fs'); +var changed = require('gulp-changed'); +var gutil = require('gulp-util'); + +/// Define component tasks +var componentName = 'com_redshop'; +var baseTask = 'components.redshop'; + +/// Define paths of source and destination +var extPath = '.'; +var mediaPath = extPath + '/media/' + componentName; +var assetsPath = extPath + '/src/assets/' + componentName; + +/// Minified and deploy from Src to Media. +gulp.task('scripts:' + baseTask, function () { + return gulp.src([ + assetsPath + '/js/*.js', + assetsPath + '/js/**/*.js' + ]) + .pipe(gulp.dest(mediaPath + '/js')) + .pipe(uglify()) + .on('error', function (err) { gutil.log(gutil.colors.red('[Error]'), err.toString()); }) + .pipe(rename(function (path) { + path.basename += '.min'; + })) + .pipe(gulp.dest(mediaPath + '/js')); +}); + +/// Sass Compiler +gulp.task('sass:' + baseTask, function () { + return gulp.src([ + assetsPath + "/scss/*.scss", + assetsPath + "/scss/**/*.scss" + ]) + .pipe(sass()) + .pipe(gulp.dest(mediaPath + "/css")) + .pipe(sass({ + outputStyle : "compressed", + errLogToConsole: true + })) + .pipe(rename(function (path) { + path.basename += '.min'; + })) + .pipe(gulp.dest(mediaPath + "/css")); +}); + +/// Watcher for Assets only +gulp.task('watch:' + baseTask + '.assets', + [ + 'watch:' + baseTask + ':asset:script', + 'watch:' + baseTask + ':asset:sass', + 'watch:' + baseTask + ':media' + ] +); + +/// Watcher will watching for scss changes in Src/assets, +/// then minify its and copy to Media +gulp.task('watch:' + baseTask + ':asset:sass', function () { + gulp.watch([assetsPath + "/scss/*.scss", assetsPath + "/scss/**/*.scss"], ['sass:' + baseTask]); +}); + +/// Watcher will watching for js changes in Src/assets, +/// then minify its and copy to Media +gulp.task('watch:' + baseTask + ':asset:script', function () { + gulp.watch([assetsPath + '/js/**/*.js', assetsPath + '/js/*.js'], ['scripts:' + baseTask]); +}); + +gulp.task('copy:' + baseTask + '.assets', function () { + return true; +}); \ No newline at end of file diff --git a/jgulp/components/redshop.js b/jgulp/components/redshop.js new file mode 100644 index 00000000000..8f1550d52f3 --- /dev/null +++ b/jgulp/components/redshop.js @@ -0,0 +1,320 @@ +/** + * Gulp components for redSHOP, + * This is for developer mode only. + * Don't ever use this on live site. + * + * Short Tag: + * - gulp watch + * - gulp copy + * + * Every task begin with :components.redshop + * + * There are 3 task types: + * - clean + * - copy + * - watch + * + * We handle scripts by gulp pipe and uglify. + * We handle css by sass and minify + * + * For more details: + * - https://www.npmjs.com/package/gulp-watch + * - http://sass-lang.com + * - https://github.com/mishoo/UglifyJS + */ + +/// Define gulp and its config +var gulp = require('gulp'); +var config = require('../../gulp-config.json'); + +/// Define dependencies +var del = require('del'); +var rename = require('gulp-rename'); +var concat = require('gulp-concat'); +var uglify = require('gulp-uglify'); +var path = require("path"); +var fs = require('fs'); +var changed = require('gulp-changed'); + +/// Define component tasks +var componentName = 'com_redshop'; +var baseTask = 'components.redshop'; + +/// Define paths of source and destination +var extPath = '.'; +var mediaPath = extPath + '/media/' + componentName; + +/// Main clean task +/// gulp clean:components.redshop +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':frontend', + 'clean:' + baseTask + ':backend', + 'clean:' + baseTask + ':media' + ], + function () { + return true; + } +); + +/// Clean: media, will clean files from Media +/// gulp clean:components.redshop:media +gulp.task('clean:' + baseTask + ':media', function () { + return del( + [ + config.wwwDir + '/media/' + componentName + '/**', + '!' + config.wwwDir + '/media/' + componentName, + '!' + config.wwwDir + '/media/' + componentName + '/images', + '!' + config.wwwDir + '/media/' + componentName + '/images/**', + '!' + config.wwwDir + '/media/' + componentName + '/templates', + '!' + config.wwwDir + '/media/' + componentName + '/templates/**' + ], + {force: true} + ); +}); + +/// Main copy task +/// gulp copy:components.redshop +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':frontend', + 'copy:' + baseTask + ':backend', + 'copy:' + baseTask + ':media' + ], + function () { + }); + +// Copy: media +gulp.task('copy:' + baseTask + ':media', ['clean:' + baseTask + ':media'], function () { + return gulp.src(mediaPath + '/**') + .pipe(gulp.dest(config.wwwDir + '/media/' + componentName)); +}); + +/// Call another watcher +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':frontend', + 'watch:' + baseTask + ':backend', + 'watch:' + baseTask + ':asset:script', + 'watch:' + baseTask + ':media' + ] +); + +/** + * Media Part + */ +/// Watcher will watching for changes in Media, +/// then copy to destination Media +gulp.task('watch:' + baseTask + ':media', + ['watch:' + baseTask + ':media:js', 'watch:' + baseTask + ':media:css'] +); +// Watch: Media JS +gulp.task('watch:' + baseTask + ':media:js', function () { + gulp.watch([mediaPath + '/js/**/*.js', mediaPath + '/js/*.js']) + .on("change", function (file) { + var destinationPath = config.wwwDir + '/media/' + componentName; + var deployFile = path.join(destinationPath, file.path.substring(file.path.indexOf("com_redshop") + 11, file.path.length)); + + // Delete files + del(deployFile, {force: true}); + + // Copy files + return gulp.src(file.path) + .pipe(gulp.dest(path.dirname(deployFile))); + }); +}); +gulp.task('watch:' + baseTask + ':media:css', function () { + gulp.watch([mediaPath + '/css/**/*.css', mediaPath + '/css/*.css']) + .on("change", function (file) { + var destinationPath = config.wwwDir + '/media/' + componentName; + var deployFile = path.join(destinationPath, + file.path.substring(file.path.indexOf("com_redshop") + 11, file.path.length)); + + // Delete files + del(deployFile, {force: true}); + + // Copy files + return gulp.src(file.path) + .pipe(gulp.dest(path.dirname(deployFile))); + }); +}); + + +/** + * Front-end part + */ +// Clean: frontend, will clean components from Sites +// gulp clean:components.redshop:frontend +gulp.task('clean:' + baseTask + ':frontend', + ['clean:' + baseTask + ':frontend:lang', 'clean:' + baseTask + ':frontend:files'] +); +// Copy: frontend +gulp.task('copy:' + baseTask + ':frontend', + ['copy:' + baseTask + ':frontend:lang', 'copy:' + baseTask + ':frontend:files'] +); +// Watch: Front-end +gulp.task('watch:' + baseTask + ':frontend', + ['watch:' + baseTask + ':frontend:lang', 'watch:' + baseTask + ':frontend:files'] +); + +// Copy: Front-end language +gulp.task('copy:' + baseTask + ':frontend:lang', ['clean:' + baseTask + ':frontend:lang'], function () { + return gulp.src(extPath + '/component/site/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); +// Clean: Front-end language +gulp.task('clean:' + baseTask + ':frontend:lang', function () { + return del(config.wwwDir + '/language/**/*.' + componentName + '.*', {force: true}); +}); +// Watch: Front-end language +gulp.task('watch:' + baseTask + ':frontend:lang', function () { + gulp.watch(extPath + '/component/site/language/**', ['copy:' + baseTask + ':frontend:lang']); +}); + +// Copy: Front-end files +gulp.task('copy:' + baseTask + ':frontend:files', ['clean:' + baseTask + ':frontend:files'], function () { + return gulp.src([ + extPath + '/component/site/**', + '!' + extPath + '/component/site/language', + '!' + extPath + '/component/site/language/**' + ]) + .pipe(gulp.dest(config.wwwDir + '/components/' + componentName)); +}); +// clean: Front-end files +gulp.task('clean:' + baseTask + ':frontend:files', function () { + return del([ + config.wwwDir + '/components/com_redshop/controllers', + config.wwwDir + '/components/com_redshop/helpers', + config.wwwDir + '/components/com_redshop/language', + config.wwwDir + '/components/com_redshop/layouts', + config.wwwDir + '/components/com_redshop/models', + config.wwwDir + '/components/com_redshop/templates', + config.wwwDir + '/components/com_redshop/views/**/*.html.php', + config.wwwDir + '/components/com_redshop/views/**/tmpl/*.php', + config.wwwDir + '/components/com_redshop/*.php' + ], {force: true}); +}); +// Watch: Front-end files +gulp.task('watch:' + baseTask + ':frontend:files', function (cb) { + gulp.watch( + [extPath + '/component/site/**/*', '!' + extPath + '/component/site/language/**']) + .on("change", function (file) { + var destinationPath = path.join(config.wwwDir, "components", componentName); + var deployFile = path.join(destinationPath, + file.path.substring(file.path.indexOf("site") + 4, file.path.length)); + + // Delete files + del(deployFile, {force: true}); + + // Copy files + return gulp.src(file.path) + .pipe(gulp.dest(path.dirname(deployFile))); + }) + .on("end", cb); +}); + + +/** + * Admin part + */ +// Admin: COPY +gulp.task('copy:' + baseTask + ':backend', + [ + 'copy:' + baseTask + ':backend:redshop.xml', + 'copy:' + baseTask + ':backend:install.php', + 'copy:' + baseTask + ':backend:files', + 'copy:' + baseTask + ':backend:lang' + ] +); +// Admin: Clean backend, will clean components from Administrator +gulp.task('clean:' + baseTask + ':backend', function () { + return del([ + config.wwwDir + '/administrator/language/**/*.' + componentName + '.*', + config.wwwDir + '/administrator/components/' + componentName + '/**', + '!' + config.wwwDir + '/administrator/components/' + componentName, + '!' + config.wwwDir + '/administrator/components/' + componentName + '/config', + '!' + config.wwwDir + '/administrator/components/' + componentName + '/config/*.php' + ], {force: true}); +}); +// Admin: Watch +gulp.task('watch:' + baseTask + ':backend', + [ + 'watch:' + baseTask + ':backend:redshop.xml', + 'watch:' + baseTask + ':backend:install.php', + 'watch:' + baseTask + ':backend:files', + 'watch:' + baseTask + ':backend:lang' + ] +); + +// Copy: Admin language +gulp.task('copy:' + baseTask + ':backend:lang', ['clean:' + baseTask + ':backend:lang'], function () { + return gulp.src(extPath + '/component/admin/language/**') + .pipe(gulp.dest(config.wwwDir + '/administrator/language')); +}); +// Clean: Admin language +gulp.task('clean:' + baseTask + ':backend:lang', function () { + return del(config.wwwDir + '/administrator/language/**/*.' + componentName + '.*', {force: true}); +}); +// Watch: Admin language +gulp.task('watch:' + baseTask + ':backend:lang', function () { + gulp.watch(extPath + '/component/admin/language/**', ['copy:' + baseTask + ':backend:lang']); +}); + +// Copy: redSHOP.xml file +gulp.task('copy:' + baseTask + ':backend:redshop.xml', ['clean:' + baseTask + ':backend:redshop.xml'], function () { + return gulp.src(extPath + '/redshop.xml') + .pipe(gulp.dest(config.wwwDir + '/administrator/components/' + componentName)); +}); +// Watch: redSHOP.xml file +gulp.task('watch:' + baseTask + ':backend:redshop.xml', function () { + gulp.watch(extPath + '/redshop.xml', ['copy:' + baseTask + ':backend:redshop.xml']); +}); +// Clean: redSHOP.xml file +gulp.task('clean:' + baseTask + ':backend:redshop.xml', function () { + return del(config.wwwDir + '/administrator/components/' + componentName + '/redshop.xml', {force: true}); +}); + + +// Copy: install.php file +gulp.task('copy:' + baseTask + ':backend:install.php', ['clean:' + baseTask + ':backend:install.php'], function () { + return gulp.src(extPath + '/install.php') + .pipe(gulp.dest(config.wwwDir + '/administrator/components/' + componentName)); +}); +// Watch: install.php file +gulp.task('watch:' + baseTask + ':backend:install.php', function () { + gulp.watch(extPath + '/install.php', ['copy:' + baseTask + ':backend:install.php']); +}); +// Clean: install.php file +gulp.task('clean:' + baseTask + ':backend:install.php', function () { + return del(config.wwwDir + '/administrator/components/' + componentName + '/install.php', {force: true}); +}); + + +// Copy: copy redSHOP Backend files +gulp.task('copy:' + baseTask + ':backend:files', function () { + return gulp.src( + [ + extPath + '/component/admin/**/*', + '!' + extPath + '/component/admin/language', + '!' + extPath + '/component/admin/language/**' + ] + ) + .pipe(gulp.dest(config.wwwDir + '/administrator/components/' + componentName)); +}); +// Watch: redSHOP Backend files +gulp.task('watch:' + baseTask + ':backend:files', function (cb) { + gulp.watch(extPath + '/component/admin/**/*') + .on("change", function (file) { + var destinationPath = path.join(config.wwwDir, "administrator", "components", componentName); + var deployFile = path.join(destinationPath, + file.path.substring(file.path.indexOf("admin") + 5, file.path.length)); + + // Delete files + del(deployFile, {force: true}); + + // Copy files + return gulp.src(file.path) + .pipe(gulp.dest(path.dirname(deployFile))); + }) + .on("end", cb); +}); diff --git a/jgulp/crowdin-conf.js b/jgulp/crowdin-conf.js new file mode 100644 index 00000000000..48547813ba3 --- /dev/null +++ b/jgulp/crowdin-conf.js @@ -0,0 +1,55 @@ +const gulp = require("gulp"); +const requireDir = require("require-dir"); +const fs = require("fs"); +const path = require("path"); +const through = require("through2"); +const pd = require("pretty-data").pd; +const upath = require("upath"); + +var iniJsons = []; + +var stripPrefix = function (name) { + return name.substr(6); +}; + +gulp.task("crowdin-conf", ["getAdminFiles", "getSiteFiles"], function () { + var content = "\"preserve_hierarchy\": true\n"; + content += "commit_message: \"New localization strings available [ci skip]\"\n"; + content += "\"files\": " + pd.json(JSON.stringify(iniJsons)); + fs.writeFileSync("./crowdin.yml", content); +}); + +gulp.task("getAdminFiles", function () { + return gulp.src( + [ + "component/admin/**/*.ini", + "plugins/**/en-GB.*.ini", + "modules/admin/**/*.ini" + ], + {base: "./"} + ).pipe(through.obj(function (file, enc, cb) { + iniJsons.push({ + "source" : "/" + upath.toUnix(file.relative), + "translation": "/src/lang/%locale%/admin/%locale%/%locale%." + stripPrefix(path.basename(file.path)) + }); + cb(null, file); + })); +}); + +gulp.task("getSiteFiles", function () { + return gulp.src( + [ + "component/site/**/*.ini", + "libraries/redshop/language/**/*.ini", + "modules/site/**/*.ini" + ], + {base: "./"} + ).pipe(through.obj(function (file, enc, cb) { + iniJsons.push({ + "source" : "/" + upath.toUnix(file.relative), + "translation": "/src/lang/%locale%/site/%locale%/%locale%." + stripPrefix(path.basename(file.path)) + }); + cb(null, file); + })); +}); + diff --git a/jgulp/libraries/redshop.js b/jgulp/libraries/redshop.js new file mode 100644 index 00000000000..2c777a0389c --- /dev/null +++ b/jgulp/libraries/redshop.js @@ -0,0 +1,172 @@ +var gulp = require("gulp"); + +var config = require("../../gulp-config.json"); + +// Dependencies +var browserSync = require("browser-sync"); +var concat = require("gulp-concat"); +var del = require("del"); +var fs = require("fs"); +var rename = require("gulp-rename"); +var xml2js = require("xml2js"); +var parser = new xml2js.Parser({explicitArray: false}); +var path = require("path"); +var composer = require("gulp-composer"); + +var libraryName = "redshop"; + +var baseTask = "libraries." + libraryName; +var extPath = "./libraries/" + libraryName; +var manifestFile = libraryName + ".xml"; +var wwwPath = config.wwwDir + "/libraries/" + libraryName; +var libraryFiles = []; + +// Clean +gulp.task("clean:" + baseTask, ["clean:" + baseTask + ":library", "clean:" + baseTask + ":manifest"], function () { +}); + +// Clean: library +gulp.task("clean:" + baseTask + ":library", function () { + return del(wwwPath, {force: true}); +}); + +// Clean: manifest +gulp.task("clean:" + baseTask + ":manifest", function () { + return del(config.wwwDir + "/administrator/manifests/libraries/" + manifestFile, {force: true}); +}); + +// Copy +gulp.task("copy:" + baseTask, + [ + "copy:" + baseTask + ":library", + "copy:" + baseTask + ":manifest" + ], + function () { + } +); + +// Copy: manifest +gulp.task("copy:" + baseTask + ":manifest", ["clean:" + baseTask + ":manifest"], function () { + return gulp.src(extPath + "/" + manifestFile) + .pipe(gulp.dest(config.wwwDir + "/administrator/manifests/libraries")); +}); + +gulp.task("copy:" + baseTask + ":vendor", function () { + return gulp.src([ + extPath + "/vendor/**", + "!" + extPath + "/vendor/**/docs", + "!" + extPath + "/vendor/**/docs/**", + "!" + extPath + "/vendor/**/sample", + "!" + extPath + "/vendor/**/sample/**", + "!" + extPath + "/vendor/**/tests", + "!" + extPath + "/vendor/**/tests/**", + "!" + extPath + "/vendor/**/Tests", + "!" + extPath + "/vendor/**/Tests/**", + "!" + extPath + "/vendor/**/doc", + "!" + extPath + "/vendor/**/doc/**", + "!" + extPath + "/vendor/**/docs", + "!" + extPath + "/vendor/**/docs/**", + "!" + extPath + "/vendor/**/composer.*", + "!" + extPath + "/vendor/**/*.sh", + "!" + extPath + "/vendor/**/build.xml", + "!" + extPath + "/vendor/**/phpunit*", + "!" + extPath + "/vendor/**/Vagrant*", + "!" + extPath + "/vendor/**/.*.yml", + "!" + extPath + "/vendor/**/.editorconfig" + ], {base: extPath}) + .pipe(gulp.dest(wwwPath)); +}); + +/** + * Retrieve folders + files from the library manifest (except vendor folder) ready to be used by gulp.src + * + * @param {Function} callback Callback to be executed when the file list is available + * + * @return {mixed} + */ +function getLibraryFiles (callback) { + // Already cached + if (libraryFiles.length > 0) { + return callback(libraryFiles); + } + + fs.readFile(extPath + "/" + libraryName + ".xml", function (err, data) { + if (data !== undefined) + { + parser.parseString(data, function (err, result) { + var folders = result.extension.files.folder; + var files = result.extension.files.filename; + + for (var i = folders.length - 1; i >= 0; i--) { + if (folders[i] !== "vendor") { + libraryFiles.push(extPath + "/" + folders[i] + "/**"); + } + } + + for (var i = files.length - 1; i >= 0; i--) { + libraryFiles.push(extPath + "/" + files[i]); + } + + return callback(libraryFiles); + }); + } + }); +} + +// Copy: library +gulp.task("copy:" + baseTask + ":library", function (cb) { + getLibraryFiles(function (src) { + return gulp.src(src, {base: extPath}) + .pipe(gulp.dest(wwwPath)) + .on("end", cb); + }); +}); + +// Watch +gulp.task("watch:" + baseTask, + [ + "watch:" + baseTask + ":library", + "watch:" + baseTask + ":manifest" + ], + function () { + }); + +// Watch: library +gulp.task("watch:" + baseTask + ":library", function () { + gulp.watch( + [ + extPath, + extPath + "/**", + extPath + "/**!/*", + "!" + extPath + "/vendor", + "!" + extPath + "/vendor/!**!/!*", + "!" + extPath + "/" + manifestFile + ], + function (event) { + var folder = "libraries/redshop"; + var deployFile = path.join(wwwPath, event.path.substring(event.path.indexOf("libraries") + folder.length, event.path.length)); + + if (event.type == "changed") { + // Copy files + gulp.src(event.path) + .pipe(gulp.dest(path.dirname(deployFile))); + } + else if (event.type == "deleted") { + // Delete files + del(deployFile, {force: true}); + } + + browserSync.reload(); + } + ); +}); + +// Watch: manifest +gulp.task("watch:" + baseTask + ":manifest", function () { + gulp.watch(extPath + "/" + manifestFile, ["copy:" + baseTask + ":manifest", browserSync.reload]); +}); + +// Composer +gulp.task("composer:" + baseTask, function () { + executeComposer(extPath); +}); diff --git a/jgulp/modules/site/redshop_cart.js b/jgulp/modules/site/redshop_cart.js new file mode 100644 index 00000000000..81369bc6f4a --- /dev/null +++ b/jgulp/modules/site/redshop_cart.js @@ -0,0 +1,87 @@ +var gulp = require('gulp'); +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var concat = require('gulp-concat'); +var del = require('del'); +var path = require('path'); + +var modName = "redshop_cart"; +var modFolder = "mod_" + modName; +var modBase = "site"; + +var baseTask = 'modules.frontend.' + modName; +var extPath = './modules/' + modBase + '/' + modFolder; +var wwwPath = config.wwwDir + '/modules/' + modFolder + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':module', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: Module +gulp.task('clean:' + baseTask + ':module', function() { + return del(wwwPath, {force: true}); +}); + +// Clean: Language +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.mod_' + modName + '.*', {force: true}); +}); + +// Copy: Module +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':module', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: Module +gulp.task('copy:' + baseTask + ':module', ['clean:' + baseTask + ':module'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':module', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: Module +gulp.task('watch:' + baseTask + ':module', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + 'language', + '!' + extPath + 'language/**' + ], + ['copy:' + baseTask + ':module', browserSync.reload]); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/modules/site/redshop_search.js b/jgulp/modules/site/redshop_search.js new file mode 100644 index 00000000000..d3348cb3a12 --- /dev/null +++ b/jgulp/modules/site/redshop_search.js @@ -0,0 +1,87 @@ +var gulp = require('gulp'); +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var concat = require('gulp-concat'); +var del = require('del'); +var path = require('path'); + +var modName = "redshop_search"; +var modFolder = "mod_" + modName; +var modBase = "site"; + +var baseTask = 'modules.frontend.' + modName; +var extPath = './modules/' + modBase + '/' + modFolder; +var wwwPath = config.wwwDir + '/modules/' + modFolder + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':module', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: Module +gulp.task('clean:' + baseTask + ':module', function() { + return del(wwwPath, {force: true}); +}); + +// Clean: Language +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.mod_' + modName + '.*', {force: true}); +}); + +// Copy: Module +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':module', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: Module +gulp.task('copy:' + baseTask + ':module', ['clean:' + baseTask + ':module'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':module', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: Module +gulp.task('watch:' + baseTask + ':module', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + 'language', + '!' + extPath + 'language/**' + ], + ['copy:' + baseTask + ':module', browserSync.reload]); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/finder/redshop.js b/jgulp/plugins/finder/redshop.js new file mode 100644 index 00000000000..7149d3d3bc0 --- /dev/null +++ b/jgulp/plugins/finder/redshop.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'finder'; +var name = 'redshop'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/quickicon/redshop.js b/jgulp/plugins/quickicon/redshop.js new file mode 100644 index 00000000000..29f5ec29900 --- /dev/null +++ b/jgulp/plugins/quickicon/redshop.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'quickicon'; +var name = 'redshop'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/redshop_alert/alert.js b/jgulp/plugins/redshop_alert/alert.js new file mode 100644 index 00000000000..e79407d74c6 --- /dev/null +++ b/jgulp/plugins/redshop_alert/alert.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_alert'; +var name = 'alert'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/redshop_export/attribute.js b/jgulp/plugins/redshop_export/attribute.js new file mode 100644 index 00000000000..5b328783fb2 --- /dev/null +++ b/jgulp/plugins/redshop_export/attribute.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'attribute'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/category.js b/jgulp/plugins/redshop_export/category.js new file mode 100644 index 00000000000..79768e732bb --- /dev/null +++ b/jgulp/plugins/redshop_export/category.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'category'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/field.js b/jgulp/plugins/redshop_export/field.js new file mode 100644 index 00000000000..42ff90d535b --- /dev/null +++ b/jgulp/plugins/redshop_export/field.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'field'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/manufacturer.js b/jgulp/plugins/redshop_export/manufacturer.js new file mode 100644 index 00000000000..a21005895af --- /dev/null +++ b/jgulp/plugins/redshop_export/manufacturer.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'manufacturer'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/newsletter_subscriber.js b/jgulp/plugins/redshop_export/newsletter_subscriber.js new file mode 100644 index 00000000000..0f9d4d48c2d --- /dev/null +++ b/jgulp/plugins/redshop_export/newsletter_subscriber.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'newsletter_subscriber'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/product.js b/jgulp/plugins/redshop_export/product.js new file mode 100644 index 00000000000..0322de50b65 --- /dev/null +++ b/jgulp/plugins/redshop_export/product.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'product'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/product_stockroom_data.js b/jgulp/plugins/redshop_export/product_stockroom_data.js new file mode 100644 index 00000000000..0c247546f45 --- /dev/null +++ b/jgulp/plugins/redshop_export/product_stockroom_data.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'product_stockroom_data'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/related_product.js b/jgulp/plugins/redshop_export/related_product.js new file mode 100644 index 00000000000..c9ddbae7055 --- /dev/null +++ b/jgulp/plugins/redshop_export/related_product.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'related_product'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/shipping_address.js b/jgulp/plugins/redshop_export/shipping_address.js new file mode 100644 index 00000000000..ed96c148233 --- /dev/null +++ b/jgulp/plugins/redshop_export/shipping_address.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'shipping_address'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/shopper_group_attribute_price.js b/jgulp/plugins/redshop_export/shopper_group_attribute_price.js new file mode 100644 index 00000000000..cad584ec070 --- /dev/null +++ b/jgulp/plugins/redshop_export/shopper_group_attribute_price.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'shopper_group_attribute_price'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/shopper_group_product_price.js b/jgulp/plugins/redshop_export/shopper_group_product_price.js new file mode 100644 index 00000000000..87cf9596673 --- /dev/null +++ b/jgulp/plugins/redshop_export/shopper_group_product_price.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'shopper_group_product_price'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_export/user.js b/jgulp/plugins/redshop_export/user.js new file mode 100644 index 00000000000..6634a386a3d --- /dev/null +++ b/jgulp/plugins/redshop_export/user.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_export'; +var name = 'user'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/attribute.js b/jgulp/plugins/redshop_import/attribute.js new file mode 100644 index 00000000000..5d2f7619cd3 --- /dev/null +++ b/jgulp/plugins/redshop_import/attribute.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'attribute'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/category.js b/jgulp/plugins/redshop_import/category.js new file mode 100644 index 00000000000..c7443829e63 --- /dev/null +++ b/jgulp/plugins/redshop_import/category.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'category'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/field.js b/jgulp/plugins/redshop_import/field.js new file mode 100644 index 00000000000..efb094f0c56 --- /dev/null +++ b/jgulp/plugins/redshop_import/field.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'field'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/manufacturer.js b/jgulp/plugins/redshop_import/manufacturer.js new file mode 100644 index 00000000000..e09cff770ec --- /dev/null +++ b/jgulp/plugins/redshop_import/manufacturer.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'manufacturer'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/newslette_subscriber.js b/jgulp/plugins/redshop_import/newslette_subscriber.js new file mode 100644 index 00000000000..e63721a3358 --- /dev/null +++ b/jgulp/plugins/redshop_import/newslette_subscriber.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'newsletter_subscriber'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/product.js b/jgulp/plugins/redshop_import/product.js new file mode 100644 index 00000000000..dc3b158ac70 --- /dev/null +++ b/jgulp/plugins/redshop_import/product.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'product'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/product_stockroom_data.js b/jgulp/plugins/redshop_import/product_stockroom_data.js new file mode 100644 index 00000000000..4fc118d0a4b --- /dev/null +++ b/jgulp/plugins/redshop_import/product_stockroom_data.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'product_stockroom_data'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/related_product.js b/jgulp/plugins/redshop_import/related_product.js new file mode 100644 index 00000000000..33ef93708ec --- /dev/null +++ b/jgulp/plugins/redshop_import/related_product.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'related_product'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/shipping_address.js b/jgulp/plugins/redshop_import/shipping_address.js new file mode 100644 index 00000000000..f0920bcbaa5 --- /dev/null +++ b/jgulp/plugins/redshop_import/shipping_address.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'shipping_address'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/shopper_group_attribute_price.js b/jgulp/plugins/redshop_import/shopper_group_attribute_price.js new file mode 100644 index 00000000000..448e3b5d455 --- /dev/null +++ b/jgulp/plugins/redshop_import/shopper_group_attribute_price.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'shopper_group_attribute_price'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/shopper_group_product_price.js b/jgulp/plugins/redshop_import/shopper_group_product_price.js new file mode 100644 index 00000000000..51df282b85f --- /dev/null +++ b/jgulp/plugins/redshop_import/shopper_group_product_price.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'shopper_group_product_price'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_import/user.js b/jgulp/plugins/redshop_import/user.js new file mode 100644 index 00000000000..634443aac20 --- /dev/null +++ b/jgulp/plugins/redshop_import/user.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_import'; +var name = 'user'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); diff --git a/jgulp/plugins/redshop_payment/rs_payment_banktransfer.js b/jgulp/plugins/redshop_payment/rs_payment_banktransfer.js new file mode 100644 index 00000000000..242cbada4b7 --- /dev/null +++ b/jgulp/plugins/redshop_payment/rs_payment_banktransfer.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_payment'; +var name = 'rs_payment_banktransfer'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/redshop_payment/rs_payment_paypal.js b/jgulp/plugins/redshop_payment/rs_payment_paypal.js new file mode 100644 index 00000000000..54de57b1f41 --- /dev/null +++ b/jgulp/plugins/redshop_payment/rs_payment_paypal.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_payment'; +var name = 'rs_payment_paypal'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/redshop_pdf/tcpdf.js b/jgulp/plugins/redshop_pdf/tcpdf.js new file mode 100644 index 00000000000..2102d7a69e3 --- /dev/null +++ b/jgulp/plugins/redshop_pdf/tcpdf.js @@ -0,0 +1,68 @@ +var gulp = require("gulp"); + +// Load config +var config = require("../../../gulp-config.json"); + +// Dependencies +var browserSync = require("browser-sync"); +var del = require("del"); +var composer = require("gulp-composer"); + +var group = "redshop_pdf"; +var name = "tcpdf"; + +var baseTask = "plugins." + group + "." + name; +var extPath = "./plugins/" + group + "/" + name; + +var wwwExtPath = config.wwwDir + "/plugins/" + group + "/" + name; + +// Clean +gulp.task("clean:" + baseTask, + [ + "clean:" + baseTask + ":plugin" + ], + function () { + }); + +// Clean: plugin +gulp.task("clean:" + baseTask + ":plugin", function () { + return del(wwwExtPath, {force: true}); +}); + +// Copy +gulp.task("copy:" + baseTask, + [ + "copy:" + baseTask + ":plugin" + ], + function () { + }); + +// Copy: plugin +gulp.task("copy:" + baseTask + ":plugin", ["clean:" + baseTask + ":plugin"], function () { + return gulp.src([ + extPath + "/**" + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task("watch:" + baseTask, + [ + "watch:" + baseTask + ":plugin" + ], + function () { + }); + +// Watch: plugin +gulp.task("watch:" + baseTask + ":plugin", function () { + gulp.watch([ + extPath + "/**/*" + ], + ["copy:" + baseTask, browserSync.reload] + ); +}); + +// Composer +gulp.task("composer:" + baseTask, function () { + composer({cwd: extPath + "/helper", bin: "php ./composer.phar"}); +}); diff --git a/jgulp/plugins/redshop_product/sh404urls.js b/jgulp/plugins/redshop_product/sh404urls.js new file mode 100644 index 00000000000..b5258328bef --- /dev/null +++ b/jgulp/plugins/redshop_product/sh404urls.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_product'; +var name = 'sh404urls'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/redshop_shipping/default_shipping.js b/jgulp/plugins/redshop_shipping/default_shipping.js new file mode 100644 index 00000000000..2452fe9a149 --- /dev/null +++ b/jgulp/plugins/redshop_shipping/default_shipping.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'redshop_shipping'; +var name = 'default_shipping'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/search/redshop_categories.js b/jgulp/plugins/search/redshop_categories.js new file mode 100644 index 00000000000..f71563ffbbd --- /dev/null +++ b/jgulp/plugins/search/redshop_categories.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'search'; +var name = 'redshop_categories'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/search/redshop_products.js b/jgulp/plugins/search/redshop_products.js new file mode 100644 index 00000000000..03b9cb48997 --- /dev/null +++ b/jgulp/plugins/search/redshop_products.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'search'; +var name = 'redshop_products'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/sh404sefextplugins/sh404sefextplugincom_redshop.js b/jgulp/plugins/sh404sefextplugins/sh404sefextplugincom_redshop.js new file mode 100644 index 00000000000..9e327857737 --- /dev/null +++ b/jgulp/plugins/sh404sefextplugins/sh404sefextplugincom_redshop.js @@ -0,0 +1,38 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'sh404sefextplugins'; +var name = 'sh404sefextplugincom_redshop'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean: plugin +gulp.task('clean:' + baseTask, function() { + return del(wwwExtPath, {force : true}); +}); + +// Copy: plugin +gulp.task('copy:' + baseTask, ['clean:' + baseTask], function() { + return gulp.src([ + extPath + '/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Watch +gulp.task('watch:' + baseTask, function() { + gulp.watch([ + extPath + '/**/*' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); \ No newline at end of file diff --git a/jgulp/plugins/system/redgoogleanalytics.js b/jgulp/plugins/system/redgoogleanalytics.js new file mode 100644 index 00000000000..daef33689f3 --- /dev/null +++ b/jgulp/plugins/system/redgoogleanalytics.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'system'; +var name = 'redgoogleanalytics'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/plugins/system/redshop.js b/jgulp/plugins/system/redshop.js new file mode 100644 index 00000000000..4b78ea14c98 --- /dev/null +++ b/jgulp/plugins/system/redshop.js @@ -0,0 +1,89 @@ +var gulp = require('gulp'); + +// Load config +var config = require('../../../gulp-config.json'); + +// Dependencies +var browserSync = require('browser-sync'); +var del = require('del'); + +var group = 'system'; +var name = 'redshop'; + +var baseTask = 'plugins.' + group + '.' + name; +var extPath = './plugins/' + group + '/' + name; + +var wwwExtPath = config.wwwDir + '/plugins/' + group + '/' + name; + +// Clean +gulp.task('clean:' + baseTask, + [ + 'clean:' + baseTask + ':plugin', + 'clean:' + baseTask + ':language' + ], + function() { + }); + +// Clean: plugin +gulp.task('clean:' + baseTask + ':plugin', function() { + return del(wwwExtPath, {force : true}); +}); + +// Clean: lang +gulp.task('clean:' + baseTask + ':language', function() { + return del(config.wwwDir + '/language/**/*.plg_' + group + '_' + name + '.*', {force: true}); +}); + + +// Copy +gulp.task('copy:' + baseTask, + [ + 'copy:' + baseTask + ':plugin', + 'copy:' + baseTask + ':language' + ], + function() { + }); + +// Copy: plugin +gulp.task('copy:' + baseTask + ':plugin', ['clean:' + baseTask + ':plugin'], function() { + return gulp.src([ + extPath + '/**', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ]) + .pipe(gulp.dest(wwwExtPath)); +}); + +// Copy: Language +gulp.task('copy:' + baseTask + ':language', ['clean:' + baseTask + ':language'], function() { + return gulp.src(extPath + '/language/**') + .pipe(gulp.dest(config.wwwDir + '/language')); +}); + +// Watch +gulp.task('watch:' + baseTask, + [ + 'watch:' + baseTask + ':plugin', + 'watch:' + baseTask + ':language' + ], + function() { + }); + +// Watch: plugin +gulp.task('watch:' + baseTask + ':plugin', function() { + gulp.watch([ + extPath + '/**/*', + '!' + extPath + '/language', + '!' + extPath + '/language/**' + ], + ['copy:' + baseTask, browserSync.reload] + ); +}); + +// Watch: Language +gulp.task('watch:' + baseTask + ':language', function() { + gulp.watch([ + extPath + '/language/**' + ], + ['copy:' + baseTask + ':language', browserSync.reload]); +}); diff --git a/jgulp/release.js b/jgulp/release.js new file mode 100644 index 00000000000..8412ff259c1 --- /dev/null +++ b/jgulp/release.js @@ -0,0 +1,179 @@ +const gulp = require("gulp"); +const zip = require("gulp-zip"); +const path = require("path"); +const fs = require("fs"); +const xml2js = require("xml2js"); +const merge = require("merge-stream"); + +var parser = new xml2js.Parser(); + +/** + * Execute gulp to release an extension + * + * @param arraySrc + * @param fileName + * @param dest + * @returns {*} + */ +global.releaseExt = function releaseExt(arraySrc, fileName, dest) { + return gulp.src(arraySrc).pipe(zip(fileName)).pipe(gulp.dest(dest)); +}; + +// Overwrite "release" method +gulp.task("release", + [ + "release:plugin", + "release:module", + "release:redshop" + ] +); + +gulp.task("release:md5:generate", function () { + + gutil.log(gutil.colors.yellow("Create checksum.md5 file in: checksum.md5")); + + return gulp.src([ + "./component/**/*", + "./component/**/.gitkeep", + "./libraries/redshop/**/*", + "./libraries/redshop/vendor/**/*", + "./libraries/redshop/.gitkeep", + "!./libraries/redshop/composer.*", + "!./libraries/redshop/vendor/**/tests/**/*", + "!./libraries/redshop/vendor/**/tests", + "!./libraries/redshop/vendor/**/Tests/**/*", + "!./libraries/redshop/vendor/**/Tests", + "!./libraries/redshop/vendor/**/docs/**/*", + "!./libraries/redshop/vendor/**/docs", + "!./libraries/redshop/vendor/**/doc/**/*", + "!./libraries/redshop/vendor/**/doc", + "!./libraries/redshop/vendor/**/composer.*", + "!./libraries/redshop/vendor/**/phpunit*", + "!./libraries/redshop/vendor/**/Vagrantfile", + "./media/**/*", + "./media/**/.gitkeep", + "!./media/com_redshop/scss", + "!./media/com_redshop/scss/**", + "./*(install.php|LICENSE.txt|redshop.xml)", + "./modules/site/mod_redshop_cart/**", + "./plugins/system/redshop/**", + "./plugins/system/redgoogleanalytics/**", + "./plugins/redshop_payment/rs_payment_banktransfer/**", + "./plugins/redshop_product/sh404urls/**", + "./plugins/redshop_payment/rs_payment_paypal/**", + "./plugins/finder/redshop/**", + "./plugins/redshop_alert/alert/**", + "./plugins/redshop_shipping/default_shipping/**", + "./plugins/sh404sefextplugins/sh404sefextplugincom_redshop/**", + "./plugins/redshop_pdf/tcpdf/**", + "./plugins/redshop_export/attribute/**", + "./plugins/redshop_export/category/**", + "./plugins/redshop_export/field/**", + "./plugins/redshop_export/manufacturer/**", + "./plugins/redshop_export/newsletter_subscriber/**", + "./plugins/redshop_export/product/**", + "./plugins/redshop_export/product_stockroom_data/**", + "./plugins/redshop_export/related_product/**", + "./plugins/redshop_export/shipping_address/**", + "./plugins/redshop_export/shopper_group_attribute_price/**", + "./plugins/redshop_export/shopper_group_product_price/**", + "./plugins/redshop_export/user/**", + "./plugins/redshop_import/attribute/**", + "./plugins/redshop_import/category/**", + "./plugins/redshop_import/field/**", + "./plugins/redshop_import/manufacturer/**", + "./plugins/redshop_import/newsletter_subscriber/**", + "./plugins/redshop_import/product/**", + "./plugins/redshop_import/product_stockroom_data/**", + "./plugins/redshop_import/shipping_address/**", + "./plugins/redshop_import/shopper_group_product_price/**", + "./plugins/redshop_import/shopper_group_attribute_price/**", + "./plugins/redshop_import/user/**", + "./plugins/redshop_import/related_product/**" + ], {base: "./"}).pipe(hashsum({dest: "./", filename: "checksum.md5", hash: "md5"})); +}); + +gulp.task("release:md5:json", ["release:md5:generate"], function (cb) { + var fileContent = fs.readFileSync(path.join("./checksum.md5"), "utf8"); + var temp = fileContent.split("\n"); + var result = []; + var t1; + + for (var i = 0; i < temp.length; i++) { + t1 = temp[i].split(" "); + + if (t1[0].trim().length) { + var item = {"md5": t1[0], "path": t1[2]}; + result.push(item); + } + } + + gutil.log(gutil.colors.yellow("checksum.md5.json file: "), "component/admin/assets/checksum.md5.json"); + + rs = JSON.stringify(result); + + fs.writeFile("./component/admin/assets/checksum.md5.json", rs); + + return cb(); +}); + +gulp.task("release:md5", + [ + "release:md5:generate", + "release:md5:json", + "release:md5:clean" + ] +); + +gulp.task("release:md5:clean", ["release:md5:json"], function () { + return gulp.src("./checksum.md5").pipe(clean({force: true})); +}); + +// Temporary remove release:md5 since it not ready for use yet. +// // gulp.task("release:redshop", ["composer:libraries", "release:md5"], function (cb) { + +gulp.task("release:languages", function () { + const langPath = "./src/lang"; + const releaseDir = path.join(config.releaseDir, "language"); + + const folders = fs.readdirSync(langPath).map(function (file) { + return path.join(langPath, file); + }).filter(function (file) { + return fs.existsSync(path.join(file, "install.xml")); + }); + + // We need to combine streams so we can know when this task is actually done + return merge(folders.map(function (directory) { + const data = fs.readFileSync(path.join(directory, "install.xml")); + + // xml2js parseString is sync, but must be called using callbacks... hence this awkwards vars + // see https://github.com/Leonidas-from-XIV/node-xml2js/issues/159 + var task; + var error; + + parser.parseString(data, function (err, result) { + if (err) { + error = err; + + return; + } + + const lang = path.basename(directory); + const version = result.extension.version[0]; + const fileName = config.skipVersion ? result.extension.name + ".zip" : result.extension.name + "-v" + version + ".zip"; + + task = gulp.src([directory + "/**"]).pipe(zip(fileName)).pipe(gulp.dest(releaseDir)); + }); + + if (error) { + throw error; + } + + if (!error && !task) { + throw new Error("xml2js callback became suddenly async or something."); + } + + return task; + }) + ); +}); diff --git a/jgulp/tasks/clean.js b/jgulp/tasks/clean.js new file mode 100644 index 00000000000..06fc22e3516 --- /dev/null +++ b/jgulp/tasks/clean.js @@ -0,0 +1,12 @@ +// Clean test site +/*gulp.task( + 'clean', + [ + 'clean:components', + 'clean:libraries', + 'clean:modules', + 'clean:packages', + 'clean:plugins' + ], function() { + return true; + });*/ \ No newline at end of file diff --git a/jgulp/tasks/copy.js b/jgulp/tasks/copy.js new file mode 100644 index 00000000000..3ddafe1db0c --- /dev/null +++ b/jgulp/tasks/copy.js @@ -0,0 +1,14 @@ +var gulp = require("gulp"); + +// Copy to test site +gulp.task( + 'copy', + [ + 'copy:components', + 'copy:libraries', + 'copy:modules', + 'copy:packages', + 'copy:plugins' + ], function() { + return true; + }); \ No newline at end of file diff --git a/jgulp/tasks/release/modules.js b/jgulp/tasks/release/modules.js new file mode 100644 index 00000000000..2d8cdbcaa6c --- /dev/null +++ b/jgulp/tasks/release/modules.js @@ -0,0 +1,108 @@ +var gulp = require("gulp"); +var path = require("path"); +var gutil = require('gulp-util'); +var zip = require("gulp-zip"); +var fs = require("fs"); +// Get console args +var argv = require("yargs").argv; +// XML parser +var xml2js = require("xml2js"); +var parser = new xml2js.Parser(); + +/** + * Function for release module + * @param group + * @param name + * @returns {*} + */ +function moduleRelease(group, name) { + var fileName = name; + var arraySrc = getGlobExtensionPattern('modules', group, name); + var destDir = config.releaseDir + '/modules/' + group; + + if (!argv.skipVersion) { + fs.readFile('./modules/' + group + '/' + name + '/' + name + '.xml', function(err, data) { + if (data === undefined) + { + return false; + } + + parser.parseString(data, function (err, result) { + var version = result.extension.version[0]; + + fileName += '-v' + version + '.zip'; + + var count = 35 - name.length; + var nameFormat = name; + + for (var i = 0; i < count; i++) + { + nameFormat += ' '; + } + + count = 8 - version.length; + + for (i = 0; i < count; i++) + { + version += ' '; + } + + // We will output where release package is going so it is easier to find + renderLog("Module", group, nameFormat, version, path.join(config.releaseDir + '/modules/' + group, fileName)); + + return releaseExt(arraySrc, fileName, destDir); + }); + }); + } + else { + return releaseExt(arraySrc, fileName + '.zip', destDir); + } +} + +// Release: Modules +gulp.task('release:module', function(cb) { + var basePath = config.basePaths.modules; + var modSource = argv.group ? argv.group : false; + var modName = argv.name ? argv.name : false; + var modules = []; + + // No group specific, release all of them. + if (!modSource) { + var groups = getFolders(basePath); + + for (var i = 0; i < groups.length; i++) { + modules = getFolders(basePath + '/' + groups[i]); + + for (j = 0; j < modules.length; j++) { + moduleRelease(groups[i], modules[j]); + } + } + } + else if (modSource && !modName) { + try { + fs.statSync('./modules/' + modSource); + } + catch (e) { + console.error("Folder not exist: " + basePath + '/' + plgGroup); + return; + } + + modules = getFolders(basePath + '/' + modSource); + + for (i = 0; i < modules.length; i++) { + moduleRelease(modSource, modules[i]); + } + } + else + { + try { + fs.statSync('./modules/' + modSource + '/' + modName); + } + catch (e) { + console.error("Folder not exist: " + basePath + '/' + modSource + '/' + modName); + return; + } + + moduleRelease(modSource, modName); + } +}); \ No newline at end of file diff --git a/jgulp/tasks/release/plugins.js b/jgulp/tasks/release/plugins.js new file mode 100644 index 00000000000..d66f83471f2 --- /dev/null +++ b/jgulp/tasks/release/plugins.js @@ -0,0 +1,113 @@ +var gulp = require("gulp"); +var path = require("path"); +var gutil = require('gulp-util'); +var zip = require("gulp-zip"); +var fs = require("fs"); +// Get console args +var argv = require("yargs").argv; +// XML parser +var xml2js = require("xml2js"); +var parser = new xml2js.Parser(); + +/** + * Function for release plugin + * @param group + * @param name + * @returns {*} + */ +function pluginRelease(group, name) { + var fileName = 'plg_' + group + '_' + name; + var arraySrc = getGlobExtensionPattern('plugins', group, name); + var destDir = config.releaseDir + '/plugins'; + + if (!argv.skipVersion) { + fs.readFile('./plugins/' + group + '/' + name + '/' + name + '.xml', function (err, data) { + if (data === undefined) + { + return false; + } + + parser.parseString(data, function (err, result) { + var version = result.extension.version[0]; + + // Generate file name + fileName += '-v' + version + '.zip'; + + var count = 25 - group.length; + var groupName = group; + + for (var i = 0; i < count; i++) { + groupName += ' '; + } + + count = 35 - name.length; + var nameFormat = name; + + for (i = 0; i < count; i++) { + nameFormat += ' '; + } + + count = 11 - version.length; + + for (i = 0; i < count; i++) { + version += ' '; + } + + // We will output where release package is going so it is easier to find + renderLog("Plugin", groupName, nameFormat, version, path.join(config.releaseDir + '/plugins', fileName)); + + return releaseExt(arraySrc, fileName, destDir); + }); + }); + } + else { + return releaseExt(arraySrc, fileName + '.zip', destDir); + } +} + +// Release: Plugins +gulp.task('release:plugin', function (cb) { + var basePath = config.basePaths.plugins; + var plgGroup = argv.group ? argv.group : false; + var plgName = argv.name ? argv.name : false; + var plugins = []; + + // No group specific, release all of them. + if (!plgGroup) { + var groups = getFolders(basePath); + + for (var i = 0; i < groups.length; i++) { + plugins = getFolders(basePath + '/' + groups[i]); + + for (j = 0; j < plugins.length; j++) { + pluginRelease(groups[i], plugins[j]); + } + } + } + else if (plgGroup && !plgName) { + try { + fs.statSync('./plugins/' + plgGroup); + } + catch (e) { + console.error("Folder not exist: " + basePath + '/' + plgGroup); + return; + } + + plugins = getFolders(basePath + '/' + plgGroup); + + for (i = 0; i < plugins.length; i++) { + pluginRelease(plgGroup, plugins[i]); + } + } + else { + try { + fs.statSync('./plugins/' + plgGroup + '/' + plgName); + } + catch (e) { + console.error("Folder not exist: " + basePath + '/' + plgGroup + '/' + plgName); + return; + } + + pluginRelease(plgGroup, plgName); + } +}); diff --git a/jgulp/tasks/release/redshop.js b/jgulp/tasks/release/redshop.js new file mode 100644 index 00000000000..ac91dbbb096 --- /dev/null +++ b/jgulp/tasks/release/redshop.js @@ -0,0 +1,121 @@ +var gulp = require("gulp"); +var path = require("path"); +var gutil = require('gulp-util'); +var zip = require("gulp-zip"); +var fs = require("fs"); +// Get console args +var argv = require("yargs").argv; +// XML parser +var xml2js = require("xml2js"); +var parser = new xml2js.Parser(); + +function getIncludedExtensions() { + var included = []; + var includedPlugins = [ + "./plugins/system/redshop/**", + "./plugins/system/redgoogleanalytics/**", + "./plugins/redshop_payment/rs_payment_banktransfer/**", + "./plugins/redshop_payment/rs_payment_paypal/**", + "./plugins/redshop_product/sh404urls/**", + "./plugins/finder/redshop/**", + "./plugins/redshop_alert/alert/**", + "./plugins/redshop_shipping/default_shipping/**", + "./plugins/sh404sefextplugins/sh404sefextplugincom_redshop/**", + "./plugins/redshop_pdf/tcpdf/**", + "./plugins/redshop_export/attribute/**", + "./plugins/redshop_export/category/**", + "./plugins/redshop_export/field/**", + "./plugins/redshop_export/manufacturer/**", + "./plugins/redshop_export/newsletter_subscriber/**", + "./plugins/redshop_export/product/**", + "./plugins/redshop_export/product_stockroom_data/**", + "./plugins/redshop_export/related_product/**", + "./plugins/redshop_export/shipping_address/**", + "./plugins/redshop_export/shopper_group_attribute_price/**", + "./plugins/redshop_export/shopper_group_product_price/**", + "./plugins/redshop_export/user/**", + "./plugins/redshop_import/attribute/**", + "./plugins/redshop_import/category/**", + "./plugins/redshop_import/field/**", + "./plugins/redshop_import/manufacturer/**", + "./plugins/redshop_import/newsletter_subscriber/**", + "./plugins/redshop_import/product/**", + "./plugins/redshop_import/product_stockroom_data/**", + "./plugins/redshop_import/shipping_address/**", + "./plugins/redshop_import/shopper_group_product_price/**", + "./plugins/redshop_import/shopper_group_attribute_price/**", + "./plugins/redshop_import/user/**", + "./plugins/redshop_import/related_product/**", + "./plugins/quickicon/redshop/**", + "./plugins/search/redshop_categories/**", + "./plugins/search/redshop_products/**" + ]; + var excluded = [ + '!./plugins/redshop_pdf/tcpdf/helper/vendor/tecnickcom/tcpdf/fonts/!(courier*.php|helvetica*.php|symbol*.php|times*.php|uni2cid_a*.php|zapfdingbats*.php)', + '!./plugins/redshop_pdf/tcpdf/helper/vendor/tecnickcom/tcpdf/fonts/*/*' + ]; + var includedModules = [ + "./modules/site/mod_redshop_cart/**", + "./modules/site/mod_redshop_search/**" + ]; + + return included.concat(includedPlugins, includedModules, excluded); +} + +gulp.task("release:redshop", ["scripts:components.redshop", "sass:components.redshop", "composer:libraries.redshop", "composer:plugins.redshop_pdf.tcpdf"], function (cb) { + fs.readFile("./redshop.xml", function (err, data) { + parser.parseString(data, function (err, result) { + var version = result.extension.version[0]; + var fileName = argv.skipVersion ? "redshop.zip" : "redshop-v" + version + ".zip"; + var dest = config.releaseDir; + + gutil.log(gutil.colors.grey("====================================================================")); + gutil.log(gutil.colors.cyan.bold("redSHOP"), " | ", gutil.colors.yellow.bold(version), " | ", gutil.colors.white.bold(path.join(config.releaseDir + '/', fileName))); + gutil.log(gutil.colors.grey("====================================================================")); + var src = getIncludedExtensions(); + src = src.concat([ + "./component/**/*", + "./component/**/.gitkeep", + "./libraries/redshop/**/*", + "./libraries/redshop/vendor/**/*", + "./libraries/redshop/.gitkeep", + '!./**/composer.json', + '!./**/composer.lock', + '!./**/vendor/**/*.md', + '!./**/vendor/**/*.txt', + '!./**/vendor/**/*.TXT', + '!./**/vendor/**/*.pdf', + '!./**/vendor/**/LICENSE', + '!./**/vendor/**/CHANGES', + '!./**/vendor/**/README', + '!./**/vendor/**/VERSION', + '!./**/vendor/**/composer.json', + '!./**/vendor/**/.gitignore', + '!./**/vendor/**/docs', + '!./**/vendor/**/docs/**', + '!./**/vendor/**/tests', + '!./**/vendor/**/tests/**', + '!./**/vendor/**/unitTests', + '!./**/vendor/**/unitTests/**', + '!./**/vendor/**/.git', + '!./**/vendor/**/.git/**', + '!./**/vendor/**/examples', + '!./**/vendor/**/examples/**', + '!./**/vendor/**/build.xml', + '!./**/vendor/**/phpunit.xml', + '!./**/vendor/**/phpunit.xml.dist', + '!./**/vendor/**/phpcs.xml', + "!./**/vendor/**/Vagrantfile", + "./media/**/*", + "./media/**/.gitkeep", + "!./media/com_redshop/scss", + "!./media/com_redshop/scss/**", + "./*(install.php|LICENSE.txt|redshop.xml)" + ]); + return gulp.src(src, {base: "./"}) + .pipe(zip(fileName)) + .pipe(gulp.dest(dest)) + .on("end", cb); + }); + }); +}); \ No newline at end of file diff --git a/jgulp/tasks/watch.js b/jgulp/tasks/watch.js new file mode 100644 index 00000000000..a379e62d83a --- /dev/null +++ b/jgulp/tasks/watch.js @@ -0,0 +1,14 @@ +var gulp = require("gulp"); + +// Watch for file changes +gulp.task( + 'watch', + [ + 'watch:components', + 'watch:libraries', + 'watch:modules', + 'watch:packages', + 'watch:plugins' + ], function() { + return true; + }); diff --git a/libraries/index.html b/libraries/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/composer.json b/libraries/redshop/composer.json new file mode 100644 index 00000000000..9fe961d785c --- /dev/null +++ b/libraries/redshop/composer.json @@ -0,0 +1,21 @@ +{ + "name": "redcomponent-com/redshop-libraries", + "description": "a Joomla Webshop Component", + "license": "GPL-2.0+", + "require": { + "php": ">=5.6", + "doctrine/annotations": "1.4.0", + "doctrine/inflector": "1.1.0", + "behat/transliterator": "1.2.0", + "setasign/fpdf": "1.8.1", + "setasign/fpdi": "2.0.2", + "whichbrowser/parser": "2.0.32", + "imagine/imagine": "^0.7.1", + "ps/image-optimizer": "^1.1.2" + }, + "autoload": { + "psr-4": { + "Redshop\\": "src/" + } + } +} diff --git a/libraries/redshop/controller/admin.php b/libraries/redshop/controller/admin.php new file mode 100644 index 00000000000..f68afd22dcb --- /dev/null +++ b/libraries/redshop/controller/admin.php @@ -0,0 +1,51 @@ + state map. + * + * @var array + */ + protected $states = array( + 'publish' => 1, + 'unpublish' => 0, + 'archive' => 2, + 'trash' => -2, + 'report' => -3 + ); + + /** + * Constructor. + * + * @param array $config An optional associative array of configuration settings. + * + * @throws Exception + */ + public function __construct($config = array()) + { + parent::__construct($config); + + // J2.5 compatibility + if (null === $this->input) + { + $this->input = JFactory::getApplication()->input; + } + } + + /** + * Method to get a model object, loading it if required. + * + * @param string $name The model name. Optional. + * @param string $prefix The class prefix. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return object The model. + */ + public function getModel($name = '', $prefix = '', $config = array('ignore_request' => true)) + { + $class = get_class($this); + + if (empty($name)) + { + $name = strstr($class, 'Controller'); + $name = str_replace('Controller', '', $name); + $name = Inflector::singularize($name); + } + + if (empty($prefix)) + { + $prefix = strstr($class, 'Controller', true) . 'Model'; + } + + return parent::getModel($name, $prefix, $config); + } + + /** + * Method to save the submitted ordering values for records via AJAX. + * + * @return void + * + * @throws Exception + */ + public function saveOrderAjax() + { + // Get the input + $pks = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + + // Sanitize the input + $pks = ArrayHelper::toInteger($pks); + $order = ArrayHelper::toInteger($order); + + // Get the model + $model = $this->getModel(); + + // Save the ordering + $return = $model->saveorder($pks, $order); + + if ($return) + { + echo "1"; + } + + // Close the application + JFactory::getApplication()->close(); + } + + /** + * Removes an item. + * + * @return void + * + * @throws Exception + */ + public function delete() + { + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + + // Get items to remove from the request. + $cid = JFactory::getApplication()->input->get('cid', array(), 'array'); + + if (!is_array($cid) || count($cid) < 1) + { + JLog::add(JText::_($this->text_prefix . '_NO_ITEM_SELECTED'), JLog::WARNING, 'jerror'); + } + else + { + // Get the model. + $model = $this->getModel(); + + // Make sure the item ids are integers + $cid = ArrayHelper::toInteger($cid); + + // Remove the items. + if ($model->delete($cid)) + { + $this->setMessage(JText::plural($this->text_prefix . '_N_ITEMS_DELETED', count($cid))); + } + else + { + $this->setMessage($model->getError(), 'error'); + } + + // Invoke the postDelete method to allow for the child class to access the model. + $this->postDeleteHook($model, $cid); + } + + // Set redirect + $this->setRedirect($this->getRedirectToListRoute()); + } + + /** + * Method to publish a list of items + * + * @return void + * + * @throws Exception + */ + public function publish() + { + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + + // Get items to publish from the request. + $cid = JFactory::getApplication()->input->get('cid', array(), 'array'); + $value = ArrayHelper::getValue($this->states, $this->getTask(), 0, 'int'); + + if (empty($cid)) + { + JLog::add(JText::_($this->text_prefix . '_NO_ITEM_SELECTED'), JLog::WARNING, 'jerror'); + } + else + { + // Get the model. + $model = $this->getModel(); + + // Make sure the item ids are integers + $cid = ArrayHelper::toInteger($cid); + + // Publish the items. + try + { + $text = $this->text_prefix; + + if ($model->publish($cid, $value)) + { + switch ($this->getTask()) + { + case 'publish': + $text .= '_N_ITEMS_PUBLISHED'; + break; + + case 'unpublish': + $text .= '_N_ITEMS_UNPUBLISHED'; + break; + + case 'archive': + $text .= '_N_ITEMS_ARCHIVED'; + break; + + case 'trash': + $text .= '_N_ITEMS_TRASHED'; + break; + + case 'report': + $text .= '_N_ITEMS_REPORTED'; + break; + } + + $this->setMessage(JText::plural($text, count($cid))); + } + else + { + $this->setMessage($model->getError(), 'error'); + } + } + catch (Exception $e) + { + $this->setMessage(JText::_('JLIB_DATABASE_ERROR_ANCESTOR_NODES_LOWER_STATE'), 'error'); + } + } + + $extension = $this->input->get('extension'); + $extensionURL = ($extension) ? '&extension=' . $extension : ''; + + // Set redirect + $this->setRedirect($this->getRedirectToListRoute($extensionURL)); + } + + /** + * Check in of one or more records. + * + * @return boolean True on success + * + * @throws Exception + */ + public function checkin() + { + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + + $ids = JFactory::getApplication()->input->post->get('cid', array(), 'array'); + $model = $this->getModel(); + $return = $model->checkin($ids); + + if ($return === false) + { + // Check in failed. + $message = JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError()); + + // Set redirect + $this->setRedirect($this->getRedirectToListRoute(), $message, 'error'); + + return false; + } + + // Check in succeeded. + $message = JText::plural($this->text_prefix . '_N_ITEMS_CHECKED_IN', count($ids)); + + // Set redirect + $this->setRedirect($this->getRedirectToListRoute(), $message); + + return true; + } + + /** + * Changes the order of one or more records. + * + * @return boolean True on success + * + * @throws Exception + */ + public function reorder() + { + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + + $ids = JFactory::getApplication()->input->post->get('cid', array(), 'array'); + $inc = $this->getTask() === 'orderup' ? -1 : 1; + + $model = $this->getModel(); + $return = $model->reorder($ids, $inc); + + if ($return === false) + { + // Reorder failed. + $message = JText::sprintf('JLIB_APPLICATION_ERROR_REORDER_FAILED', $model->getError()); + + // Set redirect + $this->setRedirect($this->getRedirectToListRoute(), $message, 'error'); + + return false; + } + + // Reorder succeeded. + $message = JText::_('JLIB_APPLICATION_SUCCESS_ITEM_REORDERED'); + + // Set redirect + $this->setRedirect($this->getRedirectToListRoute(), $message); + + return true; + } + + /** + * Method to save the submitted ordering values for records. + * + * @return boolean True on success + */ + public function saveorder() + { + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + + // Get the input + $pks = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + + // Sanitize the input + $pks = ArrayHelper::toInteger($pks); + $order = ArrayHelper::toInteger($order); + + // Get the model + $model = $this->getModel(); + + // Save the ordering + $return = $model->saveorder($pks, $order); + + if ($return === false) + { + // Reorder failed + $message = JText::sprintf('JLIB_APPLICATION_ERROR_REORDER_FAILED', $model->getError()); + + // Set redirect + $this->setRedirect($this->getRedirectToListRoute(), $message, 'error'); + + return false; + } + + // Reorder succeeded. + $this->setMessage(JText::_('JLIB_APPLICATION_SUCCESS_ORDERING_SAVED')); + + // Set redirect + $this->setRedirect($this->getRedirectToListRoute()); + + return true; + } + + /** + * Get the JRoute object for a redirect to list. + * + * @param string $append An optional string to append to the route + * + * @return string The JRoute string + */ + protected function getRedirectToListRoute($append = null) + { + $returnUrl = (string) $this->input->get('return', '', 'Base64'); + + if ($returnUrl) + { + return JRoute::_(base64_decode($returnUrl) . $append, false); + } + + return JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $append, false); + } + + /** + * Method to publish a list of items + * + * @return void + * + * @throws Exception + */ + public function ajaxInlineEdit() + { + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + $app = JFactory::getApplication(); + + $editData = $this->input->get('jform_inline', array(), 'ARRAY'); + $editKey = $this->input->get('id', 0); + + if (empty($editData) || empty($editData[$editKey])) + { + echo 0; + + $app->close(); + } + + $editData = $editData[$editKey]; + + /** @var RedshopTable $table */ + $table = $this->getModel()->getTable(); + + if (!$table->load($editKey) || !$table->bind($editData) || !$table->check()) + { + echo 0; + + $app->close(); + } + + $table->setOption('inlineMode', true); + + if (!$table->store()) + { + echo 0; + + $app->close(); + } + + echo 1; + + $app->close(); + } + + /** + * Method to clone an existing item. + * + * @return void + * + * @since 2.0.7 + */ + public function copy() + { + JSession::checkToken() or die(JText::_('JINVALID_TOKEN')); + + $pks = $this->input->post->get('cid', array(), 'array'); + $pks = ArrayHelper::toInteger($pks); + + try + { + $model = $this->getModel(); + $model->copy($pks); + $this->setMessage(JText::plural('COM_REDSHOP_N_ITEMS_COPIED', count($pks))); + } + catch (Exception $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + + $this->setRedirect($this->getRedirectToListRoute()); + } +} diff --git a/libraries/redshop/controller/admin/index.html b/libraries/redshop/controller/admin/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/controller/admin/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/controller/controller.php b/libraries/redshop/controller/controller.php new file mode 100644 index 00000000000..fe4bf307a5e --- /dev/null +++ b/libraries/redshop/controller/controller.php @@ -0,0 +1,59 @@ +input->get('tmpl'); + $layout = $app->input->get('layout', 'edit', 'string'); + $append = ''; + + // Setup redirect info. + if ($tmpl) + { + $append .= '&tmpl=' . $tmpl; + } + + if ($layout) + { + $append .= '&layout=' . $layout; + } + + if ($recordId) + { + $append .= '&' . $urlVar . '=' . $recordId; + } + + return $append; + } +} diff --git a/libraries/redshop/controller/form.php b/libraries/redshop/controller/form.php new file mode 100644 index 00000000000..24787ae3e03 --- /dev/null +++ b/libraries/redshop/controller/form.php @@ -0,0 +1,732 @@ +methods = array(); + $this->message = null; + $this->messageType = 'message'; + $this->paths = array(); + $this->redirect = null; + $this->taskMap = array(); + + if (defined('JDEBUG') && JDEBUG) + { + JLog::addLogger(array('text_file' => 'jcontroller.log.php'), JLog::ALL, array('controller')); + } + + $this->input = JFactory::getApplication()->input; + + // Determine the methods to exclude from the base class. + $xMethods = get_class_methods('JControllerLegacy'); + + // Get the public methods in this class using reflection. + $r = new ReflectionClass($this); + $rMethods = $r->getMethods(ReflectionMethod::IS_PUBLIC); + + foreach ($rMethods as $rMethod) + { + $mName = $rMethod->getName(); + + // Add default display method if not explicitly declared. + if (!in_array($mName, $xMethods) || $mName == 'display') + { + $this->methods[] = strtolower($mName); + + // Auto register the methods as tasks. + $this->taskMap[strtolower($mName)] = $mName; + } + } + + // Set the view name + if (empty($this->name)) + { + if (array_key_exists('name', $config)) + { + $this->name = $config['name']; + } + else + { + $this->name = $this->getName(); + } + } + + // Set a base path for use by the controller + if (array_key_exists('base_path', $config)) + { + $this->basePath = $config['base_path']; + } + else + { + $this->basePath = JPATH_COMPONENT; + } + + // If the default task is set, register it as such + if (array_key_exists('default_task', $config)) + { + $this->registerDefaultTask($config['default_task']); + } + else + { + $this->registerDefaultTask('display'); + } + + // Set the models prefix + if (empty($this->model_prefix)) + { + if (array_key_exists('model_prefix', $config)) + { + // User-defined prefix + $this->model_prefix = $config['model_prefix']; + } + else + { + $this->model_prefix = $this->name . 'Model'; + } + } + + // Set the default model search path + if (array_key_exists('model_path', $config)) + { + // User-defined dirs + $this->addModelPath($config['model_path'], $this->model_prefix); + } + else + { + $this->addModelPath($this->basePath . '/models', $this->model_prefix); + } + + // Set the default view search path + if (array_key_exists('view_path', $config)) + { + // User-defined dirs + $this->setPath('view', $config['view_path']); + } + else + { + $this->setPath('view', $this->basePath . '/views'); + } + + // Set the default view. + if (array_key_exists('default_view', $config)) + { + $this->default_view = $config['default_view']; + } + elseif (empty($this->default_view)) + { + $this->default_view = $this->getName(); + } + + /** JControllerForm */ + // Guess the option as com_NameOfController + if (empty($this->option)) + { + $this->option = 'com_' . strtolower($this->getName()); + } + + // Guess the JText message prefix. Defaults to the option. + if (empty($this->text_prefix)) + { + $this->text_prefix = strtoupper($this->option); + } + + // Guess the context as the suffix, eg: OptionControllerContent. + if (empty($this->context)) + { + $r = null; + + if (!preg_match('/(.*)Controller(.*)/i', get_class($this), $r)) + { + throw new Exception(JText::_('JLIB_APPLICATION_ERROR_CONTROLLER_GET_NAME'), 500); + } + + $this->context = strtolower($r[2]); + } + + // Apply, Save & New, and Save As copy should be standard on forms. + $this->registerTask('apply', 'save'); + $this->registerTask('save2new', 'save'); + $this->registerTask('save2copy', 'save'); + + /** Custom */ + // Guess the item view as the context. + if (empty($this->view_item)) + { + $this->view_item = $this->context; + } + + if (empty($this->view_list)) + { + $this->view_list = Inflector::pluralize($this->view_item); + } + + if (!property_exists($this, 'input') || empty($this->input)) + { + $this->input = JFactory::getApplication()->input; + } + } + + /** + * Method to get a model object, loading it if required. + * + * @param string $name The model name. Optional. + * @param string $prefix The class prefix. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return object The model. + */ + public function getModel($name = '', $prefix = '', $config = array('ignore_request' => true)) + { + $class = get_class($this); + + if (empty($name)) + { + $name = strstr($class, 'Controller'); + $name = str_replace('Controller', '', $name); + } + + if (empty($prefix)) + { + $prefix = strstr($class, 'Controller', true) . 'Model'; + } + + return parent::getModel($name, $prefix, $config); + } + + /** + * 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. + */ + public function cancel($key = null) + { + JSession::checkToken() or jexit(JText::_('INVALID_TOKEN')); + + $app = JFactory::getApplication(); + $model = $this->getModel(); + $table = $model->getTable(); + $checkin = property_exists($table, 'checked_out'); + $context = "$this->option.edit.$this->context"; + + if (empty($key)) + { + $key = $table->getKeyName(); + } + + $recordId = $app->input->getInt($key); + + // Attempt to check-in the current record. + if ($recordId) + { + // Check we are holding the id in the edit list. + if (!$this->checkEditId($context, $recordId)) + { + // Somehow the person just went to the form - we don't allow that. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $recordId)); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect to the list screen + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + + return false; + } + + if ($checkin) + { + if ($model->checkin($recordId) === false) + { + // Check-in failed, go back to the record and display a notice. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError())); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $key)) + ); + + return false; + } + } + } + + // Clean the session data and redirect. + $this->releaseEditId($context, $recordId); + $app->setUserState($context . '.data', null); + + // Redirect to the list screen + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + + return true; + } + + /** + * Method to edit an existing 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 access level check and checkout passes, false otherwise. + */ + public function edit($key = null, $urlVar = null) + { + $app = JFactory::getApplication(); + $model = $this->getModel(); + $table = $model->getTable(); + $cid = $this->input->post->get('cid', array(), 'array'); + $context = "$this->option.edit.$this->context"; + + // Determine the name of the primary key for the data. + if (empty($key)) + { + $key = $table->getKeyName(); + } + + // To avoid data collisions the urlVar may be different from the primary key. + if (empty($urlVar)) + { + $urlVar = $key; + } + + // Get the previous record id (if any) and the current record id. + $recordId = (int) (count($cid) ? $cid[0] : $this->input->getInt($urlVar)); + $checkin = property_exists($table, 'checked_out'); + + // Access check. + if (!$this->allowEdit(array($key => $recordId), $key)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED')); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect to the list screen + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + + return false; + } + + // Attempt to check-out the new record for editing and redirect. + if ($checkin && !$model->checkout($recordId)) + { + // Check-out failed, display a notice but allow the user to see the record. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKOUT_FAILED', $model->getError())); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return false; + } + else + { + // Check-out succeeded, push the new record id into the session. + $this->holdEditId($context, $recordId); + $app->setUserState($context . '.data', null); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return true; + } + } + + /** + * Method to add a new record. + * + * @return mixed True if the record can be added, a error object if not. + */ + public function add() + { + $app = JFactory::getApplication(); + $context = "$this->option.edit.$this->context"; + + // Access check. + if (!$this->allowAdd()) + { + // Set the internal error and also the redirect error. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED')); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect to the list screen + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + + return false; + } + + // Clear the record edit information from the session. + $app->setUserState($context . '.data', null); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend()) + ); + + return true; + } + + /** + * 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. + * @throws Exception + */ + public function save($key = null, $urlVar = null) + { + // Check for request forgeries. + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $app = JFactory::getApplication(); + $lang = JFactory::getLanguage(); + $model = $this->getModel(); + $table = $model->getTable(); + $data = $this->input->post->get('jform', array(), 'array'); + $checkin = property_exists($table, 'checked_out'); + $context = "$this->option.edit.$this->context"; + $task = $this->getTask(); + + // Determine the name of the primary key for the data. + if (null === $key) + { + $key = $table->getKeyName(); + } + + // To avoid data collisions the urlVar may be different from the primary key. + if (null === $urlVar) + { + $urlVar = $key; + } + + if (isset($data['start_date']) && isset($data['end_date'])) + { + $this->handleDateTimeRange($data['start_date'], $data['end_date']); + } + + $recordId = $this->input->getInt($urlVar); + + if (!$this->checkEditId($context, $recordId)) + { + // Somehow the person just went to the form and tried to save it. We don't allow that. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $recordId)); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect to the list screen + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + + return false; + } + + // Populate the row id from the session. + $data[$key] = $recordId; + + // The save2copy task needs to be handled slightly differently. + if ($task === 'save2copy') + { + // Check-in the original row. + if ($checkin && $model->checkin($data[$key]) === false) + { + // Check-in failed. Go back to the item and display a notice. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError())); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return false; + } + + // Reset the ID, the multilingual associations and then treat the request as for Apply. + $data[$key] = 0; + $data['associations'] = array(); + $task = 'apply'; + } + + // Access check. + if (!$this->allowSave($data, $key)) + { + /** @scrutinizer ignore-deprecated */ $this->setError(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED')); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect to the list screen + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + + return false; + } + + // Validate the posted data. + // Sometimes the form needs some posted data, such as for plugins and modules. + $form = $model->getForm($data, false); + + if (!$form) + { + $app->enqueueMessage($model->getError(), 'error'); + + return false; + } + + // Test whether the data is valid. + $validData = $model->validate($form, $data); + + // Check for validation errors. + if ($validData === false) + { + // Get the validation messages. + $errors = $model->getErrors(); + + // Push up to three validation messages out to the user. + for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) + { + if ($errors[$i] instanceof Exception) + { + $app->enqueueMessage($errors[$i]->getMessage(), 'error'); + } + else + { + $app->enqueueMessage($errors[$i], 'error'); + } + } + + // Save the data in the session. + $app->setUserState($context . '.data', $data); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return false; + } + + if (!isset($validData['tags'])) + { + $validData['tags'] = null; + } + + // Attempt to save the data. + if (!$model->save($validData)) + { + // Save the data in the session. + $app->setUserState($context . '.data', $validData); + + // Redirect back to the edit screen. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError())); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return false; + } + + // Save succeeded, so check-in the record. + if ($checkin && $model->checkin($validData[$key]) === false) + { + // Save the data in the session. + $app->setUserState($context . '.data', $validData); + + // Check-in failed, so go back to the record and display a notice. + /** @scrutinizer ignore-deprecated */ $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError())); + $this->setMessage(/** @scrutinizer ignore-deprecated */ $this->getError(), 'error'); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + + return false; + } + + $this->setMessage( + JText::_( + ($lang->hasKey($this->text_prefix . ($recordId == 0 && $app->isClient('site') ? '_SUBMIT' : '') . '_SAVE_SUCCESS') + ? $this->text_prefix + : 'JLIB_APPLICATION') . ($recordId == 0 && $app->isClient('site') ? '_SUBMIT' : '') . '_SAVE_SUCCESS' + ) + ); + + // Redirect the user and adjust session state based on the chosen task. + switch ($task) + { + case 'apply': + // Set the record data in the session. + $recordId = $model->getState($this->context . '.id'); + $this->holdEditId($context, $recordId); + $app->setUserState($context . '.data', null); + $model->checkout($recordId); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend($recordId, $urlVar)) + ); + break; + + case 'save2new': + // Clear the record id and data from the session. + $this->releaseEditId($context, $recordId); + $app->setUserState($context . '.data', null); + + // Redirect back to the edit screen. + $this->setRedirect( + $this->getRedirectToItemRoute($this->getRedirectToItemAppend(null, $urlVar)) + ); + break; + + default: + // Clear the record id and data from the session. + $this->releaseEditId($context, $recordId); + $app->setUserState($context . '.data', null); + + // Set redirect + $this->setRedirect( + $this->getRedirectToListRoute($this->getRedirectToListAppend()) + ); + break; + } + + // Invoke the postSave method to allow for the child class to access the model. + $this->postSaveHook($model, $validData); + + return true; + } + + /** + * 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. + */ + protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id') + { + $append = parent::getRedirectToItemAppend($recordId, $urlVar); + + $return = $this->input->get('return', '', 'Base64'); + + if ($return) + { + $append .= '&return=' . $return; + } + + return $append; + } + + /** + * Gets the URL arguments to append to a list redirect. + * + * @return string The arguments to append to the redirect URL. + */ + protected function getRedirectToListAppend() + { + $append = parent::getRedirectToListAppend(); + + $return = $this->input->get('return', '', 'Base64'); + + if ($return) + { + $append .= '&return=' . $return; + } + + return $append; + } + + /** + * Get the JRoute object for a redirect to list. + * + * @param string $append An optional string to append to the route + * + * @return string + */ + protected function getRedirectToListRoute($append = null) + { + $returnUrl = $this->input->get('return', '', 'Base64'); + + if ($returnUrl) + { + $returnUrl = base64_decode($returnUrl); + + return JRoute::_($returnUrl . $append, false); + } + + return JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $append, false); + } + + /** + * Get the JRoute object for a redirect to item. + * + * @param string $append An optionnal string to append to the route + * + * @return string The url string + */ + protected function getRedirectToItemRoute($append = null) + { + return JRoute::_( + 'index.php?option=' . $this->option . '&view=' . $this->view_item + . $append, false + ); + } +} diff --git a/libraries/redshop/controller/index.html b/libraries/redshop/controller/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/controller/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/entities/collection.php b/libraries/redshop/entities/collection.php new file mode 100644 index 00000000000..1a01f64374e --- /dev/null +++ b/libraries/redshop/entities/collection.php @@ -0,0 +1,256 @@ +entities = $entities; + } + + /** + * Adds an entity to the collection. It won't add any entity that already exists + * + * @param RedshopEntity $entity Entity going to be added + * + * @return self + */ + public function add(RedshopEntity $entity) + { + if ($entity->hasId() && !$this->has($entity->getId())) + { + $this->entities[$entity->getId()] = $entity; + } + + return $this; + } + + /** + * Clears the entities of the collection + * + * @return self + */ + public function clear() + { + $this->entities = array(); + + return $this; + } + + /** + * Gets the count of entities in this collection + * + * @return integer + */ + public function count() + { + return count($this->entities); + } + + /** + * Get the active entity. + * Iterator implementation. + * + * @return mixed RedshopEntity | FALSE if no entities + */ + public function current() + { + return current($this->entities); + } + + /** + * Get an item by it's id + * + * @param integer $id Item's identifier + * + * @return mixed RedshopEntity if item exists. Null otherwise + */ + public function get($id) + { + if ($this->has($id)) + { + return $this->entities[$id]; + } + + return null; + } + + /** + * Gets all the entities + * + * @return array + */ + public function getAll() + { + return $this->entities; + } + + /** + * Check if an entity is already in this collection + * + * @param integer $id Entity identifier + * + * @return boolean + */ + public function has($id) + { + return isset($this->entities[$id]); + } + + /** + * Returns ids of the entities in the collection + * + * @return array + */ + public function ids() + { + return array_keys($this->entities); + } + + /** + * Check if the collection is empty + * + * @return boolean + */ + public function isEmpty() + { + return !$this->entities; + } + + /** + * Return the id of the active entity. + * Iterator implementation. + * + * @return mixed integer | FALSE if no entities + */ + public function key() + { + return key($this->entities); + } + + /** + * Gets the next entity. + * Iterator implementation. + * + * @return mixed RedshopEntity | FALSE if no entities + */ + public function next() + { + return next($this->entities); + } + + /** + * Removes an item from the collection + * + * @param integer $id Entity identifier + * + * @return boolean + */ + public function remove($id) + { + if (!$this->has($id)) + { + return false; + } + + unset($this->entities[$id]); + + return true; + } + + /** + * Method to get the first entity. + * Iterator implementation. + * + * @return mixed RedshopEntity | FALSE if no entities + */ + public function rewind() + { + return reset($this->entities); + } + + /** + * Sets an item. This removes previous item if it already exists + * + * @param integer $id Entity identifier + * @param RedshopEntity $entity Entity + * + * @return self + */ + public function set($id, RedshopEntity $entity) + { + $this->entities[$id] = $entity; + + return $this; + } + + /** + * Return entities as stdClass objects + * + * @return array An array of stdClass objects + */ + public function toObjects() + { + $objects = array(); + + foreach ($this->entities as $id => $entity) + { + $objects[$id] = $entity->getItem(); + } + + return $objects; + } + + /** + * Return entities as an array of a single field + * + * @param string $fieldName Name of the field to return in the array + * + * @return array An array of fields + */ + public function toFieldArray($fieldName) + { + $fields = array(); + + foreach ($this->entities as $id => $entity) + { + $fields[] = $entity->getItem()->$fieldName; + } + + return $fields; + } + + /** + * Check if there are still entities in the entities array. + * Iterator implementation. + * + * @return boolean + */ + public function valid() + { + return key($this->entities) !== null; + } +} diff --git a/libraries/redshop/entities/index.html b/libraries/redshop/entities/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/entities/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/entity/accessory.php b/libraries/redshop/entity/accessory.php new file mode 100644 index 00000000000..985ad2a8394 --- /dev/null +++ b/libraries/redshop/entity/accessory.php @@ -0,0 +1,32 @@ +id = $id; + } + + if (null === $this->tableKey) + { + $this->tableKey = false !== $this->getTable() ? $this->getTable()->getKeyName() : 'id'; + } + } + + /** + * Bind an object/array to the entity + * + * @param mixed $item Array/Object containing the item fields + * + * @return $this + */ + public function bind($item) + { + // Accept basic array binding + if (is_array($item)) + { + $item = (object) $item; + } + + $this->item = $item; + + if (property_exists($item, 'id')) + { + $this->id = $item->id; + + $class = get_called_class(); + + // Ensure that we cache the item + if (!isset(static::$instances[$class][$this->id])) + { + static::$instances[$class][$this->id] = $this; + } + } + + return $this; + } + + /** + * Check if current user can create an item + * + * @return boolean + * + * @since 1.0 + */ + public function canCreate() + { + if ($this->canDo($this->getAclPrefix() . '.create')) + { + return true; + } + + if ($this->canDo($this->getAclPrefix() . '.create.own')) + { + return $this->isOwner(); + } + + return false; + } + + /** + * Check if current user can delete an item + * + * @return boolean + */ + public function canDelete() + { + if (!$this->hasId()) + { + return false; + } + + if ($this->canDo($this->getAclPrefix() . '.delete')) + { + return true; + } + + if ($this->canDo($this->getAclPrefix() . '.delete.own')) + { + return $this->isOwner(); + } + + return false; + } + + /** + * Check if current user can edit this item + * + * @return boolean + */ + public function canEdit() + { + if (!$this->hasId()) + { + return false; + } + + // User has global edit permissions + if ($this->canDo($this->getAclPrefix() . '.edit')) + { + return true; + } + + // User has global edit permissions + if ($this->canDo($this->getAclPrefix() . '.edit.own')) + { + return $this->isOwner(); + } + + return false; + } + + /** + * Check if current user has permission to perform an action + * + * @param string $action The action. Example: core.create + * + * @return boolean + */ + public function canDo($action) + { + $user = JFactory::getUser(); + + return $user->authorise($action, $this->getAssetName()); + } + + /** + * Check if user can view this item. + * + * @return boolean + * + * @since 1.0 + */ + public function canView() + { + $item = $this->getItem(); + + if (!$item) + { + return false; + } + + return ((int) $item->state === static::STATE_ENABLED || $this->isOwner()); + } + + /** + * Remove an instance from cache + * + * @param integer $id Identifier of the active item + * + * @return void + */ + public static function clearInstance($id = null) + { + $class = get_called_class(); + + unset(static::$instances[$class][$id]); + } + + /** + * Format a link + * + * @param string $url Url to format + * @param boolean $routed Process Url through JRoute? + * @param boolean $xhtml Replace & by & for XML compliance. + * + * @return string + */ + protected function formatUrl($url, $routed = true, $xhtml = true) + { + if (!$url) + { + return null; + } + + if (!$routed) + { + return $url; + } + + return JRoute::_($url, $xhtml); + } + + /** + * Get an item property + * + * @param string $property Property to get + * @param mixed $default Default value to assign if property === null | property === '' + * + * @return string + */ + public function get($property, $default = null) + { + $item = $this->getItem(); + + if (!empty($item) && property_exists($item, $property)) + { + return ($item->$property !== null && $item->$property !== '') ? $item->$property : $default; + } + + return $default; + } + + /** + * Set an item property + * + * @param string $property Property to get + * @param mixed $data Data for set to property + * + * @return self + */ + public function set($property, $data = null) + { + if (null === $this->item) + { + $this->loadItem(); + } + + $this->item->{$property} = $data; + + return $this; + } + + /** + * Get the ACL prefix applied to this class + * + * @return string + * + * @since 1.0 + */ + public function getAclPrefix() + { + return $this->aclPrefix; + } + + /** + * Get the item add link + * + * @param mixed $itemId Specify a custom itemId if needed. Default: joomla way to use active itemid + * @param boolean $routed Process URL with JRoute? + * @param boolean $xhtml Replace & by & for XML compliance. + * + * @return string + */ + public function getAddLink($itemId = 'inherit', $routed = true, $xhtml = true) + { + $url = $this->getBaseUrl() . '&task=' . $this->getInstanceName() . '.add' . $this->getLinkItemIdString($itemId); + + return $this->formatUrl($url, $routed, $xhtml); + } + + /** + * Get the item add link with a return link to the current page. + * + * @param mixed $itemId Specify a custom itemId if needed. Default: joomla way to use active itemid + * @param boolean $routed Process URL with JRoute? + * @param boolean $xhtml Replace & by & for XML compliance. + * + * @return string + */ + public function getAddLinkWithReturn($itemId = 'inherit', $routed = true, $xhtml = true) + { + $url = $this->getAddLink($itemId, false, false) . '&return=' . base64_encode(JUri::getInstance()->toString()); + + return $this->formatUrl($url, $routed, $xhtml); + } + + /** + * Get the identifier of the project asset + * + * @return string + */ + protected function getAssetName() + { + if ($this->hasId()) + { + return $this->getComponent() . '.' . $this->getInstanceName() . '.' . $this->id; + } + + // Use the global permissions + return $this->getComponent(); + } + + /** + * Gets the base URL for tasks/views. + * + * Example: index.php?option=com_redshopb&view=shop + * + * @return string + */ + protected function getBaseUrl() + { + return 'index.php?option=' . $this->getComponent() . '&view=' . $this->getInstanceName(); + } + + /** + * Get the component that contains the tables + * + * @return string + */ + protected function getComponent() + { + if (null === $this->component) + { + $this->component = $this->getComponentFromPrefix(); + } + + return $this->component; + } + + /** + * Get the component from the prefix. Ex.: ContentEntityArticle will return com_content + * + * @return string + */ + protected function getComponentFromPrefix() + { + return 'com_' . $this->getPrefix(); + } + + /** + * Get an entity date field formatted + * + * @param string $itemProperty Item property containing the date + * @param string $format Desired date format + * @param boolean $translateFormat Translate the format for multilanguage purposes + * + * @return string + */ + public function getDate($itemProperty, $format = 'DATE_FORMAT_LC1', $translateFormat = true) + { + $item = $this->getItem(); + + if (!$item || !property_exists($item, $itemProperty)) + { + return null; + } + + if ($format && $translateFormat) + { + $format = JText::_($format); + } + + return JHtml::_('date', $item->{$itemProperty}, $format); + } + + /** + * Local proxy for JFactory::getDbo() + * + * @return JDatabaseDriver + */ + protected function getDbo() + { + return JFactory::getDbo(); + } + + /** + * Get the item delete link + * + * @param mixed $itemId Specify a custom itemId if needed. Default: joomla way to use active itemid + * @param boolean $routed Process URL with JRoute? + * @param boolean $xhtml Replace & by & for XML compliance. + * + * @return string + */ + public function getDeleteLink($itemId = 'inherit', $routed = true, $xhtml = true) + { + if (!$this->hasId()) + { + return null; + } + + $urlToken = '&' . JSession::getFormToken() . '=1'; + + $url = $this->getBaseUrl() . '&task=' . $this->getInstanceName() + . '.delete&id=' . $this->getSlug() . $urlToken . $this->getLinkItemIdString($itemId); + + return $this->formatUrl($url, $routed, $xhtml); + } + + /** + * Get the item delete link with a return link to the current page. + * + * @param mixed $itemId Specify a custom itemId if needed. Default: joomla way to use active itemid + * @param boolean $routed Process URL with JRoute? + * @param boolean $xhtml Replace & by & for XML compliance. + * + * @return string + */ + public function getDeleteLinkWithReturn($itemId = 'inherit', $routed = true, $xhtml = true) + { + if (!$this->hasId()) + { + return null; + } + + $url = $this->getDeleteLink($itemId, false, false) . '&return=' . base64_encode(JUri::getInstance()->toString()); + + return $this->formatUrl($url, $routed, $xhtml); + } + + /** + * Get the item edit link + * + * @param mixed $itemId Specify a custom itemId if needed. Default: joomla way to use active itemid + * @param boolean $routed Process URL with JRoute? + * @param boolean $xhtml Replace & by & for XML compliance. + * + * @return string + */ + public function getEditLink($itemId = 'inherit', $routed = true, $xhtml = true) + { + if (!$this->hasId()) + { + return null; + } + + $url = $this->getBaseUrl() . '&task=' . $this->getInstanceName() + . '.edit&id=' . $this->getSlug() . $this->getLinkItemIdString($itemId); + + return $this->formatUrl($url, $routed, $xhtml); + } + + /** + * Get the item edit link with a return link to the current page. + * + * @param mixed $itemId Specify a custom itemId if needed. Default: joomla way to use active itemid + * @param boolean $routed Process URL with JRoute? + * @param boolean $xhtml Replace & by & for XML compliance. + * + * @return string + * + * @since 1.0 + */ + public function getEditLinkWithReturn($itemId = 'inherit', $routed = true, $xhtml = true) + { + if (!$this->hasId()) + { + return null; + } + + $url = $this->getEditLink($itemId, false, false) . '&return=' . base64_encode(JUri::getInstance()->toString()); + + return $this->formatUrl($url, $routed, $xhtml); + } + + /** + * Create and return a cached instance + * + * @param integer $id Identifier of the active item + * + * @return $this + */ + public static function getInstance($id = null) + { + if (null === $id) + { + return new static; + } + + $class = get_called_class(); + + if (empty(static::$instances[$class][$id])) + { + static::$instances[$class][$id] = new static($id); + } + + return static::$instances[$class][$id]; + } + + /** + * Create and return a cached instance by a different field of the table (UID) + * + * @param string $fieldName Field to use + * @param string $fieldValue Key value + * + * @return $this + */ + public static function getInstanceByField($fieldName, $fieldValue) + { + $instance = static::getInstance(); + + return $instance->loadItem($fieldName, $fieldValue); + } + + /** + * Get the name of the current entity type + * + * @return string + */ + public function getInstanceName() + { + $class = get_class($this); + + $name = strstr($class, 'Entity'); + $name = str_replace('Entity', '', $name); + + return strtolower($name); + } + + /** + * Get the id + * + * @return integer | null + */ + public function getId() + { + return $this->id; + } + + /** + * Get item from the database + * + * @return mixed Object / null + */ + public function getItem() + { + if (empty($this->item)) + { + $this->loadItem(); + } + + return $this->item; + } + + /** + * Get the item link + * + * @param mixed $itemId Specify a custom itemId if needed. Default: joomla way to use active itemid + * @param boolean $routed Process URL with JRoute? + * @param boolean $xhtml Replace & by & for XML compliance. + * + * @return string + */ + public function getLink($itemId = 'inherit', $routed = true, $xhtml = true) + { + if (!$this->hasId()) + { + return null; + } + + $url = $this->getBaseUrl() . '&id=' . $this->getSlug() . $this->getLinkItemIdString($itemId); + + return $this->formatUrl($url, $routed, $xhtml); + } + + /** + * Generate the Itemid string part for URLs + * + * @param mixed $itemId inherit or desired itemId. Use 0 to not inherit active itemId + * + * @return string + */ + protected function getLinkItemIdString($itemId = 'inherit') + { + return ($itemId !== 'inherit') ? '&Itemid=' . (int) $itemId : null; + } + + /** + * Get the prefix of this entity. + * + * @return string + * + * @since 2.0 + */ + protected function getPrefix() + { + $class = get_class($this); + + return strtolower(strstr($class, 'Entity', true)); + } + + /** + * Generate the item slug for URLs + * + * @return string + */ + protected function getSlug() + { + $item = $this->getItem(); + + if (!$item) + { + return $this->hasId() ? $this->id : null; + } + + return !empty($item->alias) ? $this->id . '-' . $item->alias : $this->id; + } + + /** + * Get the associated table + * + * @param string $name Main name of the Table. Example: Article for ContentTableArticle + * + * @return RedshopTable + */ + public function getTable($name = null) + { + if (null === $name) + { + $class = get_class($this); + $name = strstr($class, 'Entity'); + } + + $name = str_replace('Entity', '', $name); + + return RedshopTable::getAdminInstance($name, array(), $this->getComponent()); + } + + /** + * Check if we have an identifier loaded + * + * @return boolean + */ + public function hasId() + { + $id = (int) $this->id; + + return !empty($id); + } + + /** + * Check if item has been loaded + * + * @return boolean + */ + public function isLoaded() + { + return ($this->hasId() && $this->item !== null); + } + + /** + * Check if current member is owner + * + * @return boolean + * + * @since 1.0 + */ + public function isOwner() + { + if (!$this->hasId()) + { + return false; + } + + $user = JFactory::getUser(); + + if ($user->get('guest')) + { + return false; + } + + $item = $this->getItem(); + + if (!$item) + { + return false; + } + + return ($item->created_by == $user->get('id')); + } + + /** + * Basic instance check: has id + loadable item + * + * @return boolean + */ + public function isValid() + { + if (!$this->hasId()) + { + return false; + } + + $item = $this->getItem(); + + return !empty($item); + } + + /** + * Load a cached instance and ensure that the item is loaded + * + * @param integer $id Identifier of the active item + * + * @return self + */ + public static function load($id = null) + { + $instance = static::getInstance($id); + + if (!$instance->isLoaded()) + { + $instance->loadItem(); + } + + return $instance; + } + + /** + * Load the item already loaded in a table + * + * @param RedshopTable|JTable $table Table with the item loaded + * + * @return self + */ + public function loadFromTable($table) + { + $key = $table->getKeyName(); + + if (!empty($table->{$key})) + { + // Get the data from the table + if (method_exists($table, 'getTableProperties')) + { + // Redshopb method to get only public properties + $data = $table->getTableProperties(); + } + else + { + // Fallback for every other JTable (not redshopb tables) + $data = $table->getProperties(true); + } + + // Item is always an object + $this->item = ArrayHelper::toObject($data); + + $this->id = $table->{$key}; + $this->table = clone $table; + + $class = get_called_class(); + + // Ensure that we cache the item + if (!isset(static::$instances[$class][$this->id]) || !static::$instances[$class][$this->id]->isLoaded()) + { + static::$instances[$class][$this->id] = $this; + } + } + + return $this; + } + + /** + * Default loading is trying to use the associated table + * + * @param string $key Field name used as key + * @param string $keyValue Value used if it's not the $this->id property of the instance + * + * @return self + */ + public function loadItem($key = null, $keyValue = null) + { + $key = null === $key ? $this->tableKey : $key; + + if ($key === $this->tableKey && !$this->hasId()) + { + return $this; + } + + $table = $this->getTable(); + + if (false !== $table && $table->load(array($key => ($key === $this->tableKey ? $this->id : $keyValue)))) + { + $this->loadFromTable($table); + } + + return $this; + } + + /** + * @param array $data Data + * + * @return self + */ + public function loadItemByArray($data) + { + $table = $this->getTable(); + + if (false === $table) + { + return $this; + } + + if ($table->load($data)) + { + $this->loadFromTable($table); + } + + return $this; + } + + /** + * Try to directly save the entity using the associated table + * + * @param mixed $item Object / Array to save. Null = try to store current item + * + * @return boolean|integer The item id + * + * @since 1.0 + */ + public function save($item = null) + { + if (!$this->processBeforeSaving($item)) + { + return false; + } + + if (null === $item) + { + $item = $this->getItem(); + } + + if (!$item) + { + JLog::add("Nothing to save", JLog::ERROR, 'entity'); + + return false; + } + + try + { + $table = $this->getTable(); + } + catch (Exception $exception) + { + JLog::add("Table for instance " . $this->getInstanceName() . " could not be loaded", JLog::ERROR, 'entity'); + + return false; + } + + if (!$table->save((array) $item)) + { + JLog::add($table->getError(), JLog::ERROR, 'entity'); + + return false; + } + + // Force entity reload / save to cache + static::clearInstance($this->id); + static::loadFromTable($table); + + $this->processAfterSaving($table); + + return $table->{$table->getKeyName()}; + } + + /** + * Method for reset this static for load new data. + * + * @return self + * + * @since 2.0.6 + */ + public function reset() + { + if (!$this->isLoaded()) + { + return $this; + } + + $class = get_called_class(); + $id = $this->getId(); + + unset(static::$instances[$class][$id]); + + return static::getInstance($id); + } + + /** + * Process $item data before saving. + * + * @param mixed $item Array / Object of data. + * + * @return boolean Return false will break save process + */ + public function processBeforeSaving(&$item) + { + return true; + } + + /** + * Process data after saving. + * + * @param JTable $table JTable instance data. + * + * @return boolean + */ + public function processAfterSaving(&$table) + { + return true; + } +} diff --git a/libraries/redshop/entity/category.php b/libraries/redshop/entity/category.php new file mode 100644 index 00000000000..895e51310e0 --- /dev/null +++ b/libraries/redshop/entity/category.php @@ -0,0 +1,302 @@ +productCount)) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('COUNT(category_id)') + ->from($db->qn('#__redshop_product_category_xref')) + ->where($db->qn('category_id') . ' = ' . $db->quote((int) $this->getId())); + + $this->productCount = $db->setQuery($query)->loadResult(); + } + + return $this->productCount; + } + + /** + * Method for get products of current category + * + * @return array + * + * @since 2.0.6 + */ + public function getProducts($includeProductsFromSubCat = false) + { + if (null === $this->products) + { + $this->loadProducts($includeProductsFromSubCat); + } + + return $this->products; + } + + /** + * Method for load products + * + * @return $this + * + * @since 2.0.6 + */ + protected function loadProducts($includeProductsFromSubCat = false) + { + if (!$this->hasId()) + { + return $this; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('DISTINCT p.product_id AS id') + ->select('p.*') + ->from($db->qn('#__redshop_product_category_xref', 'pcx')) + ->leftJoin($db->qn('#__redshop_product', 'p') . ' ON ' . $db->qn('p.product_id') . ' = ' . $db->qn('pcx.product_id')) + ->leftJoin($db->qn('#__redshop_category', 'c') . ' ON ' . $db->qn('pcx.category_id') . ' = ' . $db->qn('c.id')) + ->where($db->qn('p.published') . ' = 1') + ->order($db->qn('p.product_id') . ' DESC'); + + $categories = array(); + + if ($includeProductsFromSubCat) + { + $childs = $this->getChildCategories(); + + if ($childs && !$childs->isEmpty()) + { + $categories = $childs->toFieldArray('id'); + } + } + + $categories[] = (int) $this->getId(); + + $query->where($db->qn('c.id') . ' IN (' . implode(',', $categories) . ')'); + + $this->products = $db->setQuery($query)->loadObjectList(); + + return $this; + } + + /** + * Method for get child categories of current category + * + * @return RedshopEntitiesCollection + * + * @since 2.0.6 + */ + public function getChildCategories() + { + if (null === $this->childCategories) + { + $this->loadChildCategories(); + } + + return $this->childCategories; + } + + /** + * Method for load child categories + * + * @return self + * + * @since 2.0.6 + */ + protected function loadChildCategories() + { + if (!$this->hasId()) + { + return $this; + } + + $this->childCategories = new RedshopEntitiesCollection; + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('id') + ->from($db->qn('#__redshop_category')) + ->where($db->qn('lft') . ' > ' . $this->get('lft')) + ->where($db->qn('rgt') . ' < ' . $this->get('rgt')); + + $results = $db->setQuery($query)->loadColumn(); + + if (empty($results)) + { + return $this; + } + + foreach ($results as $categoryId) + { + $this->childCategories->add(self::getInstance($categoryId)); + } + + return $this; + } + + /** + * Method for get medias of current category + * + * @return RedshopEntitiesCollection + * + * @since 2.1.0 + */ + public function getMedia() + { + if (null === $this->media) + { + $this->loadMedia(); + } + + return $this->media; + } + + /** + * Method for load medias + * + * @return self + * + * @since 2.1.0 + */ + protected function loadMedia() + { + $this->media = new RedshopEntitiesCollection; + + if (!$this->hasId()) + { + return $this; + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('media_id') + ->from($db->qn('#__redshop_media')) + ->where($db->qn('media_section') . ' = ' . $db->quote('category')) + ->where($db->qn('section_id') . ' = ' . $db->quote($this->getId())); + + $results = $db->setQuery($query)->loadColumn(); + + if (empty($results)) + { + return $this; + } + + foreach ($results as $mediaId) + { + $this->media->add(RedshopEntityMedia::getInstance($mediaId)); + } + + return $this; + } + + /** + * Try to directly save the entity using the associated table + * + * @param mixed $item Object / Array to save. Null = try to store current item + * + * @return integer|boolean The item id + * + * @since 1.0 + */ + public function save($item = null) + { + if (!$this->processBeforeSaving($item)) + { + return false; + } + + if (null === $item) + { + $item = $this->getItem(); + } + + if (!$item) + { + JLog::add("Nothing to save", JLog::ERROR, 'entity'); + + return false; + } + + try + { + /** @var RedshopTableCategory $table */ + $table = $this->getTable(); + } + catch (\Exception $e) + { + JLog::add("Table for instance " . $this->getInstanceName() . " could not be loaded", JLog::ERROR, 'entity'); + + return false; + } + + $item = Joomla\Utilities\ArrayHelper::fromObject($item); + + $table->setLocation(isset($item['parent_id']) ? $item['parent_id'] : RedshopHelperCategory::getRootId(), 'last-child'); + + if (!$table->save($item)) + { + JLog::add($table->getError(), JLog::ERROR, 'entity'); + + return false; + } + + // Force entity reload / save to cache + static::clearInstance($this->id); + static::getInstance($this->id)->loadFromTable($table); + + $this->processAfterSaving($table); + + return (int) $table->{$table->getKeyName()}; + } +} diff --git a/libraries/redshop/entity/country.php b/libraries/redshop/entity/country.php new file mode 100644 index 00000000000..a0bac439df9 --- /dev/null +++ b/libraries/redshop/entity/country.php @@ -0,0 +1,21 @@ +getTable(); + + if (!$table->load(array('code' => $code))) + { + return self::getInstance(); + } + + static::$codeInstance[$code] = $table->id; + } + + return self::getInstance(static::$codeInstance[$code]); + } +} diff --git a/libraries/redshop/entity/discount.php b/libraries/redshop/entity/discount.php new file mode 100644 index 00000000000..418688efc04 --- /dev/null +++ b/libraries/redshop/entity/discount.php @@ -0,0 +1,80 @@ +shopperGroups) + { + $this->loadShopperGroups(); + } + + return $this->shopperGroups; + } + + /** + * Method for load shopper groups associate with this discount + * + * @return self + * + * @since 2.1.0 + */ + protected function loadShopperGroups() + { + $this->shopperGroups = new RedshopEntitiesCollection; + + if (!$this->hasId()) + { + return $this; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('shopper_group_id')) + ->from($db->qn('#__redshop_discount_shoppers')) + ->where($db->qn('discount_id') . ' = ' . $this->getId()); + + $result = $db->setQuery($query)->loadColumn(); + + if (empty($result)) + { + return $this; + } + + foreach ($result as $shopperGroupId) + { + $this->shopperGroups->add(RedshopEntityShopper_Group::getInstance($shopperGroupId)); + } + + return $this; + } +} diff --git a/libraries/redshop/entity/discount_product.php b/libraries/redshop/entity/discount_product.php new file mode 100644 index 00000000000..74c246563d1 --- /dev/null +++ b/libraries/redshop/entity/discount_product.php @@ -0,0 +1,128 @@ +shopperGroups) + { + $this->loadShopperGroups(); + } + + return $this->shopperGroups; + } + + /** + * Method for get categories associate with this discount + * + * @return RedshopEntitiesCollection + * + * @since 2.1.0 + */ + public function getCategories() + { + if (null === $this->categories) + { + $this->loadCategories(); + } + + return $this->categories; + } + + /** + * Method for load categories associate with this discount + * + * @return self + * + * @since 2.1.0 + */ + protected function loadCategories() + { + $this->categories = new RedshopEntitiesCollection; + + if (!$this->hasId() || empty($this->get('category_ids'))) + { + return $this; + } + + $categoryIds = explode(',', $this->get('category_ids')); + + foreach ($categoryIds as $categoryId) + { + $this->categories->add(RedshopEntityCategory::getInstance($categoryId)); + } + + return $this; + } + + /** + * Method for load shopper groups associate with this discount + * + * @return self + * + * @since 2.1.0 + */ + protected function loadShopperGroups() + { + $this->shopperGroups = new RedshopEntitiesCollection; + + if (!$this->hasId()) + { + return $this; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('shopper_group_id')) + ->from($db->qn('#__redshop_discount_product_shoppers')) + ->where($db->qn('discount_product_id') . ' = ' . $this->getId()); + + $result = $db->setQuery($query)->loadColumn(); + + if (empty($result)) + { + return $this; + } + + foreach ($result as $shopperGroupId) + { + $this->shopperGroups->add(RedshopEntityShopper_Group::getInstance($shopperGroupId)); + } + + return $this; + } +} diff --git a/libraries/redshop/entity/entity.php b/libraries/redshop/entity/entity.php new file mode 100644 index 00000000000..efa6ceea2d0 --- /dev/null +++ b/libraries/redshop/entity/entity.php @@ -0,0 +1,67 @@ + $entity) + { + if (!$entity instanceof RedshopEntity) + { + throw new InvalidArgumentException("RedshopEntityExpected in " . __FUNCTION__); + } + + $results[$key] = $entity->getItem(); + } + + return $results; + } +} diff --git a/libraries/redshop/entity/field.php b/libraries/redshop/entity/field.php new file mode 100644 index 00000000000..911c79ad9c5 --- /dev/null +++ b/libraries/redshop/entity/field.php @@ -0,0 +1,88 @@ +fieldValues) + { + $this->loadFieldValues(); + } + + return $this->fieldValues; + } + + /** + * Method for get group of this field + * + * @return null|RedshopEntityField_Group + * + * @since 2.1.0 + */ + public function getGroup() + { + if (!$this->hasId() || $this->get('groupId') === null) + { + return null; + } + + return RedshopEntityField_Group::getInstance((int) $this->get('groupId')); + } + + /** + * Method for load field values + * + * @return self + * + * @since 2.0.6 + */ + protected function loadFieldValues() + { + if (!$this->hasId()) + { + return $this; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_fields_value')) + ->where($db->qn('field_id') . ' = ' . (int) $this->getId()) + ->order($db->qn('value_id') . ' ASC'); + + $this->fieldValues = $db->setQuery($query)->loadObjectList(); + + return $this; + } +} diff --git a/libraries/redshop/entity/field_data.php b/libraries/redshop/entity/field_data.php new file mode 100644 index 00000000000..c5d29336b05 --- /dev/null +++ b/libraries/redshop/entity/field_data.php @@ -0,0 +1,21 @@ +fields) + { + $this->loadFields(); + } + + return $this->fields; + } + + /** + * Method for load fields associate with this field group + * + * @return self + * + * @since 2.1.0 + */ + protected function loadFields() + { + $this->fields = new RedshopEntitiesCollection; + + if (!$this->hasId()) + { + return $this; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('id')) + ->from($db->qn('#__redshop_fields')) + ->where($db->qn('groupId') . ' = ' . $this->getId()); + + $result = $db->setQuery($query)->loadColumn(); + + if (empty($result)) + { + return $this; + } + + foreach ($result as $fieldId) + { + $this->fields->add(RedshopEntityField::getInstance($fieldId)); + } + + return $this; + } +} diff --git a/libraries/redshop/entity/field_value.php b/libraries/redshop/entity/field_value.php new file mode 100644 index 00000000000..04bcdaa20b9 --- /dev/null +++ b/libraries/redshop/entity/field_value.php @@ -0,0 +1,32 @@ + diff --git a/libraries/redshop/entity/mail.php b/libraries/redshop/entity/mail.php new file mode 100644 index 00000000000..e942a7c82e1 --- /dev/null +++ b/libraries/redshop/entity/mail.php @@ -0,0 +1,21 @@ + true), 'com_redshop'); + } + + /** + * Method for get medias of current category + * + * @return RedshopEntityMediaImage + * + * @since 2.1.0 + */ + public function getMedia() + { + if (null === $this->media) + { + $this->loadMedia(); + } + + return $this->media; + } + + /** + * Method for load medias + * + * @return self + * + * @since 2.1.0 + */ + protected function loadMedia() + { + $this->media = RedshopEntityMediaImage::getInstance(); + + if (!$this->hasId()) + { + return $this; + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_media')) + ->where($db->qn('media_section') . ' = ' . $db->quote('manufacturer')) + ->where($db->qn('section_id') . ' = ' . $db->quote($this->getId())); + + $result = $db->setQuery($query)->loadObject(); + + if (empty($result)) + { + return $this; + } + + $this->media = RedshopEntityMediaImage::getInstance($result->media_id); + $this->media->bind($result); + + return $this; + } +} diff --git a/libraries/redshop/entity/mass_discount.php b/libraries/redshop/entity/mass_discount.php new file mode 100644 index 00000000000..709cd1387df --- /dev/null +++ b/libraries/redshop/entity/mass_discount.php @@ -0,0 +1,21 @@ +sectionEntity === null) + { + $this->loadSectionEntity(); + } + + return $this->sectionEntity; + } + + /** + * Method for load section entity + * + * @return self + * + * @since 2.1.0 + */ + public function loadSectionEntity() + { + if (!$this->hasId()) + { + return $this; + } + + $entityClass = 'RedshopEntity' . ucfirst($this->get('media_section')); + $this->sectionEntity = $entityClass::getInstance($this->get('section_id')); + + return $this; + } +} diff --git a/libraries/redshop/entity/media/image.php b/libraries/redshop/entity/media/image.php new file mode 100644 index 00000000000..77fbd7fca6a --- /dev/null +++ b/libraries/redshop/entity/media/image.php @@ -0,0 +1,152 @@ +hasId()) + { + return ''; + } + + return JPath::clean( + REDSHOP_MEDIA_IMAGE_RELPATH . $this->get('media_section') + . '/' . $this->get('section_id') . '/' . $this->get('media_name') + ); + } + + /** + * Method get image path + * + * @return string + */ + public function getAbsImagePath() + { + if (!$this->hasId()) + { + return ''; + } + + return REDSHOP_MEDIA_IMAGE_ABSPATH . $this->get('media_section') + . '/' . $this->get('section_id') . '/' . $this->get('media_name'); + } + + /** + * Method for generate thumbnail + * + * @param integer $width Width of thumbnail + * @param integer $height Height of thumbnail + * @param boolean $crop Is crop image or not + * @param boolean $force Force create image. + * + * @return array List of relative and absolute path + * @throws Exception + * + * @since 2.1.0 + */ + public function generateThumb($width, $height, $crop = false, $force = false) + { + $result = array('rel' => '', 'abs' => ''); + + // Check if this is correct media image + if (!$this->hasId()) + { + return $result; + } + + // Get original file path + $sourceFile = $this->getImagePath(); + + if (empty($sourceFile) || !JFile::exists($sourceFile)) + { + return $result; + } + + $destinationFile = JFile::stripExt(basename($this->get('media_name'))); + $destinationFile .= '_w' . $width . '_h' . $height; + $destinationFile .= '.' . JFile::getExt($this->get('media_name')); + + // Create thumb folder if not exist + $thumbPath = REDSHOP_MEDIA_IMAGE_RELPATH . $this->get('media_section') + . '/' . $this->get('section_id') . '/thumb/'; + \Redshop\Helper\Media::createFolder($thumbPath); + + $result = array( + 'rel' => JPath::clean( + $thumbPath . $destinationFile + ), + 'abs' => REDSHOP_MEDIA_IMAGE_ABSPATH . $this->get('media_section') + . '/' . $this->get('section_id') . '/thumb/' . $destinationFile + ); + + if ($force === false && JFile::exists($result['rel'])) + { + return $result; + } + + $originalMemoryLimit = ini_get('memory_limit'); + ini_set('memory_limit', '1024M'); + + $data = file_get_contents($sourceFile); + $resource = imagecreatefromstring($data); + $imagine = new Imagine; + $image = new Image($resource, new RGB, $imagine->getMetadataReader()->readFile($sourceFile)); + $box = new Box($width, $height); + $mode = $crop ? ImageInterface::THUMBNAIL_OUTBOUND : ImageInterface::THUMBNAIL_INSET; + $thumbnail = $image->thumbnail($box, $mode); + + $thumbnail->save($result['rel']); + + unset($thumbnail, $image, $imagine); + + $factory = new OptimizerFactory; + $optimizer = $factory->get(); + $optimizer->optimize($result['rel']); + + // Memory limit back to normal + ini_set('memory_limit', $originalMemoryLimit); + + return $result; + } +} diff --git a/libraries/redshop/entity/media/index.html b/libraries/redshop/entity/media/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/entity/media/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/entity/newsletter.php b/libraries/redshop/entity/newsletter.php new file mode 100644 index 00000000000..a5ea5bf0f26 --- /dev/null +++ b/libraries/redshop/entity/newsletter.php @@ -0,0 +1,32 @@ +hasId()) + { + return null; + } + + if (null === $this->orderItems) + { + $this->loadOrderItems(); + } + + return $this->orderItems; + } + + /** + * Method for get order status log for this order + * + * @return array RedshopEntitiesCollection if success. Null otherwise. + * + * @since 2.0.6 + */ + public function getStatusLog() + { + if (!$this->hasId()) + { + return null; + } + + if (null === $this->statusLog) + { + $this->loadStatusLog(); + } + + return $this->statusLog; + } + + /** + * Method for get payment for this order + * + * @return RedshopEntityOrder_Payment Payment data if success. Null otherwise. + * + * @since 2.0.6 + */ + public function getPayment() + { + if (!$this->hasId()) + { + return null; + } + + if (null === $this->payment) + { + $this->loadPayment(); + } + + return $this->payment; + } + + /** + * Method for get users of this order + * + * @return RedshopEntitiesCollection Collection of users if success. Null otherwise. + * + * @since 2.0.6 + */ + public function getUsers() + { + if (!$this->hasId()) + { + return null; + } + + if (null === $this->users) + { + $this->loadUsers(); + } + + return $this->users; + } + + /** + * Method for get billing information of this order + * + * @return RedshopEntityOrder_User User infor if success. Null otherwise. + * + * @since 2.0.6 + */ + public function getBilling() + { + if (!$this->hasId()) + { + return null; + } + + if (null === $this->billing) + { + $this->loadBilling(); + } + + return $this->billing; + } + + /** + * Method for get shipping information of this order + * + * @return RedshopEntityOrder_User User infor if success. Null otherwise. + * + * @since 2.0.6 + */ + public function getShipping() + { + if (!$this->hasId()) + { + return null; + } + + if (null === $this->shipping) + { + $this->loadShipping(); + } + + return $this->shipping; + } + + /** + * Method for load order items for this order + * + * @return self + * + * @since 2.0.6 + */ + protected function loadOrderItems() + { + if (!$this->hasId()) + { + return $this; + } + + $this->orderItems = new RedshopEntitiesCollection; + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_order_item')) + ->where($db->qn('order_id') . ' = ' . $this->getId()); + $orderItems = $db->setQuery($query)->loadObjectList(); + + if (empty($orderItems)) + { + return $this; + } + + foreach ($orderItems as $orderItem) + { + $entity = RedshopEntityOrder_Item::getInstance($orderItem->order_item_id); + $entity->bind($orderItem); + + $this->orderItems->add($entity); + } + + return $this; + } + + /** + * Method for load order status log for this order + * + * @return self + * + * @since 2.0.6 + */ + protected function loadStatusLog() + { + if (!$this->hasId()) + { + return $this; + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('l.*') + ->select($db->qn('s.order_status_name')) + ->from($db->qn('#__redshop_order_status_log', 'l')) + ->leftJoin( + $db->qn('#__redshop_order_status', 's') . ' ON ' + . $db->qn('l.order_status') . ' = ' . $db->qn('s.order_status_code') + ) + ->where($db->qn('l.order_id') . ' = ' . $this->getId()); + + $this->statusLog = $db->setQuery($query)->loadObjectList(); + + return $this; + } + + /** + * Method for load payment of this order + * + * @return self + * + * @since 2.0.6 + */ + protected function loadPayment() + { + if (!$this->hasId()) + { + return $this; + } + + $this->payment = RedshopEntityOrder_Payment::getInstance(); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_order_payment')) + ->where($db->qn('order_id') . ' = ' . (int) $this->getId()); + $result = $db->setQuery($query)->loadObject(); + + if (empty($result)) + { + return $this; + } + + $this->payment = RedshopEntityOrder_Payment::getInstance($result->payment_order_id)->bind($result); + $this->payment->loadPlugin(); + + return $this; + } + + /** + * Method for load users of this order + * + * @return self + * + * @since 2.0.6 + */ + protected function loadUsers() + { + if (!$this->hasId()) + { + return $this; + } + + $this->users = new RedshopEntitiesCollection; + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_order_users_info')) + ->where($db->qn('order_id') . ' = ' . (int) $this->getId()); + $results = $db->setQuery($query)->loadObjectList(); + + if (empty($results)) + { + return $this; + } + + foreach ($results as $result) + { + $entity = RedshopEntityOrder_User::getInstance($result->order_info_id)->bind($result)->loadExtraFields(); + + $this->users->add($entity); + } + + return $this; + } + + /** + * Method for load billing user information of this order + * + * @return self + * + * @since 2.0.6 + */ + protected function loadBilling() + { + if (!$this->hasId()) + { + return $this; + } + + $this->billing = RedshopEntityOrder_User::getInstance(); + $users = $this->getUsers(); + + if ($users->isEmpty()) + { + return $this; + } + + foreach ($users as $user) + { + if ($user->get('address_type') == 'BT') + { + $this->billing = $user; + + return $this; + } + } + + return $this; + } + + /** + * Method for load shipping user information of this order + * + * @return self + * + * @since 2.0.6 + */ + protected function loadShipping() + { + if (!$this->hasId()) + { + return $this; + } + + $this->shipping = RedshopEntityOrder_User::getInstance(); + $users = $this->getUsers(); + + if ($users->isEmpty()) + { + return $this; + } + + foreach ($users as $user) + { + if ($user->get('address_type') == 'ST') + { + $this->shipping = $user; + + return $this; + } + } + + return $this; + } +} diff --git a/libraries/redshop/entity/order_item.php b/libraries/redshop/entity/order_item.php new file mode 100644 index 00000000000..30df7a62345 --- /dev/null +++ b/libraries/redshop/entity/order_item.php @@ -0,0 +1,101 @@ +hasId()) + { + return null; + } + + if (null === $this->accessoryItems) + { + $this->loadAccessoryItems(); + } + + return $this->accessoryItems; + } + + /** + * Method for load accessory items for this order item + * + * @return self + * + * @since 2.0.6 + */ + protected function loadAccessoryItems() + { + if (!$this->hasId()) + { + return $this; + } + + $this->accessoryItems = new RedshopEntitiesCollection; + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__redshop_order_acc_item')) + ->where($db->qn('order_item_id') . ' = ' . $this->getId()); + $items = $db->setQuery($query)->loadObjectList(); + + if (empty($items)) + { + return $this; + } + + foreach ($items as $item) + { + $entity = RedshopEntityOrder_Item_Accessory::getInstance($item->order_item_acc_id); + + $entity->bind($item); + + $this->accessoryItems->add($entity); + } + + return $this; + } +} diff --git a/libraries/redshop/entity/order_item_accessory.php b/libraries/redshop/entity/order_item_accessory.php new file mode 100644 index 00000000000..1721e99b940 --- /dev/null +++ b/libraries/redshop/entity/order_item_accessory.php @@ -0,0 +1,32 @@ +hasId() || !is_null($this->get('plugin', null))) + { + return $this; + } + + if (!empty($this->get('payment_method_class'))) + { + // Get plugin information + $plugin = JPluginHelper::getPlugin('redshop_payment', $this->get('payment_method_class')); + + if ($plugin) + { + $plugin->params = new Registry($plugin->params); + } + + $this->set('plugin', $plugin); + } + + return $this; + } +} diff --git a/libraries/redshop/entity/order_status.php b/libraries/redshop/entity/order_status.php new file mode 100644 index 00000000000..96915c3b19c --- /dev/null +++ b/libraries/redshop/entity/order_status.php @@ -0,0 +1,21 @@ +hasId() || !is_null($this->get('fields', null))) + { + return $this; + } + + $this->set('email', $this->get('user_email')); + + $privateSection = RedshopHelperExtrafields::SECTION_PRIVATE_BILLING_ADDRESS; + $companySection = RedshopHelperExtrafields::SECTION_COMPANY_BILLING_ADDRESS; + + if ($this->get('address_type', '') == 'ST') + { + $privateSection = RedshopHelperExtrafields::SECTION_PRIVATE_SHIPPING_ADDRESS; + $companySection = RedshopHelperExtrafields::SECTION_COMPANY_SHIPPING_ADDRESS; + } + + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('f.name') . ',' . $db->qn('fd.data_txt')) + ->from($db->qn('#__redshop_fields_data', 'fd')) + ->leftJoin($db->qn('#__redshop_fields', 'f') . ' ON ' . $db->qn('f.id') . '=' . $db->qn('fd.fieldid')) + ->where( + '(' + . $db->qn('fd.section') . ' = ' . $privateSection + . ' OR ' + . $db->qn('fd.section') . ' = ' . $companySection + . ')' + ) + ->where($db->qn('fd.itemid') . ' = ' . $this->get('users_info_id')); + + // Set the query and load the result. + $results = $db->setQuery($query)->loadObjectList(); + + if (empty($results)) + { + $this->set('fields', array()); + + return $this; + } + + $fieldsData = array(); + + foreach ($results as $result) + { + $fieldsData[$result->name] = $result->data_txt; + } + + $this->set('fields', $fieldsData); + + return $this; + } +} diff --git a/libraries/redshop/entity/price.php b/libraries/redshop/entity/price.php new file mode 100644 index 00000000000..2c9bfdbc093 --- /dev/null +++ b/libraries/redshop/entity/price.php @@ -0,0 +1,32 @@ +childProducts || $reload === true) + { + $this->loadChild(); + } + + return $this->childProducts; + } + + /** + * Method to load child product + * + * @return self + * + * @since 2.1.0 + */ + protected function loadChild() + { + if (!$this->hasId()) + { + return $this; + } + + $this->childProducts = new RedshopEntitiesCollection; + + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select($db->quoteName('product_id')) + ->from($db->quoteName('#__redshop_product')) + ->where($db->quoteName('product_parent_id') . ' = ' . (int) $this->getId()); + + $productIds = $db->setQuery($query)->loadColumn(); + + foreach ($productIds as $productId) + { + $this->childProducts->add(self::getInstance($productId)); + } + + return $this; + } + + /** + * Assign a product with a custom field + * + * @param integer $fieldId Field id + * @param string $value Field value + * + * @return boolean + */ + public function assignCustomField($fieldId, $value) + { + // Try to load this custom field data + /** @var RedshopEntityField_Data $entity */ + $entity = RedshopEntityField_Data::getInstance()->loadItemByArray( + array + ( + 'fieldid' => $fieldId, + 'itemid' => $this->id, + // Product section + 'section' => 1 + ) + ); + + // This custom field data is not linked with this product than create it + if ($entity->hasId()) + { + return true; + } + + return (boolean) $entity->save( + array + ( + 'fieldid' => $fieldId, + 'data_txt' => $value, + 'itemid' => $this->id, + 'section' => 1 + ) + ); + } + + /** + * @param float $productPrice Product price + * @param integer $userId User id + * @param integer $taxExempt Tax + * + * @return boolean|float|integer + * + * @since 2.1.0 + */ + public function getTax($productPrice = 0.0, $userId = 0, $taxExempt = 0) + { + if (!$this->hasId()) + { + return false; + } + + $redshopUser = \JFactory::getSession()->get('rs_user'); + + if ($userId == 0) + { + $user = \JFactory::getUser(); + $userId = $user->id; + } + + $productTax = 0; + $redshopUser = empty($redshopUser) ? array('rs_is_user_login' => 0) : $redshopUser; + + if ($redshopUser['rs_is_user_login'] == 0 && $userId != 0) + { + \RedshopHelperUser::createUserSession($userId); + } + + $vatRateData = \RedshopHelperTax::getVatRates($this->getId(), $userId); + $taxRate = !empty($vatRateData) ? $vatRateData->tax_rate : 0; + + if ($productPrice <= 0) + { + $productPrice = $this->get('product_price', $productPrice); + } + + $productPrice = \RedshopHelperProductPrice::priceRound((float) $productPrice); + + if ($taxExempt) + { + return $productPrice * $taxRate; + } + + if (!$taxRate) + { + return \RedshopHelperProductPrice::priceRound($productTax); + } + + if (!$userId) + { + $productTax = $productPrice * $taxRate; + } + else + { + $userInformation = \RedshopHelperUser::getUserInformation($userId); + + if (null === $userInformation || $userInformation->requesting_tax_exempt !== 1 || !$userInformation->tax_exempt_approved) + { + $productTax = $productPrice * $taxRate; + } + } + + return \RedshopHelperProductPrice::priceRound($productTax); + } +} diff --git a/libraries/redshop/entity/product_compare.php b/libraries/redshop/entity/product_compare.php new file mode 100644 index 00000000000..d7aa3989729 --- /dev/null +++ b/libraries/redshop/entity/product_compare.php @@ -0,0 +1,32 @@ +hasId()) + { + return null; + } + + if (null === $this->discounts) + { + $this->loadDiscounts(); + } + + return $this->discounts; + } + + /** + * Method for load discounts for this shopper group + * + * @return self + * + * @since 2.0.6 + */ + protected function loadDiscounts() + { + if (!$this->hasId()) + { + return $this; + } + + $this->discounts = new RedshopEntitiesCollection; + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('discount_id')) + ->from($db->qn('#__redshop_discount_shoppers')) + ->where($db->qn('shopper_group_id') . ' = ' . $this->getId()); + $discounts = $db->setQuery($query)->loadColumn(); + + if (empty($discounts)) + { + return $this; + } + + foreach ($discounts as $discountId) + { + $this->discounts->add(RedshopEntityDiscount::getInstance($discountId)); + } + + return $this; + } +} diff --git a/libraries/redshop/entity/state.php b/libraries/redshop/entity/state.php new file mode 100644 index 00000000000..4bcc7c22bf6 --- /dev/null +++ b/libraries/redshop/entity/state.php @@ -0,0 +1,21 @@ +taxRates)) + { + $this->loadTaxRates(); + } + + return $this->taxRates; + } + + /** + * Method for load all tax rates + * + * @return self + * + * @since 2.0.4 + */ + protected function loadTaxRates() + { + /** @var RedshopEntitiesCollection taxRates */ + $this->taxRates = new RedshopEntitiesCollection; + + if (!$this->hasId()) + { + return $this; + } + + $model = RedshopModel::getInstance('Tax_Rates', 'RedshopModel', array('ignore_request' => true)); + $model->setState('filter.tax_group', $this->getId()); + + $taxRates = $model->getItems(); + + if (empty($taxRates)) + { + return $this; + } + + foreach ($taxRates as $taxRate) + { + $this->taxRates->add(RedshopEntityTax_Rate::getInstance($taxRate->id)->bind($taxRate)); + } + + return $this; + } +} diff --git a/libraries/redshop/entity/tax_rate.php b/libraries/redshop/entity/tax_rate.php new file mode 100644 index 00000000000..68ae63e877f --- /dev/null +++ b/libraries/redshop/entity/tax_rate.php @@ -0,0 +1,21 @@ +products) + { + $this->loadProducts(); + } + + return $this->products; + } + + /** + * Method for load products available with this voucher + * + * @return self + * + * @since 2.0.7 + */ + protected function loadProducts() + { + $this->products = new RedshopEntitiesCollection; + + if (!$this->hasId()) + { + return $this; + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('product_id')) + ->from($db->qn('#__redshop_product_voucher_xref')) + ->where($db->qn('voucher_id') . ' = ' . $this->getId()); + $result = $db->setQuery($query)->loadColumn(); + + if (empty($result)) + { + return $this; + } + + foreach ($result as $productId) + { + $this->products->add(RedshopEntityProduct::getInstance($productId)); + } + + return $this; + } +} diff --git a/libraries/redshop/entity/voucher_transaction.php b/libraries/redshop/entity/voucher_transaction.php new file mode 100644 index 00000000000..fbd0e63f32c --- /dev/null +++ b/libraries/redshop/entity/voucher_transaction.php @@ -0,0 +1,32 @@ +{$name}; + } + + return parent::__get($name); + } + + /** + * Method to set certain otherwise inaccessible properties of the form field object. + * + * @param string $name The property name for which to the the value. + * @param mixed $value The value of the property. + * + * @return void + * + * @since 3.2 + */ + public function __set($name, $value) + { + switch ($name) + { + case 'maxlength': + $this->{$name} = (int) $value; + break; + + case 'format': + case 'filter': + $this->{$name} = (string) $value; + break; + + default: + parent::__set($name, $value); + } + } + + /** + * Method to attach a JForm object to the field. + * + * @param SimpleXMLElement $element The SimpleXMLElement object representing the `` tag for the form field object. + * @param mixed $value The form field value to validate. + * @param string $group The field name group control value. This acts as as an array container for the field. + * For example if the field has name="foo" and the group value is set to "bar" then the + * full field name would end up being "bar[foo]". + * + * @return boolean True on success. + * + * @see JFormField::setup() + * @since 3.2 + */ + public function setup(SimpleXMLElement $element, $value, $group = null) + { + $return = parent::setup($element, $value, $group); + + if ($return) + { + $this->maxlength = (int) $this->element['maxlength'] ? (int) $this->element['maxlength'] : 45; + $this->format = (string) $this->element['format'] ? (string) $this->element['format'] + : Redshop::getConfig()->getString('DEFAULT_DATEFORMAT', 'Y-m-d'); + $this->filter = (string) $this->element['filter'] ? (string) $this->element['filter'] : null; + } + + return $return; + } + + /** + * Method to get the field input markup. + * + * @return string The field input markup. + * + * @since 11.1 + */ + protected function getInput() + { + // Translate placeholder text + $hint = $this->translateHint ? JText::_($this->hint) : $this->hint; + + // Initialize some field attributes. + $format = $this->format; + + // Build the attributes array. + $attributes = array(); + + empty($this->size) ? null : $attributes['size'] = $this->size; + empty($this->maxlength) ? null : $attributes['maxlength'] = $this->maxlength; + empty($this->class) ? null : $attributes['class'] = $this->class; + !$this->readonly ? null : $attributes['readonly'] = 'readonly'; + !$this->disabled ? null : $attributes['disabled'] = 'disabled'; + empty($this->onchange) ? null : $attributes['onchange'] = $this->onchange; + !strlen($hint) ? null : $attributes['placeholder'] = $hint; + $this->autocomplete ? null : $attributes['autocomplete'] = 'off'; + !$this->autofocus ? null : $attributes['autofocus'] = ''; + + if ($this->required) + { + $attributes['required'] = ''; + $attributes['aria-required'] = 'true'; + } + + // Handle the special case for "now". + if (strtoupper($this->value) == 'NOW') + { + $this->value = JFactory::getDate()->toUnix(); + } + + // Get some system objects. + $config = JFactory::getConfig(); + $user = JFactory::getUser(); + $tz = $config->get('offset'); + + // If a known filter is given use it. + if (strtoupper($this->filter) == 'SERVER_UTC') + { + // Convert a date to UTC based on the server timezone. + if ($this->value && $this->value != JFactory::getDbo()->getNullDate()) + { + // Get a date object based on the correct timezone. + $date = JFactory::getDate($this->value, 'UTC'); + $date->setTimezone(new DateTimeZone($tz)); + + // Transform the date string. + $this->value = $date->format($format, true, false); + } + } + else + { + // Convert a date to UTC based on the user timezone. + if ($this->value && $this->value != JFactory::getDbo()->getNullDate()) + { + // Get a date object based on the correct timezone. + $date = JFactory::getDate($this->value, 'UTC'); + $tz = $user->getParam('timezone', $tz); + + $date->setTimezone(new DateTimeZone($tz)); + + // Transform the date string. + $this->value = $date->format($format, true, false); + } + } + + // Including fallback code for HTML5 non supported browsers. + JHtml::_('jquery.framework'); + JHtml::_('script', 'system/html5fallback.js', false, true); + + return JHtml::_('redshopcalendar.calendar', $this->value, $this->name, $this->id, $format, $attributes, null, $tz); + } +} diff --git a/libraries/redshop/form/field/country.php b/libraries/redshop/form/field/country.php new file mode 100644 index 00000000000..f2f3d60c393 --- /dev/null +++ b/libraries/redshop/form/field/country.php @@ -0,0 +1,50 @@ +element['idfield']) ? (string) $this->element['idfield'] : 'id'; + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn($key, 'value')) + ->select($db->qn('country_name', 'text')) + ->from($db->qn('#__redshop_country')); + $options = $db->setQuery($query)->loadObjectList(); + + $parentOptions = parent::getOptions(); + $options = array_merge($parentOptions, $options); + + return $options; + } +} diff --git a/libraries/redshop/form/field/coupon_remaining.php b/libraries/redshop/form/field/coupon_remaining.php new file mode 100644 index 00000000000..bb67091de40 --- /dev/null +++ b/libraries/redshop/form/field/coupon_remaining.php @@ -0,0 +1,54 @@ +element['coupon_id']) ? (int) $this->element['coupon_id'] : false; + + if ($couponId !== false) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('coupon_value')) + ->from($db->qn('#__redshop_coupons_transaction')) + ->where($db->qn('coupon_id') . ' = ' . $couponId); + + return ''; + } + + return ''; + } +} diff --git a/libraries/redshop/form/field/fieldsection.php b/libraries/redshop/form/field/fieldsection.php new file mode 100755 index 00000000000..413ad752e3b --- /dev/null +++ b/libraries/redshop/form/field/fieldsection.php @@ -0,0 +1,65 @@ +load('com_redshop'); + + $fieldSections = array(); + $fieldSections[] = (object) array('value' => '1', 'text' => JText::_('COM_REDSHOP_PRODUCT')); + $fieldSections[] = (object) array('value' => '2', 'text' => JText::_('COM_REDSHOP_CATEGORY')); + $fieldSections[] = (object) array('value' => '7', 'text' => JText::_('COM_REDSHOP_CUSTOMER_ADDRESS')); + $fieldSections[] = (object) array('value' => '8', 'text' => JText::_('COM_REDSHOP_COMPANY_ADDRESS')); + $fieldSections[] = (object) array('value' => '9', 'text' => JText::_('COM_REDSHOP_COLOR_SAMPLE')); + $fieldSections[] = (object) array('value' => '10', 'text' => JText::_('COM_REDSHOP_MANUFACTURER')); + $fieldSections[] = (object) array('value' => '11', 'text' => JText::_('COM_REDSHOP_SHIPPING')); + $fieldSections[] = (object) array('value' => '12', 'text' => JText::_('COM_REDSHOP_PRODUCT_USERFIELD')); + $fieldSections[] = (object) array('value' => '13', 'text' => JText::_('COM_REDSHOP_GIFTCARD_USERFIELD')); + $fieldSections[] = (object) array('value' => '14', 'text' => JText::_('COM_REDSHOP_CUSTOMER_SHIPPING_ADDRESS')); + $fieldSections[] = (object) array('value' => '15', 'text' => JText::_('COM_REDSHOP_COMPANY_SHIPPING_ADDRESS')); + $fieldSections[] = (object) array('value' => '17', 'text' => JText::_('COM_REDSHOP_PRODUCTFINDER_DATEPICKER')); + $fieldSections[] = (object) array('value' => '16', 'text' => JText::_('COM_REDSHOP_QUOTATION')); + $fieldSections[] = (object) array('value' => '18', 'text' => JText::_('COM_REDSHOP_PAYMENT_GATEWAY')); + $fieldSections[] = (object) array('value' => '19', 'text' => JText::_('COM_REDSHOP_SHIPPING_GATEWAY')); + $fieldSections[] = (object) array('value' => '20', 'text' => JText::_('COM_REDSHOP_ORDER')); + + $parentOptions = parent::getOptions(); + $options = array_merge($parentOptions, $fieldSections); + + return $options; + } +} diff --git a/libraries/redshop/form/field/fieldsgroups.php b/libraries/redshop/form/field/fieldsgroups.php new file mode 100644 index 00000000000..1d3d4365454 --- /dev/null +++ b/libraries/redshop/form/field/fieldsgroups.php @@ -0,0 +1,63 @@ +setState('list.limit', 99); + $groups = $model->getItems(); + + $options = array( + JHtml::_('select.option', 0, JText::_('COM_REDSHOP_FIELD_GROUP_NOGROUP')) + ); + + if ($groups) + { + foreach ($groups as $group) + { + $options[] = array('value' => $group->id, 'text' => $group->name); + } + } + + $parentOptions = parent::getOptions(); + + return array_merge($parentOptions, $options); + } +} diff --git a/libraries/redshop/form/field/fieldtype.php b/libraries/redshop/form/field/fieldtype.php new file mode 100755 index 00000000000..83102bd486d --- /dev/null +++ b/libraries/redshop/form/field/fieldtype.php @@ -0,0 +1,49 @@ +load('com_redshop'); + + $fieldTypes = RedshopHelperTemplate::getFieldTypeSections(); + + $parentOptions = parent::getOptions(); + $options = array_merge($parentOptions, $fieldTypes); + + return $options; + } +} diff --git a/libraries/redshop/form/field/fontlist.php b/libraries/redshop/form/field/fontlist.php new file mode 100644 index 00000000000..295796de8c2 --- /dev/null +++ b/libraries/redshop/form/field/fontlist.php @@ -0,0 +1,68 @@ +exclude && preg_match(chr(1) . $this->exclude . chr(1), $file)) + { + continue; + } + + // If the extension is to be stripped, do it. + if ($this->stripExt) + { + $file = JFile::stripExt($file); + } + + $options[] = JHtml::_('select.option', 'ttf.' . $file, $file); + } + + return array_merge(parent::getOptions(), $options); + } +} diff --git a/libraries/redshop/form/field/index.html b/libraries/redshop/form/field/index.html new file mode 100644 index 00000000000..2efb97f319a --- /dev/null +++ b/libraries/redshop/form/field/index.html @@ -0,0 +1 @@ + diff --git a/libraries/redshop/form/field/mail_section.php b/libraries/redshop/form/field/mail_section.php new file mode 100644 index 00000000000..8e796ca670a --- /dev/null +++ b/libraries/redshop/form/field/mail_section.php @@ -0,0 +1,52 @@ + $text) + { + $option = new stdClass; + + $option->text = $text; + $option->value = $value; + $option->disable = false; + $option->class = ''; + $option->selected = false; + $option->checked = false; + } + + return array_merge(parent::getOptions(), $options); + } +} diff --git a/libraries/redshop/form/field/manufacturer.php b/libraries/redshop/form/field/manufacturer.php new file mode 100644 index 00000000000..6e6f7b9dbb2 --- /dev/null +++ b/libraries/redshop/form/field/manufacturer.php @@ -0,0 +1,53 @@ +value) && $this->multiple && !is_array($this->value)) + { + $this->value = explode(',', $this->value); + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('id', 'value')) + ->select($db->qn('name', 'text')) + ->from($db->qn('#__redshop_manufacturer')); + $options = $db->setQuery($query)->loadObjectList(); + + $options = array_merge(parent::getOptions(), $options); + + return $options; + } +} diff --git a/libraries/redshop/form/field/media.php b/libraries/redshop/form/field/media.php new file mode 100644 index 00000000000..d30e88bc738 --- /dev/null +++ b/libraries/redshop/form/field/media.php @@ -0,0 +1,86 @@ +element['media-dom']) ? (string) $this->element['media-dom'] : null; + $mediaType = isset($this->element['media-type']) ? (string) $this->element['media-type'] : null; + $mediaSection = isset($this->element['media-section']) ? (string) $this->element['media-section'] : null; + $showGallery = isset($this->element['media-gallery']) ? boolval((string) $this->element['media-gallery']) : false; + $useMediaPath = isset($this->element['media-newMediaPath']) ? boolval((string) $this->element['media-newMediaPath']) : false; + $showAlternateText = isset($this->element['media-alternate']) ? boolval((string) $this->element['media-alternate']) : false; + $referenceId = isset($this->element['media-reference']) ? (int) $this->element['media-reference'] : 0; + $mediaId = isset($this->element['media-id']) ? (int) $this->element['media-id'] : 0; + + $media = RedshopEntityMediaImage::getInstance(); + + if ($mediaId) + { + $media = RedshopEntityMediaImage::getInstance($mediaId); + } + + $html = ''; + + if ($showAlternateText) + { + $inputId = 'dropzone_alternate_text[' . $mediaDOMId . ']'; + $inputId .= !empty($mediaId) ? '[media-' . $mediaId . ']' : '[]'; + $html = '