Site/server/controllers/checkoutController.js

265 lines
13 KiB
JavaScript

const { MercadoPagoConfig, Preference, Payment } = require('mercadopago');
const express = require('express');
const router = express.Router();
//const client = new MercadoPagoConfig({ accessToken: 'TEST-7218616229800258-090908-d403b108f1f9c31e432f525c8abb14b3-115139428' });
const client = new MercadoPagoConfig({ accessToken: 'APP_USR-7218616229800258-090908-6281afa294bbb2de7f68e1e336539ba1-115139428' });
var routes = function () {
router.post('/buy', function (req, res) {
console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${' called'}`);
const idprodutos = parseInt(req.body.idprodutos);
const idusuarios = parseInt(req.body.idusuarios);
const qtd = parseInt(req.body.qtd);
const sqlQuery = `SELECT
pdt.idprodutos,
pdt.valor,
sis.idsistemas,
sis.nome,
tpl.idtiposlicenca,
tpl.descricao,
(SELECT us.cpf from usuarios us WHERE us.idusuarios = ?) as cpf
FROM produtos pdt
INNER JOIN sistemas sis ON sis.idsistemas = pdt.idsistemas
INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca
WHERE pdt.idprodutos = ?`;
mysqlConnection.query(sqlQuery, [idusuarios, idprodutos], function (error, results, fields) {
if (error) {
return res.status(500).send({ error: 'Erro ao consultar o banco de dados.' });
}
const produto = results[0];
if (produto['idtiposlicenca'] == 6) {
const sqlGerarChave = `CALL GerarInserirChave(?, ?, ?, @SerialKey, @idChave);`;
mysqlConnection.query(sqlGerarChave, [produto['cpf'], 30, produto['idsistemas']], function (chaveError, resChave) {
if (chaveError) {
return res.status(500).send({ error: 'Erro ao gerar chave.' });
}
else {
const serial = resChave[0]?.[0]['SerialKey']
res.status(200).send({url: null, chave: serial});
}
})
}
else {
const sqlGetVenda = `SELECT * FROM produtosvendas WHERE idprodutos = ? AND idusuarios = ? AND quantidade = ? AND status IS NULL;`;
mysqlConnection.query(sqlGetVenda, [produto.idprodutos, idusuarios, qtd], function (getError, getVenda) {
if (getError) {
return res.status(500).send({ error: 'Erro ao consultar venda no banco de dados.' });
}
if (getVenda.length == 0) {
const sqlCreate = `INSERT INTO produtosvendas (idprodutos, idusuarios, quantidade, valor) VALUES (?, ?, ?, ?)`;
mysqlConnection.query(sqlCreate, [produto.idprodutos, idusuarios, qtd, qtd * produto.valor], function (createError, venda) {
if (createError) {
return res.status(500).send({ error: 'Erro ao criar venda no banco de dados.' });
}
const preference = new Preference(client);
const pref = {
body: {
items: [
{
title: produto.nome + " " + produto.descricao,
quantity: qtd,
unit_price: produto.valor
}
],
notification_url: 'https://zendioninc.com.br/api/checkout/webhook',
external_reference: "" + venda.insertId
}
};
//console.log(pref);
preference.create(pref)
.then(response => {
//console.log(response);
const newPreferenceId = response.id; // ID da nova preferência criada
// Atualiza o campo preference_id no banco de dados
const updateQuery = `UPDATE produtosvendas SET preference_id = ? WHERE idprodutosvendas = ?`;
mysqlConnection.query(updateQuery, [newPreferenceId, venda.insertId], function (updateError) {
if (updateError) {
return res.status(500).send({ error: 'Erro ao atualizar o preference_id no banco de dados.' });
}
// Redireciona para o checkout com a nova preferência
res.status(200).send({url: response.init_point});
//res.redirect(response.init_point);
});
})
.catch(error => {
console.error('Erro ao criar a preferência:', error);
return res.status(500).send({ error: 'Erro ao criar a preferência de pagamento.' });
});
});
}
else {
// Se já existir, redireciona para o checkout utilizando o preference_id existente
const init_point = `https://www.mercadopago.com.br/checkout/v1/redirect?pref_id=${getVenda[0].preference_id}`;
res.status(200).send({url: init_point});
//return res.redirect(init_point);
}
});
}
});
});
router.post('/webhook', function (req, res) {
const paymentData = req.body;
//console.log(paymentData);
// Verifica o tipo de notificação recebida
if (paymentData.type === 'payment') {
const paymentId = paymentData.data.id;
//console.log(paymentId);
// Consultar o status do pagamento no Mercado Pago usando o ID
const payment = new Payment(client);
payment.get({
id: paymentId,
})
.then(response => {
//console.log(response);
const vendaId = response.external_reference;
const status = response.status;
if (vendaId == null) {
console.error('ID da venda nao informado!');
return res.status(500).send('ID da venda nao informado!');
}
const updateQuery = `UPDATE produtosvendas SET status = ? WHERE idprodutosvendas = ?;`;
mysqlConnection.query(updateQuery, [status, vendaId], function (error) {
if (error) {
console.error('Erro ao atualizar status do pagamento no banco de dados:', error);
return res.status(500).send('Erro ao atualizar banco de dados.');
}
if (status === 'approved') {
// Pagamento foi aprovado, agora você pode liberar a licença
console.log('Pagamento aprovado!');
const getQuery = `SELECT
pdt.idsistemas,
usu.idusuarios,
usu.cpf,
tpl.dias
FROM produtosvendas pdv
INNER JOIN usuarios usu ON usu.idusuarios = pdv.idusuarios
INNER JOIN produtos pdt ON pdt.idprodutos = pdv.idprodutos
INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca
WHERE pdv.idprodutosvendas = ?;`;
mysqlConnection.query(getQuery, [vendaId], function (errGet, resGet) {
if (errGet) {
console.error('Erro ao consultar dados do usuario no banco de dados:', errGet);
return res.status(500).send('Erro ao consultar dados do usuario no banco de dados');
}
const dados = resGet[0];
const sqlGenerateSerial = `CALL GerarChave(?, ?, @serialKey); SELECT @serialKey AS serial;`;
mysqlConnection.query(sqlGenerateSerial, [dados.cpf, dados.dias], function (err, results) {
if (err) {
console.error('Erro ao gerar serial:', err);
return res.status(500).send('Erro ao gerar serial');
}
const serial = results[1][0].serial;
const sqlInsertSerial = `
INSERT INTO chaves (licenca, data_criacao, data_validade, idusuarios, usada, idsistemas)
VALUES (?, NOW(), DATE_ADD(NOW(), INTERVAL ? DAY), ?, 0, ?);
`;
mysqlConnection.query(sqlInsertSerial, [serial, dados.dias, dados.idusuarios, dados.idsistemas], function (errInsert) {
if (errInsert) {
console.error('Erro ao registrar serial:', errInsert);
return res.status(500).send('Erro ao registrar serial');
}
res.status(200).send('Licença liberada com sucesso!');
});
});
});
} else {
// Se o status for diferente de "approved", trate adequadamente (pendente, recusado, etc.)
console.log('Status do pagamento:', status);
res.status(200).send('Pagamento não aprovado.');
}
});
})
.catch(error => {
console.error('Erro ao consultar o pagamento:', error);
res.status(500).send('Erro ao consultar o pagamento.');
});
} else {
res.status(400).send('Tipo de notificação não suportado.');
}
});
router.get('/getProductsSell/:idsistemas', function (req, res) {
const idsistemas = parseInt(req.params.idsistemas);
ExecuteQuery(`SELECT
pdt.idprodutos,
pdt.valor,
tpl.descricao
FROM produtos pdt
INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca
WHERE pdt.idsistemas = ${idsistemas} AND pdt.ativado = 1
ORDER BY tpl.dias ASC;;`, req, res);
});
router.get('/getAllProducts/:idsistemas', function (req, res) {
const idsistemas = parseInt(req.params.idsistemas);
ExecuteQuery(`SELECT
pdt.idprodutos,
pdt.valor,
pdt.ativado,
tpl.idtiposlicenca,
tpl.descricao,
(SELECT COUNT(1) FROM produtosvendas pdv WHERE pdv.idprodutos = pdt.idprodutos) AS vendas,
(SELECT COUNT(1) FROM produtosvendas pdv WHERE pdv.idprodutos = pdt.idprodutos AND pdv.status = 'approved') AS compensados
FROM produtos pdt
INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca
WHERE pdt.idsistemas = ${idsistemas}
ORDER BY pdt.valor ASC;`, req, res);
});
router.post('/insertProduto', function (req, res, next) {
const idsistemas = parseInt(req.body.idsistemas);
const idtiposlicenca = parseInt(req.body.idtiposlicenca);
const valor = req.body.valor;
const ativado = req.body.ativado ? 1 : 0;
const sqlQuery = `INSERT INTO produtos (idsistemas, idtiposlicenca, valor, ativado)
VALUES (${idsistemas}, ${idtiposlicenca}, ${valor}, ${ativado});`;
ExecuteQuery(sqlQuery, req, res);
});
router.patch('/updateProduto', function (req, res, next) {
const idprodutos = parseInt(req.body.idprodutos);
const idsistemas = parseInt(req.body.idsistemas);
const idtiposlicenca = parseInt(req.body.idtiposlicenca);
const valor = req.body.valor;
const ativado = req.body.ativado ? 1 : 0;
const sqlQuery = `update produtos set
idtiposlicenca = ${idtiposlicenca},
valor = ${valor},
ativado = ${ativado}
where idprodutos = ${idprodutos};`;
ExecuteQuery(sqlQuery, req, res);
});
router.delete('/deleteProduto/:idprodutos', function (req, res, next) {
const idprodutos = req.params.idprodutos;
const sqlQuery = `DELETE FROM produtos WHERE idprodutos = ${idprodutos};`;
ExecuteQuery(sqlQuery, req, res);
});
return router;
}
module.exports = routes;