Merge branch 'dev' into 5092-listado-ticketsSinFacturar
gitea/salix/pipeline/head There was a failure building this commit Details

This commit is contained in:
Alexandre Riera 2023-03-08 10:46:16 +00:00
commit b1d5a2ba1a
12 changed files with 6185 additions and 518 deletions

View File

@ -12,6 +12,9 @@ services:
placement: placement:
constraints: constraints:
- node.role == worker - node.role == worker
resources:
limits:
memory: 1G
back: back:
image: registry.verdnatura.es/salix-back:${BRANCH_NAME:?} image: registry.verdnatura.es/salix-back:${BRANCH_NAME:?}
build: . build: .
@ -38,6 +41,9 @@ services:
placement: placement:
constraints: constraints:
- node.role == worker - node.role == worker
resources:
limits:
memory: 4G
configs: configs:
datasources: datasources:
external: true external: true

117
front/package-lock.json generated
View File

@ -25,7 +25,8 @@
}, },
"node_modules/@uirouter/angularjs": { "node_modules/@uirouter/angularjs": {
"version": "1.0.30", "version": "1.0.30",
"license": "MIT", "resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.30.tgz",
"integrity": "sha512-qkc3RFZc91S5K0gc/QVAXc9LGDPXjR04vDgG/11j8+yyZEuQojXxKxdLhKIepiPzqLmGRVqzBmBc27gtqaEeZg==",
"dependencies": { "dependencies": {
"@uirouter/core": "6.0.8" "@uirouter/core": "6.0.8"
}, },
@ -38,22 +39,28 @@
}, },
"node_modules/@uirouter/core": { "node_modules/@uirouter/core": {
"version": "6.0.8", "version": "6.0.8",
"license": "MIT", "resolved": "https://registry.npmjs.org/@uirouter/core/-/core-6.0.8.tgz",
"integrity": "sha512-Gc/BAW47i4L54p8dqYCJJZuv2s3tqlXQ0fvl6Zp2xrblELPVfxmjnc0eurx3XwfQdaqm3T6uls6tQKkof/4QMw==",
"engines": { "engines": {
"node": ">=4.0.0" "node": ">=4.0.0"
} }
}, },
"node_modules/angular": { "node_modules/angular": {
"version": "1.8.3", "version": "1.8.3",
"license": "MIT" "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": { "node_modules/angular-animate": {
"version": "1.8.2", "version": "1.8.2",
"license": "MIT" "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.8.2.tgz",
"integrity": "sha512-Jbr9+grNMs9Kj57xuBU3Ju3NOPAjS1+g2UAwwDv7su1lt0/PLDy+9zEwDiu8C8xJceoTbmBNKiWGPJGBdCQLlA==",
"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-moment": { "node_modules/angular-moment": {
"version": "1.3.0", "version": "1.3.0",
"license": "MIT", "resolved": "https://registry.npmjs.org/angular-moment/-/angular-moment-1.3.0.tgz",
"integrity": "sha512-KG8rvO9MoaBLwtGnxTeUveSyNtrL+RNgGl1zqWN36+HDCCVGk2DGWOzqKWB6o+eTTbO3Opn4hupWKIElc8XETA==",
"dependencies": { "dependencies": {
"moment": ">=2.8.0 <3.0.0" "moment": ">=2.8.0 <3.0.0"
}, },
@ -63,7 +70,8 @@
}, },
"node_modules/angular-translate": { "node_modules/angular-translate": {
"version": "2.19.0", "version": "2.19.0",
"license": "MIT", "resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.19.0.tgz",
"integrity": "sha512-Z/Fip5uUT2N85dPQ0sMEe1JdF5AehcDe4tg/9mWXNDVU531emHCg53ZND9Oe0dyNiGX5rWcJKmsL1Fujus1vGQ==",
"dependencies": { "dependencies": {
"angular": "^1.8.0" "angular": "^1.8.0"
}, },
@ -73,25 +81,29 @@
}, },
"node_modules/angular-translate-loader-partial": { "node_modules/angular-translate-loader-partial": {
"version": "2.19.0", "version": "2.19.0",
"license": "MIT", "resolved": "https://registry.npmjs.org/angular-translate-loader-partial/-/angular-translate-loader-partial-2.19.0.tgz",
"integrity": "sha512-NnMw13LMV4bPQmJK7/pZOZAnPxe0M5OtUHchADs5Gye7V7feonuEnrZ8e1CKhBlv9a7IQyWoqcBa4Lnhg8gk5w==",
"dependencies": { "dependencies": {
"angular-translate": "~2.19.0" "angular-translate": "~2.19.0"
} }
}, },
"node_modules/argparse": { "node_modules/argparse": {
"version": "1.0.10", "version": "1.0.10",
"license": "MIT", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dependencies": { "dependencies": {
"sprintf-js": "~1.0.2" "sprintf-js": "~1.0.2"
} }
}, },
"node_modules/croppie": { "node_modules/croppie": {
"version": "2.6.5", "version": "2.6.5",
"license": "MIT" "resolved": "https://registry.npmjs.org/croppie/-/croppie-2.6.5.tgz",
"integrity": "sha512-IlChnVUGG5T3w2gRZIaQgBtlvyuYnlUWs2YZIXXR3H9KrlO1PtBT3j+ykxvy9eZIWhk+V5SpBmhCQz5UXKrEKQ=="
}, },
"node_modules/esprima": { "node_modules/esprima": {
"version": "4.0.1", "version": "4.0.1",
"license": "BSD-2-Clause", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"bin": { "bin": {
"esparse": "bin/esparse.js", "esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js" "esvalidate": "bin/esvalidate.js"
@ -102,7 +114,8 @@
}, },
"node_modules/js-yaml": { "node_modules/js-yaml": {
"version": "3.14.1", "version": "3.14.1",
"license": "MIT", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dependencies": { "dependencies": {
"argparse": "^1.0.7", "argparse": "^1.0.7",
"esprima": "^4.0.0" "esprima": "^4.0.0"
@ -113,36 +126,42 @@
}, },
"node_modules/mg-crud": { "node_modules/mg-crud": {
"version": "1.1.2", "version": "1.1.2",
"license": "MIT", "resolved": "https://registry.npmjs.org/mg-crud/-/mg-crud-1.1.2.tgz",
"integrity": "sha512-mAR6t0aQHKnT0QHKHpLOi0kNPZfO36iMpIoiLjFHxuio6mIJyuveBJ4VNlNXJRxLh32/FLADEb41/sYo7QUKFw==",
"dependencies": { "dependencies": {
"angular": "^1.6.1" "angular": "^1.6.1"
} }
}, },
"node_modules/moment": { "node_modules/moment": {
"version": "2.29.4", "version": "2.29.4",
"license": "MIT", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
"engines": { "engines": {
"node": "*" "node": "*"
} }
}, },
"node_modules/oclazyload": { "node_modules/oclazyload": {
"version": "0.6.3", "version": "0.6.3",
"license": "MIT" "resolved": "https://registry.npmjs.org/oclazyload/-/oclazyload-0.6.3.tgz",
"integrity": "sha512-HpOSYUgjtt6sTB/C6+FWsExR+9HCnXKsUA96RWkDXfv11C8Cc9X2DlR0WIZwFIiG6FQU0pwB5dhoYyut8bFAOQ=="
}, },
"node_modules/require-yaml": { "node_modules/require-yaml": {
"version": "0.0.1", "version": "0.0.1",
"license": "BSD", "resolved": "https://registry.npmjs.org/require-yaml/-/require-yaml-0.0.1.tgz",
"integrity": "sha512-M6eVEgLPRbeOhgSCnOTtdrOOEQzbXRchg24Xa13c39dMuraFKdI9emUo97Rih0YEFzSICmSKg8w4RQp+rd9pOQ==",
"dependencies": { "dependencies": {
"js-yaml": "" "js-yaml": ""
} }
}, },
"node_modules/require-yaml/node_modules/argparse": { "node_modules/require-yaml/node_modules/argparse": {
"version": "2.0.1", "version": "2.0.1",
"license": "Python-2.0" "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
}, },
"node_modules/require-yaml/node_modules/js-yaml": { "node_modules/require-yaml/node_modules/js-yaml": {
"version": "4.1.0", "version": "4.1.0",
"license": "MIT", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dependencies": { "dependencies": {
"argparse": "^2.0.1" "argparse": "^2.0.1"
}, },
@ -152,11 +171,13 @@
}, },
"node_modules/sprintf-js": { "node_modules/sprintf-js": {
"version": "1.0.3", "version": "1.0.3",
"license": "BSD-3-Clause" "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
}, },
"node_modules/validator": { "node_modules/validator": {
"version": "6.3.0", "version": "6.3.0",
"license": "MIT", "resolved": "https://registry.npmjs.org/validator/-/validator-6.3.0.tgz",
"integrity": "sha512-BylxTwhqwjQI5MDJF7amCy/L0ejJO+74DvCsLV52Lq3+3bhVcVMKqNqOiNcQJm2G48u9EAcw4xFERAmFbwXM9Q==",
"engines": { "engines": {
"node": ">= 0.10" "node": ">= 0.10"
} }
@ -165,51 +186,73 @@
"dependencies": { "dependencies": {
"@uirouter/angularjs": { "@uirouter/angularjs": {
"version": "1.0.30", "version": "1.0.30",
"resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.30.tgz",
"integrity": "sha512-qkc3RFZc91S5K0gc/QVAXc9LGDPXjR04vDgG/11j8+yyZEuQojXxKxdLhKIepiPzqLmGRVqzBmBc27gtqaEeZg==",
"requires": { "requires": {
"@uirouter/core": "6.0.8" "@uirouter/core": "6.0.8"
} }
}, },
"@uirouter/core": { "@uirouter/core": {
"version": "6.0.8" "version": "6.0.8",
"resolved": "https://registry.npmjs.org/@uirouter/core/-/core-6.0.8.tgz",
"integrity": "sha512-Gc/BAW47i4L54p8dqYCJJZuv2s3tqlXQ0fvl6Zp2xrblELPVfxmjnc0eurx3XwfQdaqm3T6uls6tQKkof/4QMw=="
}, },
"angular": { "angular": {
"version": "1.8.3" "version": "1.8.3",
"resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz",
"integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw=="
}, },
"angular-animate": { "angular-animate": {
"version": "1.8.2" "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": { "angular-moment": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/angular-moment/-/angular-moment-1.3.0.tgz",
"integrity": "sha512-KG8rvO9MoaBLwtGnxTeUveSyNtrL+RNgGl1zqWN36+HDCCVGk2DGWOzqKWB6o+eTTbO3Opn4hupWKIElc8XETA==",
"requires": { "requires": {
"moment": ">=2.8.0 <3.0.0" "moment": ">=2.8.0 <3.0.0"
} }
}, },
"angular-translate": { "angular-translate": {
"version": "2.19.0", "version": "2.19.0",
"resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.19.0.tgz",
"integrity": "sha512-Z/Fip5uUT2N85dPQ0sMEe1JdF5AehcDe4tg/9mWXNDVU531emHCg53ZND9Oe0dyNiGX5rWcJKmsL1Fujus1vGQ==",
"requires": { "requires": {
"angular": "^1.8.0" "angular": "^1.8.0"
} }
}, },
"angular-translate-loader-partial": { "angular-translate-loader-partial": {
"version": "2.19.0", "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": { "requires": {
"angular-translate": "~2.19.0" "angular-translate": "~2.19.0"
} }
}, },
"argparse": { "argparse": {
"version": "1.0.10", "version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"requires": { "requires": {
"sprintf-js": "~1.0.2" "sprintf-js": "~1.0.2"
} }
}, },
"croppie": { "croppie": {
"version": "2.6.5" "version": "2.6.5",
"resolved": "https://registry.npmjs.org/croppie/-/croppie-2.6.5.tgz",
"integrity": "sha512-IlChnVUGG5T3w2gRZIaQgBtlvyuYnlUWs2YZIXXR3H9KrlO1PtBT3j+ykxvy9eZIWhk+V5SpBmhCQz5UXKrEKQ=="
}, },
"esprima": { "esprima": {
"version": "4.0.1" "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": { "js-yaml": {
"version": "3.14.1", "version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"requires": { "requires": {
"argparse": "^1.0.7", "argparse": "^1.0.7",
"esprima": "^4.0.0" "esprima": "^4.0.0"
@ -217,27 +260,39 @@
}, },
"mg-crud": { "mg-crud": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/mg-crud/-/mg-crud-1.1.2.tgz",
"integrity": "sha512-mAR6t0aQHKnT0QHKHpLOi0kNPZfO36iMpIoiLjFHxuio6mIJyuveBJ4VNlNXJRxLh32/FLADEb41/sYo7QUKFw==",
"requires": { "requires": {
"angular": "^1.6.1" "angular": "^1.6.1"
} }
}, },
"moment": { "moment": {
"version": "2.29.4" "version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
}, },
"oclazyload": { "oclazyload": {
"version": "0.6.3" "version": "0.6.3",
"resolved": "https://registry.npmjs.org/oclazyload/-/oclazyload-0.6.3.tgz",
"integrity": "sha512-HpOSYUgjtt6sTB/C6+FWsExR+9HCnXKsUA96RWkDXfv11C8Cc9X2DlR0WIZwFIiG6FQU0pwB5dhoYyut8bFAOQ=="
}, },
"require-yaml": { "require-yaml": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/require-yaml/-/require-yaml-0.0.1.tgz",
"integrity": "sha512-M6eVEgLPRbeOhgSCnOTtdrOOEQzbXRchg24Xa13c39dMuraFKdI9emUo97Rih0YEFzSICmSKg8w4RQp+rd9pOQ==",
"requires": { "requires": {
"js-yaml": "" "js-yaml": ""
}, },
"dependencies": { "dependencies": {
"argparse": { "argparse": {
"version": "2.0.1" "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": { "js-yaml": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"requires": { "requires": {
"argparse": "^2.0.1" "argparse": "^2.0.1"
} }
@ -245,10 +300,14 @@
} }
}, },
"sprintf-js": { "sprintf-js": {
"version": "1.0.3" "version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
}, },
"validator": { "validator": {
"version": "6.3.0" "version": "6.3.0",
"resolved": "https://registry.npmjs.org/validator/-/validator-6.3.0.tgz",
"integrity": "sha512-BylxTwhqwjQI5MDJF7amCy/L0ejJO+74DvCsLV52Lq3+3bhVcVMKqNqOiNcQJm2G48u9EAcw4xFERAmFbwXM9Q=="
} }
} }
} }

View File

@ -32,45 +32,66 @@ module.exports = Self => {
Self.confirm = async(signatureVersion, merchantParameters, signature) => { Self.confirm = async(signatureVersion, merchantParameters, signature) => {
const $ = Self.app.models; const $ = Self.app.models;
let transaction;
const decodedParams = JSON.parse( try {
base64url.decode(merchantParameters, 'utf8')); const decodedParams = JSON.parse(
const params = {}; base64url.decode(merchantParameters, 'utf8'));
const params = {};
for (const param in decodedParams) for (const param in decodedParams)
params[param] = decodeURIComponent(decodedParams[param]); params[param] = decodeURIComponent(decodedParams[param]);
const orderId = params['Ds_Order']; const orderId = params['Ds_Order'];
const merchantId = parseInt(params['Ds_MerchantCode']); if (!orderId)
throw new UserError('Order id not provided');
if (!orderId) transaction = await Self.findById(orderId, {fields: ['id']});
throw new UserError('Order id not found'); if (!transaction)
if (!merchantId) throw new UserError('Order not found');
throw new UserError('Mechant id not found');
const merchant = await $.TpvMerchant.findById(merchantId, { await transaction.updateAttributes({
fields: ['id', 'secretKey'] merchantParameters,
}); signature,
signatureVersion,
});
const base64hmac = Self.createSignature( const merchantId = parseInt(params['Ds_MerchantCode']);
orderId, if (!merchantId)
merchant.secretKey, throw new UserError('Merchant id not provided');
merchantParameters
);
if (base64hmac !== base64url.toBase64(signature)) const merchant = await $.TpvMerchant.findById(merchantId, {
throw new UserError('Invalid signature'); fields: ['id', 'secretKey']
});
if (!merchant)
throw new UserError('Merchant not found');
await Self.rawSql( const base64hmac = Self.createSignature(
'CALL hedera.tpvTransaction_confirm(?, ?, ?, ?, ?, ?)', [
params['Ds_Amount'],
orderId, orderId,
merchantId, merchant.secretKey,
params['Ds_Currency'], merchantParameters
params['Ds_Response'], );
params['Ds_ErrorCode']
]);
return true; if (base64hmac !== base64url.toBase64(signature))
throw new UserError('Invalid signature');
await Self.rawSql(
'CALL hedera.tpvTransaction_confirm(?, ?, ?, ?, ?, ?)', [
params['Ds_Amount'],
orderId,
merchantId,
params['Ds_Currency'],
params['Ds_Response'],
params['Ds_ErrorCode']
]);
return true;
} catch (err) {
if (transaction)
await transaction.updateAttribute('responseError', err.message);
else
console.error(err);
throw err;
}
}; };
}; };

View File

@ -35,6 +35,18 @@
}, },
"created": { "created": {
"type": "date" "type": "date"
},
"merchantParameters": {
"type": "string"
},
"signature": {
"type": "string"
},
"signatureVersion": {
"type": "string"
},
"responseError": {
"type": "string"
} }
}, },
"relations": { "relations": {
@ -45,4 +57,3 @@
} }
} }
} }

View File

@ -3,7 +3,7 @@
description="$ctrl.invoiceOut.ref" description="$ctrl.invoiceOut.ref"
summary="$ctrl.$.summary"> summary="$ctrl.$.summary">
<slot-dot-menu> <slot-dot-menu>
<vn-invoice-out-descriptor-menu <vn-invoice-out-descriptor-menu
invoice-out="$ctrl.invoiceOut" invoice-out="$ctrl.invoiceOut"
parent-reload="$ctrl.reload()" parent-reload="$ctrl.reload()"
/> />
@ -11,23 +11,23 @@
<slot-body> <slot-body>
<div class="attributes"> <div class="attributes">
<vn-label-value <vn-label-value
label="Date" label="Date"
value="{{$ctrl.invoiceOut.issued | date: 'dd/MM/yyyy'}}"> value="{{$ctrl.invoiceOut.issued | date: 'dd/MM/yyyy'}}">
</vn-label-value> </vn-label-value>
<vn-label-value <vn-label-value
label="Import" label="Import"
value="{{$ctrl.invoiceOut.amount | currency: 'EUR': 2}}"> value="{{$ctrl.invoiceOut.amount | currency: 'EUR': 2}}">
</vn-label-value> </vn-label-value>
<vn-label-value <vn-label-value
label="Client"> label="Client">
<span <span
ng-click="clientDescriptor.show($event, $ctrl.invoiceOut.client.id)" ng-click="clientDescriptor.show($event, $ctrl.invoiceOut.client.id)"
class="link"> class="link">
{{$ctrl.invoiceOut.client.name}} {{$ctrl.invoiceOut.client.name}}
</span> </span>
</vn-label-value> </vn-label-value>
<vn-label-value <vn-label-value
label="Company" label="Company"
value="{{$ctrl.invoiceOut.company.code}}"> value="{{$ctrl.invoiceOut.company.code}}">
</vn-label-value> </vn-label-value>
</div> </div>
@ -53,4 +53,7 @@
</vn-descriptor-content> </vn-descriptor-content>
<vn-popup vn-id="summary"> <vn-popup vn-id="summary">
<vn-invoice-out-summary invoice-out="$ctrl.invoiceOut"></vn-invoice-out-summary> <vn-invoice-out-summary invoice-out="$ctrl.invoiceOut"></vn-invoice-out-summary>
</vn-popup> </vn-popup>
<vn-client-descriptor-popover
vn-id="clientDescriptor">
</vn-client-descriptor-popover>

View File

@ -59,17 +59,10 @@ module.exports = Self => {
} }
const writeStream = fs.createWriteStream(filePath); const writeStream = fs.createWriteStream(filePath);
writeStream.on('open', () => { writeStream.on('open', () => response.pipe(writeStream));
response.pipe(writeStream); writeStream.on('error', async error =>
}); await errorHandler(image.itemFk, error, filePath));
writeStream.on('finish', writeStream.end());
writeStream.on('error', async error => {
await errorHandler(image.itemFk, error, filePath);
});
writeStream.on('finish', async function() {
writeStream.end();
});
writeStream.on('close', async function() { writeStream.on('close', async function() {
try { try {

1715
package-lock.json generated

File diff suppressed because it is too large Load Diff

4682
print/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -7,37 +7,27 @@ description:
followGuide: Puedes utilizar como guía, el vídeo del montaje del ribon y la cinta followGuide: Puedes utilizar como guía, el vídeo del montaje del ribon y la cinta
<a href='https://www.youtube.com/watch?v=qhb0kgQF3o8' title='Youtube' target='_blank' <a href='https://www.youtube.com/watch?v=qhb0kgQF3o8' title='Youtube' target='_blank'
style='color:#8dba25'>https://www.youtube.com/watch?v=qhb0kgQF3o8</a>. También style='color:#8dba25'>https://www.youtube.com/watch?v=qhb0kgQF3o8</a>. También
necesitarás el QLabel, el programa para imprimir las cintas. necesitarás el GoLabel, el programa para imprimir las cintas.
downloadFrom: Puedes descargarlo desde este enlace <a href='https://cdn.verdnatura.es/public/QLabel_IV_V1.37_Install_en.exe' downloadFrom: Puedes descargarlo desde este enlace <a href='https://godex.s3-accelerate.amazonaws.com/_6f5glRrVhQAEBGhdUsqJA.file?v01'
title='Descargar QLabel' target='_blank' style='color:#8dba25'>https://cdn.verdnatura.es/public/QLabel_IV_V1.37_Install_en.exe</a> title='Descargar GoLabel' target='_blank' style='color:#8dba25'>https://godex.s3-accelerate.amazonaws.com/_6f5glRrVhQAEBGhdUsqJA.file?v01</a>
downloadDriver: En este enlace puedes descargar el driver de la impresora <a href='https://es.seagullscientific.com/support/downloads/drivers/godex/download/' downloadDriver: En este enlace puedes descargar el driver de la impresora <a href='https://es.seagullscientific.com/support/downloads/drivers/godex/download/'
title='Descargar driver' target='_blank' style='color:#8dba25'>https://es.seagullscientific.com/support/downloads/drivers/godex/download/</a> title='Descargar driver' target='_blank' style='color:#8dba25'>https://es.seagullscientific.com/support/downloads/drivers/godex/download/</a>
sections: sections:
QLabel: GoLabel:
title: Utilización de QLabel title: Utilización de GoLabel
description: Para utilizar el programa de impresión de cintas sigue estos pasos description: Para utilizar el programa de impresión de cintas sigue estos pasos
steps: steps:
- Abre el programa QLabel - Abre el programa GoLabel
- Haz clic en el icono de la barra superior con forma de 'carpeta' - Haz clic en el icono de la barra superior con forma de carpeta con una hoja.
- Selecciona el archivo llamado 'model.ezp' adjunto en este correo, y haz clic - Selecciona el archivo llamado 'model.ezp'(que seguramente este en 'Descargas') adjunto en este correo, haz clic en abrir.
en abrir - Una vez abierto el archivo, haz doble click sobre el texto, en el cuadro que nos sale pulse donde esta el texto de ejemplo (En este caso "TUS HERMANOS") y nos saldra en ese mismo recuadro a la parte izquierda para editarlo y escribir lo que quiera.
- Ve a 'File' -> 'Save as' y guárdalo en el escritorio con otro nombre - Cuando ya tenga el texto que desee pulse en el boton 'OK'.
- Cierra el Qlabel y abre el archivo que acabamos de guardar - Ve a 'Archivo' → 'Guardar Como' y guárdelo en el escritorio en el escritorio con otro nombre.
- Haz clic <strong>encima del texto</strong> con el botón secundario del ratón - Luego para imprimir primero deberá configurar la impresora.
- Elige la primera opción 'setup' - Pulse en el octavo icono de la barra de arriba, que en este caso será una impresora con un engranaje naranja.
- Cambia el texto para imprimir - Una vez ahí, pulsaremos en el desplegable de modelo de impresora y elegiremos el modelo que coincida con el nuestro 'G***'.
- Haz clic en el botón 'Ok' - Pulse guardar y ya tendremos nuestra impresora con la configuración guardada.
- Desplázate con el ratón para ver la medida máxima que ocupa el texto - Y por último, para imprimir, haz click en el noveno icono, el cual corresponde a una impresora azul.
- Haz clic <strong>encima del texto</strong> con el botón secundario del ratón
- Elige la segunda opción 'Setup printer'
- Haz clic en la primera pestaña 'Label Setup'
- Modifica la propiedad 'Paper Height' con la medida máxima consultada anteriormente
- 'Comprueba el puerto de la impresora, botón de de la derecha ''SETUP PRINTER''
y en la parte derecha, igual como la imagen que adjuntamos, seleccionar la que
ponga ''USB00x: GODEX'''
- Haz clic en el botón 'Ok'
- Haz clic sobre el icono de la impresora
- Haz clic en 'Print'
help: help:
title: "¿Necesitas ayuda?" title: "¿Necesitas ayuda?"
description: Si necesitas ayuda, descárgate nuestro programa de soporte para poder description: Si necesitas ayuda, descárgate nuestro programa de soporte para poder

View File

@ -8,10 +8,10 @@
<p v-html="$t('description.downloadFrom')"></p> <p v-html="$t('description.downloadFrom')"></p>
<p v-html="$t('description.downloadDriver')"></p> <p v-html="$t('description.downloadDriver')"></p>
<h1>{{$t('sections.QLabel.title')}}</h1> <h1>{{$t('sections.GoLabel.title')}}</h1>
<p>{{$t('sections.QLabel.description')}}:</p> <p>{{$t('sections.GoLabel.description')}}:</p>
<ol> <ol>
<li v-for="step in $t('sections.QLabel.steps')"> <li v-for="step in $t('sections.GoLabel.steps')">
<span v-html="step"></span> <span v-html="step"></span>
</li> </li>
</ol> </ol>

View File

@ -1,10 +1,11 @@
SELECT SELECT
io.amount, io2.amount,
io.ref, io2.ref,
io.issued, io2.issued,
ict.description ict.description
FROM invoiceOut io FROM invoiceOut io
JOIN invoiceCorrection ic ON ic.correctingFk = io.id JOIN invoiceCorrection ic ON ic.correctingFk = io.id
JOIN invoiceCorrectionType ict ON ict.id = ic.invoiceCorrectionTypeFk JOIN invoiceOut io2 ON io2.id = ic.correctedFk
LEFT JOIN ticket t ON t.refFk = io.ref LEFT JOIN ticket t ON t.refFk = io.ref
WHERE io.ref = ? JOIN invoiceCorrectionType ict ON ict.id = ic.invoiceCorrectionTypeFk
WHERE io.ref = ?