From f2d70076bd1cb7e4953978cca6d147ced72f4fa2 Mon Sep 17 00:00:00 2001 From: gRoussac Date: Sun, 20 Oct 2013 23:52:48 +0200 Subject: [PATCH] [-] : Fix bug #PSCFV-4859, could not register invoice address or invoice country in OPC as guest, and phone not required in standard registration --- controllers/front/AddressController.php | 14 +- controllers/front/AuthController.php | 236 +++++++++++++---------- controllers/front/OrderOpcController.php | 15 ++ themes/default/authentication.tpl | 182 ++++++++++++++--- themes/default/js/order-opc.js | 2 +- themes/default/order-opc-new-account.tpl | 15 +- 6 files changed, 312 insertions(+), 152 deletions(-) diff --git a/controllers/front/AddressController.php b/controllers/front/AddressController.php index 0f8b09142..dcb34df88 100644 --- a/controllers/front/AddressController.php +++ b/controllers/front/AddressController.php @@ -225,19 +225,19 @@ class AddressControllerCore extends FrontController else // Update cart address $this->context->cart->autosetProductAddress(); - if ((bool)(Tools::getValue('select_address', false)) == true OR Tools::getValue('type') == 'invoice' && Configuration::get('PS_ORDER_PROCESS_TYPE')) - { + if ((bool)(Tools::getValue('select_address', false)) == true OR (Tools::getValue('type') == 'invoice' && Configuration::get('PS_ORDER_PROCESS_TYPE'))) $this->context->cart->id_address_invoice = (int)$address->id; - $this->context->cart->update(); - } - + elseif (Configuration::get('PS_ORDER_PROCESS_TYPE')) + $this->context->cart->id_address_invoice = (int)$this->context->cart->id_address_delivery; + $this->context->cart->update(); + if ($this->ajax) { $return = array( 'hasError' => (bool)$this->errors, 'errors' => $this->errors, - 'id_address_delivery' => $this->context->cart->id_address_delivery, - 'id_address_invoice' => $this->context->cart->id_address_invoice + 'id_address_delivery' => (int)$this->context->cart->id_address_delivery, + 'id_address_invoice' => (int)$this->context->cart->id_address_invoice ); die(Tools::jsonEncode($return)); } diff --git a/controllers/front/AuthController.php b/controllers/front/AuthController.php index 8e57e1260..58582cff2 100644 --- a/controllers/front/AuthController.php +++ b/controllers/front/AuthController.php @@ -392,7 +392,10 @@ class AuthControllerCore extends FrontController $firstnameAddress = Tools::getValue('firstname'); $_POST['lastname'] = Tools::getValue('customer_lastname'); $_POST['firstname'] = Tools::getValue('customer_firstname'); - + $addresses_types = array('address'); + if (!Configuration::get('PS_ORDER_PROCESS_TYPE') && Configuration::get('PS_GUEST_CHECKOUT_ENABLED') && Tools::getValue('invoice_address')) + $addresses_types[] = 'address_invoice'; + $error_phone = false; if (Configuration::get('PS_ONE_PHONE_AT_LEAST')) { @@ -402,10 +405,8 @@ class AuthControllerCore extends FrontController $error_phone = true; } elseif (((Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Configuration::get('PS_ORDER_PROCESS_TYPE')) - || (Configuration::get('PS_ORDER_PROCESS_TYPE') && !Tools::getValue('email_create'))) - && (!Tools::getValue('phone') && !Tools::getValue('phone_mobile'))) - $error_phone = true; - elseif (((Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Configuration::get('PS_ORDER_PROCESS_TYPE') && Tools::getValue('email_create'))) + || (Configuration::get('PS_ORDER_PROCESS_TYPE') && !Tools::getValue('email_create')) + || (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && Tools::getValue('email_create'))) && (!Tools::getValue('phone') && !Tools::getValue('phone_mobile'))) $error_phone = true; } @@ -480,37 +481,57 @@ class AuthControllerCore extends FrontController } else // if registration type is in one step, we save the address { - // Preparing address - $address = new Address(); $_POST['lastname'] = $lastnameAddress; $_POST['firstname'] = $firstnameAddress; - $address->id_customer = 1; - $this->errors = array_unique(array_merge($this->errors, $address->validateController())); - - // US customer: normalize the address - if ($address->id_country == Country::getByIso('US') && Configuration::get('PS_TAASC')) + $post_back = $_POST; + // Preparing addresses + foreach($addresses_types as $addresses_type) { - include_once(_PS_TAASC_PATH_.'AddressStandardizationSolution.php'); - $normalize = new AddressStandardizationSolution; - $address->address1 = $normalize->AddressLineStandardization($address->address1); - $address->address2 = $normalize->AddressLineStandardization($address->address2); + $$addresses_type = new Address(); + $$addresses_type->id_customer = 1; + + if ($addresses_type == 'address_invoice') + foreach($_POST as $key => &$post) + if (isset($_POST[$key.'_invoice'])) + $post = $_POST[$key.'_invoice']; + + $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController())); + if ($addresses_type == 'address_invoice') + $_POST = $post_back; + + // US customer: normalize the address + if ($$addresses_type->id_country == Country::getByIso('US') && Configuration::get('PS_TAASC')) + { + include_once(_PS_TAASC_PATH_.'AddressStandardizationSolution.php'); + $normalize = new AddressStandardizationSolution; + $$addresses_type->address1 = $normalize->AddressLineStandardization($$addresses_type->address1); + $$addresses_type->address2 = $normalize->AddressLineStandardization($$addresses_type->address2); + } + + if (!($country = new Country($$addresses_type->id_country)) || !Validate::isLoadedObject($country)) + $this->errors[] = Tools::displayError('Country cannot be loaded with address->id_country'); + $postcode = Tools::getValue('postcode'); + /* Check zip code format */ + if ($country->zip_code_format && !$country->checkZipCode($postcode)) + $this->errors[] = sprintf(Tools::displayError('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format)))); + elseif(empty($postcode) && $country->need_zip_code) + $this->errors[] = Tools::displayError('A Zip / Postal code is required.'); + elseif ($postcode && !Validate::isPostCode($postcode)) + $this->errors[] = Tools::displayError('The Zip / Postal code is invalid.'); + + if ($country->need_identification_number && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni')))) + $this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.'); + elseif (!$country->need_identification_number) + $$addresses_type->dni = null; + + if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) + if (!($country = new Country($$addresses_type->id_country, Configuration::get('PS_LANG_DEFAULT'))) || !Validate::isLoadedObject($country)) + $this->errors[] = Tools::displayError('The Country is invalid'); + $contains_state = isset($country) && is_object($country) ? (int)$country->contains_states: 0; + $id_state = isset($$addresses_type) && is_object($$addresses_type) ? (int)$$addresses_type->id_state: 0; + if ((Tools::isSubmit('submitAccount')|| Tools::isSubmit('submitGuestAccount')) && $contains_state && !$id_state) + $this->errors[] = Tools::displayError('This country requires you to choose a State.'); } - - if (!($country = new Country($address->id_country)) || !Validate::isLoadedObject($country)) - $this->errors[] = Tools::displayError('Country cannot be loaded with address->id_country'); - $postcode = Tools::getValue('postcode'); - /* Check zip code format */ - if ($country->zip_code_format && !$country->checkZipCode($postcode)) - $this->errors[] = sprintf(Tools::displayError('The Zip/Postal code you\'ve entered is invalid. It must follow this format: %s'), str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format)))); - elseif(empty($postcode) && $country->need_zip_code) - $this->errors[] = Tools::displayError('A Zip / Postal code is required.'); - elseif ($postcode && !Validate::isPostCode($postcode)) - $this->errors[] = Tools::displayError('The Zip / Postal code is invalid.'); - - if ($country->need_identification_number && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni')))) - $this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.'); - elseif (!$country->need_identification_number) - $address->dni = null; } if (!@checkdate(Tools::getValue('months'), Tools::getValue('days'), Tools::getValue('years')) && !(Tools::getValue('months') == '' && Tools::getValue('days') == '' && Tools::getValue('years') == '')) @@ -529,88 +550,89 @@ class AuthControllerCore extends FrontController if (!count($this->errors)) { - // if registration type is in one step, we save the address - if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount')) - if (!($country = new Country($address->id_country, Configuration::get('PS_LANG_DEFAULT'))) || !Validate::isLoadedObject($country)) - die(Tools::displayError()); - $contains_state = isset($country) && is_object($country) ? (int)$country->contains_states: 0; - $id_state = isset($address) && is_object($address) ? (int)$address->id_state: 0; - if ((Tools::isSubmit('submitAccount')|| Tools::isSubmit('submitGuestAccount')) && $contains_state && !$id_state) - $this->errors[] = Tools::displayError('This country requires you to choose a State.'); + $customer->active = 1; + // New Guest customer + if (Tools::isSubmit('is_new_customer')) + $customer->is_guest = !Tools::getValue('is_new_customer', 1); + else + $customer->is_guest = 0; + if (!$customer->add()) + $this->errors[] = Tools::displayError('An error occurred while creating your account.'); else { - $customer->active = 1; - // New Guest customer - if (Tools::isSubmit('is_new_customer')) - $customer->is_guest = !Tools::getValue('is_new_customer', 1); - else - $customer->is_guest = 0; - if (!$customer->add()) - $this->errors[] = Tools::displayError('An error occurred while creating your account.'); - else + foreach($addresses_types as $addresses_type) { - $address->id_customer = (int)$customer->id; - $this->errors = array_unique(array_merge($this->errors, $address->validateController())); - if (!count($this->errors) && (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') || $this->ajax || Tools::isSubmit('submitGuestAccount')) && !$address->add()) + $$addresses_type->id_customer = (int)$customer->id; + if ($addresses_type == 'address_invoice') + foreach($_POST as $key => &$post) + if (isset($_POST[$key.'_invoice'])) + $post = $_POST[$key.'_invoice']; + + $this->errors = array_unique(array_merge($this->errors, $$addresses_type->validateController())); + if ($addresses_type == 'address_invoice') + $_POST = $post_back; + if (!count($this->errors) && (Configuration::get('PS_REGISTRATION_PROCESS_TYPE') || $this->ajax || Tools::isSubmit('submitGuestAccount')) && !$$addresses_type->add()) $this->errors[] = Tools::displayError('An error occurred while creating your address.'); + } + if (!count($this->errors)) + { + if (!$customer->is_guest) + { + $this->context->customer = $customer; + $customer->cleanGroups(); + // we add the guest customer in the default customer group + $customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP'))); + if (!$this->sendConfirmationMail($customer)) + $this->errors[] = Tools::displayError('The email cannot be sent.'); + } else { - if (!$customer->is_guest) - { - $this->context->customer = $customer; - $customer->cleanGroups(); - // we add the guest customer in the default customer group - $customer->addGroups(array((int)Configuration::get('PS_CUSTOMER_GROUP'))); - if (!$this->sendConfirmationMail($customer)) - $this->errors[] = Tools::displayError('The email cannot be sent.'); - } - else - { - $customer->cleanGroups(); - // we add the guest customer in the guest customer group - $customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP'))); - } - $this->updateContext($customer); - $this->context->cart->id_address_delivery = Address::getFirstCustomerAddressId((int)$customer->id); - $this->context->cart->id_address_invoice = Address::getFirstCustomerAddressId((int)$customer->id); - - // If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated - $this->context->cart->update(); - - // Avoid articles without delivery address on the cart - $this->context->cart->autosetProductAddress(); - - Hook::exec('actionCustomerAccountAdd', array( - '_POST' => $_POST, - 'newCustomer' => $customer - )); - if ($this->ajax) - { - $return = array( - 'hasError' => !empty($this->errors), - 'errors' => $this->errors, - 'isSaved' => true, - 'id_customer' => (int)$this->context->cookie->id_customer, - 'id_address_delivery' => $this->context->cart->id_address_delivery, - 'id_address_invoice' => $this->context->cart->id_address_invoice, - 'token' => Tools::getToken(false) - ); - die(Tools::jsonEncode($return)); - } - // if registration type is in two steps, we redirect to register address - if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) - Tools::redirect('index.php?controller=address'); - - if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer(Tools::getValue('back'))) - Tools::redirect(html_entity_decode($back)); - - // redirection: if cart is not empty : redirection to the cart - if (count($this->context->cart->getProducts(true)) > 0) - Tools::redirect('index.php?controller=order&multi-shipping='.(int)Tools::getValue('multi-shipping')); - // else : redirection to the account - else - Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account')); + $customer->cleanGroups(); + // we add the guest customer in the guest customer group + $customer->addGroups(array((int)Configuration::get('PS_GUEST_GROUP'))); } + $this->updateContext($customer); + $this->context->cart->id_address_delivery = (int)Address::getFirstCustomerAddressId((int)$customer->id); + $this->context->cart->id_address_invoice = (int)Address::getFirstCustomerAddressId((int)$customer->id); + if (isset($address_invoice) && Validate::isLoadedObject($address_invoice)) + $this->context->cart->id_address_invoice = (int)$address_invoice->id; + + // If a logged guest logs in as a customer, the cart secure key was already set and needs to be updated + $this->context->cart->update(); + + // Avoid articles without delivery address on the cart + $this->context->cart->autosetProductAddress(); + + Hook::exec('actionCustomerAccountAdd', array( + '_POST' => $_POST, + 'newCustomer' => $customer + )); + if ($this->ajax) + { + $return = array( + 'hasError' => !empty($this->errors), + 'errors' => $this->errors, + 'isSaved' => true, + 'id_customer' => (int)$this->context->cookie->id_customer, + 'id_address_delivery' => $this->context->cart->id_address_delivery, + 'id_address_invoice' => $this->context->cart->id_address_invoice, + 'token' => Tools::getToken(false) + ); + die(Tools::jsonEncode($return)); + } + // if registration type is in two steps, we redirect to register address + if (!Configuration::get('PS_REGISTRATION_PROCESS_TYPE') && !$this->ajax && !Tools::isSubmit('submitGuestAccount')) + Tools::redirect('index.php?controller=address'); + + if (($back = Tools::getValue('back')) && $back == Tools::secureReferrer(Tools::getValue('back'))) + Tools::redirect(html_entity_decode($back)); + + // redirection: if cart is not empty : redirection to the cart + if (count($this->context->cart->getProducts(true)) > 0) + Tools::redirect('index.php?controller=order&multi-shipping='.(int)Tools::getValue('multi-shipping')); + // else : redirection to the account + else + Tools::redirect('index.php?controller='.(($this->authRedirection !== false) ? urlencode($this->authRedirection) : 'my-account')); } } } diff --git a/controllers/front/OrderOpcController.php b/controllers/front/OrderOpcController.php index 7e9bc39ca..2b03955a6 100644 --- a/controllers/front/OrderOpcController.php +++ b/controllers/front/OrderOpcController.php @@ -445,6 +445,21 @@ class OrderOpcControllerCore extends ParentOrderController 'phone_mobile_invoice' => Tools::htmlentitiesUTF8($address_invoice->phone_mobile), 'id_country_invoice' => (int)($address_invoice->id_country), 'id_state_invoice' => (int)($address_invoice->id_state), + 'id_address_invoice' => $id_address_invoice, + 'invoice_company' => Tools::htmlentitiesUTF8($address_invoice->company), + 'invoice_lastname' => Tools::htmlentitiesUTF8($address_invoice->lastname), + 'invoice_firstname' => Tools::htmlentitiesUTF8($address_invoice->firstname), + 'invoice_vat_number' => Tools::htmlentitiesUTF8($address_invoice->vat_number), + 'invoice_dni' => Tools::htmlentitiesUTF8($address_invoice->dni), + 'invoice_address' => $this->context->cart->id_address_invoice !== $this->context->cart->id_address_delivery, + 'invoice_address1' => Tools::htmlentitiesUTF8($address_invoice->address1), + 'invoice_address2' => Tools::htmlentitiesUTF8($address_invoice->address2), + 'invoice_postcode' => Tools::htmlentitiesUTF8($address_invoice->postcode), + 'invoice_city' => Tools::htmlentitiesUTF8($address_invoice->city), + 'invoice_phone' => Tools::htmlentitiesUTF8($address_invoice->phone), + 'invoice_phone_mobile' => Tools::htmlentitiesUTF8($address_invoice->phone_mobile), + 'invoice_id_country' => (int)($address_invoice->id_country), + 'invoice_id_state' => (int)($address_invoice->id_state), ); } diff --git a/themes/default/authentication.tpl b/themes/default/authentication.tpl index 94ae7614c..043854730 100644 --- a/themes/default/authentication.tpl +++ b/themes/default/authentication.tpl @@ -53,16 +53,15 @@ var countriesNeedZipCode = new Array(); {/if} {/foreach} {/if} -$(function(){ldelim} - $('.id_state option[value={if isset($smarty.post.id_state)}{$smarty.post.id_state|intval}{else}{if isset($address)}{$address->id_state|intval}{/if}{/if}]').attr('selected', true); -{rdelim}); //]]> {literal} $(document).ready(function() { $('#company').on('input',function(){ vat_number(); }); - vat_number(); + $('#company_invoice').on('input',function(){ + vat_number_invoice(); + }); function vat_number() { if ($('#company').val() != '') @@ -70,6 +69,18 @@ $(document).ready(function() { else $('#vat_number').hide(); } + function vat_number_invoice() + { + if ($('#company_invoice').val() != '') + $('#vat_number_block_invoice').show(); + else + $('#vat_number_block_invoice').hide(); + } + vat_number(); + vat_number_invoice(); +{/literal} + $('.id_state option[value={if isset($smarty.post.id_state)}{$smarty.post.id_state|intval}{/if}]').prop('selected', true); +{literal} }); {/literal} @@ -90,6 +101,10 @@ $(document).ready(function() { submitFunction(); return false; }); + $('#invoice_address').click(function() { + bindCheckbox(); + }); + bindCheckbox(); }); function submitFunction() { @@ -140,6 +155,24 @@ $(document).ready(function() { } }); } + function bindCheckbox() + { + if ($('#invoice_address:checked').length > 0) + { + $('#opc_invoice_address').slideDown('slow'); + if ($('#company_invoice').val() == '') + $('#vat_number_block_invoice').hide(); + updateState('invoice'); + updateNeedIDNumber('invoice'); + updateZipCode('invoice'); +{/literal} + $('.id_state option[value={if isset($smarty.post.id_state)}{$smarty.post.id_state|intval}{/if}]').prop('selected', true); + $('.id_state_invoice option[value={if isset($smarty.post.id_state_invoice)}{$smarty.post.id_state_invoice|intval}{/if}]').prop('selected', true); +{literal} + } + else + $('#opc_invoice_address').slideUp('slow'); + } {/literal} - {elseif $field_name eq "Country:name" || $field_name eq "country"} + {elseif $field_name eq "Country:name" || $field_name eq "country"}

- {elseif $field_name eq "State:name"} + {elseif $field_name eq "State:name"} {assign var='stateExist' value=true}

@@ -319,11 +357,6 @@ $(document).ready(function() {

- {elseif $field_name eq "phone"} -

- - -

{/if} {/foreach} {if $stateExist eq false} @@ -340,19 +373,106 @@ $(document).ready(function() {

{/if} +

+ + +

- +

+ + +

+ -
-

{l s='Tax identification'}

-

- - - {l s='DNI / NIF / NIE'} -

-
{$HOOK_CREATE_ACCOUNT_FORM}

*{l s='Required field'} @@ -532,7 +652,7 @@ $(document).ready(function() {

@@ -565,13 +685,13 @@ $(document).ready(function() {

{if isset($one_phone_at_least) && $one_phone_at_least} -

{l s='You must register at least one phone number.'}

- {/if} +

{l s='You must register at least one phone number.'}

+ {/if}

-

+

diff --git a/themes/default/js/order-opc.js b/themes/default/js/order-opc.js index 6480375fb..cbfb44f9c 100644 --- a/themes/default/js/order-opc.js +++ b/themes/default/js/order-opc.js @@ -308,7 +308,7 @@ function saveAddress(type) params += 'address2='+encodeURIComponent($('#address2'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; params += 'postcode='+encodeURIComponent($('#postcode'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; params += 'city='+encodeURIComponent($('#city'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; - params += 'id_country='+encodeURIComponent($('#id_country').val())+'&'; + params += 'id_country='+encodeURIComponent($('#id_country'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; if ($('#id_state'+(type == 'invoice' ? '_invoice' : '')).val()) params += 'id_state='+encodeURIComponent($('#id_state'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; params += 'other='+encodeURIComponent($('#other'+(type == 'invoice' ? '_invoice' : '')).val())+'&'; diff --git a/themes/default/order-opc-new-account.tpl b/themes/default/order-opc-new-account.tpl index 676ee7b11..c96437cc3 100644 --- a/themes/default/order-opc-new-account.tpl +++ b/themes/default/order-opc-new-account.tpl @@ -86,7 +86,6 @@ else $('#vat_number_block_invoice').hide(); } - $(document).ready(function() { $('#company').on('input',function(){ vat_number(); @@ -96,6 +95,10 @@ }); vat_number(); vat_number_invoice(); + {/literal} + $('.id_state option[value={if isset($guestInformations.id_state)}{$guestInformations.id_state|intval}{/if}]').prop('selected', true); + $('.id_state_invoice option[value={if isset($guestInformations.id_state_invoice)}{$guestInformations.id_state_invoice|intval}{/if}]').prop('selected', true); + {literal} }); {/literal} @@ -279,7 +282,7 @@

- +

@@ -289,7 +292,7 @@

{l s='Invoice address'}

{foreach from=$inv_all_fields item=field_name} {if $field_name eq "company" && $b2b_enable} -

+

@@ -375,13 +378,13 @@

{if isset($one_phone_at_least) && $one_phone_at_least} -

{l s='You must register at least one phone number.'}

+

{l s='You must register at least one phone number.'}

{/if} -

+

-

+