Magento Forum

   
Page 2 of 2
Campos: RG / CPF / CNPJ
 
upwebstore
Jr. Member
 
Total Posts:  29
Joined:  2012-09-19
 

pessoal

estou tentando fazer uma validacao de duplicidade de CPF…

alguem tem algo assim?

o sistema ja validade se o CPF é valido
tbem valida duplicidade de e-mail (normal, isso ja vem e todo o magento)

agora eu queria validar duplicidade de CPF, ainda nao consegui nada
alguem conseguiu?

 
Magento Community Magento Community
Magento Community
Magento Community
 
thiagotognoli
Jr. Member
 
Total Posts:  20
Joined:  2008-10-07
 

<?php
/**
* Thiago Tognoli
*/
class Comerciocom_Customerbr_Model_Resource_Customer_Customer extends Mage_Customer_Model_Resource_Customer
{

/**
* Check customer scope, email and confirmation key before saving
*
* @param Mage_Customer_Model_Customer $customer
* @throws Mage_Customer_Exception
* @return Mage_Customer_Model_Resource_Customer
*
* adicionado verificação se cpf/cnpj é único
*/
protected function _beforeSave(Varien_Object $customer)
{
parent::_beforeSave($customer);
$adapter = $this->_getWriteAdapter();

//verifica se taxvat é único
if ($customer->getAttribute(’cpfcnpj’)->getIsRequired() && $customer->getAttribute(’cpfcnpj’)->getIsUnique()) {

$attributeTaxvat = $customer->getAttribute(’cpfcnpj’);

$valueTaxvat = $customer->getCpfcnpj();
$bindTaxvat = array(
//’entity_type_id’ => $this->getTypeId(),
‘attribute_id’ => $attributeTaxvat->getId(),
‘value’ => $valueTaxvat
);
$selectTaxvat = $adapter->select()
->from(array(’cev’ => $attributeTaxvat->getBackend()->getTable()))
//, $attribute->getBackend()->getEntityIdField())
//->where(’entity_type_id = :entity_type_id’)
->where(’attribute_id = :attribute_id’)
->where(’value = :value’);
if ($customer->getSharingConfig()->isWebsiteScope()) {
$bindTaxvat[’website_id’] = (int) $customer->getWebsiteId();
$selectTaxvat->where(’website_id = :website_id’);
}
if ($customer->getId()) {
$bindTaxvat[’entity_id’] = (int) $customer->getId();
$selectTaxvat->where(’cev.entity_id != :entity_id’);
}

$selectTaxvat->join(array(’ce’ => $this->getEntityTable()),
‘ce.entity_id=cev.entity_id’);

$resultTaxvat = $adapter->fetchOne($selectTaxvat, $bindTaxvat);
if ($resultTaxvat) {
throw Mage::exception(
‘Mage_Customer’, Mage::helper(’customerbr’)->__(’Este CPF/CNPJ já está cadastrado nessa loja.’),
Comerciocom_Customerbr_Model_Customer::EXCEPTION_TAXVAT_EXISTS
);
}

}

return $this;
}
}

 
Magento Community Magento Community
Magento Community
Magento Community
 
upwebstore
Jr. Member
 
Total Posts:  29
Joined:  2012-09-19
 

cara, muuito obrigado pelo codigo

eu tentei inserir o codigo em costumer no caminho: \app\code\core\Mage\Customer\Model\Resource
estou fazendo testes em localhost antes de colocar na pagina online.

inserir esse codigo depois da validacao do e-mail e antes do // set confirmation key logic.

estava relendo, linha a linha e notei que a variavel $selectTaxvat gera um erro… não entendi o por que e nem sei o por que
eu posso deixar o codigo todo la e apenas comentar aonde esse variavel é usada, que nada da erro
mas tambem não valida né (obvio ehehe).

tbem notei que ela esta comentada em diversos pedaços…

o que pode estar errado, estou usando ela da seguinte forma:

$selectTaxvat = $adapter->select()->from(array(’cev’ => $attributeTaxvat->getBackend()->getTable()))->where(’attribute_id = :attribute_id’)->where(’value = :value’);

e o erro segue em anexo .txt

vlw a força

 
Magento Community Magento Community
Magento Community
Magento Community
 
thiagotognoli
Jr. Member
 
Total Posts:  20
Joined:  2008-10-07
 

Não encontrei o log, mas esse código está 100% funcional, uso ele em meu módulo de cadastro para brasileiros, irá precisa somente de uma adapatção em:

throw Mage::exception(
‘Mage_Customer’, Mage::helper(’customerbr’)->__(’Este CPF/CNPJ já está cadastrado nessa loja.’),
Comerciocom_Customerbr_Model_Customer::EXCEPTION_TAXVAT_EXISTS
);

e o tratamento desse erro posteriormente.

Caso esteja fazendo o uso desse código fora de uma classe Resource com certeza terá alguns problemas, principalmente em:

$adapter = $this->_getWriteAdapter();

$this->getEntityTable()

e pegar o objeto $customer

claro que pode ser resolvido mas acredito que o mais recomendável é fazer da forma que passei sobrescrevendo nas config o Mage_Customer_Model_Resource_Customer

nem que seja para criar um método de validação nesse Resource, sem ser necessariamente no beforeSave

 
Magento Community Magento Community
Magento Community
Magento Community
 
upwebstore
Jr. Member
 
Total Posts:  29
Joined:  2012-09-19
 

cara, muito obrigado mesmo pela tua ajuda…
eu até entendi a logica do desenvolvimento....
mas eu não manjo muito dos arquivos no magento, como eles se conversam entre si, etc…
dentro do arquivo Costumer, tem a função savebefore, que está dentro da classe:
class Mage_Customer_Model_Resource_Customer extends Mage_Eav_Model_Entity_Abstract

não entendi como chamou a tua função de:
class Comerciocom_Customerbr_Model_Resource_Customer_Customer extends Mage_Customer_Model_Resource_Customer

outra coisa foi o atritubo cpfcnpj (estou usando o taxvat como CPF).
$customer->getAttribute(’cpfcnpj’)

eu tentei colocar o seu código dentro da minha função normal pra testar, mas não adianta nada, uma vez que tua chamada de classe, função e atributo são diferentes.

peço desculpas pelo minha ignorancia e falta de conhecimento quanto aos arquivos de magento… sei que é chato eu ficar pedindo um monte de explicações aqui, mas se puder me ajudar, vou ficar muito grato.

meu e-mail é gabrielwjesus@gmail.com

 
Magento Community Magento Community
Magento Community
Magento Community
 
thiagotognoli
Jr. Member
 
Total Posts:  20
Joined:  2008-10-07
 
upwebstore - 12 November 2012 05:26 PM

cara, muito obrigado mesmo pela tua ajuda…
eu até entendi a logica do desenvolvimento....
mas eu não manjo muito dos arquivos no magento, como eles se conversam entre si, etc…
dentro do arquivo Costumer, tem a função savebefore, que está dentro da classe:
class Mage_Customer_Model_Resource_Customer extends Mage_Eav_Model_Entity_Abstract

não entendi como chamou a tua função de:
class Comerciocom_Customerbr_Model_Resource_Customer_Customer extends Mage_Customer_Model_Resource_Customer

outra coisa foi o atritubo cpfcnpj (estou usando o taxvat como CPF).
$customer->getAttribute(’cpfcnpj’)

eu tentei colocar o seu código dentro da minha função normal pra testar, mas não adianta nada, uma vez que tua chamada de classe, função e atributo são diferentes.

peço desculpas pelo minha ignorancia e falta de conhecimento quanto aos arquivos de magento… sei que é chato eu ficar pedindo um monte de explicações aqui, mas se puder me ajudar, vou ficar muito grato.

meu e-mail é gabrielwjesus@gmail.com

Vamos lá, vou tentar explicar com mais detalhes.

Primeiro a classe: Comerciocom_Customerbr_Model_Resource_Customer_Customer deve ser renomeada seguindo o nome do seu módulo e a localização que irá colocar na pasta do seu módulo, esse é o básico de desenvolvimento de módulo, por exemplo essa classe está localizada a partir da raíz do Magento em: /app/code/local***/Comerciocom/Customerbr/Model/Resource/Customer/Customer.php

***(pode ser community também, depende onde seu módulo está)
então a primeira coisa é renomear a classe de acordo com seu módulo, ok ?

Segundo, avise o magento que quer sobrescrever a classe Mage_Customer_Model_Resource_Customer, como, no config.xml:
<config>
...
<global>
...
<models>
...
<customer_resource>
<rewrite>
<customer>Comerciocom_Customerbr_Model_Resource_Customer_Customer</customer>
</rewrite>
</customer_resource>
...........

Terceiro, acerte a exception:
Comerciocom_Customerbr_Model_Customer_Customer::EXCEPTION_TAXVAT_EXISTS não irá existir ok, então ou crie ou simplesmente exclua, acredito que não irá fazer falta, a exceção irá assumir um código 0 padrão:
de:
throw Mage::exception(
‘Mage_Customer’, Mage::helper(’customerbr’)->__(’Este CPF/CNPJ já está cadastrado nessa loja.’),
Comerciocom_Customerbr_Model_Customer_Customer::EXCEPTION_TAXVAT_EXISTS
);
para:
throw Mage::exception(
‘Mage_Customer’, Mage::helper(’customerbr’)->__(’Este CPF/CNPJ já está cadastrado nessa loja.’)
);

Quarto, criei o atributo no banco cpfcnpj, há muito tempo, agora nçao me lembro o motivo exato, sei que o atributo taxvat me impedia de fazer algo ou causava algum problema por isso não usei o mesmo, e criei um próprio, mas se o taxvat te atende troque o cpfcnpj no código pelo taxvat, acho que para verificação de duplicidade irá funcionar ok

Quarto, se você sobrescrever a classe resource_customer no config.xml ele irá usar a sua classe como resource do customer e o método _beforeSave será sempre chamado quando tentar salvar um cliente automaticamente, ele não precisa ser chamado, o magento irá chamar sempre e caso exista esse cpf será gerada a exceção, que agora não me lembro se eu alterei alguma coisa ou o magento trata essa exceção automaticamente e mostra para o usuário impedindo continuar o cadastro, mas como disse, pode criar um método com outro nome e chamar ele manualmente, como ? depende de onde estiver, por exemplo tem o model do customer em uma variável acessível, então faça $customer->getResource()->metodoValidacao($customer) ,e com try catch trate a exceção que pode ser gerada, isso poderia ser feito de uma forma mais bonita sobrescrevendo o model customer, e chamando o método do resource dentro dele sem ser necessário passar o $customer como parâmetro, mas dessa forma acho que vá resolver.

Bom acho que é isso, espero ter ajudado, somente tem um porém, se deseja trabalhar com magento recomendo dar uma estudada no começo é bem diferente mas depois que pega o jeito… existem vários tutoriais na net para começar a criar módulos, etc, depois com o tempo você começa a estudar o código do magento e entender melhor como as coisas funcionam e se basear no próprio magento para coisas mais avançadas.

 
Magento Community Magento Community
Magento Community
Magento Community
 
upwebstore
Jr. Member
 
Total Posts:  29
Joined:  2012-09-19
 

Bom, vamos la, o que eu fiz…

1)
criei o seguinte caminho:
app\code\local\Comerciocom\Customerbr\Model\Customer
e então criei o arquivo:
Customer.php

e la dentro inseri o seu código inteiro.

2)
busquei no caminho:
app\code\core\Mage\Customer\etc
pelo arquivo
config.xml

la dentro, procurei as linhas que voce mencionou para inserir a chamada do meu novo código:
está da seguinte forma:
<customer_resource>
<class>Mage_Customer_Model_Resource</class>
<deprecatedNode>customer_mysql4</deprecatedNode>
<entities>
<entity>
<table>customer_entity</table>
</entity>
<address_entity>
<table>customer_address_entity</table>
</address_entity>
<value_prefix>
<table>customer_entity</table>
</value_prefix>
<customer_group>
<table>customer_group</table>
</customer_group>
<eav_attribute>
<table>customer_eav_attribute</table>
</eav_attribute>
<eav_attribute_website>
<table>customer_eav_attribute_website</table>
</eav_attribute_website>
<form_attribute>
<table>customer_form_attribute</table>
</form_attribute>
</entities>
</customer_resource>

e troquei tudo isso por:
<customer_resource>
<rewrite>
<customer>Comerciocom_Customerbr_Model_Resource_Customer_Customer</customer>
</rewrite>
</customer_resource>

Conforme me indicou.

3)
Corrigi o exception, conforme pediu.

4) testei para ver o que dava
e na hora de clicar em criar nova conta da um erro gigante, mas segue só a primeira linha do erro:

Fatal error: Call to a member function loadByCode() on a non-object in C:\wamp\www\upwebshop\app\code\core\Mage\Eav\Model\Entity\Attribute\Abstract.php on line 118 Call Stack #TimeMemoryFunctionLocation 10.0019380776{main}( )..\

o que ocorre, é que eu ainda preciso validar se a duplicidade no e-mail e se há duplicidade de taxvat também.
por isso não posso sobreescrever o arquivo Costumer.php original.
Até pensei em adicionar o seu código dentro do arquivo original do Costumer.php…

adiconando mais um detalhe,
na linha: $valueTaxvat = $customer->getCpfcnpj();
voce faz uso de uma função getCpfcnpj();
aonde esse função existe?

bom, é a ultima tentativa, se não der certo.. dexa quieto =(
e volto a estudar mais, muito obrigado pela força..

 
Magento Community Magento Community
Magento Community
Magento Community
 
upwebstore
Jr. Member
 
Total Posts:  29
Joined:  2012-09-19
 

Deu certo, muito obrigado pela ajuda .... ta funcionando certinho agora

 
Magento Community Magento Community
Magento Community
Magento Community
 
botam
Jr. Member
 
Total Posts:  7
Joined:  2012-12-30
 

Por que lojas virtual no Brasil Não Aceitam RNE só RG

Muitas vezes que eu tentei fazer uma compra online só para descobrir que o Site só aceitará um RG, não RNE. Empresas acha estrangeiros aqui no Brasil não fazem compras online. Imagino que eles perdem muito dinheiro por causa disso!

 
Magento Community Magento Community
Magento Community
Magento Community
 
danillorios
Jr. Member
 
Total Posts:  1
Joined:  2012-09-25
 
danielbarbosa09 - 02 March 2011 06:50 AM

DEPOIS DE MUITO PESQUISAR ENCONTREI A SOLUÇÃO DEFINITIVA PARA A QUESTÃO DO CPF E CNPJ.


GUIA DE IMPLEMENTACAO CPF CNPJ

Ola amigo, nao consegui acessar seu link, ele ainda esta disponivel? Abraco

 
Magento Community Magento Community
Magento Community
Magento Community
 
igornassif
Jr. Member
 
Total Posts:  5
Joined:  2014-03-12
 

Preciso importar para um ERP os dados do cliente, utilizando a API SOAP V2.

Como posso pegar os atributos criados com os métodos customerCustomerList e customerCustomerInfo?

 
Magento Community Magento Community
Magento Community
Magento Community
Magento Community
Magento Community
    Back to top
Page 2 of 2