diff --git a/api/controller/beneficiario-controller.js b/api/controller/beneficiario-controller.js new file mode 100644 index 0000000..03a8b4e --- /dev/null +++ b/api/controller/beneficiario-controller.js @@ -0,0 +1,33 @@ +const { Response, Logger } = require('../util'); +const paramUtil = require('../helper/param-util'); +const service = require('../service/beneficiario-service'); +const BeneficiarioValidator = require('../http-validators/beneficiario-validator'); + +const consultarBeneficiarios = async (req, res, next) => { + try { + const params = paramUtil.getParams(req); + const options = BeneficiarioValidator.requisicaoConsultarBeneficiarios(params); + const resposta = await service.consultarBeneficiarios(options); + return Response.success(res, resposta, { contentType: Response.CONTENT_TYPE.APPLICATION_QR_PAGUE }); + } catch (err) { + Logger.warn(err); + return Response.fromError(res, err); + } +} + +const consultarBeneficiario = async (req, res, next) => { + try { + const params = paramUtil.getParams(req); + const options = BeneficiarioValidator.requisicaoConsultarBeneficiario(params); + const resposta = await service.consultarBeneficiario(options); + return Response.success(res, resposta, { contentType: Response.CONTENT_TYPE.APPLICATION_QR_PAGUE }); + } catch (err) { + Logger.warn(err); + return Response.fromError(res, err); + } +} + +module.exports = { + consultarBeneficiarios, + consultarBeneficiario +}; \ No newline at end of file diff --git a/api/controller/operacoes-controller.js b/api/controller/operacoes-controller.js index dbeb551..e3d8f8f 100644 --- a/api/controller/operacoes-controller.js +++ b/api/controller/operacoes-controller.js @@ -20,6 +20,19 @@ const criarOperacao = async (req, res, next) => { } } +const alterarOperacao = async (req, res, next) => { + try { + const params = paramUtil.getParams(req); + const body = req.body; + const options = OperacaoValidator.requisicaoAlterarOperacao(params, body); + const resposta = await service.alterarOperacao(options); + return Response.success(res, resposta, { contentType: Response.CONTENT_TYPE.APPLICATION_QR_PAGUE }); + } catch (err) { + Logger.warn(err); + return Response.fromError(res, err); + } +} + const consultarOperacoes = async (req, res, next) => { try { const params = paramUtil.getParams(req); @@ -77,5 +90,6 @@ module.exports = { consultarOperacoes, consultarOperacao, efetivarOperacao, - confirmarOperacao + confirmarOperacao, + alterarOperacao }; \ No newline at end of file diff --git a/api/database/model/operacao.js b/api/database/model/operacao.js index bf6e716..8e4c95f 100644 --- a/api/database/model/operacao.js +++ b/api/database/model/operacao.js @@ -89,6 +89,15 @@ module.exports = (db, mongoose, promise) => { return await operacao.save(); }, + OperacaoModel.alterarOperacao = async (uuid, valor) => { + Logger.debug('Alteração de Operação Financeira'); + + const query = { uuid, situacao: SITUACAO.EMITIDO, dataHoraVencimento: { $gte: Date.now() }} + const update = { valor } + const options = { new: true } + return await OperacaoModel.findOneAndUpdate(query, update, options).populate('pagamentos'); + } + OperacaoModel.recuperarOperacoes = async ({ idRequisicao, cpfCnpjBeneficiario, paginaInicial, tamanhoPagina, periodoInicio, periodoFim }) => { Logger.debug('Consulta de Operações Financeiras'); @@ -229,5 +238,55 @@ module.exports = (db, mongoose, promise) => { } } + OperacaoModel.consultarBeneficiarios = async ({ cpfCnpj, paginaInicial, tamanhoPagina }) => { + Logger.debug('Consulta de Beneficiário'); + + const limit = tamanhoPagina ? parseInt(tamanhoPagina) : DEFAULT_MONGOOSE_LIMIT; + const skip = paginaInicial ? parseInt(paginaInicial) * limit : DEFAULT_MONGOOSE_SKIP; + const query = [ + { + $group:{ + _id: { + beneficiario: '$beneficiario' + } + } + }, { + "$project":{ + _id: false, + "beneficiario":"$_id.beneficiario" + } + },{ + "$skip":0 + },{ + "$limit":30 + },{ + $group: { + _id: 'lista', + resultado: { + $push: '$beneficiario' + } + } + }, { + $project: { + _id: false, + resultado: 1 + } + } + ]; + + if(cpfCnpj && (typeof cpfCnpj === 'string' || ( Array.isArray(cpfCnpj) && cpfCnpj.length > 0 ))) { + query.unshift({ + $match: { + 'beneficiario.cpfCnpj': { + $in: cpfCnpj + } + } + }); + } + + const resposta = await OperacaoModel.aggregate(query); + return (resposta && resposta[0]) ? resposta[0].resultado : resposta; + } + return OperacaoModel; } \ No newline at end of file diff --git a/api/http-validators/beneficiario-validator.js b/api/http-validators/beneficiario-validator.js new file mode 100644 index 0000000..2c7c3a5 --- /dev/null +++ b/api/http-validators/beneficiario-validator.js @@ -0,0 +1,56 @@ +const { CONSTANTS } = require('../jwt'); +const { Response, ResponseError, Err, Logger } = require('../util'); +const { campoObrigatorio } = require('./commum'); + +const requisicaoConsultarBeneficiarios = (params) => { + + try { + + campoObrigatorio('token-instituicao', params[CONSTANTS.TOKEN_NAME]); + + let requisicao = { + tokenInstituicao: params[CONSTANTS.TOKEN_NAME], + } + + if(params.cpfCnpj) { + requisicao = { ...requisicao, cpfCnpj: params.cpfCnpj } + } + + return requisicao; + + } catch(err) { + Logger.warn(err); + if(!(err instanceof ResponseError)){ + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 997000); + } + throw err; + } +} + +const requisicaoConsultarBeneficiario = (params) => { + + try { + + campoObrigatorio('token-instituicao', params[CONSTANTS.TOKEN_NAME]); + campoObrigatorio('cpfCnpj', params.cpfCnpj); + + let requisicao = { + tokenInstituicao: params[CONSTANTS.TOKEN_NAME], + cpfCnpj: params.cpfCnpj + } + + return requisicao; + + } catch(err) { + Logger.warn(err); + if(!(err instanceof ResponseError)){ + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 997000); + } + throw err; + } +} + +module.exports = { + requisicaoConsultarBeneficiarios, + requisicaoConsultarBeneficiario +} \ No newline at end of file diff --git a/api/http-validators/operacoes-validator.js b/api/http-validators/operacoes-validator.js index 4bfb5c0..4e8a0b8 100644 --- a/api/http-validators/operacoes-validator.js +++ b/api/http-validators/operacoes-validator.js @@ -1,5 +1,5 @@ const { CONSTANTS } = require('../jwt'); -const { ResponseError, Err, Logger } = require('../util'); +const { Response, ResponseError, Err, Logger } = require('../util'); const { campoObrigatorio } = require('./commum'); const requisicaoCriarOperacao = (params, body) => { @@ -350,10 +350,33 @@ const requisicaoConfirmarOperacao = (params, body) => { } } +const requisicaoAlterarOperacao = (params, body) => { + try { + + campoObrigatorio('uuid', params.uuid); + campoObrigatorio('valor', body.valor); + + let requisicao = { + uuid: params.uuid, + valor: body.valor + } + + return requisicao; + + } catch(err) { + Logger.warn(err); + if(!(err instanceof ResponseError)){ + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 997000); + } + throw err; + } +} + module.exports = { requisicaoCriarOperacao, requisicaoConsultarOperacoes, requisicaoConsultarOperacao, requisicaoEfetivarOperacao, - requisicaoConfirmarOperacao + requisicaoConfirmarOperacao, + requisicaoAlterarOperacao } \ No newline at end of file diff --git a/api/http-validators/pagamento-validator.js b/api/http-validators/pagamento-validator.js index 96fa370..17b5442 100644 --- a/api/http-validators/pagamento-validator.js +++ b/api/http-validators/pagamento-validator.js @@ -1,5 +1,5 @@ const { CONSTANTS } = require('../jwt'); -const { ResponseError, Err, Logger } = require('../util'); +const { Response, ResponseError, Err, Logger } = require('../util'); const { campoObrigatorio } = require('./commum'); const requisicaoCriarPagamento = (params, body) => { diff --git a/api/routes/index.js b/api/routes/index.js index e32ecbb..c757b74 100644 --- a/api/routes/index.js +++ b/api/routes/index.js @@ -2,12 +2,14 @@ let express = require('express') let Operacao = require('../controller/operacoes-controller'); let Pagamento = require('../controller/pagamento-controller'); +let Beneficiario = require('../controller/beneficiario-controller'); const router = express.Router(); router.route('/operacoes').post(Operacao.criarOperacao); router.route('/operacoes').get(Operacao.consultarOperacoes); router.route('/operacoes/:uuid').get(Operacao.consultarOperacao); +router.route('/operacoes/:uuid').patch(Operacao.alterarOperacao); router.route('/operacoes/:uuid/efetivacao').put(Operacao.efetivarOperacao); router.route('/operacoes/:uuid/confirmacao').put(Operacao.confirmarOperacao); @@ -16,4 +18,7 @@ router.route('/pagamentos').get(Pagamento.consultarPagamentos); router.route('/pagamentos/:uuid').get(Pagamento.consultarPagamento); router.route('/pagamentos/:uuid/confirmacao').put(Pagamento.confirmarPagamento); +router.route('/beneficiarios').get(Beneficiario.consultarBeneficiarios); +router.route('/beneficiarios/:cpfCnpj').get(Beneficiario.consultarBeneficiario); + module.exports = router; diff --git a/api/service/beneficiario-service.js b/api/service/beneficiario-service.js new file mode 100644 index 0000000..6f1d7c1 --- /dev/null +++ b/api/service/beneficiario-service.js @@ -0,0 +1,151 @@ +const path = require('path'); +const fs = require('fs'); +const uuidv4 = require('uuid/v4'); +const QRCode = require('qrcode'); +const jwt = require('../jwt'); +const { Operacao } = require('../database/db'); +const { ResponseError, Err, Request, Response, Logger, YAMLReader } = require('../util'); +const { Instituicao } = require('../regras'); +const Crypto = require('../crypto'); + +const MY_PRIVATE_KEY = fs.readFileSync(process.env.MY_PRIVATE_KEY); + +const JWT = { + ERROR_NAME: ['JsonWebTokenError', 'TokenExpiredError'], + INVALID_SUBJECT: { + ERROR_MESSAGE: 'jwt subject invalid' + }, + INVALID_SIGNATURE: { + ERROR_MESSAGE: 'invalid signature' + }, + TOKEN_EXPIRED: { + ERROR_MESSAGE: 'jwt expired' + } +} + +const consultarBeneficiarios = async ({ cpfCnpj, tokenInstituicao, paginaInicial, tamanhoPagina }) => { + + let cnpjInstituicao; + + try { + + cnpjInstituicao = extrairCNPJDoJWT(tokenInstituicao); + if(!cnpjInstituicao) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 9000, 1); + } + + const instituicaoSolicitante = Instituicao.buscar(cnpjInstituicao); + if(!instituicaoSolicitante) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 9000, 2, { cnpj: cnpjInstituicao }); + } + + await verificarTokenInstituicao(tokenInstituicao, instituicaoSolicitante.chavePublica, cnpjInstituicao); + + cpfCnpj = !cpfCnpj ? [] : cpfCnpj.split(','); + + const options = { + cpfCnpj, + paginaInicial, + tamanhoPagina + } + const beneficiarios = await Operacao.consultarBeneficiarios(options); + const hashObj = Crypto.hash(JSON.stringify(beneficiarios)); + const signatureObj = Crypto.sign(hashObj.hash, MY_PRIVATE_KEY); + const resultado = { + quantidadeRegistros: beneficiarios.length, + paginaAtual: paginaInicial, + tamanhoPagina: tamanhoPagina, + resultados: beneficiarios, + hash: hashObj.hash, + assinatura: signatureObj.signature, + algoritmo: signatureObj.algorithm + } + return resultado; + } catch(err) { + + Logger.warn(err); + + if(!(err instanceof ResponseError)){ + if(isErroJWT(err)) { + if(err.message.includes(JWT.INVALID_SUBJECT.ERROR_MESSAGE)) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 9000, 2, { cnpj: cnpjInstituicao }); + } else if(err.message.includes(JWT.INVALID_SIGNATURE.ERROR_MESSAGE)) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 999000, 2); + } else if(err.message.includes(JWT.TOKEN_EXPIRED.ERROR_MESSAGE)) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 999000, 4); + } + } + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 9000); + } + throw err; + } +} + +const consultarBeneficiario = async ({ cpfCnpj, tokenInstituicao }) => { + + let cnpjInstituicao; + + try { + + cnpjInstituicao = extrairCNPJDoJWT(tokenInstituicao); + if(!cnpjInstituicao) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 9000, 1); + } + + const instituicaoSolicitante = Instituicao.buscar(cnpjInstituicao); + if(!instituicaoSolicitante) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 9000, 2, { cnpj: cnpjInstituicao }); + } + + await verificarTokenInstituicao(tokenInstituicao, instituicaoSolicitante.chavePublica, cnpjInstituicao); + + const beneficiarios = await Operacao.consultarBeneficiarios({cpfCnpj: [cpfCnpj]}); + const beneficiario = beneficiarios[0]; + if (!beneficiario) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 9000, 3, { cpfCnpj }); + } + + const hashObj = Crypto.hash(JSON.stringify(beneficiario)); + const signatureObj = Crypto.sign(hashObj.hash, MY_PRIVATE_KEY); + const resultado = { + resultado: beneficiario, + hash: hashObj.hash, + assinatura: signatureObj.signature, + algoritmo: signatureObj.algorithm + } + return resultado; + } catch(err) { + + Logger.warn(err); + + if(!(err instanceof ResponseError)){ + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 9000); + } + throw err; + } +} + +const extrairCNPJDoJWT = (token) => { + if(!token) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 999000, 1); + } + const decodedJwt = jwt.decode(token); + if(!decodedJwt){ + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 999000, 3); + } + return decodedJwt.sub; +} + +const verificarTokenInstituicao = async (token, key, cnpj) => { + const options = { subject: cnpj } + await jwt.verify(token, key, options); +} + +const isErroJWT = (err) => { + return JWT.ERROR_NAME.includes(err.name); +} + +module.exports = { + consultarBeneficiarios, + consultarBeneficiario +} \ No newline at end of file diff --git a/api/service/operacao-service.js b/api/service/operacao-service.js index 076d16a..dd0a96f 100644 --- a/api/service/operacao-service.js +++ b/api/service/operacao-service.js @@ -54,6 +54,29 @@ const criarOperacao = async ({ contentType, operacaoFinanceira }) => { } } +const alterarOperacao = async ({ uuid, valor }) => { + try { + let operacao = await Operacao.consultarOperacao(uuid, Operacao.SITUACAO.EMITIDO); + if (!operacao) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 8000, 1, { uuid }); + } + if(valor < 0) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 8000, 2, { uuid }); + } + const resultado = await Operacao.alterarOperacao(uuid, valor); + if(!resultado) { + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 8000, 3, { uuid }); + } + return resultado; + } catch(err) { + Logger.warn(err); + if(!(err instanceof ResponseError)){ + Err.throwError(Response.HTTP_STATUS.BAD_REQUEST, 8000); + } + throw err; + } +} + const consultarOperacoes = async ({ idRequisicao, tokenInstituicao, cpfCnpjBeneficiario, paginaInicial, tamanhoPagina, periodoInicio, periodoFim }) => { let cnpjInstituicao; @@ -210,5 +233,6 @@ module.exports = { consultarOperacoes, consultarOperacao, efetivarOperacao, - confirmarOperacao + confirmarOperacao, + alterarOperacao } \ No newline at end of file diff --git a/api/swagger/swagger-openapi-2.yaml b/api/swagger/swagger-openapi-2.yaml index ad84929..272c3c8 100644 --- a/api/swagger/swagger-openapi-2.yaml +++ b/api/swagger/swagger-openapi-2.yaml @@ -190,6 +190,53 @@ paths: $ref: '#/definitions/MensagemRetorno' x-auth-type: Application & Application User x-throttling-tier: Unlimited + patch: + tags: + - Operações Financeiras Digitais + summary: >- + Endpoit para alterar o valor de uma operação financeira digital + (Transferência, Saque ou Pagamento) gerada através do QRPAGUE. + description: >- + Este endpoint deve ser implementado pela instituição financeira para + recuperar as informações de uma operação financeira digital + (Transferência, Saque ou Pagamento) identificada pelo UUID passado como + parâmetro. + operationId: alterarOperacao + security: + - OAuth2: [qrpague_operacao_alteracao] + produces: + - application/qrpague + - application/json + parameters: + - in: path + name: uuid + description: >- + Identificador único da operação financeira na instituição financeira + que gerou o QRCode. + required: true + type: string + pattern: >- + ^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$ + - in: body + name: AlteracaoOperacaoFinanceira + required: true + schema: + $ref: '#/definitions/AlteracaoOperacaoFinanceira' + responses: + '200': + description: Requisição realizada com sucesso + schema: + $ref: '#/definitions/RespostaConsultaOperacaoFinanceira' + '400': + description: Exceção de negócio + schema: + $ref: '#/definitions/MensagemRetorno' + '500': + description: Erro interno no servidor + schema: + $ref: '#/definitions/MensagemRetorno' + x-auth-type: Application & Application User + x-throttling-tier: Unlimited '/operacoes/{uuid}/efetivacao': x-swagger-router-controller: operacoes-controller put: @@ -554,6 +601,114 @@ paths: $ref: '#/definitions/MensagemRetorno' x-auth-type: Application & Application User x-throttling-tier: Unlimited + + /beneficiarios: + get: + tags: + - Beneficiário + summary: >- + Endpoit para recuperar informações de beneficiários vinculados a operações + financeiras digitais através do CPF ou CNPJ. + description: >- + Este endpoint deve ser implementado pela instituição financeira para + devolver as informações de beneficiários ligados a operações financeiras + digitais geradas através da solução QRPague. + operationId: consultarBeneficiarios + security: + - OAuth2: [qrpague_beneficiario_consulta] + produces: + - application/qrpague + - application/json + parameters: + - in: header + name: token-instituicao + type: string + description: >- + JSON Web Token de pagamento assinado pela instituição + que solicita o pagamento. RFC 7519 + required: true + - in: query + name: cpfCnpj + type: string + minLength: 11 + maxLength: 14 + description: >- + Especificação do CPF ou CPNJ do beneficiário . Este parametro aceita um array de CPF's ou CNPJ's separados por ','. + - in: query + name: paginaInicial + description: >- + Especificação de uma página inicial para consulta de operações + financeiras digitais. + type: integer + - in: query + name: tamanhoPagina + description: >- + Especificação de um tamanho de página para consulta de operações + financeiras digitais. + type: integer + responses: + '200': + description: Requisição realizada com sucesso + schema: + $ref: '#/definitions/RespostaConsultaBeneficiarios' + '400': + description: Exceção de negócio + schema: + $ref: '#/definitions/MensagemRetorno' + '500': + description: Erro interno no servidor + schema: + $ref: '#/definitions/MensagemRetorno' + x-auth-type: Application & Application User + x-throttling-tier: Unlimited + '/beneficiarios/{cpfCnpj}': + get: + tags: + - Beneficiário + summary: >- + Endpoit para recuperar informações de um beneficiário vinculado a operações + financeiras digitais através do CPF ou CNPJ. + description: >- + Este endpoint deve ser implementado pela instituição financeira para + devolver as informações de um beneficiário ligado a operações financeiras + digitais geradas através da solução QRPague. + operationId: consultarBeneficiario + security: + - OAuth2: [qrpague_beneficiario_consulta] + produces: + - application/qrpague + - application/json + parameters: + - in: header + name: token-instituicao + type: string + description: >- + JSON Web Token de pagamento assinado pela instituição + que solicita o pagamento. RFC 7519 + required: true + - in: path + name: cpfCnpj + type: string + minLength: 11 + maxLength: 14 + description: >- + Especificação do CPF ou CPNJ do beneficiário. + required: true + responses: + '200': + description: Requisição realizada com sucesso + schema: + $ref: '#/definitions/RespostaConsultaBeneficiario' + '400': + description: Exceção de negócio + schema: + $ref: '#/definitions/MensagemRetorno' + '500': + description: Erro interno no servidor + schema: + $ref: '#/definitions/MensagemRetorno' + x-auth-type: Application & Application User + x-throttling-tier: Unlimited securityDefinitions: OAuth2: @@ -564,11 +719,13 @@ securityDefinitions: scopes: qrpague_operacao_cadastro: Autoriza recurso para gerar uma operação financeira digital. qrpague_operacao_consulta: Autoriza recurso para consultar operação financeira digital. + qrpague_operacao_alteracao: Autoriza recurso para alterar operação financeira digital. qrpague_operacao_efetivacao: Autoriza recurso para efetivar uma operação financeira digital. qrpague_operacao_confirmacao: Autoriza recurso para confirmar uma operação financeira digital. qrpague_pagamento_cadastro: Autoriza recurso para gerar pagamento. qrpague_pagamento_consulta: Autoriza recurso para consultar pagamento. qrpague_pagamento_confirmacao: Autoriza recurso para confirmar pagamento. + qrpague_beneficiario_consulta: Autoriza recurso para consultar beneficiario. definitions: RespostaConsultaOperacoes: @@ -677,6 +834,81 @@ definitions: - hash - assinatura - algoritmo + RespostaConsultaBeneficiarios: + type: object + properties: + quantidadeRegistros: + type: integer + description: >- + Quantidade de objetos retornados em uma consulta de operações + financeiras ou pagamentos. + example: 50 + tamanhoPagina: + type: integer + description: >- + Quantidade de objetos apresentados por página em uma consulta de + operações financeiras ou pagamentos. + example: 15 + paginaAtual: + type: integer + description: >- + Número que representa a página em que uma consulta de operações + financeiras ou pagamentos está sendo apresentada. + example: 2 + links: + type: array + description: >- + Links de possíveis ações a serem realizadas no resultado vindo de + uma consulta de operações financeiras ou pagamentos. + items: + $ref: '#/definitions/Link' + resultados: + type: array + description: >- + Conjunto de objetos recuperados a partir dos parâmetros de filtragem + informados. + items: + $ref: '#/definitions/ConsultaBeneficiario' + hash: + type: string + description: >- + Hash do resultado na consulta. + assinatura: + type: string + description: >- + Assinatura da instituição que gera o resultado. + algoritmo: + type: string + description: >- + Algoritmo utilizado na assinatura. + required: + - quantidadeRegistros + - resultados + - hash + - assinatura + - algoritmo + RespostaConsultaBeneficiario: + type: object + properties: + resultado: + $ref: "#/definitions/ConsultaBeneficiario" + hash: + type: string + description: >- + Hash do resultado na consulta. + assinatura: + type: string + description: >- + Assinatura da instituição que gera o resultado. + algoritmo: + type: string + description: >- + Algoritmo utilizado na assinatura. + required: + - resultado + - hash + - assinatura + - algoritmo Link: type: object properties: @@ -944,6 +1176,17 @@ definitions: - dataHoraVencimento - tipoOperacao - beneficiario + AlteracaoOperacaoFinanceira: + type: object + properties: + valor: + type: integer + description: >- + Valor da operação financeira realizada, onde os últimos 2 dígitos + são as casas decimais. + example: 150000 + required: + - valor RespostaConsultaPagamento: type: object properties: @@ -1026,6 +1269,9 @@ definitions: - pagador - valor - situacao + ConsultaBeneficiario: + type: object + $ref: '#/definitions/Pessoa' InclusaoPagamento: type: object properties: diff --git a/api/templates/mensagens/error-messages.yaml b/api/templates/mensagens/error-messages.yaml index e83f2d2..23e2e32 100644 --- a/api/templates/mensagens/error-messages.yaml +++ b/api/templates/mensagens/error-messages.yaml @@ -108,6 +108,32 @@ erros: - operacao_confirmada: codigoDetalheErro: 2 detalheErro: A operação ${uuid} não pode ser confirmada/cancelada + - alteracao_operacao: + codigoErro: 8000 + mensagemErro: Erro de alteração de operação + detalhes: + - operacao_nao_encontrada: + codigoDetalheErro: 1 + detalheErro: A operação ${uuid} não existe ou o status já não é mais EMITIDO. + - operacao_alterada: + codigoDetalheErro: 2 + detalheErro: A operação ${uuid} não pode ser alterada. Informe um valor maior ou igual a 0 (ZERO). + - operacao_nao_pode_ser_modificada: + codigoDetalheErro: 3 + detalheErro: A operação ${uuid} não pode ser alterada. Verifique o status da operação ou a data de vencimento. + - consulta_beneficiario: + codigoErro: 9000 + mensagemErro: Erro de consulta de beneficiário + detalhes: + - cnpj_nao_informado: + codigoDetalheErro: 1 + detalheErro: O CNPJ não foi informado + - cnpj_nao_autorizado: + codigoDetalheErro: 2 + detalheErro: A instituição de cnpj ${cnpj} não está autorizada + - erro_ao_salvar: + codigoDetalheErro: 3 + detalheErro: A beneficiário de CPF/CNPJ ${cpfCnpj} não existe - requisicao: codigoErro: 997000 mensagemErro: Erro na requisição diff --git a/templates/message/error-messages.yaml b/templates/message/error-messages.yaml index e83f2d2..23e2e32 100644 --- a/templates/message/error-messages.yaml +++ b/templates/message/error-messages.yaml @@ -108,6 +108,32 @@ erros: - operacao_confirmada: codigoDetalheErro: 2 detalheErro: A operação ${uuid} não pode ser confirmada/cancelada + - alteracao_operacao: + codigoErro: 8000 + mensagemErro: Erro de alteração de operação + detalhes: + - operacao_nao_encontrada: + codigoDetalheErro: 1 + detalheErro: A operação ${uuid} não existe ou o status já não é mais EMITIDO. + - operacao_alterada: + codigoDetalheErro: 2 + detalheErro: A operação ${uuid} não pode ser alterada. Informe um valor maior ou igual a 0 (ZERO). + - operacao_nao_pode_ser_modificada: + codigoDetalheErro: 3 + detalheErro: A operação ${uuid} não pode ser alterada. Verifique o status da operação ou a data de vencimento. + - consulta_beneficiario: + codigoErro: 9000 + mensagemErro: Erro de consulta de beneficiário + detalhes: + - cnpj_nao_informado: + codigoDetalheErro: 1 + detalheErro: O CNPJ não foi informado + - cnpj_nao_autorizado: + codigoDetalheErro: 2 + detalheErro: A instituição de cnpj ${cnpj} não está autorizada + - erro_ao_salvar: + codigoDetalheErro: 3 + detalheErro: A beneficiário de CPF/CNPJ ${cpfCnpj} não existe - requisicao: codigoErro: 997000 mensagemErro: Erro na requisição