UNPKG

@shanwker/auttar

Version:

Auttar WebSocket JS Class. An easy implementation of Auttar WebSocket Service.

1 lines 22.3 kB
{"version":3,"file":"index.min.mjs","sources":["../src/Helpers.js","../src/Auttar.js"],"sourcesContent":["const NAME = '%c Auttar ';\nconst BACKGROUND = 'background:#bc0909 ; padding: 2px; border-radius: 2px; color: #fff ';\n\nexport function required(name, param) {\n if (param === undefined) {\n throw new Error(`Parâmetro obrigatório ${name} não declarado.`);\n }\n\n return param;\n}\n\nexport function logInfo(msg) {\n console.log(NAME, BACKGROUND, msg); // eslint-disable-line no-console\n}\n\nexport function logError(msg) {\n console.error(NAME, BACKGROUND, msg); // eslint-disable-line no-console\n}\n\n/**\n * Add spaces to match the max screen length\n * @param {string} text\n * @param {number} maxChar\n * @returns {string}\n */\nexport function addSpaces(text, maxChar) {\n return text\n .split('')\n .concat(...Array(maxChar).fill(' '))\n .slice(0, maxChar)\n .join('');\n}\n\nexport default {\n required,\n logInfo,\n logError,\n addSpaces,\n};\n","/* eslint-disable */\nimport { logInfo } from './Helpers';\n\nconst privateVariables = {\n transactions: {\n credit: {\n base: 112,\n installment: 113,\n installmentWithInterest: 114,\n },\n debit: {\n base: 101,\n voucher: 106,\n },\n cancel: 128,\n confirm: 6,\n requestCancel: 191,\n },\n return: {\n success: 0,\n timeOut: 1,\n notAuthorizes: 5,\n internetError: 10,\n intertefError: 12,\n error: 20,\n ecommerceError: 30,\n },\n errorCodes: {\n 5300: 'Valor não informado',\n 5301: 'Cartão inválido',\n 5302: 'Cartão vencido',\n 5303: 'Data de vencimento inválido',\n 5304: 'Código de segurança inválido',\n 5305: 'Taxa de serviço excede limite',\n 5306: 'Operação não permitida',\n 5307: 'Dados inválidos',\n 5308: 'Valor mínimo da parcela inválido',\n 5309: 'Número de parcelas inválido',\n 5310: 'Número de parcelas excede limite',\n 5311: 'Valor da entrada maior ou igual ao valor da transação',\n 5312: 'Valor da parcela inválido',\n 5313: 'Data inválida',\n 5314: 'Prazo excede limite',\n 5316: 'NSU inválido',\n 5317: 'Operação cancelada pelo usuário',\n 5318: 'Documento inválido (CPF ou CNPJ)',\n 5319: 'Valor do documento inválido',\n 5328: 'Erro na captura de dados do Pin-Pad',\n 5329: 'Erro na captura do chip ou cartão removido antes da hora.',\n 5364: 'Data de emissão do cartão inválida',\n 5355: 'O tipo de financiamento informado não é coerente com o número de parcelas',\n },\n ws: null,\n timeout: null,\n close: true,\n timeoutConn: null,\n};\n\nfunction _disconnect() {\n privateVariables.ws.close();\n}\n\nfunction _clearTimeout() {\n privateVariables.close = false;\n clearTimeout(privateVariables.timeoutConn);\n}\n\nfunction _timeout(time = 10000) {\n privateVariables.close = true;\n privateVariables.timeoutConn = setTimeout(() => {\n if (privateVariables.close) {\n privateVariables.ws.close();\n } else {\n _clearTimeout();\n }\n }, time);\n}\n\nfunction _connect(host, payload) {\n return new Promise((resolve, reject) => {\n try {\n if (privateVariables.ws === null) {\n privateVariables.ws = new WebSocket(host);\n } else if (privateVariables.ws.readyState === 2 || privateVariables.ws.readyState === 3) {\n _disconnect();\n privateVariables.ws = new WebSocket(host);\n }\n } catch (e) {\n reject(e);\n }\n\n if (privateVariables.ws) {\n _timeout();\n\n privateVariables.ws.onopen = () => {\n _clearTimeout();\n privateVariables.ws.send(JSON.stringify(payload));\n _timeout(60000);\n };\n\n privateVariables.ws.onmessage = (evtMsg) => {\n _clearTimeout();\n resolve(JSON.parse(evtMsg.data));\n };\n\n privateVariables.ws.onerror = (evtError) => {\n _clearTimeout();\n reject(evtError);\n };\n }\n });\n}\n\n/**\n * @typedef {Object} AuttarCupomLinha\n * @property {string} linha\n */\n\n/** @typedef {Object} AuttarSuccessResponse\n * @property {String} bandeira\n * @property {String} cartao\n * @property {String} codigoAprovacao\n * @property {String} codigoErro\n * @property {String} codigoRespAutorizadora\n * @property {Array} cupomCliente\n * @property {Array.<AuttarCupomLinha>} cupomEstabelecimento\n * @property {Array.<AuttarCupomLinha>} cupomReduzido\n * @property {Array} display\n * @property {Number} nsuAutorizadora\n * @property {Number} nsuCTF\n * @property {Number} operacao\n * @property {String} redeAdquirente\n * @property {Number} retorno\n * @property {String} valorTransacao\n */\n\n/**\n * @class Auttar WebSocket\n * @constructor {AuttarConstructor}\n */\n/**\n * @typedef {object} AuttarConstructor\n * @property {string} host - WebSocket Host URL\n * @property {boolean} debug - Método debug da classe\n * @property {string} orderId - Número de identificação da venda\n * @property {float} amount - Valor da venda\n * @property {AuttarSuccessResponse} ctfTrasaction - Objecto de resposta do websocket\n */\n\nclass Auttar {\n /**\n * Construtor da classe\n * @param {AuttarConstructor} props\n */\n constructor(props) {\n this.__host = props.host || 'ws://localhost:2500';\n this.debug = props.debug || false;\n this.orderId = props.orderId || '';\n this.__amount = 0;\n if (props.amount) this.amount = props.amount;\n this.__transactionDate = new Date().toLocaleDateString('pt-BR', {\n year: '2-digit',\n month: '2-digit',\n day: '2-digit',\n timeZone: 'America/Sao_Paulo',\n }).replace(/\\//g, '');\n this.ctfTransaction = {};\n this.__debugMessage = [];\n }\n\n debugLog(message) {\n if (this.debug) {\n logInfo(message);\n }\n }\n\n classError(message) {\n this.debugMessage = {\n message,\n logLevel: 'error',\n };\n\n return new Error(message);\n }\n\n get debugMessage() {\n return this.__debugMessage;\n }\n\n set debugMessage(value) {\n if (this.debug) {\n const debugLog = {\n logLevel: 'info',\n message: '',\n ...value,\n date: new Date().toISOString(),\n };\n\n if (debugLog.logLevel === 'log' && debugLog.message) {\n return this.debugLog(debugLog.message);\n }\n\n this.__debugMessage.push({\n ...debugLog,\n date: new Date().toISOString(),\n });\n\n if (debugLog.logLevel === 'info' && debugLog.message) {\n this.debugLog(debugLog.message);\n }\n }\n }\n\n get amount() {\n return this.__amount;\n }\n\n /**\n * Define o valor em para a classe em centavos\n * @param value\n */\n set amount(value) {\n if (typeof value === 'number' && value <= 0) {\n throw new Error('Não é possível definir um valor menor ou igual a zero.');\n } else {\n this.__amount = parseFloat(value) * 100;\n }\n }\n\n /**\n * Pagamento com cartão de crédito, podendo ser declarado\n * com parcelamento e se o juro é da administradora.\n * @param {number} installments - número de parcelas\n * @param {boolean} withInterest - juros pela administradora\n * @returns {Promise<AuttarSuccessResponse>}\n */\n credit(installments = 1, withInterest = false) {\n return new Promise((resolve, reject) => {\n const requisition = {\n valorTransacao: this.amount,\n documento: this.orderId,\n operacao: privateVariables.transactions.credit.base,\n dataTransacao: this.__transactionDate,\n };\n if (installments > 1) {\n requisition.operacao = privateVariables.transactions.credit.installment;\n requisition.numeroParcelas = installments;\n }\n\n if (installments > 1 && withInterest) {\n requisition.operacao = privateVariables.transactions.credit.installmentWithInterest;\n requisition.numeroParcelas = installments;\n }\n\n this.debugMessage = {\n message: `Pagamento com cartão de crédito. Operação: ${requisition.operacao}. Valor ${this.amount} centavos`,\n };\n\n _connect(this.__host, requisition)\n .then((response) => {\n if (response.retorno > 0) {\n const errorMsg = privateVariables.errorCodes[response.codigoErro]\n || response.display.length\n ? response.display.map(m => m.mensagem).join(' ')\n : ' ';\n const error = this.classError(`Transação não concluída ${response.codigoErro}: ${errorMsg}`);\n\n reject(error);\n }\n\n this.ctfTransaction = {\n ...response,\n dataTransacao: this.__transactionDate,\n };\n\n this.debugMessage = {\n message: `Resposta do servidor -> ${JSON.stringify(response)}`,\n logLevel: 'log',\n };\n\n this.debugMessage = {\n message: this.ctfTransaction,\n logLevel: 'json',\n };\n\n resolve(response);\n })\n .catch((e) => this.classError(e));\n });\n }\n\n /**\n * Pagamento com cartão de crédito, podendo ser\n * declarado com parcelamento e se o juro é da administradora.\n * @param {boolean} isVoucher\n * @returns {Promise<AuttarSuccessResponse>}\n */\n debit(isVoucher = false) {\n return new Promise((resolve, reject) => {\n const operacao = isVoucher\n ? privateVariables.transactions.debit.voucher\n : privateVariables.transactions.debit.base;\n\n this.debugMessage = {\n message: `Pagamento com cartão de débito. Operação: ${operacao}. Valor ${this.amount} centavos`,\n };\n\n _connect(this.__host, {\n valorTransacao: this.amount,\n documento: this.orderId,\n dataTransacao: this.__transactionDate,\n operacao,\n })\n .then((response) => {\n if (response.retorno > 0) {\n const errorMsg = privateVariables.errorCodes[response.codigoErro]\n || response.display.length\n ? response.display.map(m => m.mensagem).join(' ')\n : ' ';\n const error = this.classError(`Transação não concluída ${response.codigoErro}: ${errorMsg}`);\n\n reject(error);\n }\n\n this.ctfTransaction = {\n ...response,\n dataTransacao: this.__transactionDate,\n };\n\n this.debugMessage = {\n message: `Resposta do servidor -> ${JSON.stringify(response)}`,\n logLevel: 'log',\n };\n\n this.debugMessage = {\n message: this.ctfTransaction,\n logLevel: 'json',\n };\n\n resolve(response);\n })\n .catch((e) => this.classError(e));\n });\n }\n\n /**\n * Confirma a operação com o CTF\n * @returns {Promise<void>}\n */\n confirm() {\n return new Promise((resolve, reject) => {\n const operacao = privateVariables.transactions.confirm;\n\n this.debugMessage = {\n message: `Confirmação de pagamento da operação realizada.\n Operação: ${this.ctfTransaction.operacao}\n Data: ${this.ctfTransaction.dataTransacao}\n Valor: ${this.amount}\n Bandeira: ${this.ctfTransaction.bandeira}\n Cartão: ${this.ctfTransaction.cartao}`,\n };\n\n _connect(this.__host, { operacao })\n .then((response) => {\n if (response.retorno > 0) {\n const errorMsg = privateVariables.errorCodes[response.codigoErro]\n || response.display.length\n ? response.display.map(m => m.mensagem).join(' ')\n : ' ';\n\n const error = this.classError(`Transação não concluída ${response.codigoErro}: ${errorMsg}`);\n\n reject(error);\n }\n\n this.ctfTransaction = Object.assign(this.ctfTransaction, response);\n\n this.debugMessage = {\n message: `Resposta do servidor -> ${JSON.stringify(response)}`,\n logLevel: 'log',\n };\n\n this.debugMessage = {\n message: response,\n logLevel: 'json',\n };\n\n resolve(response);\n })\n .catch((e) => this.classError(e));\n });\n }\n\n /**\n * Inicia o processo de cancelamento de compra.\n * @returns {Promise<void>}\n */\n requestCancellation() {\n return new Promise((resolve, reject) => {\n const operacao = privateVariables.transactions.requestCancel;\n\n this.debugMessage = {\n message: `Requisição de cancelamento de compra.\n Operação: ${this.ctfTransaction.operacao}\n Data: ${this.ctfTransaction.dataTransacao}\n Valor: ${this.amount}\n NSU: ${this.ctfTransaction.nsuCTF}`,\n };\n\n _connect(this.__host, { operacao })\n .then((response) => {\n if (response.retorno > 0) {\n const errorMsg = privateVariables.errorCodes[response.codigoErro]\n || response.display.length\n ? response.display.map(m => m.mensagem).join(' ')\n : ' ';\n\n const error = this.classError(`Transação não concluída ${response.codigoErro}: ${errorMsg}`);\n\n reject(error);\n }\n\n this.debugMessage = {\n message: `Resposta do servidor -> ${JSON.stringify(response)}`,\n logLevel: 'log',\n };\n\n this.debugMessage = {\n message: responsea,\n logLevel: 'json',\n };\n\n resolve(response);\n })\n .catch((e) => this.classError(e));\n });\n }\n\n /**\n * Realiza o cancelamento da compra.\n * @param {string} prop.dataTransacao\n * @param {number} prop.amount\n * @param {string} prop.nsuCTF\n * @returns {Promise<any>}\n */\n cancel(prop = {}) {\n return new Promise((resolve, reject) => {\n const operacao = privateVariables.transactions.cancel;\n const tefOperacao = prop.operacao || this.ctfTransaction.operacao;\n const tefDataTransacao = prop.dataTransacao || this.ctfTransaction.dataTransacao;\n const tefAmount = prop.amount ? parseFloat(prop.amount) * 100 : this.ctfTransaction.valorTransacao;\n const tefNsuCTF = prop.nsuCTF || this.ctfTransaction.nsuCTF;\n\n this.debugMessage = {\n message: `Cancelamento de compra.\n Operação: ${tefOperacao}\n Data: ${tefDataTransacao}\n Valor: ${tefAmount}\n NSU: ${tefNsuCTF}`,\n };\n\n _connect(this.__host, {\n operacao,\n valorTransacao: tefAmount,\n dataTransacao: tefDataTransacao,\n nsuCTF: tefNsuCTF,\n })\n .then((response) => {\n if (response.retorno > 0) {\n const errorMsg = privateVariables.errorCodes[response.codigoErro] || response.display[0].mensagem;\n\n const error = this.classError(`Transação não concluída ${response.codigoErro}: ${errorMsg}`);\n\n reject(error);\n }\n\n this.debugMessage = {\n message: `Resposta do servidor -> ${JSON.stringify(response)}`,\n logLevel: 'log',\n };\n\n this.debugMessage = {\n message: response,\n logLevel: 'json',\n };\n\n resolve(response);\n })\n .catch((e) => this.classError(e));\n });\n }\n}\n\nexport default Auttar;\n"],"names":["NAME","BACKGROUND","privateVariables","transactions","credit","base","installment","installmentWithInterest","debit","voucher","cancel","confirm","requestCancel","return","success","timeOut","notAuthorizes","internetError","intertefError","error","ecommerceError","errorCodes","ws","timeout","close","timeoutConn","_clearTimeout","clearTimeout","_timeout","time","setTimeout","_connect","host","payload","Promise","resolve","reject","WebSocket","readyState","e","onopen","send","JSON","stringify","onmessage","evtMsg","parse","data","onerror","evtError","props","__host","debug","orderId","__amount","amount","this","__transactionDate","Date","toLocaleDateString","year","month","day","timeZone","replace","ctfTransaction","__debugMessage","message","msg","console","log","debugMessage","logLevel","Error","installments","withInterest","requisition","valorTransacao","_this","documento","operacao","dataTransacao","numeroParcelas","then","response","retorno","errorMsg","codigoErro","display","length","map","m","mensagem","join","classError","catch","isVoucher","_this2","_this3","bandeira","cartao","Object","assign","_this4","nsuCTF","responsea","prop","tefOperacao","_this5","tefDataTransacao","tefAmount","parseFloat","tefNsuCTF","value","debugLog","date","toISOString","push"],"mappings":"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"}