Experian_Qas - Version 1.3.0

Version Notes

- Change email validation service
- Fix bugs
- Add intuitive cache system

Download this release

Release Info

Developer Experian
Extension Experian_Qas
Version 1.3.0
Comparing to
See all releases


Version 1.3.0

Files changed (36) hide show
  1. app/code/community/Experian/Qas/Block/AddressField.php +76 -0
  2. app/code/community/Experian/Qas/Block/AddressField/Billing.php +20 -0
  3. app/code/community/Experian/Qas/Block/AddressField/Shipping.php +20 -0
  4. app/code/community/Experian/Qas/Block/Adminhtml/System/Config/Form/IntuitiveCountryFieldset.php +155 -0
  5. app/code/community/Experian/Qas/Block/Autocomplete.php +90 -0
  6. app/code/community/Experian/Qas/Block/Interaction.php +63 -0
  7. app/code/community/Experian/Qas/Block/Verification.php +123 -0
  8. app/code/community/Experian/Qas/Helper/Data.php +466 -0
  9. app/code/community/Experian/Qas/Model/Observer.php +71 -0
  10. app/code/community/Experian/Qas/Model/Qascall.php +217 -0
  11. app/code/community/Experian/Qas/Model/System/Config/Source/Engine.php +31 -0
  12. app/code/community/Experian/Qas/Model/System/Config/Source/SpecialEngine.php +17 -0
  13. app/code/community/Experian/Qas/controllers/ProcessController.php +217 -0
  14. app/code/community/Experian/Qas/etc/adminhtml.xml +30 -0
  15. app/code/community/Experian/Qas/etc/config.xml +414 -0
  16. app/code/community/Experian/Qas/etc/jstranslator.xml +137 -0
  17. app/code/community/Experian/Qas/etc/system.xml +125 -0
  18. app/code/community/Experian/Qas/etc/wsv3.wsdl +908 -0
  19. app/code/community/Experian/Qas/sql/qas_setup/mysql4-install-0.0.1.php +68 -0
  20. app/design/frontend/base/default/layout/experian_qas.xml +38 -0
  21. app/design/frontend/base/default/template/qas/checkout/billing.phtml +124 -0
  22. app/design/frontend/base/default/template/qas/checkout/shipping.phtml +122 -0
  23. app/design/frontend/base/default/template/qas/customer/address/edit.phtml +128 -0
  24. app/design/frontend/base/default/template/qas/email_validate.phtml +55 -0
  25. app/design/frontend/base/default/template/qas/interaction.phtml +14 -0
  26. app/design/frontend/base/default/template/qas/intuitive.phtml +38 -0
  27. app/design/frontend/base/default/template/qas/popin.phtml +38 -0
  28. app/etc/modules/Experian_Qas.xml +17 -0
  29. app/locale/en_US/Experian_Qas.csv +42 -0
  30. app/locale/fr_FR/Experian_Qas.csv +42 -0
  31. package.xml +26 -0
  32. skin/frontend/base/default/qas/css/styles.css +61 -0
  33. skin/frontend/base/default/qas/images/bkg_btn-close.gif +0 -0
  34. skin/frontend/base/default/qas/images/bkg_btn-close2.gif +0 -0
  35. skin/frontend/base/default/qas/js/intuitive.js +124 -0
  36. skin/frontend/base/default/qas/js/searchengine.js +26 -0
app/code/community/Experian/Qas/Block/AddressField.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Block_AddressField extends Mage_Core_Block_Template
11
+ {
12
+ protected $_suffix = '';
13
+ protected $_street1 = 'street_1';
14
+ protected $_street2 = 'street_2';
15
+ protected $_zip = 'zip';
16
+ protected $_city = 'city';
17
+ protected $_region = 'region_id';
18
+ protected $_country = 'country';
19
+ protected $_formName = 'form-validate';
20
+
21
+
22
+ public function getSuffix()
23
+ {
24
+ return $this->_suffix;
25
+ }
26
+
27
+ public function getStreet1()
28
+ {
29
+ return $this->_street1;
30
+ }
31
+
32
+ public function getStreet2()
33
+ {
34
+ return $this->_street2;
35
+ }
36
+
37
+ public function getZip()
38
+ {
39
+ return $this->_zip;
40
+ }
41
+
42
+ public function getCity()
43
+ {
44
+ return $this->_city;
45
+ }
46
+
47
+ public function getRegion()
48
+ {
49
+ return $this->_region;
50
+ }
51
+
52
+ /**
53
+ * return the right name of the input or select
54
+ * @param input type
55
+ * @return string
56
+ */
57
+ public function getRegionInput($type)
58
+ {
59
+ if($type == 'text') {
60
+ return $this->_region;
61
+ } else {
62
+ $name = explode("_", $this->_region);
63
+ return $name[0];
64
+ }
65
+ }
66
+
67
+ public function getCountry()
68
+ {
69
+ return $this->_country;
70
+ }
71
+
72
+ public function getFormName()
73
+ {
74
+ return $this->_formName;
75
+ }
76
+ }
app/code/community/Experian/Qas/Block/AddressField/Billing.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Block_AddressField_Billing extends Experian_Qas_Block_AddressField
11
+ {
12
+ protected $_suffix = 'BILLING';
13
+ protected $_street1 = 'billing:street1';
14
+ protected $_street2 = 'billing:street2';
15
+ protected $_zip = 'billing:postcode';
16
+ protected $_city = 'billing:city';
17
+ protected $_region = 'billing:region_id';
18
+ protected $_country = 'billing:country_id';
19
+ protected $_formName = 'co-billing-form';
20
+ }
app/code/community/Experian/Qas/Block/AddressField/Shipping.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Block_AddressField_Shipping extends Experian_Qas_Block_AddressField
11
+ {
12
+ protected $_suffix = 'SHIPPING';
13
+ protected $_street1 = 'shipping:street1';
14
+ protected $_street2 = 'shipping:street2';
15
+ protected $_zip = 'shipping:postcode';
16
+ protected $_city = 'shipping:city';
17
+ protected $_region = 'shipping:region_id';
18
+ protected $_country = 'shipping:country_id';
19
+ protected $_formName = 'co-shipping-form';
20
+ }
app/code/community/Experian/Qas/Block/Adminhtml/System/Config/Form/IntuitiveCountryFieldset.php ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento Enterprise Edition
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Magento Enterprise Edition License
8
+ * that is bundled with this package in the file LICENSE_EE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://www.magentocommerce.com/license/enterprise-edition
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Adminhtml
23
+ * @copyright Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://www.magentocommerce.com/license/enterprise-edition
25
+ */
26
+
27
+
28
+ /**
29
+ * Config form fieldset renderer
30
+ *
31
+ * @category Mage
32
+ * @package Mage_Adminhtml
33
+ * @author Magento Core Team <core@magentocommerce.com>
34
+ */
35
+ class Experian_Qas_Block_Adminhtml_System_Config_Form_IntuitiveCountryFieldset
36
+ extends Mage_Adminhtml_Block_System_Config_Form_Fieldset
37
+ {
38
+ protected $_experianDatasets = array();
39
+
40
+ /**
41
+ * Retrieve countries available
42
+ *
43
+ * @return array
44
+ */
45
+ protected function _getCountryAvailables()
46
+ {
47
+ if (empty($this->_experianDatasets)) {
48
+ $this->_experianDatasets = Mage::helper('experian_qas')->getCountryAvailable();
49
+
50
+ // Remove FRI if the client get FR3 activated
51
+ if (isset($this->_experianDatasets[Experian_Qas_Helper_Data::INTUITIVE_DATASET_FRANCE_BIS])) {
52
+ unset($this->_experianDatasets[Experian_Qas_Helper_Data::INTUITIVE_DATASET_FRANCE_BIS]);
53
+ }
54
+
55
+ // Remove FRI if the client get FRI activated
56
+ if (isset($this->_experianDatasets[Experian_Qas_Helper_Data::INTUITIVE_DATASET_FRANCE])) {
57
+ unset($this->_experianDatasets[Experian_Qas_Helper_Data::INTUITIVE_DATASET_FRANCE]);
58
+ }
59
+ }
60
+
61
+ return $this->_experianDatasets;
62
+ }
63
+
64
+ /**
65
+ * @param Varien_Data_Form_Element_Abstract $element
66
+ */
67
+ protected function _addCountryElements(Varien_Data_Form_Element_Abstract $element)
68
+ {
69
+ $countries = $this->_getCountryAvailables();
70
+ $configData = $this->getConfigData();
71
+
72
+ foreach ($countries as $countryId => $countryName) {
73
+ $path = 'qas_address_verifier/address_search_engine/search_engine_'.$countryId;
74
+ $fieldId = 'qas_address_verifier_address_search_engine_search_engine_'.$countryId;
75
+
76
+ if (isset($configData[$path])) {
77
+ $data = $configData[$path];
78
+ $inherit = false;
79
+ } else {
80
+ $data = (int)(string)$this->getForm()->getConfigRoot()->descend($path);
81
+ $inherit = true;
82
+
83
+ if ($data == 0) {
84
+ $data = '';
85
+ $inherit = false;
86
+ }
87
+ }
88
+
89
+ $element->addField(
90
+ $fieldId,
91
+ 'select',
92
+ array(
93
+ 'name' => 'groups[address_search_engine][fields][search_engine_'.$countryId.'][value]',
94
+ 'label' => $countryName . ' [' . $countryId . ']',
95
+ 'scope' => 'default',
96
+ 'scope_label' => Mage::helper('adminhtml')->__('[GLOBAL]'),
97
+ 'values' => Mage::getModel('experian_qas/system_config_source_engine')->toOptionArray(),
98
+ 'value' => $data,
99
+ 'inherit' => $inherit,
100
+ 'can_use_default_value' => '0',
101
+ 'can_use_website_value' => '0',
102
+ 'can_use_store_value' => '0',
103
+ ),
104
+ $after=false
105
+ )
106
+ ->setRenderer(Mage::getBlockSingleton('adminhtml/system_config_form_field'));
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Delete old country configuration
112
+ */
113
+ protected function _refreshCountryDb()
114
+ {
115
+ $countries = $this->_getCountryAvailables();
116
+
117
+ // Do not delete configuration if 0 country is available (maybe conenction pb)
118
+ if (!empty($countries)) {
119
+ $configs = Mage::getModel('core/config_data')->getCollection()
120
+ ->addFieldToFilter('path', array('like' => 'qas_address_verifier/address_search_engine/search_engine_%'));
121
+
122
+ foreach ($configs as $config) {
123
+ $configPath = $config->getData('path');
124
+ $countryId = substr($configPath, -3);
125
+
126
+ if (!array_key_exists($countryId, $countries)) {
127
+ $config->delete();
128
+ }
129
+ }
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Render fieldset html
135
+ *
136
+ * @param Varien_Data_Form_Element_Abstract $element
137
+ * @return string
138
+ */
139
+ public function render(Varien_Data_Form_Element_Abstract $element)
140
+ {
141
+ $this->setElement($element);
142
+ $html = $this->_getHeaderHtml($element);
143
+
144
+ $this->_addCountryElements($element);
145
+ $this->_refreshCountryDb();
146
+
147
+ foreach ($element->getSortedElements() as $field) {
148
+ $html.= $field->toHtml();
149
+ }
150
+
151
+ $html .= $this->_getFooterHtml($element);
152
+
153
+ return $html;
154
+ }
155
+ }
app/code/community/Experian/Qas/Block/Autocomplete.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas Autocompletion block - used for Intuitive Engine
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Block_Autocomplete extends Mage_Core_Block_Abstract
11
+ {
12
+ protected $_suggestData = null;
13
+
14
+ /**
15
+ * Return html result
16
+ *
17
+ * @return string html result
18
+ */
19
+ protected function _toHtml()
20
+ {
21
+ $html = '';
22
+
23
+ if (!$this->_beforeToHtml()) {
24
+ return $html;
25
+ }
26
+
27
+ $suggestData = $this->getSuggestData();
28
+ if (!($count = count($suggestData))) {
29
+ return $html;
30
+ }
31
+
32
+ $count--;
33
+
34
+ $html = '<ul><li style="display:none"></li>';
35
+ foreach ($suggestData as $index => $item) {
36
+ if ($index == 0) {
37
+ $item['row_class'] .= ' first';
38
+ }
39
+
40
+ if ($index == $count) {
41
+ $item['row_class'] .= ' last';
42
+ }
43
+
44
+ $html .= '<li moniker="'.$this->htmlEscape($item['value']).'" title="'.$this->htmlEscape($item['title']).'" class="'.$item['row_class'].'">'
45
+ . $this->htmlEscape($item['title']).'</li>';
46
+ }
47
+
48
+ $html.= '</ul>';
49
+
50
+ return $html;
51
+ }
52
+
53
+ /**
54
+ * Format the addresses response for Intuitive Engine
55
+ *
56
+ * @return array
57
+ */
58
+ protected function getSuggestData()
59
+ {
60
+ if (is_null($this->_suggestData)) {
61
+
62
+ $picklistEntries = $this->getPicklistEntries();
63
+ $response = array();
64
+ $data = array();
65
+ $counter = 0;
66
+
67
+ if (is_array($picklistEntries)) {
68
+ foreach ($picklistEntries as $entry){
69
+ $_data = array(
70
+ 'value' => $entry->Moniker,
71
+ 'title' => $entry->PartialAddress,
72
+ 'row_class' => (++$counter)%2?'odd':'even'
73
+ );
74
+ array_unshift($data, $_data);
75
+ }
76
+ } elseif ($picklistEntries && ($picklistEntries->Score > 0)) { // only one result
77
+ $_data = array(
78
+ 'value' => $picklistEntries->Moniker,
79
+ 'title' => $picklistEntries->PartialAddress,
80
+ 'row_class' => (++$counter)%2?'odd':'even'
81
+ );
82
+ array_unshift($data, $_data);
83
+ }
84
+
85
+ $this->_suggestData = $data;
86
+ }
87
+
88
+ return $this->_suggestData;
89
+ }
90
+ }
app/code/community/Experian/Qas/Block/Interaction.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas Block - used for Singleline Engine
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Block_Interaction extends Mage_Core_Block_Template
11
+ {
12
+ const INTERACTION_FORM_NAME = 'interaction-form';
13
+
14
+ protected $_suggestData = null;
15
+ protected $_template = 'qas/interaction.phtml';
16
+
17
+ /**
18
+ * Get interaction form name
19
+ *
20
+ * @return string
21
+ */
22
+ public function getInteractionFormName()
23
+ {
24
+ return self::INTERACTION_FORM_NAME;
25
+ }
26
+
27
+ /**
28
+ * Format the addresses response for Intuitive Engine
29
+ *
30
+ * @return array
31
+ */
32
+ public function getSuggestData()
33
+ {
34
+ if (is_null($this->_suggestData)) {
35
+
36
+ $picklistEntries = $this->getPicklistEntries();
37
+ $response = array();
38
+ $data = array();
39
+ $counter = 0;
40
+
41
+ if (is_array($picklistEntries)) {
42
+ foreach ($picklistEntries as $entry) {
43
+ $_data = array(
44
+ 'value' => $entry->Moniker,
45
+ 'title' => $entry->PartialAddress,
46
+ 'row_class' => (++$counter)%2?'odd':'even'
47
+ );
48
+ array_push($data, $_data);
49
+ }
50
+ } elseif ($picklistEntries && ($picklistEntries->Score > 0)) { // only one result
51
+ $_data = array(
52
+ 'value' => $picklistEntries->Moniker,
53
+ 'title' => $picklistEntries->PartialAddress,
54
+ 'row_class' => (++$counter)%2?'odd':'even'
55
+ );
56
+ array_push($data, $_data);
57
+ }
58
+
59
+ $this->_suggestData = $data;
60
+ }
61
+ return $this->_suggestData;
62
+ }
63
+ }
app/code/community/Experian/Qas/Block/Verification.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas Block - used for Verification Engine
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Block_Verification extends Mage_Core_Block_Abstract
11
+ {
12
+ const LEVEL_NONE = 'None';
13
+ const LEVEL_INTERACTION_REQUIRED = 'InteractionRequired';
14
+ const LEVEL_STREET_PARTIAL = 'StreetPartial';
15
+ const LEVEL_MULTIPLE = 'Multiple';
16
+ const LEVEL_VERIFIED = 'Verified';
17
+ const TYPE_ADDRESS = 1;
18
+ const TYPE_SHIPPING = 2;
19
+ const TYPE_BILLING = 3;
20
+
21
+ /**
22
+ * Format the addresses response for Intuitive Engine
23
+ *
24
+ * @return array
25
+ */
26
+ protected function _toHtml()
27
+ {
28
+ $addressesHtml = '';
29
+ $helper = $this->helper('experian_qas');
30
+ $result = $this->getResult();
31
+
32
+ if ($result && $result->VerifyLevel) {
33
+ $level = $result->VerifyLevel;
34
+
35
+ switch ($level) {
36
+ case self::LEVEL_NONE:
37
+ case self::LEVEL_INTERACTION_REQUIRED:
38
+ $addressesHtml = "
39
+ <script>
40
+ $$('.interactionWindow .display').each(function(item){
41
+ item.hide();
42
+ });
43
+ </script>
44
+ Your address could not be verified. Please make sure it's correct or click on <strong>Keep my address</strong>.";
45
+ break;
46
+
47
+ case self::LEVEL_STREET_PARTIAL:
48
+ case self::LEVEL_MULTIPLE:
49
+ $picklistEntries = $result->QAPicklist->PicklistEntry;
50
+ $addressesHtml = $this->getLayout()->createBlock('experian_qas/interaction')
51
+ ->setPicklistEntries($picklistEntries)
52
+ ->toHtml() .
53
+ "<script>
54
+ $$('.interactionWindow .display').each(function(item){
55
+ item.show();
56
+ });
57
+ </script>";
58
+ break;
59
+
60
+ case self::LEVEL_VERIFIED:
61
+ $params = null;
62
+ switch ( $this->getEdit())
63
+ {
64
+ case self::TYPE_ADDRESS:
65
+ $params = Mage::getSingleton('core/layout')->createBlock("experian_qas/addressField");
66
+ break;
67
+ case self::TYPE_SHIPPING:
68
+ $params = Mage::getSingleton('core/layout')->createBlock("experian_qas/addressField_shipping");
69
+ break;
70
+ case self::TYPE_BILLING:
71
+ $params =Mage::getSingleton('core/layout')->createBlock("experian_qas/addressField_billing");
72
+ break;
73
+ default:
74
+ break;
75
+ }
76
+ $interResult = $helper->getMappedAddress($result->QAAddress->AddressLine, $this->getCountryId());
77
+ if (ctype_digit($interResult['region'])) {
78
+ $inputType = 'select';
79
+ } else {
80
+ $inputType = 'text';
81
+ }
82
+ $addressesHtml =
83
+ "<script>
84
+ $$('.interactionWindow .display').each(function(item){
85
+ item.hide();
86
+ });
87
+ if(!isNaN(".$interResult['region'].")) {
88
+ var current_select = $('".$params->getRegion()."');
89
+ var current_non = current_select.select('option[value=\"".$interResult['region']."\"]');
90
+ var options = current_select.select(\"option\");
91
+ if (current_non[0]) {
92
+ options.each(function(item)
93
+ {
94
+ if(item.value == current_non[0].value) {
95
+ item.selected = true;
96
+ }
97
+ });
98
+ }
99
+ }
100
+ $('".$params->getStreet1()."').value = '".$interResult['street_1']."';
101
+ $('".$params->getStreet2()."').value = '".$interResult['street_2']."';
102
+ $('".$params->getCity()."').value = '".$interResult['city']."';
103
+ $('".$params->getRegionInput($inputType)."').value = '".$interResult['region']."';
104
+ $('".$params->getZip()."').value = '".$interResult['zip']."';
105
+ </script>
106
+ Your address has been verified and it's valid. Please click on <strong>Keep my address</strong>.";
107
+ break;
108
+
109
+ default:
110
+ $addressesHtml = "
111
+ <script>
112
+ $$('.interactionWindow .display').each(function(item){
113
+ item.hide();
114
+ });
115
+ </script>
116
+ Your address could not be verified. Please make sure it's correct and click on <strong>Keep my address</strong>. Click on <strong>Close</strong> if you want to modify it.";
117
+ break;
118
+ }
119
+ }
120
+
121
+ return $addressesHtml;
122
+ }
123
+ }
app/code/community/Experian/Qas/Helper/Data.php ADDED
@@ -0,0 +1,466 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas Helper
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Helper_Data extends Mage_Core_Helper_Abstract
11
+ {
12
+ const XML_PATH_ENABLED = 'qas_address_verifier/general/enable';
13
+ const XML_PATH_API_USER = 'qas_address_verifier/general/api_user';
14
+ const XML_PATH_API_PASSWORD = 'qas_address_verifier/general/api_password';
15
+ const XML_PATH_WSDL_NAME = 'qas_address_verifier/general/wsdl_name';
16
+ const XML_PATH_ONDEMAND_URL = 'qas_address_verifier/general/on_demand_url';
17
+
18
+ const XML_PATH_INTUTIVE_ENABLED = 'qas_address_verifier/address_search_engine/enable_intuitive_search';
19
+ const XML_PATH_SEARCH_ENGINE = 'qas_address_verifier/address_search_engine/search_engine';
20
+ const XML_PATH_DATASETS = 'qas_address_verifier/address_search_engine/search_datasets';
21
+ const XML_PATH_CACHE_ENABLED = 'qas_address_verifier/address_search_engine/enable_cache';
22
+
23
+ const XML_PATH_EMAIL_VALIDATE_ENABLED = 'qas_address_verifier/email_validate/enable_email_validate';
24
+ const XML_PATH_EMAIL_VALIDATE_LICENSE = 'qas_address_verifier/email_validate/license_email_validate';
25
+ const XML_PATH_EMAIL_VALIDATE_URL = 'qas_address_verifier/email_validate/email_validate_url';
26
+ const XML_PATH_EMAIL_ACCEPT_UNKNOWNS = 'qas_address_verifier/email_validate/accept_unknowns_emails';
27
+
28
+ const NODE_PATH_ADDRESS_MAPPER = 'global/mapping/address';
29
+ const NODE_PATH_DATASET_MAPPER = 'global/mapping/dataset';
30
+ const NODE_PATH_NOMAP = 'global/mapping/nomap/countries';
31
+ const NODE_PATH_NOMAP_ADDRESS_KEYS = 'global/mapping/nomap/address_keys';
32
+ const INTUITIVE_DATASET_FRANCE = 'FRI';
33
+ const INTUITIVE_DATASET_FRANCE_BIS = 'FR3';
34
+
35
+ const INTUITIVE_ENGINE_CODE = 'Intuitive';
36
+ const SINGLELINE_ENGINE_CODE = 'Singleline';
37
+ const VERIFICATION_ENGINE_CODE = 'Verification';
38
+
39
+ const ADDRESS_LAYOUT = 'MAGENTO2012';
40
+
41
+ const LOG_FILENAME = 'experian_qas.log';
42
+
43
+ const QUERY_PARAM = 'query';
44
+ const QUERY_MONIKER = 'moniker';
45
+ const QUERY_COUNTRY = 'country_id';
46
+
47
+ const INTERACTION_FORM_NAME = 'interaction-form';
48
+
49
+ protected $_datasets = NULL;
50
+
51
+ /**
52
+ * Checks if QAS Address & Email Verifier is enabled
53
+ *
54
+ * @return boolean
55
+ */
56
+ public function isEnabled()
57
+ {
58
+ return Mage::getStoreConfig(self::XML_PATH_ENABLED);
59
+ }
60
+
61
+ /**
62
+ * Retrive the Api user from configuration
63
+ *
64
+ * @return string
65
+ */
66
+ public function getApiUser()
67
+ {
68
+ return Mage::getStoreConfig(self::XML_PATH_API_USER);
69
+ }
70
+
71
+ /**
72
+ * Retrieve Api password from congfiguration
73
+ *
74
+ * @return string
75
+ */
76
+ public function getApiPassword()
77
+ {
78
+ return Mage::getStoreConfig(self::XML_PATH_API_PASSWORD);
79
+ }
80
+
81
+ /**
82
+ * Retrieve WSDL Name
83
+ *
84
+ * @return string
85
+ */
86
+ public function getWsdlName()
87
+ {
88
+ return Mage::getStoreConfig(self::XML_PATH_WSDL_NAME);
89
+ }
90
+
91
+ /**
92
+ * Retrieve Ondemand website URL
93
+ *
94
+ * @return string
95
+ */
96
+ public function getOndemandUrl()
97
+ {
98
+ return Mage::getStoreConfig(self::XML_PATH_ONDEMAND_URL);
99
+ }
100
+
101
+ /**
102
+ * Check if Intuitive Engine is enabled
103
+ *
104
+ * @return boolean
105
+ */
106
+ public function isIntuitiveEnabled()
107
+ {
108
+ return $this->isEnabled() &&
109
+ Mage::getStoreConfig(self::XML_PATH_INTUTIVE_ENABLED);
110
+ }
111
+
112
+ public function isCacheEnabled()
113
+ {
114
+ return Mage::getStoreConfig(self::XML_PATH_CACHE_ENABLED);
115
+ }
116
+
117
+ /**
118
+ * Check if Singleline or Verification is enabled
119
+ *
120
+ * @return boolean
121
+ */
122
+ public function isSearchEngineEnabled()
123
+ {
124
+ return $this->isEnabled();
125
+ }
126
+
127
+ /**
128
+ * Check if Email Validate is enabled and can be used
129
+ *
130
+ * @return boolean
131
+ */
132
+ public function isEmailValidateEnabled()
133
+ {
134
+ return $this->isEnabled() &&
135
+ Mage::getStoreConfig(self::XML_PATH_EMAIL_VALIDATE_ENABLED) &&
136
+ (boolean)Mage::getStoreConfig(self::XML_PATH_EMAIL_VALIDATE_LICENSE);
137
+ }
138
+
139
+ /**
140
+ * Retrieve Email Validate License key
141
+ *
142
+ * @return string
143
+ */
144
+ public function getEmailValidateLicense()
145
+ {
146
+ return Mage::getStoreConfig(self::XML_PATH_EMAIL_VALIDATE_LICENSE);
147
+ }
148
+
149
+ /**
150
+ * Retrieve Email Validate URL request
151
+ *
152
+ * @return string
153
+ */
154
+ public function getEmailValidateUrl()
155
+ {
156
+ return Mage::getStoreConfig(self::XML_PATH_EMAIL_VALIDATE_URL);
157
+ }
158
+
159
+ public function isAcceptUnknowsEmails()
160
+ {
161
+ return Mage::getStoreConfig(self::XML_PATH_EMAIL_ACCEPT_UNKNOWNS);
162
+ }
163
+
164
+ /**
165
+ * This willl probably be removed, with its const
166
+ *
167
+ * @return type
168
+ */
169
+ public function getInteractionFormName()
170
+ {
171
+ return self::INTERACTION_FORM_NAME;
172
+ }
173
+
174
+ /**
175
+ * Retrieve the currently used search engine (Singleline or Verification)
176
+ *
177
+ * @param string $dataset $dataset
178
+ *
179
+ * @return string
180
+ */
181
+ public function getSearchEngine($dataset)
182
+ {
183
+ $path = self::XML_PATH_SEARCH_ENGINE . '_' . $dataset;
184
+ return Mage::getStoreConfig($path);
185
+ }
186
+
187
+ /**
188
+ * Get the dataset used for the country
189
+ * This information is retrieved from config.xml file
190
+ *
191
+ * @param string $country $country
192
+ *
193
+ * @return string
194
+ */
195
+ public function getCountryDataset($country)
196
+ {
197
+ $dataset = $country;
198
+
199
+ if (is_null($this->_datasets)) {
200
+ $this->_datasets = Mage::getConfig()
201
+ ->getNode(self::NODE_PATH_DATASET_MAPPER)
202
+ ->asArray();
203
+ }
204
+
205
+ if (isset($this->_datasets[$country])) {
206
+ $dataset = $this->_datasets[$country];
207
+ }
208
+
209
+ return $dataset;
210
+ }
211
+
212
+ public function getCountryAvailable()
213
+ {
214
+ $login = $this->getApiUser();
215
+ $password = $this->getApiPassword();
216
+ $api = Mage::getSingleton('experian_qas/qascall');
217
+ $apiDatasets = $api->getDataSets(false);
218
+ $datasets = array();
219
+
220
+ foreach ($apiDatasets as $ds) {
221
+ $datasets[$ds->ID] = $ds->Name;
222
+ }
223
+
224
+ return $datasets;
225
+ }
226
+
227
+ /**
228
+ * Prepare the query string for use in the API call
229
+ *
230
+ * @param array $address $address
231
+ *
232
+ * @return string
233
+ */
234
+ public function getQueryString($address)
235
+ {
236
+ $query = '';
237
+
238
+ if (isset($address['street'][0])) {
239
+ $query .= $address['street'][0];
240
+ }
241
+
242
+ if (isset($address['street'][1])) {
243
+ $query .= ' ' . $address['street'][1];
244
+ }
245
+
246
+ if (isset($address['postcode'])) {
247
+ $query .= ', ' . $address['postcode'];
248
+ }
249
+
250
+ // need the region
251
+
252
+ if (isset($address['city'])) {
253
+ $query .= ', ' . $address['city'];
254
+ }
255
+
256
+ return $query;
257
+ }
258
+
259
+ /**
260
+ * Check if a dataset is within the selected available datasets
261
+ *
262
+ * @param string $dataset $dataset
263
+ *
264
+ * @return boolean
265
+ */
266
+ public function isDatasetEnabled($dataset)
267
+ {
268
+ $enabledDatasets = Mage::getStoreConfig(self::XML_PATH_DATASETS);
269
+ return in_array($dataset, explode(',', $enabledDatasets));
270
+ }
271
+
272
+ /**
273
+ * Log a message inside experian_qas.log filename
274
+ *
275
+ * @param string $message $messages
276
+ *
277
+ * @return void
278
+ */
279
+ public function log($message)
280
+ {
281
+ Mage::log($message, NULL, self::LOG_FILENAME, true);
282
+ }
283
+
284
+ /**
285
+ * Return the layout that will be used to normalize the address
286
+ *
287
+ * @return string
288
+ */
289
+ public function getAddressLayout()
290
+ {
291
+ return self::ADDRESS_LAYOUT;
292
+ }
293
+
294
+ /**
295
+ * Map QAS address fields with the module
296
+ * Retrived from config.xml <mapping> tag
297
+ *
298
+ * @return array
299
+ */
300
+ public function getAddressFieldMapper()
301
+ {
302
+ $map = array();
303
+ $node = Mage::getConfig()->getNode(self::NODE_PATH_ADDRESS_MAPPER);
304
+ $mapping = $node->asArray();
305
+
306
+ foreach ($mapping as $index => $keyvalue) {
307
+ $map[$keyvalue['key']] = $keyvalue['value'];
308
+ }
309
+
310
+ return $map;
311
+ }
312
+
313
+ /**
314
+ * Get not mapped address by using an array of countries where we can't match
315
+ * with our internal config.
316
+ *
317
+ * @return array
318
+ */
319
+ public function getNotMappedCountries()
320
+ {
321
+ $map = array();
322
+ $node = Mage::getConfig()->getNode(self::NODE_PATH_NOMAP);
323
+ $mapping = $node->asArray();
324
+ return array_keys($mapping);
325
+ }
326
+
327
+ /**
328
+ * Combine address keys with the web server resource to be able to recognize each input .
329
+ *
330
+ * @param array $arrayResult $arrayResult
331
+ *
332
+ * @return array
333
+ */
334
+ public function mapAddressKeys($arrayResult)
335
+ {
336
+ $map = array();
337
+ $node = Mage::getConfig()->getNode(self::NODE_PATH_NOMAP_ADDRESS_KEYS);
338
+ $mapping = $node->asArray();
339
+
340
+ foreach ($mapping as $index => $keyvalue) {
341
+ $map[$keyvalue['key']] = $keyvalue['value'];
342
+ }
343
+
344
+ $myKeys = array_keys($map);
345
+ foreach ($arrayResult as $key => $arr) {
346
+ $arr->Label = $myKeys[$key];
347
+ }
348
+ return $arrayResult;
349
+ }
350
+ /**
351
+ * Prepare an empty mapper so that we have all the necessary params for
352
+ * the addresses like street_1, street_2, city, zip and country
353
+ *
354
+ * @return array
355
+ */
356
+ protected function _prepareEmptyMapper()
357
+ {
358
+ $address = array();
359
+ $mapper = $this->getAddressFieldMapper();
360
+
361
+ foreach ($mapper as $value) {
362
+ $address[$value] = '';
363
+ }
364
+
365
+ return $address;
366
+ }
367
+
368
+ /**
369
+ * Map address values retrieved from API to Magento fields
370
+ * The country is needed to load regions
371
+ *
372
+ * @param stdClass $addressLines $addressLines
373
+ * @param strind $country $country
374
+ *
375
+ * @return array
376
+ */
377
+ public function getMappedAddress($addressLines, $country)
378
+ {
379
+ $mapper = $this->getAddressFieldMapper();
380
+ $address = $this->_prepareEmptyMapper();
381
+ //we whether is there any special country
382
+ if (in_array($country, $this->getNotMappedCountries())) {
383
+ $addressLines = $this->mapAddressKeys($addressLines);
384
+ }
385
+
386
+ foreach ($addressLines as $line) {
387
+ if (isset($mapper[$line->Label]) && !empty($line->Line)) {
388
+
389
+ if (isset($mapper[$line->Label]) && $mapper[$line->Label] == 'region') {
390
+ // needs refactoring here
391
+ $region = Mage::getSingleton('directory/region');
392
+ $region->loadByName($line->Line, $country);
393
+ if (!$region->getId()) {
394
+ $region->loadByCode($line->Line, $country);
395
+ }
396
+ $regionId = $region->getId();
397
+ if (!empty($regionId) && isset($regionId)) {
398
+ $address[$mapper[$line->Label]] = $region->getId();
399
+ } else {
400
+ $address[$mapper[$line->Label]] = $line->Line;
401
+ }
402
+
403
+ } else {
404
+ if (isset($address[$mapper[$line->Label]])
405
+ && !empty($address[$mapper[$line->Label]])) {
406
+ $address[$mapper[$line->Label]] .= ' ' . $line->Line;
407
+ } else {
408
+ $address[$mapper[$line->Label]] = $line->Line;
409
+ }
410
+ }
411
+ }
412
+ }
413
+
414
+ // if street_1 is empty, put the content of street_2 inside
415
+ if (isset($address['street_1']) && isset($address['street_2'])
416
+ && empty($address['street_1']) && !empty($address['street_2'])) {
417
+ $address['street_1'] = $address['street_2'];
418
+ $address['street_2'] = '';
419
+ }
420
+
421
+ return $address;
422
+ }
423
+
424
+ /**
425
+ * Validate email from new platform
426
+ * https://api.experianmarketingservices.com/sync/queryresult/EmailValidate/1.0/
427
+ *
428
+ * @param string $email email
429
+ *
430
+ * @return void
431
+ */
432
+ public function isEmailValid($email)
433
+ {
434
+ $url = $this->getEmailValidateUrl();
435
+ $license = $this->getEmailValidateLicense();
436
+ $arr = array('email' => $email);
437
+ $postFields = json_encode($arr);
438
+
439
+ $headers = array("POST / HTTP/1.1",
440
+ "Auth-Token:{$license}",
441
+ );
442
+
443
+ ob_start();
444
+ $ch = curl_init();
445
+ curl_setopt($ch, CURLOPT_URL, $url);
446
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
447
+ curl_setopt($ch, CURLOPT_POST, 1);
448
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
449
+ curl_setopt($ch, CURLOPT_VERBOSE, '1');
450
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
451
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
452
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
453
+ $result = curl_exec($ch);
454
+ if (!empty($result)) {
455
+ echo $result;
456
+ } else {
457
+ echo '{"Certainty":"verified", "Message":"Curl Error '.curl_error($ch).'"}';
458
+ }
459
+ curl_close($ch);
460
+ $content = ob_get_clean();
461
+
462
+ $this->log($content);
463
+
464
+ return $content;
465
+ }
466
+ }
app/code/community/Experian/Qas/Model/Observer.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas Observer
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Model_Observer extends Mage_Core_Model_Abstract
11
+ {
12
+ /**
13
+ * Check authentification and Retrieve the available datasets for the user.
14
+ */
15
+ public function confirmationCredentialsAndDs($observer)
16
+ {
17
+ $login = Mage::helper('experian_qas')->getApiUser();
18
+ $password = Mage::helper('experian_qas')->getApiPassword();
19
+ $api = Mage::getSingleton('experian_qas/qascall');
20
+ $api->getConfigDataSets();
21
+ }
22
+
23
+ /**
24
+ * Add missing_verification flag of customer address
25
+ *
26
+ * @param unknown $observer
27
+ *
28
+ * @return void
29
+ */
30
+ public function flagCustomerAddress($observer)
31
+ {
32
+ if (Mage::helper('experian_qas')->isEnabled()) {
33
+ $customerAddress = $observer->getCustomerAddress();
34
+ $session = Mage::getSingleton('core/session');
35
+ $sessionKey = 'experian_missing_validation_' . Experian_Qas_Block_Verification::TYPE_ADDRESS;
36
+
37
+ $missingVerification = $session->getData($sessionKey);
38
+ $customerAddress->setData('missing_verification', $missingVerification);
39
+ $session->setData($sessionKey, false);
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Add missing_verification flag of order address
45
+ *
46
+ * @param Varien_Event $observer
47
+ *
48
+ * @return void
49
+ */
50
+ public function flagOrderAddress($observer)
51
+ {
52
+ if (Mage::helper('experian_qas')->isEnabled()) {
53
+ $session = Mage::getSingleton('core/session');
54
+ $sessionBillingKey = 'experian_missing_validation_' . Experian_Qas_Block_Verification::TYPE_BILLING;
55
+ $sessionShippingKey = 'experian_missing_validation_' . Experian_Qas_Block_Verification::TYPE_SHIPPING;
56
+
57
+ $event = $observer->getEvent();
58
+ $order = $event->getOrder();
59
+
60
+ $missingBillingVerification = $session->getData($sessionBillingKey);
61
+ $billingAddress = $order->getBillingAddress();
62
+ $billingAddress->setData('missing_verification', $missingBillingVerification);
63
+ $session->setData($sessionBillingKey, false);
64
+
65
+ $missingShippingVerification = $session->getData($sessionShippingKey);
66
+ $shippingAddress = $order->getShippingAddress();
67
+ $shippingAddress->setData('missing_verification', $missingShippingVerification);
68
+ $session->setData($sessionShippingKey, false);
69
+ }
70
+ }
71
+ }
app/code/community/Experian/Qas/Model/Qascall.php ADDED
@@ -0,0 +1,217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas Api
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Model_Qascall
11
+ {
12
+ protected $_helper = NULL;
13
+ protected $_apiUser;
14
+ protected $_apiPassword;
15
+ protected $_wsdlName;
16
+ protected $_apiClient = NULL;
17
+ protected $_datasets = NULL;
18
+
19
+
20
+ public function __construct()
21
+ {
22
+ $helper = $this->_getHelper();
23
+ $this->_apiUser = $helper->getApiUser();
24
+ $this->_apiPassword = $helper->getApiPassword();
25
+ $this->_wsdlName = $helper->getWsdlName();
26
+ $this->_ondemandUrl = $helper->getOndemandUrl();
27
+
28
+ $options = array(
29
+ 'trace' => 1,
30
+ 'soap_version' => SOAP_1_1,
31
+ 'encoding' => 'UTF-8',
32
+ 'cache_wsdl' => WSDL_CACHE_BOTH
33
+ );
34
+ //Getting the base dir of our wsdl located in the etc of experian module
35
+ $baseWsdlFile = Mage::getConfig()->getModuleDir('etc', "Experian_Qas") . DS . $this->_wsdlName;
36
+ try {
37
+ $this->_apiClient = new SoapClient($baseWsdlFile, $options);
38
+ $this->_setAuthHeader();
39
+ } catch (SoapFault $e) {
40
+ $helper->log($e->getMessage());
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Set header authentication in Soap Client
46
+ */
47
+ protected function _setAuthHeader()
48
+ {
49
+ $params = array(
50
+ 'Security'=>'',
51
+ 'QAAuthentication' => array(
52
+ 'Username'=>$this->_apiUser,
53
+ 'Password'=>$this->_apiPassword
54
+ )
55
+ );
56
+
57
+ $authheader = new SoapHeader(
58
+ $this->_ondemandUrl,
59
+ 'QAQueryHeader',
60
+ $params
61
+ );
62
+
63
+ $this->_apiClient->__setSoapHeaders($authheader);
64
+ }
65
+
66
+ /**
67
+ * Retrieve Experian Qas Helper
68
+ *
69
+ * @return Experian_Qas_Helper_Data
70
+ */
71
+ protected function _getHelper()
72
+ {
73
+ if (is_null($this->_helper)) {
74
+ $this->_helper = Mage::helper('experian_qas');
75
+ }
76
+
77
+ return $this->_helper;
78
+ }
79
+
80
+ /**
81
+ * Retrieve the instanciated API SOAP Client
82
+ *
83
+ * @return type
84
+ */
85
+ public function getApiClient()
86
+ {
87
+ return $this->_apiClient;
88
+ }
89
+
90
+ /**
91
+ * Retrieve the available datasets
92
+ *
93
+ * @return array
94
+ */
95
+ public function getDataSets($displayError = true)
96
+ {
97
+ if (is_null($this->_datasets)) {
98
+ try {
99
+ $this->_datasets = $this->_apiClient->DoGetData()->DataSet;
100
+ } catch (Exception $e) {
101
+ if ($displayError) {
102
+ Mage::getSingleton('core/session')->addError($e->getMessage());
103
+ }
104
+ $this->_helper->log($e->getMessage());
105
+ $this->_datasets = array();
106
+ }
107
+ }
108
+
109
+ return $this->_datasets;
110
+ }
111
+
112
+ /**
113
+ * Check if the address search can be made on a certain dataset
114
+ *
115
+ * @param array $args
116
+ * @return boolean
117
+ */
118
+ public function getCanSearch($args)
119
+ {
120
+ try {
121
+ return $this->_apiClient->DoCanSearch($args)->IsOk;
122
+ } catch (SoapFault $e) {
123
+ $this->_helper->log($e->getMessage());
124
+ }
125
+
126
+ return false;
127
+ }
128
+
129
+ /**
130
+ * Retrieve the list of addresses returned by the API
131
+ *
132
+ * @param array $args
133
+ * @return stdClass Object QAPicklist list of addresses
134
+ */
135
+ public function getDoSearch($args)
136
+ {
137
+ return $this->_apiClient->DoSearch($args);
138
+ }
139
+
140
+ /**
141
+ * Format the address basing on the dataset or the country
142
+ *
143
+ * @param array $addressLines
144
+ * @param string $country
145
+ * @return array
146
+ */
147
+ public function getMappedAddress($addressLines, $country = NULL)
148
+ {
149
+ return $this->_helper->getMappedAddress($addressLines, $country);
150
+ }
151
+
152
+ /**
153
+ * Retrieved the normalized address with the API using a moniker and a layout
154
+ *
155
+ * @param string $moniker
156
+ * @param string $layout
157
+ * @return stdClass
158
+ */
159
+ public function getNormalizedAddress($moniker, $layout = NULL)
160
+ {
161
+ $address = NULL;
162
+ $args = array(
163
+ 'Moniker' => $moniker,
164
+ 'Layout' => $layout
165
+ );
166
+
167
+ try {
168
+ $address = $this->_apiClient->DoGetAddress($args);
169
+ } catch (SoapFault $e) {
170
+ $this->_helper->log($e->getMessage());
171
+ }
172
+
173
+ return $address;
174
+ }
175
+
176
+ /**
177
+ * Retrieve all the available address layouts for a certain dataset/country
178
+ *
179
+ * @param string $dataset
180
+ * @return stdClass
181
+ */
182
+ public function getAddressLayouts($dataset)
183
+ {
184
+ $layouts = NULL;
185
+ $args = array(
186
+ 'Country' => $dataset
187
+ );
188
+
189
+ try {
190
+ $layouts = $this->_apiClient->DoGetLayouts($args);
191
+ } catch (SoapFault $e) {
192
+ $this->_helper->log($e->getMessage());
193
+ }
194
+
195
+ return $layouts;
196
+ }
197
+ /**
198
+ * Check authentification and Retrieve the available datasets to configuration page
199
+ */
200
+ public function getConfigDataSets()
201
+ {
202
+
203
+ if (is_null($this->_datasets)) {
204
+ try {
205
+ $this->_datasets = $this->_apiClient->DoGetData()->DataSet;
206
+ Mage::getSingleton('core/session')->addNotice('Allowed datasets :');
207
+ foreach($this->_datasets as $ds)
208
+ {
209
+ Mage::getSingleton('core/session')->addNotice($ds->ID.': '.$ds->Name);
210
+ }
211
+
212
+ } catch (Exception $e) {
213
+ Mage::getSingleton('core/session')->addError($e->getMessage());
214
+ }
215
+ }
216
+ }
217
+ }
app/code/community/Experian/Qas/Model/System/Config/Source/Engine.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas Engine type source
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Model_System_Config_Source_Engine
11
+ extends Mage_Eav_Model_Entity_Attribute_Source_Config
12
+ {
13
+ public function __construct()
14
+ {
15
+ $this->_configNodePath = 'global/experian_qas/engine/type';
16
+ }
17
+
18
+ /**
19
+ * Retrieve Search Engine type options
20
+ *
21
+ * @return array
22
+ */
23
+ public function toOptionArray()
24
+ {
25
+ if (!$this->_options) {
26
+ $this->_options = parent::getAllOptions();
27
+ array_unshift($this->_options, array('value' => '', 'label' => Mage::helper('experian_qas')->__('-- Please Select --')));
28
+ }
29
+ return $this->_options;
30
+ }
31
+ }
app/code/community/Experian/Qas/Model/System/Config/Source/SpecialEngine.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas Engine type source
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_Model_System_Config_Source_SpecialEngine
11
+ extends Experian_Qas_Model_System_Config_Source_Engine
12
+ {
13
+ public function __construct()
14
+ {
15
+ $this->_configNodePath = 'global/experian_qas/specialengine/type';
16
+ }
17
+ }
app/code/community/Experian/Qas/controllers/ProcessController.php ADDED
@@ -0,0 +1,217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Experian Qas Controller
4
+ *
5
+ * @category Experian
6
+ * @package Experian_Qas
7
+ * @copyright 2012 Experian
8
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
+ */
10
+ class Experian_Qas_ProcessController extends Mage_Core_Controller_Front_Action
11
+ {
12
+ const CACHE_INTUITIVE_TAG = 'EXPERIAN_INTUITIVE';
13
+ const CACHE_INTUITIVE_LIFETIME = 3600;
14
+
15
+ /**
16
+ * Call the Intuitive Gngine
17
+ *
18
+ * @return string
19
+ */
20
+ public function intuitiveEngineAction()
21
+ {
22
+ $helper = Mage::helper('experian_qas');
23
+ $isIntuitiveEnabled = $helper->isIntuitiveEnabled();
24
+ $searchAddress = $this->getRequest()->getParam(Experian_Qas_Helper_Data::QUERY_PARAM, false);
25
+ $country = $this->getRequest()->getParam(Experian_Qas_Helper_Data::QUERY_COUNTRY, false);
26
+ $api = Mage::getSingleton('experian_qas/qascall');
27
+
28
+ if (($searchAddress == false) || ($isIntuitiveEnabled == false) || ($country != 'FR')) {
29
+ $message = $helper->__('Intuitive Engine is disabled for all Datasets except France (FRI).');
30
+ $helper->log($message);
31
+ return;
32
+ }
33
+
34
+ // Check if we need use FRI or FR3
35
+ $datasetAvailable = $helper->getCountryAvailable();
36
+ $countryDataset = Experian_Qas_Helper_Data::INTUITIVE_DATASET_FRANCE;
37
+ if (isset($datasetAvailable[Experian_Qas_Helper_Data::INTUITIVE_DATASET_FRANCE_BIS])) {
38
+ $countryDataset = Experian_Qas_Helper_Data::INTUITIVE_DATASET_FRANCE_BIS;
39
+ }
40
+
41
+ $args = array(
42
+ 'Country' => $countryDataset,
43
+ 'Search' => $searchAddress, //get all the address info @todo
44
+ 'Engine' => Experian_Qas_Helper_Data::INTUITIVE_ENGINE_CODE,
45
+ 'Layout' => $helper->getAddressLayout()
46
+ );
47
+
48
+ $html = '';
49
+
50
+ if ($api->getCanSearch($args) == true) {
51
+ $cacheKey = self::CACHE_INTUITIVE_TAG . '_' . md5(serialize($args));
52
+
53
+ if ($helper->isCacheEnabled() &&
54
+ false !== ($result = Mage::app()->getCache()->load($cacheKey))) {
55
+ $html = $result;
56
+ } else {
57
+ $qaPicklist = $api->getDoSearch($args)->QAPicklist;
58
+
59
+ if ($qaPicklist->Total > 0) {
60
+ $picklistEntries = $qaPicklist->PicklistEntry;
61
+ $html = $this->getLayout()->createBlock('experian_qas/autocomplete')
62
+ ->setPicklistEntries($picklistEntries)
63
+ ->toHtml();
64
+ }
65
+
66
+ // Cache the result
67
+ if ($helper->isCacheEnabled()) {
68
+ Mage::app()->getCache()->save(
69
+ $html,
70
+ $cacheKey,
71
+ array(self::CACHE_INTUITIVE_TAG),
72
+ self::CACHE_INTUITIVE_LIFETIME
73
+ );
74
+ }
75
+ }
76
+ }
77
+
78
+ return $this->getResponse()->setBody($html);
79
+ }
80
+
81
+ /**
82
+ * Retrieve the address using the moniker and send it normalized
83
+ *
84
+ * @return string
85
+ */
86
+ public function normalizeAddressAction()
87
+ {
88
+ $mappedAddress = array();
89
+ $moniker = $this->getRequest()->getParam(Experian_Qas_Helper_Data::QUERY_MONIKER, false);
90
+ // find sth better for these below
91
+ $country = substr($moniker, 0, 2);
92
+ $dataset = substr($moniker, 0, 3);
93
+
94
+ $api = Mage::getSingleton('experian_qas/qascall');
95
+ $layout = Mage::helper('experian_qas')->getAddressLayout();
96
+
97
+ $normalizedAddress = $api->getNormalizedAddress($moniker, $layout);
98
+ if (isset($normalizedAddress->QAAddress->AddressLine)) {
99
+ $mappedAddress = $api->getMappedAddress($normalizedAddress->QAAddress->AddressLine, $country);
100
+ }
101
+
102
+ return $this->getResponse()
103
+ ->setBody(Mage::helper('core')->jsonEncode($mappedAddress));
104
+ }
105
+
106
+ /**
107
+ * Test the validity of an email
108
+ *
109
+ * @return string
110
+ */
111
+ public function validateEmailAction()
112
+ {
113
+ $content = '{"Certainty":"unknown", "Message":"OK"}';
114
+ $helper = Mage::helper('experian_qas');
115
+
116
+ if ($helper->isEmailValidateEnabled()) {
117
+ $email = $this->getRequest()->getParam('email', false);
118
+ if ($email != false) {
119
+ $content = $helper->isEmailValid($email);
120
+ }
121
+ }
122
+
123
+ return $this->getResponse()->setBody($content);
124
+ }
125
+
126
+ /**
127
+ * Prepare the query string with address parameters
128
+ *
129
+ * @return string
130
+ */
131
+ protected function _getAddressParams()
132
+ {
133
+ $params = $this->getRequest()->getParams();
134
+ $address = new Varien_Object($params);
135
+
136
+ if ($address->getBilling()) {
137
+ $address = $address->getBilling();
138
+ } elseif ($address->getShipping()) {
139
+ $address = $address->getShipping();
140
+ }
141
+
142
+ return Mage::helper('experian_qas')->getQueryString($address);
143
+ }
144
+
145
+ /**
146
+ * Retrieve the country code from the request (form)
147
+ *
148
+ * @return string
149
+ */
150
+ protected function _getCountryId()
151
+ {
152
+ $params = $this->getRequest()->getParams();
153
+ $address = new Varien_Object($params);
154
+
155
+ if ($address->getBilling()) {
156
+ $address = new Varien_Object($address->getBilling());
157
+ } elseif ($address->getShipping()) {
158
+ $address = new Varien_Object($address->getShipping());
159
+ }
160
+
161
+ return $address->getCountryId();
162
+ }
163
+
164
+ /**
165
+ * Make the request to retrieve addresses from the API
166
+ *
167
+ * @return string
168
+ */
169
+ public function addressSearchEngineAction()
170
+ {
171
+ $html = '';
172
+ $helper = Mage::helper('experian_qas');
173
+ $api = Mage::getSingleton('experian_qas/qascall');
174
+ $country = $this->_getCountryId();
175
+ $edit = $this->getRequest()->getParam('edit');
176
+ $dataset = $helper->getCountryDataset($country);
177
+ $session = Mage::getSingleton('core/session');
178
+ $sessionMissingValidationKey = 'experian_missing_validation_';
179
+ $searchEngine = $helper->getSearchEngine($dataset);
180
+ if (!empty($searchEngine)) {
181
+ $args = array(
182
+ 'Country' => $dataset,
183
+ 'Search' => $this->_getAddressParams(),
184
+ 'Engine' => $searchEngine,
185
+ 'Layout' => $helper->getAddressLayout()
186
+ );
187
+
188
+ if ($api->getCanSearch($args) == true) {
189
+ if ($searchEngine == Experian_Qas_Helper_Data::VERIFICATION_ENGINE_CODE) {
190
+ $result = $api->getDoSearch($args);
191
+ $html = $this->getLayout()->createBlock('experian_qas/verification')
192
+ ->setResult($result)
193
+ ->setCountryId($country)
194
+ ->setEdit($edit)
195
+ ->toHtml();
196
+ $session->setData($sessionMissingValidationKey.$edit, false);
197
+ } elseif ($searchEngine == Experian_Qas_Helper_Data::SINGLELINE_ENGINE_CODE) {
198
+ $result = $api->getDoSearch($args);
199
+ $picklistEntries = array();
200
+ if (isset($result->QAPicklist) && isset($result->QAPicklist->PicklistEntry)) {
201
+ $picklistEntries = $api->getDoSearch($args)->QAPicklist->PicklistEntry;
202
+ }
203
+
204
+ $html = $this->getLayout()->createBlock('experian_qas/interaction')
205
+ ->setPicklistEntries($picklistEntries)
206
+ ->toHtml();
207
+ $session->setData($sessionMissingValidationKey.$edit, false);
208
+ }
209
+ } else {
210
+ // Service not available
211
+ $session->setData($sessionMissingValidationKey.$edit, true);
212
+ }
213
+ }
214
+
215
+ return $this->getResponse()->setBody($html);
216
+ }
217
+ }
app/code/community/Experian/Qas/etc/adminhtml.xml ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * @category Experian
5
+ * @package Experian_Qas
6
+ * @copyright Experian 2012
7
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
8
+ */
9
+ -->
10
+ <config>
11
+ <acl>
12
+ <resources>
13
+ <admin>
14
+ <children>
15
+ <system>
16
+ <children>
17
+ <config>
18
+ <children>
19
+ <qas_address_verifier translate="title" module="experian_qas">
20
+ <title>QAS - General</title>
21
+ </qas_address_verifier>
22
+ </children>
23
+ </config>
24
+ </children>
25
+ </system>
26
+ </children>
27
+ </admin>
28
+ </resources>
29
+ </acl>
30
+ </config>
app/code/community/Experian/Qas/etc/config.xml ADDED
@@ -0,0 +1,414 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!-- /** * @category Experian * @package Experian_Qas * @copyright Experian
3
+ 2012 * @license http://opensource.org/licenses/osl-3.0.php Open Software
4
+ License (OSL 3.0) */ -->
5
+ <config>
6
+ <modules>
7
+ <Experian_Qas>
8
+ <version>0.0.1</version>
9
+ </Experian_Qas>
10
+ </modules>
11
+ <global>
12
+ <ignoredModules>
13
+ <entities>
14
+ <qas />
15
+ </entities>
16
+ </ignoredModules>
17
+ <models>
18
+ <experian_qas>
19
+ <class>Experian_Qas_Model</class>
20
+ </experian_qas>
21
+ </models>
22
+ <resources>
23
+ <qas_setup>
24
+ <setup>
25
+ <module>Experian_Qas</module>
26
+ <class>Mage_Customer_Model_Entity_Setup</class>
27
+ </setup>
28
+ <connection>
29
+ <use>core_setup</use>
30
+ </connection>
31
+ </qas_setup>
32
+ </resources>
33
+ <helpers>
34
+ <experian_qas>
35
+ <class>Experian_Qas_Helper</class>
36
+ </experian_qas>
37
+ </helpers>
38
+ <blocks>
39
+ <experian_qas>
40
+ <class>Experian_Qas_Block</class>
41
+ </experian_qas>
42
+ </blocks>
43
+ <events>
44
+ <admin_system_config_changed_section_qas_address_verifier>
45
+ <observers>
46
+ <experian_qas>
47
+ <type>singleton</type>
48
+ <class>experian_qas/observer</class>
49
+ <method>confirmationCredentialsAndDs</method>
50
+ </experian_qas>
51
+ </observers>
52
+ </admin_system_config_changed_section_qas_address_verifier>
53
+
54
+ <customer_address_save_before>
55
+ <observers>
56
+ <experian_qas_flag_customer_address>
57
+ <type>singleton</type>
58
+ <class>experian_qas/observer</class>
59
+ <method>flagCustomerAddress</method>
60
+ </experian_qas_flag_customer_address>
61
+ </observers>
62
+ </customer_address_save_before>
63
+
64
+ <checkout_type_onepage_save_order>
65
+ <observers>
66
+ <experian_qas_flag_order_address>
67
+ <type>model</type>
68
+ <class>experian_qas/observer</class>
69
+ <method>flagOrderAddress</method>
70
+ </experian_qas_flag_order_address>
71
+ </observers>
72
+ </checkout_type_onepage_save_order>
73
+ </events>
74
+
75
+ <!-- Search Engine type options -->
76
+ <experian_qas>
77
+ <engine>
78
+ <type>
79
+ <verification translate="label">
80
+ <value>Verification</value>
81
+ <label>Verification</label>
82
+ </verification>
83
+ <singleline translate="label">
84
+ <value>Singleline</value>
85
+ <label>Singleline</label>
86
+ </singleline>
87
+ </type>
88
+ </engine>
89
+ <specialengine>
90
+ <type>
91
+ <singleline translate="label">
92
+ <value>Singleline</value>
93
+ <label>Singleline</label>
94
+ </singleline>
95
+ </type>
96
+ </specialengine>
97
+ </experian_qas>
98
+
99
+ <mapping>
100
+ <address>
101
+ <!-- UK -->
102
+ <MAGENTO2012_organisation>
103
+ <key><![CDATA[Organisation]]></key>
104
+ <value><![CDATA[street_2]]></value>
105
+ </MAGENTO2012_organisation>
106
+
107
+ <!-- US -->
108
+ <MAGENTO2012_building_firm_name>
109
+ <key><![CDATA[Building/firm name]]></key>
110
+ <value><![CDATA[street_2]]></value>
111
+ </MAGENTO2012_building_firm_name>
112
+ <MAGENTO2012_organisation>
113
+ <key><![CDATA[County]]></key>
114
+ <value><![CDATA[street_2]]></value>
115
+ </MAGENTO2012_organisation>
116
+
117
+ <!-- All -->
118
+ <MAGENTO2012_street_1>
119
+ <key><![CDATA[Street 1]]></key>
120
+ <value><![CDATA[street_1]]></value>
121
+ </MAGENTO2012_street_1>
122
+ <MAGENTO2012_street_2>
123
+ <key><![CDATA[Street 2]]></key>
124
+ <value><![CDATA[street_2]]></value>
125
+ </MAGENTO2012_street_2>
126
+ <MAGENTO2012_street_3>
127
+ <key><![CDATA[Street 3]]></key>
128
+ <value><![CDATA[street_2]]></value>
129
+ </MAGENTO2012_street_3>
130
+ <MAGENTO2012_city>
131
+ <key><![CDATA[City]]></key>
132
+ <value><![CDATA[city]]></value>
133
+ </MAGENTO2012_city>
134
+ <MAGENTO2012_state_province>
135
+ <key><![CDATA[State/Province]]></key>
136
+ <value><![CDATA[region]]></value>
137
+ </MAGENTO2012_state_province>
138
+ <MAGENTO2012_zip_postal_code>
139
+ <key><![CDATA[ZIP/Postal Code]]></key>
140
+ <value><![CDATA[zip]]></value>
141
+ </MAGENTO2012_zip_postal_code>
142
+ <MAGENTO2012_country_region>
143
+ <key><![CDATA[Country/Region]]></key>
144
+ <value><![CDATA[country]]></value>
145
+ </MAGENTO2012_country_region>
146
+
147
+ <!-- key is not the same 'c' lower letter -->
148
+ <TMP_ESP_MAGENTO2012_zip_postal_code>
149
+ <key><![CDATA[ZIP/Postal code]]></key>
150
+ <value><![CDATA[zip]]></value>
151
+ </TMP_ESP_MAGENTO2012_zip_postal_code>
152
+
153
+ </address>
154
+ <dataset>
155
+ <AW><![CDATA[ABW]]></AW>
156
+ <AF><![CDATA[AFG]]></AF>
157
+ <AO><![CDATA[AGO]]></AO>
158
+ <AL><![CDATA[ALB]]></AL>
159
+ <AN><![CDATA[ANT]]></AN>
160
+ <AE><![CDATA[ARE]]></AE>
161
+ <AR><![CDATA[ARG]]></AR>
162
+ <AM><![CDATA[ARM]]></AM>
163
+ <AG><![CDATA[ATG]]></AG>
164
+ <AU><![CDATA[AUS]]></AU>
165
+ <AT><![CDATA[AUT]]></AT>
166
+ <AZ><![CDATA[AZE]]></AZ>
167
+ <BI><![CDATA[BDI]]></BI>
168
+ <BE><![CDATA[BEL]]></BE>
169
+ <BJ><![CDATA[BEN]]></BJ>
170
+ <BF><![CDATA[BFA]]></BF>
171
+ <BD><![CDATA[BGD]]></BD>
172
+ <BG><![CDATA[BGR]]></BG>
173
+ <BH><![CDATA[BHR]]></BH>
174
+ <BS><![CDATA[BHS]]></BS>
175
+ <BA><![CDATA[BIH]]></BA>
176
+ <BY><![CDATA[BLR]]></BY>
177
+ <BZ><![CDATA[BLZ]]></BZ>
178
+ <BM><![CDATA[BMU]]></BM>
179
+ <BO><![CDATA[BOL]]></BO>
180
+ <BR><![CDATA[BRA]]></BR>
181
+ <BB><![CDATA[BRB]]></BB>
182
+ <BN><![CDATA[BRN]]></BN>
183
+ <BT><![CDATA[BTN]]></BT>
184
+ <BW><![CDATA[BWA]]></BW>
185
+ <CF><![CDATA[CAF]]></CF>
186
+ <CA><![CDATA[CAN]]></CA>
187
+ <CH><![CDATA[CHE]]></CH>
188
+ <CL><![CDATA[CHL]]></CL>
189
+ <CN><![CDATA[CHN]]></CN>
190
+ <CI><![CDATA[CIV]]></CI>
191
+ <CM><![CDATA[CMR]]></CM>
192
+ <CD><![CDATA[COD]]></CD>
193
+ <CG><![CDATA[COG]]></CG>
194
+ <CO><![CDATA[COL]]></CO>
195
+ <KM><![CDATA[COM]]></KM>
196
+ <CV><![CDATA[CPV]]></CV>
197
+ <CR><![CDATA[CRI]]></CR>
198
+ <CU><![CDATA[CUB]]></CU>
199
+ <KY><![CDATA[CYM]]></KY>
200
+ <CY><![CDATA[CYP]]></CY>
201
+ <CZ><![CDATA[CZE]]></CZ>
202
+ <DE><![CDATA[DEU]]></DE>
203
+ <DJ><![CDATA[DJI]]></DJ>
204
+ <DM><![CDATA[DMA]]></DM>
205
+ <DK><![CDATA[DNK]]></DK>
206
+ <DO><![CDATA[DOM]]></DO>
207
+ <DZ><![CDATA[DZA]]></DZ>
208
+ <EC><![CDATA[ECU]]></EC>
209
+ <EG><![CDATA[EGY]]></EG>
210
+ <ER><![CDATA[ERI]]></ER>
211
+ <EH><![CDATA[ESH]]></EH>
212
+ <ES><![CDATA[ESP]]></ES>
213
+ <EE><![CDATA[EST]]></EE>
214
+ <ET><![CDATA[ETH]]></ET>
215
+ <FI><![CDATA[FIN]]></FI>
216
+ <FJ><![CDATA[FJI]]></FJ>
217
+ <FR><![CDATA[FRX]]></FR>
218
+ <GA><![CDATA[GAB]]></GA>
219
+ <GB><![CDATA[GBR]]></GB>
220
+ <GE><![CDATA[GEO]]></GE>
221
+ <GH><![CDATA[GHA]]></GH>
222
+ <GN><![CDATA[GIN]]></GN>
223
+ <GM><![CDATA[GMB]]></GM>
224
+ <GW><![CDATA[GNB]]></GW>
225
+ <GQ><![CDATA[GNQ]]></GQ>
226
+ <GR><![CDATA[GRC]]></GR>
227
+ <GD><![CDATA[GRD]]></GD>
228
+ <GT><![CDATA[GTM]]></GT>
229
+ <GY><![CDATA[GUY]]></GY>
230
+ <HK><![CDATA[HKG]]></HK>
231
+ <HN><![CDATA[HND]]></HN>
232
+ <HR><![CDATA[HRV]]></HR>
233
+ <HT><![CDATA[HTI]]></HT>
234
+ <HU><![CDATA[HUN]]></HU>
235
+ <ID><![CDATA[IDN]]></ID>
236
+ <IN><![CDATA[IND]]></IN>
237
+ <IE><![CDATA[IRL]]></IE>
238
+ <IR><![CDATA[IRN]]></IR>
239
+ <IQ><![CDATA[IRQ]]></IQ>
240
+ <IS><![CDATA[ISL]]></IS>
241
+ <IL><![CDATA[ISR]]></IL>
242
+ <IT><![CDATA[ITA]]></IT>
243
+ <JM><![CDATA[JAM]]></JM>
244
+ <JO><![CDATA[JOR]]></JO>
245
+ <JP><![CDATA[JPN]]></JP>
246
+ <KZ><![CDATA[KAZ]]></KZ>
247
+ <KE><![CDATA[KEN]]></KE>
248
+ <KG><![CDATA[KGZ]]></KG>
249
+ <KH><![CDATA[KHM]]></KH>
250
+ <KI><![CDATA[KIR]]></KI>
251
+ <KN><![CDATA[KNA]]></KN>
252
+ <KR><![CDATA[KOR]]></KR>
253
+ <KW><![CDATA[KWT]]></KW>
254
+ <LA><![CDATA[LAO]]></LA>
255
+ <LB><![CDATA[LBN]]></LB>
256
+ <LR><![CDATA[LBR]]></LR>
257
+ <LY><![CDATA[LBY]]></LY>
258
+ <LI><![CDATA[LIE]]></LI>
259
+ <LK><![CDATA[LKA]]></LK>
260
+ <LS><![CDATA[LSO]]></LS>
261
+ <LT><![CDATA[LTU]]></LT>
262
+ <LU><![CDATA[LUX]]></LU>
263
+ <LV><![CDATA[LVA]]></LV>
264
+ <MA><![CDATA[MAR]]></MA>
265
+ <MD><![CDATA[MDA]]></MD>
266
+ <MG><![CDATA[MDG]]></MG>
267
+ <MV><![CDATA[MDV]]></MV>
268
+ <MX><![CDATA[MEX]]></MX>
269
+ <MK><![CDATA[MKD]]></MK>
270
+ <ML><![CDATA[MLI]]></ML>
271
+ <MT><![CDATA[MLT]]></MT>
272
+ <MM><![CDATA[MMR]]></MM>
273
+ <MN><![CDATA[MNG]]></MN>
274
+ <MZ><![CDATA[MOZ]]></MZ>
275
+ <MR><![CDATA[MRT]]></MR>
276
+ <MU><![CDATA[MUS]]></MU>
277
+ <MW><![CDATA[MWI]]></MW>
278
+ <MY><![CDATA[MYS]]></MY>
279
+ <NA><![CDATA[NAM]]></NA>
280
+ <NE><![CDATA[NER]]></NE>
281
+ <NG><![CDATA[NGA]]></NG>
282
+ <NI><![CDATA[NIC]]></NI>
283
+ <NL><![CDATA[NLD]]></NL>
284
+ <NO><![CDATA[NOR]]></NO>
285
+ <NP><![CDATA[NPL]]></NP>
286
+ <NR><![CDATA[NRU]]></NR>
287
+ <NZ><![CDATA[NZL]]></NZ>
288
+ <OM><![CDATA[OMN]]></OM>
289
+ <PK><![CDATA[PAK]]></PK>
290
+ <PA><![CDATA[PAN]]></PA>
291
+ <PE><![CDATA[PER]]></PE>
292
+ <PH><![CDATA[PHL]]></PH>
293
+ <PG><![CDATA[PNG]]></PG>
294
+ <PL><![CDATA[POL]]></PL>
295
+ <KP><![CDATA[PRK]]></KP>
296
+ <PT><![CDATA[PRT]]></PT>
297
+ <PY><![CDATA[PRY]]></PY>
298
+ <QA><![CDATA[QAT]]></QA>
299
+ <RO><![CDATA[ROU]]></RO>
300
+ <RU><![CDATA[RUS]]></RU>
301
+ <RW><![CDATA[RWA]]></RW>
302
+ <SA><![CDATA[SAU]]></SA>
303
+ <RS><![CDATA[SCG]]></RS>
304
+ <SD><![CDATA[SDN]]></SD>
305
+ <SN><![CDATA[SEN]]></SN>
306
+ <SG><![CDATA[SGF]]></SG>
307
+ <SB><![CDATA[SLB]]></SB>
308
+ <SL><![CDATA[SLE]]></SL>
309
+ <SV><![CDATA[SLV]]></SV>
310
+ <SO><![CDATA[SOM]]></SO>
311
+ <ST><![CDATA[STP]]></ST>
312
+ <SR><![CDATA[SUR]]></SR>
313
+ <SK><![CDATA[SVK]]></SK>
314
+ <SI><![CDATA[SVN]]></SI>
315
+ <SE><![CDATA[SWE]]></SE>
316
+ <SZ><![CDATA[SWZ]]></SZ>
317
+ <SC><![CDATA[SYC]]></SC>
318
+ <SY><![CDATA[SYR]]></SY>
319
+ <TD><![CDATA[TCD]]></TD>
320
+ <TG><![CDATA[TGO]]></TG>
321
+ <TH><![CDATA[THA]]></TH>
322
+ <TJ><![CDATA[TJK]]></TJ>
323
+ <TM><![CDATA[TKM]]></TM>
324
+ <TO><![CDATA[TON]]></TO>
325
+ <TT><![CDATA[TTO]]></TT>
326
+ <TN><![CDATA[TUN]]></TN>
327
+ <TR><![CDATA[TUR]]></TR>
328
+ <TV><![CDATA[TUV]]></TV>
329
+ <TZ><![CDATA[TZA]]></TZ>
330
+ <UG><![CDATA[UGA]]></UG>
331
+ <UA><![CDATA[UKR]]></UA>
332
+ <UY><![CDATA[URY]]></UY>
333
+ <US><![CDATA[USA]]></US>
334
+ <UZ><![CDATA[UZB]]></UZ>
335
+ <VC><![CDATA[VCT]]></VC>
336
+ <VE><![CDATA[VEN]]></VE>
337
+ <VN><![CDATA[VNM]]></VN>
338
+ <VU><![CDATA[VUT]]></VU>
339
+ <WS><![CDATA[WSM]]></WS>
340
+ <YE><![CDATA[YEM]]></YE>
341
+ <ZA><![CDATA[ZAF]]></ZA>
342
+ <ZM><![CDATA[ZMB]]></ZM>
343
+ <ZW><![CDATA[ZWE]]></ZW>
344
+ </dataset>
345
+ <nomap><!-- for special countries ITA, RUS, BRA -->
346
+ <countries>
347
+ <IT><![CDATA[ITA]]></IT>
348
+ <RU><![CDATA[RUS]]></RU>
349
+ <BR><![CDATA[BRA]]></BR>
350
+ </countries>
351
+ <address_keys>
352
+ <MAGENTO2012_street_1>
353
+ <key><![CDATA[Street 1]]></key>
354
+ <value><![CDATA[street_1]]></value>
355
+ </MAGENTO2012_street_1>
356
+ <MAGENTO2012_city>
357
+ <key><![CDATA[City]]></key>
358
+ <value><![CDATA[city]]></value>
359
+ </MAGENTO2012_city>
360
+ <MAGENTO2012_state_province>
361
+ <key><![CDATA[State/Province]]></key>
362
+ <value><![CDATA[region]]></value>
363
+ </MAGENTO2012_state_province>
364
+ <MAGENTO2012_zip_postal_code>
365
+ <key><![CDATA[ZIP/Postal Code]]></key>
366
+ <value><![CDATA[zip]]></value>
367
+ </MAGENTO2012_zip_postal_code>
368
+ <MAGENTO2012_country_region>
369
+ <key><![CDATA[Country/Region]]></key>
370
+ <value><![CDATA[country]]></value>
371
+ </MAGENTO2012_country_region>
372
+ </address_keys>
373
+ </nomap>
374
+ </mapping>
375
+ </global>
376
+ <frontend>
377
+ <routers>
378
+ <qas>
379
+ <use>standard</use>
380
+ <args>
381
+ <module>Experian_Qas</module>
382
+ <frontName>qas</frontName>
383
+ </args>
384
+ </qas>
385
+ </routers>
386
+ <layout>
387
+ <updates>
388
+ <experian_qas>
389
+ <file>experian_qas.xml</file>
390
+ </experian_qas>
391
+ </updates>
392
+ </layout>
393
+ <translate>
394
+ <modules>
395
+ <Experian_Qas>
396
+ <files>
397
+ <default>Experian_Qas.csv</default>
398
+ </files>
399
+ </Experian_Qas>
400
+ </modules>
401
+ </translate>
402
+ </frontend>
403
+ <default>
404
+ <qas_address_verifier>
405
+ <general>
406
+ <wsdl_name>wsv3.wsdl</wsdl_name>
407
+ <on_demand_url>http://www.qas.com/OnDemand-2011-03</on_demand_url>
408
+ </general>
409
+ <email_validate>
410
+ <email_validate_url>https://api.experianmarketingservices.com/sync/queryresult/EmailValidate/1.0/</email_validate_url>
411
+ </email_validate>
412
+ </qas_address_verifier>
413
+ </default>
414
+ </config>
app/code/community/Experian/Qas/etc/jstranslator.xml ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * @category Experian
5
+ * @package Experian_Qas
6
+ * @copyright Experian 2012
7
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
8
+ */
9
+ -->
10
+ <jstranslator>
11
+ <one-or-more-services-timed-out translate="message" module="experian_qas">
12
+ <message>One or more services timed out</message>
13
+ </one-or-more-services-timed-out>
14
+ <one-or-more-services-failed translate="message" module="experian_qas">
15
+ <message>One or more services failed</message>
16
+ </one-or-more-services-failed>
17
+ <success translate="message" module="experian_qas">
18
+ <message>Success</message>
19
+ </success>
20
+ <invalid-request translate="message" module="experian_qas">
21
+ <message>Invalid request</message>
22
+ </invalid-request>
23
+ <invalid-parameter translate="message" module="experian_qas">
24
+ <message>Invalid parameter</message>
25
+ </invalid-parameter>
26
+ <not-authorized-for-one-or-more-services translate="message" module="experian_qas">
27
+ <message>Not authorized for one or more services</message>
28
+ </not-authorized-for-one-or-more-services>
29
+ <service-unavailable translate="message" module="experian_qas">
30
+ <message>Service unavailable</message>
31
+ </service-unavailable>
32
+ <email-codes-code-description translate="message" module="experian_qas">
33
+ <message>Email codes Code Description</message>
34
+ </email-codes-code-description>
35
+ <timeout translate="message" module="experian_qas">
36
+ <message>Timeout</message>
37
+ </timeout>
38
+ <syntax-ok translate="message" module="experian_qas">
39
+ <message>Syntax OK</message>
40
+ </syntax-ok>
41
+ <syntax-ok-and-domain-valid-according-to-the-domain-database translate="message" module="experian_qas">
42
+ <message>Syntax OK and domain valid according to the domain database</message>
43
+ </syntax-ok-and-domain-valid-according-to-the-domain-database>
44
+ <syntax-ok-and-domain-exists translate="message" module="experian_qas">
45
+ <message>Syntax OK and domain exists</message>
46
+ </syntax-ok-and-domain-exists>
47
+ <syntax-ok-domain-exists-and-domain-can-receive-email translate="message" module="experian_qas">
48
+ <message>Syntax OK, domain exists, and domain can receive email</message>
49
+ </syntax-ok-domain-exists-and-domain-can-receive-email>
50
+ <syntax-ok-domain-exists-and-mailbox-does-not-reject-mail translate="message" module="experian_qas">
51
+ <message>Syntax OK, domain exists, and mailbox does not reject mail</message>
52
+ </syntax-ok-domain-exists-and-mailbox-does-not-reject-mail>
53
+ <general-syntax-error translate="message" module="experian_qas">
54
+ <message>General syntax error</message>
55
+ </general-syntax-error>
56
+ <invalid-character-in-address translate="message" module="experian_qas">
57
+ <message>Invalid character in address</message>
58
+ </invalid-character-in-address>
59
+ <invalid-domain-syntax translate="message" module="experian_qas">
60
+ <message>Invalid domain syntax</message>
61
+ </invalid-domain-syntax>
62
+ <invalid-username-syntax translate="message" module="experian_qas">
63
+ <message>Invalid username syntax</message>
64
+ </invalid-username-syntax>
65
+ <invalid-username-syntax-for-that-domain translate="message" module="experian_qas">
66
+ <message>Invalid username syntax for that domain</message>
67
+ </invalid-username-syntax-for-that-domain>
68
+ <address-is-too-long translate="message" module="experian_qas">
69
+ <message>Address is too long</message>
70
+ </address-is-too-long>
71
+ <address-has-unbalanced-parentheses-brackets-or-quotes translate="message" module="experian_qas">
72
+ <message>Address has unbalanced parentheses, brackets, or quotes</message>
73
+ </address-has-unbalanced-parentheses-brackets-or-quotes>
74
+ <address-does-not-have-a-username translate="message" module="experian_qas">
75
+ <message>Address does not have a username</message>
76
+ </address-does-not-have-a-username>
77
+ <address-does-not-have-a-domain translate="message" module="experian_qas">
78
+ <message>Address does not have a domain</message>
79
+ </address-does-not-have-a-domain>
80
+ <address-does-not-have-an-sign translate="message" module="experian_qas">
81
+ <message>Address does not have an @ sign</message>
82
+ </address-does-not-have-an-sign>
83
+ <address-has-more-than-one-sign translate="message" module="experian_qas">
84
+ <message>Address has more than one @ sign</message>
85
+ </address-has-more-than-one-sign>
86
+ <invalid-top-level-domain-tld-in-address translate="message" module="experian_qas">
87
+ <message>Invalid top-level-domain (TLD) in address</message>
88
+ </invalid-top-level-domain-tld-in-address>
89
+ <unquoted-spaces-are-not-allowed-in-email-addresses translate="message" module="experian_qas">
90
+ <message>Unquoted spaces are not allowed in email addresses</message>
91
+ </unquoted-spaces-are-not-allowed-in-email-addresses>
92
+ <domain-does-not-exist translate="message" module="experian_qas">
93
+ <message>Domain does not exist</message>
94
+ </domain-does-not-exist>
95
+ <domain-does-not-have-a-valid-ip-address translate="message" module="experian_qas">
96
+ <message>Domain does not have a valid IP address</message>
97
+ </domain-does-not-have-a-valid-ip-address>
98
+ <domain-cannot-receive-email translate="message" module="experian_qas">
99
+ <message>Domain cannot receive email</message>
100
+ </domain-cannot-receive-email>
101
+ <the-mailbox-is-invalid-or-the-username-does-not-exist-at-the-domain translate="message" module="experian_qas">
102
+ <message>The mailbox is invalid or the username does not exist at the domain</message>
103
+ </the-mailbox-is-invalid-or-the-username-does-not-exist-at-the-domain>
104
+ <mailbox-is-full-and-can-not-receive-email-at-this-time translate="message" module="experian_qas">
105
+ <message>Mailbox is full and can not receive email at this time</message>
106
+ </mailbox-is-full-and-can-not-receive-email-at-this-time>
107
+ <mail-is-not-accepted-for-this-domain translate="message" module="experian_qas">
108
+ <message>Mail is not accepted for this domain</message>
109
+ </mail-is-not-accepted-for-this-domain>
110
+ <addresses-with-that-username-are-not-allowed translate="message" module="experian_qas">
111
+ <message>Addresses with that username are not allowed</message>
112
+ </addresses-with-that-username-are-not-allowed>
113
+ <addresses-with-that-domain-are-not-allowed translate="message" module="experian_qas">
114
+ <message>Addresses with that domain are not allowed</message>
115
+ </addresses-with-that-domain-are-not-allowed>
116
+ <the-email-address-is-suppressed-and-not-allowed translate="message" module="experian_qas">
117
+ <message>The email address is suppressed and not allowed</message>
118
+ </the-email-address-is-suppressed-and-not-allowed>
119
+ <internal-error translate="message" module="experian_qas">
120
+ <message>Internal error</message>
121
+ </internal-error>
122
+ <unreachable translate="message" module="experian_qas">
123
+ <message>unreachable</message>
124
+ </unreachable>
125
+ <unknown translate="message" module="experian_qas">
126
+ <message>unknown</message>
127
+ </unknown>
128
+ <illegitimate translate="message" module="experian_qas">
129
+ <message>illegitimate</message>
130
+ </illegitimate>
131
+ <disposable translate="message" module="experian_qas">
132
+ <message>disposable</message>
133
+ </disposable>
134
+ <undeliverable translate="message" module="experian_qas">
135
+ <message>undeliverable</message>
136
+ </undeliverable>
137
+ </jstranslator>
app/code/community/Experian/Qas/etc/system.xml ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * @category Experian
5
+ * @package Experian_Qas
6
+ * @copyright Experian 2012
7
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
8
+ */
9
+ -->
10
+ <config>
11
+ <sections>
12
+ <qas_address_verifier translate="label">
13
+ <label>Experian</label>
14
+ <tab>customer</tab>
15
+ <sort_order>1000</sort_order>
16
+ <show_in_default>1</show_in_default>
17
+ <show_in_website>1</show_in_website>
18
+ <show_in_store>1</show_in_store>
19
+ <groups>
20
+ <general translate="label">
21
+ <label>General</label>
22
+ <frontend_type>text</frontend_type>
23
+ <sort_order>1</sort_order>
24
+ <show_in_default>1</show_in_default>
25
+ <show_in_website>1</show_in_website>
26
+ <show_in_store>1</show_in_store>
27
+ <fields>
28
+ <enable translate="label">
29
+ <label>Enable</label>
30
+ <frontend_type>select</frontend_type>
31
+ <source_model>adminhtml/system_config_source_yesno</source_model>
32
+ <sort_order>10</sort_order>
33
+ <show_in_default>1</show_in_default>
34
+ <show_in_website>0</show_in_website>
35
+ <show_in_store>0</show_in_store>
36
+ </enable>
37
+ <api_user translate="label comment">
38
+ <label>API User</label>
39
+ <frontend_type>text</frontend_type>
40
+ <sort_order>20</sort_order>
41
+ <show_in_default>1</show_in_default>
42
+ <show_in_website>0</show_in_website>
43
+ <show_in_store>0</show_in_store>
44
+ </api_user>
45
+ <api_password translate="label comment">
46
+ <label>API Password</label>
47
+ <frontend_type>password</frontend_type>
48
+ <sort_order>30</sort_order>
49
+ <show_in_default>1</show_in_default>
50
+ <show_in_website>0</show_in_website>
51
+ <show_in_store>0</show_in_store>
52
+ </api_password>
53
+ </fields>
54
+ </general>
55
+ <email_validate translate="label">
56
+ <label>Email Validate</label>
57
+ <frontend_type>text</frontend_type>
58
+ <sort_order>2</sort_order>
59
+ <show_in_default>1</show_in_default>
60
+ <show_in_website>1</show_in_website>
61
+ <show_in_store>1</show_in_store>
62
+ <fields>
63
+ <enable_email_validate translate="label">
64
+ <label>Enable Email Validate</label>
65
+ <frontend_type>select</frontend_type>
66
+ <source_model>adminhtml/system_config_source_yesno</source_model>
67
+ <sort_order>40</sort_order>
68
+ <show_in_default>1</show_in_default>
69
+ <show_in_website>1</show_in_website>
70
+ <show_in_store>1</show_in_store>
71
+ </enable_email_validate>
72
+ <license_email_validate translate="label">
73
+ <label>Email Validate License</label>
74
+ <frontend_type>text</frontend_type>
75
+ <sort_order>50</sort_order>
76
+ <show_in_default>1</show_in_default>
77
+ <show_in_website>0</show_in_website>
78
+ <show_in_store>0</show_in_store>
79
+ </license_email_validate>
80
+ <accept_unknowns_emails translate="label">
81
+ <label>Accept Unknowns Emails</label>
82
+ <frontend_type>select</frontend_type>
83
+ <source_model>adminhtml/system_config_source_yesno</source_model>
84
+ <sort_order>60</sort_order>
85
+ <show_in_default>1</show_in_default>
86
+ <show_in_website>1</show_in_website>
87
+ <show_in_store>1</show_in_store>
88
+ </accept_unknowns_emails>
89
+ </fields>
90
+ </email_validate>
91
+ <address_search_engine translate="label">
92
+ <label>Address Search Engine</label>
93
+ <frontend_type>text</frontend_type>
94
+ <frontend_model>experian_qas/adminhtml_system_config_form_intuitiveCountryFieldset</frontend_model>
95
+ <sort_order>3</sort_order>
96
+ <show_in_default>1</show_in_default>
97
+ <show_in_website>1</show_in_website>
98
+ <show_in_store>1</show_in_store>
99
+ <fields>
100
+ <enable_intuitive_search translate="label">
101
+ <label>Enable Intuitive Search</label>
102
+ <frontend_type>select</frontend_type>
103
+ <source_model>adminhtml/system_config_source_yesno</source_model>
104
+ <sort_order>50</sort_order>
105
+ <show_in_default>1</show_in_default>
106
+ <show_in_website>1</show_in_website>
107
+ <show_in_store>1</show_in_store>
108
+ <comment>Autocomplete Address Search Engine is only available for France</comment>
109
+ </enable_intuitive_search>
110
+ <enable_cache translate="label">
111
+ <label>Enable API call cache</label>
112
+ <frontend_type>select</frontend_type>
113
+ <source_model>adminhtml/system_config_source_yesno</source_model>
114
+ <sort_order>60</sort_order>
115
+ <show_in_default>1</show_in_default>
116
+ <show_in_website>1</show_in_website>
117
+ <show_in_store>1</show_in_store>
118
+ <comment>Enable Magento Cache for autocompletion (Intuitive) api call</comment>
119
+ </enable_cache>
120
+ </fields>
121
+ </address_search_engine>
122
+ </groups>
123
+ </qas_address_verifier>
124
+ </sections>
125
+ </config>
app/code/community/Experian/Qas/etc/wsv3.wsdl ADDED
@@ -0,0 +1,908 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.qas.com/OnDemand-2011-03" xmlns:s1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://www.qas.com/OnDemand-2011-03" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
3
+ <wsdl:types>
4
+ <s:schema elementFormDefault="qualified" targetNamespace="http://www.qas.com/OnDemand-2011-03">
5
+ <s:import namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" />
6
+ <s:element name="QACanSearch">
7
+ <s:complexType>
8
+ <s:sequence>
9
+ <s:element minOccurs="0" maxOccurs="1" name="Country" type="s:string" />
10
+ <s:element minOccurs="0" maxOccurs="1" name="Engine" type="tns:EngineType" />
11
+ <s:element minOccurs="0" maxOccurs="1" name="Layout" type="s:string" />
12
+ </s:sequence>
13
+ <s:attribute name="Localisation" type="s:string" />
14
+ </s:complexType>
15
+ </s:element>
16
+ <s:complexType name="EngineType">
17
+ <s:simpleContent>
18
+ <s:extension base="tns:EngineEnumType">
19
+ <s:attribute name="Flatten" type="s:boolean" />
20
+ <s:attribute name="Intensity" type="tns:EngineIntensityType" />
21
+ <s:attribute name="PromptSet" type="tns:PromptSetType" />
22
+ <s:attribute name="Threshold" type="s:positiveInteger" />
23
+ <s:attribute name="Timeout" type="s:nonNegativeInteger" />
24
+ </s:extension>
25
+ </s:simpleContent>
26
+ </s:complexType>
27
+ <s:simpleType name="EngineEnumType">
28
+ <s:restriction base="s:string">
29
+ <s:enumeration value="Singleline" />
30
+ <s:enumeration value="Typedown" />
31
+ <s:enumeration value="Verification" />
32
+ <s:enumeration value="Keyfinder" />
33
+ </s:restriction>
34
+ </s:simpleType>
35
+ <s:simpleType name="EngineIntensityType">
36
+ <s:restriction base="s:string">
37
+ <s:enumeration value="Exact" />
38
+ <s:enumeration value="Close" />
39
+ <s:enumeration value="Extensive" />
40
+ </s:restriction>
41
+ </s:simpleType>
42
+ <s:simpleType name="PromptSetType">
43
+ <s:restriction base="s:string">
44
+ <s:enumeration value="OneLine" />
45
+ <s:enumeration value="Default" />
46
+ <s:enumeration value="Generic" />
47
+ <s:enumeration value="Optimal" />
48
+ <s:enumeration value="Alternate" />
49
+ <s:enumeration value="Alternate2" />
50
+ <s:enumeration value="Alternate3" />
51
+ </s:restriction>
52
+ </s:simpleType>
53
+ <s:element name="QASearchOk">
54
+ <s:complexType>
55
+ <s:sequence>
56
+ <s:element minOccurs="1" maxOccurs="1" name="IsOk" type="s:boolean" />
57
+ <s:element minOccurs="0" maxOccurs="1" name="ErrorCode" type="s:string" />
58
+ <s:element minOccurs="0" maxOccurs="1" name="ErrorMessage" type="s:string" />
59
+ <s:element minOccurs="0" maxOccurs="unbounded" name="ErrorDetail" type="s:string" />
60
+ </s:sequence>
61
+ </s:complexType>
62
+ </s:element>
63
+ <s:element name="QAQueryHeader" type="tns:QAQueryHeader" />
64
+ <s:complexType name="QAQueryHeader">
65
+ <s:sequence>
66
+ <s:element minOccurs="0" maxOccurs="1" name="QAAuthentication" type="tns:QAAuthentication" />
67
+ <s:element minOccurs="0" maxOccurs="1" name="Security" type="s1:SecurityHeaderType" />
68
+ </s:sequence>
69
+ <s:anyAttribute />
70
+ </s:complexType>
71
+ <s:complexType name="QAAuthentication">
72
+ <s:sequence>
73
+ <s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string" />
74
+ <s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string" />
75
+ </s:sequence>
76
+ </s:complexType>
77
+ <s:element name="QAInformation" type="tns:QAInformation" />
78
+ <s:complexType name="QAInformation">
79
+ <s:sequence>
80
+ <s:element minOccurs="0" maxOccurs="1" name="StateTransition" type="s:string" />
81
+ <s:element minOccurs="1" maxOccurs="1" name="CreditsUsed" type="s:long" />
82
+ </s:sequence>
83
+ <s:anyAttribute />
84
+ </s:complexType>
85
+ <s:element name="QAGetAddress">
86
+ <s:complexType>
87
+ <s:sequence>
88
+ <s:element minOccurs="0" maxOccurs="1" name="Layout" type="s:string" />
89
+ <s:element minOccurs="0" maxOccurs="1" name="Moniker" type="s:string" />
90
+ </s:sequence>
91
+ <s:attribute name="Localisation" type="s:string" />
92
+ </s:complexType>
93
+ </s:element>
94
+ <s:element name="Address">
95
+ <s:complexType>
96
+ <s:sequence>
97
+ <s:element minOccurs="0" maxOccurs="1" name="QAAddress" type="tns:QAAddressType" />
98
+ </s:sequence>
99
+ </s:complexType>
100
+ </s:element>
101
+ <s:complexType name="QAAddressType">
102
+ <s:sequence>
103
+ <s:element minOccurs="0" maxOccurs="unbounded" name="AddressLine" type="tns:AddressLineType" />
104
+ </s:sequence>
105
+ <s:attribute default="false" name="Overflow" type="s:boolean" />
106
+ <s:attribute default="false" name="Truncated" type="s:boolean" />
107
+ <s:attribute name="DPVStatus" type="tns:DPVStatusType" />
108
+ </s:complexType>
109
+ <s:complexType name="AddressLineType">
110
+ <s:sequence>
111
+ <s:element minOccurs="0" maxOccurs="1" name="Label" type="s:string" />
112
+ <s:element minOccurs="0" maxOccurs="1" name="Line" type="s:string" />
113
+ <s:element minOccurs="0" maxOccurs="unbounded" name="DataplusGroup" type="tns:DataplusGroupType" />
114
+ </s:sequence>
115
+ <s:attribute default="Address" name="LineContent" type="tns:LineContentType" />
116
+ <s:attribute default="false" name="Overflow" type="s:boolean" />
117
+ <s:attribute default="false" name="Truncated" type="s:boolean" />
118
+ </s:complexType>
119
+ <s:complexType name="DataplusGroupType">
120
+ <s:sequence>
121
+ <s:element minOccurs="0" maxOccurs="unbounded" name="DataplusGroupItem" type="s:string" />
122
+ </s:sequence>
123
+ <s:attribute name="GroupName" type="s:string" />
124
+ </s:complexType>
125
+ <s:simpleType name="LineContentType">
126
+ <s:restriction base="s:string">
127
+ <s:enumeration value="None" />
128
+ <s:enumeration value="Address" />
129
+ <s:enumeration value="Name" />
130
+ <s:enumeration value="Ancillary" />
131
+ <s:enumeration value="DataPlus" />
132
+ </s:restriction>
133
+ </s:simpleType>
134
+ <s:simpleType name="DPVStatusType">
135
+ <s:restriction base="s:string">
136
+ <s:enumeration value="DPVNotConfigured" />
137
+ <s:enumeration value="DPVConfigured" />
138
+ <s:enumeration value="DPVConfirmed" />
139
+ <s:enumeration value="DPVConfirmedMissingSec" />
140
+ <s:enumeration value="DPVNotConfirmed" />
141
+ <s:enumeration value="DPVLocked" />
142
+ <s:enumeration value="DPVSeedHit" />
143
+ </s:restriction>
144
+ </s:simpleType>
145
+ <s:element name="QAGetData">
146
+ <s:complexType>
147
+ <s:attribute name="Localisation" type="s:string" />
148
+ </s:complexType>
149
+ </s:element>
150
+ <s:element name="QAData" type="tns:ArrayOfQADataSet" />
151
+ <s:complexType name="ArrayOfQADataSet">
152
+ <s:sequence>
153
+ <s:element minOccurs="0" maxOccurs="unbounded" name="DataSet" type="tns:QADataSet" />
154
+ </s:sequence>
155
+ </s:complexType>
156
+ <s:complexType name="QADataSet">
157
+ <s:sequence>
158
+ <s:element minOccurs="0" maxOccurs="1" name="ID" type="s:string" />
159
+ <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
160
+ </s:sequence>
161
+ </s:complexType>
162
+ <s:element name="QAGetExampleAddresses">
163
+ <s:complexType>
164
+ <s:sequence>
165
+ <s:element minOccurs="0" maxOccurs="1" name="Country" type="s:string" />
166
+ <s:element minOccurs="0" maxOccurs="1" name="Layout" type="s:string" />
167
+ </s:sequence>
168
+ <s:attribute name="Localisation" type="s:string" />
169
+ </s:complexType>
170
+ </s:element>
171
+ <s:element name="QAExampleAddresses" type="tns:ArrayOfQAExampleAddress" />
172
+ <s:complexType name="ArrayOfQAExampleAddress">
173
+ <s:sequence>
174
+ <s:element minOccurs="0" maxOccurs="unbounded" name="ExampleAddress" type="tns:QAExampleAddress" />
175
+ </s:sequence>
176
+ </s:complexType>
177
+ <s:complexType name="QAExampleAddress">
178
+ <s:sequence>
179
+ <s:element minOccurs="0" maxOccurs="1" name="Address" type="tns:QAAddressType" />
180
+ <s:element minOccurs="0" maxOccurs="1" name="Comment" type="s:string" />
181
+ </s:sequence>
182
+ </s:complexType>
183
+ <s:element name="QAGetLayouts">
184
+ <s:complexType>
185
+ <s:sequence>
186
+ <s:element minOccurs="0" maxOccurs="1" name="Country" type="s:string" />
187
+ </s:sequence>
188
+ <s:attribute name="Localisation" type="s:string" />
189
+ </s:complexType>
190
+ </s:element>
191
+ <s:element name="QALayouts" type="tns:ArrayOfQALayout" />
192
+ <s:complexType name="ArrayOfQALayout">
193
+ <s:sequence>
194
+ <s:element minOccurs="0" maxOccurs="unbounded" name="Layout" type="tns:QALayout" />
195
+ </s:sequence>
196
+ </s:complexType>
197
+ <s:complexType name="QALayout">
198
+ <s:sequence>
199
+ <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
200
+ <s:element minOccurs="0" maxOccurs="1" name="Comment" type="s:string" />
201
+ </s:sequence>
202
+ </s:complexType>
203
+ <s:element name="QAGetLicenseInfo">
204
+ <s:complexType>
205
+ <s:attribute name="Localisation" type="s:string" />
206
+ </s:complexType>
207
+ </s:element>
208
+ <s:element name="QALicenceInfo">
209
+ <s:complexType>
210
+ <s:sequence>
211
+ <s:element minOccurs="1" maxOccurs="1" name="WarningLevel" type="tns:LicenceWarningLevel" />
212
+ <s:element minOccurs="0" maxOccurs="unbounded" name="LicensedSet" type="tns:QALicensedSet" />
213
+ </s:sequence>
214
+ </s:complexType>
215
+ </s:element>
216
+ <s:simpleType name="LicenceWarningLevel">
217
+ <s:restriction base="s:string">
218
+ <s:enumeration value="None" />
219
+ <s:enumeration value="DataExpiring" />
220
+ <s:enumeration value="LicenceExpiring" />
221
+ <s:enumeration value="ClicksLow" />
222
+ <s:enumeration value="Evaluation" />
223
+ <s:enumeration value="NoClicks" />
224
+ <s:enumeration value="DataExpired" />
225
+ <s:enumeration value="EvalLicenceExpired" />
226
+ <s:enumeration value="FullLicenceExpired" />
227
+ <s:enumeration value="LicenceNotFound" />
228
+ <s:enumeration value="DataUnreadable" />
229
+ </s:restriction>
230
+ </s:simpleType>
231
+ <s:complexType name="QALicensedSet">
232
+ <s:sequence>
233
+ <s:element minOccurs="0" maxOccurs="1" name="ID" type="s:string" />
234
+ <s:element minOccurs="0" maxOccurs="1" name="Description" type="s:string" />
235
+ <s:element minOccurs="0" maxOccurs="1" name="Copyright" type="s:string" />
236
+ <s:element minOccurs="0" maxOccurs="1" name="Version" type="s:string" />
237
+ <s:element minOccurs="0" maxOccurs="1" name="BaseCountry" type="s:string" />
238
+ <s:element minOccurs="0" maxOccurs="1" name="Status" type="s:string" />
239
+ <s:element minOccurs="0" maxOccurs="1" name="Server" type="s:string" />
240
+ <s:element minOccurs="1" maxOccurs="1" name="WarningLevel" type="tns:LicenceWarningLevel" />
241
+ <s:element minOccurs="0" maxOccurs="1" name="DaysLeft" type="s:nonNegativeInteger" />
242
+ <s:element minOccurs="0" maxOccurs="1" name="DataDaysLeft" type="s:nonNegativeInteger" />
243
+ <s:element minOccurs="0" maxOccurs="1" name="LicenceDaysLeft" type="s:nonNegativeInteger" />
244
+ </s:sequence>
245
+ </s:complexType>
246
+ <s:element name="QAGetPromptSet">
247
+ <s:complexType>
248
+ <s:sequence>
249
+ <s:element minOccurs="0" maxOccurs="1" name="Country" type="s:string" />
250
+ <s:element minOccurs="0" maxOccurs="1" name="Engine" type="tns:EngineType" />
251
+ <s:element minOccurs="1" maxOccurs="1" name="PromptSet" type="tns:PromptSetType" />
252
+ </s:sequence>
253
+ <s:attribute name="Localisation" type="s:string" />
254
+ </s:complexType>
255
+ </s:element>
256
+ <s:element name="QAPromptSet">
257
+ <s:complexType>
258
+ <s:sequence>
259
+ <s:element minOccurs="0" maxOccurs="unbounded" name="Line" type="tns:PromptLine" />
260
+ </s:sequence>
261
+ <s:attribute default="false" name="Dynamic" type="s:boolean" />
262
+ </s:complexType>
263
+ </s:element>
264
+ <s:complexType name="PromptLine">
265
+ <s:sequence>
266
+ <s:element minOccurs="0" maxOccurs="1" name="Prompt" type="s:string" />
267
+ <s:element minOccurs="0" maxOccurs="1" name="SuggestedInputLength" type="s:nonNegativeInteger" />
268
+ <s:element minOccurs="0" maxOccurs="1" name="Example" type="s:string" />
269
+ </s:sequence>
270
+ </s:complexType>
271
+ <s:element name="QAGetSystemInfo">
272
+ <s:complexType>
273
+ <s:attribute name="Localisation" type="s:string" />
274
+ </s:complexType>
275
+ </s:element>
276
+ <s:element name="QASystemInfo" type="tns:ArrayOfString" />
277
+ <s:complexType name="ArrayOfString">
278
+ <s:sequence>
279
+ <s:element minOccurs="0" maxOccurs="unbounded" name="SystemInfo" type="s:string" />
280
+ </s:sequence>
281
+ </s:complexType>
282
+ <s:element name="QARefine">
283
+ <s:complexType>
284
+ <s:sequence>
285
+ <s:element minOccurs="0" maxOccurs="1" name="Moniker" type="s:string" />
286
+ <s:element minOccurs="0" maxOccurs="1" name="Refinement" type="s:string" />
287
+ <s:element minOccurs="0" maxOccurs="1" name="Layout" type="s:string" />
288
+ </s:sequence>
289
+ <s:attribute name="Threshold" type="s:positiveInteger" />
290
+ <s:attribute name="Timeout" type="s:nonNegativeInteger" />
291
+ <s:attribute name="Localisation" type="s:string" />
292
+ </s:complexType>
293
+ </s:element>
294
+ <s:element name="Picklist">
295
+ <s:complexType>
296
+ <s:sequence>
297
+ <s:element minOccurs="0" maxOccurs="1" name="QAPicklist" type="tns:QAPicklistType" />
298
+ </s:sequence>
299
+ </s:complexType>
300
+ </s:element>
301
+ <s:complexType name="QAPicklistType">
302
+ <s:sequence>
303
+ <s:element minOccurs="0" maxOccurs="1" name="FullPicklistMoniker" type="s:string" />
304
+ <s:element minOccurs="0" maxOccurs="unbounded" name="PicklistEntry" type="tns:PicklistEntryType" />
305
+ <s:element minOccurs="0" maxOccurs="1" name="Prompt" type="s:string" />
306
+ <s:element minOccurs="0" maxOccurs="1" name="Total" type="s:nonNegativeInteger" />
307
+ </s:sequence>
308
+ <s:attribute default="false" name="AutoFormatSafe" type="s:boolean" />
309
+ <s:attribute default="false" name="AutoFormatPastClose" type="s:boolean" />
310
+ <s:attribute default="false" name="AutoStepinSafe" type="s:boolean" />
311
+ <s:attribute default="false" name="AutoStepinPastClose" type="s:boolean" />
312
+ <s:attribute default="false" name="LargePotential" type="s:boolean" />
313
+ <s:attribute default="false" name="MaxMatches" type="s:boolean" />
314
+ <s:attribute default="false" name="MoreOtherMatches" type="s:boolean" />
315
+ <s:attribute default="false" name="OverThreshold" type="s:boolean" />
316
+ <s:attribute default="false" name="Timeout" type="s:boolean" />
317
+ </s:complexType>
318
+ <s:complexType name="PicklistEntryType">
319
+ <s:sequence>
320
+ <s:element minOccurs="0" maxOccurs="1" name="Moniker" type="s:string" />
321
+ <s:element minOccurs="0" maxOccurs="1" name="PartialAddress" type="s:string" />
322
+ <s:element minOccurs="0" maxOccurs="1" name="Picklist" type="s:string" />
323
+ <s:element minOccurs="0" maxOccurs="1" name="Postcode" type="s:string" />
324
+ <s:element minOccurs="0" maxOccurs="1" name="Score" type="s:nonNegativeInteger" />
325
+ </s:sequence>
326
+ <s:attribute default="false" name="FullAddress" type="s:boolean" />
327
+ <s:attribute default="false" name="Multiples" type="s:boolean" />
328
+ <s:attribute default="false" name="CanStep" type="s:boolean" />
329
+ <s:attribute default="false" name="AliasMatch" type="s:boolean" />
330
+ <s:attribute default="false" name="PostcodeRecoded" type="s:boolean" />
331
+ <s:attribute default="false" name="CrossBorderMatch" type="s:boolean" />
332
+ <s:attribute default="false" name="DummyPOBox" type="s:boolean" />
333
+ <s:attribute default="false" name="Name" type="s:boolean" />
334
+ <s:attribute default="false" name="Information" type="s:boolean" />
335
+ <s:attribute default="false" name="WarnInformation" type="s:boolean" />
336
+ <s:attribute default="false" name="IncompleteAddr" type="s:boolean" />
337
+ <s:attribute default="false" name="UnresolvableRange" type="s:boolean" />
338
+ <s:attribute default="false" name="PhantomPrimaryPoint" type="s:boolean" />
339
+ <s:attribute default="false" name="SubsidiaryData" type="s:boolean" />
340
+ <s:attribute default="false" name="ExtendedData" type="s:boolean" />
341
+ <s:attribute default="false" name="EnhancedData" type="s:boolean" />
342
+ </s:complexType>
343
+ <s:element name="QASearch">
344
+ <s:complexType>
345
+ <s:sequence>
346
+ <s:element minOccurs="0" maxOccurs="1" name="Country" type="s:string" />
347
+ <s:element minOccurs="0" maxOccurs="1" name="Engine" type="tns:EngineType" />
348
+ <s:element minOccurs="0" maxOccurs="1" name="Layout" type="s:string" />
349
+ <s:element minOccurs="0" maxOccurs="1" name="Search" type="s:string" />
350
+ </s:sequence>
351
+ <s:attribute name="Localisation" type="s:string" />
352
+ </s:complexType>
353
+ </s:element>
354
+ <s:element name="QASearchResult">
355
+ <s:complexType>
356
+ <s:sequence>
357
+ <s:element minOccurs="0" maxOccurs="1" name="QAPicklist" type="tns:QAPicklistType" />
358
+ <s:element minOccurs="0" maxOccurs="1" name="QAAddress" type="tns:QAAddressType" />
359
+ </s:sequence>
360
+ <s:attribute default="None" name="VerifyLevel" type="tns:VerifyLevelType" />
361
+ </s:complexType>
362
+ </s:element>
363
+ <s:simpleType name="VerifyLevelType">
364
+ <s:restriction base="s:string">
365
+ <s:enumeration value="None" />
366
+ <s:enumeration value="Verified" />
367
+ <s:enumeration value="InteractionRequired" />
368
+ <s:enumeration value="PremisesPartial" />
369
+ <s:enumeration value="StreetPartial" />
370
+ <s:enumeration value="Multiple" />
371
+ <s:enumeration value="VerifiedPlace" />
372
+ <s:enumeration value="VerifiedStreet" />
373
+ </s:restriction>
374
+ </s:simpleType>
375
+ <s:element name="QABulkSearch">
376
+ <s:complexType>
377
+ <s:sequence>
378
+ <s:element minOccurs="0" maxOccurs="1" name="Country" type="s:string" />
379
+ <s:element minOccurs="0" maxOccurs="1" name="Engine" type="tns:EngineType" />
380
+ <s:element minOccurs="0" maxOccurs="1" name="Layout" type="s:string" />
381
+ <s:element minOccurs="0" maxOccurs="1" name="BulkSearchTerm" type="tns:QASearchType" />
382
+ </s:sequence>
383
+ <s:attribute name="Localisation" type="s:string" />
384
+ </s:complexType>
385
+ </s:element>
386
+ <s:complexType name="QASearchType">
387
+ <s:sequence>
388
+ <s:element minOccurs="0" maxOccurs="unbounded" name="Search" type="s:string" />
389
+ </s:sequence>
390
+ <s:attribute default="None" name="Count" type="s:string" />
391
+ </s:complexType>
392
+ <s:element name="QABulkSearchResult">
393
+ <s:complexType>
394
+ <s:sequence>
395
+ <s:element minOccurs="0" maxOccurs="unbounded" name="BulkAddress" type="tns:QABulkSearchItemType" />
396
+ <s:element minOccurs="0" maxOccurs="1" name="BulkError" type="s:string" />
397
+ <s:element minOccurs="0" maxOccurs="1" name="ErrorCode" type="s:string" />
398
+ </s:sequence>
399
+ <s:attribute default="None" name="Count" type="s:string" />
400
+ <s:attribute default="None" name="SearchCount" type="s:string" />
401
+ </s:complexType>
402
+ </s:element>
403
+ <s:complexType name="QABulkSearchItemType">
404
+ <s:sequence>
405
+ <s:element minOccurs="0" maxOccurs="1" name="QAAddress" type="tns:QAAddressType" />
406
+ <s:element minOccurs="0" maxOccurs="1" name="InputAddress" type="s:string" />
407
+ </s:sequence>
408
+ <s:attribute name="VerifyLevel" type="tns:VerifyLevelType" />
409
+ </s:complexType>
410
+ <s:element name="QAGetDataMapDetail">
411
+ <s:complexType>
412
+ <s:sequence>
413
+ <s:element minOccurs="0" maxOccurs="1" name="DataMap" type="s:string" />
414
+ </s:sequence>
415
+ <s:attribute name="Localisation" type="s:string" />
416
+ </s:complexType>
417
+ </s:element>
418
+ <s:element name="QADataMapDetail">
419
+ <s:complexType>
420
+ <s:sequence>
421
+ <s:element minOccurs="1" maxOccurs="1" name="WarningLevel" type="tns:LicenceWarningLevel" />
422
+ <s:element minOccurs="0" maxOccurs="unbounded" name="LicensedSet" type="tns:QALicensedSet" />
423
+ </s:sequence>
424
+ </s:complexType>
425
+ </s:element>
426
+ </s:schema>
427
+ <s:schema elementFormDefault="qualified" targetNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
428
+ <s:complexType name="SecurityHeaderType">
429
+ <s:sequence>
430
+ <s:any minOccurs="0" maxOccurs="unbounded" />
431
+ </s:sequence>
432
+ <s:anyAttribute />
433
+ </s:complexType>
434
+ </s:schema>
435
+ </wsdl:types>
436
+ <wsdl:message name="DoCanSearchSoapIn">
437
+ <wsdl:part name="QACanSearch" element="tns:QACanSearch" />
438
+ </wsdl:message>
439
+ <wsdl:message name="DoCanSearchSoapOut">
440
+ <wsdl:part name="DoCanSearchResult" element="tns:QASearchOk" />
441
+ </wsdl:message>
442
+ <wsdl:message name="DoCanSearchQAInformation">
443
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
444
+ </wsdl:message>
445
+ <wsdl:message name="DoCanSearchQAQueryHeader">
446
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
447
+ </wsdl:message>
448
+ <wsdl:message name="DoGetAddressSoapIn">
449
+ <wsdl:part name="QAGetAddress" element="tns:QAGetAddress" />
450
+ </wsdl:message>
451
+ <wsdl:message name="DoGetAddressSoapOut">
452
+ <wsdl:part name="DoGetAddressResult" element="tns:Address" />
453
+ </wsdl:message>
454
+ <wsdl:message name="DoGetAddressQAInformation">
455
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
456
+ </wsdl:message>
457
+ <wsdl:message name="DoGetAddressQAQueryHeader">
458
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
459
+ </wsdl:message>
460
+ <wsdl:message name="DoGetDataSoapIn">
461
+ <wsdl:part name="QAGetData" element="tns:QAGetData" />
462
+ </wsdl:message>
463
+ <wsdl:message name="DoGetDataSoapOut">
464
+ <wsdl:part name="DoGetDataResult" element="tns:QAData" />
465
+ </wsdl:message>
466
+ <wsdl:message name="DoGetDataQAInformation">
467
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
468
+ </wsdl:message>
469
+ <wsdl:message name="DoGetDataQAQueryHeader">
470
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
471
+ </wsdl:message>
472
+ <wsdl:message name="DoGetExampleAddressesSoapIn">
473
+ <wsdl:part name="QAGetExampleAddresses" element="tns:QAGetExampleAddresses" />
474
+ </wsdl:message>
475
+ <wsdl:message name="DoGetExampleAddressesSoapOut">
476
+ <wsdl:part name="DoGetExampleAddressesResult" element="tns:QAExampleAddresses" />
477
+ </wsdl:message>
478
+ <wsdl:message name="DoGetExampleAddressesQAInformation">
479
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
480
+ </wsdl:message>
481
+ <wsdl:message name="DoGetExampleAddressesQAQueryHeader">
482
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
483
+ </wsdl:message>
484
+ <wsdl:message name="DoGetLayoutsSoapIn">
485
+ <wsdl:part name="QAGetLayouts" element="tns:QAGetLayouts" />
486
+ </wsdl:message>
487
+ <wsdl:message name="DoGetLayoutsSoapOut">
488
+ <wsdl:part name="DoGetLayoutsResult" element="tns:QALayouts" />
489
+ </wsdl:message>
490
+ <wsdl:message name="DoGetLayoutsQAInformation">
491
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
492
+ </wsdl:message>
493
+ <wsdl:message name="DoGetLayoutsQAQueryHeader">
494
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
495
+ </wsdl:message>
496
+ <wsdl:message name="DoGetLicenseInfoSoapIn">
497
+ <wsdl:part name="QAGetLicenseInfo" element="tns:QAGetLicenseInfo" />
498
+ </wsdl:message>
499
+ <wsdl:message name="DoGetLicenseInfoSoapOut">
500
+ <wsdl:part name="DoGetLicenseInfoResult" element="tns:QALicenceInfo" />
501
+ </wsdl:message>
502
+ <wsdl:message name="DoGetLicenseInfoQAInformation">
503
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
504
+ </wsdl:message>
505
+ <wsdl:message name="DoGetLicenseInfoQAQueryHeader">
506
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
507
+ </wsdl:message>
508
+ <wsdl:message name="DoGetPromptSetSoapIn">
509
+ <wsdl:part name="QAGetPromptSet" element="tns:QAGetPromptSet" />
510
+ </wsdl:message>
511
+ <wsdl:message name="DoGetPromptSetSoapOut">
512
+ <wsdl:part name="DoGetPromptSetResult" element="tns:QAPromptSet" />
513
+ </wsdl:message>
514
+ <wsdl:message name="DoGetPromptSetQAInformation">
515
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
516
+ </wsdl:message>
517
+ <wsdl:message name="DoGetPromptSetQAQueryHeader">
518
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
519
+ </wsdl:message>
520
+ <wsdl:message name="DoGetSystemInfoSoapIn">
521
+ <wsdl:part name="QAGetSystemInfo" element="tns:QAGetSystemInfo" />
522
+ </wsdl:message>
523
+ <wsdl:message name="DoGetSystemInfoSoapOut">
524
+ <wsdl:part name="DoGetSystemInfoResult" element="tns:QASystemInfo" />
525
+ </wsdl:message>
526
+ <wsdl:message name="DoGetSystemInfoQAInformation">
527
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
528
+ </wsdl:message>
529
+ <wsdl:message name="DoGetSystemInfoQAQueryHeader">
530
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
531
+ </wsdl:message>
532
+ <wsdl:message name="DoRefineSoapIn">
533
+ <wsdl:part name="QARefine" element="tns:QARefine" />
534
+ </wsdl:message>
535
+ <wsdl:message name="DoRefineSoapOut">
536
+ <wsdl:part name="DoRefineResult" element="tns:Picklist" />
537
+ </wsdl:message>
538
+ <wsdl:message name="DoRefineQAInformation">
539
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
540
+ </wsdl:message>
541
+ <wsdl:message name="DoRefineQAQueryHeader">
542
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
543
+ </wsdl:message>
544
+ <wsdl:message name="DoSearchSoapIn">
545
+ <wsdl:part name="QASearch" element="tns:QASearch" />
546
+ </wsdl:message>
547
+ <wsdl:message name="DoSearchSoapOut">
548
+ <wsdl:part name="DoSearchResult" element="tns:QASearchResult" />
549
+ </wsdl:message>
550
+ <wsdl:message name="DoSearchQAInformation">
551
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
552
+ </wsdl:message>
553
+ <wsdl:message name="DoSearchQAQueryHeader">
554
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
555
+ </wsdl:message>
556
+ <wsdl:message name="DoBulkSearchSoapIn">
557
+ <wsdl:part name="QABulkSearch" element="tns:QABulkSearch" />
558
+ </wsdl:message>
559
+ <wsdl:message name="DoBulkSearchSoapOut">
560
+ <wsdl:part name="DoBulkSearchResult" element="tns:QABulkSearchResult" />
561
+ </wsdl:message>
562
+ <wsdl:message name="DoBulkSearchQAInformation">
563
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
564
+ </wsdl:message>
565
+ <wsdl:message name="DoBulkSearchQAQueryHeader">
566
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
567
+ </wsdl:message>
568
+ <wsdl:message name="DoGetDataMapDetailSoapIn">
569
+ <wsdl:part name="QAGetDataMapDetail" element="tns:QAGetDataMapDetail" />
570
+ </wsdl:message>
571
+ <wsdl:message name="DoGetDataMapDetailSoapOut">
572
+ <wsdl:part name="DoGetDataMapDetailResult" element="tns:QADataMapDetail" />
573
+ </wsdl:message>
574
+ <wsdl:message name="DoGetDataMapDetailQAInformation">
575
+ <wsdl:part name="QAInformation" element="tns:QAInformation" />
576
+ </wsdl:message>
577
+ <wsdl:message name="DoGetDataMapDetailQAQueryHeader">
578
+ <wsdl:part name="QAQueryHeader" element="tns:QAQueryHeader" />
579
+ </wsdl:message>
580
+ <wsdl:portType name="QASOnDemand">
581
+ <wsdl:operation name="DoCanSearch">
582
+ <wsdl:input message="tns:DoCanSearchSoapIn" />
583
+ <wsdl:output message="tns:DoCanSearchSoapOut" />
584
+ </wsdl:operation>
585
+ <wsdl:operation name="DoGetAddress">
586
+ <wsdl:input message="tns:DoGetAddressSoapIn" />
587
+ <wsdl:output message="tns:DoGetAddressSoapOut" />
588
+ </wsdl:operation>
589
+ <wsdl:operation name="DoGetData">
590
+ <wsdl:input message="tns:DoGetDataSoapIn" />
591
+ <wsdl:output message="tns:DoGetDataSoapOut" />
592
+ </wsdl:operation>
593
+ <wsdl:operation name="DoGetExampleAddresses">
594
+ <wsdl:input message="tns:DoGetExampleAddressesSoapIn" />
595
+ <wsdl:output message="tns:DoGetExampleAddressesSoapOut" />
596
+ </wsdl:operation>
597
+ <wsdl:operation name="DoGetLayouts">
598
+ <wsdl:input message="tns:DoGetLayoutsSoapIn" />
599
+ <wsdl:output message="tns:DoGetLayoutsSoapOut" />
600
+ </wsdl:operation>
601
+ <wsdl:operation name="DoGetLicenseInfo">
602
+ <wsdl:input message="tns:DoGetLicenseInfoSoapIn" />
603
+ <wsdl:output message="tns:DoGetLicenseInfoSoapOut" />
604
+ </wsdl:operation>
605
+ <wsdl:operation name="DoGetPromptSet">
606
+ <wsdl:input message="tns:DoGetPromptSetSoapIn" />
607
+ <wsdl:output message="tns:DoGetPromptSetSoapOut" />
608
+ </wsdl:operation>
609
+ <wsdl:operation name="DoGetSystemInfo">
610
+ <wsdl:input message="tns:DoGetSystemInfoSoapIn" />
611
+ <wsdl:output message="tns:DoGetSystemInfoSoapOut" />
612
+ </wsdl:operation>
613
+ <wsdl:operation name="DoRefine">
614
+ <wsdl:input message="tns:DoRefineSoapIn" />
615
+ <wsdl:output message="tns:DoRefineSoapOut" />
616
+ </wsdl:operation>
617
+ <wsdl:operation name="DoSearch">
618
+ <wsdl:input message="tns:DoSearchSoapIn" />
619
+ <wsdl:output message="tns:DoSearchSoapOut" />
620
+ </wsdl:operation>
621
+ <wsdl:operation name="DoBulkSearch">
622
+ <wsdl:input message="tns:DoBulkSearchSoapIn" />
623
+ <wsdl:output message="tns:DoBulkSearchSoapOut" />
624
+ </wsdl:operation>
625
+ <wsdl:operation name="DoGetDataMapDetail">
626
+ <wsdl:input message="tns:DoGetDataMapDetailSoapIn" />
627
+ <wsdl:output message="tns:DoGetDataMapDetailSoapOut" />
628
+ </wsdl:operation>
629
+ </wsdl:portType>
630
+ <wsdl:binding name="QASOnDemand" type="tns:QASOnDemand">
631
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
632
+ <wsdl:operation name="DoCanSearch">
633
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoCanSearch" style="document" />
634
+ <wsdl:input>
635
+ <soap:body use="literal" />
636
+ <soap:header message="tns:DoCanSearchQAQueryHeader" part="QAQueryHeader" use="literal" />
637
+ </wsdl:input>
638
+ <wsdl:output>
639
+ <soap:body use="literal" />
640
+ <soap:header message="tns:DoCanSearchQAInformation" part="QAInformation" use="literal" />
641
+ </wsdl:output>
642
+ </wsdl:operation>
643
+ <wsdl:operation name="DoGetAddress">
644
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetAddress" style="document" />
645
+ <wsdl:input>
646
+ <soap:body use="literal" />
647
+ <soap:header message="tns:DoGetAddressQAQueryHeader" part="QAQueryHeader" use="literal" />
648
+ </wsdl:input>
649
+ <wsdl:output>
650
+ <soap:body use="literal" />
651
+ <soap:header message="tns:DoGetAddressQAInformation" part="QAInformation" use="literal" />
652
+ </wsdl:output>
653
+ </wsdl:operation>
654
+ <wsdl:operation name="DoGetData">
655
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetData" style="document" />
656
+ <wsdl:input>
657
+ <soap:body use="literal" />
658
+ <soap:header message="tns:DoGetDataQAQueryHeader" part="QAQueryHeader" use="literal" />
659
+ </wsdl:input>
660
+ <wsdl:output>
661
+ <soap:body use="literal" />
662
+ <soap:header message="tns:DoGetDataQAInformation" part="QAInformation" use="literal" />
663
+ </wsdl:output>
664
+ </wsdl:operation>
665
+ <wsdl:operation name="DoGetExampleAddresses">
666
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetExampleAddresses" style="document" />
667
+ <wsdl:input>
668
+ <soap:body use="literal" />
669
+ <soap:header message="tns:DoGetExampleAddressesQAQueryHeader" part="QAQueryHeader" use="literal" />
670
+ </wsdl:input>
671
+ <wsdl:output>
672
+ <soap:body use="literal" />
673
+ <soap:header message="tns:DoGetExampleAddressesQAInformation" part="QAInformation" use="literal" />
674
+ </wsdl:output>
675
+ </wsdl:operation>
676
+ <wsdl:operation name="DoGetLayouts">
677
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetLayouts" style="document" />
678
+ <wsdl:input>
679
+ <soap:body use="literal" />
680
+ <soap:header message="tns:DoGetLayoutsQAQueryHeader" part="QAQueryHeader" use="literal" />
681
+ </wsdl:input>
682
+ <wsdl:output>
683
+ <soap:body use="literal" />
684
+ <soap:header message="tns:DoGetLayoutsQAInformation" part="QAInformation" use="literal" />
685
+ </wsdl:output>
686
+ </wsdl:operation>
687
+ <wsdl:operation name="DoGetLicenseInfo">
688
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetLicenseInfo" style="document" />
689
+ <wsdl:input>
690
+ <soap:body use="literal" />
691
+ <soap:header message="tns:DoGetLicenseInfoQAQueryHeader" part="QAQueryHeader" use="literal" />
692
+ </wsdl:input>
693
+ <wsdl:output>
694
+ <soap:body use="literal" />
695
+ <soap:header message="tns:DoGetLicenseInfoQAInformation" part="QAInformation" use="literal" />
696
+ </wsdl:output>
697
+ </wsdl:operation>
698
+ <wsdl:operation name="DoGetPromptSet">
699
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetPromptSet" style="document" />
700
+ <wsdl:input>
701
+ <soap:body use="literal" />
702
+ <soap:header message="tns:DoGetPromptSetQAQueryHeader" part="QAQueryHeader" use="literal" />
703
+ </wsdl:input>
704
+ <wsdl:output>
705
+ <soap:body use="literal" />
706
+ <soap:header message="tns:DoGetPromptSetQAInformation" part="QAInformation" use="literal" />
707
+ </wsdl:output>
708
+ </wsdl:operation>
709
+ <wsdl:operation name="DoGetSystemInfo">
710
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetSystemInfo" style="document" />
711
+ <wsdl:input>
712
+ <soap:body use="literal" />
713
+ <soap:header message="tns:DoGetSystemInfoQAQueryHeader" part="QAQueryHeader" use="literal" />
714
+ </wsdl:input>
715
+ <wsdl:output>
716
+ <soap:body use="literal" />
717
+ <soap:header message="tns:DoGetSystemInfoQAInformation" part="QAInformation" use="literal" />
718
+ </wsdl:output>
719
+ </wsdl:operation>
720
+ <wsdl:operation name="DoRefine">
721
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoRefine" style="document" />
722
+ <wsdl:input>
723
+ <soap:body use="literal" />
724
+ <soap:header message="tns:DoRefineQAQueryHeader" part="QAQueryHeader" use="literal" />
725
+ </wsdl:input>
726
+ <wsdl:output>
727
+ <soap:body use="literal" />
728
+ <soap:header message="tns:DoRefineQAInformation" part="QAInformation" use="literal" />
729
+ </wsdl:output>
730
+ </wsdl:operation>
731
+ <wsdl:operation name="DoSearch">
732
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoSearch" style="document" />
733
+ <wsdl:input>
734
+ <soap:body use="literal" />
735
+ <soap:header message="tns:DoSearchQAQueryHeader" part="QAQueryHeader" use="literal" />
736
+ </wsdl:input>
737
+ <wsdl:output>
738
+ <soap:body use="literal" />
739
+ <soap:header message="tns:DoSearchQAInformation" part="QAInformation" use="literal" />
740
+ </wsdl:output>
741
+ </wsdl:operation>
742
+ <wsdl:operation name="DoBulkSearch">
743
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoBulkSearch" style="document" />
744
+ <wsdl:input>
745
+ <soap:body use="literal" />
746
+ <soap:header message="tns:DoBulkSearchQAQueryHeader" part="QAQueryHeader" use="literal" />
747
+ </wsdl:input>
748
+ <wsdl:output>
749
+ <soap:body use="literal" />
750
+ <soap:header message="tns:DoBulkSearchQAInformation" part="QAInformation" use="literal" />
751
+ </wsdl:output>
752
+ </wsdl:operation>
753
+ <wsdl:operation name="DoGetDataMapDetail">
754
+ <soap:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetDataMapDetail" style="document" />
755
+ <wsdl:input>
756
+ <soap:body use="literal" />
757
+ <soap:header message="tns:DoGetDataMapDetailQAQueryHeader" part="QAQueryHeader" use="literal" />
758
+ </wsdl:input>
759
+ <wsdl:output>
760
+ <soap:body use="literal" />
761
+ <soap:header message="tns:DoGetDataMapDetailQAInformation" part="QAInformation" use="literal" />
762
+ </wsdl:output>
763
+ </wsdl:operation>
764
+ </wsdl:binding>
765
+ <wsdl:binding name="QASOnDemand1" type="tns:QASOnDemand">
766
+ <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
767
+ <wsdl:operation name="DoCanSearch">
768
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoCanSearch" style="document" />
769
+ <wsdl:input>
770
+ <soap12:body use="literal" />
771
+ <soap12:header message="tns:DoCanSearchQAQueryHeader" part="QAQueryHeader" use="literal" />
772
+ </wsdl:input>
773
+ <wsdl:output>
774
+ <soap12:body use="literal" />
775
+ <soap12:header message="tns:DoCanSearchQAInformation" part="QAInformation" use="literal" />
776
+ </wsdl:output>
777
+ </wsdl:operation>
778
+ <wsdl:operation name="DoGetAddress">
779
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetAddress" style="document" />
780
+ <wsdl:input>
781
+ <soap12:body use="literal" />
782
+ <soap12:header message="tns:DoGetAddressQAQueryHeader" part="QAQueryHeader" use="literal" />
783
+ </wsdl:input>
784
+ <wsdl:output>
785
+ <soap12:body use="literal" />
786
+ <soap12:header message="tns:DoGetAddressQAInformation" part="QAInformation" use="literal" />
787
+ </wsdl:output>
788
+ </wsdl:operation>
789
+ <wsdl:operation name="DoGetData">
790
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetData" style="document" />
791
+ <wsdl:input>
792
+ <soap12:body use="literal" />
793
+ <soap12:header message="tns:DoGetDataQAQueryHeader" part="QAQueryHeader" use="literal" />
794
+ </wsdl:input>
795
+ <wsdl:output>
796
+ <soap12:body use="literal" />
797
+ <soap12:header message="tns:DoGetDataQAInformation" part="QAInformation" use="literal" />
798
+ </wsdl:output>
799
+ </wsdl:operation>
800
+ <wsdl:operation name="DoGetExampleAddresses">
801
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetExampleAddresses" style="document" />
802
+ <wsdl:input>
803
+ <soap12:body use="literal" />
804
+ <soap12:header message="tns:DoGetExampleAddressesQAQueryHeader" part="QAQueryHeader" use="literal" />
805
+ </wsdl:input>
806
+ <wsdl:output>
807
+ <soap12:body use="literal" />
808
+ <soap12:header message="tns:DoGetExampleAddressesQAInformation" part="QAInformation" use="literal" />
809
+ </wsdl:output>
810
+ </wsdl:operation>
811
+ <wsdl:operation name="DoGetLayouts">
812
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetLayouts" style="document" />
813
+ <wsdl:input>
814
+ <soap12:body use="literal" />
815
+ <soap12:header message="tns:DoGetLayoutsQAQueryHeader" part="QAQueryHeader" use="literal" />
816
+ </wsdl:input>
817
+ <wsdl:output>
818
+ <soap12:body use="literal" />
819
+ <soap12:header message="tns:DoGetLayoutsQAInformation" part="QAInformation" use="literal" />
820
+ </wsdl:output>
821
+ </wsdl:operation>
822
+ <wsdl:operation name="DoGetLicenseInfo">
823
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetLicenseInfo" style="document" />
824
+ <wsdl:input>
825
+ <soap12:body use="literal" />
826
+ <soap12:header message="tns:DoGetLicenseInfoQAQueryHeader" part="QAQueryHeader" use="literal" />
827
+ </wsdl:input>
828
+ <wsdl:output>
829
+ <soap12:body use="literal" />
830
+ <soap12:header message="tns:DoGetLicenseInfoQAInformation" part="QAInformation" use="literal" />
831
+ </wsdl:output>
832
+ </wsdl:operation>
833
+ <wsdl:operation name="DoGetPromptSet">
834
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetPromptSet" style="document" />
835
+ <wsdl:input>
836
+ <soap12:body use="literal" />
837
+ <soap12:header message="tns:DoGetPromptSetQAQueryHeader" part="QAQueryHeader" use="literal" />
838
+ </wsdl:input>
839
+ <wsdl:output>
840
+ <soap12:body use="literal" />
841
+ <soap12:header message="tns:DoGetPromptSetQAInformation" part="QAInformation" use="literal" />
842
+ </wsdl:output>
843
+ </wsdl:operation>
844
+ <wsdl:operation name="DoGetSystemInfo">
845
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetSystemInfo" style="document" />
846
+ <wsdl:input>
847
+ <soap12:body use="literal" />
848
+ <soap12:header message="tns:DoGetSystemInfoQAQueryHeader" part="QAQueryHeader" use="literal" />
849
+ </wsdl:input>
850
+ <wsdl:output>
851
+ <soap12:body use="literal" />
852
+ <soap12:header message="tns:DoGetSystemInfoQAInformation" part="QAInformation" use="literal" />
853
+ </wsdl:output>
854
+ </wsdl:operation>
855
+ <wsdl:operation name="DoRefine">
856
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoRefine" style="document" />
857
+ <wsdl:input>
858
+ <soap12:body use="literal" />
859
+ <soap12:header message="tns:DoRefineQAQueryHeader" part="QAQueryHeader" use="literal" />
860
+ </wsdl:input>
861
+ <wsdl:output>
862
+ <soap12:body use="literal" />
863
+ <soap12:header message="tns:DoRefineQAInformation" part="QAInformation" use="literal" />
864
+ </wsdl:output>
865
+ </wsdl:operation>
866
+ <wsdl:operation name="DoSearch">
867
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoSearch" style="document" />
868
+ <wsdl:input>
869
+ <soap12:body use="literal" />
870
+ <soap12:header message="tns:DoSearchQAQueryHeader" part="QAQueryHeader" use="literal" />
871
+ </wsdl:input>
872
+ <wsdl:output>
873
+ <soap12:body use="literal" />
874
+ <soap12:header message="tns:DoSearchQAInformation" part="QAInformation" use="literal" />
875
+ </wsdl:output>
876
+ </wsdl:operation>
877
+ <wsdl:operation name="DoBulkSearch">
878
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoBulkSearch" style="document" />
879
+ <wsdl:input>
880
+ <soap12:body use="literal" />
881
+ <soap12:header message="tns:DoBulkSearchQAQueryHeader" part="QAQueryHeader" use="literal" />
882
+ </wsdl:input>
883
+ <wsdl:output>
884
+ <soap12:body use="literal" />
885
+ <soap12:header message="tns:DoBulkSearchQAInformation" part="QAInformation" use="literal" />
886
+ </wsdl:output>
887
+ </wsdl:operation>
888
+ <wsdl:operation name="DoGetDataMapDetail">
889
+ <soap12:operation soapAction="http://www.qas.com/OnDemand-2011-03/DoGetDataMapDetail" style="document" />
890
+ <wsdl:input>
891
+ <soap12:body use="literal" />
892
+ <soap12:header message="tns:DoGetDataMapDetailQAQueryHeader" part="QAQueryHeader" use="literal" />
893
+ </wsdl:input>
894
+ <wsdl:output>
895
+ <soap12:body use="literal" />
896
+ <soap12:header message="tns:DoGetDataMapDetailQAInformation" part="QAInformation" use="literal" />
897
+ </wsdl:output>
898
+ </wsdl:operation>
899
+ </wsdl:binding>
900
+ <wsdl:service name="OnDemandIntermediaryV3">
901
+ <wsdl:port name="QASOnDemand" binding="tns:QASOnDemand">
902
+ <soap:address location="https://ws.ondemand.qas.com/ProOnDemand/V3/ProOnDemandService.asmx" />
903
+ </wsdl:port>
904
+ <wsdl:port name="QASOnDemand1" binding="tns:QASOnDemand1">
905
+ <soap12:address location="https://ws.ondemand.qas.com/ProOnDemand/V3/ProOnDemandService.asmx" />
906
+ </wsdl:port>
907
+ </wsdl:service>
908
+ </wsdl:definitions>
app/code/community/Experian/Qas/sql/qas_setup/mysql4-install-0.0.1.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento Enterprise Edition
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Magento Enterprise Edition License
8
+ * that is bundled with this package in the file LICENSE_EE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://www.magentocommerce.com/license/enterprise-edition
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Checkout
23
+ * @copyright Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://www.magentocommerce.com/license/enterprise-edition
25
+ */
26
+
27
+ $installer = $this;
28
+ /* @var $installer Mage_Core_Model_Resource_Setup */
29
+
30
+ $installer->startSetup();
31
+
32
+ $this->addAttribute('customer_address', 'missing_verification', array(
33
+ 'type' => 'int',
34
+ 'input' => 'select',
35
+ 'source' => 'eav/entity_attribute_source_boolean',
36
+ 'label' => 'Missing Verification',
37
+ 'global' => 1,
38
+ 'visible' => 0,
39
+ 'required' => 0,
40
+ 'user_defined' => 1,
41
+ 'visible_on_front' => 0
42
+ ));
43
+
44
+
45
+ $eavConfig = Mage::getSingleton('eav/config');
46
+ $attribute = $eavConfig->getAttribute('customer_address', 'missing_verification');
47
+ $attribute->setData('used_in_forms', array('adminhtml_customer_address'));
48
+ $attribute->save();
49
+
50
+ /**
51
+ * Add missing_verification column in sales_flat_quote_address table
52
+ **/
53
+ $installer->getConnection()->addColumn(
54
+ $installer->getTable('sales_flat_quote_address'),
55
+ 'missing_verification',
56
+ 'int(2) NULL DEFAULT NULL'
57
+ );
58
+
59
+ /**
60
+ * Add missing_verification column in sales_flat_order_address table
61
+ **/
62
+ $installer->getConnection()->addColumn(
63
+ $installer->getTable('sales_flat_order_address'),
64
+ 'missing_verification',
65
+ 'int(2) NULL DEFAULT NULL'
66
+ );
67
+
68
+ $installer->endSetup();
app/design/frontend/base/default/layout/experian_qas.xml ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" ?>
2
+ <layout version="0.1.0">
3
+
4
+
5
+ <default>
6
+ <reference name="head">
7
+ <action method="addCss"><stylesheet>qas/css/styles.css</stylesheet></action>
8
+ </reference>
9
+ <reference name="footer">
10
+ <block type="core/template" name="qas_email_validate" template="qas/email_validate.phtml"/>
11
+ </reference>
12
+ </default>
13
+
14
+ <checkout_onepage_index>
15
+ <reference name="head">
16
+ <action method="addItem"><type>skin_js</type><name>qas/js/intuitive.js</name></action>
17
+ <action method="addItem"><type>skin_js</type><name>qas/js/searchengine.js</name></action>
18
+ </reference>
19
+ <reference name="before_body_end">
20
+ <block type="experian_qas/addressField_billing" name="qas_intuitive_billing" template="qas/intuitive.phtml" />
21
+ <block type="experian_qas/addressField_shipping" name="qas_intuitive_shipping" template="qas/intuitive.phtml" />
22
+ <block type="experian_qas/addressField_billing" name="checkout_onepage_qas_billing" template="qas/checkout/billing.phtml"/>
23
+ <block type="experian_qas/addressField_shipping" name="checkout_onepage_qas_shipping" template="qas/checkout/shipping.phtml"/>
24
+ </reference>
25
+ </checkout_onepage_index>
26
+
27
+ <customer_address_form>
28
+ <reference name="head">
29
+ <action method="addItem"><type>skin_js</type><name>qas/js/intuitive.js</name></action>
30
+ <action method="addItem"><type>skin_js</type><name>qas/js/searchengine.js</name></action>
31
+ </reference>
32
+ <reference name="before_body_end">
33
+ <block type="experian_qas/addressField" name="qas_search_engine" template="qas/customer/address/edit.phtml"/>
34
+ <block type="experian_qas/addressField" name="qas_intuitive" template="qas/intuitive.phtml" />
35
+ </reference>
36
+ </customer_address_form>
37
+
38
+ </layout>
app/design/frontend/base/default/template/qas/checkout/billing.phtml ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $helper = Mage::helper('experian_qas'); ?>
2
+ <?php if ($helper->isSearchEngineEnabled()): ?>
3
+ <?php
4
+ //code popin factorization
5
+ echo $this->getLayout()->createBlock('core/template')->setTemplate('qas/popin.phtml')->setAlias('billing')->toHtml();
6
+
7
+ ?>
8
+
9
+ <script type="text/javascript">
10
+ //<![CDATA[
11
+ var interactionWindowBilling = $('interactionWindowBilling');
12
+ var interactionWindowBillingMask = $('interactionWindowBilling-mask');
13
+ var interactionWindowBillingContent = $('interactionWindowContentBilling');
14
+ var keepBillingAddress = false;
15
+
16
+
17
+ function leaveBillingAddress(){
18
+ interactionWindowBilling.hide();
19
+ interactionWindowBillingMask.hide();
20
+ }
21
+
22
+ function keepMyBillingAddress(){
23
+ keepBillingAddress = true;
24
+ interactionWindowBilling.hide();
25
+ interactionWindowBillingMask.hide();
26
+ billing.save();
27
+ keepBillingAddress = false;
28
+ }
29
+
30
+ function selectBillingAddress() {
31
+ var billingForm = new VarienForm('<?php echo Experian_Qas_Block_Interaction::INTERACTION_FORM_NAME ?>Billing');
32
+ var validator = new Validation(billingForm.form);
33
+
34
+ if (validator.validate()) {
35
+ new Ajax.Request(
36
+ '<?php echo Mage::getUrl('qas/process/normalizeAddress') ?>',
37
+ {
38
+ method: 'post',
39
+ parameters: Form.serialize($('<?php echo Experian_Qas_Block_Interaction::INTERACTION_FORM_NAME ?>Billing')),
40
+ onComplete: function() {
41
+ saveAddress(billing, 'billing');
42
+ },
43
+ onFailure: function(response){
44
+ alert('An error occurred while processing your request');
45
+ this.onComplete;
46
+ },
47
+ onSuccess: function(response){
48
+ if (response && response.responseText){
49
+ interactionWindowBilling.hide();
50
+ interactionWindowBillingMask.hide();
51
+ if (typeof(response.responseText) == 'string') {
52
+ eval('result = ' + response.responseText);
53
+ }
54
+ //for region input
55
+ <?php $inputType = 'text';?>
56
+
57
+ if(!isNaN(result.region)) {
58
+ <?php $inputType = 'select';?>
59
+ var current_select = $('<?php echo $this->getRegion() ?>');
60
+ var current_non = current_select.select('option[value="'+result.region+'"]');
61
+ var options = current_select.select("option");
62
+ if (current_non[0]) {
63
+ options.each(function(item)
64
+ {
65
+ if(item.value == current_non[0].value)
66
+ {
67
+ item.selected = true;
68
+ }
69
+ });
70
+ }
71
+
72
+ }
73
+ $('<?php echo $this->getStreet1() ?>').value = result.street_1;
74
+ $('<?php echo $this->getStreet2() ?>').value = result.street_2;
75
+ $('<?php echo $this->getCity() ?>').value = result.city;
76
+ $('<?php echo $this->getRegionInput($inputType) ?>').value = result.region;
77
+ $('<?php echo $this->getZip() ?>').value = result.zip;
78
+ }
79
+ }.bind(this)
80
+ }
81
+ )
82
+ }
83
+ }
84
+
85
+
86
+ Event.observe(window, 'load', function() {
87
+ Object.extend(Billing.prototype, {
88
+ save: function(){
89
+ if ($('billing-new-address-form').visible() && keepBillingAddress === false) {
90
+ new Ajax.Request(
91
+ '<?php echo Mage::getUrl('qas/process/addressSearchEngine/edit/3')?>',
92
+ {
93
+ method: 'post',
94
+ parameters: Form.serialize(this.form),
95
+ onSuccess: function(transport){
96
+ if (transport.responseText) {
97
+ $$('.interactionWindow .display').each(function(item){
98
+ item.show();
99
+ });
100
+ interactionWindowBillingContent.update(transport.responseText);
101
+ interactionWindowBilling.show();
102
+ interactionWindowBillingMask.show();
103
+ }
104
+ }.bind(this),
105
+ onComplete: function(transport){
106
+ if (!transport.responseText) {
107
+ saveAddress(this, 'billing');
108
+ }
109
+ }.bind(this),
110
+ onFailure: function(){
111
+ saveAddress(this, 'billing');
112
+ }.bind(this)
113
+ }
114
+ );
115
+ } else {
116
+ saveAddress(this, 'billing');
117
+ }
118
+ }
119
+ });
120
+ });
121
+ //]]>
122
+ </script>
123
+
124
+ <?php endif; ?>
app/design/frontend/base/default/template/qas/checkout/shipping.phtml ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $helper = Mage::helper('experian_qas'); ?>
2
+ <?php if ($helper->isSearchEngineEnabled()): ?>
3
+ <?php
4
+ //code popin factorization
5
+ echo $this->getLayout()->createBlock('core/template')->setTemplate('qas/popin.phtml')->setAlias('shipping')->toHtml();
6
+
7
+ ?>
8
+ <script type="text/javascript">
9
+ //<![CDATA[
10
+ var interactionWindowShipping = $('interactionWindowShipping');
11
+ var interactionWindowShippingMask = $('interactionWindowShipping-mask');
12
+ var interactionWindowContentShipping = $('interactionWindowContentShipping');
13
+ var keepShippingAddress = false;
14
+
15
+ function leaveShippingAddress(){
16
+ interactionWindowShipping.hide();
17
+ interactionWindowShippingMask.hide();
18
+ }
19
+
20
+ function keepMyShippingAddress(){
21
+ keepShippingAddress = true;
22
+ interactionWindowShipping.hide();
23
+ interactionWindowShippingMask.hide();
24
+ shipping.save();
25
+ keepShippingAddress = false;
26
+ }
27
+
28
+ function selectShippingAddress() {
29
+ var shippingForm = new VarienForm('<?php echo Experian_Qas_Block_Interaction::INTERACTION_FORM_NAME ?>Shipping');
30
+ var validator = new Validation(shippingForm.form);
31
+
32
+ if (validator.validate()) {
33
+ new Ajax.Request(
34
+ '<?php echo Mage::getUrl('qas/process/normalizeAddress') ?>',
35
+ {
36
+ method: 'post',
37
+ parameters: Form.serialize($('<?php echo Experian_Qas_Block_Interaction::INTERACTION_FORM_NAME . 'Shipping' ?>')),
38
+ onComplete: function() {
39
+ saveAddress(shipping, 'shipping');
40
+ },
41
+ onFailure: function(response){
42
+ alert('An error occurred while processing your request');
43
+ this.onComplete;
44
+ },
45
+ onSuccess: function(response){
46
+ if (response && response.responseText){
47
+ interactionWindowShipping.hide();
48
+ interactionWindowShippingMask.hide();
49
+ if (typeof(response.responseText) == 'string') {
50
+ eval('result = ' + response.responseText);
51
+ }
52
+ //for region input
53
+ <?php $inputType = 'text';?>
54
+
55
+ if(!isNaN(result.region)) {
56
+ <?php $inputType = 'select';?>
57
+ var current_select = $('<?php echo $this->getRegion() ?>');
58
+ var current_non = current_select.select('option[value="'+result.region+'"]');
59
+ var options = current_select.select("option");
60
+ if (current_non[0]) {
61
+ options.each(function(item)
62
+ {
63
+ if(item.value == current_non[0].value)
64
+ {
65
+ item.selected = true;
66
+ }
67
+ });
68
+ }
69
+ }
70
+ $('<?php echo $this->getStreet1() ?>').value = result.street_1;
71
+ $('<?php echo $this->getStreet2() ?>').value = result.street_2;
72
+ $('<?php echo $this->getCity() ?>').value = result.city;
73
+ $('<?php echo $this->getRegionInput($inputType) ?>').value = result.region;
74
+ $('<?php echo $this->getZip() ?>').value = result.zip;
75
+ }
76
+ }.bind(this)
77
+ }
78
+ )
79
+ }
80
+ }
81
+
82
+
83
+
84
+ Event.observe(window, 'load', function() {
85
+ Object.extend(Shipping.prototype, {
86
+ save: function(){
87
+ if ($('shipping-new-address-form').visible() && keepShippingAddress === false) {
88
+ new Ajax.Request(
89
+ '<?php echo Mage::getUrl('qas/process/addressSearchEngine/edit/2')?>',
90
+ {
91
+ method: 'post',
92
+ parameters: Form.serialize(this.form),
93
+ onSuccess: function(transport){
94
+ if (transport.responseText) {
95
+ $$('.interactionWindow .display').each(function(item){
96
+ item.show();
97
+ });
98
+ interactionWindowContentShipping.update(transport.responseText);
99
+ interactionWindowShipping.show();
100
+ interactionWindowShippingMask.show();
101
+ }
102
+ }.bind(this),
103
+ onComplete: function(transport){
104
+ if (!transport.responseText) {
105
+ saveAddress(this, 'shipping');
106
+ }
107
+ }.bind(this),
108
+ onFailure: function(){
109
+ saveAddress(this, 'shipping');
110
+ }.bind(this)
111
+ }
112
+ );
113
+ } else {
114
+ saveAddress(this, 'shipping');
115
+ }
116
+ }
117
+ });
118
+ });
119
+ //]]>
120
+ </script>
121
+
122
+ <?php endif; ?>
app/design/frontend/base/default/template/qas/customer/address/edit.phtml ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $helper = Mage::helper('experian_qas'); ?>
2
+ <?php if ($helper->isSearchEngineEnabled()): ?>
3
+ <?php
4
+ //code popin factorization
5
+ echo $this->getLayout()->createBlock('core/template')->setTemplate('qas/popin.phtml')->setAlias('customer')->toHtml();
6
+
7
+ ?>
8
+ <script type="text/javascript">
9
+ //<![CDATA[
10
+ var interactionWindow = $('interactionWindowCustomer');
11
+ var interactionWindowMask = $('interactionWindowCustomer-mask');
12
+ var interactionWindowContent = $('interactionWindowContentCustomer');
13
+ var keepBillingAddress = false;
14
+
15
+ function leaveCustomerAddress(){
16
+ interactionWindow.hide();
17
+ interactionWindowMask.hide();
18
+ }
19
+
20
+ function keepMyCustomerAddress(){
21
+ keepBillingAddress = true;
22
+ interactionWindow.hide();
23
+ interactionWindowMask.hide();
24
+ $('<?php echo $this->getFormName() ?>').submit();
25
+ keepBillingAddress = false;
26
+ }
27
+
28
+
29
+ function selectCustomerAddress() {
30
+ var customerForm = new VarienForm('<?php echo Experian_Qas_Block_Interaction::INTERACTION_FORM_NAME ?>Customer');
31
+ var validator = new Validation(customerForm.form);
32
+
33
+ if (validator.validate()) {
34
+ new Ajax.Request(
35
+ '<?php echo Mage::getUrl('qas/process/normalizeAddress') ?>',
36
+ {
37
+ method: 'post',
38
+ parameters: Form.serialize($('<?php echo Experian_Qas_Block_Interaction::INTERACTION_FORM_NAME ?>Customer')),
39
+ onComplete: function() {
40
+ },
41
+ onFailure: function(response){
42
+ alert('An error occurred while processing your request');
43
+ this.onComplete;
44
+ },
45
+ onSuccess: function(response){
46
+ if (response && response.responseText){
47
+
48
+ interactionWindow.hide();
49
+ interactionWindowMask.hide();
50
+ if (typeof(response.responseText) == 'string') {
51
+ eval('result = ' + response.responseText);
52
+ }
53
+ //for region input
54
+ <?php $inputType = 'text';?>
55
+
56
+ if(!isNaN(result.region)) {
57
+ <?php $inputType = 'select';?>
58
+ var current_select = $('<?php echo $this->getRegion() ?>');
59
+ var current_non = current_select.select('option[value="'+result.region+'"]');
60
+ var options = current_select.select("option");
61
+ if (current_non[0]) {
62
+ options.each(function(item)
63
+ {
64
+ if(item.value == current_non[0].value)
65
+ {
66
+ item.selected = true;
67
+ }
68
+ });
69
+ }
70
+
71
+ }
72
+ $('<?php echo $this->getStreet1() ?>').value = result.street_1;
73
+ $('<?php echo $this->getStreet2() ?>').value = result.street_2;
74
+ $('<?php echo $this->getCity() ?>').value = result.city;
75
+ $('<?php echo $this->getRegionInput($inputType) ?>').value = result.region;
76
+ $('<?php echo $this->getZip() ?>').value = result.zip;
77
+ $('<?php echo $this->getFormName() ?>').submit();
78
+ }
79
+ }.bind(this)
80
+ }
81
+ )
82
+ }
83
+
84
+
85
+
86
+ }
87
+
88
+
89
+ Event.observe(window, 'load', function() {
90
+ Event.observe($('<?php echo $this->getFormName() ?>'), 'submit', function(event){
91
+ if (keepBillingAddress === false) {
92
+ new Ajax.Request(
93
+ // the param id is used to identify the source of address edition
94
+ '<?php echo Mage::getUrl('qas/process/addressSearchEngine/edit/1')?>',
95
+ {
96
+ method: 'post',
97
+ asynchronous: false,
98
+ parameters: Form.serialize($('<?php echo $this->getFormName() ?>')),
99
+ onSuccess: function(transport){
100
+ //added to overcome the visiblity problem of buttons.
101
+ if (transport.responseText) {
102
+ $$('.interactionWindow .display').each(function(item){
103
+ item.show();
104
+ });
105
+ interactionWindowContent.update(transport.responseText);
106
+ interactionWindow.show();
107
+ interactionWindowMask.show();
108
+ }
109
+ }.bind(this),
110
+ onComplete: function(transport){
111
+ if (!transport.responseText) {
112
+ keepMyCustomerAddress();
113
+ }
114
+ }.bind(this),
115
+ onFailure: function(){
116
+ keepMyCustomerAddress();
117
+ }.bind(this)
118
+ }
119
+ );
120
+ Event.stop(event);
121
+ }
122
+
123
+ }.bind(this));
124
+ });
125
+ //]]>
126
+ </script>
127
+
128
+ <?php endif; ?>
app/design/frontend/base/default/template/qas/email_validate.phtml ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $helper = Mage::helper('experian_qas'); ?>
2
+
3
+ <?php if ($helper->isEmailValidateEnabled()): ?>
4
+
5
+ <?php $emailValidateUrl = Mage::getUrl('qas/process/validateEmail'); ?>
6
+ <?php $acceptUnknownsEmails = $helper->isAcceptUnknowsEmails();?>
7
+ <script type="text/javascript">
8
+ //<![CDATA[
9
+ // Needed for Magento version wich do not support jstranslator.xml
10
+ Translator.add('unknown', '<?php echo $this->__('unknown'); ?>');
11
+ Translator.add('illegitimate', '<?php echo $this->__('illegitimate'); ?>');
12
+ Translator.add('disposable', '<?php echo $this->__('disposable'); ?>');
13
+ Translator.add('undeliverable', '<?php echo $this->__('undeliverable'); ?>');
14
+ Translator.add('unreachable', '<?php echo $this->__('unreachable'); ?>');
15
+
16
+ Validation.add('validate-email', '', function(v) {
17
+ var url = '<?php echo $emailValidateUrl ?>?email='+ encodeURIComponent(v);
18
+ var isEmailValid = false;
19
+ new Ajax.Request(url, {
20
+ method: 'get',
21
+ asynchronous: false,
22
+ onCreate: function() {
23
+ $$('.validate-email').each(function(email) {
24
+ email.insert({after: '<img class="validate-email-loader" src="<?php echo $this->getSkinUrl('images/opc-ajax-loader.gif')?>" />'});
25
+ });
26
+ },
27
+ onSuccess: function(transport) {
28
+ var obj = eval('(' + transport.responseText + ')');
29
+
30
+ if (typeof obj == 'object' && typeof obj.Certainty == 'string' &&
31
+ (obj.Certainty == 'verified' <?php echo $acceptUnknownsEmails ? "|| obj.Certainty == 'unknown'" : ''?>)) {
32
+ isEmailValid = true;
33
+ } else {
34
+ Validation.get('validate-email').error = Translator.translate(obj.Certainty);
35
+ }
36
+ return isEmailValid;
37
+ },
38
+ onComplete: function() {
39
+ $$('.validate-email-loader').each(function(loader) {
40
+ loader.remove();
41
+ });
42
+
43
+ $$('.validate-email').each(function(email) {
44
+ if (typeof email.next('.validation-advice') != "undefined") {
45
+ email.next('.validation-advice').remove();
46
+ }
47
+ });
48
+ }
49
+ });
50
+
51
+ return isEmailValid;
52
+ });
53
+ //]]>
54
+ </script>
55
+ <?php endif; ?>
app/design/frontend/base/default/template/qas/interaction.phtml ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $picklist = $this->getSuggestData(); ?>
2
+ <?php if ($picklist) : ?>
3
+ <div>
4
+ <?php echo $this->__('Please choose one of the following addresses and click on <strong>Select</strong>.<br/>If there is no matching and you are sure that you entered a valid address, click on <strong>Keep my address</strong>.') ?>
5
+ </div>
6
+ <div style="max-height: 350px; overflow: auto; margin: 15px 0px;">
7
+ <?php foreach ($picklist as $address): ?>
8
+ <div>
9
+ <input id="<?php echo $address['value'] ?>" class="validate-one-required-by-name" name="<?php echo Experian_Qas_Helper_Data::QUERY_MONIKER ?>" type="radio" value="<?php echo $address['value'] ?>">
10
+ <label for="<?php echo $address['value'] ?>"><?php echo $address['title'] ?></label>
11
+ </div>
12
+ <?php endforeach; ?>
13
+ </div>
14
+ <?php endif; ?>
app/design/frontend/base/default/template/qas/intuitive.phtml ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $suffix = $this->getSuffix(); ?>
2
+ <?php $helper = Mage::helper('experian_qas'); ?>
3
+ <?php if ($helper->isIntuitiveEnabled()): ?>
4
+
5
+ <div id="address_search_autocomplete" class="search_autocomplete"></div>
6
+ <script type="text/javascript">
7
+ //<![CDATA[
8
+ var QUERY_PARAM = '<?php echo Experian_Qas_Helper_Data::QUERY_PARAM ?>';
9
+ var QUERY_MONIKER = '<?php echo Experian_Qas_Helper_Data::QUERY_MONIKER ?>';
10
+ var QUERY_COUNTRY = '<?php echo Experian_Qas_Helper_Data::QUERY_COUNTRY ?>';
11
+ var NORMALIZE_URL = '<?php echo Mage::getUrl('qas/process/normalizeAddress')?>';
12
+ var INTUITIVE_URL = '<?php echo Mage::getUrl('qas/process/intuitiveEngine')?>';
13
+ //]]>
14
+ </script>
15
+
16
+ <script type="text/javascript">
17
+ //<![CDATA[
18
+ Event.observe(window, 'load', function() {
19
+ var addressSearchForm_<?php echo $suffix ?> = new Varien.addressSearchForm(
20
+ '<?php echo $this->getFormName() ?>',
21
+ '<?php echo $this->getStreet1() ?>',
22
+ '',
23
+ '<?php echo $this->getCountry() ?>',
24
+ '<?php echo $this->getRegion() ?>',
25
+ '<?php echo $this->getCity() ?>',
26
+ '<?php echo $this->getZip() ?>',
27
+ '<?php echo $this->getStreet1() ?>',
28
+ '<?php echo $this->getStreet2() ?>'
29
+ );
30
+ addressSearchForm_<?php echo $suffix ?>.initAutocomplete(
31
+ INTUITIVE_URL,
32
+ 'address_search_autocomplete'
33
+ );
34
+ });
35
+ //]]>
36
+ </script>
37
+
38
+ <?php endif; ?>
app/design/frontend/base/default/template/qas/popin.phtml ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $suffix = null;
3
+ $myMethod = array ( $this, 'getAlias' );
4
+ if(is_callable($myMethod,true)) {
5
+ $suffix = ucfirst($this->getAlias());
6
+ }
7
+ ?>
8
+ <div id="interactionWindow<?php echo $suffix ?>-mask" class="interactionWindow-mask" style="display: none;"></div>
9
+ <div id="interactionWindow<?php echo $suffix ?>" class="interactionWindow"
10
+ style="display: none;">
11
+ <div class="message-popup-head">
12
+ <a title="<?php echo $this->__('Close') ?>" onclick="leave<?php echo $suffix ?>Address(); return false;" href="#">
13
+ <span><?php echo $this->__('Close') ?></span>
14
+ </a>
15
+ <h2><?php echo $this->__('Address confirmation') ?></h2>
16
+ </div>
17
+ <div class="message-popup-content">
18
+ <form
19
+ id="<?php echo Experian_Qas_Helper_Data::INTERACTION_FORM_NAME.$suffix?>"
20
+ action="<?php echo Mage::getUrl('qas/process/normalizeAddress')?>">
21
+ <div id="interactionWindowContent<?php echo $suffix ?>"></div>
22
+ <div>
23
+ <button type="button"
24
+ title="<?php echo $this->__('Select') ?>"
25
+ class="button display" onclick="select<?php echo $suffix ?>Address()">
26
+ <span><span><?php echo $this->__('Select') ?> </span> </span>
27
+ </button>
28
+ <button type="button"
29
+ title="<?php echo $this->__('Keep my address') ?>"
30
+ class="button" onclick="keepMy<?php echo $suffix ?>Address()">
31
+ <span><span><?php echo $this->__('Keep my address') ?> </span>
32
+ </span>
33
+ </button>
34
+
35
+ </div>
36
+ </form>
37
+ </div>
38
+ </div>
app/etc/modules/Experian_Qas.xml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * @category Experian
5
+ * @package Experian_Qas
6
+ * @copyright Experian 2012
7
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
8
+ */
9
+ -->
10
+ <config>
11
+ <modules>
12
+ <Experian_Qas>
13
+ <active>true</active>
14
+ <codePool>community</codePool>
15
+ </Experian_Qas>
16
+ </modules>
17
+ </config>
app/locale/en_US/Experian_Qas.csv ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "One or more services timed out", "One or more services timed out"
2
+ "One or more services failed", "One or more services failed"
3
+ "Success", "Success"
4
+ "Invalid request", "Invalid request"
5
+ "Invalid parameter", "Invalid parameter"
6
+ "Not authorized for one or more services", "Not authorized for one or more services"
7
+ "Service unavailable", "Service unavailable"
8
+ "Email codes Code Description", "Email codes Code Description"
9
+ "Timeout", "Timeout"
10
+ "Syntax OK", "Syntax OK"
11
+ "Syntax OK and domain valid according to the domain database", "Syntax OK and domain valid according to the domain database"
12
+ "Syntax OK and domain exists", "Syntax OK and domain exists"
13
+ "Syntax OK, domain exists, and domain can receive email", "Syntax OK, domain exists, and domain can receive email"
14
+ "Syntax OK, domain exists, and mailbox does not reject mail", "Syntax OK, domain exists, and mailbox does not reject mail"
15
+ "General syntax error", "General syntax error"
16
+ "Invalid character in address", "Invalid character in address"
17
+ "Invalid domain syntax", "Invalid domain syntax"
18
+ "Invalid username syntax", "Invalid username syntax"
19
+ "Invalid username syntax for that domain", "Invalid username syntax for that domain"
20
+ "Address is too long", "Address is too long"
21
+ "Address has unbalanced parentheses, brackets, or quotes", "Address has unbalanced parentheses, brackets, or quotes"
22
+ "Address does not have a username", "Address does not have a username"
23
+ "Address does not have a domain", "Address does not have a domain"
24
+ "Address does not have an @ sign", "Address does not have an @ sign"
25
+ "Address has more than one @ sign", "Address has more than one @ sign"
26
+ "Invalid top-level-domain (TLD) in address", "Invalid top-level-domain (TLD) in address"
27
+ "Unquoted spaces are not allowed in email addresses", "Unquoted spaces are not allowed in email addresses"
28
+ "Domain does not exist", "Domain does not exist"
29
+ "Domain does not have a valid IP address", "Domain does not have a valid IP address"
30
+ "Domain cannot receive email", "Domain cannot receive email"
31
+ "The mailbox is invalid or the username does not exist at the domain", "The mailbox is invalid or the username does not exist at the domain"
32
+ "Mailbox is full and can not receive email at this time", "Mailbox is full and can not receive email at this time"
33
+ "Mail is not accepted for this domain", "Mail is not accepted for this domain"
34
+ "Addresses with that username are not allowed", "Addresses with that username are not allowed"
35
+ "Addresses with that domain are not allowed", "Addresses with that domain are not allowed"
36
+ "The email address is suppressed and not allowed", "The email address is suppressed and not allowed"
37
+ "Internal error", "Internal error"
38
+ "unreachable", "Invalid domain: DNS registration (DNS = Domain Name System) invalid or non-existent or mail server unreachable."
39
+ "unknown", "Can not give a conclusive answer on the email address."
40
+ "illegitimate", "Emails for which it is harmful to send emails"
41
+ "disposable", "Belongs to an email created for a limited period, eg mailinator.com or jetable.org"
42
+ "undeliverable", "The email is not deliverable - does not exist, closed or full inbox."
app/locale/fr_FR/Experian_Qas.csv ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "One or more services timed out", "Un ou plusieurs services ont expiré"
2
+ "One or more services failed", "Un ou plusieurs services ont échoué"
3
+ "Success", "Succès"
4
+ "Invalid request", "Requête invalide"
5
+ "Invalid parameter", "Paramètre invalide"
6
+ "Not authorized for one or more services", "Vous n'avez pas l'autorisation d'utiliser un ou plusieurs services"
7
+ "Service unavailable", "Service non disponible"
8
+ "Email codes Code Description", "Email codes Code Description"
9
+ "Timeout", "Délai d'attente épuisé"
10
+ "Syntax OK", "Syntaxe correcte"
11
+ "Syntax OK and domain valid according to the domain database", "Syntaxe et nom de domaine valides selon la base de données"
12
+ "Syntax OK and domain exists", "Syntaxe correcte et nom de domaine valide"
13
+ "Syntax OK, domain exists, and domain can receive email", "Syntaxe correcte, nom de domaine valide et peut recevoir des emails"
14
+ "Syntax OK, domain exists, and mailbox does not reject mail", "Syntaxe correcte, nom de domaine valide et la mailbox ne rejette pas les emails"
15
+ "General syntax error", "Erreur générale dans la syntaxe"
16
+ "Invalid character in address", "Caractère invalide dans l'adresse"
17
+ "Invalid domain syntax", "Syntaxe du domaine incorrecte"
18
+ "Invalid username syntax", "Syntaxe de l'utilisateur incorrecte"
19
+ "Invalid username syntax for that domain", "Syntaxe utilisateur incorrecte pour ce domaine"
20
+ "Address is too long", "Adresse très longue"
21
+ "Address has unbalanced parentheses, brackets, or quotes", "Address has unbalanced parentheses, brackets, or quotes"
22
+ "Address does not have a username", "L'adresse n'a pas d'utilisateur"
23
+ "Address does not have a domain", "L'adresse n'a pas de domaine"
24
+ "Address does not have an @ sign", "L'adresse n'a pas le signe @"
25
+ "Address has more than one @ sign", "L'adresse a plus d'un signe @"
26
+ "Invalid top-level-domain (TLD) in address", "Le top-level-domain (TLD) dans l'adresse n'est pas valide"
27
+ "Unquoted spaces are not allowed in email addresses", "Les espaces ne sont pas autorisés dans l'adresse mail"
28
+ "Domain does not exist", "Le domaine n'existe pas"
29
+ "Domain does not have a valid IP address", "Le domaine a adresse IP invalide"
30
+ "Domain cannot receive email", "Le domaine ne peut pas recevoir d'emails"
31
+ "The mailbox is invalid or the username does not exist at the domain", "La mailbox ou l'utilisateur n'existe pas pour ce domaine"
32
+ "Mailbox is full and can not receive email at this time", "La mailbox est pleine et ne peut recevoir d'e-mails supplémentaires"
33
+ "Mail is not accepted for this domain", "L'e-mail n'est pas accepté pour ce domaine"
34
+ "Addresses with that username are not allowed", "Les adresses mail avec cet utilisateur ne sont pas autorisées"
35
+ "Addresses with that domain are not allowed", "Les adresses mail avec ce domaine ne sont pas autorisées"
36
+ "The email address is suppressed and not allowed", "L'adresse e-mail est supprimée et n'est plus autorisée"
37
+ "Internal error", "Erreur interne"
38
+ "unreachable", "Domaine invalide: enregistrement DNS (DNS= Domain Name System) invalide ou inexistant ou server mail injoignable."
39
+ "unknown", "Ne peut pas donner de réponse concluante sur l’adresse email."
40
+ "illegitimate", "Emails pour lesquels il est nocif d’envoyer des emails"
41
+ "disposable", "Appartient à un email créé pour une durée limitée, par ex mailinator.com ou jetable.org"
42
+ "undeliverable", "L’email n’est pas délivrable – n’existe pas, boite email fermée ou pleine."
package.xml ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Experian_Qas</name>
4
+ <version>1.3.0</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://opensource.org/licenses/osl-3.0.php">OSL v3.0</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>QAS for Magento Community &amp; Enterprise</summary>
10
+ <description>Experian QAS is a leading provider of address data quality software and services. Their suite of&#xD;
11
+ products is designed to capture, validate, clean, standardize and enrich addresses, names and&#xD;
12
+ other important contact information.&#xD;
13
+ &#xD;
14
+ For this Magento extension, four services will be integrated. QAS Email Validate, QAS Intuitive&#xD;
15
+ Search Engine, QAS Verification and QAS SingleLine.&#xD;
16
+ </description>
17
+ <notes>- Change email validation service&#xD;
18
+ - Fix bugs&#xD;
19
+ - Add intuitive cache system</notes>
20
+ <authors><author><name>Experian</name><user>ExperianFrance</user><email>QAS-DL-ProfessionalServices-FRA@experian.com</email></author></authors>
21
+ <date>2014-04-30</date>
22
+ <time>12:47:20</time>
23
+ <contents><target name="magecommunity"><dir name="Experian"><dir name="Qas"><dir name="Block"><dir name="AddressField"><file name="Billing.php" hash="c9bf10a8a5518640eda3f0fa78ead2dd"/><file name="Shipping.php" hash="c19dbfe5f6ac2584bcb07268b61687e3"/></dir><file name="AddressField.php" hash="48057abbd5c661bbff392d44da57eec6"/><dir name="Adminhtml"><dir name="System"><dir name="Config"><dir name="Form"><file name="IntuitiveCountryFieldset.php" hash="b7458f47eb9d040cd3cdd36bf5bb8dd1"/></dir></dir></dir></dir><file name="Autocomplete.php" hash="152a5e3c52932e42bf4a421e593203ef"/><file name="Interaction.php" hash="e1889fe538cfba924739e196f3f4ef2d"/><file name="Verification.php" hash="e4e49505a6ca88d9263e7eb3fb59aee4"/></dir><dir name="Helper"><file name="Data.php" hash="7f4052948d7cdf72dd689f8346f9efa7"/></dir><dir name="Model"><file name="Observer.php" hash="4072c569da70074c8b1ba825e72beb72"/><file name="Qascall.php" hash="75f1c1cd7b9c296af8d3a106e5133773"/><dir name="System"><dir name="Config"><dir name="Source"><file name="Engine.php" hash="201d5ec887be2b7212c663f21c79e5e8"/><file name="SpecialEngine.php" hash="9aa41b162a3c2484807a0b2ab9ca865c"/></dir></dir></dir></dir><dir name="controllers"><file name="ProcessController.php" hash="8a4040e1d7b4f1a9aca6c84d9512a2d3"/></dir><dir name="etc"><file name="adminhtml.xml" hash="2d66eea2e9f7f200bc683dbea7c4f9fa"/><file name="config.xml" hash="c1af05156931fcd2041656126ffdf459"/><file name="jstranslator.xml" hash="2fc4852a02ac4062d9b55960d88c9b0a"/><file name="system.xml" hash="98c156653141b905a402280035189067"/><file name="wsv3.wsdl" hash="39583e5ba6eba378e2e8f853197d11bd"/></dir><dir name="sql"><dir name="qas_setup"><file name="mysql4-install-0.0.1.php" hash="2da70417671b254650dc644e957c9798"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="experian_qas.xml" hash="d05d6eb05105f49976ce55b4659887ed"/></dir><dir name="template"><dir name="qas"><dir name="checkout"><file name="billing.phtml" hash="71c823ef5d5e8abd89102f1675eb0263"/><file name="shipping.phtml" hash="0f3dd235764026a12e5c012297438c2c"/></dir><dir name="customer"><dir name="address"><file name="edit.phtml" hash="8d612e77586c1c390ed576d40c2cd93b"/></dir></dir><file name="email_validate.phtml" hash="44363aab68426694228a4c2d949c7e14"/><file name="interaction.phtml" hash="52e54db9abad7047d15fadd019351542"/><file name="intuitive.phtml" hash="6a74984e2c856abd1ebb8b636465621f"/><file name="popin.phtml" hash="3f7ede1b68430db2a06e97e03e904c7c"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Experian_Qas.xml" hash="96f1b312c3dc1fa7084edacfe85f9f5c"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="qas"><dir name="css"><file name="styles.css" hash="93be3befc4db95aa7b5faaa982fbb4b3"/></dir><dir name="images"><file name="bkg_btn-close.gif" hash="df3f2332f0bad01e031deb22b81f630c"/><file name="bkg_btn-close2.gif" hash="822457d78fb3c21dc12e9777d83eb4f1"/></dir><dir name="js"><file name="intuitive.js" hash="cf727e77cb1dc2837826e838fa405a56"/><file name="searchengine.js" hash="da778e7e3a3b4737b92b09504a3d7c3c"/></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="fr_FR"><file name="Experian_Qas.csv" hash="0f622fb7bc057c84fd2d88746c066aa7"/></dir><dir name="en_US"><file name="Experian_Qas.csv" hash="4f8dd64729f48922a22c5ae0c404be68"/></dir></target></contents>
24
+ <compatible/>
25
+ <dependencies><required><php><min>5.3.3</min><max>6.0.0</max></php><extension><name>soap</name><min></min><max></max></extension></required></dependencies>
26
+ </package>
skin/frontend/base/default/qas/css/styles.css ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ .interactionWindow {
3
+ background: none repeat scroll 0 0 #F3BF8F;
4
+ width: 600px;
5
+ border: 1px;
6
+ border-color: #000;
7
+ border-style: solid;
8
+ position:absolute;
9
+ top: 20%;
10
+ left: 30%;
11
+ z-index:981;
12
+ padding: 0 4px 4px 4px;
13
+ text-align: left;
14
+
15
+ }
16
+ .interactionWindow a{
17
+ background: url("../images/bkg_btn-close.gif") repeat-x scroll 0 50% transparent !important;
18
+ border: 1px solid #EA7601;
19
+ color: #FFFFFF;
20
+ cursor: pointer;
21
+ float: right;
22
+ font: 12px/17px Arial,Helvetica,sans-serif;
23
+ padding: 0 12px 0 7px;
24
+ text-decoration: none !important;
25
+ }
26
+ .message-popup-content {
27
+ background: none repeat scroll 0 0 #FDF4EB;
28
+ padding: 21px 21px 10px;
29
+ }
30
+ .interactionWindow a span {
31
+ background: url("../images/bkg_btn-close2.gif") no-repeat scroll 0 50% transparent;
32
+ float: left;
33
+ padding-left: 19px;
34
+ }
35
+ .interactionWindow h2{
36
+ color: #644F3B;
37
+ font: bold 12px/19px Arial,Helvetica,sans-serif;
38
+ margin: 0;
39
+ padding: 0 10px;
40
+ }
41
+ .interactionWindow-mask {
42
+ background-color: #EFEFEF;
43
+ bottom: 0;
44
+ height: 100%;
45
+ left: 0;
46
+ opacity: 0.5;
47
+ position: absolute;
48
+ right: 0;
49
+ top: 0;
50
+ width: 100%;
51
+ z-index: 980;
52
+ }
53
+
54
+ #address_search_autocomplete { z-index:999; height:350px; overflow:auto;}
55
+ #address_search_autocomplete ul { border:1px solid #5c7989; background-color:#f9f5f0; }
56
+ #address_search_autocomplete li { text-align:left; border-bottom:1px solid #f4eee7; padding:2px 8px 1px 8px; cursor:pointer; }
57
+ #address_search_autocomplete li .amount { float:right; font-weight:bold; }
58
+ #address_search_autocomplete li.odd { background-color:#fffefb; }
59
+ #address_search_autocomplete li.selected { background-color:#f7e8dd; }
60
+
61
+ .validate-email-loader {position:absolute; margin:2px 2px 1px 4px;}
skin/frontend/base/default/qas/images/bkg_btn-close.gif ADDED
Binary file
skin/frontend/base/default/qas/images/bkg_btn-close2.gif ADDED
Binary file
skin/frontend/base/default/qas/js/intuitive.js ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Experian Qas Intuitive JS
3
+ *
4
+ * @category Experian
5
+ * @package Experian_Qas
6
+ * @copyright 2012 Experian
7
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
8
+ */
9
+ /**
10
+ * Quick Address Search form
11
+ */
12
+ Varien.addressSearchForm = Class.create();
13
+ Varien.addressSearchForm.prototype = {
14
+ initialize : function(form, field, emptyText, country, region, city, zip, street, street2){
15
+ this.form = $(form);
16
+ this.field = $(field);
17
+ this.emptyText = emptyText;
18
+
19
+ this.country = country;
20
+ this.region = region;
21
+ this.city = city;
22
+ this.zip = zip;
23
+ this.street = street;
24
+ this.street2 = street2;
25
+
26
+ Event.observe(this.field, 'focus', this.focus.bind(this));
27
+ Event.observe(this.field, 'blur', this.blur.bind(this));
28
+ this.blur();
29
+ },
30
+
31
+ focus : function(event){
32
+ if(this.field.value==this.emptyText){
33
+ this.field.value='';
34
+ }
35
+
36
+ },
37
+
38
+ blur : function(event){
39
+ if(this.field.value==''){
40
+ this.field.value=this.emptyText;
41
+ }
42
+ },
43
+
44
+ getQueryString : function() {
45
+ this.queryString = '';
46
+ var street = $(this.street).value;
47
+ var zip = $(this.zip).value;
48
+ var city = $(this.city).value;
49
+ var country = $(this.country).value;
50
+ this.queryString += QUERY_PARAM + '=' + encodeURIComponent(street) +
51
+ /*' ' + encodeURIComponent(zip) +
52
+ ' ' + encodeURIComponent(city) +*/
53
+ '&' + QUERY_COUNTRY + '=' + encodeURIComponent(country);
54
+
55
+ return this.queryString;
56
+ },
57
+
58
+ initAutocomplete : function(url, destinationElement){
59
+ new Ajax.Autocompleter(
60
+ this.field,
61
+ destinationElement,
62
+ url,
63
+ {
64
+ paramName: this.field.name,
65
+ callback: this.getQueryString.bind(this),
66
+ method: 'get',
67
+ minChars: 2,
68
+ updateElement: this._selectAutocompleteItem.bind(this),
69
+ onShow : function(element, update) {
70
+ if(!update.style.position || update.style.position=='absolute') {
71
+ update.style.position = 'absolute';
72
+ Position.clone(element, update, {
73
+ setHeight: false,
74
+ offsetTop: element.offsetHeight
75
+ });
76
+ }
77
+ Effect.Appear(update,{duration:0});
78
+ }
79
+
80
+ }
81
+ );
82
+ },
83
+
84
+ _selectAutocompleteItem : function(element){
85
+ if(typeof element.attributes.moniker != 'undefined'){
86
+ new Ajax.Request(
87
+ NORMALIZE_URL,
88
+ {
89
+ method: 'post',
90
+ parameters: QUERY_MONIKER+'='+element.attributes.moniker.value+'&'+QUERY_COUNTRY+'='+$(this.country).value,
91
+ onComplete: this.onComplete,
92
+ onFailure: function(response){
93
+ alert('An error occurred while processing your request');
94
+ this.onComplete;
95
+ },
96
+ onSuccess: function(response){
97
+ if (response && response.responseText){
98
+ if (typeof(response.responseText) == 'string') {
99
+ eval('result = ' + response.responseText);
100
+ }
101
+ $(this.street).value = result.street_1;
102
+ $(this.street2).value = result.street_2;
103
+ $(this.city).value = result.city;
104
+ $(this.zip).value = result.zip;
105
+
106
+ /* Special case for region option */
107
+ var optionValueToSelect = false;
108
+ $$('#' + this.region + ' option').each(function(option) {
109
+ if (option.text == result.region) {
110
+ optionValueToSelect = option.value;
111
+ }
112
+ });
113
+ if (optionValueToSelect != false) {
114
+ $(this.region).value = optionValueToSelect;
115
+ } else {
116
+ $(this.region).value = result.region;
117
+ }
118
+ }
119
+ }.bind(this)
120
+ }
121
+ )
122
+ }
123
+ }
124
+ }
skin/frontend/base/default/qas/js/searchengine.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Experian Qas Singleline and Verification search engine JS
3
+ *
4
+ * @category Experian
5
+ * @package Experian_Qas
6
+ * @copyright 2012 Experian
7
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
8
+ */
9
+
10
+ function saveAddress(addressForm, addressType) {
11
+ if (checkout.loadWaiting!=false) return;
12
+ var validator = new Validation(addressForm.form);
13
+ if (validator.validate()) {
14
+ checkout.setLoadWaiting(addressType);
15
+ new Ajax.Request(
16
+ addressForm.saveUrl,
17
+ {
18
+ method: 'post',
19
+ onComplete: addressForm.onComplete,
20
+ onSuccess: addressForm.onSave,
21
+ onFailure: checkout.ajaxFailure.bind(checkout),
22
+ parameters: Form.serialize(addressForm.form)
23
+ }
24
+ );
25
+ }
26
+ }