closes 4732 etiquetas con QR para previa y item #1163
|
@ -0,0 +1,16 @@
|
|||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [2302.01] - 2023-01-12
|
||||
|
||||
### Added
|
||||
|
||||
-
|
||||
|
||||
### Changed
|
||||
|
||||
-
|
|
@ -0,0 +1,215 @@
|
|||
const md5 = require('md5');
|
||||
const fs = require('fs-extra');
|
||||
|
||||
module.exports = Self => {
|
||||
Self.remoteMethodCtx('saveSign', {
|
||||
description: 'Save sign',
|
||||
accessType: 'WRITE',
|
||||
accepts:
|
||||
[
|
||||
{
|
||||
arg: 'signContent',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: 'The sign content'
|
||||
}, {
|
||||
arg: 'tickets',
|
||||
type: ['number'],
|
||||
required: true,
|
||||
description: 'The tickets'
|
||||
}, {
|
||||
arg: 'signedTime',
|
||||
type: 'date',
|
||||
description: 'The signed time'
|
||||
}, {
|
||||
arg: 'addressFk',
|
||||
type: 'number',
|
||||
required: true,
|
||||
description: 'The address fk'
|
||||
}
|
||||
],
|
||||
returns: {
|
||||
type: 'Object',
|
||||
root: true
|
||||
},
|
||||
http: {
|
||||
path: `/saveSign`,
|
||||
verb: 'POST'
|
||||
}
|
||||
});
|
||||
|
||||
async function createGestDoc(ticketId, userFk) {
|
||||
const models = Self.app.models;
|
||||
if (!await gestDocExists(ticketId)) {
|
||||
const result = await models.Ticket.findOne({
|
||||
where: {
|
||||
id: ticketId
|
||||
},
|
||||
include: [
|
||||
{
|
||||
relation: 'warehouse',
|
||||
scope: {
|
||||
fields: ['id']
|
||||
}
|
||||
}, {
|
||||
relation: 'client',
|
||||
scope: {
|
||||
fields: ['name']
|
||||
}
|
||||
}, {
|
||||
relation: 'route',
|
||||
scope: {
|
||||
fields: ['id']
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
const warehouseFk = result.warehouseFk;
|
||||
const companyFk = result.companyFk;
|
||||
const client = result.client.name;
|
||||
const route = result.route.id;
|
||||
|
||||
const resultDmsType = await models.DmsType.findOne({
|
||||
where: {
|
||||
code: 'Ticket'
|
||||
}
|
||||
});
|
||||
|
||||
const resultDms = await models.Dms.create({
|
||||
dmsTypeFk: resultDmsType.id,
|
||||
reference: ticketId,
|
||||
description: `Ticket ${ticketId} Cliente ${client} Ruta ${route}`,
|
||||
companyFk: companyFk,
|
||||
warehouseFk: warehouseFk,
|
||||
workerFk: userFk
|
||||
});
|
||||
|
||||
return resultDms.insertId;
|
||||
}
|
||||
}
|
||||
|
||||
async function gestDocExists(ticket) {
|
||||
const models = Self.app.models;
|
||||
const result = await models.TicketDms.findOne({
|
||||
where: {
|
||||
ticketFk: ticket
|
||||
},
|
||||
fields: ['dmsFk']
|
||||
});
|
||||
|
||||
if (result == null)
|
||||
return false;
|
||||
|
||||
const isSigned = await models.Ticket.findOne({
|
||||
where: {
|
||||
id: ticket
|
||||
},
|
||||
fields: ['isSigned']
|
||||
});
|
||||
|
||||
if (isSigned)
|
||||
return true;
|
||||
else
|
||||
await models.Dms.destroyById(ticket);
|
||||
}
|
||||
|
||||
async function dmsRecover(ticket, signContent) {
|
||||
const models = Self.app.models;
|
||||
await models.DmsRecover.create({
|
||||
ticketFk: ticket,
|
||||
sign: signContent
|
||||
});
|
||||
}
|
||||
|
||||
async function ticketGestdoc(ticket, dmsFk) {
|
||||
const models = Self.app.models;
|
||||
models.TicketDms.replaceOrCreate({
|
||||
ticketFk: ticket,
|
||||
dmsFk: dmsFk
|
||||
});
|
||||
|
||||
const queryVnTicketSetState = `CALL vn.ticket_setState(?, ?)`;
|
||||
|
||||
await Self.rawSql(queryVnTicketSetState, [ticket, 'DELIVERED']);
|
||||
}
|
||||
|
||||
async function updateGestdoc(file, ticket) {
|
||||
const models = Self.app.models;
|
||||
models.Dms.updateOne({
|
||||
where: {
|
||||
id: ticket
|
||||
},
|
||||
file: file,
|
||||
contentType: 'image/png'
|
||||
});
|
||||
}
|
||||
|
||||
Self.saveSign = async(ctx, signContent, tickets, signedTime) => {
|
||||
const models = Self.app.models;
|
||||
let tx = await Self.beginTransaction({});
|
||||
try {
|
||||
const userId = ctx.req.accessToken.userId;
|
||||
|
||||
const dmsDir = `storage/dms`;
|
||||
|
||||
let image = null;
|
||||
|
||||
for (let i = 0; i < tickets.length; i++) {
|
||||
const alertLevel = await models.TicketState.findOne({
|
||||
where: {
|
||||
ticketFk: tickets[i]
|
||||
},
|
||||
fields: ['alertLevel']
|
||||
});
|
||||
|
||||
signedTime ? signedTime != undefined : signedTime = new Date();
|
||||
|
||||
if (alertLevel >= 2) {
|
||||
let dir;
|
||||
let id = null;
|
||||
let fileName = null;
|
||||
|
||||
if (!await gestDocExists(tickets[i])) {
|
||||
id = await createGestDoc(tickets[i], userId);
|
||||
|
||||
const hashDir = md5(id).substring(0, 3);
|
||||
dir = `${dmsDir}/${hashDir}`;
|
||||
|
||||
if (!fs.existsSync(dir))
|
||||
fs.mkdirSync(dir);
|
||||
|
||||
fileName = `${id}.png`;
|
||||
image = `${dir}/${fileName}`;
|
||||
} else
|
||||
|
||||
if (image != null) {
|
||||
if (!fs.existsSync(dir))
|
||||
dmsRecover(tickets[i], signContent);
|
||||
else {
|
||||
fs.writeFile(image, signContent, 'base64', async function(err) {
|
||||
if (err) {
|
||||
await tx.rollback();
|
||||
return err.message;
|
||||
}
|
||||
});
|
||||
}
|
||||
} else
|
||||
dmsRecover(tickets[i], signContent);
|
||||
|
||||
if (id != null && fileName.length > 0) {
|
||||
ticketGestdoc(tickets[i], id);
|
||||
updateGestdoc(id, fileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tx) await tx.commit();
|
||||
|
||||
return 'OK';
|
||||
} catch (err) {
|
||||
await tx.rollback();
|
||||
throw err.message;
|
||||
}
|
||||
};
|
||||
};
|
|
@ -6,6 +6,7 @@ module.exports = Self => {
|
|||
require('../methods/dms/removeFile')(Self);
|
||||
require('../methods/dms/updateFile')(Self);
|
||||
require('../methods/dms/deleteTrashFiles')(Self);
|
||||
require('../methods/dms/saveSign')(Self);
|
||||
|
||||
Self.checkRole = async function(ctx, id) {
|
||||
const models = Self.app.models;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`) VALUES ('Dms','saveSign','*','ALLOW','employee');
|
|
@ -0,0 +1,438 @@
|
|||
DROP PROCEDURE IF EXISTS `sage`.`accountingMovements_add`;
|
||||
|
||||
DELIMITER $$
|
||||
$$
|
||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `sage`.`accountingMovements_add`(vYear INT, vCompanyFk INT)
|
||||
BEGIN
|
||||
/**
|
||||
* Traslada la info de contabilidad generada en base a vn.XDiario a la tabla sage.movConta para poder ejecutar posteriormente el proceso de importación de datos de SQL Server
|
||||
* Solo traladará los asientos marcados con el campo vn.XDiario.enlazadoSage = FALSE
|
||||
* @vYear Año contable del que se quiere trasladar la información
|
||||
* @vCompanyFk Empresa de la que se quiere trasladar datos
|
||||
*/
|
||||
DECLARE vDatedFrom DATETIME;
|
||||
DECLARE vDatedTo DATETIME;
|
||||
DECLARE vDuaTransactionFk INT;
|
||||
DECLARE vTaxImportFk INT;
|
||||
DECLARE vTaxImportReducedFk INT;
|
||||
DECLARE vTaxImportSuperReducedFk INT;
|
||||
DECLARE vTransactionExportFk INT;
|
||||
DECLARE vTransactionExportTaxFreeFk INT;
|
||||
DECLARE vSerialDua VARCHAR(1) DEFAULT 'D';
|
||||
DECLARE vInvoiceTypeInformativeCode VARCHAR(1);
|
||||
DECLARE vCountryCanariasCode, vCountryCeutaMelillaCode VARCHAR(2) ;
|
||||
DECLARE vBookEntries TEXT;
|
||||
|
||||
SELECT SiglaNacion INTO vCountryCanariasCode
|
||||
FROM Naciones
|
||||
WHERE Nacion ='ISLAS CANARIAS';
|
||||
|
||||
SELECT SiglaNacion INTO vCountryCeutaMelillaCode
|
||||
FROM Naciones
|
||||
WHERE Nacion ='CEUTA Y MELILLA';
|
||||
|
||||
SELECT CodigoTransaccion INTO vDuaTransactionFk
|
||||
FROM TiposTransacciones
|
||||
WHERE Transaccion = 'Import. bienes y serv. corrientes pdte. liquidar';
|
||||
|
||||
SELECT CodigoIva INTO vTaxImportFk
|
||||
FROM TiposIva
|
||||
WHERE Iva = 'IVA 21% importaciones';
|
||||
|
||||
SELECT CodigoIva INTO vTaxImportReducedFk
|
||||
FROM TiposIva
|
||||
WHERE Iva = 'IVA 10% importaciones';
|
||||
|
||||
SELECT CodigoIva INTO vTaxImportSuperReducedFk
|
||||
FROM TiposIva
|
||||
WHERE Iva = 'H.P. IVA Soportado Impor 4%';
|
||||
|
||||
SELECT CodigoTransaccion INTO vTransactionExportFk
|
||||
FROM TiposTransacciones
|
||||
WHERE Transaccion = 'Exportaciones definitivas';
|
||||
|
||||
SELECT CodigoTransaccion INTO vTransactionExportTaxFreeFk
|
||||
FROM TiposTransacciones
|
||||
WHERE Transaccion = 'Envíos definitivos a Canarias, Ceuta y Melilla';
|
||||
|
||||
SELECT codeSage INTO vInvoiceTypeInformativeCode
|
||||
FROM invoiceType WHERE code ='informative';
|
||||
|
||||
SELECT CAST(CONCAT(vYear, '-01-01') AS DATETIME), util.dayEnd(CAST(CONCAT(vYear, '-12-31') AS DATE))
|
||||
INTO vDatedFrom, vDatedTo;
|
||||
|
||||
TRUNCATE movContaIVA;
|
||||
|
||||
DELETE FROM movConta
|
||||
WHERE enlazadoSage = FALSE
|
||||
AND Asiento <> 1 ;
|
||||
|
||||
CALL clientSupplier_add(vCompanyFk);
|
||||
CALL pgc_add(vCompanyFk);
|
||||
CALL invoiceOut_manager(vYear, vCompanyFk);
|
||||
CALL invoiceIn_manager(vYear, vCompanyFk);
|
||||
|
||||
INSERT INTO movConta(TipoEntrada,
|
||||
Ejercicio,
|
||||
CodigoEmpresa,
|
||||
Asiento,
|
||||
CargoAbono,
|
||||
CodigoCuenta,
|
||||
Contrapartida,
|
||||
FechaAsiento,
|
||||
Comentario,
|
||||
ImporteAsiento,
|
||||
NumeroPeriodo,
|
||||
FechaGrabacion,
|
||||
CodigoDivisa,
|
||||
ImporteCambio,
|
||||
ImporteDivisa,
|
||||
FactorCambio,
|
||||
IdProcesoIME,
|
||||
TipoCarteraIME,
|
||||
TipoAnaliticaIME,
|
||||
StatusTraspasadoIME,
|
||||
TipoImportacionIME,
|
||||
Metalico347,
|
||||
BaseIva1,
|
||||
PorBaseCorrectora1,
|
||||
PorIva1,
|
||||
CuotaIva1,
|
||||
PorRecargoEquivalencia1,
|
||||
RecargoEquivalencia1,
|
||||
CodigoTransaccion1,
|
||||
BaseIva2,
|
||||
PorBaseCorrectora2,
|
||||
PorIva2,
|
||||
CuotaIva2,
|
||||
PorRecargoEquivalencia2,
|
||||
RecargoEquivalencia2,
|
||||
CodigoTransaccion2,
|
||||
BaseIva3,
|
||||
PorBaseCorrectora3,
|
||||
PorIva3,
|
||||
CuotaIva3,
|
||||
PorRecargoEquivalencia3,
|
||||
RecargoEquivalencia3,
|
||||
CodigoTransaccion3,
|
||||
BaseIva4,
|
||||
PorBaseCorrectora4,
|
||||
PorIva4,
|
||||
CuotaIva4,
|
||||
PorRecargoEquivalencia4,
|
||||
RecargoEquivalencia4,
|
||||
CodigoTransaccion4,
|
||||
Año,
|
||||
Serie,
|
||||
Factura,
|
||||
SuFacturaNo,
|
||||
FechaFactura,
|
||||
ImporteFactura,
|
||||
TipoFactura,
|
||||
CodigoCuentaFactura,
|
||||
CifDni,
|
||||
Nombre,
|
||||
CodigoRetencion,
|
||||
BaseRetencion,
|
||||
PorRetencion,
|
||||
ImporteRetencion,
|
||||
SiglaNacion,
|
||||
EjercicioFactura,
|
||||
FechaOperacion,
|
||||
Exclusion347,
|
||||
MantenerAsiento,
|
||||
ClaveOperacionFactura_,
|
||||
TipoRectificativa,
|
||||
FechaFacturaOriginal,
|
||||
BaseImponibleOriginal,
|
||||
CuotaIvaOriginal,
|
||||
ClaseAbonoRectificativas,
|
||||
RecargoEquivalenciaOriginal,
|
||||
LibreA1,
|
||||
CodigoIva1,
|
||||
CodigoIva2,
|
||||
CodigoIva3,
|
||||
CodigoIva4,
|
||||
IvaDeducible1,
|
||||
IvaDeducible2,
|
||||
IvaDeducible3,
|
||||
IvaDeducible4,
|
||||
Intracomunitaria
|
||||
)
|
||||
SELECT 'EN' TipoEntrada,
|
||||
YEAR(x.FECHA) Ejercicio,
|
||||
company_getCode(vCompanyFk) AS CodigoEmpresa,
|
||||
x.ASIEN Asiento,
|
||||
IF(EURODEBE <> 0 OR (EURODEBE = 0 AND EUROHABER IS NULL), 'D', 'H') CargoAbono,
|
||||
x.SUBCTA CodigoCuenta,
|
||||
x.CONTRA Contrapartida,
|
||||
x.FECHA FechaAsiento,
|
||||
x.CONCEPTO Comentario,
|
||||
IF(x.EURODEBE, x.EURODEBE, x.EUROHABER) ImporteAsiento,
|
||||
MONTH(x.FECHA) NumeroPeriodo,
|
||||
IF(sub2.FECREGCON IS NULL, sub2.FECHA_EX, sub2.FECREGCON) FechaGrabacion,
|
||||
IF(x.CAMBIO, IFNULL(mci.CodigoDivisa, sub3.code), '') CodigoDivisa,
|
||||
x.CAMBIO ImporteCambio,
|
||||
IFNULL(x.DEBEME, x.HABERME) ImporteDivisa,
|
||||
IF(x.CAMBIO, TRUE, FALSE) FactorCambio,
|
||||
NULL IdProcesoIME,
|
||||
0 TipoCarteraIME,
|
||||
0 TipoAnaliticaIME,
|
||||
0 StatusTraspasadoIME,
|
||||
0 TipoImportacionIME,
|
||||
x.METAL Metalico347,
|
||||
mci.BaseIva1,
|
||||
mci.PorBaseCorrectora1,
|
||||
mci.PorIva1,
|
||||
mci.CuotaIva1,
|
||||
mci.PorRecargoEquivalencia1,
|
||||
mci.RecargoEquivalencia1,
|
||||
mci.CodigoTransaccion1,
|
||||
mci.BaseIva2,
|
||||
mci.PorBaseCorrectora2,
|
||||
mci.PorIva2,
|
||||
mci.CuotaIva2,
|
||||
mci.PorRecargoEquivalencia2,
|
||||
mci.RecargoEquivalencia2,
|
||||
mci.CodigoTransaccion2,
|
||||
mci.BaseIva3,
|
||||
mci.PorBaseCorrectora3,
|
||||
mci.PorIva3,
|
||||
mci.CuotaIva3,
|
||||
mci.PorRecargoEquivalencia3,
|
||||
mci.RecargoEquivalencia3,
|
||||
mci.CodigoTransaccion3,
|
||||
mci.BaseIva4,
|
||||
mci.PorBaseCorrectora4,
|
||||
mci.PorIva4,
|
||||
mci.CuotaIva4,
|
||||
mci.PorRecargoEquivalencia4,
|
||||
mci.RecargoEquivalencia4,
|
||||
mci.CodigoTransaccion4,
|
||||
mci.Año,
|
||||
mci.Serie,
|
||||
mci.Factura,
|
||||
mci.SuFacturaNo,
|
||||
mci.FechaFactura,
|
||||
mci.ImporteFactura,
|
||||
mci.TipoFactura,
|
||||
mci.CodigoCuentaFactura,
|
||||
mci.CifDni,
|
||||
mci.Nombre,
|
||||
mci.CodigoRetencion,
|
||||
mci.BaseRetencion,
|
||||
mci.PorRetencion,
|
||||
mci.ImporteRetencion,
|
||||
mci.SiglaNacion,
|
||||
mci.EjercicioFactura,
|
||||
mci.FechaOperacion,
|
||||
mci.Exclusion347,
|
||||
TRUE,
|
||||
mci.ClaveOperacionFactura,
|
||||
mci.TipoRectificativa,
|
||||
mci.FechaFacturaOriginal,
|
||||
mci.BaseImponibleOriginal,
|
||||
mci.CuotaIvaOriginal,
|
||||
mci.ClaseAbonoRectificativas,
|
||||
mci.RecargoEquivalenciaOriginal,
|
||||
mci.LibreA1,
|
||||
mci.CodigoIva1,
|
||||
mci.CodigoIva2,
|
||||
mci.CodigoIva3,
|
||||
mci.CodigoIva4,
|
||||
mci.IvaDeducible1,
|
||||
mci.IvaDeducible2,
|
||||
mci.IvaDeducible3,
|
||||
mci.IvaDeducible4,
|
||||
mci.Intracomunitaria
|
||||
FROM vn.XDiario x
|
||||
LEFT JOIN movContaIVA mci ON mci.id = x.id
|
||||
LEFT JOIN (SELECT *
|
||||
FROM (SELECT DISTINCT ASIEN, FECREGCON, FECHA_EX
|
||||
FROM vn.XDiario
|
||||
WHERE enlazadoSage = FALSE
|
||||
ORDER BY ASIEN, FECREGCON DESC, FECHA_EX DESC
|
||||
LIMIT 10000000000000000000
|
||||
) sub GROUP BY ASIEN
|
||||
)sub2 ON sub2.ASIEN = x.ASIEN
|
||||
LEFT JOIN ( SELECT DISTINCT(account),cu.code
|
||||
FROM vn.bank b
|
||||
JOIN vn.currency cu ON cu.id = b.currencyFk
|
||||
WHERE cu.code <> 'EUR' -- no se informa cuando la divisa en EUR
|
||||
)sub3 ON sub3.account = x.SUBCTA
|
||||
WHERE x.enlazadoSage = FALSE
|
||||
AND x.empresa_id = vCompanyFk
|
||||
AND x.FECHA BETWEEN vDatedFrom AND vDatedTo;
|
||||
|
||||
-- Metálicos
|
||||
UPDATE movConta m
|
||||
JOIN (SELECT Asiento,
|
||||
c.socialName name,
|
||||
c.fi,
|
||||
n.SiglaNacion,
|
||||
m.CodigoCuenta,
|
||||
m.Contrapartida
|
||||
FROM movConta m
|
||||
LEFT JOIN vn.client c ON c.id = IF(m.CargoAbono = 'H',
|
||||
CAST(SUBSTRING(m.CodigoCuenta, 3, LENGTH(m.CodigoCuenta)) AS UNSIGNED),
|
||||
CAST(SUBSTRING(m.Contrapartida, 3, LENGTH(m.Contrapartida)) AS UNSIGNED))
|
||||
LEFT JOIN Naciones n ON n.countryFk = c.countryFk
|
||||
WHERE m.Metalico347 = TRUE
|
||||
AND m.enlazadoSage = FALSE
|
||||
)sub ON m.Asiento = sub.Asiento
|
||||
SET m.Metalico347 = TRUE,
|
||||
m.TipoFactura = vInvoiceTypeInformativeCode,
|
||||
m.CifDni = sub.fi,
|
||||
m.Nombre = sub.name,
|
||||
m.SiglaNacion = sub.SiglaNacion
|
||||
WHERE m.enlazadoSage = FALSE;
|
||||
|
||||
UPDATE movConta m
|
||||
SET m.Metalico347 = FALSE,
|
||||
m.TipoFactura = ''
|
||||
WHERE m.CargoAbono = 'D'
|
||||
AND m.enlazadoSage = FALSE;
|
||||
|
||||
-- Elimina cuentas de cliente/proveedor que no se utilizarán en la importación
|
||||
DELETE cp
|
||||
FROM clientesProveedores cp
|
||||
LEFT JOIN movConta mc ON mc.codigoCuenta = cp.codigoCuenta
|
||||
AND mc.enlazadoSage = FALSE
|
||||
WHERE mc.codigoCuenta IS NULL;
|
||||
|
||||
-- Elimina cuentas contables que no se utilizarán en la importación
|
||||
DELETE pc
|
||||
FROM planCuentasPGC pc
|
||||
LEFT JOIN movConta mc ON mc.codigoCuenta = pc.codigoCuenta
|
||||
AND mc.enlazadoSage = FALSE
|
||||
WHERE mc.codigoCuenta IS NULL;
|
||||
|
||||
-- DUAS
|
||||
UPDATE movConta mci
|
||||
JOIN vn.XDiario x ON x.ASIEN = mci.Asiento
|
||||
JOIN TiposIva ti ON ti.CodigoIva = x.IVA
|
||||
JOIN vn.pgcMaster pm ON pm.code = mci.CodigoCuenta COLLATE utf8mb3_unicode_ci
|
||||
SET mci.BaseIva1 = x.BASEEURO,
|
||||
mci.PorIva1 = x.IVA,
|
||||
mci.CuotaIva1 = CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10, 2)),
|
||||
mci.CodigoTransaccion1 = vDuaTransactionFk,
|
||||
mci.CodigoIva1 = vTaxImportReducedFk,
|
||||
mci.IvaDeducible1 = TRUE,
|
||||
mci.FechaFacturaOriginal = x.FECHA_EX,
|
||||
mci.SuFacturaNo = x.FACTURAEX,
|
||||
mci.FechaOperacion = x.FECHA_OP,
|
||||
mci.ImporteFactura = mci.ImporteFactura + x.BASEEURO + CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10, 2))
|
||||
WHERE pm.description = 'HP Iva pendiente'
|
||||
AND mci.enlazadoSage = FALSE
|
||||
AND x.SERIE = vSerialDua COLLATE utf8mb3_unicode_ci
|
||||
AND ti.Iva = 'I.V.A. 10% Nacional';
|
||||
|
||||
UPDATE movConta mci
|
||||
JOIN vn.XDiario x ON x.ASIEN = mci.Asiento
|
||||
JOIN TiposIva ti ON ti.CodigoIva = x.IVA
|
||||
JOIN vn.pgcMaster pm ON pm.code = mci.CodigoCuenta COLLATE utf8mb3_unicode_ci
|
||||
SET mci.BaseIva2 = x.BASEEURO ,
|
||||
mci.PorIva2 = x.IVA,
|
||||
mci.CuotaIva2 = CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10,2)),
|
||||
mci.CodigoTransaccion2 = vDuaTransactionFk ,
|
||||
mci.CodigoIva2 = vTaxImportFk,
|
||||
mci.IvaDeducible2 = TRUE,
|
||||
mci.ImporteFactura = mci.ImporteFactura + x.BASEEURO + CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10, 2))
|
||||
WHERE pm.description = 'HP Iva pendiente'
|
||||
AND mci.enlazadoSage = FALSE
|
||||
AND x.SERIE = vSerialDua COLLATE utf8mb3_unicode_ci
|
||||
AND ti.Iva = 'I.V.A. 21%';
|
||||
|
||||
UPDATE movConta mci
|
||||
JOIN vn.XDiario x ON x.ASIEN = mci.Asiento
|
||||
JOIN TiposIva ti ON ti.CodigoIva = x.IVA
|
||||
JOIN vn.pgcMaster pm ON pm.code = mci.CodigoCuenta COLLATE utf8mb3_unicode_ci
|
||||
SET mci.BaseIva3 = x.BASEEURO ,
|
||||
mci.PorIva3 = x.IVA,
|
||||
mci.CuotaIva3 = CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10,2)),
|
||||
mci.CodigoTransaccion3 = vDuaTransactionFk ,
|
||||
mci.CodigoIva3 = vTaxImportSuperReducedFk,
|
||||
mci.IvaDeducible3 = TRUE,
|
||||
mci.ImporteFactura = mci.ImporteFactura + x.BASEEURO + CAST((x.IVA / 100) * x.BASEEURO AS DECIMAL(10, 2))
|
||||
WHERE pm.description = 'HP Iva pendiente'
|
||||
AND mci.enlazadoSage = FALSE
|
||||
AND x.SERIE = vSerialDua COLLATE utf8mb3_unicode_ci
|
||||
AND ti.Iva = 'I.V.A. 4%';
|
||||
|
||||
-- Rectificativas
|
||||
UPDATE movConta mci
|
||||
JOIN (SELECT x.ASIEN, x.FECHA_RT, x.SERIE_RT, x.FACTU_RT
|
||||
FROM movConta mci
|
||||
JOIN vn.XDiario x ON x.ASIEN = mci.Asiento
|
||||
WHERE mci.TipoRectificativa > 0
|
||||
AND mci.enlazadoSage = FALSE
|
||||
AND x.FACTU_RT IS NOT NULL
|
||||
GROUP BY x.ASIEN
|
||||
) sub ON sub.ASIEN = mci.Asiento
|
||||
SET mci.EjercicioFacturaOriginal = YEAR(sub.FECHA_RT),
|
||||
mci.SerieFacturaOriginal = sub.SERIE_RT,
|
||||
mci.NumeroFacturaOriginal = sub.FACTU_RT
|
||||
WHERE mci.TipoRectificativa > 0 AND
|
||||
mci.enlazadoSage = FALSE ;
|
||||
|
||||
-- Exportaciones Andorras y Canarias cambia TT (la cuenta es compartida)
|
||||
UPDATE movConta mci
|
||||
SET CodigoTransaccion1 = vTransactionExportTaxFreeFk,
|
||||
CodigoTransaccion2 = IF(CodigoTransaccion2 = 0, 0, vTransactionExportTaxFreeFk),
|
||||
CodigoTransaccion3 = IF(CodigoTransaccion3 = 0, 0, vTransactionExportTaxFreeFk),
|
||||
CodigoTransaccion4 = IF(CodigoTransaccion4 = 0, 0, vTransactionExportTaxFreeFk)
|
||||
WHERE enlazadoSage = FALSE
|
||||
AND (CodigoTransaccion1 = vTransactionExportFk
|
||||
OR CodigoTransaccion2 = vTransactionExportFk
|
||||
OR CodigoTransaccion3 = vTransactionExportFk
|
||||
OR CodigoTransaccion4 = vTransactionExportFk)
|
||||
AND SiglaNacion IN (vCountryCanariasCode COLLATE utf8mb3_unicode_ci, vCountryCeutaMelillaCode COLLATE utf8mb3_unicode_ci);
|
||||
|
||||
UPDATE movConta mc
|
||||
SET CodigoDivisa = 'USD',
|
||||
FactorCambio = TRUE,
|
||||
ImporteCambio = ABS( CAST( IF( ImporteDivisa <> 0 AND ImporteCambio = 0, ImporteAsiento / ImporteDivisa, ImporteCambio) AS DECIMAL( 10, 2)))
|
||||
WHERE enlazadoSage = FALSE
|
||||
AND (ImporteCambio <> 0 OR ImporteDivisa <> 0 OR FactorCambio);
|
||||
|
||||
UPDATE movConta mc
|
||||
SET importeDivisa= -importeDivisa
|
||||
WHERE enlazadoSage = FALSE
|
||||
AND importeDivisa > 0
|
||||
AND ImporteAsiento < 0;
|
||||
|
||||
-- Comprobación que los importes e ivas sean correctos, avisa vía CAU
|
||||
SELECT GROUP_CONCAT(Asiento ORDER BY Asiento ASC SEPARATOR ',') INTO vBookEntries
|
||||
FROM(SELECT sub.Asiento
|
||||
FROM (SELECT mc.Asiento, SUM(mc.ImporteAsiento) amount
|
||||
FROM movConta mc
|
||||
WHERE mc.enlazadoSage = FALSE
|
||||
GROUP BY mc.Asiento)sub
|
||||
JOIN (SELECT x.ASIEN, SUM(IFNULL(x.EURODEBE,0) + IFNULL(x.EUROHABER,0)) amount
|
||||
FROM vn.XDiario x
|
||||
WHERE x.enlazadoSage = FALSE
|
||||
GROUP BY ASIEN)sub2 ON sub2.ASIEN = sub.Asiento
|
||||
WHERE sub.amount <> sub2.amount
|
||||
UNION ALL
|
||||
SELECT sub.Asiento
|
||||
FROM (SELECT Asiento, SUM(BaseIva1 + BaseIva2 + BaseIva3 + BaseIva4) amountTaxableBase
|
||||
FROM movConta
|
||||
WHERE TipoFactura <> 'I'
|
||||
AND enlazadoSage = FALSE
|
||||
GROUP BY Asiento) sub
|
||||
JOIN (SELECT ASIEN, SUM(BASEEURO) amountTaxableBase
|
||||
FROM (SELECT ASIEN, SUM(BASEEURO) BASEEURO
|
||||
FROM vn.XDiario
|
||||
WHERE FACTURA
|
||||
AND auxiliar <> '*'
|
||||
AND enlazadoSage = FALSE
|
||||
GROUP BY FACTURA, ASIEN)sub3
|
||||
GROUP BY ASIEN) sub2 ON sub2.ASIEN = sub.Asiento
|
||||
WHERE sub.amountTaxableBase<>sub2.amountTaxableBase
|
||||
AND sub.amountTaxableBase/2 <> sub2.amountTaxableBase) sub;
|
||||
|
||||
IF vBookEntries IS NOT NULL THEN
|
||||
SELECT util.notification_send ("book-entries-imported-incorrectly", CONCAT('{"bookEntries":"', vBookEntries,'"}'), null);
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -0,0 +1,24 @@
|
|||
DROP FUNCTION IF EXISTS `util`.`notification_send`;
|
||||
|
||||
DELIMITER $$
|
||||
$$
|
||||
CREATE DEFINER=`root`@`localhost` FUNCTION `util`.`notification_send`(vNotificationName VARCHAR(255), vParams TEXT, vAuthorFk INT) RETURNS int(11)
|
||||
MODIFIES SQL DATA
|
||||
BEGIN
|
||||
/**
|
||||
* Sends a notification.
|
||||
*
|
||||
* @param vNotificationName The notification name
|
||||
* @param vParams The notification parameters formatted as JSON
|
||||
* @param vAuthorFk The notification author or %NULL if there is no author
|
||||
* @return The notification id
|
||||
*/
|
||||
|
||||
INSERT INTO notificationQueue
|
||||
SET notificationFk = vNotificationName,
|
||||
params = vParams,
|
||||
authorFk = vAuthorFk;
|
||||
|
||||
RETURN LAST_INSERT_ID();
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -0,0 +1,4 @@
|
|||
INSERT INTO `util`.`notification` (id, name, description) VALUES(3, 'book-entries-imported-incorrectly', 'accounting entries exported incorrectly');
|
||||
INSERT INTO `util`.`notificationAcl` (notificationFk, roleFk) VALUES(3, 5);
|
||||
INSERT IGNORE INTO `util`.`notificationSubscription` (notificationFk, userFk) VALUES(3, 19663);
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
CREATE TABLE `vn`.`stateI18n` (
|
||||
`stateFk` tinyint(3) unsigned NOT NULL,
|
||||
`lang` char(2) NOT NULL,
|
||||
`name` varchar(255) NOT NULL,
|
||||
PRIMARY KEY (`stateFk`, `lang`),
|
||||
CONSTRAINT `stateI18n_state_id` FOREIGN KEY (`stateFk`) REFERENCES `vn`.`state` (`id`)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
|
|
@ -0,0 +1,73 @@
|
|||
INSERT INTO
|
||||
`vn`.`stateI18n` (`stateFk`, `lang`, `name`)
|
||||
VALUES
|
||||
(1, 'en', 'Fix'),
|
||||
(1, 'es', 'Arreglar'),
|
||||
(2, 'en', 'Free'),
|
||||
(2, 'es', 'Libre'),
|
||||
(3, 'en', 'OK'),
|
||||
(3, 'es', 'OK'),
|
||||
(4, 'en', 'Printed'),
|
||||
(4, 'es', 'Impreso'),
|
||||
(5, 'en', 'Preparation'),
|
||||
(5, 'es', 'Preparación'),
|
||||
(6, 'en', 'In Review'),
|
||||
(6, 'es', 'En Revisión'),
|
||||
(7, 'en', 'Unfinished'),
|
||||
(7, 'es', 'Sin Acabar'),
|
||||
(8, 'en', 'Reviewed'),
|
||||
(8, 'es', 'Revisado'),
|
||||
(9, 'en', 'Fitting'),
|
||||
(9, 'es', 'Encajando'),
|
||||
(10, 'en', 'Fitted'),
|
||||
(10, 'es', 'Encajado'),
|
||||
(11, 'en', 'Billed'),
|
||||
(11, 'es', 'Facturado'),
|
||||
(12, 'en', 'Blocked'),
|
||||
(12, 'es', 'Bloqueado'),
|
||||
(13, 'en', 'In Delivery'),
|
||||
(13, 'es', 'En Reparto'),
|
||||
(14, 'en', 'Prepared'),
|
||||
(14, 'es', 'Preparado'),
|
||||
(15, 'en', 'Pending Collection'),
|
||||
(15, 'es', 'Pendiente de Recogida'),
|
||||
(16, 'en', 'Delivered'),
|
||||
(16, 'es', 'Entregado'),
|
||||
(20, 'en', 'Assigned'),
|
||||
(20, 'es', 'Asignado'),
|
||||
(21, 'en', 'Returned'),
|
||||
(21, 'es', 'Retornado'),
|
||||
(22, 'en', 'Pending to extend'),
|
||||
(22, 'es', 'Pendiente ampliar'),
|
||||
(23, 'en', 'URGENT'),
|
||||
(23, 'es', 'URGENTE'),
|
||||
(24, 'en', 'Chained'),
|
||||
(24, 'es', 'Encadenado'),
|
||||
(25, 'en', 'Shipping'),
|
||||
(25, 'es', 'Embarcando'),
|
||||
(26, 'en', 'Preparation'),
|
||||
(26, 'es', 'Preparación previa'),
|
||||
(27, 'en', 'Assisted preparation'),
|
||||
(27, 'es', 'Preparación asistida'),
|
||||
(28, 'en', 'Preparation OK'),
|
||||
(28, 'es', 'Previa OK'),
|
||||
(29, 'en', 'Preparation Printed'),
|
||||
(29, 'es', 'Previa Impreso'),
|
||||
(30, 'en', 'Shipped'),
|
||||
(30, 'es', 'Embarcado'),
|
||||
(31, 'en', 'Stowaway printed'),
|
||||
(31, 'es', 'Polizón Impreso'),
|
||||
(32, 'en', 'Stowaway OK'),
|
||||
(32, 'es', 'Polizón OK'),
|
||||
(33, 'en', 'Auto_Printed'),
|
||||
(33, 'es', 'Auto_Impreso'),
|
||||
(34, 'en', 'Pending payment'),
|
||||
(34, 'es', 'Pendiente de pago'),
|
||||
(35, 'en', 'Half-Embedded'),
|
||||
(35, 'es', 'Semi-Encajado'),
|
||||
(36, 'en', 'Preparation Reviewing'),
|
||||
(36, 'es', 'Previa Revisando'),
|
||||
(37, 'en', 'Preparation Reviewed'),
|
||||
(37, 'es', 'Previa Revisado'),
|
||||
(38, 'en', 'Preparation Chamber'),
|
||||
(38, 'es', 'Preparación Cámara');
|
|
@ -1335,9 +1335,9 @@ INSERT INTO `vn`.`itemTypeTag`(`id`, `itemTypeFk`, `tagFk`, `priority`)
|
|||
|
||||
CALL `vn`.`itemRefreshTags`(NULL);
|
||||
|
||||
INSERT INTO `vn`.`itemLog` (`id`, `originFk`, `userFk`, `action`, `description`)
|
||||
INSERT INTO `vn`.`itemLog` (`id`, `originFk`, `userFk`, `action`, `description`, `changedModel`, `oldInstance`, `newInstance`, `changedModelId`, `changedModelValue`)
|
||||
VALUES
|
||||
('1', '1', '1', 'insert', 'We made a change!');
|
||||
('1', '1', '1', 'insert', 'We made a change!', 'Item', '{}', '{}', 1, '1');
|
||||
|
||||
INSERT INTO `vn`.`recovery`(`id`, `clientFk`, `started`, `finished`, `amount`, `period`)
|
||||
VALUES
|
||||
|
@ -2692,7 +2692,7 @@ INSERT INTO `util`.`notificationConfig`
|
|||
INSERT INTO `util`.`notification` (`id`, `name`, `description`)
|
||||
VALUES
|
||||
(1, 'print-email', 'notification fixture one'),
|
||||
(3, 'supplier-pay-method-update', 'A supplier pay method has been updated');
|
||||
(4, 'supplier-pay-method-update', 'A supplier pay method has been updated');
|
||||
|
||||
INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`)
|
||||
VALUES
|
||||
|
@ -2707,7 +2707,8 @@ INSERT INTO `util`.`notificationQueue` (`id`, `notificationFk`, `params`, `autho
|
|||
INSERT INTO `util`.`notificationSubscription` (`notificationFk`, `userFk`)
|
||||
VALUES
|
||||
(1, 1109),
|
||||
(1, 1110);
|
||||
(1, 1110),
|
||||
(3, 1109);
|
||||
|
||||
INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`)
|
||||
VALUES
|
||||
|
@ -2753,6 +2754,7 @@ INSERT INTO `vn`.`ticketLog` (`id`, `originFk`, `userFk`, `action`, `changedMode
|
|||
VALUES
|
||||
(1, 1, 9, 'insert', 'Ticket', '{}', '{"clientFk":1, "nickname": "Bat cave"}', 1);
|
||||
|
||||
|
||||
INSERT INTO `salix`.`url` (`appName`, `environment`, `url`)
|
||||
VALUES
|
||||
('lilium', 'dev', 'http://localhost:8080/#/'),
|
||||
|
|
|
@ -16340,6 +16340,185 @@ CREATE TABLE `invoiceType` (
|
|||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Table structure for table `movConta`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `movConta`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `movConta` (
|
||||
`OrdenMovimientos` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`MovPosicion` varchar(64) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Ejercicio` smallint(6) NOT NULL,
|
||||
`CodigoEmpresa` smallint(6) NOT NULL,
|
||||
`Asiento` int(11) NOT NULL,
|
||||
`CargoAbono` varchar(1) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`CodigoCuenta` varchar(15) CHARACTER SET utf8mb3 NOT NULL,
|
||||
`Contrapartida` varchar(15) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`FechaAsiento` datetime NOT NULL,
|
||||
`TipoDocumento` varchar(6) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`DocumentoConta` varchar(9) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Comentario` varchar(40) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`ImporteAsiento` decimal(28,10) NOT NULL,
|
||||
`CodigoDiario` smallint(6) NOT NULL,
|
||||
`CodigoCanal` varchar(10) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`CodigoActividad` varchar(1) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`FechaVencimiento` datetime DEFAULT NULL,
|
||||
`NumeroPeriodo` smallint(6) NOT NULL,
|
||||
`CodigoUsuario` smallint(6) NOT NULL,
|
||||
`FechaGrabacion` datetime NOT NULL,
|
||||
`TipoEntrada` varchar(2) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`CodigoDepartamento` varchar(10) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`CodigoSeccion` varchar(10) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`CodigoDivisa` varchar(3) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`ImporteCambio` decimal(28,10) NOT NULL,
|
||||
`ImporteDivisa` decimal(28,10) NOT NULL,
|
||||
`FactorCambio` decimal(28,10) NOT NULL,
|
||||
`CodigoProyecto` varchar(10) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`LibreN1` int(11) NOT NULL,
|
||||
`LibreN2` int(11) NOT NULL,
|
||||
`LibreA1` varchar(15) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`LibreA2` varchar(15) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`IdDelegacion` varchar(10) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`MovCartera` varchar(64) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
||||
`IdProcesoIME` varchar(64) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`TipoCarteraIME` smallint(6) NOT NULL,
|
||||
`TipoAnaliticaIME` smallint(6) NOT NULL,
|
||||
`StatusTraspasadoIME` tinyint(4) NOT NULL,
|
||||
`TipoImportacionIME` tinyint(4) NOT NULL,
|
||||
`BaseIva1` decimal(28,10) NOT NULL,
|
||||
`PorBaseCorrectora1` decimal(28,10) NOT NULL,
|
||||
`PorIva1` decimal(28,10) NOT NULL,
|
||||
`CuotaIva1` decimal(28,10) NOT NULL,
|
||||
`PorRecargoEquivalencia1` decimal(28,10) NOT NULL,
|
||||
`RecargoEquivalencia1` decimal(28,10) NOT NULL,
|
||||
`CodigoTransaccion1` tinyint(4) NOT NULL,
|
||||
`BaseIva2` decimal(28,10) NOT NULL,
|
||||
`PorBaseCorrectora2` decimal(28,10) NOT NULL,
|
||||
`PorIva2` decimal(28,10) NOT NULL,
|
||||
`CuotaIva2` decimal(28,10) NOT NULL,
|
||||
`PorRecargoEquivalencia2` decimal(28,10) NOT NULL,
|
||||
`RecargoEquivalencia2` decimal(28,10) NOT NULL,
|
||||
`CodigoTransaccion2` tinyint(4) NOT NULL,
|
||||
`BaseIva3` decimal(28,10) NOT NULL,
|
||||
`PorBaseCorrectora3` decimal(28,10) NOT NULL,
|
||||
`PorIva3` decimal(28,10) NOT NULL,
|
||||
`CuotaIva3` decimal(28,10) NOT NULL,
|
||||
`PorRecargoEquivalencia3` decimal(28,10) NOT NULL,
|
||||
`RecargoEquivalencia3` decimal(28,10) NOT NULL,
|
||||
`CodigoTransaccion3` tinyint(4) NOT NULL,
|
||||
`baseIva4` decimal(28,10) NOT NULL,
|
||||
`PorBaseCorrectora4` decimal(28,10) NOT NULL,
|
||||
`PorIva4` decimal(28,10) NOT NULL,
|
||||
`CuotaIva4` decimal(28,10) NOT NULL,
|
||||
`PorRecargoEquivalencia4` decimal(28,10) NOT NULL,
|
||||
`RecargoEquivalencia4` decimal(28,10) NOT NULL,
|
||||
`CodigoTransaccion4` tinyint(4) NOT NULL,
|
||||
`Año` smallint(6) NOT NULL,
|
||||
`Serie` varchar(10) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Factura` int(11) NOT NULL,
|
||||
`SuFacturaNo` varchar(40) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`FechaFactura` datetime NOT NULL,
|
||||
`ImporteFactura` decimal(28,10) NOT NULL,
|
||||
`TipoFactura` varchar(1) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`CodigoCuentaFactura` varchar(15) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`CifDni` varchar(13) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Nombre` varchar(35) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`CodigoRetencion` smallint(6) NOT NULL,
|
||||
`BaseRetencion` decimal(28,10) NOT NULL,
|
||||
`PorRetencion` decimal(28,10) NOT NULL,
|
||||
`ImporteRetencion` decimal(28,10) NOT NULL,
|
||||
`AbonoIva` smallint(6) NOT NULL,
|
||||
`CodigoActividadF` varchar(1) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Intracomunitaria` smallint(6) NOT NULL,
|
||||
`CodigoTerritorio` smallint(6) NOT NULL,
|
||||
`SiglaNacion` varchar(2) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`RetencionInformativa` smallint(6) NOT NULL,
|
||||
`EjercicioFacturaOriginal` smallint(6) NOT NULL,
|
||||
`SerieFacturaOriginal` varchar(10) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`NumeroFacturaOriginal` int(11) NOT NULL,
|
||||
`EjercicioFactura` smallint(6) NOT NULL,
|
||||
`CobroPagoRetencion` varchar(1) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`FechaOperacion` datetime NOT NULL,
|
||||
`Exclusion347` smallint(6) NOT NULL,
|
||||
`MovIdentificadorIME` varchar(64) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Previsiones` varchar(1) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`MantenerAsiento` tinyint(4) NOT NULL,
|
||||
`OrdenMovIME` smallint(6) NOT NULL,
|
||||
`Metalico347` smallint(6) NOT NULL,
|
||||
`ClaveOperacionFactura_` varchar(1) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`SerieAgrupacion_` varchar(10) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`NumeroFacturaInicial_` int(11) NOT NULL,
|
||||
`NumeroFacturaFinal_` int(11) NOT NULL,
|
||||
`IdAsientoExterno` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`IdDiarioExterno` varchar(10) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`IdFacturaExterno` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`IdMovimiento` varchar(40) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`IdCuadre` smallint(6) NOT NULL,
|
||||
`FechaCuadre` datetime NOT NULL,
|
||||
`TipoCuadre` varchar(4) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`AgrupacionCuadre` int(11) NOT NULL,
|
||||
`StatusSaldo` smallint(6) NOT NULL,
|
||||
`StatusConciliacion` smallint(6) NOT NULL,
|
||||
`CodigoConciliacion` int(11) NOT NULL,
|
||||
`FechaConciliacion` datetime NOT NULL,
|
||||
`TipoConciliacion` smallint(6) NOT NULL,
|
||||
`IndicadorContaBanco` varchar(1) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Descripcion3` varchar(40) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Descripcion4` varchar(40) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Descripcion5` varchar(40) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Descripcion6` varchar(40) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Descripcion7` varchar(40) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Descripcion8` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Descripcion9` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Descripcion2` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Descripcion1` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`Punteo1` smallint(6) NOT NULL,
|
||||
`Punteo9` smallint(6) NOT NULL,
|
||||
`Punteo8` smallint(6) NOT NULL,
|
||||
`Punteo7` smallint(6) NOT NULL,
|
||||
`Punteo6` smallint(6) NOT NULL,
|
||||
`Punteo5` smallint(6) NOT NULL,
|
||||
`Punteo4` smallint(6) NOT NULL,
|
||||
`Punteo3` smallint(6) NOT NULL,
|
||||
`Punteo2` smallint(6) NOT NULL,
|
||||
`CodigoIva1` smallint(6) NOT NULL,
|
||||
`CodigoIva2` smallint(6) NOT NULL,
|
||||
`CodigoIva3` smallint(6) NOT NULL,
|
||||
`CodigoIva4` smallint(6) NOT NULL,
|
||||
`CriterioIva` tinyint(4) NOT NULL,
|
||||
`FechaMaxVencimiento` datetime NOT NULL,
|
||||
`TipoCriterioCaja` tinyint(4) NOT NULL,
|
||||
`MovFacturaOrigenIME` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`IdFacturaExternoFinal` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`IdFacturaExternoInicial` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`IdFacturaExternoOriginal` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`NumFacturasExternoAgrupacion` int(11) NOT NULL,
|
||||
`CodigoMedioCobro` varchar(1) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`MedioCobro` varchar(31) COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`IvaDeducible1` smallint(6) NOT NULL DEFAULT 1,
|
||||
`IvaDeducible2` smallint(6) NOT NULL DEFAULT 1,
|
||||
`IvaDeducible3` smallint(6) NOT NULL DEFAULT 1,
|
||||
`IvaDeducible4` smallint(6) NOT NULL DEFAULT 1,
|
||||
`TipoRectificativa` smallint(6) NOT NULL,
|
||||
`FechaFacturaOriginal` datetime NOT NULL,
|
||||
`BaseImponibleOriginal` decimal(28,10) NOT NULL,
|
||||
`CuotaIvaOriginal` decimal(28,10) NOT NULL,
|
||||
`ClaseAbonoRectificativas` smallint(6) NOT NULL,
|
||||
`RecargoEquivalenciaOriginal` decimal(28,10) NOT NULL,
|
||||
`ObjetoFactura` text COLLATE utf8mb3_unicode_ci NOT NULL,
|
||||
`enlazadoSage` tinyint(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`OrdenMovimientos`,`LibreN1`),
|
||||
KEY `ix_movconta2` (`IdProcesoIME`),
|
||||
KEY `CodigoCuenta` (`CodigoCuenta`),
|
||||
KEY `movConta_Asiento` (`Asiento`),
|
||||
KEY `ix_movconta` (`enlazadoSage`,`IdProcesoIME`),
|
||||
KEY `movConta_IdProcesoIME` (`IdProcesoIME`),
|
||||
KEY `movConta_Asiento2` (`Asiento`,`IdProcesoIME`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Table structure for table `movContaIVA`
|
||||
--
|
||||
|
|
|
@ -84,7 +84,6 @@ IGNORETABLES=(
|
|||
--ignore-table=vn.warehouseJoined
|
||||
--ignore-table=vn.workerTeam__
|
||||
--ignore-table=vn.XDiario__
|
||||
--ignore-table=sage.movConta
|
||||
--ignore-table=sage.movContaCopia
|
||||
)
|
||||
mysqldump \
|
||||
|
|
|
@ -311,10 +311,12 @@ export default {
|
|||
firstMandateText: 'vn-client-mandate vn-card vn-table vn-tbody > vn-tr'
|
||||
},
|
||||
clientLog: {
|
||||
lastModificationPreviousValue: 'vn-client-log vn-table vn-td.before',
|
||||
lastModificationCurrentValue: 'vn-client-log vn-table vn-td.after',
|
||||
penultimateModificationPreviousValue: 'vn-client-log vn-table vn-tr:nth-child(2) vn-td.before',
|
||||
penultimateModificationCurrentValue: 'vn-client-log vn-table vn-tr:nth-child(2) vn-td.after'
|
||||
lastModificationPreviousValue: 'vn-client-log vn-tr table tr td.before',
|
||||
lastModificationCurrentValue: 'vn-client-log vn-tr table tr td.after',
|
||||
namePreviousValue: 'vn-client-log vn-tr table tr:nth-child(1) td.before',
|
||||
nameCurrentValue: 'vn-client-log vn-tr table tr:nth-child(1) td.after',
|
||||
activePreviousValue: 'vn-client-log vn-tr:nth-child(2) table tr:nth-child(2) td.before',
|
||||
activeCurrentValue: 'vn-client-log vn-tr:nth-child(2) table tr:nth-child(2) td.after'
|
||||
|
||||
},
|
||||
clientBalance: {
|
||||
|
@ -518,7 +520,7 @@ export default {
|
|||
},
|
||||
itemLog: {
|
||||
anyLineCreated: 'vn-item-log > vn-log vn-tbody > vn-tr',
|
||||
fifthLineCreatedProperty: 'vn-item-log > vn-log vn-tbody > vn-tr:nth-child(5) > vn-td > vn-one:nth-child(3) > div span:nth-child(2)',
|
||||
fifthLineCreatedProperty: 'vn-item-log > vn-log vn-tbody > vn-tr:nth-child(5) table tr:nth-child(3) td.after',
|
||||
},
|
||||
ticketSummary: {
|
||||
header: 'vn-ticket-summary > vn-card > h5',
|
||||
|
@ -711,9 +713,10 @@ export default {
|
|||
ticketLog: {
|
||||
firstTD: 'vn-ticket-log vn-table vn-td:nth-child(1)',
|
||||
logButton: 'vn-left-menu a[ui-sref="ticket.card.log"]',
|
||||
firstLogEntry: 'vn-ticket-log vn-data-viewer vn-tbody vn-tr',
|
||||
changes: 'vn-ticket-log vn-data-viewer vn-tbody > vn-tr > vn-td:nth-child(7)',
|
||||
id: 'vn-ticket-log vn-tr:nth-child(1) vn-one:nth-child(1) span'
|
||||
user: 'vn-ticket-log vn-tbody vn-tr vn-td:nth-child(2)',
|
||||
action: 'vn-ticket-log vn-tbody vn-tr vn-td:nth-child(4)',
|
||||
changes: 'vn-ticket-log vn-data-viewer vn-tbody vn-tr table tr:nth-child(2) td.after',
|
||||
id: 'vn-ticket-log vn-tr:nth-child(1) table tr:nth-child(1) td.before'
|
||||
},
|
||||
ticketService: {
|
||||
addServiceButton: 'vn-ticket-service vn-icon-button[vn-tooltip="Add service"] > button',
|
||||
|
@ -1123,7 +1126,7 @@ export default {
|
|||
undoChanges: 'vn-travel-basic-data vn-button[label="Undo changes"]'
|
||||
},
|
||||
travelLog: {
|
||||
firstLogFirstTD: 'vn-travel-log vn-tbody > vn-tr > vn-td:nth-child(1) > div'
|
||||
firstLogFirstTD: 'vn-travel-log vn-tbody > vn-tr > vn-td:nth-child(5)'
|
||||
},
|
||||
travelThermograph: {
|
||||
add: 'vn-travel-thermograph-index vn-float-button[icon="add"]',
|
||||
|
|
|
@ -67,22 +67,22 @@ describe('Client Edit web access path', () => {
|
|||
});
|
||||
|
||||
it(`should confirm the last log shows the updated client name and no modifications on active checkbox`, async() => {
|
||||
let lastModificationPreviousValue = await page
|
||||
.waitToGetProperty(selectors.clientLog.lastModificationPreviousValue, 'innerText');
|
||||
let lastModificationCurrentValue = await page
|
||||
.waitToGetProperty(selectors.clientLog.lastModificationCurrentValue, 'innerText');
|
||||
let namePreviousValue = await page
|
||||
.waitToGetProperty(selectors.clientLog.namePreviousValue, 'innerText');
|
||||
let nameCurrentValue = await page
|
||||
.waitToGetProperty(selectors.clientLog.nameCurrentValue, 'innerText');
|
||||
|
||||
expect(lastModificationPreviousValue).toEqual('name MaxEisenhardt active false');
|
||||
expect(lastModificationCurrentValue).toEqual('name Legion active false');
|
||||
expect(namePreviousValue).toEqual('MaxEisenhardt');
|
||||
expect(nameCurrentValue).toEqual('Legion');
|
||||
});
|
||||
|
||||
it(`should confirm the penultimate log shows the updated active and no modifications on client name`, async() => {
|
||||
let penultimateModificationPreviousValue = await page
|
||||
.waitToGetProperty(selectors.clientLog.penultimateModificationPreviousValue, 'innerText');
|
||||
let penultimateModificationCurrentValue = await page
|
||||
.waitToGetProperty(selectors.clientLog.penultimateModificationCurrentValue, 'innerText');
|
||||
let activePreviousValue = await page
|
||||
.waitToGetProperty(selectors.clientLog.activePreviousValue, 'innerText');
|
||||
let activeCurrentValue = await page
|
||||
.waitToGetProperty(selectors.clientLog.activeCurrentValue, 'innerText');
|
||||
|
||||
expect(penultimateModificationPreviousValue).toEqual('name MaxEisenhardt active true');
|
||||
expect(penultimateModificationCurrentValue).toEqual('name MaxEisenhardt active false');
|
||||
expect(activePreviousValue).toEqual('✓');
|
||||
expect(activeCurrentValue).toEqual('✗');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -43,7 +43,7 @@ describe('Client log path', () => {
|
|||
let lastModificationCurrentValue = await page.
|
||||
waitToGetProperty(selectors.clientLog.lastModificationCurrentValue, 'innerText');
|
||||
|
||||
expect(lastModificationPreviousValue).toEqual('name DavidCharlesHaller');
|
||||
expect(lastModificationCurrentValue).toEqual('name this is a test');
|
||||
expect(lastModificationPreviousValue).toEqual('DavidCharlesHaller');
|
||||
expect(lastModificationCurrentValue).toEqual('this is a test');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -32,14 +32,17 @@ describe('Ticket expeditions and log path', () => {
|
|||
|
||||
it(`should confirm the expedition deleted is shown now in the ticket log`, async() => {
|
||||
await page.accessToSection('ticket.card.log');
|
||||
const firstLogEntry = await page
|
||||
.waitToGetProperty(selectors.ticketLog.firstLogEntry, 'innerText');
|
||||
const user = await page
|
||||
.waitToGetProperty(selectors.ticketLog.user, 'innerText');
|
||||
|
||||
const action = await page
|
||||
.waitToGetProperty(selectors.ticketLog.action, 'innerText');
|
||||
|
||||
const id = await page
|
||||
.waitToGetProperty(selectors.ticketLog.id, 'innerText');
|
||||
|
||||
expect(firstLogEntry).toContain('production');
|
||||
expect(firstLogEntry).toContain('Deletes');
|
||||
expect(user).toContain('production');
|
||||
expect(action).toContain('Deletes');
|
||||
expect(id).toEqual('2');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -55,6 +55,6 @@ describe('Ticket log path', () => {
|
|||
|
||||
const result = await page.waitToGetProperty(selectors.ticketLog.firstTD, 'innerText');
|
||||
|
||||
expect(result.length).toBeGreaterThan('20');
|
||||
expect(result.length).toBeGreaterThan('15');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -70,8 +70,8 @@ describe('Supplier basic data path', () => {
|
|||
});
|
||||
|
||||
it('should check the changes have been recorded', async() => {
|
||||
const result = await page.waitToGetProperty('#newInstance:nth-child(3)', 'innerText');
|
||||
const result = await page.waitToGetProperty('vn-tr table tr:nth-child(3) td.after', 'innerText');
|
||||
|
||||
expect(result).toEqual('note Some notes');
|
||||
expect(result).toEqual('Some notes');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -14,6 +14,7 @@ export default class CrudModel extends ModelProxy {
|
|||
this.$q = $q;
|
||||
this.primaryKey = 'id';
|
||||
this.autoLoad = false;
|
||||
this.page = 1;
|
||||
}
|
||||
|
||||
$onInit() {
|
||||
|
@ -125,13 +126,20 @@ export default class CrudModel extends ModelProxy {
|
|||
}
|
||||
}
|
||||
|
||||
loadMore() {
|
||||
loadMore(append) {
|
||||
if (!this.moreRows)
|
||||
return this.$q.resolve();
|
||||
|
||||
let filter = Object.assign({}, this.currentFilter);
|
||||
const filter = Object.assign({}, this.currentFilter);
|
||||
if (append)
|
||||
filter.skip = this.orgData ? this.orgData.length : 0;
|
||||
return this.sendRequest(filter, true);
|
||||
|
||||
if (!append) {
|
||||
this.page += 1;
|
||||
filter.limit = this.page * this.limit;
|
||||
}
|
||||
|
||||
return this.sendRequest(filter, append);
|
||||
}
|
||||
|
||||
clear() {
|
||||
|
|
|
@ -148,7 +148,7 @@ describe('Component vnCrudModel', () => {
|
|||
|
||||
controller.moreRows = true;
|
||||
|
||||
controller.loadMore();
|
||||
controller.loadMore(true);
|
||||
|
||||
expect(controller.sendRequest).toHaveBeenCalledWith({'skip': 2}, true);
|
||||
});
|
||||
|
|
|
@ -212,12 +212,12 @@ export default class DropDown extends Popover {
|
|||
&& !this.model.isLoading;
|
||||
|
||||
if (shouldLoad)
|
||||
this.model.loadMore();
|
||||
this.model.loadMore(true);
|
||||
}
|
||||
|
||||
onLoadMoreClick(event) {
|
||||
if (event.defaultPrevented) return;
|
||||
this.model.loadMore();
|
||||
this.model.loadMore(true);
|
||||
}
|
||||
|
||||
onContainerClick(event) {
|
||||
|
|
|
@ -374,9 +374,10 @@ export class Paginable {
|
|||
/**
|
||||
* When limit is enabled, loads the next set of rows.
|
||||
*
|
||||
* @param {Boolean} append - Whether should append new data
|
||||
* @return {Promise} The request promise
|
||||
*/
|
||||
loadMore() {
|
||||
return Promise.resolve();
|
||||
loadMore(append) {
|
||||
return Promise.resolve(append);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ class Pagination extends Component {
|
|||
|
||||
if (shouldLoad) {
|
||||
this.nLoads++;
|
||||
this.model.loadMore();
|
||||
this.model.loadMore(false);
|
||||
this.$.$apply();
|
||||
}
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ class Pagination extends Component {
|
|||
if (this.maxLoads > 0 && this.nLoads == this.maxLoads)
|
||||
this.nLoads = 0;
|
||||
|
||||
this.model.loadMore();
|
||||
this.model.loadMore(false);
|
||||
}
|
||||
|
||||
$onDestroy() {
|
||||
|
|
|
@ -0,0 +1,299 @@
|
|||
{
|
||||
"name": "salix-front",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "salix-front",
|
||||
"version": "1.0.0",
|
||||
"license": "GPL-3.0",
|
||||
"dependencies": {
|
||||
"@uirouter/angularjs": "^1.0.20",
|
||||
"angular": "^1.7.5",
|
||||
"angular-animate": "^1.7.8",
|
||||
"angular-moment": "^1.3.0",
|
||||
"angular-translate": "^2.18.1",
|
||||
"angular-translate-loader-partial": "^2.18.1",
|
||||
"croppie": "^2.6.5",
|
||||
"js-yaml": "^3.13.1",
|
||||
"mg-crud": "^1.1.2",
|
||||
"oclazyload": "^0.6.3",
|
||||
"require-yaml": "0.0.1",
|
||||
"validator": "^6.3.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@uirouter/angularjs": {
|
||||
"version": "1.0.30",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.30.tgz",
|
||||
"integrity": "sha512-qkc3RFZc91S5K0gc/QVAXc9LGDPXjR04vDgG/11j8+yyZEuQojXxKxdLhKIepiPzqLmGRVqzBmBc27gtqaEeZg==",
|
||||
"dependencies": {
|
||||
"@uirouter/core": "6.0.8"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"angular": ">=1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@uirouter/core": {
|
||||
"version": "6.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/core/-/core-6.0.8.tgz",
|
||||
"integrity": "sha512-Gc/BAW47i4L54p8dqYCJJZuv2s3tqlXQ0fvl6Zp2xrblELPVfxmjnc0eurx3XwfQdaqm3T6uls6tQKkof/4QMw==",
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/angular": {
|
||||
"version": "1.8.3",
|
||||
"resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz",
|
||||
"integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==",
|
||||
"deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward."
|
||||
},
|
||||
"node_modules/angular-animate": {
|
||||
"version": "1.8.2",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/angular-moment": {
|
||||
"version": "1.3.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"moment": ">=2.8.0 <3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/angular-translate": {
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.19.0.tgz",
|
||||
"integrity": "sha512-Z/Fip5uUT2N85dPQ0sMEe1JdF5AehcDe4tg/9mWXNDVU531emHCg53ZND9Oe0dyNiGX5rWcJKmsL1Fujus1vGQ==",
|
||||
"dependencies": {
|
||||
"angular": "^1.8.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/angular-translate-loader-partial": {
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate-loader-partial/-/angular-translate-loader-partial-2.19.0.tgz",
|
||||
"integrity": "sha512-NnMw13LMV4bPQmJK7/pZOZAnPxe0M5OtUHchADs5Gye7V7feonuEnrZ8e1CKhBlv9a7IQyWoqcBa4Lnhg8gk5w==",
|
||||
"dependencies": {
|
||||
"angular-translate": "~2.19.0"
|
||||
}
|
||||
},
|
||||
"node_modules/argparse": {
|
||||
"version": "1.0.10",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"sprintf-js": "~1.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/croppie": {
|
||||
"version": "2.6.5",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/esprima": {
|
||||
"version": "4.0.1",
|
||||
"license": "BSD-2-Clause",
|
||||
"bin": {
|
||||
"esparse": "bin/esparse.js",
|
||||
"esvalidate": "bin/esvalidate.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/js-yaml": {
|
||||
"version": "3.14.1",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"argparse": "^1.0.7",
|
||||
"esprima": "^4.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"js-yaml": "bin/js-yaml.js"
|
||||
}
|
||||
},
|
||||
"node_modules/mg-crud": {
|
||||
"version": "1.1.2",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"angular": "^1.6.1"
|
||||
}
|
||||
},
|
||||
"node_modules/moment": {
|
||||
"version": "2.29.4",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
|
||||
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/oclazyload": {
|
||||
"version": "0.6.3",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/require-yaml": {
|
||||
"version": "0.0.1",
|
||||
"license": "BSD",
|
||||
"dependencies": {
|
||||
"js-yaml": ""
|
||||
}
|
||||
},
|
||||
"node_modules/require-yaml/node_modules/argparse": {
|
||||
"version": "2.0.1",
|
||||
"license": "Python-2.0"
|
||||
},
|
||||
"node_modules/require-yaml/node_modules/js-yaml": {
|
||||
"version": "4.1.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"argparse": "^2.0.1"
|
||||
},
|
||||
"bin": {
|
||||
"js-yaml": "bin/js-yaml.js"
|
||||
}
|
||||
},
|
||||
"node_modules/sprintf-js": {
|
||||
"version": "1.0.3",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/validator": {
|
||||
"version": "6.3.0",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.10"
|
||||
}
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@uirouter/angularjs": {
|
||||
"version": "1.0.30",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.30.tgz",
|
||||
"integrity": "sha512-qkc3RFZc91S5K0gc/QVAXc9LGDPXjR04vDgG/11j8+yyZEuQojXxKxdLhKIepiPzqLmGRVqzBmBc27gtqaEeZg==",
|
||||
"requires": {
|
||||
"@uirouter/core": "6.0.8"
|
||||
}
|
||||
},
|
||||
"@uirouter/core": {
|
||||
"version": "6.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/core/-/core-6.0.8.tgz",
|
||||
"integrity": "sha512-Gc/BAW47i4L54p8dqYCJJZuv2s3tqlXQ0fvl6Zp2xrblELPVfxmjnc0eurx3XwfQdaqm3T6uls6tQKkof/4QMw=="
|
||||
},
|
||||
"angular": {
|
||||
"version": "1.8.3",
|
||||
"resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz",
|
||||
"integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw=="
|
||||
},
|
||||
"angular-animate": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.8.2.tgz",
|
||||
"integrity": "sha512-Jbr9+grNMs9Kj57xuBU3Ju3NOPAjS1+g2UAwwDv7su1lt0/PLDy+9zEwDiu8C8xJceoTbmBNKiWGPJGBdCQLlA=="
|
||||
},
|
||||
"angular-moment": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-moment/-/angular-moment-1.3.0.tgz",
|
||||
"integrity": "sha512-KG8rvO9MoaBLwtGnxTeUveSyNtrL+RNgGl1zqWN36+HDCCVGk2DGWOzqKWB6o+eTTbO3Opn4hupWKIElc8XETA==",
|
||||
"requires": {
|
||||
"moment": ">=2.8.0 <3.0.0"
|
||||
}
|
||||
},
|
||||
"angular-translate": {
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.19.0.tgz",
|
||||
"integrity": "sha512-Z/Fip5uUT2N85dPQ0sMEe1JdF5AehcDe4tg/9mWXNDVU531emHCg53ZND9Oe0dyNiGX5rWcJKmsL1Fujus1vGQ==",
|
||||
"requires": {
|
||||
"angular": "^1.8.0"
|
||||
}
|
||||
},
|
||||
"angular-translate-loader-partial": {
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate-loader-partial/-/angular-translate-loader-partial-2.19.0.tgz",
|
||||
"integrity": "sha512-NnMw13LMV4bPQmJK7/pZOZAnPxe0M5OtUHchADs5Gye7V7feonuEnrZ8e1CKhBlv9a7IQyWoqcBa4Lnhg8gk5w==",
|
||||
"requires": {
|
||||
"angular-translate": "~2.19.0"
|
||||
}
|
||||
},
|
||||
"argparse": {
|
||||
"version": "1.0.10",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
|
||||
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
|
||||
"requires": {
|
||||
"sprintf-js": "~1.0.2"
|
||||
}
|
||||
},
|
||||
"croppie": {
|
||||
"version": "2.6.5",
|
||||
"resolved": "https://registry.npmjs.org/croppie/-/croppie-2.6.5.tgz",
|
||||
"integrity": "sha512-IlChnVUGG5T3w2gRZIaQgBtlvyuYnlUWs2YZIXXR3H9KrlO1PtBT3j+ykxvy9eZIWhk+V5SpBmhCQz5UXKrEKQ=="
|
||||
},
|
||||
"esprima": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
|
||||
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
|
||||
},
|
||||
"js-yaml": {
|
||||
"version": "3.14.1",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
|
||||
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
|
||||
"requires": {
|
||||
"argparse": "^1.0.7",
|
||||
"esprima": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"mg-crud": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/mg-crud/-/mg-crud-1.1.2.tgz",
|
||||
"integrity": "sha512-mAR6t0aQHKnT0QHKHpLOi0kNPZfO36iMpIoiLjFHxuio6mIJyuveBJ4VNlNXJRxLh32/FLADEb41/sYo7QUKFw==",
|
||||
"requires": {
|
||||
"angular": "^1.6.1"
|
||||
}
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.29.4",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
|
||||
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
|
||||
},
|
||||
"oclazyload": {
|
||||
"version": "0.6.3",
|
||||
"resolved": "https://registry.npmjs.org/oclazyload/-/oclazyload-0.6.3.tgz",
|
||||
"integrity": "sha512-HpOSYUgjtt6sTB/C6+FWsExR+9HCnXKsUA96RWkDXfv11C8Cc9X2DlR0WIZwFIiG6FQU0pwB5dhoYyut8bFAOQ=="
|
||||
},
|
||||
"require-yaml": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/require-yaml/-/require-yaml-0.0.1.tgz",
|
||||
"integrity": "sha512-M6eVEgLPRbeOhgSCnOTtdrOOEQzbXRchg24Xa13c39dMuraFKdI9emUo97Rih0YEFzSICmSKg8w4RQp+rd9pOQ==",
|
||||
"requires": {
|
||||
"js-yaml": "^4.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"argparse": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
|
||||
},
|
||||
"js-yaml": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
|
||||
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
|
||||
"requires": {
|
||||
"argparse": "^2.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sprintf-js": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
|
||||
},
|
||||
"validator": {
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/validator/-/validator-6.3.0.tgz",
|
||||
"integrity": "sha512-BylxTwhqwjQI5MDJF7amCy/L0ejJO+74DvCsLV52Lq3+3bhVcVMKqNqOiNcQJm2G48u9EAcw4xFERAmFbwXM9Q=="
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,6 +3,8 @@
|
|||
url="{{$ctrl.url}}"
|
||||
filter="$ctrl.filter"
|
||||
link="{originFk: $ctrl.originId}"
|
||||
where="{changedModel: $ctrl.changedModel,
|
||||
changedModelId: $ctrl.changedModelId}"
|
||||
data="$ctrl.logs"
|
||||
limit="20"
|
||||
auto-load="true">
|
||||
|
@ -13,81 +15,53 @@
|
|||
<vn-thead>
|
||||
<vn-tr>
|
||||
<vn-th field="creationDate">Date</vn-th>
|
||||
<vn-th field="userFk" class="expendable" shrink>Author</vn-th>
|
||||
<vn-th field="changedModel" class="expendable">Model</vn-th>
|
||||
<vn-th field="action" class="expendable" shrink>Action</vn-th>
|
||||
<vn-th field="changedModelValue" class="expendable">Name</vn-th>
|
||||
<vn-th expand>Before</vn-th>
|
||||
<vn-th expand>After</vn-th>
|
||||
<vn-th field="userFk" shrink>User</vn-th>
|
||||
<vn-th field="changedModel" ng-if="$ctrl.showModelName" shrink>Model</vn-th>
|
||||
<vn-th field="action" shrink>Action</vn-th>
|
||||
<vn-th field="changedModelValue" ng-if="$ctrl.showModelName">Name</vn-th>
|
||||
<vn-th expand>Changes</vn-th>
|
||||
</vn-tr>
|
||||
</vn-thead>
|
||||
<vn-tbody>
|
||||
<vn-tr ng-repeat="log in $ctrl.logs">
|
||||
<vn-td shrink-datetime>
|
||||
{{::log.creationDate | date:'dd/MM/yyyy HH:mm'}}
|
||||
<div class="changes">
|
||||
<div>
|
||||
<span translate class="label">Changed by</span><span class="label">: </span>
|
||||
<span ng-class="{'link': log.user.worker.id, 'value': !log.user.worker.id}"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, log.user.worker.id)"
|
||||
translate>{{::log.user.name || 'System' | translate}}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
<span translate class="label">Model</span><span class="label">: </span>
|
||||
<span translate class="value">{{::log.changedModel | dashIfEmpty}}</span>
|
||||
</div>
|
||||
<div>
|
||||
<span translate class="label">Action</span><span class="label">: </span>
|
||||
<span translate class="value">{{::$ctrl.actionsText[log.action] | dashIfEmpty}}</span>
|
||||
</div>
|
||||
<div>
|
||||
<span translate class="label">Name</span><span class="label">: </span>
|
||||
<span translate class="value">{{::log.changedModelValue | dashIfEmpty}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</vn-td>
|
||||
<vn-td class="expendable">
|
||||
<vn-td>
|
||||
<span ng-class="{'link': log.user.worker.id, 'value': !log.user.worker.id}"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, log.user.worker.id)"
|
||||
translate>{{::log.user.name || 'System' | translate}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td class="expendable">
|
||||
<vn-td ng-if="$ctrl.showModelName">
|
||||
{{::log.changedModel}}
|
||||
</vn-td>
|
||||
<vn-td translate class="expendable">
|
||||
<vn-td shrink translate>
|
||||
{{::$ctrl.actionsText[log.action]}}
|
||||
</vn-td>
|
||||
<vn-td class="expendable" expand>
|
||||
<vn-td ng-if="$ctrl.showModelName">
|
||||
{{::log.changedModelValue}}
|
||||
</vn-td>
|
||||
<vn-td expand class="before">
|
||||
<vn-one ng-repeat="old in log.oldProperties">
|
||||
<div>
|
||||
<vn-label-value
|
||||
no-ellipsize
|
||||
label="{{::old.key}}"
|
||||
value="{{::old.value}}">
|
||||
</vn-label-value>
|
||||
<vn-td expand>
|
||||
<table class="attributes">
|
||||
<thead>
|
||||
<tr>
|
||||
<th translate class="field">Field</th>
|
||||
<th translate>Before</th>
|
||||
<th translate>After</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="prop in ::log.props">
|
||||
<td class="field">{{prop.name}}</td>
|
||||
<td class="before">{{prop.old}}</td>
|
||||
<td class="after">{{prop.new}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div ng-if="log.description != null">
|
||||
{{::log.description}}
|
||||
</div>
|
||||
</vn-one>
|
||||
</vn-td>
|
||||
<vn-td expand class="after">
|
||||
<vn-one ng-repeat="new in log.newProperties" ng-if="!log.description" id="newInstance">
|
||||
<div>
|
||||
<vn-label-value
|
||||
no-ellipsize
|
||||
label="{{::new.key}}"
|
||||
value="{{::new.value}}">
|
||||
</vn-label-value>
|
||||
</div>
|
||||
</vn-one>
|
||||
<vn-one ng-if="!log.newProperties" id="description">
|
||||
<div>
|
||||
<span no-ellipsize>{{::log.description}}</span>
|
||||
</div>
|
||||
</vn-one>
|
||||
</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
|
|
|
@ -2,15 +2,17 @@ import ngModule from '../../module';
|
|||
import Section from '../section';
|
||||
import './style.scss';
|
||||
|
||||
const validDate = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/;
|
||||
|
||||
export default class Controller extends Section {
|
||||
constructor($element, $) {
|
||||
super($element, $);
|
||||
this.actionsText = {
|
||||
'insert': 'Creates',
|
||||
'update': 'Updates',
|
||||
'delete': 'Deletes',
|
||||
'select': 'Views'
|
||||
}; ``;
|
||||
insert: 'Creates',
|
||||
update: 'Updates',
|
||||
delete: 'Deletes',
|
||||
select: 'Views'
|
||||
};
|
||||
this.filter = {
|
||||
include: [{
|
||||
relation: 'user',
|
||||
|
@ -33,32 +35,57 @@ export default class Controller extends Section {
|
|||
|
||||
set logs(value) {
|
||||
this._logs = value;
|
||||
if (!value) return;
|
||||
|
||||
if (!this.logs) return;
|
||||
const empty = {};
|
||||
const validations = window.validations;
|
||||
value.forEach(log => {
|
||||
const locale = validations[log.changedModel] && validations[log.changedModel].locale ? validations[log.changedModel].locale : {};
|
||||
for (const log of value) {
|
||||
const oldValues = log.oldInstance || empty;
|
||||
const newValues = log.newInstance || empty;
|
||||
const locale = validations[log.changedModel]?.locale || empty;
|
||||
|
||||
log.oldProperties = this.getInstance(log.oldInstance, locale);
|
||||
log.newProperties = this.getInstance(log.newInstance, locale);
|
||||
let props = Object.keys(oldValues).concat(Object.keys(newValues));
|
||||
props = [...new Set(props)];
|
||||
|
||||
log.props = [];
|
||||
for (const prop of props) {
|
||||
log.props.push({
|
||||
name: locale[prop] || prop,
|
||||
old: this.formatValue(oldValues[prop]),
|
||||
new: this.formatValue(newValues[prop])
|
||||
});
|
||||
}
|
||||
|
||||
getInstance(instance, locale) {
|
||||
const properties = [];
|
||||
let validDate = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/;
|
||||
|
||||
if (typeof instance == 'object' && instance != null) {
|
||||
Object.keys(instance).forEach(property => {
|
||||
if (validDate.test(instance[property]))
|
||||
instance[property] = new Date(instance[property]).toLocaleString('es-ES');
|
||||
|
||||
const key = locale[property] || property;
|
||||
properties.push({key, value: instance[property]});
|
||||
});
|
||||
return properties;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
get showModelName() {
|
||||
return !(this.changedModel && this.changedModelId);
|
||||
}
|
||||
|
||||
formatValue(value) {
|
||||
let type = typeof value;
|
||||
|
||||
if (type === 'string' && validDate.test(value)) {
|
||||
value = new Date(value);
|
||||
type = typeof value;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case 'boolean':
|
||||
return value ? '✓' : '✗';
|
||||
case 'object':
|
||||
if (value instanceof Date) {
|
||||
const hasZeroTime =
|
||||
value.getHours() === 0 &&
|
||||
value.getMinutes() === 0 &&
|
||||
value.getSeconds() === 0;
|
||||
const format = hasZeroTime ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss';
|
||||
return this.$filter('date')(value, format);
|
||||
}
|
||||
else
|
||||
return value;
|
||||
default:
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
showWorkerDescriptor(event, workerId) {
|
||||
|
@ -73,6 +100,8 @@ ngModule.vnComponent('vnLog', {
|
|||
bindings: {
|
||||
model: '<',
|
||||
originId: '<',
|
||||
changedModel: '<?',
|
||||
changedModelId: '<?',
|
||||
url: '@'
|
||||
}
|
||||
});
|
||||
|
|
|
@ -12,3 +12,4 @@ Deletes: Elimina
|
|||
Views: Visualiza
|
||||
System: Sistema
|
||||
note: nota
|
||||
Changes: Cambios
|
||||
|
|
|
@ -23,6 +23,28 @@ vn-log {
|
|||
display: block;
|
||||
}
|
||||
}
|
||||
.attributes {
|
||||
width: 100%;
|
||||
|
||||
tr {
|
||||
height: 10px;
|
||||
|
||||
& > td {
|
||||
padding: 2px;
|
||||
}
|
||||
& > td.field,
|
||||
& > th.field {
|
||||
width: 20%;
|
||||
color: gray;
|
||||
}
|
||||
& > td.before,
|
||||
& > th.before,
|
||||
& > td.after,
|
||||
& > th.after {
|
||||
width: 40%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.ellipsis {
|
||||
white-space: nowrap;
|
||||
|
|
|
@ -38,6 +38,7 @@ module.exports = Self => {
|
|||
date.setHours(0, 0, 0, 0);
|
||||
const stmt = new ParameterizedSQL(`
|
||||
SELECT
|
||||
v.id,
|
||||
u.name AS salesPerson,
|
||||
IFNULL(sc.workerSubstitute, c.salesPersonFk) AS salesPersonFk,
|
||||
c.id AS clientFk,
|
||||
|
|
|
@ -61,7 +61,7 @@
|
|||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="visit in model.data">
|
||||
<tr ng-repeat="visit in model.data track by visit.id">
|
||||
<td shrink-date>
|
||||
<span class="chip">
|
||||
{{::visit.dated | date:'dd/MM/yy'}}
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
<vn-th field="salesPersonFk" shrink>SalesPerson</vn-th>
|
||||
</vn-tr>
|
||||
</vn-thead>
|
||||
<a ng-repeat="order in model.data"
|
||||
<a ng-repeat="order in model.data track by order.id"
|
||||
class="clickable vn-tbody"
|
||||
ui-sref="order.card.summary({id: {{::order.id}}})" target="_blank">
|
||||
<vn-tr>
|
||||
|
|
|
@ -78,7 +78,7 @@
|
|||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="ticket in model.data"
|
||||
<tr ng-repeat="ticket in model.data track by ticket.id"
|
||||
vn-anchor="::{
|
||||
state: 'ticket.card.summary',
|
||||
params: {id: ticket.id},
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
const Stylesheet = require(`vn-print/core/stylesheet`);
|
||||
|
||||
const path = require('path');
|
||||
const vnPrintPath = path.resolve('print');
|
||||
|
||||
module.exports = new Stylesheet([
|
||||
`${vnPrintPath}/common/css/spacing.css`,
|
||||
`${vnPrintPath}/common/css/misc.css`,
|
||||
`${vnPrintPath}/common/css/layout.css`,
|
||||
`${vnPrintPath}/common/css/email.css`])
|
||||
.mergeStyles();
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<email-body v-bind="$props">
|
||||
<div class="grid-row">
|
||||
<div class="grid-block vn-pa-ml">
|
||||
<h1>{{ $t('title') }}</h1>
|
||||
<p v-html="$t('description', [bookEntries])"></p>
|
||||
</div>
|
||||
</div>
|
||||
</email-body>
|
|
@ -0,0 +1,15 @@
|
|||
const Component = require(`vn-print/core/component`);
|
||||
const emailBody = new Component('email-body');
|
||||
|
||||
module.exports = {
|
||||
name: 'book-entries-imported-incorrectly',
|
||||
components: {
|
||||
'email-body': emailBody.build(),
|
||||
},
|
||||
props: {
|
||||
bookEntries: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
}
|
||||
};
|
|
@ -0,0 +1,5 @@
|
|||
subject: Book entries imported incorrectly
|
||||
title: Book entries imported incorrectly
|
||||
description: There are book entries that differ between the info from XDiario and the one that has been imported into Sage.<br/><br/>
|
||||
Book entries nº {0} <br/><br/>
|
||||
If you consider that it is due to a computer error, forward this email to cau@verdnatura.es
|
|
@ -0,0 +1,5 @@
|
|||
subject: Asientos contables importados incorrectamente
|
||||
title: Asientos contables importados incorrectamente
|
||||
description: Existen asientos que difieren entre la info. de XDiario y la que se ha importado a Sage.<br/><br/>
|
||||
Asientos nº {0} <br/><br/>
|
||||
Si considera que es debido a un error informático, reenvíe este correo a cau@verdnatura.es
|
|
@ -17,7 +17,6 @@ html {
|
|||
}
|
||||
.mainTable {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border: 10px solid;
|
||||
border-radius: 20px;
|
||||
-moz-border-radius: 20px;
|
||||
|
@ -54,8 +53,17 @@ html {
|
|||
}
|
||||
#QR {
|
||||
padding: 25px;
|
||||
padding-left: 40px;
|
||||
margin-left: 35px;
|
||||
float:left;
|
||||
}
|
||||
#barcode{
|
||||
text-align: center;
|
||||
}
|
||||
#right {
|
||||
float: right;
|
||||
margin-top: 20px;
|
||||
width: 250;
|
||||
max-width: 250px;
|
||||
}
|
||||
#additionalInfo {
|
||||
padding-top: 20px;
|
||||
|
|
|
@ -4,10 +4,11 @@
|
|||
<table class="mainTable">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2" id="truck" class="ellipsize">{{labelData.truck || '---'}}</td>
|
||||
<td id="truck" class="ellipsize">{{labelData.truck || '---'}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<td>
|
||||
<div v-html="getBarcode(labelData.palletFk)" id="barcode"></div>
|
||||
<table v-for="labelData in labelsData" class="zoneTable">
|
||||
<thead>
|
||||
<tr v-if="!labelData.isMatch" id="black">
|
||||
|
@ -25,11 +26,13 @@
|
|||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img :src="QR" id="QR"/></td>
|
||||
<td class="ellipsize">
|
||||
<div id="additionalInfo"><b>Pallet: </b>{{id}}</div>
|
||||
<div id="additionalInfo"><b>User: </b> {{username.name || '---'}}</div>
|
||||
<div id="additionalInfo"><b>Day: </b>{{labelData.dayName.toUpperCase() || '---'}}</div>
|
||||
<td>
|
||||
<img :src="QR" id="QR"/>
|
||||
<div id="right">
|
||||
<div id="additionalInfo" class="ellipsize"><b>Pallet: </b>{{id}}</div>
|
||||
<div id="additionalInfo" class="ellipsize"><b>User: </b> {{username.name || '---'}}</div>
|
||||
<div id="additionalInfo" class="ellipsize"><b>Day: </b>{{labelData.dayName.toUpperCase() || '---'}}</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
const Component = require(`vn-print/core/component`);
|
||||
const reportBody = new Component('report-body');
|
||||
const jsBarcode = require('jsbarcode');
|
||||
const {DOMImplementation, XMLSerializer} = require('xmldom');
|
||||
const UserError = require('vn-loopback/util/user-error');
|
||||
const qrcode = require('qrcode');
|
||||
|
||||
|
@ -39,6 +41,20 @@ module.exports = {
|
|||
const data = String(id);
|
||||
return qrcode.toDataURL(data, {margin: 0});
|
||||
},
|
||||
getBarcode(id) {
|
||||
const xmlSerializer = new XMLSerializer();
|
||||
const document = new DOMImplementation().createDocument('http://www.w3.org/1999/xhtml', 'html', null);
|
||||
const svgNode = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
||||
|
||||
jsBarcode(svgNode, id, {
|
||||
xmlDocument: document,
|
||||
format: 'code128',
|
||||
displayValue: false,
|
||||
width: 6,
|
||||
height: 90,
|
||||
});
|
||||
return xmlSerializer.serializeToString(svgNode);
|
||||
},
|
||||
},
|
||||
components: {
|
||||
'report-body': reportBody.build()
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
"width": "10cm",
|
||||
"height": "15cm",
|
||||
"margin": {
|
||||
"top": "0.5cm",
|
||||
"right": "0.2cm",
|
||||
"top": "0.3cm",
|
||||
"right": "0.07cm",
|
||||
"bottom": "0cm",
|
||||
"left": "0cm"
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue