Merge branch 'dev' into 6184-saveCmr
gitea/salix/pipeline/pr-dev There was a failure building this commit Details

This commit is contained in:
Alex Moreno 2024-02-07 06:17:35 +00:00
commit 87864593b2
14 changed files with 127 additions and 63 deletions

View File

@ -1,4 +1,6 @@
node_modules node_modules
print/node_modules print/node_modules
front/node_modules front
services db
e2e
storage

33
Jenkinsfile vendored
View File

@ -20,15 +20,16 @@ node {
RUN_BUILD = PROTECTED_BRANCH && FROM_GIT RUN_BUILD = PROTECTED_BRANCH && FROM_GIT
// https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables // https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables
echo "Node: ${env.NODE_NAME}" echo "NODE_NAME: ${env.NODE_NAME}"
echo "Workspace: ${env.WORKSPACE}" echo "WORKSPACE: ${env.WORKSPACE}"
configFileProvider([ configFileProvider([
configFile(fileId: 'salix.properties', configFile(fileId: 'salix.properties',
variable: 'PROPS_FILE') variable: 'PROPS_FILE')
]) { ]) {
def props = readProperties file: PROPS_FILE def props = readProperties file: PROPS_FILE
props.each { key, value -> env[key] = value } props.each {key, value -> env."${key}" = value }
props.each {key, value -> echo "${key}: ${value}" }
} }
if (PROTECTED_BRANCH) { if (PROTECTED_BRANCH) {
@ -37,7 +38,8 @@ node {
variable: 'BRANCH_PROPS_FILE') variable: 'BRANCH_PROPS_FILE')
]) { ]) {
def props = readProperties file: BRANCH_PROPS_FILE def props = readProperties file: BRANCH_PROPS_FILE
props.each { key, value -> env[key] = value } props.each {key, value -> env."${key}" = value }
props.each {key, value -> echo "${key}: ${value}" }
} }
} }
} }
@ -84,9 +86,6 @@ pipeline {
} }
} }
stage('Stack') { stage('Stack') {
environment {
TZ = 'Europe/Madrid'
}
parallel { parallel {
stage('Back') { stage('Back') {
stages { stages {
@ -102,14 +101,10 @@ pipeline {
} }
post { post {
always { always {
script { junit(
try { testResults: 'junitresults.xml',
junit 'junitresults.xml' allowEmptyResults: true
junit 'junit.xml' )
} catch (e) {
echo e.toString()
}
}
} }
} }
} }
@ -142,6 +137,14 @@ pipeline {
steps { steps {
sh 'jest --ci --reporters=default --reporters=jest-junit --maxWorkers=10' sh 'jest --ci --reporters=default --reporters=jest-junit --maxWorkers=10'
} }
post {
always {
junit(
testResults: 'junit.xml',
allowEmptyResults: true
)
}
}
} }
stage('Build') { stage('Build') {
when { when {

View File

@ -8,6 +8,26 @@ module.exports = Self => {
}); });
Self.validatesUniquenessOf('bic', { Self.validatesUniquenessOf('bic', {
message: 'This BIC already exist.' message: 'This BIC already exist'
}); });
Self.validatesPresenceOf('countryFk', {
message: 'CountryFK cannot be empty'
});
Self.validateAsync('bic', checkBic, {
message: 'Bank entity id must be specified'
});
async function checkBic(err, done) {
const filter = {
fields: ['code'],
where: {id: this.countryFk}
};
const country = await Self.app.models.Country.findOne(filter);
const code = country ? country.code.toLowerCase() : null;
if (code == 'es' && !this.id)
err();
done();
}
}; };

View File

@ -1,19 +1,36 @@
/* eslint-disable no-console */ /* eslint-disable no-console */
const path = require('path'); const path = require('path');
const getopts = require('getopts');
const Myt = require('@verdnatura/myt/myt'); const Myt = require('@verdnatura/myt/myt');
const Run = require('@verdnatura/myt/myt-run'); const Run = require('@verdnatura/myt/myt-run');
const helper = require('./tests-helper'); const helper = require('./tests-helper');
const opts = getopts(process.argv.slice(2), {
string: [
'network'
],
boolean: [
'ci',
'junit'
]
});
let server; let server;
const isCI = process.argv[2] === 'ci';
const PARALLEL = false; const PARALLEL = false;
const TIMEOUT = 900000; const TIMEOUT = 900000;
process.on('SIGINT', teardown);
process.on('exit', teardown); process.on('exit', teardown);
process.on('uncaughtException', onError); process.on('uncaughtException', onError);
process.on('unhandledRejection', onError); process.on('unhandledRejection', onError);
const exitSignals = [
'SIGINT',
'SIGUSR1',
'SIGUSR2'
];
for (const signal of exitSignals)
process.on(signal, () => process.exit());
async function setup() { async function setup() {
console.log('Building and running DB container.'); console.log('Building and running DB container.');
@ -21,9 +38,9 @@ async function setup() {
await myt.init({ await myt.init({
workspace: path.join(__dirname, '..'), workspace: path.join(__dirname, '..'),
random: true, random: true,
ci: isCI, ci: opts.ci,
tmpfs: process.platform == 'linux', tmpfs: process.platform == 'linux',
network: isCI ? 'jenkins' : null network: opts.network || null
}); });
server = await myt.run(Run); server = await myt.run(Run);
await myt.deinit(); await myt.deinit();
@ -38,18 +55,19 @@ async function setup() {
async function teardown() { async function teardown() {
if (!server) return; if (!server) return;
const oldServer = server;
server = null;
if (!PARALLEL) if (!PARALLEL)
await helper.deinit(); await helper.deinit();
console.log('Stopping and removing DB container.'); console.log('Stopping and removing DB container.');
await server.rm(); await oldServer.rm();
server = null;
} }
async function onError(err) { async function onError(err) {
await teardown();
console.error(err); console.error(err);
process.exit(1);
} }
async function test() { async function test() {
@ -79,8 +97,8 @@ async function test() {
const SpecReporter = require('jasmine-spec-reporter').SpecReporter; const SpecReporter = require('jasmine-spec-reporter').SpecReporter;
runner.addReporter(new SpecReporter({ runner.addReporter(new SpecReporter({
spec: { spec: {
displaySuccessful: isCI, displaySuccessful: opts.ci,
displayPending: isCI displayPending: opts.ci
}, },
summary: { summary: {
displayPending: false, displayPending: false,
@ -88,11 +106,12 @@ async function test() {
})); }));
} }
if (isCI) { if (opts.junit) {
const JunitReporter = require('jasmine-reporters'); const JunitReporter = require('jasmine-reporters');
runner.addReporter(new JunitReporter.JUnitXmlReporter()); runner.addReporter(new JunitReporter.JUnitXmlReporter());
runner.jasmine.DEFAULT_TIMEOUT_INTERVAL = TIMEOUT;
} }
if (opts.ci)
runner.jasmine.DEFAULT_TIMEOUT_INTERVAL = TIMEOUT;
// runner.loadConfigFile('back/jasmine.json'); // runner.loadConfigFile('back/jasmine.json');
runner.loadConfig(config); runner.loadConfig(config);

View File

@ -0,0 +1,32 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`intrastat_estimateNet`(
vSelf INT,
vStems INT
)
RETURNS double
DETERMINISTIC
BEGIN
/**
* Calcula un valor neto estimado en función de
* datos históricos de facturas intrastat.
*
* @param vSelf Id de intrastat
* @param vStems Número de unidades
* @return vNet
*/
DECLARE vNet DOUBLE;
SELECT ROUND(vStems / (SUM(average) / COUNT(average)), 2) INTO vNet
FROM (
SELECT *, stems / net average
FROM invoiceInIntrastat
WHERE intrastatFk = vSelf
AND net
AND stems > 0
ORDER BY dated DESC
LIMIT 20
) sub;
RETURN vNet/2;
END$$
DELIMITER ;

View File

@ -1,20 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn2008`.`intrastat_neto`(intINSTRASTAT INTEGER,intUNIDADES INTEGER)
RETURNS double
DETERMINISTIC
BEGIN
DECLARE n DOUBLE;
SELECT ROUND(intUNIDADES / (SUM(MEDIA) / COUNT(media)), 2) INTO n FROM
(SELECT *, unidades / neto MEDIA
FROM intrastat_data
WHERE intrastat_id = intINSTRASTAT AND neto
AND unidades > 0
ORDER BY odbc_date DESC
LIMIT 20) t;
-- JGF 01/06 per a evitar Kg en negatiu
RETURN n/2;
END$$
DELIMITER ;

View File

@ -3,8 +3,9 @@ services:
front: front:
image: registry.verdnatura.es/salix-front:${VERSION:?} image: registry.verdnatura.es/salix-front:${VERSION:?}
build: build:
context: . context: front
dockerfile: front/Dockerfile environment:
- TZ
ports: ports:
- 80 - 80
deploy: deploy:
@ -18,11 +19,12 @@ services:
back: back:
image: registry.verdnatura.es/salix-back:${VERSION:?} image: registry.verdnatura.es/salix-back:${VERSION:?}
build: . build: .
ports:
- 3000
environment: environment:
- NODE_ENV - NODE_ENV
- DEBUG - DEBUG
- TZ
ports:
- 3000
configs: configs:
- source: datasources - source: datasources
target: /etc/salix/datasources.json target: /etc/salix/datasources.json

View File

@ -10,7 +10,7 @@ RUN apt-get update \
&& ln -sf /dev/stderr /var/log/nginx/error.log && ln -sf /dev/stderr /var/log/nginx/error.log
WORKDIR /etc/nginx WORKDIR /etc/nginx
COPY front/nginx.conf sites-available/salix COPY nginx.conf sites-available/salix
RUN rm sites-enabled/default && ln -s ../sites-available/salix sites-enabled/salix RUN rm sites-enabled/default && ln -s ../sites-available/salix sites-enabled/salix
COPY dist /salix/dist COPY dist /salix/dist

View File

@ -17,7 +17,7 @@ if (argv.NODE_ENV)
let langs = ['es', 'en']; let langs = ['es', 'en'];
let srcDir = './front'; let srcDir = './front';
let modulesDir = './modules'; let modulesDir = './modules';
let buildDir = 'dist'; let buildDir = 'front/dist';
let backSources = [ let backSources = [
'!node_modules', '!node_modules',

View File

@ -198,6 +198,7 @@
"Booking completed": "Booking complete", "Booking completed": "Booking complete",
"The ticket is in preparation": "The ticket [{{ticketId}}]({{{ticketUrl}}}) of the sales person {{salesPersonId}} is in preparation", "The ticket is in preparation": "The ticket [{{ticketId}}]({{{ticketUrl}}}) of the sales person {{salesPersonId}} is in preparation",
"You can only add negative amounts in refund tickets": "You can only add negative amounts in refund tickets", "You can only add negative amounts in refund tickets": "You can only add negative amounts in refund tickets",
"Bank entity must be specified": "Bank entity must be specified",
"Try again": "Try again", "Try again": "Try again",
"keepPrice": "keepPrice", "keepPrice": "keepPrice",
"Cannot past travels with entries": "Cannot past travels with entries", "Cannot past travels with entries": "Cannot past travels with entries",

View File

@ -339,5 +339,6 @@
"No tickets to invoice": "No hay tickets para facturar", "No tickets to invoice": "No hay tickets para facturar",
"This ticket already has a cmr saved": "Este ticket ya tiene un cmr guardado", "This ticket already has a cmr saved": "Este ticket ya tiene un cmr guardado",
"Name should be uppercase": "El nombre debe ir en mayúscula", "Name should be uppercase": "El nombre debe ir en mayúscula",
"Bank entity must be specified": "La entidad bancaria es obligatoria",
"An email is necessary": "Es necesario un email" "An email is necessary": "Es necesario un email"
} }

View File

@ -55,7 +55,7 @@
"@babel/plugin-syntax-dynamic-import": "^7.7.4", "@babel/plugin-syntax-dynamic-import": "^7.7.4",
"@babel/preset-env": "^7.11.0", "@babel/preset-env": "^7.11.0",
"@babel/register": "^7.7.7", "@babel/register": "^7.7.7",
"@verdnatura/myt": "^1.6.3", "@verdnatura/myt": "^1.6.5",
"angular-mocks": "^1.7.9", "angular-mocks": "^1.7.9",
"babel-jest": "^26.0.1", "babel-jest": "^26.0.1",
"babel-loader": "^8.2.4", "babel-loader": "^8.2.4",
@ -67,6 +67,7 @@
"eslint-plugin-jasmine": "^2.10.1", "eslint-plugin-jasmine": "^2.10.1",
"fancy-log": "^1.3.2", "fancy-log": "^1.3.2",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
"getopts": "^2.3.0",
"gulp": "^4.0.2", "gulp": "^4.0.2",
"gulp-concat": "^2.6.1", "gulp-concat": "^2.6.1",
"gulp-env": "^0.4.0", "gulp-env": "^0.4.0",
@ -107,7 +108,7 @@
"scripts": { "scripts": {
"dbtest": "nodemon -q db/tests.js -w db/tests", "dbtest": "nodemon -q db/tests.js -w db/tests",
"test:back": "nodemon -q back/tests.js --config back/nodemonConfig.json", "test:back": "nodemon -q back/tests.js --config back/nodemonConfig.json",
"test:back:ci": "node back/tests.js ci", "test:back:ci": "node back/tests.js --ci --junit --network jenkins",
"test:e2e": "node e2e/helpers/tests.js", "test:e2e": "node e2e/helpers/tests.js",
"test:front": "jest --watch", "test:front": "jest --watch",
"back": "nodemon --inspect -w modules ./node_modules/gulp/bin/gulp.js back", "back": "nodemon --inspect -w modules ./node_modules/gulp/bin/gulp.js back",

View File

@ -128,8 +128,8 @@ devDependencies:
specifier: ^7.7.7 specifier: ^7.7.7
version: 7.23.7(@babel/core@7.23.9) version: 7.23.7(@babel/core@7.23.9)
'@verdnatura/myt': '@verdnatura/myt':
specifier: ^1.6.3 specifier: ^1.6.5
version: 1.6.3 version: 1.6.5
angular-mocks: angular-mocks:
specifier: ^1.7.9 specifier: ^1.7.9
version: 1.8.3 version: 1.8.3
@ -163,6 +163,9 @@ devDependencies:
file-loader: file-loader:
specifier: ^6.2.0 specifier: ^6.2.0
version: 6.2.0(webpack@5.90.1) version: 6.2.0(webpack@5.90.1)
getopts:
specifier: ^2.3.0
version: 2.3.0
gulp: gulp:
specifier: ^4.0.2 specifier: ^4.0.2
version: 4.0.2 version: 4.0.2
@ -2630,8 +2633,8 @@ packages:
dev: false dev: false
optional: true optional: true
/@verdnatura/myt@1.6.3: /@verdnatura/myt@1.6.5:
resolution: {integrity: sha512-VRoTB5sEPL8a7VaX9l2afpaPNT6pBa+If1tP9tpaJ4enFQbNITlApcC0GK6XYmWMkJQjl2lgdN4/u0UCiNb2MQ==} resolution: {integrity: sha512-0h7FvhSewd2W9EOymc59YymZJOBfCXmY5CWNFhol1yBfWSOOF9JAEE9DKRMbKaMqd/5Dy9LriS5PYOfeqm3HjA==}
hasBin: true hasBin: true
dependencies: dependencies:
'@sqltools/formatter': 1.2.5 '@sqltools/formatter': 1.2.5

View File

@ -11,7 +11,7 @@ let baseConfig = {
entry: {salix: 'salix'}, entry: {salix: 'salix'},
mode, mode,
output: { output: {
path: path.join(__dirname, 'dist'), path: path.join(__dirname, 'front/dist'),
publicPath: '/' publicPath: '/'
}, },
module: { module: {
@ -139,7 +139,7 @@ let devConfig = {
host: '0.0.0.0', host: '0.0.0.0',
port: 5000, port: 5000,
publicPath: '/', publicPath: '/',
contentBase: 'dist', contentBase: 'front/dist',
quiet: false, quiet: false,
noInfo: false, noInfo: false,
hot: true, hot: true,