├── c2p ├── img │ ├── readme-img-1.png │ ├── readme-img-2.png │ ├── readme-img-3.png │ ├── readme-img-4.png │ ├── readme-img-5.png │ ├── readme-img-6.png │ └── readme-img-7.png ├── public │ ├── images │ │ ├── favicon.ico │ │ └── mercantil-logo.png │ ├── js │ │ ├── main.js │ │ └── interface.js │ └── styles │ │ └── styles.css ├── .env ├── config.js ├── package.json ├── modules │ ├── crypto.js │ └── c2p.js ├── index.js ├── readme.md └── views │ └── index.ejs ├── scp ├── img │ ├── readme-img-1.png │ ├── readme-img-2.png │ ├── readme-img-3.png │ ├── readme-img-4.png │ ├── readme-img-5.png │ ├── readme-img-6.png │ └── readme-img-7.png ├── public │ ├── images │ │ ├── favicon.ico │ │ └── mercantil-logo.png │ ├── js │ │ ├── main.js │ │ └── interface.js │ └── styles │ │ └── styles.css ├── .env ├── config.js ├── package.json ├── modules │ ├── scp.js │ └── crypto.js ├── index.js ├── views │ └── index.ejs └── readme.md ├── tdc ├── img │ ├── readme-img-1.png │ ├── readme-img-2.png │ ├── readme-img-3.png │ ├── readme-img-4.png │ ├── readme-img-5.png │ ├── readme-img-6.png │ └── readme-img-7.png ├── public │ ├── images │ │ ├── favicon.ico │ │ └── mercantil-logo.png │ ├── js │ │ ├── main.js │ │ └── interface.js │ └── styles │ │ └── styles.css ├── .env ├── config.js ├── package.json ├── modules │ ├── pay.js │ └── crypto.js ├── index.js ├── readme.md └── views │ └── index.ejs ├── tdd ├── img │ ├── readme-img-1.png │ ├── readme-img-2.png │ ├── readme-img-3.png │ ├── readme-img-4.png │ ├── readme-img-5.png │ ├── readme-img-6.png │ └── readme-img-7.png ├── public │ ├── images │ │ ├── favicon.ico │ │ └── mercantil-logo.png │ ├── js │ │ ├── main.js │ │ └── interface.js │ └── styles │ │ └── styles.css ├── .env ├── config.js ├── package.json ├── modules │ ├── pay.js │ └── crypto.js ├── index.js ├── readme.md └── views │ └── index.ejs ├── getauth ├── img │ ├── readme-img-1.png │ ├── readme-img-2.png │ ├── readme-img-3.png │ ├── readme-img-4.png │ ├── readme-img-5.png │ ├── readme-img-6.png │ └── readme-img-7.png ├── public │ ├── images │ │ ├── favicon.ico │ │ └── mercantil-logo.png │ ├── js │ │ ├── main.js │ │ └── interface.js │ └── styles │ │ └── styles.css ├── .env ├── config.js ├── package.json ├── modules │ ├── getauth.js │ └── crypto.js ├── views │ └── index.ejs ├── index.js └── readme.md ├── td-search ├── img │ ├── readme-img-1.png │ ├── readme-img-2.png │ ├── readme-img-3.png │ ├── readme-img-4.png │ ├── readme-img-5.png │ ├── readme-img-6.png │ └── readme-img-7.png ├── public │ ├── images │ │ ├── favicon.ico │ │ └── mercantil-logo.png │ ├── js │ │ ├── main.js │ │ └── interface.js │ └── styles │ │ └── styles.css ├── .env ├── config.js ├── package.json ├── modules │ ├── search.js │ └── crypto.js ├── index.js ├── readme.md └── views │ └── index.ejs ├── search-c2p ├── img │ ├── readme-img-1.png │ ├── readme-img-2.png │ ├── readme-img-3.png │ ├── readme-img-4.png │ ├── readme-img-5.png │ ├── readme-img-6.png │ └── readme-img-7.png ├── public │ ├── images │ │ ├── favicon.ico │ │ └── mercantil-logo.png │ ├── js │ │ ├── main.js │ │ └── interface.js │ └── styles │ │ └── styles.css ├── .env ├── config.js ├── package.json ├── modules │ ├── searchC2p.js │ └── crypto.js ├── index.js ├── readme.md └── views │ └── index.ejs ├── transfer-search ├── img │ ├── readme-img-1.png │ ├── readme-img-2.png │ ├── readme-img-3.png │ ├── readme-img-4.png │ ├── readme-img-5.png │ ├── readme-img-6.png │ └── readme-img-7.png ├── public │ ├── images │ │ ├── favicon.ico │ │ └── mercantil-logo.png │ ├── js │ │ ├── main.js │ │ └── interface.js │ └── styles │ │ └── styles.css ├── .env ├── config.js ├── package.json ├── modules │ ├── search.js │ └── crypto.js ├── index.js ├── views │ └── index.ejs └── readme.md ├── README.md └── .gitignore /c2p/img/readme-img-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/c2p/img/readme-img-1.png -------------------------------------------------------------------------------- /c2p/img/readme-img-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/c2p/img/readme-img-2.png -------------------------------------------------------------------------------- /c2p/img/readme-img-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/c2p/img/readme-img-3.png -------------------------------------------------------------------------------- /c2p/img/readme-img-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/c2p/img/readme-img-4.png -------------------------------------------------------------------------------- /c2p/img/readme-img-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/c2p/img/readme-img-5.png -------------------------------------------------------------------------------- /c2p/img/readme-img-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/c2p/img/readme-img-6.png -------------------------------------------------------------------------------- /c2p/img/readme-img-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/c2p/img/readme-img-7.png -------------------------------------------------------------------------------- /scp/img/readme-img-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/scp/img/readme-img-1.png -------------------------------------------------------------------------------- /scp/img/readme-img-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/scp/img/readme-img-2.png -------------------------------------------------------------------------------- /scp/img/readme-img-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/scp/img/readme-img-3.png -------------------------------------------------------------------------------- /scp/img/readme-img-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/scp/img/readme-img-4.png -------------------------------------------------------------------------------- /scp/img/readme-img-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/scp/img/readme-img-5.png -------------------------------------------------------------------------------- /scp/img/readme-img-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/scp/img/readme-img-6.png -------------------------------------------------------------------------------- /scp/img/readme-img-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/scp/img/readme-img-7.png -------------------------------------------------------------------------------- /tdc/img/readme-img-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdc/img/readme-img-1.png -------------------------------------------------------------------------------- /tdc/img/readme-img-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdc/img/readme-img-2.png -------------------------------------------------------------------------------- /tdc/img/readme-img-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdc/img/readme-img-3.png -------------------------------------------------------------------------------- /tdc/img/readme-img-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdc/img/readme-img-4.png -------------------------------------------------------------------------------- /tdc/img/readme-img-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdc/img/readme-img-5.png -------------------------------------------------------------------------------- /tdc/img/readme-img-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdc/img/readme-img-6.png -------------------------------------------------------------------------------- /tdc/img/readme-img-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdc/img/readme-img-7.png -------------------------------------------------------------------------------- /tdd/img/readme-img-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdd/img/readme-img-1.png -------------------------------------------------------------------------------- /tdd/img/readme-img-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdd/img/readme-img-2.png -------------------------------------------------------------------------------- /tdd/img/readme-img-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdd/img/readme-img-3.png -------------------------------------------------------------------------------- /tdd/img/readme-img-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdd/img/readme-img-4.png -------------------------------------------------------------------------------- /tdd/img/readme-img-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdd/img/readme-img-5.png -------------------------------------------------------------------------------- /tdd/img/readme-img-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdd/img/readme-img-6.png -------------------------------------------------------------------------------- /tdd/img/readme-img-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdd/img/readme-img-7.png -------------------------------------------------------------------------------- /c2p/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/c2p/public/images/favicon.ico -------------------------------------------------------------------------------- /getauth/img/readme-img-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/getauth/img/readme-img-1.png -------------------------------------------------------------------------------- /getauth/img/readme-img-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/getauth/img/readme-img-2.png -------------------------------------------------------------------------------- /getauth/img/readme-img-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/getauth/img/readme-img-3.png -------------------------------------------------------------------------------- /getauth/img/readme-img-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/getauth/img/readme-img-4.png -------------------------------------------------------------------------------- /getauth/img/readme-img-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/getauth/img/readme-img-5.png -------------------------------------------------------------------------------- /getauth/img/readme-img-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/getauth/img/readme-img-6.png -------------------------------------------------------------------------------- /getauth/img/readme-img-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/getauth/img/readme-img-7.png -------------------------------------------------------------------------------- /scp/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/scp/public/images/favicon.ico -------------------------------------------------------------------------------- /td-search/img/readme-img-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/td-search/img/readme-img-1.png -------------------------------------------------------------------------------- /td-search/img/readme-img-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/td-search/img/readme-img-2.png -------------------------------------------------------------------------------- /td-search/img/readme-img-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/td-search/img/readme-img-3.png -------------------------------------------------------------------------------- /td-search/img/readme-img-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/td-search/img/readme-img-4.png -------------------------------------------------------------------------------- /td-search/img/readme-img-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/td-search/img/readme-img-5.png -------------------------------------------------------------------------------- /td-search/img/readme-img-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/td-search/img/readme-img-6.png -------------------------------------------------------------------------------- /td-search/img/readme-img-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/td-search/img/readme-img-7.png -------------------------------------------------------------------------------- /tdc/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdc/public/images/favicon.ico -------------------------------------------------------------------------------- /tdd/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdd/public/images/favicon.ico -------------------------------------------------------------------------------- /search-c2p/img/readme-img-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/search-c2p/img/readme-img-1.png -------------------------------------------------------------------------------- /search-c2p/img/readme-img-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/search-c2p/img/readme-img-2.png -------------------------------------------------------------------------------- /search-c2p/img/readme-img-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/search-c2p/img/readme-img-3.png -------------------------------------------------------------------------------- /search-c2p/img/readme-img-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/search-c2p/img/readme-img-4.png -------------------------------------------------------------------------------- /search-c2p/img/readme-img-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/search-c2p/img/readme-img-5.png -------------------------------------------------------------------------------- /search-c2p/img/readme-img-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/search-c2p/img/readme-img-6.png -------------------------------------------------------------------------------- /search-c2p/img/readme-img-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/search-c2p/img/readme-img-7.png -------------------------------------------------------------------------------- /getauth/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/getauth/public/images/favicon.ico -------------------------------------------------------------------------------- /td-search/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/td-search/public/images/favicon.ico -------------------------------------------------------------------------------- /c2p/public/images/mercantil-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/c2p/public/images/mercantil-logo.png -------------------------------------------------------------------------------- /scp/public/images/mercantil-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/scp/public/images/mercantil-logo.png -------------------------------------------------------------------------------- /search-c2p/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/search-c2p/public/images/favicon.ico -------------------------------------------------------------------------------- /tdc/public/images/mercantil-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdc/public/images/mercantil-logo.png -------------------------------------------------------------------------------- /tdd/public/images/mercantil-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/tdd/public/images/mercantil-logo.png -------------------------------------------------------------------------------- /transfer-search/img/readme-img-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/transfer-search/img/readme-img-1.png -------------------------------------------------------------------------------- /transfer-search/img/readme-img-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/transfer-search/img/readme-img-2.png -------------------------------------------------------------------------------- /transfer-search/img/readme-img-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/transfer-search/img/readme-img-3.png -------------------------------------------------------------------------------- /transfer-search/img/readme-img-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/transfer-search/img/readme-img-4.png -------------------------------------------------------------------------------- /transfer-search/img/readme-img-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/transfer-search/img/readme-img-5.png -------------------------------------------------------------------------------- /transfer-search/img/readme-img-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/transfer-search/img/readme-img-6.png -------------------------------------------------------------------------------- /transfer-search/img/readme-img-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/transfer-search/img/readme-img-7.png -------------------------------------------------------------------------------- /getauth/public/images/mercantil-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/getauth/public/images/mercantil-logo.png -------------------------------------------------------------------------------- /td-search/public/images/mercantil-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/td-search/public/images/mercantil-logo.png -------------------------------------------------------------------------------- /transfer-search/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/transfer-search/public/images/favicon.ico -------------------------------------------------------------------------------- /search-c2p/public/images/mercantil-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/search-c2p/public/images/mercantil-logo.png -------------------------------------------------------------------------------- /tdc/.env: -------------------------------------------------------------------------------- 1 | PORT=3000 2 | HOST="127.0.0.1" 3 | MERCHANTID=123456 4 | CLIENTID='changeme' 5 | SECRETKEY="changeme" 6 | INTEGRATORID=31 7 | TERMINALID="abcde" -------------------------------------------------------------------------------- /tdd/.env: -------------------------------------------------------------------------------- 1 | PORT=3001 2 | HOST="127.0.0.1" 3 | MERCHANTID=123456 4 | CLIENTID='changeme' 5 | SECRETKEY="changeme" 6 | INTEGRATORID=31 7 | TERMINALID="abcde" -------------------------------------------------------------------------------- /getauth/.env: -------------------------------------------------------------------------------- 1 | PORT=3002 2 | HOST="127.0.0.1" 3 | MERCHANTID=123456 4 | CLIENTID='changeme' 5 | SECRETKEY="changeme" 6 | INTEGRATORID=31 7 | TERMINALID="abcde" -------------------------------------------------------------------------------- /td-search/.env: -------------------------------------------------------------------------------- 1 | PORT=3003 2 | HOST="127.0.0.1" 3 | MERCHANTID=123456 4 | CLIENTID='changeme' 5 | SECRETKEY="changeme" 6 | INTEGRATORID=31 7 | TERMINALID="abcde" -------------------------------------------------------------------------------- /transfer-search/public/images/mercantil-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apimercantil/api-playground/HEAD/transfer-search/public/images/mercantil-logo.png -------------------------------------------------------------------------------- /transfer-search/.env: -------------------------------------------------------------------------------- 1 | PORT=3003 2 | HOST="127.0.0.1" 3 | MERCHANTID=123456 4 | CLIENTID='changeme' 5 | SECRETKEY="changeme" 6 | INTEGRATORID=31 7 | TERMINALID="abcde" -------------------------------------------------------------------------------- /c2p/.env: -------------------------------------------------------------------------------- 1 | PORT=3001 2 | HOST="127.0.0.1" 3 | MERCHANTID=123456 4 | CLIENTID='changeme' 5 | SECRETKEY="changeme" 6 | INTEGRATORID=31 7 | TERMINALID="abcde" 8 | PHONE_NUMBER="changeme" -------------------------------------------------------------------------------- /scp/.env: -------------------------------------------------------------------------------- 1 | PORT=3003 2 | HOST="127.0.0.1" 3 | MERCHANTID=123456 4 | CLIENTID='changeme' 5 | SECRETKEY="changeme" 6 | INTEGRATORID=31 7 | TERMINALID="abcde" 8 | PHONE_NUMBER="changeme" -------------------------------------------------------------------------------- /search-c2p/.env: -------------------------------------------------------------------------------- 1 | PORT=3000 2 | HOST="127.0.0.1" 3 | MERCHANTID=123456 4 | CLIENTID='changeme' 5 | SECRETKEY="changeme" 6 | INTEGRATORID=31 7 | TERMINALID="abcde" 8 | PHONE_NUMBER="changeme" -------------------------------------------------------------------------------- /getauth/config.js: -------------------------------------------------------------------------------- 1 | const dotenv = require('dotenv').config(); 2 | 3 | module.exports = { 4 | HOST: process.env.HOST || '127.0.0.1', 5 | PORT: process.env.PORT || 3000, 6 | MERCHANTID: process.env.MERCHANTID, 7 | CLIENTID: process.env.CLIENTID, 8 | SECRETKEY: process.env.SECRETKEY, 9 | INTEGRATORID: process.env.INTEGRATORID, 10 | TERMINALID: process.env.TERMINALID 11 | } -------------------------------------------------------------------------------- /scp/config.js: -------------------------------------------------------------------------------- 1 | const dotenv = require('dotenv').config(); 2 | 3 | module.exports = { 4 | HOST: process.env.HOST || '127.0.0.1', 5 | PORT: process.env.PORT || 3000, 6 | MERCHANTID: process.env.MERCHANTID, 7 | CLIENTID: process.env.CLIENTID, 8 | SECRETKEY: process.env.SECRETKEY, 9 | INTEGRATORID: process.env.INTEGRATORID, 10 | TERMINALID: process.env.TERMINALID 11 | } -------------------------------------------------------------------------------- /tdc/config.js: -------------------------------------------------------------------------------- 1 | const dotenv = require('dotenv').config(); 2 | 3 | module.exports = { 4 | HOST: process.env.HOST || '127.0.0.1', 5 | PORT: process.env.PORT || 3000, 6 | MERCHANTID: process.env.MERCHANTID, 7 | CLIENTID: process.env.CLIENTID, 8 | SECRETKEY: process.env.SECRETKEY, 9 | INTEGRATORID: process.env.INTEGRATORID, 10 | TERMINALID: process.env.TERMINALID 11 | } -------------------------------------------------------------------------------- /tdd/config.js: -------------------------------------------------------------------------------- 1 | const dotenv = require('dotenv').config(); 2 | 3 | module.exports = { 4 | HOST: process.env.HOST || '127.0.0.1', 5 | PORT: process.env.PORT || 3000, 6 | MERCHANTID: process.env.MERCHANTID, 7 | CLIENTID: process.env.CLIENTID, 8 | SECRETKEY: process.env.SECRETKEY, 9 | INTEGRATORID: process.env.INTEGRATORID, 10 | TERMINALID: process.env.TERMINALID 11 | } -------------------------------------------------------------------------------- /td-search/config.js: -------------------------------------------------------------------------------- 1 | const dotenv = require('dotenv').config(); 2 | 3 | module.exports = { 4 | HOST: process.env.HOST || '127.0.0.1', 5 | PORT: process.env.PORT || 3000, 6 | MERCHANTID: process.env.MERCHANTID, 7 | CLIENTID: process.env.CLIENTID, 8 | SECRETKEY: process.env.SECRETKEY, 9 | INTEGRATORID: process.env.INTEGRATORID, 10 | TERMINALID: process.env.TERMINALID 11 | } -------------------------------------------------------------------------------- /transfer-search/config.js: -------------------------------------------------------------------------------- 1 | const dotenv = require('dotenv').config(); 2 | 3 | module.exports = { 4 | HOST: process.env.HOST || '127.0.0.1', 5 | PORT: process.env.PORT || 3000, 6 | MERCHANTID: process.env.MERCHANTID, 7 | CLIENTID: process.env.CLIENTID, 8 | SECRETKEY: process.env.SECRETKEY, 9 | INTEGRATORID: process.env.INTEGRATORID, 10 | TERMINALID: process.env.TERMINALID 11 | } -------------------------------------------------------------------------------- /c2p/config.js: -------------------------------------------------------------------------------- 1 | const dotenv = require('dotenv').config(); 2 | 3 | module.exports = { 4 | HOST: process.env.HOST || '127.0.0.1', 5 | PORT: process.env.PORT || 3000, 6 | MERCHANTID: process.env.MERCHANTID, 7 | CLIENTID: process.env.CLIENTID, 8 | SECRETKEY: process.env.SECRETKEY, 9 | INTEGRATORID: process.env.INTEGRATORID, 10 | TERMINALID: process.env.TERMINALID, 11 | PHONE_NUMBER: process.env.PHONE_NUMBER 12 | } -------------------------------------------------------------------------------- /search-c2p/config.js: -------------------------------------------------------------------------------- 1 | const dotenv = require('dotenv').config(); 2 | 3 | module.exports = { 4 | HOST: process.env.HOST || '127.0.0.1', 5 | PORT: process.env.PORT || 3000, 6 | MERCHANTID: process.env.MERCHANTID, 7 | CLIENTID: process.env.CLIENTID, 8 | SECRETKEY: process.env.SECRETKEY, 9 | INTEGRATORID: process.env.INTEGRATORID, 10 | TERMINALID: process.env.TERMINALID, 11 | PHONE_NUMBER: process.env.PHONE_NUMBER 12 | } -------------------------------------------------------------------------------- /getauth/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-installment", 3 | "version": "1.0.0", 4 | "description": "Ejemplo sencillo de cómo hacer consultas a las API de Mercantil Banco.", 5 | "main": "index.js", 6 | "scripts": { 7 | "play": "node index.js" 8 | }, 9 | "author": "mercantilbanco", 10 | "license": "GPL-3.0-or-later", 11 | "dependencies": { 12 | "colors": "^1.4.0", 13 | "dotenv": "^16.4.5", 14 | "ejs": "^3.1.10", 15 | "express": "^4.19.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /scp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-installment", 3 | "version": "1.0.0", 4 | "description": "Ejemplo sencillo de cómo hacer consultas a las API de Mercantil Banco.", 5 | "main": "index.js", 6 | "scripts": { 7 | "play": "node index.js" 8 | }, 9 | "author": "mercantilbanco", 10 | "license": "GPL-3.0-or-later", 11 | "dependencies": { 12 | "colors": "^1.4.0", 13 | "dotenv": "^16.4.5", 14 | "ejs": "^3.1.10", 15 | "express": "^4.19.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tdc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-installment", 3 | "version": "1.0.0", 4 | "description": "Ejemplo sencillo de cómo hacer consultas a las API de Mercantil Banco.", 5 | "main": "index.js", 6 | "scripts": { 7 | "play": "node index.js" 8 | }, 9 | "author": "mercantilbanco", 10 | "license": "GPL-3.0-or-later", 11 | "dependencies": { 12 | "colors": "^1.4.0", 13 | "dotenv": "^16.4.5", 14 | "ejs": "^3.1.10", 15 | "express": "^4.19.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tdd/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-installment", 3 | "version": "1.0.0", 4 | "description": "Ejemplo sencillo de cómo hacer consultas a las API de Mercantil Banco.", 5 | "main": "index.js", 6 | "scripts": { 7 | "play": "node index.js" 8 | }, 9 | "author": "mercantilbanco", 10 | "license": "GPL-3.0-or-later", 11 | "dependencies": { 12 | "colors": "^1.4.0", 13 | "dotenv": "^16.4.5", 14 | "ejs": "^3.1.10", 15 | "express": "^4.19.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /td-search/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-installment", 3 | "version": "1.0.0", 4 | "description": "Ejemplo sencillo de cómo hacer consultas a las API de Mercantil Banco.", 5 | "main": "index.js", 6 | "scripts": { 7 | "play": "node index.js" 8 | }, 9 | "author": "mercantilbanco", 10 | "license": "GPL-3.0-or-later", 11 | "dependencies": { 12 | "colors": "^1.4.0", 13 | "dotenv": "^16.4.5", 14 | "ejs": "^3.1.10", 15 | "express": "^4.19.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /c2p/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "c2p", 3 | "version": "1.0.0", 4 | "description": "Ejemplo sencillo de cómo hacer consultas a las API de Mercantil Banco.", 5 | "main": "index.js", 6 | "scripts": { 7 | "play": "node index.js" 8 | }, 9 | "author": "mercantilbanco", 10 | "license": "GPL-3.0-or-later", 11 | "dependencies": { 12 | "c2p": "file:", 13 | "colors": "^1.4.0", 14 | "dotenv": "^16.4.5", 15 | "ejs": "^3.1.10", 16 | "express": "^4.19.2" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /transfer-search/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-installment", 3 | "version": "1.0.0", 4 | "description": "Ejemplo sencillo de cómo hacer consultas a las API de Mercantil Banco.", 5 | "main": "index.js", 6 | "scripts": { 7 | "play": "node index.js" 8 | }, 9 | "author": "mercantilbanco", 10 | "license": "GPL-3.0-or-later", 11 | "dependencies": { 12 | "colors": "^1.4.0", 13 | "dotenv": "^16.4.5", 14 | "ejs": "^3.1.10", 15 | "express": "^4.19.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /search-c2p/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "search-c2p", 3 | "version": "1.0.0", 4 | "description": "Ejemplo sencillo de cómo hacer consultas a las API de Mercantil Banco.", 5 | "main": "index.js", 6 | "scripts": { 7 | "play": "node index.js" 8 | }, 9 | "author": "mercantilbanco", 10 | "license": "GPL-3.0-or-later", 11 | "dependencies": { 12 | "colors": "^1.4.0", 13 | "dotenv": "^16.4.5", 14 | "ejs": "^3.1.10", 15 | "express": "^4.19.2", 16 | "search-c2p": "file:" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # API Playground 2 | ### Índice 3 | 1. Botón de pagos con tarjetas
4 | 1.1 [Get Auth (Autenticación para pagos con tarjetas)](./getauth/)
5 | 1.2 [Botón de pagos con tarjetas de débito](./tdd)
6 | 1.3 [Botón de pagos con tarjetas de crédito](./tdc)
7 | 1.4 [Búsqueda de pagos con tarjetas](./td-search) 8 | 2. C2P
9 | 2.1 [Solicitud de clave de pago](./scp/)
10 | 2.2 [Botón de pagos móviles (C2P, vuelto y anulación)](./c2p)
11 | 2.3 [Búsqueda de C2P](./search-c2p/) 12 | 3. Transferencias
13 | 3.1 [Búsqueda de transferencias](./transfer-search/) 14 | -------------------------------------------------------------------------------- /td-search/modules/search.js: -------------------------------------------------------------------------------- 1 | module.exports = async (data, merchantId, integratorId, terminalId, clientId) => { 2 | const body = { 3 | merchant_identify: { 4 | integratorId, 5 | merchantId, 6 | terminalId 7 | }, 8 | client_identify: { 9 | ipaddress: '127.0.0.1', 10 | browser_agent: 'Chrome 18.1.3', 11 | mobile: { 12 | manufacturer: 'Samsung', 13 | } 14 | }, 15 | search_by: { 16 | "search_criteria": data.searchCriteria, 17 | "procesing_date": data.procesingDate, 18 | "invoice_number": data.invoiceNumber, 19 | "payment_reference": data.paymentReference 20 | } 21 | } 22 | 23 | console.log(body); 24 | 25 | const requestOptions = { 26 | method: "POST", 27 | headers: { 28 | 'Content-Type': 'application/json', 29 | 'X-IBM-Client-ID': clientId 30 | }, 31 | body: JSON.stringify(body) 32 | } 33 | 34 | 35 | const res = await fetch('https://apimbu.mercantilbanco.com/mercantil-banco/sandbox/v1/payment/search', requestOptions) 36 | return res.json(); 37 | } -------------------------------------------------------------------------------- /getauth/modules/getauth.js: -------------------------------------------------------------------------------- 1 | const crypto = require('./crypto'); 2 | const config = require('../config'); 3 | 4 | module.exports = async (data, merchantId, integratorId, terminalId, clientId) => { 5 | const body = { 6 | merchant_identify: { 7 | integratorId, 8 | merchantId, 9 | terminalId 10 | }, 11 | client_identify: { 12 | ipaddress: '127.0.0.1', 13 | browser_agent: 'Chrome 18.1.3', 14 | mobile: { 15 | manufacturer: 'Samsung', 16 | } 17 | }, 18 | transaction_authInfo: { 19 | 'trx_type': 'solaut', 20 | 'payment_method': 'tdd', 21 | 'customer_id': data.customerId, 22 | 'card_number': data.cardNumber 23 | } 24 | } 25 | 26 | console.log(body.transaction) 27 | 28 | const requestOptions = { 29 | method: "POST", 30 | headers: { 31 | 'Content-Type': 'application/json', 32 | 'X-IBM-Client-ID': clientId 33 | }, 34 | body: JSON.stringify(body) 35 | } 36 | 37 | 38 | const res = await fetch('https://apimbu.mercantilbanco.com/mercantil-banco/sandbox/v1/payment/getauth', requestOptions) 39 | return res.json(); 40 | } -------------------------------------------------------------------------------- /scp/modules/scp.js: -------------------------------------------------------------------------------- 1 | const config = require("../../c2p/config"); 2 | const { encrypt } = require("../../c2p/modules/crypto"); 3 | 4 | module.exports = async (data, merchantId, integratorId, terminalId, clientId) => { 5 | const body = { 6 | merchant_identify: { 7 | integratorId, 8 | merchantId, 9 | terminalId 10 | }, 11 | client_identify: { 12 | ipaddress: '127.0.0.1', 13 | browser_agent: 'Chrome 18.1.3', 14 | mobile: { 15 | manufacturer: 'Samsung', 16 | } 17 | }, 18 | transaction_scpInfo: { 19 | destination_id: encrypt(data.customerId, config.SECRETKEY), 20 | destination_mobile_number: encrypt(data.customerPhoneNumber, config.SECRETKEY) 21 | } 22 | } 23 | 24 | console.log(body); 25 | 26 | const requestOptions = { 27 | method: "POST", 28 | headers: { 29 | 'Content-Type': 'application/json', 30 | 'X-IBM-Client-ID': clientId 31 | }, 32 | body: JSON.stringify(body) 33 | } 34 | 35 | 36 | const res = await fetch('https://apimbu.mercantilbanco.com/mercantil-banco/sandbox/v1/mobile-payment/scp', requestOptions) 37 | return res.json(); 38 | } -------------------------------------------------------------------------------- /tdc/modules/pay.js: -------------------------------------------------------------------------------- 1 | const crypto = require('./crypto'); 2 | const config = require('../config'); 3 | 4 | module.exports = async (data, merchantId, integratorId, terminalId, clientId) => { 5 | const body = { 6 | merchant_identify: { 7 | integratorId, 8 | merchantId, 9 | terminalId 10 | }, 11 | client_identify: { 12 | ipaddress: '127.0.0.1', 13 | browser_agent: 'Chrome 18.1.3', 14 | mobile: { 15 | manufacturer: 'Samsung', 16 | } 17 | }, 18 | transaction: { 19 | 'trx_type': 'compra', 20 | 'payment_method': 'tdc', 21 | 'customer_id': data.customerId, 22 | 'card_number': data.cardNumber, 23 | 'expiration_date': data.expirationDate, 24 | 'cvv': crypto.encrypt(data.cvv, config.SECRETKEY), 25 | 'currency': 'ves', 26 | 'amount': data.amount, 27 | 'invoice_number': data.invoiceNumber 28 | } 29 | } 30 | 31 | const requestOptions = { 32 | method: "POST", 33 | headers: { 34 | 'Content-Type': 'application/json', 35 | 'X-IBM-Client-ID': clientId 36 | }, 37 | body: JSON.stringify(body) 38 | } 39 | 40 | 41 | const res = await fetch('https://apimbu.mercantilbanco.com/mercantil-banco/sandbox/v1/payment/pay', requestOptions) 42 | return res.json(); 43 | } -------------------------------------------------------------------------------- /transfer-search/modules/search.js: -------------------------------------------------------------------------------- 1 | const { encrypt } = require("./crypto"); 2 | const config = require("../config"); 3 | 4 | module.exports = async (data, merchantId, integratorId, terminalId, clientId) => { 5 | const body = { 6 | merchantIdentify: { 7 | integratorId, 8 | merchantId, 9 | terminalId 10 | }, 11 | clientIdentify: { 12 | ipAddress: "10.0.0.1", 13 | browserAgent: "Chrome 18.1.3", 14 | mobile: { 15 | manufacturer: "Samsung" 16 | } 17 | }, 18 | transferSearchBy: { 19 | "account": encrypt(data.accountNumber, config.SECRETKEY), 20 | "issuerCustomerId": encrypt(data.customerId, config.SECRETKEY), 21 | "trxDate": data.transactionDate, 22 | "issuerBankId": data.bankId, 23 | "transactionType": 1, 24 | "paymentReference": data.paymentReference, 25 | "amount": data.amount 26 | } 27 | } 28 | 29 | console.log(body); 30 | 31 | const requestOptions = { 32 | method: "POST", 33 | headers: { 34 | 'Content-Type': 'application/json', 35 | 'X-IBM-Client-ID': clientId 36 | }, 37 | body: JSON.stringify(body) 38 | } 39 | 40 | 41 | const res = await fetch('https://apimbu.mercantilbanco.com/mercantil-banco/sandbox/v1/payment/transfer-search', requestOptions) 42 | return res.json(); 43 | } -------------------------------------------------------------------------------- /search-c2p/modules/searchC2p.js: -------------------------------------------------------------------------------- 1 | const config = require("../config"); 2 | const crypto = require("./crypto"); 3 | 4 | module.exports = async (data, merchantId, integratorId, terminalId, clientId) => { 5 | console.log(data); 6 | 7 | const body = { 8 | merchant_identify: { 9 | integratorId, 10 | merchantId, 11 | terminalId 12 | }, 13 | client_identify: { 14 | ipaddress: '127.0.0.1', 15 | browser_agent: 'Chrome 18.1.3', 16 | mobile: { 17 | manufacturer: 'Samsung', 18 | } 19 | }, 20 | search_by: { 21 | amount: data.amount, // Monto de la transacción. 22 | currency: 'ves', // Moneda utilizada en la transacción. 23 | destination_mobile_number: crypto.encrypt(data.customerPhoneNumber, config.SECRETKEY), // Número telefónico del destinatario. 24 | origin_mobile_number: crypto.encrypt(config.PHONE_NUMBER, config.SECRETKEY), // Número telefónico del remitente. 25 | payment_reference: data.refNumber, 26 | trx_date: data.transactionDate 27 | } 28 | } 29 | 30 | console.log(body); 31 | 32 | const requestOptions = { 33 | method: "POST", 34 | headers: { 35 | 'Content-Type': 'application/json', 36 | 'X-IBM-Client-ID': clientId 37 | }, 38 | body: JSON.stringify(body) 39 | } 40 | 41 | const res = await fetch('https://apimbu.mercantilbanco.com/mercantil-banco/sandbox/v1/mobile-payment/search', requestOptions); 42 | return res.json(); 43 | } -------------------------------------------------------------------------------- /getauth/public/js/main.js: -------------------------------------------------------------------------------- 1 | import { displayResponse, displayBack } from "./interface.js"; 2 | 3 | // BOTONES 4 | const sendButton = document.querySelector("#send-button"); 5 | const retry = document.querySelector(".retry"); 6 | 7 | //CAMPOS DE PAYMENT 8 | const customerIdPrefix = document.querySelector("#customerid-prefix"); 9 | const customerId = document.querySelector("#customerid"); 10 | const cardNumber = document.querySelector("#card-number"); 11 | 12 | // URLS y ENDPOINTS 13 | const URL = "http://127.0.0.1:3002"; 14 | const AUTH_ENDPOINT = "/getauth"; 15 | 16 | // FUNCIÓN PARA ENVIAR EL REQUEST CON LOS DATOS CORRECTOS 17 | const sendData = async (endpoint, body) => { 18 | const res = await fetch(`${URL}${endpoint}`, { 19 | method: "POST", 20 | headers: { 21 | "Content-Type": "application/json", 22 | }, 23 | body, 24 | }); 25 | 26 | return await res.json(); 27 | }; 28 | 29 | // FUNCIÓN PARA ENVIAR LA INFORMACIÓN AL ENDPOINT 30 | 31 | sendButton.addEventListener("click", async () => { 32 | const body = JSON.stringify({ 33 | customerId: customerIdPrefix.value + customerId.value, 34 | cardNumber: cardNumber.value 35 | }) 36 | 37 | document.querySelector(".loader").classList.remove("hide"); 38 | document.querySelector(".main-container").classList.add("hide"); 39 | 40 | const res = await sendData(AUTH_ENDPOINT, body); 41 | 42 | document.querySelector(".loader").classList.add("hide"); 43 | document.querySelector(".main-container").classList.remove("hide"); 44 | 45 | displayResponse(res.request, res.response); 46 | }); 47 | 48 | retry.addEventListener("click", displayBack); 49 | -------------------------------------------------------------------------------- /tdd/modules/pay.js: -------------------------------------------------------------------------------- 1 | const crypto = require('./crypto'); 2 | const config = require('../config'); 3 | 4 | module.exports = async (data, merchantId, integratorId, terminalId, clientId) => { 5 | const body = { 6 | merchant_identify: { 7 | integratorId, 8 | merchantId, 9 | terminalId 10 | }, 11 | client_identify: { 12 | ipaddress: '127.0.0.1', 13 | browser_agent: 'Chrome 18.1.3', 14 | mobile: { 15 | manufacturer: 'Samsung', 16 | } 17 | }, 18 | transaction: { 19 | 'trx_type': 'compra', 20 | 'payment_method': 'tdd', 21 | 'card_number': data.cardNumber, 22 | 'customer_id': data.customerId, 23 | 'account_type': data.accountType, 24 | 'invoice_number': data.invoiceNumber, 25 | 'twofactor_auth': crypto.encrypt(data.twoFactorAuth, config.SECRETKEY), 26 | 'expiration_date': data.expirationDate, 27 | 'cvv': crypto.encrypt(data.cvv, config.SECRETKEY), 28 | 'currency': 'ves', 29 | 'amount': data.amount, 30 | } 31 | } 32 | 33 | console.log(body.transaction) 34 | 35 | const requestOptions = { 36 | method: "POST", 37 | headers: { 38 | 'Content-Type': 'application/json', 39 | 'X-IBM-Client-ID': clientId 40 | }, 41 | body: JSON.stringify(body) 42 | } 43 | 44 | 45 | const res = await fetch('https://apimbu.mercantilbanco.com/mercantil-banco/sandbox/v1/payment/pay', requestOptions) 46 | return res.json(); 47 | } -------------------------------------------------------------------------------- /scp/public/js/main.js: -------------------------------------------------------------------------------- 1 | import { displayResponse, displayBack, displayForm } from "./interface.js"; 2 | 3 | // BOTONES 4 | const sendButton = document.querySelector("#send-button"); 5 | const retry = document.querySelector(".retry"); 6 | 7 | //CAMPOS DE PAYMENT 8 | const customerIdPrefix = document.querySelector("#customerid-prefix"); 9 | const customerId = document.querySelector("#customerid"); 10 | const customerPhoneNumberPrefix = document.querySelector("#customer-phone-number-prefix"); 11 | const customerPhoneNumber = document.querySelector("#customer-phone-number"); 12 | 13 | // URLS y ENDPOINTS 14 | const URL = "http://127.0.0.1:3003"; 15 | const PAY_ENDPOINT = "/scp"; 16 | 17 | // FUNCIÓN PARA ENVIAR EL REQUEST CON LOS DATOS CORRECTOS 18 | const sendData = async (endpoint, body) => { 19 | const res = await fetch(`${URL}${endpoint}`, { 20 | method: "POST", 21 | headers: { 22 | "Content-Type": "application/json", 23 | }, 24 | body, 25 | }); 26 | 27 | return await res.json(); 28 | }; 29 | 30 | // FUNCIÓN PARA ENVIAR LA INFORMACIÓN AL ENDPOINT 31 | 32 | sendButton.addEventListener("click", async () => { 33 | const body = JSON.stringify({ 34 | customerId: `${customerIdPrefix.value}${customerId.value}`, 35 | customerPhoneNumber: `58${customerPhoneNumberPrefix.value}${customerPhoneNumber.value}` 36 | }); 37 | 38 | document.querySelector(".loader").classList.remove("hide"); 39 | document.querySelector(".main-container").classList.add("hide"); 40 | 41 | const res = await sendData(PAY_ENDPOINT, body); 42 | 43 | document.querySelector(".loader").classList.add("hide"); 44 | document.querySelector(".main-container").classList.remove("hide"); 45 | 46 | displayResponse(res.request, res.response); 47 | }); 48 | 49 | retry.addEventListener("click", displayBack); 50 | -------------------------------------------------------------------------------- /td-search/public/js/main.js: -------------------------------------------------------------------------------- 1 | import { displayResponse, displayBack, displayForm } from "./interface.js"; 2 | 3 | // BOTONES 4 | const sendButton = document.querySelector("#send-button"); 5 | const retry = document.querySelector(".retry"); 6 | 7 | //CAMPOS DE PAYMENT 8 | const searchCriteria = document.querySelector("#search-criteria"); 9 | const procesingDate = document.querySelector("#procesing-date"); 10 | const paymentReference = document.querySelector("#payment-reference"); 11 | const invoiceNumber = document.querySelector("#invoice-number"); 12 | 13 | // URLS y ENDPOINTS 14 | const URL = "http://127.0.0.1:3003"; 15 | const PAY_ENDPOINT = "/search"; 16 | 17 | // FUNCIÓN PARA ENVIAR EL REQUEST CON LOS DATOS CORRECTOS 18 | const sendData = async (endpoint, body) => { 19 | const res = await fetch(`${URL}${endpoint}`, { 20 | method: "POST", 21 | headers: { 22 | "Content-Type": "application/json", 23 | }, 24 | body, 25 | }); 26 | 27 | return await res.json(); 28 | }; 29 | 30 | // FUNCIÓN PARA ENVIAR LA INFORMACIÓN AL ENDPOINT 31 | 32 | sendButton.addEventListener("click", async () => { 33 | const body = JSON.stringify({ 34 | searchCriteria: searchCriteria.value, 35 | procesingDate: procesingDate.value.replaceAll("-", "/"), 36 | paymentReference: paymentReference.value, 37 | invoiceNumber: invoiceNumber.value 38 | }); 39 | 40 | document.querySelector(".loader").classList.remove("hide"); 41 | document.querySelector(".main-container").classList.add("hide"); 42 | 43 | const res = await sendData(PAY_ENDPOINT, body); 44 | 45 | document.querySelector(".loader").classList.add("hide"); 46 | document.querySelector(".main-container").classList.remove("hide"); 47 | 48 | displayResponse(res.request, res.response); 49 | }); 50 | 51 | retry.addEventListener("click", displayBack); 52 | -------------------------------------------------------------------------------- /c2p/modules/crypto.js: -------------------------------------------------------------------------------- 1 | const Crypto = require('crypto'); 2 | 3 | /* 4 | * ====================================== 5 | * Funcion para cifrar los campos con AES 6 | * ====================================== 7 | */ 8 | 9 | const encrypt = (message, key) => { 10 | const algorythm = "aes-128-ecb"; 11 | // Convertir la llave secreta en un hash SHA256 12 | const hash = Crypto.createHash('sha256') 13 | hash.update(key) 14 | 15 | // Obtener los primeros 16 bytes del hash 16 | const keyString = hash.copy().digest("hex") 17 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 18 | const keyHex = Buffer.from(firstHalf, 'hex'); 19 | 20 | // Encriptacion del mensaje usando la clave nueva 21 | const cipher = Crypto.createCipheriv(algorythm, keyHex, null); 22 | 23 | let ciphertext = cipher.update(message, 'utf8', 'base64'); 24 | ciphertext += cipher.final('base64'); 25 | 26 | return ciphertext; // Valor devuelto en base64 27 | }; 28 | 29 | /* 30 | * ========================================= 31 | * Funcion para descifrar los campos con AES 32 | * ========================================= 33 | */ 34 | 35 | const decrypt = (message, key) => { 36 | const algorythm = "aes-128-ecb"; 37 | // Convertir la llave secreta en un hash SHA256 38 | const hash = Crypto.createHash('sha256') 39 | hash.update(key) 40 | 41 | // Obtener los primeros 16 bytes del hash 42 | const keyString = hash.copy().digest("hex") 43 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 44 | const keyHex = Buffer.from(firstHalf, 'hex'); 45 | 46 | // Encriptacion del mensaje usando la clave nueva 47 | const decipher = Crypto.createDecipheriv(algorythm, keyHex, null); 48 | 49 | let deciphertext = decipher.update(message, 'base64', 'utf8'); 50 | deciphertext += decipher.final('utf8'); 51 | 52 | return deciphertext; // Valor devuelto en utf8 53 | }; 54 | 55 | module.exports = { 56 | encrypt, decrypt 57 | }; -------------------------------------------------------------------------------- /scp/modules/crypto.js: -------------------------------------------------------------------------------- 1 | const Crypto = require('crypto'); 2 | 3 | /* 4 | * ====================================== 5 | * Funcion para cifrar los campos con AES 6 | * ====================================== 7 | */ 8 | 9 | const encrypt = (message, key) => { 10 | const algorythm = "aes-128-ecb"; 11 | // Convertir la llave secreta en un hash SHA256 12 | const hash = Crypto.createHash('sha256') 13 | hash.update(key) 14 | 15 | // Obtener los primeros 16 bytes del hash 16 | const keyString = hash.copy().digest("hex") 17 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 18 | const keyHex = Buffer.from(firstHalf, 'hex'); 19 | 20 | // Encriptacion del mensaje usando la clave nueva 21 | const cipher = Crypto.createCipheriv(algorythm, keyHex, null); 22 | 23 | let ciphertext = cipher.update(message, 'utf8', 'base64'); 24 | ciphertext += cipher.final('base64'); 25 | 26 | return ciphertext; // Valor devuelto en base64 27 | }; 28 | 29 | /* 30 | * ========================================= 31 | * Funcion para descifrar los campos con AES 32 | * ========================================= 33 | */ 34 | 35 | const decrypt = (message, key) => { 36 | const algorythm = "aes-128-ecb"; 37 | // Convertir la llave secreta en un hash SHA256 38 | const hash = Crypto.createHash('sha256') 39 | hash.update(key) 40 | 41 | // Obtener los primeros 16 bytes del hash 42 | const keyString = hash.copy().digest("hex") 43 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 44 | const keyHex = Buffer.from(firstHalf, 'hex'); 45 | 46 | // Encriptacion del mensaje usando la clave nueva 47 | const decipher = Crypto.createDecipheriv(algorythm, keyHex, null); 48 | 49 | let deciphertext = decipher.update(message, 'base64', 'utf8'); 50 | deciphertext += decipher.final('utf8'); 51 | 52 | return deciphertext; // Valor devuelto en utf8 53 | }; 54 | 55 | module.exports = { 56 | encrypt, decrypt 57 | }; -------------------------------------------------------------------------------- /tdc/modules/crypto.js: -------------------------------------------------------------------------------- 1 | const Crypto = require('crypto'); 2 | 3 | /* 4 | * ====================================== 5 | * Funcion para cifrar los campos con AES 6 | * ====================================== 7 | */ 8 | 9 | const encrypt = (message, key) => { 10 | const algorythm = "aes-128-ecb"; 11 | // Convertir la llave secreta en un hash SHA256 12 | const hash = Crypto.createHash('sha256') 13 | hash.update(key) 14 | 15 | // Obtener los primeros 16 bytes del hash 16 | const keyString = hash.copy().digest("hex") 17 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 18 | const keyHex = Buffer.from(firstHalf, 'hex'); 19 | 20 | // Encriptacion del mensaje usando la clave nueva 21 | const cipher = Crypto.createCipheriv(algorythm, keyHex, null); 22 | 23 | let ciphertext = cipher.update(message, 'utf8', 'base64'); 24 | ciphertext += cipher.final('base64'); 25 | 26 | return ciphertext; // Valor devuelto en base64 27 | }; 28 | 29 | /* 30 | * ========================================= 31 | * Funcion para descifrar los campos con AES 32 | * ========================================= 33 | */ 34 | 35 | const decrypt = (message, key) => { 36 | const algorythm = "aes-128-ecb"; 37 | // Convertir la llave secreta en un hash SHA256 38 | const hash = Crypto.createHash('sha256') 39 | hash.update(key) 40 | 41 | // Obtener los primeros 16 bytes del hash 42 | const keyString = hash.copy().digest("hex") 43 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 44 | const keyHex = Buffer.from(firstHalf, 'hex'); 45 | 46 | // Encriptacion del mensaje usando la clave nueva 47 | const decipher = Crypto.createDecipheriv(algorythm, keyHex, null); 48 | 49 | let deciphertext = decipher.update(message, 'base64', 'utf8'); 50 | deciphertext += decipher.final('utf8'); 51 | 52 | return deciphertext; // Valor devuelto en utf8 53 | }; 54 | 55 | module.exports = { 56 | encrypt, decrypt 57 | }; -------------------------------------------------------------------------------- /tdd/modules/crypto.js: -------------------------------------------------------------------------------- 1 | const Crypto = require('crypto'); 2 | 3 | /* 4 | * ====================================== 5 | * Funcion para cifrar los campos con AES 6 | * ====================================== 7 | */ 8 | 9 | const encrypt = (message, key) => { 10 | const algorythm = "aes-128-ecb"; 11 | // Convertir la llave secreta en un hash SHA256 12 | const hash = Crypto.createHash('sha256') 13 | hash.update(key) 14 | 15 | // Obtener los primeros 16 bytes del hash 16 | const keyString = hash.copy().digest("hex") 17 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 18 | const keyHex = Buffer.from(firstHalf, 'hex'); 19 | 20 | // Encriptacion del mensaje usando la clave nueva 21 | const cipher = Crypto.createCipheriv(algorythm, keyHex, null); 22 | 23 | let ciphertext = cipher.update(message, 'utf8', 'base64'); 24 | ciphertext += cipher.final('base64'); 25 | 26 | return ciphertext; // Valor devuelto en base64 27 | }; 28 | 29 | /* 30 | * ========================================= 31 | * Funcion para descifrar los campos con AES 32 | * ========================================= 33 | */ 34 | 35 | const decrypt = (message, key) => { 36 | const algorythm = "aes-128-ecb"; 37 | // Convertir la llave secreta en un hash SHA256 38 | const hash = Crypto.createHash('sha256') 39 | hash.update(key) 40 | 41 | // Obtener los primeros 16 bytes del hash 42 | const keyString = hash.copy().digest("hex") 43 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 44 | const keyHex = Buffer.from(firstHalf, 'hex'); 45 | 46 | // Encriptacion del mensaje usando la clave nueva 47 | const decipher = Crypto.createDecipheriv(algorythm, keyHex, null); 48 | 49 | let deciphertext = decipher.update(message, 'base64', 'utf8'); 50 | deciphertext += decipher.final('utf8'); 51 | 52 | return deciphertext; // Valor devuelto en utf8 53 | }; 54 | 55 | module.exports = { 56 | encrypt, decrypt 57 | }; -------------------------------------------------------------------------------- /getauth/modules/crypto.js: -------------------------------------------------------------------------------- 1 | const Crypto = require('crypto'); 2 | 3 | /* 4 | * ====================================== 5 | * Funcion para cifrar los campos con AES 6 | * ====================================== 7 | */ 8 | 9 | const encrypt = (message, key) => { 10 | const algorythm = "aes-128-ecb"; 11 | // Convertir la llave secreta en un hash SHA256 12 | const hash = Crypto.createHash('sha256') 13 | hash.update(key) 14 | 15 | // Obtener los primeros 16 bytes del hash 16 | const keyString = hash.copy().digest("hex") 17 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 18 | const keyHex = Buffer.from(firstHalf, 'hex'); 19 | 20 | // Encriptacion del mensaje usando la clave nueva 21 | const cipher = Crypto.createCipheriv(algorythm, keyHex, null); 22 | 23 | let ciphertext = cipher.update(message, 'utf8', 'base64'); 24 | ciphertext += cipher.final('base64'); 25 | 26 | return ciphertext; // Valor devuelto en base64 27 | }; 28 | 29 | /* 30 | * ========================================= 31 | * Funcion para descifrar los campos con AES 32 | * ========================================= 33 | */ 34 | 35 | const decrypt = (message, key) => { 36 | const algorythm = "aes-128-ecb"; 37 | // Convertir la llave secreta en un hash SHA256 38 | const hash = Crypto.createHash('sha256') 39 | hash.update(key) 40 | 41 | // Obtener los primeros 16 bytes del hash 42 | const keyString = hash.copy().digest("hex") 43 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 44 | const keyHex = Buffer.from(firstHalf, 'hex'); 45 | 46 | // Encriptacion del mensaje usando la clave nueva 47 | const decipher = Crypto.createDecipheriv(algorythm, keyHex, null); 48 | 49 | let deciphertext = decipher.update(message, 'base64', 'utf8'); 50 | deciphertext += decipher.final('utf8'); 51 | 52 | return deciphertext; // Valor devuelto en utf8 53 | }; 54 | 55 | module.exports = { 56 | encrypt, decrypt 57 | }; -------------------------------------------------------------------------------- /search-c2p/modules/crypto.js: -------------------------------------------------------------------------------- 1 | const Crypto = require('crypto'); 2 | 3 | /* 4 | * ====================================== 5 | * Funcion para cifrar los campos con AES 6 | * ====================================== 7 | */ 8 | 9 | const encrypt = (message, key) => { 10 | const algorythm = "aes-128-ecb"; 11 | // Convertir la llave secreta en un hash SHA256 12 | const hash = Crypto.createHash('sha256') 13 | hash.update(key) 14 | 15 | // Obtener los primeros 16 bytes del hash 16 | const keyString = hash.copy().digest("hex") 17 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 18 | const keyHex = Buffer.from(firstHalf, 'hex'); 19 | 20 | // Encriptacion del mensaje usando la clave nueva 21 | const cipher = Crypto.createCipheriv(algorythm, keyHex, null); 22 | 23 | let ciphertext = cipher.update(message, 'utf8', 'base64'); 24 | ciphertext += cipher.final('base64'); 25 | 26 | return ciphertext; // Valor devuelto en base64 27 | }; 28 | 29 | /* 30 | * ========================================= 31 | * Funcion para descifrar los campos con AES 32 | * ========================================= 33 | */ 34 | 35 | const decrypt = (message, key) => { 36 | const algorythm = "aes-128-ecb"; 37 | // Convertir la llave secreta en un hash SHA256 38 | const hash = Crypto.createHash('sha256') 39 | hash.update(key) 40 | 41 | // Obtener los primeros 16 bytes del hash 42 | const keyString = hash.copy().digest("hex") 43 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 44 | const keyHex = Buffer.from(firstHalf, 'hex'); 45 | 46 | // Encriptacion del mensaje usando la clave nueva 47 | const decipher = Crypto.createDecipheriv(algorythm, keyHex, null); 48 | 49 | let deciphertext = decipher.update(message, 'base64', 'utf8'); 50 | deciphertext += decipher.final('utf8'); 51 | 52 | return deciphertext; // Valor devuelto en utf8 53 | }; 54 | 55 | module.exports = { 56 | encrypt, decrypt 57 | }; -------------------------------------------------------------------------------- /td-search/modules/crypto.js: -------------------------------------------------------------------------------- 1 | const Crypto = require('crypto'); 2 | 3 | /* 4 | * ====================================== 5 | * Funcion para cifrar los campos con AES 6 | * ====================================== 7 | */ 8 | 9 | const encrypt = (message, key) => { 10 | const algorythm = "aes-128-ecb"; 11 | // Convertir la llave secreta en un hash SHA256 12 | const hash = Crypto.createHash('sha256') 13 | hash.update(key) 14 | 15 | // Obtener los primeros 16 bytes del hash 16 | const keyString = hash.copy().digest("hex") 17 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 18 | const keyHex = Buffer.from(firstHalf, 'hex'); 19 | 20 | // Encriptacion del mensaje usando la clave nueva 21 | const cipher = Crypto.createCipheriv(algorythm, keyHex, null); 22 | 23 | let ciphertext = cipher.update(message, 'utf8', 'base64'); 24 | ciphertext += cipher.final('base64'); 25 | 26 | return ciphertext; // Valor devuelto en base64 27 | }; 28 | 29 | /* 30 | * ========================================= 31 | * Funcion para descifrar los campos con AES 32 | * ========================================= 33 | */ 34 | 35 | const decrypt = (message, key) => { 36 | const algorythm = "aes-128-ecb"; 37 | // Convertir la llave secreta en un hash SHA256 38 | const hash = Crypto.createHash('sha256') 39 | hash.update(key) 40 | 41 | // Obtener los primeros 16 bytes del hash 42 | const keyString = hash.copy().digest("hex") 43 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 44 | const keyHex = Buffer.from(firstHalf, 'hex'); 45 | 46 | // Encriptacion del mensaje usando la clave nueva 47 | const decipher = Crypto.createDecipheriv(algorythm, keyHex, null); 48 | 49 | let deciphertext = decipher.update(message, 'base64', 'utf8'); 50 | deciphertext += decipher.final('utf8'); 51 | 52 | return deciphertext; // Valor devuelto en utf8 53 | }; 54 | 55 | module.exports = { 56 | encrypt, decrypt 57 | }; -------------------------------------------------------------------------------- /tdc/public/js/main.js: -------------------------------------------------------------------------------- 1 | import { displayResponse, displayBack } from "./interface.js"; 2 | 3 | // BOTONES 4 | const sendButton = document.querySelector("#send-button"); 5 | const retry = document.querySelector(".retry"); 6 | 7 | //CAMPOS DE PAYMENT 8 | const expirationDate = document.querySelector("#expiration-date"); 9 | const customerIdPrefix = document.querySelector("#customerid-prefix"); 10 | const customerId = document.querySelector("#customerid"); 11 | const cardNumber = document.querySelector("#card-number"); 12 | const amount = document.querySelector("#amount"); 13 | const cvv = document.querySelector("#cvv"); 14 | const invoiceNumber = document.querySelector("#invoice-number"); 15 | 16 | // URLS y ENDPOINTS 17 | const URL = "http://127.0.0.1:3000"; 18 | const PAY_ENDPOINT = "/pay"; 19 | 20 | // FUNCIÓN PARA ENVIAR EL REQUEST CON LOS DATOS CORRECTOS 21 | const sendData = async (endpoint, body) => { 22 | const res = await fetch(`${URL}${endpoint}`, { 23 | method: "POST", 24 | headers: { 25 | "Content-Type": "application/json", 26 | }, 27 | body, 28 | }); 29 | 30 | return await res.json(); 31 | }; 32 | 33 | // FUNCIÓN PARA ENVIAR LA INFORMACIÓN AL ENDPOINT 34 | 35 | sendButton.addEventListener("click", async () => { 36 | const body = JSON.stringify({ 37 | customerId: customerIdPrefix.value + customerId.value, 38 | cardNumber: cardNumber.value, 39 | expirationDate: expirationDate.value, 40 | amount: amount.value, 41 | cvv: cvv.value, 42 | invoiceNumber: invoiceNumber.value, 43 | }) 44 | 45 | document.querySelector(".loader").classList.remove("hide"); 46 | document.querySelector(".main-container").classList.add("hide"); 47 | 48 | const res = await sendData(PAY_ENDPOINT, body); 49 | 50 | document.querySelector(".loader").classList.add("hide"); 51 | document.querySelector(".main-container").classList.remove("hide"); 52 | 53 | displayResponse(res.request, res.response); 54 | }); 55 | 56 | retry.addEventListener("click", displayBack); 57 | -------------------------------------------------------------------------------- /transfer-search/modules/crypto.js: -------------------------------------------------------------------------------- 1 | const Crypto = require('crypto'); 2 | 3 | /* 4 | * ====================================== 5 | * Funcion para cifrar los campos con AES 6 | * ====================================== 7 | */ 8 | 9 | const encrypt = (message, key) => { 10 | const algorythm = "aes-128-ecb"; 11 | // Convertir la llave secreta en un hash SHA256 12 | const hash = Crypto.createHash('sha256') 13 | hash.update(key) 14 | 15 | // Obtener los primeros 16 bytes del hash 16 | const keyString = hash.copy().digest("hex") 17 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 18 | const keyHex = Buffer.from(firstHalf, 'hex'); 19 | 20 | // Encriptacion del mensaje usando la clave nueva 21 | const cipher = Crypto.createCipheriv(algorythm, keyHex, null); 22 | 23 | let ciphertext = cipher.update(message, 'utf8', 'base64'); 24 | ciphertext += cipher.final('base64'); 25 | 26 | return ciphertext; // Valor devuelto en base64 27 | }; 28 | 29 | /* 30 | * ========================================= 31 | * Funcion para descifrar los campos con AES 32 | * ========================================= 33 | */ 34 | 35 | const decrypt = (message, key) => { 36 | const algorythm = "aes-128-ecb"; 37 | // Convertir la llave secreta en un hash SHA256 38 | const hash = Crypto.createHash('sha256') 39 | hash.update(key) 40 | 41 | // Obtener los primeros 16 bytes del hash 42 | const keyString = hash.copy().digest("hex") 43 | const firstHalf = keyString.toString().slice(0, keyString.length / 2); 44 | const keyHex = Buffer.from(firstHalf, 'hex'); 45 | 46 | // Encriptacion del mensaje usando la clave nueva 47 | const decipher = Crypto.createDecipheriv(algorythm, keyHex, null); 48 | 49 | let deciphertext = decipher.update(message, 'base64', 'utf8'); 50 | deciphertext += decipher.final('utf8'); 51 | 52 | return deciphertext; // Valor devuelto en utf8 53 | }; 54 | 55 | module.exports = { 56 | encrypt, decrypt 57 | }; -------------------------------------------------------------------------------- /transfer-search/public/js/main.js: -------------------------------------------------------------------------------- 1 | import { displayResponse, displayBack } from "./interface.js"; 2 | 3 | // BOTONES 4 | const sendButton = document.querySelector("#send-button"); 5 | const retry = document.querySelector(".retry"); 6 | 7 | //CAMPOS DE PAYMENT 8 | const accountNumber= document.querySelector("#account-number"); 9 | const amount = document.querySelector("#amount"); 10 | const paymentReference = document.querySelector("#payment-reference"); 11 | const transactionDate = document.querySelector("#transaction-date"); 12 | const customerIdPrefix = document.querySelector("#customerid-prefix"); 13 | const customerId = document.querySelector("#customerid"); 14 | const bankId = document.querySelector("#bank-id"); 15 | 16 | // URLS y ENDPOINTS 17 | const URL = "http://127.0.0.1:3003"; 18 | 19 | const PAY_ENDPOINT = "/search"; 20 | 21 | // FUNCIÓN PARA ENVIAR EL REQUEST CON LOS DATOS CORRECTOS 22 | const sendData = async (endpoint, body) => { 23 | const res = await fetch(`${URL}${endpoint}`, { 24 | method: "POST", 25 | headers: { 26 | "Content-Type": "application/json", 27 | }, 28 | body, 29 | }); 30 | 31 | return await res.json(); 32 | }; 33 | 34 | // FUNCIÓN PARA ENVIAR LA INFORMACIÓN AL ENDPOINT 35 | 36 | sendButton.addEventListener("click", async () => { 37 | const body = JSON.stringify({ 38 | accountNumber: accountNumber.value, 39 | customerId: customerIdPrefix.value + customerId.value, 40 | transactionDate: transactionDate.value, 41 | paymentReference: paymentReference.value, 42 | amount: amount.value, 43 | bankId: bankId.value 44 | }); 45 | 46 | document.querySelector(".loader").classList.remove("hide"); 47 | document.querySelector(".main-container").classList.add("hide"); 48 | 49 | const res = await sendData(PAY_ENDPOINT, body); 50 | 51 | document.querySelector(".loader").classList.add("hide"); 52 | document.querySelector(".main-container").classList.remove("hide"); 53 | 54 | displayResponse(res.request, res.response); 55 | }); 56 | 57 | retry.addEventListener("click", displayBack); 58 | -------------------------------------------------------------------------------- /search-c2p/public/js/main.js: -------------------------------------------------------------------------------- 1 | import { displayResponse, displayBack, formDisplayHandler } from "./interface.js"; 2 | 3 | // BOTONES 4 | const sendButton = document.querySelector("#send-button"); 5 | const retry = document.querySelector(".retry"); 6 | 7 | //CAMPOS DE PAYMENT 8 | const amount = document.querySelector("#amount"); 9 | const customerIdPrefix = document.querySelector("#customerid-prefix"); 10 | const customerId = document.querySelector("#customerid"); 11 | const customerPhoneNumberPrefix = document.querySelector("#customer-phone-number-prefix"); 12 | const customerPhoneNumber = document.querySelector("#customer-phone-number"); 13 | const refNumber = document.querySelector("#payment-reference"); 14 | const transactionDate = document.querySelector("#transaction-date"); 15 | // URLS y ENDPOINTS 16 | const URL = "http://127.0.0.1:3000"; 17 | const PAY_ENDPOINT = "/searchC2p"; 18 | 19 | // FUNCIÓN PARA ENVIAR EL REQUEST CON LOS DATOS CORRECTOS 20 | const sendData = async (endpoint, body) => { 21 | const res = await fetch(`${URL}${endpoint}`, { 22 | method: "POST", 23 | headers: { 24 | "Content-Type": "application/json", 25 | }, 26 | body, 27 | }); 28 | 29 | return await res.json(); 30 | }; 31 | 32 | // FUNCIÓN PARA ENVIAR LA INFORMACIÓN AL ENDPOINT 33 | 34 | sendButton.addEventListener("click", async () => { 35 | const body = JSON.stringify({ 36 | amount: amount.value, 37 | customerId: `${customerIdPrefix.value}${customerId.value}`, 38 | customerPhoneNumber: `58${customerPhoneNumberPrefix.value}${customerPhoneNumber.value}`, 39 | refNumber: refNumber.value, 40 | transactionDate: transactionDate.value 41 | }); 42 | 43 | console.log(body) 44 | 45 | document.querySelector(".loader").classList.remove("hide"); 46 | document.querySelector(".main-container").classList.add("hide"); 47 | 48 | const res = await sendData(PAY_ENDPOINT, body); 49 | 50 | document.querySelector(".loader").classList.add("hide"); 51 | document.querySelector(".main-container").classList.remove("hide"); 52 | 53 | displayResponse(res.request, res.response); 54 | }); 55 | 56 | retry.addEventListener("click", displayBack); 57 | -------------------------------------------------------------------------------- /tdd/public/js/main.js: -------------------------------------------------------------------------------- 1 | import { displayResponse, displayBack, displayForm } from "./interface.js"; 2 | 3 | // BOTONES 4 | const sendButton = document.querySelector("#send-button"); 5 | const retry = document.querySelector(".retry"); 6 | 7 | //CAMPOS DE PAYMENT 8 | const expirationDate = document.querySelector("#expiration-date"); 9 | const customerIdPrefix = document.querySelector("#customerid-prefix"); 10 | const customerId = document.querySelector("#customerid"); 11 | const cardNumber = document.querySelector("#card-number"); 12 | const amount = document.querySelector("#amount"); 13 | const cvv = document.querySelector("#cvv"); 14 | const invoiceNumber = document.querySelector("#invoice-number"); 15 | const accountType = document.querySelector("#account-type"); 16 | const twoFactor = document.querySelector("#twofactor"); 17 | 18 | // URLS y ENDPOINTS 19 | const URL = "http://127.0.0.1:3001"; 20 | const PAY_ENDPOINT = "/pay"; 21 | 22 | // FUNCIÓN PARA ENVIAR EL REQUEST CON LOS DATOS CORRECTOS 23 | const sendData = async (endpoint, body) => { 24 | const res = await fetch(`${URL}${endpoint}`, { 25 | method: "POST", 26 | headers: { 27 | "Content-Type": "application/json", 28 | }, 29 | body, 30 | }); 31 | 32 | return await res.json(); 33 | }; 34 | 35 | // FUNCIÓN PARA ENVIAR LA INFORMACIÓN AL ENDPOINT 36 | 37 | sendButton.addEventListener("click", async () => { 38 | const body = JSON.stringify({ 39 | customerId: customerIdPrefix.value + customerId.value, 40 | cardNumber: cardNumber.value, 41 | expirationDate: expirationDate.value, 42 | amount: amount.value, 43 | cvv: cvv.value, 44 | invoiceNumber: invoiceNumber.value, 45 | accountType: accountType.value, 46 | twoFactorAuth: twoFactor.value 47 | }) 48 | 49 | document.querySelector(".loader").classList.remove("hide"); 50 | document.querySelector(".main-container").classList.add("hide"); 51 | 52 | const res = await sendData(PAY_ENDPOINT, body); 53 | 54 | document.querySelector(".loader").classList.add("hide"); 55 | document.querySelector(".main-container").classList.remove("hide"); 56 | 57 | displayResponse(res.request, res.response); 58 | }); 59 | 60 | retry.addEventListener("click", displayBack); 61 | -------------------------------------------------------------------------------- /c2p/modules/c2p.js: -------------------------------------------------------------------------------- 1 | const config = require("../config"); 2 | const crypto = require("./crypto"); 3 | 4 | module.exports = async (data, merchantId, integratorId, terminalId, clientId) => { 5 | console.log(data); 6 | 7 | const body = { 8 | merchant_identify: { 9 | integratorId, 10 | merchantId, 11 | terminalId 12 | }, 13 | client_identify: { 14 | ipaddress: '127.0.0.1', 15 | browser_agent: 'Chrome 18.1.3', 16 | mobile: { 17 | manufacturer: 'Samsung', 18 | } 19 | }, 20 | transaction_c2p: { 21 | amount: data.amount, // Monto de la transacción. 22 | currency: 'ves', // Moneda utilizada en la transacción. 23 | destination_bank_id: 105, // ID del banco destinatario. 24 | destination_id: crypto.encrypt(data.customerId, config.SECRETKEY), // Documento de identidad del destinatario. 25 | destination_mobile_number: crypto.encrypt(data.customerPhoneNumber, config.SECRETKEY), // Número telefónico del destinatario. 26 | origin_mobile_number: crypto.encrypt(config.PHONE_NUMBER, config.SECRETKEY), // Número telefónico del remitente. 27 | payment_reference: data.trxType == "anulacion" ? data.refNumber : "", // Referencia de la transacción(Solo para anulación). 28 | trx_type: data.trxType, // Tipo de transacción(compra / anulacion / vuelto). 29 | payment_method: data.trxType == 'vuelto' ? "p2p" : "c2p", // Método de pago(P2P / C2P). 30 | invoice_number: data.invoiceNumber, // Número de factura(Generado aleatoriamente para el ejemplo). 31 | twofactor_auth: data.trxType == 'compra' ? crypto.encrypt(data.twofactor, config.SECRETKEY) : '' // Clave de pago(Solo para compra / 00001111 para fines del ejemplo). 32 | } 33 | } 34 | 35 | console.log(body); 36 | 37 | const requestOptions = { 38 | method: "POST", 39 | headers: { 40 | 'Content-Type': 'application/json', 41 | 'X-IBM-Client-ID': clientId 42 | }, 43 | body: JSON.stringify(body) 44 | } 45 | 46 | 47 | const res = await fetch('https://apimbu.mercantilbanco.com/mercantil-banco/sandbox/v1/payment/c2p', requestOptions) 48 | return res.json(); 49 | } -------------------------------------------------------------------------------- /c2p/index.js: -------------------------------------------------------------------------------- 1 | const colors = require("colors"); 2 | const bodyParser = require("body-parser"); 3 | const config = require("./config.js"); 4 | 5 | const express = require("express"); 6 | const c2p = require('./modules/c2p.js'); 7 | const app = express(); 8 | 9 | app.use(bodyParser.json()); 10 | 11 | app.use(express.static(__dirname + "/public")); 12 | app.set("view engine", "ejs"); 13 | 14 | /* 15 | * =========================== 16 | * ENDPOINT PARA ENTRAR AL APP 17 | * =========================== 18 | */ 19 | 20 | app.get("/", (req, res) => { 21 | res.render("index"); 22 | }); 23 | 24 | /* 25 | * =========================== 26 | * ENDPOINT PARA REALIZAR PAGO 27 | * =========================== 28 | */ 29 | 30 | app.post("/c2p", async (req, res) => { 31 | try { 32 | const response = await c2p( 33 | req.body, 34 | config.MERCHANTID, 35 | config.INTEGRATORID, 36 | config.TERMINALID, 37 | config.CLIENTID 38 | ); 39 | 40 | const request = { 41 | merchantIdentify: response.merchantIdentify, 42 | clientIdentify: { 43 | ipAddress: "127.0.0.1", 44 | browserAgent: "", 45 | mobile: { 46 | manufacturer: "Samsung", 47 | model: "", 48 | osVersion: "", 49 | }, 50 | }, 51 | }; 52 | 53 | res.json({ 54 | request: { ...request, ...req.body }, 55 | response: response, 56 | }); 57 | } catch(e) { 58 | console.error(e); 59 | } 60 | 61 | }); 62 | 63 | app.listen(config.PORT, config.HOST, () => { 64 | const errors = []; 65 | Object.keys(config).forEach((key) => { 66 | if (!config[key] || config[key] === "" || config[key] === 0) 67 | errors.push(key); 68 | }); 69 | if (errors.length > 0) 70 | console.warn( 71 | `[WARN] No se encuentran las siguientes variables de entorno: ${errors.join( 72 | ", " 73 | )}. Es muy probable que no pueda continuar con la ejecución`.yellow 74 | ); 75 | 76 | console.log(`Aplicación de ejemplo escuchando el puerto: ${config.PORT}`); 77 | 78 | console.log( 79 | `Asegurate de haber creado el archivo .env y configurar las variables de entorno para la ejecución del ejemplo. ` 80 | ); 81 | console.log( 82 | `Por favor ingresa al siguiente enlace para poder utilizar el ejemplo: http://${config.HOST}:${config.PORT}` 83 | ); 84 | }); 85 | -------------------------------------------------------------------------------- /tdc/index.js: -------------------------------------------------------------------------------- 1 | const pay = require('./modules/pay.js') 2 | 3 | const colors = require("colors"); 4 | const bodyParser = require("body-parser"); 5 | const config = require("./config.js"); 6 | 7 | const express = require("express"); 8 | const app = express(); 9 | 10 | app.use(bodyParser.json()); 11 | 12 | app.use(express.static(__dirname + "/public")); 13 | app.set("view engine", "ejs"); 14 | 15 | /* 16 | * =========================== 17 | * ENDPOINT PARA ENTRAR AL APP 18 | * =========================== 19 | */ 20 | 21 | app.get("/", (req, res) => { 22 | res.render("index"); 23 | }); 24 | 25 | /* 26 | * =========================== 27 | * ENDPOINT PARA REALIZAR PAGO 28 | * =========================== 29 | */ 30 | 31 | app.post("/pay", async (req, res) => { 32 | try { 33 | const response = await pay( 34 | req.body, 35 | config.MERCHANTID, 36 | config.INTEGRATORID, 37 | config.TERMINALID, 38 | config.CLIENTID 39 | ); 40 | 41 | const request = { 42 | merchantIdentify: response.merchantIdentify, 43 | clientIdentify: { 44 | ipAddress: "127.0.0.1", 45 | browserAgent: "", 46 | mobile: { 47 | manufacturer: "Samsung", 48 | model: "", 49 | osVersion: "", 50 | }, 51 | }, 52 | }; 53 | 54 | res.json({ 55 | request: { ...request, ...req.body }, 56 | response: response, 57 | }); 58 | } catch(e) { 59 | console.error(e); 60 | } 61 | 62 | }); 63 | 64 | app.listen(config.PORT, config.HOST, () => { 65 | const errors = []; 66 | Object.keys(config).forEach((key) => { 67 | if (!config[key] || config[key] === "" || config[key] === 0) 68 | errors.push(key); 69 | }); 70 | if (errors.length > 0) 71 | console.warn( 72 | `[WARN] No se encuentran las siguientes variables de entorno: ${errors.join( 73 | ", " 74 | )}. Es muy probable que no pueda continuar con la ejecución`.yellow 75 | ); 76 | 77 | console.log(`Aplicación de ejemplo escuchando el puerto: ${config.PORT}`); 78 | 79 | console.log( 80 | `Asegurate de haber creado el archivo .env y configurar las variables de entorno para la ejecución del ejemplo. ` 81 | ); 82 | console.log( 83 | `Por favor ingresa al siguiente enlace para poder utilizar el ejemplo: http://${config.HOST}:${config.PORT}` 84 | ); 85 | }); 86 | -------------------------------------------------------------------------------- /tdd/index.js: -------------------------------------------------------------------------------- 1 | const pay = require('./modules/pay.js') 2 | 3 | const colors = require("colors"); 4 | const bodyParser = require("body-parser"); 5 | const config = require("./config.js"); 6 | 7 | const express = require("express"); 8 | const app = express(); 9 | 10 | app.use(bodyParser.json()); 11 | 12 | app.use(express.static(__dirname + "/public")); 13 | app.set("view engine", "ejs"); 14 | 15 | /* 16 | * =========================== 17 | * ENDPOINT PARA ENTRAR AL APP 18 | * =========================== 19 | */ 20 | 21 | app.get("/", (req, res) => { 22 | res.render("index"); 23 | }); 24 | 25 | /* 26 | * =========================== 27 | * ENDPOINT PARA REALIZAR PAGO 28 | * =========================== 29 | */ 30 | 31 | app.post("/pay", async (req, res) => { 32 | try { 33 | const response = await pay( 34 | req.body, 35 | config.MERCHANTID, 36 | config.INTEGRATORID, 37 | config.TERMINALID, 38 | config.CLIENTID 39 | ); 40 | 41 | const request = { 42 | merchantIdentify: response.merchantIdentify, 43 | clientIdentify: { 44 | ipAddress: "127.0.0.1", 45 | browserAgent: "", 46 | mobile: { 47 | manufacturer: "Samsung", 48 | model: "", 49 | osVersion: "", 50 | }, 51 | }, 52 | }; 53 | 54 | res.json({ 55 | request: { ...request, ...req.body }, 56 | response: response, 57 | }); 58 | } catch(e) { 59 | console.error(e); 60 | } 61 | 62 | }); 63 | 64 | app.listen(config.PORT, config.HOST, () => { 65 | const errors = []; 66 | Object.keys(config).forEach((key) => { 67 | if (!config[key] || config[key] === "" || config[key] === 0) 68 | errors.push(key); 69 | }); 70 | if (errors.length > 0) 71 | console.warn( 72 | `[WARN] No se encuentran las siguientes variables de entorno: ${errors.join( 73 | ", " 74 | )}. Es muy probable que no pueda continuar con la ejecución`.yellow 75 | ); 76 | 77 | console.log(`Aplicación de ejemplo escuchando el puerto: ${config.PORT}`); 78 | 79 | console.log( 80 | `Asegurate de haber creado el archivo .env y configurar las variables de entorno para la ejecución del ejemplo. ` 81 | ); 82 | console.log( 83 | `Por favor ingresa al siguiente enlace para poder utilizar el ejemplo: http://${config.HOST}:${config.PORT}` 84 | ); 85 | }); 86 | -------------------------------------------------------------------------------- /getauth/views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Autenticación para pago con tarjeta de débito 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 |
17 | 18 |
19 |

Autenticación para pago con tarjeta de débito

20 | 21 | 22 | 23 |
24 |
25 | 26 |
27 | 34 | 35 |
36 | 37 |
38 |
39 | 40 | 41 |
42 |
43 | 44 | 45 | 46 |
47 |

48 |

49 | Reintentar 50 |
51 | 52 |
53 | 54 |
55 |
56 |

Request

57 |
58 |
59 |
60 |

Response

61 |
62 |
63 |
64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /scp/index.js: -------------------------------------------------------------------------------- 1 | const colors = require("colors"); 2 | const bodyParser = require("body-parser"); 3 | const config = require("./config.js"); 4 | 5 | const express = require("express"); 6 | const scp = require('./modules/scp.js'); 7 | const app = express(); 8 | 9 | app.use(bodyParser.json()); 10 | 11 | app.use(express.static(__dirname + "/public")); 12 | app.set("view engine", "ejs"); 13 | 14 | /* 15 | * =========================== 16 | * ENDPOINT PARA ENTRAR AL APP 17 | * =========================== 18 | */ 19 | 20 | app.get("/", (req, res) => { 21 | res.render("index"); 22 | }); 23 | 24 | /* 25 | * ================================ 26 | * ENDPOINT PARA REALIZAR SOLICITUD 27 | * ================================ 28 | */ 29 | 30 | app.post("/scp", async (req, res) => { 31 | try { 32 | const response = await scp( 33 | req.body, 34 | config.MERCHANTID, 35 | config.INTEGRATORID, 36 | config.TERMINALID, 37 | config.CLIENTID 38 | ); 39 | 40 | const request = { 41 | merchantIdentify: response.merchantIdentify, 42 | clientIdentify: { 43 | ipAddress: "127.0.0.1", 44 | browserAgent: "", 45 | mobile: { 46 | manufacturer: "Samsung", 47 | model: "", 48 | osVersion: "", 49 | }, 50 | }, 51 | }; 52 | 53 | res.json({ 54 | request: { ...request, ...req.body }, 55 | response: response, 56 | }); 57 | } catch(e) { 58 | console.error(e); 59 | } 60 | 61 | }); 62 | 63 | app.listen(config.PORT, config.HOST, () => { 64 | const errors = []; 65 | Object.keys(config).forEach((key) => { 66 | if (!config[key] || config[key] === "" || config[key] === 0) 67 | errors.push(key); 68 | }); 69 | if (errors.length > 0) 70 | console.warn( 71 | `[WARN] No se encuentran las siguientes variables de entorno: ${errors.join( 72 | ", " 73 | )}. Es muy probable que no pueda continuar con la ejecución`.yellow 74 | ); 75 | 76 | console.log(`Aplicación de ejemplo escuchando el puerto: ${config.PORT}`); 77 | 78 | console.log( 79 | `Asegurate de haber creado el archivo .env y configurar las variables de entorno para la ejecución del ejemplo. ` 80 | ); 81 | console.log( 82 | `Por favor ingresa al siguiente enlace para poder utilizar el ejemplo: http://${config.HOST}:${config.PORT}` 83 | ); 84 | }); 85 | -------------------------------------------------------------------------------- /getauth/index.js: -------------------------------------------------------------------------------- 1 | const getauth = require('./modules/getauth.js') 2 | 3 | const colors = require("colors"); 4 | const bodyParser = require("body-parser"); 5 | const config = require("./config.js"); 6 | 7 | const express = require("express"); 8 | const app = express(); 9 | 10 | app.use(bodyParser.json()); 11 | 12 | app.use(express.static(__dirname + "/public")); 13 | app.set("view engine", "ejs"); 14 | 15 | /* 16 | * =========================== 17 | * ENDPOINT PARA ENTRAR AL APP 18 | * =========================== 19 | */ 20 | 21 | app.get("/", (req, res) => { 22 | res.render("index"); 23 | }); 24 | 25 | /* 26 | * =========================== 27 | * ENDPOINT PARA REALIZAR PAGO 28 | * =========================== 29 | */ 30 | 31 | app.post("/getauth", async (req, res) => { 32 | try { 33 | const response = await getauth( 34 | req.body, 35 | config.MERCHANTID, 36 | config.INTEGRATORID, 37 | config.TERMINALID, 38 | config.CLIENTID 39 | ); 40 | 41 | const request = { 42 | merchantIdentify: response.merchantIdentify, 43 | clientIdentify: { 44 | ipAddress: "127.0.0.1", 45 | browserAgent: "", 46 | mobile: { 47 | manufacturer: "Samsung", 48 | model: "", 49 | osVersion: "", 50 | }, 51 | }, 52 | }; 53 | 54 | res.json({ 55 | request: { ...request, ...req.body }, 56 | response: response, 57 | }); 58 | } catch(e) { 59 | console.error(e); 60 | } 61 | 62 | }); 63 | 64 | app.listen(config.PORT, config.HOST, () => { 65 | const errors = []; 66 | Object.keys(config).forEach((key) => { 67 | if (!config[key] || config[key] === "" || config[key] === 0) 68 | errors.push(key); 69 | }); 70 | if (errors.length > 0) 71 | console.warn( 72 | `[WARN] No se encuentran las siguientes variables de entorno: ${errors.join( 73 | ", " 74 | )}. Es muy probable que no pueda continuar con la ejecución`.yellow 75 | ); 76 | 77 | console.log(`Aplicación de ejemplo escuchando el puerto: ${config.PORT}`); 78 | 79 | console.log( 80 | `Asegurate de haber creado el archivo .env y configurar las variables de entorno para la ejecución del ejemplo. ` 81 | ); 82 | console.log( 83 | `Por favor ingresa al siguiente enlace para poder utilizar el ejemplo: http://${config.HOST}:${config.PORT}` 84 | ); 85 | }); 86 | -------------------------------------------------------------------------------- /c2p/public/js/main.js: -------------------------------------------------------------------------------- 1 | import { displayResponse, displayBack, formDisplayHandler } from "./interface.js"; 2 | 3 | // BOTONES 4 | const sendButton = document.querySelector("#send-button"); 5 | const retry = document.querySelector(".retry"); 6 | 7 | //CAMPOS DE PAYMENT 8 | const trxType = document.querySelector("#transaction-type"); 9 | const amount = document.querySelector("#amount"); 10 | const customerIdPrefix = document.querySelector("#customerid-prefix"); 11 | const customerId = document.querySelector("#customerid"); 12 | const customerPhoneNumberPrefix = document.querySelector("#customer-phone-number-prefix"); 13 | const customerPhoneNumber = document.querySelector("#customer-phone-number"); 14 | const refNumber = document.querySelector("#payment-reference"); 15 | const invoiceNumber = document.querySelector("#invoice-number"); 16 | const twofactor = document.querySelector("#twofactor"); 17 | // URLS y ENDPOINTS 18 | const URL = "http://127.0.0.1:3001"; 19 | const PAY_ENDPOINT = "/c2p"; 20 | 21 | // FUNCIÓN PARA ENVIAR EL REQUEST CON LOS DATOS CORRECTOS 22 | const sendData = async (endpoint, body) => { 23 | const res = await fetch(`${URL}${endpoint}`, { 24 | method: "POST", 25 | headers: { 26 | "Content-Type": "application/json", 27 | }, 28 | body, 29 | }); 30 | 31 | return await res.json(); 32 | }; 33 | 34 | // FUNCIÓN PARA ENVIAR LA INFORMACIÓN AL ENDPOINT 35 | 36 | sendButton.addEventListener("click", async () => { 37 | const body = JSON.stringify({ 38 | trxType: trxType.value, 39 | amount: amount.value, 40 | customerId: `${customerIdPrefix.value}${customerId.value}`, 41 | customerPhoneNumber: `58${customerPhoneNumberPrefix.value}${customerPhoneNumber.value}`, 42 | refNumber: refNumber.value, 43 | twofactor: twofactor.value, 44 | invoiceNumber: invoiceNumber.value 45 | }); 46 | 47 | console.log(body) 48 | 49 | document.querySelector(".loader").classList.remove("hide"); 50 | document.querySelector(".main-container").classList.add("hide"); 51 | 52 | const res = await sendData(PAY_ENDPOINT, body); 53 | 54 | document.querySelector(".loader").classList.add("hide"); 55 | document.querySelector(".main-container").classList.remove("hide"); 56 | 57 | displayResponse(res.request, res.response); 58 | }); 59 | 60 | retry.addEventListener("click", displayBack); 61 | trxType.addEventListener("change", formDisplayHandler); 62 | -------------------------------------------------------------------------------- /td-search/index.js: -------------------------------------------------------------------------------- 1 | const search = require('./modules/search.js') 2 | 3 | const colors = require("colors"); 4 | const bodyParser = require("body-parser"); 5 | const config = require("./config.js"); 6 | 7 | const express = require("express"); 8 | const app = express(); 9 | 10 | app.use(bodyParser.json()); 11 | 12 | app.use(express.static(__dirname + "/public")); 13 | app.set("view engine", "ejs"); 14 | 15 | /* 16 | * =========================== 17 | * ENDPOINT PARA ENTRAR AL APP 18 | * =========================== 19 | */ 20 | 21 | app.get("/", (req, res) => { 22 | res.render("index"); 23 | }); 24 | 25 | /* 26 | * =============================== 27 | * ENDPOINT PARA REALIZAR BÚSQUEDA 28 | * =============================== 29 | */ 30 | 31 | app.post("/search", async (req, res) => { 32 | try { 33 | const response = await search( 34 | req.body, 35 | config.MERCHANTID, 36 | config.INTEGRATORID, 37 | config.TERMINALID, 38 | config.CLIENTID 39 | ); 40 | 41 | const request = { 42 | merchantIdentify: response.merchantIdentify, 43 | clientIdentify: { 44 | ipAddress: "127.0.0.1", 45 | browserAgent: "", 46 | mobile: { 47 | manufacturer: "Samsung", 48 | model: "", 49 | osVersion: "", 50 | }, 51 | }, 52 | }; 53 | 54 | res.json({ 55 | request: { ...request, ...req.body }, 56 | response: response, 57 | }); 58 | } catch(e) { 59 | console.error(e); 60 | } 61 | 62 | }); 63 | 64 | app.listen(config.PORT, config.HOST, () => { 65 | const errors = []; 66 | Object.keys(config).forEach((key) => { 67 | if (!config[key] || config[key] === "" || config[key] === 0) 68 | errors.push(key); 69 | }); 70 | if (errors.length > 0) 71 | console.warn( 72 | `[WARN] No se encuentran las siguientes variables de entorno: ${errors.join( 73 | ", " 74 | )}. Es muy probable que no pueda continuar con la ejecución`.yellow 75 | ); 76 | 77 | console.log(`Aplicación de ejemplo escuchando el puerto: ${config.PORT}`); 78 | 79 | console.log( 80 | `Asegurate de haber creado el archivo .env y configurar las variables de entorno para la ejecución del ejemplo. ` 81 | ); 82 | console.log( 83 | `Por favor ingresa al siguiente enlace para poder utilizar el ejemplo: http://${config.HOST}:${config.PORT}` 84 | ); 85 | }); 86 | -------------------------------------------------------------------------------- /search-c2p/index.js: -------------------------------------------------------------------------------- 1 | const colors = require("colors"); 2 | const bodyParser = require("body-parser"); 3 | const config = require("./config.js"); 4 | 5 | const express = require("express"); 6 | const searchC2p = require("./modules/searchC2p.js"); 7 | const app = express(); 8 | 9 | app.use(bodyParser.json()); 10 | 11 | app.use(express.static(__dirname + "/public")); 12 | app.set("view engine", "ejs"); 13 | 14 | /* 15 | * =========================== 16 | * ENDPOINT PARA ENTRAR AL APP 17 | * =========================== 18 | */ 19 | 20 | app.get("/", (req, res) => { 21 | res.render("index"); 22 | }); 23 | 24 | /* 25 | * =============================== 26 | * ENDPOINT PARA REALIZAR CONSULTA 27 | * =============================== 28 | */ 29 | 30 | app.post("/searchC2p", async (req, res) => { 31 | try { 32 | const response = await searchC2p( 33 | req.body, 34 | config.MERCHANTID, 35 | config.INTEGRATORID, 36 | config.TERMINALID, 37 | config.CLIENTID 38 | ); 39 | 40 | const request = { 41 | merchantIdentify: response.merchantIdentify, 42 | clientIdentify: { 43 | ipAddress: "127.0.0.1", 44 | browserAgent: "", 45 | mobile: { 46 | manufacturer: "Samsung", 47 | model: "", 48 | osVersion: "", 49 | }, 50 | }, 51 | }; 52 | 53 | res.json({ 54 | request: { ...request, ...req.body }, 55 | response: response, 56 | }); 57 | } catch(e) { 58 | console.error(e); 59 | } 60 | 61 | }); 62 | 63 | app.listen(config.PORT, config.HOST, () => { 64 | const errors = []; 65 | Object.keys(config).forEach((key) => { 66 | if (!config[key] || config[key] === "" || config[key] === 0) 67 | errors.push(key); 68 | }); 69 | if (errors.length > 0) 70 | console.warn( 71 | `[WARN] No se encuentran las siguientes variables de entorno: ${errors.join( 72 | ", " 73 | )}. Es muy probable que no pueda continuar con la ejecución`.yellow 74 | ); 75 | 76 | console.log(`Aplicación de ejemplo escuchando el puerto: ${config.PORT}`); 77 | 78 | console.log( 79 | `Asegurate de haber creado el archivo .env y configurar las variables de entorno para la ejecución del ejemplo. ` 80 | ); 81 | console.log( 82 | `Por favor ingresa al siguiente enlace para poder utilizar el ejemplo: http://${config.HOST}:${config.PORT}` 83 | ); 84 | }); 85 | -------------------------------------------------------------------------------- /transfer-search/index.js: -------------------------------------------------------------------------------- 1 | const search = require('./modules/search.js') 2 | 3 | const colors = require("colors"); 4 | const bodyParser = require("body-parser"); 5 | const config = require("./config.js"); 6 | 7 | const express = require("express"); 8 | const app = express(); 9 | 10 | app.use(bodyParser.json()); 11 | 12 | app.use(express.static(__dirname + "/public")); 13 | app.set("view engine", "ejs"); 14 | 15 | /* 16 | * =========================== 17 | * ENDPOINT PARA ENTRAR AL APP 18 | * =========================== 19 | */ 20 | 21 | app.get("/", (req, res) => { 22 | res.render("index"); 23 | }); 24 | 25 | /* 26 | * =============================== 27 | * ENDPOINT PARA REALIZAR BÚSQUEDA 28 | * =============================== 29 | */ 30 | 31 | app.post("/search", async (req, res) => { 32 | try { 33 | const response = await search( 34 | req.body, 35 | config.MERCHANTID, 36 | config.INTEGRATORID, 37 | config.TERMINALID, 38 | config.CLIENTID 39 | ); 40 | 41 | const request = { 42 | merchantIdentify: response.merchantIdentify, 43 | clientIdentify: { 44 | ipAddress: "127.0.0.1", 45 | browserAgent: "", 46 | mobile: { 47 | manufacturer: "Samsung", 48 | model: "", 49 | osVersion: "", 50 | }, 51 | }, 52 | }; 53 | 54 | res.json({ 55 | request: { ...request, ...req.body }, 56 | response: response, 57 | }); 58 | } catch(e) { 59 | console.error(e); 60 | } 61 | 62 | }); 63 | 64 | app.listen(config.PORT, config.HOST, () => { 65 | const errors = []; 66 | Object.keys(config).forEach((key) => { 67 | if (!config[key] || config[key] === "" || config[key] === 0) 68 | errors.push(key); 69 | }); 70 | if (errors.length > 0) 71 | console.warn( 72 | `[WARN] No se encuentran las siguientes variables de entorno: ${errors.join( 73 | ", " 74 | )}. Es muy probable que no pueda continuar con la ejecución`.yellow 75 | ); 76 | 77 | console.log(`Aplicación de ejemplo escuchando el puerto: ${config.PORT}`); 78 | 79 | console.log( 80 | `Asegurate de haber creado el archivo .env y configurar las variables de entorno para la ejecución del ejemplo. ` 81 | ); 82 | console.log( 83 | `Por favor ingresa al siguiente enlace para poder utilizar el ejemplo: http://${config.HOST}:${config.PORT}` 84 | ); 85 | }); 86 | -------------------------------------------------------------------------------- /td-search/readme.md: -------------------------------------------------------------------------------- 1 | # Búsqueda de pagos con tarjetas. 2 | 3 | >[!NOTE] 4 | [Más informacion sobre el API.](https://apiportal.mercantilbanco.com/mercantil-banco/produccion/product/21031) 5 | 6 | ### Índice 7 | 8 | 1. [Ejemplo de encriptación](./modules/crypto.js) 9 | 2. [Ejemplo de petición fetch](./modules/search.js) 10 | 3. [API Playground](#playground)
11 | 3.1 [Configuración y uso del API playground](#playground-config)
12 | 3.2 [Ejemplos de uso del API playground](#playground-examples) 13 | 4. [Request y Response](#rq) 14 | 5. [Códigos de error](#error-codes) 15 | 16 | 17 | 18 | ## API Playground 19 | 20 | 21 | ### Configuración y uso del API Playground 22 | 23 | >[!IMPORTANT] 24 | **Debes tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para la correcta configuración y ejecución de este ejemplo.** 25 | 26 | 1. Descargar el código de ejemplo ubicado en este repositorio haciendo click [aquí](https://github.com/apimercantil/api-playground/releases/download/V1/td-search.zip).
27 | 28 | 2. Descomprimir el archivo descargado en su ordenador.
29 | 30 | 3. Abrir con un editor de texto(VS Code, Notepad, Sublime Text, Atom) el archivo **/.env** ubicado en la carpeta principal del ejemplo.
31 | 32 | 4. Configurar sus credenciales en el archivo abierto (Utilizar las credenciales suministradas por Mercantil Banco).
33 | ![Imagen de ejemplo](./img/readme-img-1.png) 34 | 35 | 5. Abrir desde la terminal la **carpeta principal del proyecto**.
36 | ![Imagen de ejemplo](./img/readme-img-2.png) 37 | 38 | 6. Ejecutar el comando ```npm i``` o ```npm install``` (Recuerda tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para poder continuar con la configuración).
39 | ![Imagen de ejemplo](./img/readme-img-3.png) 40 | 41 | 7. Ejecuta el ejemplo con el comando ```npm run play``` o ```node index.js```.
42 | ![Imagen de ejemplo](./img/readme-img-4.png) 43 | 44 | 45 | ### Ejemplos de uso del API Playground 46 | 47 | 1. Ingresar la información en el formulario de pago.
48 | ![Imagen de ejemplo](./img/readme-img-5.png) 49 | 50 | 8. Presionar el botón del formulario para enviar la petición.
51 | ![Imagen de ejemplo](./img/readme-img-6.png) 52 | 53 | 9. Revisar el request y el response.
54 | ![Imagen de ejemplo](./img/readme-img-7.png) 55 | 56 | 10. Módifica el código a tu gusto y haz las pruebas que requieras.
57 | -------------------------------------------------------------------------------- /td-search/views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Búsqueda de pagos con tarjeta 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 |
17 | 18 |
19 |

Búsqueda de pagos con tarjeta

20 | 21 | 22 | 23 |
24 |
25 | 26 | 33 |
34 |
35 | 36 | 37 |
38 |
39 | 40 | 41 |
42 |
43 | 44 | 45 |
46 |
47 | 48 | 49 | 50 |
51 |

52 |

53 | Reintentar 54 |
55 | 56 |
57 | 58 |
59 |
60 |

Request

61 |
62 |
63 |
64 |

Response

65 |
66 |
67 |
68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | # .env 77 | # .env.development.local 78 | # .env.test.local 79 | # .env.production.local 80 | # .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /scp/views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Solicitud de clave de pago 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 |
17 | 18 |
19 |

Solicitud de clave de pago

20 | 21 | 22 | 23 |
24 |
25 | 26 |
27 | 34 | 35 |
36 | 37 |
38 | 39 |
40 | 41 |
42 | 49 | 50 |
51 |
52 |
53 | 54 | 55 | 56 |
57 |

58 |

59 | Reintentar 60 |
61 | 62 |
63 | 64 |
65 |
66 |

Request

67 |
68 |
69 |
70 |

Response

71 |
72 |
73 |
74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /tdc/readme.md: -------------------------------------------------------------------------------- 1 | # Botón de pagos con tarjeta (TDC). 2 | 3 | >[!NOTE] 4 | [Más informacion sobre el API.](https://apiportal.mercantilbanco.com/mercantil-banco/produccion/product/21031) 5 | 6 | ### Índice 7 | 8 | 1. [Ejemplo de encriptación](./modules/crypto.js) 9 | 2. [Ejemplo de petición fetch](./modules/pay.js) 10 | 3. [API Playground](#playground)
11 | 3.1 [Configuración y uso del API playground](#playground-config)
12 | 3.2 [Ejemplos de uso del API playground](#playground-examples) 13 | 4. [Request y Response](#rq) 14 | 5. [Códigos de error](#error-codes) 15 | 16 | 17 | 18 | ## API Playground 19 | 20 | 21 | ### Configuración y uso del API Playground 22 | 23 | >[!IMPORTANT] 24 | **Debes tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para la correcta configuración y ejecución de este ejemplo.** 25 | 26 | 1. Descargar el código de ejemplo ubicado en este repositorio haciendo click [aquí](https://github.com/apimercantil/api-playground/releases/download/V1/tdc.zip).
27 | 28 | 2. Descomprimir el archivo descargado en su ordenador.
29 | 30 | 3. Abrir con un editor de texto(VS Code, Notepad, Sublime Text, Atom) el archivo **/.env** ubicado en la carpeta principal del ejemplo.
31 | 32 | 4. Configurar sus credenciales en el archivo abierto (Utilizar las credenciales suministradas por Mercantil Banco).
33 | ![Imagen de ejemplo](./img/readme-img-1.png) 34 | 35 | 5. Abrir desde la terminal la **carpeta principal del proyecto**.
36 | ![Imagen de ejemplo](./img/readme-img-2.png) 37 | 38 | 6. Ejecutar el comando ```npm i``` o ```npm install``` (Recuerda tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para poder continuar con la configuración).
39 | ![Imagen de ejemplo](./img/readme-img-3.png) 40 | 41 | 7. Ejecuta el ejemplo con el comando ```npm run play``` o ```node index.js```.
42 | ![Imagen de ejemplo](./img/readme-img-4.png) 43 | 44 | 45 | ### Ejemplos de uso del API Playground 46 | 47 | 1. Ingresar la información en el formulario de pago.
48 | ![Imagen de ejemplo](./img/readme-img-5.png) 49 | 50 | 8. Presionar el botón del formulario para enviar la petición.
51 | ![Imagen de ejemplo](./img/readme-img-6.png) 52 | 53 | 9. Revisar el request y el response.
54 | ![Imagen de ejemplo](./img/readme-img-7.png) 55 | 56 | 10. Módifica el código a tu gusto y haz las pruebas que requieras.
57 | 58 | 59 | ### Request y Reponse 60 | 61 | ![Request|Response example](https://www.mercantilbanco.com/mercprod/apiportal/images/img_pay.png) 62 | 63 | >[!NOTE] 64 | Para información detallada sobre los campos del request pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/mapping_campos_tipo_txns_tdc.pdf). 65 | 66 | ### Códigos de error 67 | 68 | >[!NOTE] 69 | Para información detallada sobre la lista de errores pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/Errores_con_TDD.pdf). 70 | -------------------------------------------------------------------------------- /getauth/readme.md: -------------------------------------------------------------------------------- 1 | # Autenticación para Pagos con Tarjeta de Débito(GetAuth). 2 | 3 | >[!NOTE] 4 | [Más informacion sobre el API.](https://apiportal.mercantilbanco.com/mercantil-banco/produccion/product/21031) 5 | 6 | ### Índice 7 | 8 | 1. [Ejemplo de encriptación](./modules/crypto.js) 9 | 2. [Ejemplo de petición fetch](./modules/getauth.js) 10 | 3. [API Playground](#playground)
11 | 3.1 [Configuración y uso del API playground](#playground-config)
12 | 3.2 [Ejemplos de uso del API playground](#playground-examples) 13 | 4. [Request y Response](#rq) 14 | 5. [Códigos de error](#error-codes) 15 | 16 | 17 | 18 | ## API Playground 19 | 20 | 21 | ### Configuración y uso del API Playground 22 | 23 | >[!IMPORTANT] 24 | **Debes tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para la correcta configuración y ejecución de este ejemplo.** 25 | 26 | 1. Descargar el código de ejemplo ubicado en este repositorio haciendo click [aquí](https://github.com/apimercantil/api-playground/releases/download/V1/getauth.zip).
27 | 28 | 2. Descomprimir el archivo descargado en su ordenador.
29 | 30 | 3. Abrir con un editor de texto(VS Code, Notepad, Sublime Text, Atom) el archivo **/.env** ubicado en la carpeta principal del ejemplo.
31 | 32 | 4. Configurar sus credenciales en el archivo abierto (Utilizar las credenciales suministradas por Mercantil Banco).
33 | ![Imagen de ejemplo](./img/readme-img-1.png) 34 | 35 | 5. Abrir desde la terminal la **carpeta principal del proyecto**.
36 | ![Imagen de ejemplo](./img/readme-img-2.png) 37 | 38 | 6. Ejecutar el comando ```npm i``` o ```npm install``` (Recuerda tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para poder continuar con la configuración).
39 | ![Imagen de ejemplo](./img/readme-img-3.png) 40 | 41 | 7. Ejecuta el ejemplo con el comando ```npm run play``` o ```node index.js```.
42 | ![Imagen de ejemplo](./img/readme-img-4.png) 43 | 44 | 45 | ### Ejemplos de uso del API Playground 46 | 47 | 1. Ingresar la información en el formulario de autorización.
48 | ![Imagen de ejemplo](./img/readme-img-5.png) 49 | 50 | 8. Presionar el botón del formulario para enviar la petición.
51 | ![Imagen de ejemplo](./img/readme-img-6.png) 52 | 53 | 9. Revisar el request y el response.
54 | ![Imagen de ejemplo](./img/readme-img-7.png) 55 | 56 | 10. Módifica el código a tu gusto y haz las pruebas que requieras.
57 | 58 | 59 | ### Request y Reponse 60 | 61 | ![Request|Response example](https://www.mercantilbanco.com/mercprod/apiportal/images/img_auth.png) 62 | 63 | >[!NOTE] 64 | Para información detallada sobre los campos del request pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/mapping_campos_tipo_txns_tdd.pdf). 65 | 66 | ### Códigos de error 67 | 68 | >[!NOTE] 69 | Para información detallada sobre la lista de errores pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/Errores_con_TDD.pdf). 70 | -------------------------------------------------------------------------------- /tdc/views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Pago con tarjeta de crédito 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 |
17 | 18 |
19 |

Pago con tarjeta de crédito

20 | 21 | 22 | 23 |
24 |
25 | 26 |
27 | 34 | 35 |
36 | 37 |
38 |
39 | 40 | 41 |
42 |
43 | 44 | 45 |
46 |
47 | 48 | 49 |
50 |
51 | 52 | 53 |
54 |
55 | 56 | 57 |
58 |
59 | 60 | 61 | 62 |
63 |

64 |

65 | Reintentar 66 |
67 | 68 |
69 | 70 |
71 |
72 |

Request

73 |
74 |
75 |
76 |

Response

77 |
78 |
79 |
80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /transfer-search/views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Búsqueda de transferencias 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 |
17 | 18 |
19 |

Búsqueda de transferencias

20 | 21 | 22 | 23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 |
31 | 38 | 39 |
40 |
41 |
42 | 43 | 44 |
45 |
46 | 47 | 48 |
49 |
50 | 51 | 52 |
53 |
54 | 55 | 56 |
57 |
58 | 59 | 60 | 61 |
62 |

63 |

64 | Reintentar 65 |
66 | 67 |
68 | 69 |
70 |
71 |

Request

72 |
73 |
74 |
75 |

Response

76 |
77 |
78 |
79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /scp/readme.md: -------------------------------------------------------------------------------- 1 | # Solicitud de clave de pago. 2 | 3 | >[!NOTE] 4 | [Más informacion sobre el API.](https://apiportal.mercantilbanco.com/mercantil-banco/produccion/product/21040) 5 | 6 | ### Índice 7 | 8 | 1. [Ejemplo de encriptación](./modules/crypto.js) 9 | 2. [Ejemplo de petición fetch](./modules/scp.js) 10 | 3. [API Playground](#playground)
11 | 3.1 [Configuración y uso del API playground](#playground-config)
12 | 3.2 [Ejemplos de uso del API playground](#playground-examples) 13 | 4. [Request y Response](#rq) 14 | 5. [Códigos de error](#error-codes) 15 | 16 | 17 | 18 | ## API Playground 19 | 20 | 21 | ### Configuración y uso del API Playground 22 | 23 | >[!IMPORTANT] 24 | **Debes tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para la correcta configuración y ejecución de este ejemplo.** 25 | 26 | 1. Descargar el código de ejemplo ubicado en este repositorio haciendo click [aquí](https://github.com/apimercantil/api-playground/releases/download/V1/scp.zip).
27 | 28 | 2. Descomprimir el archivo descargado en su ordenador.
29 | 30 | 3. Abrir con un editor de texto(VS Code, Notepad, Sublime Text, Atom) el archivo **/.env** ubicado en la carpeta principal del ejemplo.
31 | 32 | 4. Configurar sus credenciales en el archivo abierto (Utilizar las credenciales suministradas por Mercantil Banco).
33 | ![Imagen de ejemplo](./img/readme-img-1.png) 34 | 35 | 5. Abrir desde la terminal la **carpeta principal del proyecto**.
36 | ![Imagen de ejemplo](./img/readme-img-2.png) 37 | 38 | 6. Ejecutar el comando ```npm i``` o ```npm install``` (Recuerda tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para poder continuar con la configuración).
39 | ![Imagen de ejemplo](./img/readme-img-3.png) 40 | 41 | 7. Ejecuta el ejemplo con el comando ```npm run play``` o ```node index.js```.
42 | ![Imagen de ejemplo](./img/readme-img-4.png) 43 | 44 | 45 | ### Ejemplos de uso del API Playground 46 | 47 | 1. Ingresar la información en el formulario de solicitud.
48 | ![Imagen de ejemplo](./img/readme-img-5.png) 49 | 50 | 8. Presionar el botón del formulario para enviar la petición.
51 | ![Imagen de ejemplo](./img/readme-img-6.png) 52 | 53 | 9. Revisar el request y el response.
54 | ![Imagen de ejemplo](./img/readme-img-7.png) 55 | 56 | 10. Módifica el código a tu gusto y haz las pruebas que requieras.
57 | 58 | 59 | ### Request y Reponse 60 | 61 | ![Response example](https://www.mercantilbanco.com/mercprod/apiportal/images/request_api_scp.png) 62 | ![Request example](https://www.mercantilbanco.com/mercprod/apiportal/images/response_api_scp.png) 63 | 64 | >[!NOTE] 65 | Para información detallada sobre los campos del request pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/api_scp_c2p_descripcion_de_atributos_y_campos_0.pdf). 66 | 67 | ### Códigos de error 68 | 69 | >[!NOTE] 70 | Para información detallada sobre la lista de errores pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/api_scp_c2p_tipo_de_errores_0.pdf). 71 | -------------------------------------------------------------------------------- /search-c2p/readme.md: -------------------------------------------------------------------------------- 1 | # Búsqueda de pagos móviles. 2 | 3 | >[!NOTE] 4 | [Más informacion sobre el API.](https://apiportal.mercantilbanco.com/mercantil-banco/produccion/product/21013) 5 | 6 | ### Índice 7 | 8 | 1. [Ejemplo de encriptación](./modules/crypto.js) 9 | 2. [Ejemplo de petición fetch](./modules/c2p.js) 10 | 3. [API Playground](#playground)
11 | 3.1 [Configuración y uso del API playground](#playground-config)
12 | 3.2 [Ejemplos de uso del API playground](#playground-examples) 13 | 4. [Request y Response](#rq) 14 | 5. [Códigos de error](#error-codes) 15 | 16 | 17 | 18 | ## API Playground 19 | 20 | 21 | ### Configuración y uso del API Playground 22 | 23 | >[!IMPORTANT] 24 | Debes tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para la correcta configuración y ejecución de este ejemplo. 25 | 26 | 1. Descargar el código de ejemplo ubicado en este repositorio haciendo click [aquí](https://github.com/apimercantil/api-playground/releases/download/V1/c2p.zip).
27 | 28 | 2. Descomprimir el archivo descargado en su ordenador.
29 | 30 | 3. Abrir con un editor de texto(VS Code, Notepad, Sublime Text, Atom) el archivo **/.env** ubicado en la carpeta principal del ejemplo.
31 | 32 | 4. Configurar sus credenciales en el archivo abierto (Utilizar las credenciales suministradas por Mercantil Banco).
33 | ![Imagen de ejemplo](./img/readme-img-1.png) 34 | 35 | 5. Abrir desde la terminal la **carpeta principal del proyecto**.
36 | ![Imagen de ejemplo](./img/readme-img-2.png) 37 | 38 | 6. Ejecutar el comando ```npm i``` o ```npm install``` (Recuerda tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para poder continuar con la configuración).
39 | ![Imagen de ejemplo](./img/readme-img-3.png) 40 | 41 | 7. Ejecuta el ejemplo con el comando ```npm run play``` o ```node index.js```.
42 | ![Imagen de ejemplo](./img/readme-img-4.png) 43 | 44 | 45 | ### Ejemplos de uso del API Playground 46 | 47 | 1. Ingresar la información en el formulario de búsqueda.
48 | ![Imagen de ejemplo](./img/readme-img-5.png) 49 | 50 | 8. Presionar el botón del formulario para enviar la petición.
51 | ![Imagen de ejemplo](./img/readme-img-6.png) 52 | 53 | 9. Revisar el request y el response.
54 | ![Imagen de ejemplo](./img/readme-img-7.png) 55 | 56 | 10. Módifica el código a tu gusto y haz las pruebas que requieras.
57 | 58 | 59 | ### Request y Reponse 60 | 61 | ![Response example](https://www.mercantilbanco.com/mercprod/apiportal/images/request_api_c2p_search.png) 62 | ![Request example](https://www.mercantilbanco.com/mercprod/apiportal/images/response_api_c2p_search.png) 63 | 64 | >[!NOTE] 65 | Para información detallada sobre los campos del request pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/api_c2p_search_descripcion_de_atributos_y_campos_0.pdf). 66 | 67 | ### Códigos de error 68 | 69 | >[!NOTE] 70 | Para información detallada sobre la lista de errores pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/api_c2p_search_tipo_de_errores_0.pdf). 71 | -------------------------------------------------------------------------------- /tdd/readme.md: -------------------------------------------------------------------------------- 1 | # Botón de Pagos con Tarjeta de Débito. 2 | 3 | >[!NOTE] 4 | [Más informacion sobre el API.](https://apiportal.mercantilbanco.com/mercantil-banco/produccion/product/21031) 5 | 6 | ### Índice 7 | 8 | 1. [Ejemplo de encriptación](./modules/crypto.js) 9 | 2. [Ejemplo de petición fetch](./modules/pay.js) 10 | 3. [API Playground](#playground)
11 | 3.1 [Configuración y uso del API playground](#playground-config)
12 | 3.2 [Ejemplos de uso del API playground](#playground-examples) 13 | 4. [Request y Response](#rq) 14 | 5. [Códigos de error](#error-codes) 15 | 16 | 17 | 18 | ## API Playground 19 | 20 | 21 | ### Configuración y uso del API Playground 22 | 23 | >[!IMPORTANT] 24 | **Debes tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para la correcta configuración y ejecución de este ejemplo.** 25 | 26 | **Ten a la mano el ejemplo de [Autorización para pagos con tarjeta de débito(GetAuth)](../getauth/), requerirás usar esa API para poder ejecutar el pago.** 27 | 28 | 1. Descargar el código de ejemplo ubicado en este repositorio haciendo click [aquí](https://github.com/apimercantil/api-playground/releases/download/V1/tdd.zip).
29 | 30 | 2. Descomprimir el archivo descargado en su ordenador.
31 | 32 | 3. Abrir con un editor de texto(VS Code, Notepad, Sublime Text, Atom) el archivo **/.env** ubicado en la carpeta principal del ejemplo.
33 | 34 | 4. Configurar sus credenciales en el archivo abierto (Utilizar las credenciales suministradas por Mercantil Banco).
35 | ![Imagen de ejemplo](./img/readme-img-1.png) 36 | 37 | 5. Abrir desde la terminal la **carpeta principal del proyecto**.
38 | ![Imagen de ejemplo](./img/readme-img-2.png) 39 | 40 | 6. Ejecutar el comando ```npm i``` o ```npm install``` (Recuerda tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para poder continuar con la configuración).
41 | ![Imagen de ejemplo](./img/readme-img-3.png) 42 | 43 | 7. Ejecuta el ejemplo con el comando ```npm run play``` o ```node index.js```.
44 | ![Imagen de ejemplo](./img/readme-img-4.png) 45 | 46 | 47 | ### Ejemplos de uso del API Playground 48 | 49 | 1. Ingresar la información en el formulario de autorización.
50 | ![Imagen de ejemplo](./img/readme-img-5.png) 51 | 52 | 8. Presionar el botón del formulario para enviar la petición.
53 | ![Imagen de ejemplo](./img/readme-img-6.png) 54 | 55 | 9. Revisar el request y el response.
56 | ![Imagen de ejemplo](./img/readme-img-7.png) 57 | 58 | 10. Módifica el código a tu gusto y haz las pruebas que requieras.
59 | 60 | 61 | ### Request y Reponse 62 | 63 | ![Request|Response example](https://www.mercantilbanco.com/mercprod/apiportal/images/img_auth.png) 64 | 65 | >[!NOTE]] 66 | Para información detallada sobre los campos del request pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/mapping_campos_tipo_txns_tdd.pdf). 67 | 68 | ### Códigos de error 69 | 70 | >[!NOTE] 71 | Para información detallada sobre la lista de errores pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/Errores_con_TDD.pdf). 72 | -------------------------------------------------------------------------------- /transfer-search/readme.md: -------------------------------------------------------------------------------- 1 | # Búsqueda de transferencias. 2 | 3 | >[!NOTE] 4 | [Más informacion sobre el API.](https://apiportal.mercantilbanco.com/mercantil-banco/produccion/product/24783) 5 | 6 | ### Índice 7 | 8 | 1. [Ejemplo de encriptación](./modules/crypto.js) 9 | 2. [Ejemplo de petición fetch](./modules/getauth.js) 10 | 3. [API Playground](#playground)
11 | 3.1 [Configuración y uso del API playground](#playground-config)
12 | 3.2 [Ejemplos de uso del API playground](#playground-examples) 13 | 4. [Request y Response](#rq) 14 | 5. [Códigos de error](#error-codes) 15 | 16 | 17 | 18 | ## API Playground 19 | 20 | 21 | ### Configuración y uso del API Playground 22 | 23 | >[!IMPORTANT] 24 | **Debes tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para la correcta configuración y ejecución de este ejemplo.** 25 | 26 | 1. Descargar el código de ejemplo ubicado en este repositorio haciendo click [aquí](https://github.com/apimercantil/api-playground/releases/download/V1/transfer-search.zip).
27 | 28 | 2. Descomprimir el archivo descargado en su ordenador.
29 | 30 | 3. Abrir con un editor de texto(VS Code, Notepad, Sublime Text, Atom) el archivo **/.env** ubicado en la carpeta principal del ejemplo.
31 | 32 | 4. Configurar sus credenciales en el archivo abierto (Utilizar las credenciales suministradas por Mercantil Banco).
33 | ![Imagen de ejemplo](./img/readme-img-1.png) 34 | 35 | 5. Abrir desde la terminal la **carpeta principal del proyecto**.
36 | ![Imagen de ejemplo](./img/readme-img-2.png) 37 | 38 | 6. Ejecutar el comando ```npm i``` o ```npm install``` (Recuerda tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para poder continuar con la configuración).
39 | ![Imagen de ejemplo](./img/readme-img-3.png) 40 | 41 | 7. Ejecuta el ejemplo con el comando ```npm run play``` o ```node index.js```.
42 | ![Imagen de ejemplo](./img/readme-img-4.png) 43 | 44 | 45 | ### Ejemplos de uso del API Playground 46 | 47 | 1. Ingresar la información en el formulario de autorización.
48 | ![Imagen de ejemplo](./img/readme-img-5.png) 49 | 50 | 8. Presionar el botón del formulario para enviar la petición.
51 | ![Imagen de ejemplo](./img/readme-img-6.png) 52 | 53 | 9. Revisar el request y el response.
54 | ![Imagen de ejemplo](./img/readme-img-7.png) 55 | 56 | 10. Módifica el código a tu gusto y haz las pruebas que requieras.
57 | 58 | 59 | ### Request y Reponse 60 | 61 | ![Request example](https://www.mercantilbanco.com/mercprod/apiportal/images/request_api_transfer_search.png) 62 | ![Response example](https://www.mercantilbanco.com/mercprod/apiportal/images/response_api_transfer_search.png) 63 | 64 | >[!NOTE] 65 | Para información detallada sobre los campos del request pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/api_transfer_search_descripcion_de_atributos_y_campos_0.pdf). 66 | 67 | ### Códigos de error 68 | 69 | >[!NOTE] 70 | Para información detallada sobre la lista de errores pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/api_transfer_search_tipo_de_errores_0.pdf). 71 | -------------------------------------------------------------------------------- /c2p/readme.md: -------------------------------------------------------------------------------- 1 | # Botón de pagos móviles(C2P, vuelto y anulación). 2 | 3 | >[!NOTE] 4 | [Más informacion sobre el API.](https://apiportal.mercantilbanco.com/mercantil-banco/produccion/product/21034) 5 | 6 | ### Índice 7 | 8 | 1. [Ejemplo de encriptación](./modules/crypto.js) 9 | 2. [Ejemplo de petición fetch](./modules/c2p.js) 10 | 3. [API Playground](#playground)
11 | 3.1 [Configuración y uso del API playground](#playground-config)
12 | 3.2 [Ejemplos de uso del API playground](#playground-examples) 13 | 4. [Request y Response](#rq) 14 | 5. [Códigos de error](#error-codes) 15 | 16 | 17 | 18 | ## API Playground 19 | 20 | 21 | ### Configuración y uso del API Playground 22 | 23 | >[!IMPORTANT] 24 | **Debes tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para la correcta configuración y ejecución de este ejemplo.** 25 | 26 | 1. Descargar el código de ejemplo ubicado en este repositorio haciendo click [aquí](https://github.com/apimercantil/api-playground/releases/download/V1/c2p.zip).
27 | 28 | 2. Descomprimir el archivo descargado en su ordenador.
29 | 30 | 3. Abrir con un editor de texto(VS Code, Notepad, Sublime Text, Atom) el archivo **/.env** ubicado en la carpeta principal del ejemplo.
31 | 32 | 4. Configurar sus credenciales en el archivo abierto (Utilizar las credenciales suministradas por Mercantil Banco).
33 | ![Imagen de ejemplo](./img/readme-img-1.png) 34 | 35 | 5. Abrir desde la terminal la **carpeta principal del proyecto**.
36 | ![Imagen de ejemplo](./img/readme-img-2.png) 37 | 38 | 6. Ejecutar el comando ```npm i``` o ```npm install``` (Recuerda tener instalado [NodeJS(^20.12.2)](https://nodejs.org/) para poder continuar con la configuración).
39 | ![Imagen de ejemplo](./img/readme-img-3.png) 40 | 41 | 7. Ejecuta el ejemplo con el comando ```npm run play``` o ```node index.js```.
42 | ![Imagen de ejemplo](./img/readme-img-4.png) 43 | 44 | 45 | ### Ejemplos de uso del API Playground 46 | 47 | 1. Ingresar la información en el formulario de pago.
48 | ![Imagen de ejemplo](./img/readme-img-5.png) 49 | 50 | 8. Presionar el botón del formulario para enviar la petición.
51 | ![Imagen de ejemplo](./img/readme-img-6.png) 52 | 53 | 9. Revisar el request y el response.
54 | ![Imagen de ejemplo](./img/readme-img-7.png) 55 | 56 | 10. Módifica el código a tu gusto y haz las pruebas que requieras.
57 | 58 | 59 | ### Request y Reponse 60 | 61 | ![Response example](https://www.mercantilbanco.com/mercprod/apiportal/images/request_vuelto_c2p.png) 62 | ![Request example](https://www.mercantilbanco.com/mercprod/apiportal/images/response_vuelto_c2p.png) 63 | 64 | >[!NOTE] 65 | Para información detallada sobre los campos del request pulsa [compra y anulación](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/api_c2p_descripcion_de_atributos_y_campos_compra_anulacion_0.pdf) - [vuelto](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/api_c2p_descripcion_de_atributos_y_campos_vuelto_0.pdf). 66 | 67 | ### Códigos de error 68 | 69 | >[!NOTE] 70 | Para información detallada sobre la lista de errores pulsa [aquí](https://www.mercantilbanco.com/mercprod/apiportal/pdfs/api_c2p_tipo_de_errores_0.pdf). 71 | -------------------------------------------------------------------------------- /search-c2p/views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Búsquedas de pagos móviles(C2P) 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 |
17 | 18 |
19 |

Búsquedas de pagos móviles(C2P)

20 | 21 | 22 | 23 |
24 |
25 | 26 |
27 | 34 | 35 |
36 | 37 |
38 |
39 | 40 |
41 | 48 | 49 |
50 |
51 |
52 | 53 | 54 |
55 |
56 | 57 | 58 |
59 |
60 | 61 | 62 |
63 |
64 | 65 | 66 | 67 |
68 |

69 |

70 | Reintentar 71 |
72 | 73 |
74 | 75 |
76 |
77 |

Request

78 |
79 |
80 |
81 |

Response

82 |
83 |
84 |
85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /tdd/views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Pago con tarjeta de débito 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 |
17 | 18 |
19 |

Pago con tarjeta de débito

20 | 21 | 22 | 23 |
24 |
25 | 26 |
27 | 35 | 36 |
37 |
38 |
39 | 40 | 44 |
45 |
46 | 47 | 48 |
49 |
50 | 51 | 52 |
53 |
54 | 55 | 56 |
57 |
58 | 59 | 60 |
61 |
62 | 63 | 64 |
65 |
66 | 67 | 68 |
69 |
70 | 71 | 72 | 73 |
74 |

75 |

76 | Reintentar 77 |
78 | 79 |
80 | 81 |
82 |
83 |

Request

84 |
85 |
86 |
87 |

Response

88 |
89 |
90 |
91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /c2p/views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Botón de pagos móviles(C2P) 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 |
17 | 18 |
19 |

Botón de pagos móviles(C2P)

20 | 21 | 22 | 23 |
24 |
25 | 26 | 31 |
32 |
33 | 34 |
35 | 42 | 43 |
44 | 45 |
46 | 47 |
48 | 49 |
50 | 57 | 58 |
59 |
60 | 61 |
62 | 63 | 64 |
65 | 66 |
67 | 68 | 69 |
70 | 71 |
72 | 73 | 74 |
75 |
76 | 77 | 78 |
79 |
80 | 81 | 82 | 83 |
84 |

85 |

86 | Reintentar 87 |
88 | 89 |
90 | 91 |
92 |
93 |

Request

94 |
95 |
96 |
97 |

Response

98 |
99 |
100 |
101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /scp/public/js/interface.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ====================================== 3 | * Funcion para mostrar el response y request 4 | * ====================================== 5 | */ 6 | 7 | function renderSpaces(amount) { 8 | let string = ''; 9 | for(let i = 0; i < amount; i++) { 10 | string += ' '; 11 | } 12 | return string; 13 | } 14 | 15 | function renderObject(object, spaces, element) { 16 | element.innerHTML += `{\n`; 17 | Object.keys(object).forEach( (key, index) => { 18 | element.innerHTML += `${renderSpaces(spaces)}${key}: `; 19 | if(typeof object[key] == "object") { 20 | spaces += 2 21 | renderObject(object[key], spaces, element) 22 | spaces -= 2 23 | element.innerHTML += `${renderSpaces(spaces)}}`; 24 | } else { 25 | element.innerHTML += `${typeof object[key] == "string" ? `"${object[key]}"` : object[key]} index) element.innerHTML += `,`; 28 | element.innerHTML += `\n`; 29 | }); 30 | } 31 | 32 | /* 33 | * ============================================ 34 | * Funcion para mostrar la información del JSON 35 | * ============================================ 36 | */ 37 | 38 | function displayJsonInfo(rq, rs) { 39 | 40 | document.querySelector('.response div').innerHTML = ``; 41 | document.querySelector('.request div').innerHTML = ``; 42 | document.querySelector(".json-container").classList.remove("hide"); 43 | 44 | 45 | document.querySelector(".request div").innerHTML += `
`; 
 46 |     const rqElem = document.querySelector(".request div pre");
 47 |     renderObject(rq, 2, rqElem);
 48 |     document.querySelector('.request div pre').innerHTML += `}`;
 49 |     
 50 |     
 51 | 
 52 |     document.querySelector('.response div').innerHTML += `
`;
 53 |     const rsElem = document.querySelector(".response div pre");
 54 |     renderObject(rs, 2, rsElem);
 55 |     document.querySelector('.response div pre').innerHTML += `}`;
 56 | }
 57 | 
 58 | /*
 59 |  * =========================================
 60 |  * Funcion para cambiar de formulario activo
 61 |  * ========================================= 
 62 | */
 63 | 
 64 | const displayForm = () => {
 65 |     document.querySelector('form').classList.add('hide');
 66 |     document.querySelector('.payment-title').innerText = 'Crear agendamiento';
 67 |     document.querySelector(".next").classList.add('hide');
 68 |     document.querySelector('.transaction-response').classList.add('hide');
 69 |     document.querySelector('.json-container').classList.add('hide');
 70 |     document.querySelector("button").classList.remove("hide");
 71 | };
 72 | 
 73 | /* 
 74 |  * ==============================================
 75 |  * Funcion para mostrar nuevamente el formmulario
 76 |  * ==============================================
 77 |  */
 78 | 
 79 | function displayBack() {
 80 |     document.querySelector(".json-container").classList.add("hide");
 81 |     document.querySelector(".loader").classList.add("hide");
 82 |     document.querySelector(".transaction-response").classList.add("hide");
 83 |     document.querySelector('form').classList.remove('hide');
 84 |     document.querySelector("button").classList.remove("hide");
 85 | }
 86 | 
 87 | function displayResponse(rq, rs) {
 88 |     document.querySelector(".transaction-response").classList.remove("hide");
 89 |     document.querySelector("form").classList.add("hide");
 90 |     document.querySelector("button").classList.add("hide");
 91 |     if(rs.hasOwnProperty("errorList") || rs.hasOwnProperty("error_list") || rs.hasOwnProperty("code") || rs.hasOwnProperty("httpCode") || rs.hasOwnProperty("http_code")) {
 92 |         document.querySelector(".transaction-response h2").innerText = "Error al procesar la solicitud";
 93 |         document.querySelector(".transaction-response h2").classList.add('error');
 94 |         document.querySelector(".transaction-response p").innerText = "Se ha generado un error al procesar la solicitud";
 95 |     }
 96 |     else {
 97 |         document.querySelector(".transaction-response h2").innerText = "Solicitud procesada exitosamente";
 98 |         document.querySelector(".transaction-response h2").classList.remove('error')
 99 |         document.querySelector(".transaction-response p").innerText = "Su solicitud se ha procesado exitosamente";
100 |     }
101 |     displayJsonInfo(rq, rs);
102 | }
103 | 
104 | export { displayBack, displayJsonInfo, displayResponse, displayForm };


--------------------------------------------------------------------------------
/tdc/public/js/interface.js:
--------------------------------------------------------------------------------
  1 | /* 
  2 |  * ======================================
  3 |  * Funcion para mostrar el response y request
  4 |  * ======================================
  5 |  */
  6 | 
  7 | function renderSpaces(amount) {
  8 |     let string = '';
  9 |     for(let i = 0; i < amount; i++) {
 10 |         string += ' ';
 11 |     }
 12 |     return string;
 13 | }
 14 | 
 15 | function renderObject(object, spaces, element) {
 16 |     element.innerHTML += `{\n`;
 17 |     Object.keys(object).forEach( (key, index) => {
 18 |         element.innerHTML += `${renderSpaces(spaces)}${key}: `;
 19 |         if(typeof object[key] == "object") {
 20 |             spaces += 2
 21 |             renderObject(object[key], spaces, element)
 22 |             spaces -= 2
 23 |             element.innerHTML += `${renderSpaces(spaces)}}`;
 24 |         } else {
 25 |             element.innerHTML += `${typeof object[key] == "string" ? `"${object[key]}"` :  object[key]} index) element.innerHTML += `,`;
 28 |             element.innerHTML += `\n`;
 29 |     });
 30 | }
 31 | 
 32 | /*
 33 |  * ============================================
 34 |  * Funcion para mostrar la información del JSON 
 35 |  * ============================================
 36 | */
 37 | 
 38 | function displayJsonInfo(rq, rs) {
 39 |     
 40 |     document.querySelector('.response div').innerHTML = ``;
 41 |     document.querySelector('.request div').innerHTML = ``;
 42 |     document.querySelector(".json-container").classList.remove("hide");
 43 | 
 44 |     
 45 |     document.querySelector(".request div").innerHTML += `
`; 
 46 |     const rqElem = document.querySelector(".request div pre");
 47 |     renderObject(rq, 2, rqElem);
 48 |     document.querySelector('.request div pre').innerHTML += `}`;
 49 |     
 50 |     
 51 | 
 52 |     document.querySelector('.response div').innerHTML += `
`;
 53 |     const rsElem = document.querySelector(".response div pre");
 54 |     renderObject(rs, 2, rsElem);
 55 |     document.querySelector('.response div pre').innerHTML += `}`;
 56 | }
 57 | 
 58 | /*
 59 |  * =========================================
 60 |  * Funcion para cambiar de formulario activo
 61 |  * ========================================= 
 62 | */
 63 | 
 64 | const displayForm = () => {
 65 |     document.querySelector('form').classList.add('hide');
 66 |     document.querySelector('.payment-title').innerText = 'Crear agendamiento';
 67 |     document.querySelector(".next").classList.add('hide');
 68 |     document.querySelector('.transaction-response').classList.add('hide');
 69 |     document.querySelector('.json-container').classList.add('hide');
 70 |     document.querySelector("button").classList.remove("hide");
 71 | };
 72 | 
 73 | /* 
 74 |  * ==============================================
 75 |  * Funcion para mostrar nuevamente el formmulario
 76 |  * ==============================================
 77 |  */
 78 | 
 79 | function displayBack() {
 80 |     document.querySelector(".json-container").classList.add("hide");
 81 |     document.querySelector(".loader").classList.add("hide");
 82 |     document.querySelector(".transaction-response").classList.add("hide");
 83 |     document.querySelector('form').classList.remove('hide');
 84 |     document.querySelector("button").classList.remove("hide");
 85 | }
 86 | 
 87 | function displayResponse(rq, rs) {
 88 |     document.querySelector(".transaction-response").classList.remove("hide");
 89 |     document.querySelector("form").classList.add("hide");
 90 |     document.querySelector("button").classList.add("hide");
 91 |     if(rs.hasOwnProperty("errorList") || rs.hasOwnProperty("error_list") || rs.hasOwnProperty("code") || rs.hasOwnProperty("httpCode") || rs.hasOwnProperty("http_code")) {
 92 |         document.querySelector(".transaction-response h2").innerText = "Error al procesar la solicitud";
 93 |         document.querySelector(".transaction-response h2").classList.add('error');
 94 |         document.querySelector(".transaction-response p").innerText = "Se ha generado un error al procesar la solicitud";
 95 |     }
 96 |     else {
 97 |         document.querySelector(".transaction-response h2").innerText = "Solicitud procesada exitosamente";
 98 |         document.querySelector(".transaction-response h2").classList.remove('error')
 99 |         document.querySelector(".transaction-response p").innerText = "Su solicitud se ha procesado exitosamente";
100 |     }
101 |     displayJsonInfo(rq, rs);
102 | }
103 | 
104 | export { displayBack, displayJsonInfo, displayResponse, displayForm };


--------------------------------------------------------------------------------
/tdd/public/js/interface.js:
--------------------------------------------------------------------------------
  1 | /* 
  2 |  * ======================================
  3 |  * Funcion para mostrar el response y request
  4 |  * ======================================
  5 |  */
  6 | 
  7 | function renderSpaces(amount) {
  8 |     let string = '';
  9 |     for(let i = 0; i < amount; i++) {
 10 |         string += ' ';
 11 |     }
 12 |     return string;
 13 | }
 14 | 
 15 | function renderObject(object, spaces, element) {
 16 |     element.innerHTML += `{\n`;
 17 |     Object.keys(object).forEach( (key, index) => {
 18 |         element.innerHTML += `${renderSpaces(spaces)}${key}: `;
 19 |         if(typeof object[key] == "object") {
 20 |             spaces += 2
 21 |             renderObject(object[key], spaces, element)
 22 |             spaces -= 2
 23 |             element.innerHTML += `${renderSpaces(spaces)}}`;
 24 |         } else {
 25 |             element.innerHTML += `${typeof object[key] == "string" ? `"${object[key]}"` :  object[key]} index) element.innerHTML += `,`;
 28 |             element.innerHTML += `\n`;
 29 |     });
 30 | }
 31 | 
 32 | /*
 33 |  * ============================================
 34 |  * Funcion para mostrar la información del JSON 
 35 |  * ============================================
 36 | */
 37 | 
 38 | function displayJsonInfo(rq, rs) {
 39 |     
 40 |     document.querySelector('.response div').innerHTML = ``;
 41 |     document.querySelector('.request div').innerHTML = ``;
 42 |     document.querySelector(".json-container").classList.remove("hide");
 43 | 
 44 |     
 45 |     document.querySelector(".request div").innerHTML += `
`; 
 46 |     const rqElem = document.querySelector(".request div pre");
 47 |     renderObject(rq, 2, rqElem);
 48 |     document.querySelector('.request div pre').innerHTML += `}`;
 49 |     
 50 |     
 51 | 
 52 |     document.querySelector('.response div').innerHTML += `
`;
 53 |     const rsElem = document.querySelector(".response div pre");
 54 |     renderObject(rs, 2, rsElem);
 55 |     document.querySelector('.response div pre').innerHTML += `}`;
 56 | }
 57 | 
 58 | /*
 59 |  * =========================================
 60 |  * Funcion para cambiar de formulario activo
 61 |  * ========================================= 
 62 | */
 63 | 
 64 | const displayForm = () => {
 65 |     document.querySelector('form').classList.add('hide');
 66 |     document.querySelector('.payment-title').innerText = 'Crear agendamiento';
 67 |     document.querySelector(".next").classList.add('hide');
 68 |     document.querySelector('.transaction-response').classList.add('hide');
 69 |     document.querySelector('.json-container').classList.add('hide');
 70 |     document.querySelector("button").classList.remove("hide");
 71 | };
 72 | 
 73 | /* 
 74 |  * ==============================================
 75 |  * Funcion para mostrar nuevamente el formmulario
 76 |  * ==============================================
 77 |  */
 78 | 
 79 | function displayBack() {
 80 |     document.querySelector(".json-container").classList.add("hide");
 81 |     document.querySelector(".loader").classList.add("hide");
 82 |     document.querySelector(".transaction-response").classList.add("hide");
 83 |     document.querySelector('form').classList.remove('hide');
 84 |     document.querySelector("button").classList.remove("hide");
 85 | }
 86 | 
 87 | function displayResponse(rq, rs) {
 88 |     document.querySelector(".transaction-response").classList.remove("hide");
 89 |     document.querySelector("form").classList.add("hide");
 90 |     document.querySelector("button").classList.add("hide");
 91 |     if(rs.hasOwnProperty("errorList") || rs.hasOwnProperty("error_list") || rs.hasOwnProperty("code") || rs.hasOwnProperty("httpCode") || rs.hasOwnProperty("http_code")) {
 92 |         document.querySelector(".transaction-response h2").innerText = "Error al procesar la solicitud";
 93 |         document.querySelector(".transaction-response h2").classList.add('error');
 94 |         document.querySelector(".transaction-response p").innerText = "Se ha generado un error al procesar la solicitud";
 95 |     }
 96 |     else {
 97 |         document.querySelector(".transaction-response h2").innerText = "Solicitud procesada exitosamente";
 98 |         document.querySelector(".transaction-response h2").classList.remove('error')
 99 |         document.querySelector(".transaction-response p").innerText = "Su solicitud se ha procesado exitosamente";
100 |     }
101 |     displayJsonInfo(rq, rs);
102 | }
103 | 
104 | export { displayBack, displayJsonInfo, displayResponse, displayForm };


--------------------------------------------------------------------------------
/getauth/public/js/interface.js:
--------------------------------------------------------------------------------
  1 | /* 
  2 |  * ======================================
  3 |  * Funcion para mostrar el response y request
  4 |  * ======================================
  5 |  */
  6 | 
  7 | function renderSpaces(amount) {
  8 |     let string = '';
  9 |     for(let i = 0; i < amount; i++) {
 10 |         string += ' ';
 11 |     }
 12 |     return string;
 13 | }
 14 | 
 15 | function renderObject(object, spaces, element) {
 16 |     element.innerHTML += `{\n`;
 17 |     Object.keys(object).forEach( (key, index) => {
 18 |         element.innerHTML += `${renderSpaces(spaces)}${key}: `;
 19 |         if(typeof object[key] == "object") {
 20 |             spaces += 2
 21 |             renderObject(object[key], spaces, element)
 22 |             spaces -= 2
 23 |             element.innerHTML += `${renderSpaces(spaces)}}`;
 24 |         } else {
 25 |             element.innerHTML += `${typeof object[key] == "string" ? `"${object[key]}"` :  object[key]} index) element.innerHTML += `,`;
 28 |             element.innerHTML += `\n`;
 29 |     });
 30 | }
 31 | 
 32 | /*
 33 |  * ============================================
 34 |  * Funcion para mostrar la información del JSON 
 35 |  * ============================================
 36 | */
 37 | 
 38 | function displayJsonInfo(rq, rs) {
 39 |     
 40 |     document.querySelector('.response div').innerHTML = ``;
 41 |     document.querySelector('.request div').innerHTML = ``;
 42 |     document.querySelector(".json-container").classList.remove("hide");
 43 | 
 44 |     
 45 |     document.querySelector(".request div").innerHTML += `
`; 
 46 |     const rqElem = document.querySelector(".request div pre");
 47 |     renderObject(rq, 2, rqElem);
 48 |     document.querySelector('.request div pre').innerHTML += `}`;
 49 |     
 50 |     
 51 | 
 52 |     document.querySelector('.response div').innerHTML += `
`;
 53 |     const rsElem = document.querySelector(".response div pre");
 54 |     renderObject(rs, 2, rsElem);
 55 |     document.querySelector('.response div pre').innerHTML += `}`;
 56 | }
 57 | 
 58 | /*
 59 |  * =========================================
 60 |  * Funcion para cambiar de formulario activo
 61 |  * ========================================= 
 62 | */
 63 | 
 64 | const displayForm = () => {
 65 |     document.querySelector('form').classList.add('hide');
 66 |     document.querySelector('.payment-title').innerText = 'Crear agendamiento';
 67 |     document.querySelector(".next").classList.add('hide');
 68 |     document.querySelector('.transaction-response').classList.add('hide');
 69 |     document.querySelector('.json-container').classList.add('hide');
 70 |     document.querySelector("button").classList.remove("hide");
 71 | };
 72 | 
 73 | /* 
 74 |  * ==============================================
 75 |  * Funcion para mostrar nuevamente el formmulario
 76 |  * ==============================================
 77 |  */
 78 | 
 79 | function displayBack() {
 80 |     document.querySelector(".json-container").classList.add("hide");
 81 |     document.querySelector(".loader").classList.add("hide");
 82 |     document.querySelector(".transaction-response").classList.add("hide");
 83 |     document.querySelector('form').classList.remove('hide');
 84 |     document.querySelector("button").classList.remove("hide");
 85 | }
 86 | 
 87 | function displayResponse(rq, rs) {
 88 |     document.querySelector(".transaction-response").classList.remove("hide");
 89 |     document.querySelector("form").classList.add("hide");
 90 |     document.querySelector("button").classList.add("hide");
 91 |     if(rs.hasOwnProperty("errorList") || rs.hasOwnProperty("error_list") || rs.hasOwnProperty("code") || rs.hasOwnProperty("httpCode") || rs.hasOwnProperty("http_code")) {
 92 |         document.querySelector(".transaction-response h2").innerText = "Error al procesar la solicitud";
 93 |         document.querySelector(".transaction-response h2").classList.add('error');
 94 |         document.querySelector(".transaction-response p").innerText = "Se ha generado un error al procesar la solicitud";
 95 |     }
 96 |     else {
 97 |         document.querySelector(".transaction-response h2").innerText = "Solicitud procesada exitosamente";
 98 |         document.querySelector(".transaction-response h2").classList.remove('error')
 99 |         document.querySelector(".transaction-response p").innerText = "Su solicitud se ha procesado exitosamente";
100 |     }
101 |     displayJsonInfo(rq, rs);
102 | }
103 | 
104 | export { displayBack, displayJsonInfo, displayResponse, displayForm };


--------------------------------------------------------------------------------
/td-search/public/js/interface.js:
--------------------------------------------------------------------------------
  1 | /* 
  2 |  * ======================================
  3 |  * Funcion para mostrar el response y request
  4 |  * ======================================
  5 |  */
  6 | 
  7 | function renderSpaces(amount) {
  8 |     let string = '';
  9 |     for(let i = 0; i < amount; i++) {
 10 |         string += ' ';
 11 |     }
 12 |     return string;
 13 | }
 14 | 
 15 | function renderObject(object, spaces, element) {
 16 |     element.innerHTML += `{\n`;
 17 |     Object.keys(object).forEach( (key, index) => {
 18 |         element.innerHTML += `${renderSpaces(spaces)}${key}: `;
 19 |         if(typeof object[key] == "object") {
 20 |             spaces += 2
 21 |             renderObject(object[key], spaces, element)
 22 |             spaces -= 2
 23 |             element.innerHTML += `${renderSpaces(spaces)}}`;
 24 |         } else {
 25 |             element.innerHTML += `${typeof object[key] == "string" ? `"${object[key]}"` :  object[key]} index) element.innerHTML += `,`;
 28 |             element.innerHTML += `\n`;
 29 |     });
 30 | }
 31 | 
 32 | /*
 33 |  * ============================================
 34 |  * Funcion para mostrar la información del JSON 
 35 |  * ============================================
 36 | */
 37 | 
 38 | function displayJsonInfo(rq, rs) {
 39 |     
 40 |     document.querySelector('.response div').innerHTML = ``;
 41 |     document.querySelector('.request div').innerHTML = ``;
 42 |     document.querySelector(".json-container").classList.remove("hide");
 43 | 
 44 |     
 45 |     document.querySelector(".request div").innerHTML += `
`; 
 46 |     const rqElem = document.querySelector(".request div pre");
 47 |     renderObject(rq, 2, rqElem);
 48 |     document.querySelector('.request div pre').innerHTML += `}`;
 49 |     
 50 |     
 51 | 
 52 |     document.querySelector('.response div').innerHTML += `
`;
 53 |     const rsElem = document.querySelector(".response div pre");
 54 |     renderObject(rs, 2, rsElem);
 55 |     document.querySelector('.response div pre').innerHTML += `}`;
 56 | }
 57 | 
 58 | /*
 59 |  * =========================================
 60 |  * Funcion para cambiar de formulario activo
 61 |  * ========================================= 
 62 | */
 63 | 
 64 | const displayForm = () => {
 65 |     document.querySelector('form').classList.add('hide');
 66 |     document.querySelector('.payment-title').innerText = 'Crear agendamiento';
 67 |     document.querySelector(".next").classList.add('hide');
 68 |     document.querySelector('.transaction-response').classList.add('hide');
 69 |     document.querySelector('.json-container').classList.add('hide');
 70 |     document.querySelector("button").classList.remove("hide");
 71 | };
 72 | 
 73 | /* 
 74 |  * ==============================================
 75 |  * Funcion para mostrar nuevamente el formmulario
 76 |  * ==============================================
 77 |  */
 78 | 
 79 | function displayBack() {
 80 |     document.querySelector(".json-container").classList.add("hide");
 81 |     document.querySelector(".loader").classList.add("hide");
 82 |     document.querySelector(".transaction-response").classList.add("hide");
 83 |     document.querySelector('form').classList.remove('hide');
 84 |     document.querySelector("button").classList.remove("hide");
 85 | }
 86 | 
 87 | function displayResponse(rq, rs) {
 88 |     document.querySelector(".transaction-response").classList.remove("hide");
 89 |     document.querySelector("form").classList.add("hide");
 90 |     document.querySelector("button").classList.add("hide");
 91 |     if(rs.hasOwnProperty("errorList") || rs.hasOwnProperty("error_list") || rs.hasOwnProperty("code") || rs.hasOwnProperty("httpCode") || rs.hasOwnProperty("http_code")) {
 92 |         document.querySelector(".transaction-response h2").innerText = "Error al procesar la solicitud";
 93 |         document.querySelector(".transaction-response h2").classList.add('error');
 94 |         document.querySelector(".transaction-response p").innerText = "Se ha generado un error al procesar la solicitud";
 95 |     }
 96 |     else {
 97 |         document.querySelector(".transaction-response h2").innerText = "Solicitud procesada exitosamente";
 98 |         document.querySelector(".transaction-response h2").classList.remove('error')
 99 |         document.querySelector(".transaction-response p").innerText = "Su solicitud se ha procesado exitosamente";
100 |     }
101 |     displayJsonInfo(rq, rs);
102 | }
103 | 
104 | export { displayBack, displayJsonInfo, displayResponse, displayForm };


--------------------------------------------------------------------------------
/transfer-search/public/js/interface.js:
--------------------------------------------------------------------------------
  1 | /* 
  2 |  * ======================================
  3 |  * Funcion para mostrar el response y request
  4 |  * ======================================
  5 |  */
  6 | 
  7 | function renderSpaces(amount) {
  8 |     let string = '';
  9 |     for(let i = 0; i < amount; i++) {
 10 |         string += ' ';
 11 |     }
 12 |     return string;
 13 | }
 14 | 
 15 | function renderObject(object, spaces, element) {
 16 |     element.innerHTML += `{\n`;
 17 |     Object.keys(object).forEach( (key, index) => {
 18 |         element.innerHTML += `${renderSpaces(spaces)}${key}: `;
 19 |         if(typeof object[key] == "object") {
 20 |             spaces += 2
 21 |             renderObject(object[key], spaces, element)
 22 |             spaces -= 2
 23 |             element.innerHTML += `${renderSpaces(spaces)}}`;
 24 |         } else {
 25 |             element.innerHTML += `${typeof object[key] == "string" ? `"${object[key]}"` :  object[key]} index) element.innerHTML += `,`;
 28 |             element.innerHTML += `\n`;
 29 |     });
 30 | }
 31 | 
 32 | /*
 33 |  * ============================================
 34 |  * Funcion para mostrar la información del JSON 
 35 |  * ============================================
 36 | */
 37 | 
 38 | function displayJsonInfo(rq, rs) {
 39 |     
 40 |     document.querySelector('.response div').innerHTML = ``;
 41 |     document.querySelector('.request div').innerHTML = ``;
 42 |     document.querySelector(".json-container").classList.remove("hide");
 43 | 
 44 |     
 45 |     document.querySelector(".request div").innerHTML += `
`; 
 46 |     const rqElem = document.querySelector(".request div pre");
 47 |     renderObject(rq, 2, rqElem);
 48 |     document.querySelector('.request div pre').innerHTML += `}`;
 49 |     
 50 |     
 51 | 
 52 |     document.querySelector('.response div').innerHTML += `
`;
 53 |     const rsElem = document.querySelector(".response div pre");
 54 |     renderObject(rs, 2, rsElem);
 55 |     document.querySelector('.response div pre').innerHTML += `}`;
 56 | }
 57 | 
 58 | /*
 59 |  * =========================================
 60 |  * Funcion para cambiar de formulario activo
 61 |  * ========================================= 
 62 | */
 63 | 
 64 | const displayForm = () => {
 65 |     document.querySelector('form').classList.add('hide');
 66 |     document.querySelector('.payment-title').innerText = 'Crear agendamiento';
 67 |     document.querySelector(".next").classList.add('hide');
 68 |     document.querySelector('.transaction-response').classList.add('hide');
 69 |     document.querySelector('.json-container').classList.add('hide');
 70 |     document.querySelector("button").classList.remove("hide");
 71 | };
 72 | 
 73 | /* 
 74 |  * ==============================================
 75 |  * Funcion para mostrar nuevamente el formmulario
 76 |  * ==============================================
 77 |  */
 78 | 
 79 | function displayBack() {
 80 |     document.querySelector(".json-container").classList.add("hide");
 81 |     document.querySelector(".loader").classList.add("hide");
 82 |     document.querySelector(".transaction-response").classList.add("hide");
 83 |     document.querySelector('form').classList.remove('hide');
 84 |     document.querySelector("button").classList.remove("hide");
 85 | }
 86 | 
 87 | function displayResponse(rq, rs) {
 88 |     document.querySelector(".transaction-response").classList.remove("hide");
 89 |     document.querySelector("form").classList.add("hide");
 90 |     document.querySelector("button").classList.add("hide");
 91 |     if(rs.hasOwnProperty("errorList") || rs.hasOwnProperty("error_list") || rs.hasOwnProperty("code") || rs.hasOwnProperty("httpCode") || rs.hasOwnProperty("http_code")) {
 92 |         document.querySelector(".transaction-response h2").innerText = "Error al procesar la solicitud";
 93 |         document.querySelector(".transaction-response h2").classList.add('error');
 94 |         document.querySelector(".transaction-response p").innerText = "Se ha generado un error al procesar la solicitud";
 95 |     }
 96 |     else {
 97 |         document.querySelector(".transaction-response h2").innerText = "Solicitud procesada exitosamente";
 98 |         document.querySelector(".transaction-response h2").classList.remove('error')
 99 |         document.querySelector(".transaction-response p").innerText = "Su solicitud se ha procesado exitosamente";
100 |     }
101 |     displayJsonInfo(rq, rs);
102 | }
103 | 
104 | export { displayBack, displayJsonInfo, displayResponse, displayForm };


--------------------------------------------------------------------------------
/c2p/public/js/interface.js:
--------------------------------------------------------------------------------
  1 | /* 
  2 |  * ======================================
  3 |  * Funcion para mostrar el response y request
  4 |  * ======================================
  5 |  */
  6 | 
  7 | function renderSpaces(amount) {
  8 |     let string = '';
  9 |     for(let i = 0; i < amount; i++) {
 10 |         string += ' ';
 11 |     }
 12 |     return string;
 13 | }
 14 | 
 15 | function renderObject(object, spaces, element) {
 16 |     element.innerHTML += `{\n`;
 17 |     Object.keys(object).forEach( (key, index) => {
 18 |         element.innerHTML += `${renderSpaces(spaces)}${key}: `;
 19 |         if(typeof object[key] == "object") {
 20 |             spaces += 2
 21 |             renderObject(object[key], spaces, element)
 22 |             spaces -= 2
 23 |             element.innerHTML += `${renderSpaces(spaces)}}`;
 24 |         } else {
 25 |             element.innerHTML += `${typeof object[key] == "string" ? `"${object[key]}"` :  object[key]} index) element.innerHTML += `,`;
 28 |             element.innerHTML += `\n`;
 29 |     });
 30 | }
 31 | 
 32 | /*
 33 |  * ============================================
 34 |  * Funcion para mostrar la información del JSON 
 35 |  * ============================================
 36 | */
 37 | 
 38 | function displayJsonInfo(rq, rs) {
 39 |     
 40 |     document.querySelector('.response div').innerHTML = ``;
 41 |     document.querySelector('.request div').innerHTML = ``;
 42 |     document.querySelector(".json-container").classList.remove("hide");
 43 | 
 44 |     
 45 |     document.querySelector(".request div").innerHTML += `
`; 
 46 |     const rqElem = document.querySelector(".request div pre");
 47 |     renderObject(rq, 2, rqElem);
 48 |     document.querySelector('.request div pre').innerHTML += `}`;
 49 |     
 50 |     
 51 | 
 52 |     document.querySelector('.response div').innerHTML += `
`;
 53 |     const rsElem = document.querySelector(".response div pre");
 54 |     renderObject(rs, 2, rsElem);
 55 |     document.querySelector('.response div pre').innerHTML += `}`;
 56 | }
 57 | 
 58 | function formDisplayHandler(e) {
 59 |     if(e.target.value == "anulacion") {
 60 |         document.querySelector(".payment-reference").classList.remove("hide");
 61 |         document.querySelector(".twofactor").classList.add("hide");
 62 |     }
 63 |     else if(e.target.value == "compra") {
 64 |         document.querySelector(".twofactor").classList.remove("hide");
 65 |         document.querySelector(".payment-reference").classList.add("hide");
 66 |     }
 67 |     else {
 68 |         document.querySelector(".payment-reference").classList.add("hide");
 69 |         document.querySelector(".twofactor").classList.add("hide");
 70 |     }
 71 | }
 72 | 
 73 | /*
 74 |  * =========================================
 75 |  * Funcion para cambiar de formulario activo
 76 |  * ========================================= 
 77 | */
 78 | 
 79 | const displayForm = () => {
 80 |     document.querySelector('form').classList.add('hide');
 81 |     document.querySelector('.payment-title').innerText = 'Crear agendamiento';
 82 |     document.querySelector(".next").classList.add('hide');
 83 |     document.querySelector('.transaction-response').classList.add('hide');
 84 |     document.querySelector('.json-container').classList.add('hide');
 85 |     document.querySelector("button").classList.remove("hide");
 86 | };
 87 | 
 88 | /* 
 89 |  * ==============================================
 90 |  * Funcion para mostrar nuevamente el formmulario
 91 |  * ==============================================
 92 |  */
 93 | 
 94 | function displayBack() {
 95 |     document.querySelector(".json-container").classList.add("hide");
 96 |     document.querySelector(".loader").classList.add("hide");
 97 |     document.querySelector(".transaction-response").classList.add("hide");
 98 |     document.querySelector('form').classList.remove('hide');
 99 |     document.querySelector("button").classList.remove("hide");
100 | }
101 | 
102 | function displayResponse(rq, rs) {
103 |     document.querySelector(".transaction-response").classList.remove("hide");
104 |     document.querySelector("form").classList.add("hide");
105 |     document.querySelector("button").classList.add("hide");
106 |     if(rs.hasOwnProperty("errorList") || rs.hasOwnProperty("error_list") || rs.hasOwnProperty("code") || rs.hasOwnProperty("httpCode") || rs.hasOwnProperty("http_code")) {
107 |         document.querySelector(".transaction-response h2").innerText = "Error al procesar la solicitud";
108 |         document.querySelector(".transaction-response h2").classList.add('error');
109 |         document.querySelector(".transaction-response p").innerText = "Se ha generado un error al procesar la solicitud";
110 |     }
111 |     else {
112 |         document.querySelector(".transaction-response h2").innerText = "Solicitud procesada exitosamente";
113 |         document.querySelector(".transaction-response h2").classList.remove('error')
114 |         document.querySelector(".transaction-response p").innerText = "Su solicitud se ha procesado exitosamente";
115 |     }
116 |     displayJsonInfo(rq, rs);
117 | }
118 | 
119 | export { displayBack, displayJsonInfo, displayResponse, displayForm, formDisplayHandler };


--------------------------------------------------------------------------------
/search-c2p/public/js/interface.js:
--------------------------------------------------------------------------------
  1 | /* 
  2 |  * ======================================
  3 |  * Funcion para mostrar el response y request
  4 |  * ======================================
  5 |  */
  6 | 
  7 | function renderSpaces(amount) {
  8 |     let string = '';
  9 |     for(let i = 0; i < amount; i++) {
 10 |         string += ' ';
 11 |     }
 12 |     return string;
 13 | }
 14 | 
 15 | function renderObject(object, spaces, element) {
 16 |     element.innerHTML += `{\n`;
 17 |     Object.keys(object).forEach( (key, index) => {
 18 |         element.innerHTML += `${renderSpaces(spaces)}${key}: `;
 19 |         if(typeof object[key] == "object") {
 20 |             spaces += 2
 21 |             renderObject(object[key], spaces, element)
 22 |             spaces -= 2
 23 |             element.innerHTML += `${renderSpaces(spaces)}}`;
 24 |         } else {
 25 |             element.innerHTML += `${typeof object[key] == "string" ? `"${object[key]}"` :  object[key]} index) element.innerHTML += `,`;
 28 |             element.innerHTML += `\n`;
 29 |     });
 30 | }
 31 | 
 32 | /*
 33 |  * ============================================
 34 |  * Funcion para mostrar la información del JSON 
 35 |  * ============================================
 36 | */
 37 | 
 38 | function displayJsonInfo(rq, rs) {
 39 |     
 40 |     document.querySelector('.response div').innerHTML = ``;
 41 |     document.querySelector('.request div').innerHTML = ``;
 42 |     document.querySelector(".json-container").classList.remove("hide");
 43 | 
 44 |     
 45 |     document.querySelector(".request div").innerHTML += `
`; 
 46 |     const rqElem = document.querySelector(".request div pre");
 47 |     renderObject(rq, 2, rqElem);
 48 |     document.querySelector('.request div pre').innerHTML += `}`;
 49 |     
 50 |     
 51 | 
 52 |     document.querySelector('.response div').innerHTML += `
`;
 53 |     const rsElem = document.querySelector(".response div pre");
 54 |     renderObject(rs, 2, rsElem);
 55 |     document.querySelector('.response div pre').innerHTML += `}`;
 56 | }
 57 | 
 58 | function formDisplayHandler(e) {
 59 |     if(e.target.value == "anulacion") {
 60 |         document.querySelector(".payment-reference").classList.remove("hide");
 61 |         document.querySelector(".twofactor").classList.add("hide");
 62 |     }
 63 |     else if(e.target.value == "compra") {
 64 |         document.querySelector(".twofactor").classList.remove("hide");
 65 |         document.querySelector(".payment-reference").classList.add("hide");
 66 |     }
 67 |     else {
 68 |         document.querySelector(".payment-reference").classList.add("hide");
 69 |         document.querySelector(".twofactor").classList.add("hide");
 70 |     }
 71 | }
 72 | 
 73 | /*
 74 |  * =========================================
 75 |  * Funcion para cambiar de formulario activo
 76 |  * ========================================= 
 77 | */
 78 | 
 79 | const displayForm = () => {
 80 |     document.querySelector('form').classList.add('hide');
 81 |     document.querySelector('.payment-title').innerText = 'Crear agendamiento';
 82 |     document.querySelector(".next").classList.add('hide');
 83 |     document.querySelector('.transaction-response').classList.add('hide');
 84 |     document.querySelector('.json-container').classList.add('hide');
 85 |     document.querySelector("button").classList.remove("hide");
 86 | };
 87 | 
 88 | /* 
 89 |  * ==============================================
 90 |  * Funcion para mostrar nuevamente el formmulario
 91 |  * ==============================================
 92 |  */
 93 | 
 94 | function displayBack() {
 95 |     document.querySelector(".json-container").classList.add("hide");
 96 |     document.querySelector(".loader").classList.add("hide");
 97 |     document.querySelector(".transaction-response").classList.add("hide");
 98 |     document.querySelector('form').classList.remove('hide');
 99 |     document.querySelector("button").classList.remove("hide");
100 | }
101 | 
102 | function displayResponse(rq, rs) {
103 |     document.querySelector(".transaction-response").classList.remove("hide");
104 |     document.querySelector("form").classList.add("hide");
105 |     document.querySelector("button").classList.add("hide");
106 |     if(rs.hasOwnProperty("errorList") || rs.hasOwnProperty("error_list") || rs.hasOwnProperty("code") || rs.hasOwnProperty("httpCode") || rs.hasOwnProperty("http_code")) {
107 |         document.querySelector(".transaction-response h2").innerText = "Error al procesar la solicitud";
108 |         document.querySelector(".transaction-response h2").classList.add('error');
109 |         document.querySelector(".transaction-response p").innerText = "Se ha generado un error al procesar la solicitud";
110 |     }
111 |     else {
112 |         document.querySelector(".transaction-response h2").innerText = "Solicitud procesada exitosamente";
113 |         document.querySelector(".transaction-response h2").classList.remove('error')
114 |         document.querySelector(".transaction-response p").innerText = "Su solicitud se ha procesado exitosamente";
115 |     }
116 |     displayJsonInfo(rq, rs);
117 | }
118 | 
119 | export { displayBack, displayJsonInfo, displayResponse, displayForm, formDisplayHandler };


--------------------------------------------------------------------------------
/tdc/public/styles/styles.css:
--------------------------------------------------------------------------------
  1 | :root {
  2 |     --azul-mercantil: #004E9B;
  3 |     --azul-claro: #009FDA;
  4 |     --naranja: #FF5800;
  5 |     --texto-primario: #666666;
  6 |     --error: #FF3333;
  7 | }
  8 | 
  9 | body,
 10 | html {
 11 |     margin: 0;
 12 |     padding: 0;
 13 |     font-family: Arial, Helvetica, sans-serif;
 14 | }
 15 | 
 16 | .nav-bar {
 17 |     width: 100%;
 18 |     height: 60px;
 19 |     gap: 0px;
 20 |     opacity: 0px;
 21 |     background: linear-gradient(90deg, var(--azul-mercantil) 0.96%, var(--azul-claro) 14.75%, var(--azul-mercantil) 37.06%);
 22 |     display: flex;
 23 |     align-items: center;
 24 | 
 25 |     .nav-logo {
 26 |         height: 80px;
 27 |         margin-left: 10%;
 28 |     }
 29 | }
 30 | 
 31 | .main-container {
 32 |     width: 700px;
 33 |     margin: 0 auto;
 34 |     padding: 12px;
 35 |     display: flex;
 36 |     flex-direction: column;
 37 |     align-items: center;
 38 |     gap: 12px;
 39 | }
 40 | 
 41 | h3 {
 42 |     text-align: center;
 43 |     color: var(--azul-claro);
 44 |     width: 100%;
 45 | }
 46 | 
 47 | form {
 48 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 49 |     padding: 12px 0;
 50 |     border: 1px solid #DFDFDF;
 51 |     display: flex;
 52 |     flex-direction: column;
 53 |     border-radius: 8px;
 54 |     width: 70%;
 55 | }
 56 | 
 57 | .transaction-response {
 58 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 59 |     border: 1px solid #DFDFDF;
 60 |     display: flex;
 61 |     flex-direction: column;
 62 |     align-items: center;
 63 |     border-radius: 8px;
 64 |     max-width: 700px;
 65 |     padding: 12px;
 66 |     h2 {
 67 |         color: var(--naranja);
 68 |         padding: 0;
 69 |         margin: 0;
 70 |     }
 71 |     p {
 72 |         margin: 0;
 73 |         margin-top: 12px;
 74 |         padding: 0;
 75 |         color: var(--azul-claro);
 76 |         font-weight: bold;
 77 |     }
 78 |     a {
 79 |         text-decoration: underline;
 80 |         color: var(--azul-claro);
 81 |         margin-top: 12px;
 82 |         cursor: pointer;
 83 |     }
 84 | }
 85 | 
 86 | fieldset {
 87 |     border: none;
 88 | 
 89 |     label {
 90 |         display: inline-block;
 91 |         color: var(--azul-mercantil);
 92 |         font-weight: bold;
 93 |     }
 94 | 
 95 |     input, select {
 96 |         display: block;
 97 |         border: 2px solid transparent;
 98 |         border-bottom-color: var(--azul-mercantil);
 99 |         outline: none;
100 |         transition: .2s ease all;
101 |         font-size: 16px;
102 |         color: var(--texto-primario);
103 |         padding-bottom: 4px;
104 |         margin-top: 12px;
105 |         width: 100%;
106 | 
107 |         &:focus {
108 |             border-bottom-color: var(--azul-claro);
109 |         }
110 |     }
111 | 
112 |     select {
113 |         width: 20%;
114 |         margin-right: 12px;
115 |     }
116 | 
117 |     div {
118 |         display: flex;
119 |     }
120 | }
121 | 
122 | button {
123 |     background-image: linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%),
124 |         linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%);
125 |     padding: 8px 32px;
126 |     border-radius: 32px;
127 |     border: 2px solid transparent;
128 |     color: #Fff;
129 |     font-size: 18px;
130 |     box-sizing: border-box;
131 |     background-origin: border-box;
132 |     background-clip: padding-box, border-box;
133 |     cursor: pointer;
134 | }
135 | 
136 | .json-container {
137 |     max-width: 1200px;
138 |     margin: 12px auto;
139 |     display: flex;
140 |     justify-content: center;
141 |     gap: 24px;
142 |     flex-wrap: wrap;
143 |     padding: 24px;
144 | }
145 | 
146 | .json-container div {
147 |     display: flex;
148 |     flex-direction: column;
149 |     align-items: flex-start;
150 |     width: 400px;
151 | }
152 | 
153 | .json-container div div {
154 |     background-color: #212121;
155 |     color: rgb(255, 255, 255);
156 |     padding: 4px;
157 |     border-radius: 8px;
158 |     overflow: scroll;
159 | }
160 | 
161 | .json-container div div::-webkit-scrollbar  {
162 |     -webkit-appearance: none;
163 | }
164 | 
165 | .json-container div div::-webkit-scrollbar-thumb {
166 |     background-color: #585858;
167 |     border-radius: 8px;
168 | }
169 | 
170 | .json-container div div::-webkit-scrollbar {
171 |     height: 10px;
172 | }
173 | 
174 | .json-container div div::-webkit-scrollbar-corner {
175 |     background-color: transparent;
176 | }
177 | 
178 | .json-container h3 {
179 |     display: inline-block;
180 |     padding: 4px 8px;
181 |     border-radius: 4px;
182 |     color: var(--azul-claro);
183 | }
184 | 
185 | .hide {
186 |     display: none;
187 | }
188 | 
189 | .key {
190 |     color: #9cdcfe;
191 | }
192 | 
193 | .value {
194 |     color: #c3835c;
195 | }
196 | 
197 | .number {
198 |     color: #b5cea8;
199 | }
200 | 
201 | .error {
202 |     color: var(--error);
203 | }
204 | 
205 | .loader {
206 |     border: 8px solid #fff;
207 |     /* Light grey */
208 |     border-top: 8px solid var(--azul-claro);
209 |     /* Blue */
210 |     border-radius: 50%;
211 |     width: 120px;
212 |     height: 120px;
213 |     animation: spin 1s linear infinite;
214 |     margin: 12px auto;
215 | }
216 | 
217 | @keyframes spin {
218 |     0% {
219 |         transform: rotate(0deg);
220 |     }
221 | 
222 |     100% {
223 |         transform: rotate(360deg);
224 |     }
225 | }


--------------------------------------------------------------------------------
/getauth/public/styles/styles.css:
--------------------------------------------------------------------------------
  1 | :root {
  2 |     --azul-mercantil: #004E9B;
  3 |     --azul-claro: #009FDA;
  4 |     --naranja: #FF5800;
  5 |     --texto-primario: #666666;
  6 |     --error: #FF3333;
  7 | }
  8 | 
  9 | body,
 10 | html {
 11 |     margin: 0;
 12 |     padding: 0;
 13 |     font-family: Arial, Helvetica, sans-serif;
 14 | }
 15 | 
 16 | .nav-bar {
 17 |     width: 100%;
 18 |     height: 60px;
 19 |     gap: 0px;
 20 |     opacity: 0px;
 21 |     background: linear-gradient(90deg, var(--azul-mercantil) 0.96%, var(--azul-claro) 14.75%, var(--azul-mercantil) 37.06%);
 22 |     display: flex;
 23 |     align-items: center;
 24 | 
 25 |     .nav-logo {
 26 |         height: 80px;
 27 |         margin-left: 10%;
 28 |     }
 29 | }
 30 | 
 31 | .main-container {
 32 |     width: 700px;
 33 |     margin: 0 auto;
 34 |     padding: 12px;
 35 |     display: flex;
 36 |     flex-direction: column;
 37 |     align-items: center;
 38 |     gap: 12px;
 39 | }
 40 | 
 41 | h3 {
 42 |     text-align: center;
 43 |     color: var(--azul-claro);
 44 |     width: 100%;
 45 | }
 46 | 
 47 | form {
 48 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 49 |     padding: 12px 0;
 50 |     border: 1px solid #DFDFDF;
 51 |     display: flex;
 52 |     flex-direction: column;
 53 |     border-radius: 8px;
 54 |     width: 70%;
 55 | }
 56 | 
 57 | .transaction-response {
 58 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 59 |     border: 1px solid #DFDFDF;
 60 |     display: flex;
 61 |     flex-direction: column;
 62 |     align-items: center;
 63 |     border-radius: 8px;
 64 |     max-width: 700px;
 65 |     padding: 12px;
 66 |     h2 {
 67 |         color: var(--naranja);
 68 |         padding: 0;
 69 |         margin: 0;
 70 |     }
 71 |     p {
 72 |         margin: 0;
 73 |         margin-top: 12px;
 74 |         padding: 0;
 75 |         color: var(--azul-claro);
 76 |         font-weight: bold;
 77 |     }
 78 |     a {
 79 |         text-decoration: underline;
 80 |         color: var(--azul-claro);
 81 |         margin-top: 12px;
 82 |         cursor: pointer;
 83 |     }
 84 | }
 85 | 
 86 | fieldset {
 87 |     border: none;
 88 | 
 89 |     label {
 90 |         display: inline-block;
 91 |         color: var(--azul-mercantil);
 92 |         font-weight: bold;
 93 |     }
 94 | 
 95 |     input, select {
 96 |         display: block;
 97 |         border: 2px solid transparent;
 98 |         border-bottom-color: var(--azul-mercantil);
 99 |         outline: none;
100 |         transition: .2s ease all;
101 |         font-size: 16px;
102 |         color: var(--texto-primario);
103 |         padding-bottom: 4px;
104 |         margin-top: 12px;
105 |         width: 100%;
106 | 
107 |         &:focus {
108 |             border-bottom-color: var(--azul-claro);
109 |         }
110 |     }
111 | 
112 |     select {
113 |         width: 20%;
114 |         margin-right: 12px;
115 |     }
116 | 
117 |     div {
118 |         display: flex;
119 |     }
120 | }
121 | 
122 | button {
123 |     background-image: linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%),
124 |         linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%);
125 |     padding: 8px 32px;
126 |     border-radius: 32px;
127 |     border: 2px solid transparent;
128 |     color: #Fff;
129 |     font-size: 18px;
130 |     box-sizing: border-box;
131 |     background-origin: border-box;
132 |     background-clip: padding-box, border-box;
133 |     cursor: pointer;
134 | }
135 | 
136 | .json-container {
137 |     max-width: 1200px;
138 |     margin: 12px auto;
139 |     display: flex;
140 |     justify-content: center;
141 |     gap: 24px;
142 |     flex-wrap: wrap;
143 |     padding: 24px;
144 | }
145 | 
146 | .json-container div {
147 |     display: flex;
148 |     flex-direction: column;
149 |     align-items: flex-start;
150 |     width: 400px;
151 | }
152 | 
153 | .json-container div div {
154 |     background-color: #212121;
155 |     color: rgb(255, 255, 255);
156 |     padding: 4px;
157 |     border-radius: 8px;
158 |     overflow: scroll;
159 | }
160 | 
161 | .json-container div div::-webkit-scrollbar  {
162 |     -webkit-appearance: none;
163 | }
164 | 
165 | .json-container div div::-webkit-scrollbar-thumb {
166 |     background-color: #585858;
167 |     border-radius: 8px;
168 | }
169 | 
170 | .json-container div div::-webkit-scrollbar {
171 |     height: 10px;
172 | }
173 | 
174 | .json-container div div::-webkit-scrollbar-corner {
175 |     background-color: transparent;
176 | }
177 | 
178 | .json-container h3 {
179 |     display: inline-block;
180 |     padding: 4px 8px;
181 |     border-radius: 4px;
182 |     color: var(--azul-claro);
183 | }
184 | 
185 | .hide {
186 |     display: none;
187 | }
188 | 
189 | .key {
190 |     color: #9cdcfe;
191 | }
192 | 
193 | .value {
194 |     color: #c3835c;
195 | }
196 | 
197 | .number {
198 |     color: #b5cea8;
199 | }
200 | 
201 | .error {
202 |     color: var(--error);
203 | }
204 | 
205 | .loader {
206 |     border: 8px solid #fff;
207 |     /* Light grey */
208 |     border-top: 8px solid var(--azul-claro);
209 |     /* Blue */
210 |     border-radius: 50%;
211 |     width: 120px;
212 |     height: 120px;
213 |     animation: spin 1s linear infinite;
214 |     margin: 12px auto;
215 | }
216 | 
217 | @keyframes spin {
218 |     0% {
219 |         transform: rotate(0deg);
220 |     }
221 | 
222 |     100% {
223 |         transform: rotate(360deg);
224 |     }
225 | }


--------------------------------------------------------------------------------
/tdd/public/styles/styles.css:
--------------------------------------------------------------------------------
  1 | :root {
  2 |     --azul-mercantil: #004E9B;
  3 |     --azul-claro: #009FDA;
  4 |     --naranja: #FF5800;
  5 |     --texto-primario: #666666;
  6 |     --error: #FF3333;
  7 | }
  8 | 
  9 | body,
 10 | html {
 11 |     margin: 0;
 12 |     padding: 0;
 13 |     font-family: Arial, Helvetica, sans-serif;
 14 | }
 15 | 
 16 | .nav-bar {
 17 |     width: 100%;
 18 |     height: 60px;
 19 |     gap: 0px;
 20 |     opacity: 0px;
 21 |     background: linear-gradient(90deg, var(--azul-mercantil) 0.96%, var(--azul-claro) 14.75%, var(--azul-mercantil) 37.06%);
 22 |     display: flex;
 23 |     align-items: center;
 24 | 
 25 |     .nav-logo {
 26 |         height: 80px;
 27 |         margin-left: 10%;
 28 |     }
 29 | }
 30 | 
 31 | .main-container {
 32 |     width: 700px;
 33 |     margin: 0 auto;
 34 |     padding: 12px;
 35 |     display: flex;
 36 |     flex-direction: column;
 37 |     align-items: center;
 38 |     gap: 12px;
 39 | }
 40 | 
 41 | h3 {
 42 |     text-align: center;
 43 |     color: var(--azul-claro);
 44 |     width: 100%;
 45 | }
 46 | 
 47 | form {
 48 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 49 |     padding: 12px 0;
 50 |     border: 1px solid #DFDFDF;
 51 |     display: flex;
 52 |     flex-direction: column;
 53 |     border-radius: 8px;
 54 |     width: 70%;
 55 | }
 56 | 
 57 | .transaction-response {
 58 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 59 |     border: 1px solid #DFDFDF;
 60 |     display: flex;
 61 |     flex-direction: column;
 62 |     align-items: center;
 63 |     border-radius: 8px;
 64 |     max-width: 700px;
 65 |     padding: 12px;
 66 |     h2 {
 67 |         color: var(--naranja);
 68 |         padding: 0;
 69 |         margin: 0;
 70 |     }
 71 |     p {
 72 |         margin: 0;
 73 |         margin-top: 12px;
 74 |         padding: 0;
 75 |         color: var(--azul-claro);
 76 |         font-weight: bold;
 77 |     }
 78 |     a {
 79 |         text-decoration: underline;
 80 |         color: var(--azul-claro);
 81 |         margin-top: 12px;
 82 |         cursor: pointer;
 83 |     }
 84 | }
 85 | 
 86 | fieldset {
 87 |     border: none;
 88 | 
 89 |     label {
 90 |         display: inline-block;
 91 |         color: var(--azul-mercantil);
 92 |         font-weight: bold;
 93 |     }
 94 | 
 95 |     input, select {
 96 |         display: block;
 97 |         border: 2px solid transparent;
 98 |         border-bottom-color: var(--azul-mercantil);
 99 |         outline: none;
100 |         transition: .2s ease all;
101 |         font-size: 16px;
102 |         color: var(--texto-primario);
103 |         padding-bottom: 4px;
104 |         margin-top: 12px;
105 |         width: 100%;
106 | 
107 |         &:focus {
108 |             border-bottom-color: var(--azul-claro);
109 |         }
110 |     }
111 | 
112 |     #customerid-prefix {
113 |         width: 20%;
114 |         margin-right: 12px;
115 |     }
116 | 
117 |     div {
118 |         display: flex;
119 |     }
120 | }
121 | 
122 | button {
123 |     background-image: linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%),
124 |         linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%);
125 |     padding: 8px 32px;
126 |     border-radius: 32px;
127 |     border: 2px solid transparent;
128 |     color: #Fff;
129 |     font-size: 18px;
130 |     box-sizing: border-box;
131 |     background-origin: border-box;
132 |     background-clip: padding-box, border-box;
133 |     cursor: pointer;
134 | }
135 | 
136 | .json-container {
137 |     max-width: 1200px;
138 |     margin: 12px auto;
139 |     display: flex;
140 |     justify-content: center;
141 |     gap: 24px;
142 |     flex-wrap: wrap;
143 |     padding: 24px;
144 | }
145 | 
146 | .json-container div {
147 |     display: flex;
148 |     flex-direction: column;
149 |     align-items: flex-start;
150 |     width: 400px;
151 | }
152 | 
153 | .json-container div div {
154 |     background-color: #212121;
155 |     color: rgb(255, 255, 255);
156 |     padding: 4px;
157 |     border-radius: 8px;
158 |     overflow: scroll;
159 | }
160 | 
161 | .json-container div div::-webkit-scrollbar  {
162 |     -webkit-appearance: none;
163 | }
164 | 
165 | .json-container div div::-webkit-scrollbar-thumb {
166 |     background-color: #585858;
167 |     border-radius: 8px;
168 | }
169 | 
170 | .json-container div div::-webkit-scrollbar {
171 |     height: 10px;
172 | }
173 | 
174 | .json-container div div::-webkit-scrollbar-corner {
175 |     background-color: transparent;
176 | }
177 | 
178 | .json-container h3 {
179 |     display: inline-block;
180 |     padding: 4px 8px;
181 |     border-radius: 4px;
182 |     color: var(--azul-claro);
183 | }
184 | 
185 | .hide {
186 |     display: none;
187 | }
188 | 
189 | .key {
190 |     color: #9cdcfe;
191 | }
192 | 
193 | .value {
194 |     color: #c3835c;
195 | }
196 | 
197 | .number {
198 |     color: #b5cea8;
199 | }
200 | 
201 | .error {
202 |     color: var(--error);
203 | }
204 | 
205 | .loader {
206 |     border: 8px solid #fff;
207 |     /* Light grey */
208 |     border-top: 8px solid var(--azul-claro);
209 |     /* Blue */
210 |     border-radius: 50%;
211 |     width: 120px;
212 |     height: 120px;
213 |     animation: spin 1s linear infinite;
214 |     margin: 12px auto;
215 | }
216 | 
217 | @keyframes spin {
218 |     0% {
219 |         transform: rotate(0deg);
220 |     }
221 | 
222 |     100% {
223 |         transform: rotate(360deg);
224 |     }
225 | }


--------------------------------------------------------------------------------
/td-search/public/styles/styles.css:
--------------------------------------------------------------------------------
  1 | :root {
  2 |     --azul-mercantil: #004E9B;
  3 |     --azul-claro: #009FDA;
  4 |     --naranja: #FF5800;
  5 |     --texto-primario: #666666;
  6 |     --error: #FF3333;
  7 | }
  8 | 
  9 | body,
 10 | html {
 11 |     margin: 0;
 12 |     padding: 0;
 13 |     font-family: Arial, Helvetica, sans-serif;
 14 | }
 15 | 
 16 | .nav-bar {
 17 |     width: 100%;
 18 |     height: 60px;
 19 |     gap: 0px;
 20 |     opacity: 0px;
 21 |     background: linear-gradient(90deg, var(--azul-mercantil) 0.96%, var(--azul-claro) 14.75%, var(--azul-mercantil) 37.06%);
 22 |     display: flex;
 23 |     align-items: center;
 24 | 
 25 |     .nav-logo {
 26 |         height: 80px;
 27 |         margin-left: 10%;
 28 |     }
 29 | }
 30 | 
 31 | .main-container {
 32 |     width: 700px;
 33 |     margin: 0 auto;
 34 |     padding: 12px;
 35 |     display: flex;
 36 |     flex-direction: column;
 37 |     align-items: center;
 38 |     gap: 12px;
 39 | }
 40 | 
 41 | h3 {
 42 |     text-align: center;
 43 |     color: var(--azul-claro);
 44 |     width: 100%;
 45 | }
 46 | 
 47 | form {
 48 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 49 |     padding: 12px 0;
 50 |     border: 1px solid #DFDFDF;
 51 |     display: flex;
 52 |     flex-direction: column;
 53 |     border-radius: 8px;
 54 |     width: 70%;
 55 | }
 56 | 
 57 | .transaction-response {
 58 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 59 |     border: 1px solid #DFDFDF;
 60 |     display: flex;
 61 |     flex-direction: column;
 62 |     align-items: center;
 63 |     border-radius: 8px;
 64 |     max-width: 700px;
 65 |     padding: 12px;
 66 |     h2 {
 67 |         color: var(--naranja);
 68 |         padding: 0;
 69 |         margin: 0;
 70 |     }
 71 |     p {
 72 |         margin: 0;
 73 |         margin-top: 12px;
 74 |         padding: 0;
 75 |         color: var(--azul-claro);
 76 |         font-weight: bold;
 77 |     }
 78 |     a {
 79 |         text-decoration: underline;
 80 |         color: var(--azul-claro);
 81 |         margin-top: 12px;
 82 |         cursor: pointer;
 83 |     }
 84 | }
 85 | 
 86 | fieldset {
 87 |     border: none;
 88 | 
 89 |     label {
 90 |         display: inline-block;
 91 |         color: var(--azul-mercantil);
 92 |         font-weight: bold;
 93 |     }
 94 | 
 95 |     input, select {
 96 |         display: block;
 97 |         border: 2px solid transparent;
 98 |         border-bottom-color: var(--azul-mercantil);
 99 |         outline: none;
100 |         transition: .2s ease all;
101 |         font-size: 16px;
102 |         color: var(--texto-primario);
103 |         padding-bottom: 4px;
104 |         margin-top: 12px;
105 |         width: 100%;
106 | 
107 |         &:focus {
108 |             border-bottom-color: var(--azul-claro);
109 |         }
110 |     }
111 | 
112 |     #customerid-prefix {
113 |         width: 20%;
114 |         margin-right: 12px;
115 |     }
116 | 
117 |     div {
118 |         display: flex;
119 |     }
120 | }
121 | 
122 | button {
123 |     background-image: linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%),
124 |         linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%);
125 |     padding: 8px 32px;
126 |     border-radius: 32px;
127 |     border: 2px solid transparent;
128 |     color: #Fff;
129 |     font-size: 18px;
130 |     box-sizing: border-box;
131 |     background-origin: border-box;
132 |     background-clip: padding-box, border-box;
133 |     cursor: pointer;
134 | }
135 | 
136 | .json-container {
137 |     max-width: 1200px;
138 |     margin: 12px auto;
139 |     display: flex;
140 |     justify-content: center;
141 |     gap: 24px;
142 |     flex-wrap: wrap;
143 |     padding: 24px;
144 | }
145 | 
146 | .json-container div {
147 |     display: flex;
148 |     flex-direction: column;
149 |     align-items: flex-start;
150 |     width: 400px;
151 | }
152 | 
153 | .json-container div div {
154 |     background-color: #212121;
155 |     color: rgb(255, 255, 255);
156 |     padding: 4px;
157 |     border-radius: 8px;
158 |     overflow: scroll;
159 | }
160 | 
161 | .json-container div div::-webkit-scrollbar  {
162 |     -webkit-appearance: none;
163 | }
164 | 
165 | .json-container div div::-webkit-scrollbar-thumb {
166 |     background-color: #585858;
167 |     border-radius: 8px;
168 | }
169 | 
170 | .json-container div div::-webkit-scrollbar {
171 |     height: 10px;
172 | }
173 | 
174 | .json-container div div::-webkit-scrollbar-corner {
175 |     background-color: transparent;
176 | }
177 | 
178 | .json-container h3 {
179 |     display: inline-block;
180 |     padding: 4px 8px;
181 |     border-radius: 4px;
182 |     color: var(--azul-claro);
183 | }
184 | 
185 | .hide {
186 |     display: none;
187 | }
188 | 
189 | .key {
190 |     color: #9cdcfe;
191 | }
192 | 
193 | .value {
194 |     color: #c3835c;
195 | }
196 | 
197 | .number {
198 |     color: #b5cea8;
199 | }
200 | 
201 | .error {
202 |     color: var(--error);
203 | }
204 | 
205 | .loader {
206 |     border: 8px solid #fff;
207 |     /* Light grey */
208 |     border-top: 8px solid var(--azul-claro);
209 |     /* Blue */
210 |     border-radius: 50%;
211 |     width: 120px;
212 |     height: 120px;
213 |     animation: spin 1s linear infinite;
214 |     margin: 12px auto;
215 | }
216 | 
217 | @keyframes spin {
218 |     0% {
219 |         transform: rotate(0deg);
220 |     }
221 | 
222 |     100% {
223 |         transform: rotate(360deg);
224 |     }
225 | }


--------------------------------------------------------------------------------
/transfer-search/public/styles/styles.css:
--------------------------------------------------------------------------------
  1 | :root {
  2 |     --azul-mercantil: #004E9B;
  3 |     --azul-claro: #009FDA;
  4 |     --naranja: #FF5800;
  5 |     --texto-primario: #666666;
  6 |     --error: #FF3333;
  7 | }
  8 | 
  9 | body,
 10 | html {
 11 |     margin: 0;
 12 |     padding: 0;
 13 |     font-family: Arial, Helvetica, sans-serif;
 14 | }
 15 | 
 16 | .nav-bar {
 17 |     width: 100%;
 18 |     height: 60px;
 19 |     gap: 0px;
 20 |     opacity: 0px;
 21 |     background: linear-gradient(90deg, var(--azul-mercantil) 0.96%, var(--azul-claro) 14.75%, var(--azul-mercantil) 37.06%);
 22 |     display: flex;
 23 |     align-items: center;
 24 | 
 25 |     .nav-logo {
 26 |         height: 80px;
 27 |         margin-left: 10%;
 28 |     }
 29 | }
 30 | 
 31 | .main-container {
 32 |     width: 700px;
 33 |     margin: 0 auto;
 34 |     padding: 12px;
 35 |     display: flex;
 36 |     flex-direction: column;
 37 |     align-items: center;
 38 |     gap: 12px;
 39 | }
 40 | 
 41 | h3 {
 42 |     text-align: center;
 43 |     color: var(--azul-claro);
 44 |     width: 100%;
 45 | }
 46 | 
 47 | form {
 48 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 49 |     padding: 12px 0;
 50 |     border: 1px solid #DFDFDF;
 51 |     display: flex;
 52 |     flex-direction: column;
 53 |     border-radius: 8px;
 54 |     width: 70%;
 55 | }
 56 | 
 57 | .transaction-response {
 58 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 59 |     border: 1px solid #DFDFDF;
 60 |     display: flex;
 61 |     flex-direction: column;
 62 |     align-items: center;
 63 |     border-radius: 8px;
 64 |     max-width: 700px;
 65 |     padding: 12px;
 66 |     h2 {
 67 |         color: var(--naranja);
 68 |         padding: 0;
 69 |         margin: 0;
 70 |     }
 71 |     p {
 72 |         margin: 0;
 73 |         margin-top: 12px;
 74 |         padding: 0;
 75 |         color: var(--azul-claro);
 76 |         font-weight: bold;
 77 |     }
 78 |     a {
 79 |         text-decoration: underline;
 80 |         color: var(--azul-claro);
 81 |         margin-top: 12px;
 82 |         cursor: pointer;
 83 |     }
 84 | }
 85 | 
 86 | fieldset {
 87 |     border: none;
 88 | 
 89 |     label {
 90 |         display: inline-block;
 91 |         color: var(--azul-mercantil);
 92 |         font-weight: bold;
 93 |     }
 94 | 
 95 |     input, select {
 96 |         display: block;
 97 |         border: 2px solid transparent;
 98 |         border-bottom-color: var(--azul-mercantil);
 99 |         outline: none;
100 |         transition: .2s ease all;
101 |         font-size: 16px;
102 |         color: var(--texto-primario);
103 |         padding-bottom: 4px;
104 |         margin-top: 12px;
105 |         width: 100%;
106 | 
107 |         &:focus {
108 |             border-bottom-color: var(--azul-claro);
109 |         }
110 |     }
111 | 
112 |     #customerid-prefix {
113 |         width: 20%;
114 |         margin-right: 12px;
115 |     }
116 | 
117 |     div {
118 |         display: flex;
119 |     }
120 | }
121 | 
122 | button {
123 |     background-image: linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%),
124 |         linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%);
125 |     padding: 8px 32px;
126 |     border-radius: 32px;
127 |     border: 2px solid transparent;
128 |     color: #Fff;
129 |     font-size: 18px;
130 |     box-sizing: border-box;
131 |     background-origin: border-box;
132 |     background-clip: padding-box, border-box;
133 |     cursor: pointer;
134 | }
135 | 
136 | .json-container {
137 |     max-width: 1200px;
138 |     margin: 12px auto;
139 |     display: flex;
140 |     justify-content: center;
141 |     gap: 24px;
142 |     flex-wrap: wrap;
143 |     padding: 24px;
144 | }
145 | 
146 | .json-container div {
147 |     display: flex;
148 |     flex-direction: column;
149 |     align-items: flex-start;
150 |     width: 400px;
151 | }
152 | 
153 | .json-container div div {
154 |     background-color: #212121;
155 |     color: rgb(255, 255, 255);
156 |     padding: 4px;
157 |     border-radius: 8px;
158 |     overflow: scroll;
159 | }
160 | 
161 | .json-container div div::-webkit-scrollbar  {
162 |     -webkit-appearance: none;
163 | }
164 | 
165 | .json-container div div::-webkit-scrollbar-thumb {
166 |     background-color: #585858;
167 |     border-radius: 8px;
168 | }
169 | 
170 | .json-container div div::-webkit-scrollbar {
171 |     height: 10px;
172 | }
173 | 
174 | .json-container div div::-webkit-scrollbar-corner {
175 |     background-color: transparent;
176 | }
177 | 
178 | .json-container h3 {
179 |     display: inline-block;
180 |     padding: 4px 8px;
181 |     border-radius: 4px;
182 |     color: var(--azul-claro);
183 | }
184 | 
185 | .hide {
186 |     display: none;
187 | }
188 | 
189 | .key {
190 |     color: #9cdcfe;
191 | }
192 | 
193 | .value {
194 |     color: #c3835c;
195 | }
196 | 
197 | .number {
198 |     color: #b5cea8;
199 | }
200 | 
201 | .error {
202 |     color: var(--error);
203 | }
204 | 
205 | .loader {
206 |     border: 8px solid #fff;
207 |     /* Light grey */
208 |     border-top: 8px solid var(--azul-claro);
209 |     /* Blue */
210 |     border-radius: 50%;
211 |     width: 120px;
212 |     height: 120px;
213 |     animation: spin 1s linear infinite;
214 |     margin: 12px auto;
215 | }
216 | 
217 | @keyframes spin {
218 |     0% {
219 |         transform: rotate(0deg);
220 |     }
221 | 
222 |     100% {
223 |         transform: rotate(360deg);
224 |     }
225 | }


--------------------------------------------------------------------------------
/c2p/public/styles/styles.css:
--------------------------------------------------------------------------------
  1 | :root {
  2 |     --azul-mercantil: #004E9B;
  3 |     --azul-claro: #009FDA;
  4 |     --naranja: #FF5800;
  5 |     --texto-primario: #666666;
  6 |     --error: #FF3333;
  7 | }
  8 | 
  9 | body,
 10 | html {
 11 |     margin: 0;
 12 |     padding: 0;
 13 |     font-family: Arial, Helvetica, sans-serif;
 14 | }
 15 | 
 16 | .nav-bar {
 17 |     width: 100%;
 18 |     height: 60px;
 19 |     gap: 0px;
 20 |     opacity: 0px;
 21 |     background: linear-gradient(90deg, var(--azul-mercantil) 0.96%, var(--azul-claro) 14.75%, var(--azul-mercantil) 37.06%);
 22 |     display: flex;
 23 |     align-items: center;
 24 | 
 25 |     .nav-logo {
 26 |         height: 80px;
 27 |         margin-left: 10%;
 28 |     }
 29 | }
 30 | 
 31 | .main-container {
 32 |     width: 700px;
 33 |     margin: 0 auto;
 34 |     padding: 12px;
 35 |     display: flex;
 36 |     flex-direction: column;
 37 |     align-items: center;
 38 |     gap: 12px;
 39 | }
 40 | 
 41 | h3 {
 42 |     text-align: center;
 43 |     color: var(--azul-claro);
 44 |     width: 100%;
 45 | }
 46 | 
 47 | form {
 48 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 49 |     padding: 12px 0;
 50 |     border: 1px solid #DFDFDF;
 51 |     display: flex;
 52 |     flex-direction: column;
 53 |     border-radius: 8px;
 54 |     width: 70%;
 55 | }
 56 | 
 57 | .transaction-response {
 58 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 59 |     border: 1px solid #DFDFDF;
 60 |     display: flex;
 61 |     flex-direction: column;
 62 |     align-items: center;
 63 |     border-radius: 8px;
 64 |     max-width: 700px;
 65 |     padding: 12px;
 66 |     h2 {
 67 |         color: var(--naranja);
 68 |         padding: 0;
 69 |         margin: 0;
 70 |     }
 71 |     p {
 72 |         margin: 0;
 73 |         margin-top: 12px;
 74 |         padding: 0;
 75 |         color: var(--azul-claro);
 76 |         font-weight: bold;
 77 |     }
 78 |     a {
 79 |         text-decoration: underline;
 80 |         color: var(--azul-claro);
 81 |         margin-top: 12px;
 82 |         cursor: pointer;
 83 |     }
 84 | }
 85 | 
 86 | fieldset {
 87 |     border: none;
 88 | 
 89 |     label {
 90 |         display: inline-block;
 91 |         color: var(--azul-mercantil);
 92 |         font-weight: bold;
 93 |     }
 94 | 
 95 |     input, select {
 96 |         display: block;
 97 |         border: 2px solid transparent;
 98 |         border-bottom-color: var(--azul-mercantil);
 99 |         outline: none;
100 |         transition: .2s ease all;
101 |         font-size: 16px;
102 |         color: var(--texto-primario);
103 |         padding-bottom: 4px;
104 |         margin-top: 12px;
105 |         width: 100%;
106 | 
107 |         &:focus {
108 |             border-bottom-color: var(--azul-claro);
109 |         }
110 |     }
111 | 
112 |     #customerid-prefix, #customer-phone-number-prefix {
113 |         width: 20%;
114 |         margin-right: 12px;
115 |     }
116 | 
117 |     div {
118 |         display: flex;
119 |     }
120 | }
121 | 
122 | button {
123 |     background-image: linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%),
124 |         linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%);
125 |     padding: 8px 32px;
126 |     border-radius: 32px;
127 |     border: 2px solid transparent;
128 |     color: #Fff;
129 |     font-size: 18px;
130 |     box-sizing: border-box;
131 |     background-origin: border-box;
132 |     background-clip: padding-box, border-box;
133 |     cursor: pointer;
134 | }
135 | 
136 | .json-container {
137 |     max-width: 1200px;
138 |     margin: 12px auto;
139 |     display: flex;
140 |     justify-content: center;
141 |     gap: 24px;
142 |     flex-wrap: wrap;
143 |     padding: 24px;
144 | }
145 | 
146 | .json-container div {
147 |     display: flex;
148 |     flex-direction: column;
149 |     align-items: flex-start;
150 |     width: 400px;
151 | }
152 | 
153 | .json-container div div {
154 |     background-color: #212121;
155 |     color: rgb(255, 255, 255);
156 |     padding: 4px;
157 |     border-radius: 8px;
158 |     overflow: scroll;
159 | }
160 | 
161 | .json-container div div::-webkit-scrollbar  {
162 |     -webkit-appearance: none;
163 | }
164 | 
165 | .json-container div div::-webkit-scrollbar-thumb {
166 |     background-color: #585858;
167 |     border-radius: 8px;
168 | }
169 | 
170 | .json-container div div::-webkit-scrollbar {
171 |     height: 10px;
172 | }
173 | 
174 | .json-container div div::-webkit-scrollbar-corner {
175 |     background-color: transparent;
176 | }
177 | 
178 | .json-container h3 {
179 |     display: inline-block;
180 |     padding: 4px 8px;
181 |     border-radius: 4px;
182 |     color: var(--azul-claro);
183 | }
184 | 
185 | .hide {
186 |     display: none;
187 | }
188 | 
189 | .key {
190 |     color: #9cdcfe;
191 | }
192 | 
193 | .value {
194 |     color: #c3835c;
195 | }
196 | 
197 | .number {
198 |     color: #b5cea8;
199 | }
200 | 
201 | .error {
202 |     color: var(--error);
203 | }
204 | 
205 | .loader {
206 |     border: 8px solid #fff;
207 |     /* Light grey */
208 |     border-top: 8px solid var(--azul-claro);
209 |     /* Blue */
210 |     border-radius: 50%;
211 |     width: 120px;
212 |     height: 120px;
213 |     animation: spin 1s linear infinite;
214 |     margin: 12px auto;
215 | }
216 | 
217 | @keyframes spin {
218 |     0% {
219 |         transform: rotate(0deg);
220 |     }
221 | 
222 |     100% {
223 |         transform: rotate(360deg);
224 |     }
225 | }


--------------------------------------------------------------------------------
/scp/public/styles/styles.css:
--------------------------------------------------------------------------------
  1 | :root {
  2 |     --azul-mercantil: #004E9B;
  3 |     --azul-claro: #009FDA;
  4 |     --naranja: #FF5800;
  5 |     --texto-primario: #666666;
  6 |     --error: #FF3333;
  7 | }
  8 | 
  9 | body,
 10 | html {
 11 |     margin: 0;
 12 |     padding: 0;
 13 |     font-family: Arial, Helvetica, sans-serif;
 14 | }
 15 | 
 16 | .nav-bar {
 17 |     width: 100%;
 18 |     height: 60px;
 19 |     gap: 0px;
 20 |     opacity: 0px;
 21 |     background: linear-gradient(90deg, var(--azul-mercantil) 0.96%, var(--azul-claro) 14.75%, var(--azul-mercantil) 37.06%);
 22 |     display: flex;
 23 |     align-items: center;
 24 | 
 25 |     .nav-logo {
 26 |         height: 80px;
 27 |         margin-left: 10%;
 28 |     }
 29 | }
 30 | 
 31 | .main-container {
 32 |     width: 700px;
 33 |     margin: 0 auto;
 34 |     padding: 12px;
 35 |     display: flex;
 36 |     flex-direction: column;
 37 |     align-items: center;
 38 |     gap: 12px;
 39 | }
 40 | 
 41 | h3 {
 42 |     text-align: center;
 43 |     color: var(--azul-claro);
 44 |     width: 100%;
 45 | }
 46 | 
 47 | form {
 48 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 49 |     padding: 12px 0;
 50 |     border: 1px solid #DFDFDF;
 51 |     display: flex;
 52 |     flex-direction: column;
 53 |     border-radius: 8px;
 54 |     width: 70%;
 55 | }
 56 | 
 57 | .transaction-response {
 58 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 59 |     border: 1px solid #DFDFDF;
 60 |     display: flex;
 61 |     flex-direction: column;
 62 |     align-items: center;
 63 |     border-radius: 8px;
 64 |     max-width: 700px;
 65 |     padding: 12px;
 66 |     h2 {
 67 |         color: var(--naranja);
 68 |         padding: 0;
 69 |         margin: 0;
 70 |     }
 71 |     p {
 72 |         margin: 0;
 73 |         margin-top: 12px;
 74 |         padding: 0;
 75 |         color: var(--azul-claro);
 76 |         font-weight: bold;
 77 |     }
 78 |     a {
 79 |         text-decoration: underline;
 80 |         color: var(--azul-claro);
 81 |         margin-top: 12px;
 82 |         cursor: pointer;
 83 |     }
 84 | }
 85 | 
 86 | fieldset {
 87 |     border: none;
 88 | 
 89 |     label {
 90 |         display: inline-block;
 91 |         color: var(--azul-mercantil);
 92 |         font-weight: bold;
 93 |     }
 94 | 
 95 |     input, select {
 96 |         display: block;
 97 |         border: 2px solid transparent;
 98 |         border-bottom-color: var(--azul-mercantil);
 99 |         outline: none;
100 |         transition: .2s ease all;
101 |         font-size: 16px;
102 |         color: var(--texto-primario);
103 |         padding-bottom: 4px;
104 |         margin-top: 12px;
105 |         width: 100%;
106 | 
107 |         &:focus {
108 |             border-bottom-color: var(--azul-claro);
109 |         }
110 |     }
111 | 
112 |     #customerid-prefix, #customer-phone-number-prefix {
113 |         width: 20%;
114 |         margin-right: 12px;
115 |     }
116 | 
117 |     div {
118 |         display: flex;
119 |     }
120 | }
121 | 
122 | button {
123 |     background-image: linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%),
124 |         linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%);
125 |     padding: 8px 32px;
126 |     border-radius: 32px;
127 |     border: 2px solid transparent;
128 |     color: #Fff;
129 |     font-size: 18px;
130 |     box-sizing: border-box;
131 |     background-origin: border-box;
132 |     background-clip: padding-box, border-box;
133 |     cursor: pointer;
134 | }
135 | 
136 | .json-container {
137 |     max-width: 1200px;
138 |     margin: 12px auto;
139 |     display: flex;
140 |     justify-content: center;
141 |     gap: 24px;
142 |     flex-wrap: wrap;
143 |     padding: 24px;
144 | }
145 | 
146 | .json-container div {
147 |     display: flex;
148 |     flex-direction: column;
149 |     align-items: flex-start;
150 |     width: 400px;
151 | }
152 | 
153 | .json-container div div {
154 |     background-color: #212121;
155 |     color: rgb(255, 255, 255);
156 |     padding: 4px;
157 |     border-radius: 8px;
158 |     overflow: scroll;
159 | }
160 | 
161 | .json-container div div::-webkit-scrollbar  {
162 |     -webkit-appearance: none;
163 | }
164 | 
165 | .json-container div div::-webkit-scrollbar-thumb {
166 |     background-color: #585858;
167 |     border-radius: 8px;
168 | }
169 | 
170 | .json-container div div::-webkit-scrollbar {
171 |     height: 10px;
172 | }
173 | 
174 | .json-container div div::-webkit-scrollbar-corner {
175 |     background-color: transparent;
176 | }
177 | 
178 | .json-container h3 {
179 |     display: inline-block;
180 |     padding: 4px 8px;
181 |     border-radius: 4px;
182 |     color: var(--azul-claro);
183 | }
184 | 
185 | .hide {
186 |     display: none;
187 | }
188 | 
189 | .key {
190 |     color: #9cdcfe;
191 | }
192 | 
193 | .value {
194 |     color: #c3835c;
195 | }
196 | 
197 | .number {
198 |     color: #b5cea8;
199 | }
200 | 
201 | .error {
202 |     color: var(--error);
203 | }
204 | 
205 | .loader {
206 |     border: 8px solid #fff;
207 |     /* Light grey */
208 |     border-top: 8px solid var(--azul-claro);
209 |     /* Blue */
210 |     border-radius: 50%;
211 |     width: 120px;
212 |     height: 120px;
213 |     animation: spin 1s linear infinite;
214 |     margin: 12px auto;
215 | }
216 | 
217 | @keyframes spin {
218 |     0% {
219 |         transform: rotate(0deg);
220 |     }
221 | 
222 |     100% {
223 |         transform: rotate(360deg);
224 |     }
225 | }


--------------------------------------------------------------------------------
/search-c2p/public/styles/styles.css:
--------------------------------------------------------------------------------
  1 | :root {
  2 |     --azul-mercantil: #004E9B;
  3 |     --azul-claro: #009FDA;
  4 |     --naranja: #FF5800;
  5 |     --texto-primario: #666666;
  6 |     --error: #FF3333;
  7 | }
  8 | 
  9 | body,
 10 | html {
 11 |     margin: 0;
 12 |     padding: 0;
 13 |     font-family: Arial, Helvetica, sans-serif;
 14 | }
 15 | 
 16 | .nav-bar {
 17 |     width: 100%;
 18 |     height: 60px;
 19 |     gap: 0px;
 20 |     opacity: 0px;
 21 |     background: linear-gradient(90deg, var(--azul-mercantil) 0.96%, var(--azul-claro) 14.75%, var(--azul-mercantil) 37.06%);
 22 |     display: flex;
 23 |     align-items: center;
 24 | 
 25 |     .nav-logo {
 26 |         height: 80px;
 27 |         margin-left: 10%;
 28 |     }
 29 | }
 30 | 
 31 | .main-container {
 32 |     width: 700px;
 33 |     margin: 0 auto;
 34 |     padding: 12px;
 35 |     display: flex;
 36 |     flex-direction: column;
 37 |     align-items: center;
 38 |     gap: 12px;
 39 | }
 40 | 
 41 | h3 {
 42 |     text-align: center;
 43 |     color: var(--azul-claro);
 44 |     width: 100%;
 45 | }
 46 | 
 47 | form {
 48 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 49 |     padding: 12px 0;
 50 |     border: 1px solid #DFDFDF;
 51 |     display: flex;
 52 |     flex-direction: column;
 53 |     border-radius: 8px;
 54 |     width: 70%;
 55 | }
 56 | 
 57 | .transaction-response {
 58 |     box-shadow: 0px 4px 4px 0px #DDDCD8;
 59 |     border: 1px solid #DFDFDF;
 60 |     display: flex;
 61 |     flex-direction: column;
 62 |     align-items: center;
 63 |     border-radius: 8px;
 64 |     max-width: 700px;
 65 |     padding: 12px;
 66 |     h2 {
 67 |         color: var(--naranja);
 68 |         padding: 0;
 69 |         margin: 0;
 70 |     }
 71 |     p {
 72 |         margin: 0;
 73 |         margin-top: 12px;
 74 |         padding: 0;
 75 |         color: var(--azul-claro);
 76 |         font-weight: bold;
 77 |     }
 78 |     a {
 79 |         text-decoration: underline;
 80 |         color: var(--azul-claro);
 81 |         margin-top: 12px;
 82 |         cursor: pointer;
 83 |     }
 84 | }
 85 | 
 86 | fieldset {
 87 |     border: none;
 88 | 
 89 |     label {
 90 |         display: inline-block;
 91 |         color: var(--azul-mercantil);
 92 |         font-weight: bold;
 93 |     }
 94 | 
 95 |     input, select {
 96 |         display: block;
 97 |         border: 2px solid transparent;
 98 |         border-bottom-color: var(--azul-mercantil);
 99 |         outline: none;
100 |         transition: .2s ease all;
101 |         font-size: 16px;
102 |         color: var(--texto-primario);
103 |         padding-bottom: 4px;
104 |         margin-top: 12px;
105 |         width: 100%;
106 | 
107 |         &:focus {
108 |             border-bottom-color: var(--azul-claro);
109 |         }
110 |     }
111 | 
112 |     #customerid-prefix, #customer-phone-number-prefix {
113 |         width: 20%;
114 |         margin-right: 12px;
115 |     }
116 | 
117 |     div {
118 |         display: flex;
119 |     }
120 | }
121 | 
122 | button {
123 |     background-image: linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%),
124 |         linear-gradient(180deg, var(--azul-claro) 0%, var(--azul-mercantil) 100%);
125 |     padding: 8px 32px;
126 |     border-radius: 32px;
127 |     border: 2px solid transparent;
128 |     color: #Fff;
129 |     font-size: 18px;
130 |     box-sizing: border-box;
131 |     background-origin: border-box;
132 |     background-clip: padding-box, border-box;
133 |     cursor: pointer;
134 | }
135 | 
136 | .json-container {
137 |     max-width: 1200px;
138 |     margin: 12px auto;
139 |     display: flex;
140 |     justify-content: center;
141 |     gap: 24px;
142 |     flex-wrap: wrap;
143 |     padding: 24px;
144 | }
145 | 
146 | .json-container div {
147 |     display: flex;
148 |     flex-direction: column;
149 |     align-items: flex-start;
150 |     width: 400px;
151 | }
152 | 
153 | .json-container div div {
154 |     background-color: #212121;
155 |     color: rgb(255, 255, 255);
156 |     padding: 4px;
157 |     border-radius: 8px;
158 |     overflow: scroll;
159 | }
160 | 
161 | .json-container div div::-webkit-scrollbar  {
162 |     -webkit-appearance: none;
163 | }
164 | 
165 | .json-container div div::-webkit-scrollbar-thumb {
166 |     background-color: #585858;
167 |     border-radius: 8px;
168 | }
169 | 
170 | .json-container div div::-webkit-scrollbar {
171 |     height: 10px;
172 | }
173 | 
174 | .json-container div div::-webkit-scrollbar-corner {
175 |     background-color: transparent;
176 | }
177 | 
178 | .json-container h3 {
179 |     display: inline-block;
180 |     padding: 4px 8px;
181 |     border-radius: 4px;
182 |     color: var(--azul-claro);
183 | }
184 | 
185 | .hide {
186 |     display: none;
187 | }
188 | 
189 | .key {
190 |     color: #9cdcfe;
191 | }
192 | 
193 | .value {
194 |     color: #c3835c;
195 | }
196 | 
197 | .number {
198 |     color: #b5cea8;
199 | }
200 | 
201 | .error {
202 |     color: var(--error);
203 | }
204 | 
205 | .loader {
206 |     border: 8px solid #fff;
207 |     /* Light grey */
208 |     border-top: 8px solid var(--azul-claro);
209 |     /* Blue */
210 |     border-radius: 50%;
211 |     width: 120px;
212 |     height: 120px;
213 |     animation: spin 1s linear infinite;
214 |     margin: 12px auto;
215 | }
216 | 
217 | @keyframes spin {
218 |     0% {
219 |         transform: rotate(0deg);
220 |     }
221 | 
222 |     100% {
223 |         transform: rotate(360deg);
224 |     }
225 | }


--------------------------------------------------------------------------------