Fórum OpenCart Brasil

Por um e-commerce livre, confiável e profissional

Suporte geral sobre problemas técnicos para OpenCart v2.x.
#71799
Tenho uma Loja de Cursos com venda de inscrições e ingressos, preciso encontrar uma maneira que impeça o cliente de fazer a compra mais de 1 vez do mesmo produto (Ingresso) com o seu cadastro. teria uma maneira de bloquear, impedir que ele realize a compra mais de 1 vez baseado em CPF ou restringir por e-mail de cadastro?
No estoque está configurado quantidade 1 mas acontece que o cliente faz o cadastro e consegue comprar novamente mais de uma vez e usa seu cadastro para efetuar compra para outras pessoas o que gera transtornos. Isso é possível? não encontrei nenhum módulo ou extensão parecida. Agradeço se alguém tiver uma dica. Uso Opencart 2.1.0.1
Luís Cláudio
#71812
Pesquisei e também não achei, caso saiba o básico de programação TALVEZ dê certo a instrução abaixo.

Crie uma tabela em seu banco de dados.
Código: Selecionar todos
/* Cria tabela */
CREATE TABLE `oc_compras_do_cliente` (
	`product_id` INT(11) NOT NULL,
    `customer_id` INT(11) NOT NULL
) ENGINE=MyISAM;
Abra o arquivo https://github.com/opencart/opencart/bl ... r.php#L255 e na linha em amarelo adicione o código abaixo.
Código: Selecionar todos
/**
 * Verifica se o cliente já efetuou a compra de um determinado produto
 * Atenção! Substituir `oc_product_description` conforme seu banco de dados.
 *
 * @author Valdeir Psr <valdeir.naval@gmail.com>
 *
 * @param Int $product_id  Id do produto
 * @param Int $customer_id Id do cliente
 *
 * @return Array Retorna um array com dados customer_id, product_id e o nome do produto
 *               Caso o cliente ainda não tenha efetuado a compra do produto, retorna um array vazio.
 */
public function verificaSeOClienteJaComprou($product_id, $customer_id)
{
    $result = $this->db->query("SELECT cc.*, pd.name AS `product_name` FROM `oc_compras_do_cliente` cc LEFT JOIN `oc_product_description` pd ON (cc.product_id = pd.product_id) WHERE `customer_id` = '".(int)$customer_id."' AND `product_id` = '".(int)$product_id."' AND pd.language_id = '".(int)$this->config->get("config_language_id")."';");
    
    return $result->row;
}
Abra o arquivo https://github.com/opencart/opencart/bl ... out.php#L8 e na linha em amarelo adicione o código abaixo
Código: Selecionar todos
if ($this->customer->isLogged()) {
    $this->load->model("checkout/order");
    
    foreach($this->cart->getProducts() as $product) {
        $result = $this->model_checkout_order->verificaSeOClienteJaComprou($product['product_id'], $this->customer->getId());
        
        if (! empty($result)) {
            $this->session->data["warning"] = sprintf("Atenção! Não é possível comprar o produto %s mais de uma vez.", $result["product_name"]);
            $this->response->redirect($this->url->link('checkout/cart'));
        }
    }
}
Adicione o mesmo código do passo anterior nos arquivo (e local indicado):
https://github.com/opencart/opencart/bl ... n.php#L126
https://github.com/opencart/opencart/bl ... irm.php#L5

* Leia os códigos

Claro que dá para melhorar, mas primeiro vamos ver se realmente vai funcionar.
#71824
Um detalhe que acabei esquecendo.

Abra o arquivo https://github.com/opencart/opencart/bl ... r.php#L333 e na linha indicada adicione o código abaixo.
Código: Selecionar todos
$this->db->query('INSERT INTO `oc_compras_do_cliente` SET `product_id` = "'.(int)$order_product['order_product_id'].'", `customer_id` = "'.(int)$order_info['customer_id'].'"');
extensção -> Módulos

quando entro em Extenção -&gt; M[…]

Night games. One night, no worries Real Women P[…]

@Manoel Vidal Poderia me ajudar com 2 coisas n[…]

Looking for a partner for an unforgettable night? […]