deivisonarthur / OSC-Magento-Brasil-6-Pro

One Step Checkout Brasil 6 Pro
75 stars 103 forks source link

Validação de CPF na tela de editar dados do usuário #92

Open gubacelar opened 9 years ago

gubacelar commented 9 years ago

Olá, estou com um problema. Ao tentar editar os dados de um usuário em customer/account/edit/, ele alerta que o CPF informado ja existe.

frontend/base/default/onesetpcheckout/js/validation.js

Validation.add('validate-taxvat', VALIDATE_TAXVAT_ERROR, function (value) {
        if (validaCPF(value, 0)) {
            var ok = false;
            var url = BASE_URL + '/onestepcheckout/ajax/check_taxvat/';
            new Ajax.Request(url, {
                method: 'post',
                asynchronous: false,
                parameters: 'taxvat=' + encodeURIComponent(value),
                onSuccess: function (transport) {
                    var obj = response = eval('(' + transport.responseText + ')');
                    validateTrueEmailMsg = obj.status_desc;
                    if (obj.result !== 'clean') {
                        Validation.get('validate-taxvat').error = 'CPF/CNPJ já cadastrado';
                        ok = false;
                    } else {
                        ok = true;
                    }
                },
                onComplete: function () {
                    if ($('advice-validate-taxvat-taxvat')) {
                        $('advice-validate-taxvat-taxvat').remove();
                    }
                }
            });
            return ok;
        } else {
            Validation.get('validate-taxvat').error = 'O CPF/CNPJ informado \xE9 inválido';
        }
    });

Ele faz uma requisição para /onestepcheckout/ajax/check_taxvat/ onde é feita uma pesquisa se o CPF já existe. Caso exista ele vai falar dar um erro informando que o CPF já existe, porém ele não verifica se o CPF existente é o do usuário logado que quer editar seus outros dados. Sendo assim se torna impossível editar os dados do usuário pois o CPF cadastrado já existe (o dele).

controllers/AjaxController.php

public function check_taxvatAction()
    {

        $taxvat = $this->getRequest()->getParam('taxvat');
        $data['result'] = 'clean';
        if ($taxvat) {
            $storeId = Mage::app()->getStore()->getId();
            $cli = Mage::getResourceModel('customer/customer_collection')
                ->addAttributeToFilter('taxvat', array('eq' => $taxvat))
                ->addAttributeToFilter('store_id', $storeId)
                ->setPageSize(1)
                ->count();
            if ($cli) {
                $data['result'] = 'exists';
            } else {
                $taxvat = preg_replace("/[^0-9]/", "", $taxvat);
                $cli = Mage::getResourceModel('customer/customer_collection')
                    ->addAttributeToFilter('taxvat', array('eq' => $taxvat))
                    ->addAttributeToFilter('store_id', $storeId)
                    ->getSize();
                if ($cli) {
                    $data['result'] = 'exists';
                }
            }
        }
        $this->getResponse()->setBody(Zend_Json::encode($data));
    }
gubacelar commented 9 years ago

Não sei se é a melhor solução, mas fiz um reescrevi o controller e sobrescrevi o método. Não é muito elegante mas esta funcionando. Alguma solução?

public function check_taxvatAction()
    {
        $taxvat  = $this->getRequest()->getParam('taxvat');
        $is_edit = false;

        if (Mage::getSingleton('customer/session')->isLoggedIn()) {
          $referer = array_values(array_filter(explode('/', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH))));
          $is_edit = $referer[0] == 'customer' && $referer[1] == 'account' && $referer[2] == 'edit';
        }

        $data['result'] = 'clean';
        if ($taxvat) {
            $storeId = Mage::app()->getStore()->getId();
            $cli = Mage::getResourceModel('customer/customer_collection')
                ->addAttributeToFilter('taxvat', array('eq' => $taxvat))
                ->addAttributeToFilter('store_id', $storeId);

                //Se a página de onde a requisição veio for a customer/account/edit remove o usuario logado
                // da pesquisa de cpf
                if($is_edit) {
                     $customer_id = Mage::getSingleton('customer/session')->getCustomer()->getId();
                     $cli = $cli->addAttributeToFilter('entity_id', array('neq' => $customer_id));
                 }

            $cli = $cli ->setPageSize(1)
                        ->count();

            if ($cli) {
                $data['result'] = 'exists';
            } else {
                $taxvat = preg_replace("/[^0-9]/", "", $taxvat);
                $cli = Mage::getResourceModel('customer/customer_collection')
                    ->addAttributeToFilter('taxvat', array('eq' => $taxvat))
                    ->addAttributeToFilter('store_id', $storeId)
                    ->getSize();
                if ($cli) {
                    $data['result'] = 'exists';
                }
            }
        }
        $this->getResponse()->setBody(Zend_Json::encode($data));
    }
isaaclopes commented 9 years ago

ola @gubacelar voce pode tirar no próprio arquivo a inclusão da classe de validação. https://github.com/deivisonarthur/OSC-Magento-Brasil-6-Pro/blob/master/app/design/frontend/base/default/template/onestepcheckout/customer/form/edit.phtml#L166

remove $('taxvat').addClassName('validate-taxvat'); acredito que resolva seu problema.

ps. não costumo deixar o email e cpf ser alterado ate por questão de segurança.

gubacelar commented 9 years ago

Ola @isaaclopes, obrigado pela resposta. Mas removendo essa validação o usuário ainda vai poder colocar um CPF igual a de outra pessoa ja cadastrada na hora da edição.

Acredito que a melhor forma seria não deixar o CPF editável mesmo. Vou propor para o pessoal aqui.

Muito obrigado.