Commit 17bf85b9 authored by Wendy Fuertes's avatar Wendy Fuertes

Huellas

parent b6a09156
const logs = require('../lib/logs');
module.exports = (app) => {
async function post(req, res) {
const t = await app.db.sequelize.transaction();
try {
const huella = await app.dao.huella.post(req.body, req.body.audit_usuario, t);
await t.commit();
res.json({
finalizado: true,
mensaje: 'Dato creado',
datos: huella
});
} catch (error) {
await logs(app.db.models.logs).error(error.message, error.name, error, req.body.audit_usuario.usuario);
await t.rollback();
throw error;
}
}
async function index(req, res) {
const t = await app.db.sequelize.transaction();
try {
const huellas = await app.dao.huella.index(req, t);
let page = Math.ceil(huellas.count / req.query.limit);
await t.commit();
res.json({
finalizado: true,
mensaje: 'Datos obtenidos.',
datos: huellas.rows,
paginacion:{
totalRegistros:huellas.count,
paginas:page,
paginaActual:req.params.page,
cantidad:huellas.rows.length
}
});
} catch (error) {
await logs(app.db.models.logs).error(error.message, error.name, error, req.body.audit_usuario.usuario);
await t.rollback();
throw error;
}
}
async function generacionHuellas(req, res) {
const t = await app.db.sequelize.transaction();
try {
await app.dao.huella.generacionHuellas(req.params.id, req.body.login, req.body.audit_usuario, t);
await t.commit();
res.json({
finalizado: true,
mensaje: 'Generacion de Huella con exito.',
datos: undefined
});
} catch (error) {
await logs(app.db.models.logs).error(error.message, error.name, error, req.body.audit_usuario.usuario);
await t.rollback();
throw error;
}
}
return {
post,
index,
generacionHuellas,
};
};
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
const fs = require('fs');
module.exports = (app) => {
const models = app.db.models;
const impuestos = require('../services/impuestos/huellas')(app);
async function post(datos, usuario, t) {
var huella = await models.huella.create({
modulo: datos.modulo.toUpperCase(),
ruta: datos.ruta,
nombre_archivo: datos.nombreArchivo,
_usuario_creacion: usuario.usuario,
}, {
transaction: t,
});
}
async function index(req,t) {
const options = { }
let limit = req.query.limit; // numero de respuestas por pagina
let page = req.params.page;
let offset = limit * (page - 1);
console.log(options)
return models.huella.findAndCountAll({
where: options,
limit: limit,
offset: offset,
order: [['modulo', 'ASC']]
}).then(function (data) {
page = Math.ceil(data.count / limit);
return data;
});
}
async function generacionHuellas(idHuella, login, usuario, t){
const huella = await models.huella.findByPk(idHuella, {
transaction: t
});
if (huella.estado === 'PENDIENTE') {
const puntoVenta = await models.punto_venta.findByPk(usuario.id_punto_venta, {
attributes:['nombre','estado','descripcion','fid_sucursal','tipo', 'codigo', 'cuis'],
include:[
{
attributes: ['codigo', 'nit','nombre'],
model: models.sucursal,
as: 'sucursal'
}
],
transaction: t
});
const params = {
codigoAmbiente: app.config.impuestos.codigoAmbiente,
codigoSistema: app.config.impuestos.codigoSistema,
nit: puntoVenta.sucursal.nit,
login: login,
};
params.archivo = Buffer.from(Buffer.from(fs.readFileSync(huella.ruta+'/'+huella.nombre_archivo), 'utf8').toString('base64'), 'binary').toString('base64');
console.log('-------------- PARAMS DE REGISTRO GENERACIÓN HUELLA-------------');
console.log(params);
console.log('-----------------------------------------------------');
const registro = await impuestos.generacionHuellas(params);
console.log('---------------- RESULTADOS ----------------');
console.log(registro);
console.log('---------------------------------------------');
if (!registro.transaccion) {
throw Error(await app.dao.catalogo.getError(1, registro.listaCodigosRespuestas.map(val => val.codigoMensaje.toString())));
}
//se registra los huellas
} else {
throw Error('No es posible realizar la orden solicitada')
}
}
return {
post,
index,
generacionHuellas,
};
};
......@@ -35,7 +35,6 @@ module.exports = (app) => {
}
async function post(numeroFactura, numeroDocumento, nombreRazonSocial, montoTotal, tipoEmision, tipoFactura, factura, cuf, cufd, codigoDocumentoSector, idPuntoVenta, usuario, fechaEmision, idCliente, caed, fIdVenta, t) {
console.log()
return await models.venta.create({
numero_factura: numeroFactura,
numero_documento: numeroDocumento,
......@@ -282,44 +281,6 @@ module.exports = (app) => {
});
}
// facturas pendientes que no son offline
async function getPendientesC(estado, tipo, emision, t) {
/* const cod = await app.dao.catalogo.getDocFiscal(tipo, t);
return await models.venta.findAll({
attributes: ['id_venta', 'tipo_emision', 'factura', 'caed', 'codigo_documento_sector', 'codigo_recepcion', 'fid_punto_venta','cufd'],
include: [
{
attributes: ['codigo', 'cuis', 'fid_sucursal'],
model: models.punto_venta,
as: 'punto_venta',
include: [
{
attributes: ['codigo', 'nit'],
model: models.sucursal,
as: 'sucursal'
}
]
}, {
attributes: ['codigo_documento_fiscal'],
model: models.esquema,
where:{
codigo_documento_fiscal:cod
},
as: 'esquema'
}
],
where: {
estado: estado,
tipo_emision: emision,
caed:{
$not:null
}
},
transaction: t
}).then(res => res.map(venta => venta.toJSON())); */
}
async function get(id, t) {
const leyenda = await app.dao.catalogo.getLeyendas('11');
return await models.venta.findByPk(id, {
......@@ -873,7 +834,6 @@ module.exports = (app) => {
getCantidadO,
getCantidadA,
getCantidadR,
getPendientesC,
listar_offline,
buscarFacturaId,
buscarCliente,
......
/**
* Módulo para huella
*
* @module
*
**/
module.exports = (sequelize, DataType) => {
const huella = sequelize.define('huella', {
id_huella: {
type: DataType.INTEGER,
field: 'id_huella',
primaryKey: true,
autoIncrement: true
},
modulo: {
type: DataType.TEXT,
field: 'modulo',
allowNull: false
},
ruta: {
type: DataType.TEXT,
field: 'ruta',
allowNull: false
},
nombre_archivo: {
type: DataType.TEXT,
field: 'nombre_archivo',
allowNull: false
},
huella: {
type: DataType.TEXT,
field: 'huella',
allowNull: true
},
estado: {
type: DataType.TEXT,
field: 'estado',
allowNull: false,
defaultValue: 'PENDIENTE'
},
_usuario_creacion: {
type: DataType.STRING(100),
field: '_usuario_creacion',
allowNull: false
},
_usuario_modificacion: {
type: DataType.STRING(100),
field: '_usuario_modificacion'
}
}, {
createdAt: '_fecha_creacion',
updatedAt: '_fecha_modificacion',
tableName: 'huella',
});
huella.associate = (models) => {
};
return huella;
};
......@@ -14,12 +14,12 @@ module.exports = (sequelize, DataType) => {
autoIncrement: true
},
nombre: {
type: DataType.STRING(20),
type: DataType.TEXT,
field: 'nombre',
allowNull: false
},
descripcion: {
type: DataType.STRING(30),
type: DataType.TEXT,
field: 'descripcion',
allowNull: false
},
......
module.exports = {
post: {
type: 'object',
properties: {
modulo: {
type: 'string',
required: false
},
ruta: {
type: 'string',
required: false
},
nombreArchivo: {
type: 'string',
required: true
}
}
},
params: {
type: 'object',
properties: {
id: {
type: 'numeric',
required: true
}
}
},
body: {
type: 'object',
properties: {
login: {
type: 'string',
required: true
}
}
}
};
const validate = require('express-jsonschema').validate;
const asyncHandler = require('../lib/asyncHandler');
const huellaVal = require('./huella-val');
module.exports = (app) => {
/**
* @api {post} /api/v1/huella Registrar un nuevo modulo con su huella
* @apiGroup Huella
* @apiDescription Registrar un nuevo modulo con su huella
*
* @apiParam {String} modulo Modulo del sistema de facturación a certificar
* @apiParam {String} ruta Ruta del archivo donde se encuentra el módulo
* @apiParam {String} nombreArchivo Nombre del archivo donde se encuentra el módulo
*
* @apiParamExample Ejemplo de creacion de producto
* {
* "modulo": "ARCHIVOS DE CONFIGURACIÓN",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/dao",
* "nombreArchivo": "config.js",
* }
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "finalizado": true,
* "mensaje": "Huella creada",
* }
*/
app.api.post('/huella', validate({body: huellaVal.post}), asyncHandler(app.controllers.huella.post));
/**
* @api {get} /api/v1/huella/:page Recupera todas los modulos registrados en BD
* @apiGroup Venta
* @apiDescription Recupera todas los modulos registrados en BD
*
* @apiHeader {String} Authorization Token de acceso generado para facturación
* @apiParamExample
* {
* "limit": 10
* }
* @apiSuccessExample Success-Response:
* {
* "finalizado":true,
* "mensaje":"Datos obtenidos.",
* "datos":[
* {
* "id_huella": 10,
* "modulo": "ARCHIVOS DE CONFIGURACIÓN DE ACCESO A BASE DE DATOS",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/config",
* "nombre_archivo": "config.json",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T15:49:35.644Z",
* "_fecha_modificacion": "2019-12-30T15:49:35.644Z"
* },
* {
* "id_huella": 11,
* "modulo": "ARCHIVOS DE CONFIGURACIÓN DE ACCESO A BASE DE DATOS",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/config",
* "nombre_archivo": "config.js",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T15:49:35.644Z",
* "_fecha_modificacion": "2019-12-30T15:49:35.644Z"
* },
* {
* "id_huella": 1,
* "modulo": "EMISOR DE DOCUMENTOS FISCALES ELECTRÓNICOS",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/dao",
* "nombre_archivo": "factura.js",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T15:49:35.644Z",
* "_fecha_modificacion": "2019-12-30T15:49:35.644Z"
* },
* {
* "id_huella": 2,
* "modulo": "GESTOR DE DOCUMENTOS FISCALES ELECTRÓNICOS",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/dao",
* "nombre_archivo": "venta.js",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T15:49:35.644Z",
* "_fecha_modificacion": "2019-12-30T15:49:35.644Z"
* },
* {
* "id_huella": 12,
* "modulo": "REGISTRO DE CÓDIGOS ESPECIALES",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/dao",
* "nombre_archivo": "codigo_especial.js",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T15:49:35.644Z",
* "_fecha_modificacion": "2019-12-30T15:49:35.644Z"
* },
* {
* "id_huella": 3,
* "modulo": "REGISTRO DE DOCUMENTOS FISCALES MANUALES",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/dao",
* "nombre_archivo": "contingencia.js",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T15:49:35.644Z",
* "_fecha_modificacion": "2019-12-30T15:49:35.644Z"
* },
* {
* "id_huella": 8,
* "modulo": "REGISTRO DE EVENTOS SIGNIFICATIVOS",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/dao",
* "nombre_archivo": "evento_significativo.js",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T15:49:35.644Z",
* "_fecha_modificacion": "2019-12-30T15:49:35.644Z"
* },
* {
* "id_huella": 6,
* "modulo": "REPORTE DE HUELLAS DE COMPONENTES CRÍTICOS DEL SISTEMA",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/dao",
* "nombre_archivo": "huellas.js",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T15:49:35.644Z",
* "_fecha_modificacion": "2019-12-30T15:49:35.644Z"
* },
* {
* "id_huella": 13,
* "modulo": "Reportes Ventas",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/dao",
* "nombre_archivo": "ventas.js",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T16:40:27.812Z",
* "_fecha_modificacion": "2019-12-30T16:40:27.812Z"
* },
* {
* "id_huella": 4,
* "modulo": "SINCRONIZACIÓN DE CATÁLOGOS",
* "ruta": "/home/usuario/Desarrollo/facturacion-backend/src/dao",
* "nombre_archivo": "catalogo.js.js",
* "huella": null,
* "estado": "PENDIENTE",
* "_usuario_creacion": "admin",
* "_usuario_modificacion": null,
* "_fecha_creacion": "2019-12-30T15:49:35.644Z",
* "_fecha_modificacion": "2019-12-30T15:49:35.644Z"
* }],
* "paginacion": {
* "totalRegistros": 10,
* "paginas": 1,
* "paginaActual": "1",
* "cantidad": 10
* }
* }
*/
app.api.get('/huella/:page', asyncHandler(app.controllers.huella.index));
/**
* @api {put} /api/v1/huella/generacion/:id Generacion de huella del archivo seleccionado
* @apiGroup Huella
* @apiDescription Generacion de huella del archivo seleccionado
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "finalizado":true,
* "mensaje": "Solicitud realizada."
* }
*
*/
app.api.post('/huella/generacion/:id', validate({params: huellaVal.params, body: huellaVal.body}), asyncHandler(app.controllers.huella.generacionHuellas));
};
......@@ -135,6 +135,18 @@ module.exports = {
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
// 12
ruta: '/api/v1/huella',
descripcion: 'Ruta para la administración de huellas de los diferentes componentes',
method_get: true,
method_post: true,
method_put: true,
method_delete: false,
estado: 'ACTIVO',
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}
], {});
},
......
......@@ -58,6 +58,11 @@ module.exports = {
fid_grupo: 1,
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
fid_ruta: 12,
fid_grupo: 1,
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
},{
fid_ruta: 1,
fid_grupo: 3,
......
// 'use strict';
const path = require('path');
module.exports = {
up(queryInterface) {
return queryInterface.bulkInsert('huella', [
{
modulo: 'EMISOR DE DOCUMENTOS FISCALES ELECTRÓNICOS',
ruta: path.join(__dirname.replace("seeders","")+"dao"),
nombre_archivo: 'factura.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'GESTOR DE DOCUMENTOS FISCALES ELECTRÓNICOS',
ruta: path.join(__dirname.replace("seeders","")+"dao"),
nombre_archivo: 'venta.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'REGISTRO DE DOCUMENTOS FISCALES MANUALES',
ruta: path.join(__dirname.replace("seeders","")+"dao"),
nombre_archivo: 'contingencia.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'SINCRONIZACIÓN DE CATÁLOGOS',
ruta: path.join(__dirname.replace("seeders","")+"dao"),
nombre_archivo: 'catalogo.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'SINCRONIZACIÓN DE FECHA Y HORA',
ruta: path.join(__dirname.replace("seeders","")+"dao"),
nombre_archivo: 'fechaHora.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'REPORTE DE HUELLAS DE COMPONENTES CRÍTICOS DEL SISTEMA',
ruta: path.join(__dirname.replace("seeders","")+"dao"),
nombre_archivo: 'huellas.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'VALIDADOR DE COMUNICACIONES',
ruta: path.join(__dirname.replace("seeders","")+"lib"),
nombre_archivo: 'cola.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'REGISTRO DE EVENTOS SIGNIFICATIVOS',
ruta: path.join(__dirname.replace("seeders","")+"dao"),
nombre_archivo: 'evento_significativo.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'VALIDADOR DE SALUD DEL SISTEMA',
ruta: path.join(__dirname.replace("seeders","")+"lib"),
nombre_archivo: 'cola.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'ARCHIVOS DE CONFIGURACIÓN DE ACCESO A BASE DE DATOS',
ruta: path.join(__dirname.replace("seeders","")+"config"),
nombre_archivo: 'config.json',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'ARCHIVOS DE CONFIGURACIÓN DE ACCESO A BASE DE DATOS',
ruta: path.join(__dirname.replace("seeders","")+"config"),
nombre_archivo: 'config.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}, {
modulo: 'REGISTRO DE CÓDIGOS ESPECIALES',
ruta: path.join(__dirname.replace("seeders","")+"dao"),
nombre_archivo: 'codigo_especial.js',
huella: null,
_usuario_creacion: 'admin',
_fecha_creacion: new Date(),
_fecha_modificacion: new Date()
}
], {});
},
down() {
/*
Add reverting commands here.
Return a promise to correctly handle asynchronicity.
Example:
return queryInterface.bulkDelete('Person', null, {});
*/
},
};
\ No newline at end of file
const fs = require('fs');
const request = require('request');
const soap = require('soap');
const moment = require('moment');
module.exports = (app) => {
const specialRequest = request.defaults({
agentOptions: {
ca: fs.readFileSync(`${_path}/cert/impuestos.crt`)
}
});
function verificarComunicacion() {
return new Promise((resolve, reject) => {
soap.createClient(app.config.impuestos.huellas, { request: specialRequest }, function(err, client) {
if (err) {
reject(err);
} else {
client.verificarComunicacion({}, function(err, result) {
if (err) {
reject(err);
} else {
resolve(result.return);
}
});
}
});
});
}
function generacionHuellas(params) {
return new Promise((resolve, reject) => {
soap.createClient(app.config.impuestos.huellas, { request: specialRequest }, function(err, client) {
if (err) {
reject(err);
} else {
client.generacionHuellas({
SolicitudHuellas: params
}, function(err, result) {
if (err) {
reject(err);
} else {
resolve(result.RespuestaHuellas);
}
});
}
});
});
}
return {
verificarComunicacion,
generacionHuellas
};
}
\ No newline at end of file