From b7879a2f3c2a49b334f985c60a73973c7e8bc4c9 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 29 Sep 2023 21:28:37 +0000 Subject: [PATCH 01/23] feat: upgrade prettier from 2.8.8 to 3.0.3 Snyk has created this PR to upgrade prettier from 2.8.8 to 3.0.3. See this package in npm: https://www.npmjs.com/package/prettier See this project in Snyk: https://app.snyk.io/org/noreply-jcz/project/6f18f5a9-d616-4351-b6a0-903a796d4269?utm_source=github&utm_medium=referral&page=upgrade-pr --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c19bc65..d50690b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6683,9 +6683,9 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==" }, "prettier-linter-helpers": { "version": "1.0.0", diff --git a/package.json b/package.json index 0b48809c..fbef2971 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "author": "Openbravo SLU", "license": "SEE LICENSE IN legal/Openbravo_license.txt", "dependencies": { - "prettier": "~2.8.8", + "prettier": "~3.0.3", "eslint-config-prettier": "~8.8.0", "eslint-plugin-prettier": "~4.2.1" }, From d7007c9ed9fd8aa3ee442d53a0dd3ba10cbfc7ec Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 29 Sep 2023 21:28:40 +0000 Subject: [PATCH 02/23] feat: upgrade eslint-plugin-prettier from 4.2.1 to 5.0.0 Snyk has created this PR to upgrade eslint-plugin-prettier from 4.2.1 to 5.0.0. See this package in npm: https://www.npmjs.com/package/eslint-plugin-prettier See this project in Snyk: https://app.snyk.io/org/noreply-jcz/project/6f18f5a9-d616-4351-b6a0-903a796d4269?utm_source=github&utm_medium=referral&page=upgrade-pr --- package-lock.json | 439 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 402 insertions(+), 39 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c19bc65..87e196e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1637,7 +1637,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.4", "run-parallel": "^1.1.9" @@ -1646,19 +1645,107 @@ "@nodelib/fs.stat": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" }, "@nodelib/fs.walk": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.4", "fastq": "^1.6.0" } }, + "@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "requires": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "@sinonjs/commons": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", @@ -2396,6 +2483,19 @@ "tweetnacl": "^0.14.3" } }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "requires": { + "big-integer": "^1.6.44" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2410,7 +2510,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -2475,6 +2574,14 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "requires": { + "run-applescript": "^5.0.0" + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -2854,6 +2961,138 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==" + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + } + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==" + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -3416,11 +3655,12 @@ } }, "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "requires": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" } }, "eslint-scope": { @@ -3783,7 +4023,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -3810,7 +4049,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -3981,7 +4219,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -4362,7 +4599,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true, "optional": true }, "is-extendable": { @@ -4374,8 +4610,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -4393,11 +4628,25 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "requires": { + "is-docker": "^3.0.0" + }, + "dependencies": { + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" + } + } + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -4407,8 +4656,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-plain-object": { "version": "2.0.4", @@ -4471,8 +4719,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, "requires": { "is-docker": "^2.0.0" } @@ -4486,8 +4732,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -6148,14 +6393,12 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { "version": "4.0.2", @@ -6185,8 +6428,7 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "min-indent": { "version": "1.0.1", @@ -6465,11 +6707,21 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -6589,6 +6841,11 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -7108,8 +7365,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rimraf": { "version": "3.0.2", @@ -7126,11 +7382,95 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "run-parallel": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==" }, "safe-buffer": { "version": "5.1.2", @@ -7363,8 +7703,7 @@ "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "sisteransi": { "version": "1.0.5", @@ -7778,8 +8117,7 @@ "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, "strip-indent": { "version": "3.0.0", @@ -7838,6 +8176,22 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + } + } + }, "table": { "version": "6.0.7", "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", @@ -7903,6 +8257,11 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==" + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -7951,7 +8310,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -8145,6 +8503,11 @@ } } }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index 0b48809c..368e537a 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "dependencies": { "prettier": "~2.8.8", "eslint-config-prettier": "~8.8.0", - "eslint-plugin-prettier": "~4.2.1" + "eslint-plugin-prettier": "~5.0.0" }, "devDependencies": { "@babel/plugin-proposal-optional-chaining": "^7.12.7", From 7a3d9e56224da09275e7f588acec9cc344d2c218 Mon Sep 17 00:00:00 2001 From: Ruben Rafael Danielle Date: Wed, 1 Nov 2023 08:21:36 -0300 Subject: [PATCH 03/23] Issue #236: Add Configure Sort message to allow translation EPL-1085 --- .../src-db/database/sourcedata/AD_MESSAGE.xml | 12 ++++++++++++ .../js/ob-smartclient-labels.js | 3 +++ 2 files changed, 15 insertions(+) diff --git a/modules_core/org.openbravo.userinterface.smartclient/src-db/database/sourcedata/AD_MESSAGE.xml b/modules_core/org.openbravo.userinterface.smartclient/src-db/database/sourcedata/AD_MESSAGE.xml index 0dbc6e8d..7a7cf122 100644 --- a/modules_core/org.openbravo.userinterface.smartclient/src-db/database/sourcedata/AD_MESSAGE.xml +++ b/modules_core/org.openbravo.userinterface.smartclient/src-db/database/sourcedata/AD_MESSAGE.xml @@ -1,5 +1,17 @@ + + + + + + + + + + + + diff --git a/modules_core/org.openbravo.userinterface.smartclient/web/org.openbravo.userinterface.smartclient/js/ob-smartclient-labels.js b/modules_core/org.openbravo.userinterface.smartclient/web/org.openbravo.userinterface.smartclient/js/ob-smartclient-labels.js index 31cca92b..7916f3b0 100644 --- a/modules_core/org.openbravo.userinterface.smartclient/web/org.openbravo.userinterface.smartclient/js/ob-smartclient-labels.js +++ b/modules_core/org.openbravo.userinterface.smartclient/web/org.openbravo.userinterface.smartclient/js/ob-smartclient-labels.js @@ -201,6 +201,9 @@ isc.ListGrid.addProperties({ sortFieldAscendingText: getLabel('OBUISC_ListGrid.sortFieldAscendingText') }); + isc.ListGrid.addProperties({ + configureSortText: getLabel('OBUISC_ListGrid.configureSortText') + }); isc.ListGrid.addProperties({ sortFieldDescendingText: getLabel('OBUISC_ListGrid.sortFieldDescendingText') }); From 610a54f4e79d9b02397cba22fdd72402bb6eaa67 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 1 Nov 2023 21:20:13 +0100 Subject: [PATCH 04/23] :zap: Update version to 23.3.1 --- build.gradle | 4 ++-- .../src-db/database/sourcedata/AD_MODULE.xml | 6 +++--- src-db/database/sourcedata/AD_MODULE.xml | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 57d7d428..71cba086 100644 --- a/build.gradle +++ b/build.gradle @@ -35,9 +35,9 @@ dependencies { } -final String CURRENT_VERSION = "23.3.0" +final String CURRENT_VERSION = "23.3.1" final String NEXT_RELEASE = "23.4.0" -final String NEXT_HOTFIX = "23.3.1" +final String NEXT_HOTFIX = "23.3.2" final String DEV_URL = "https://repo.futit.cloud/repository/maven-snapshots/" final String PROD_URL = uri("https://maven.pkg.github.com/etendosoftware/etendo_core/") diff --git a/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml b/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml index 3838f4ba..73bb6568 100644 --- a/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml +++ b/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml @@ -6,7 +6,7 @@ - + @@ -20,8 +20,8 @@ - - + + diff --git a/src-db/database/sourcedata/AD_MODULE.xml b/src-db/database/sourcedata/AD_MODULE.xml index ac6f17f7..1f3a17ae 100644 --- a/src-db/database/sourcedata/AD_MODULE.xml +++ b/src-db/database/sourcedata/AD_MODULE.xml @@ -6,7 +6,7 @@ - + @@ -21,9 +21,9 @@ You may obtain a copy of the License at support@etendo.software or in the legal - + - + From 95d72c8903731c64bbcf1eab5a5d994b170f4ef4 Mon Sep 17 00:00:00 2001 From: Pixel Date: Mon, 6 Nov 2023 14:14:34 -0300 Subject: [PATCH 05/23] Issue #241: Decimal place validation error Changed the URL to send you to when there is a decimal validation error. --- .../DatabaseDecimalNumberCheck.class | Bin 2172 -> 2207 bytes .../DatabaseDecimalNumberCheck.java | 12 +++++------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src-util/buildvalidation/build/classes/org/openbravo/buildvalidation/DatabaseDecimalNumberCheck.class b/src-util/buildvalidation/build/classes/org/openbravo/buildvalidation/DatabaseDecimalNumberCheck.class index 27ae263979ad46e0f6b82d59adeb78f4cac9534c..13b7337e066cbb9306d63fbdaf48143f92f04d7a 100644 GIT binary patch delta 571 zcmW-e%Wo1<7{$+pnYna2SPGih#<;OTQ#y>&7YtSfL`sFB<WGQkoDD(jN2yRY8#fFSqxGm!j3IU2iS&HCp;3-qw3ot{pGNP9P^H*nsnAjQK5FcJNDUKY**7t}reF?r1qK=f zbi2`NSDIx7+h|biC}^TZ(N@sGu7bS)`)Co8WODd4@9CP>bGu&J@-3(5rakwW|Joc{ zTHo^hfzww#-yHf@Pa8N~*|zBqTt`#z01sI~xF|isV*-_5ahXkoU-}hy*w@TMv-{lA zy6(Y&>v)=NI(@C>4|!V0AJ`s2%zF9Cw7qKIafepP^elp_Y)4G6kKzv@Z1#F=B+av9 zDMupgr?e?9KtPfu>BeYk4B3cJr#?d=m>~KF(UdyDIbHYwIZ!jY5D(1>6U5#^UW(6- z5#Qq@V^JOB{K?V@2%^|R9SNR!iGMT$g>#YrBE=^v=Aq#luJe8dIjo?BRlcutM;3;} hTW#doZ+f^OQl!ryasEN9NRg1Z69{oH!Hxea^A9Wxc#;4B delta 591 zcmXYvO>YuW6o%g!U@jd7OQ9@k8aLX6w!mm@RiLPaBAv=tp|x5+$c0V_6&Zvny5mRO zl`b^Vh1cY5irHTK*#Gl~Sgc#4Ln>Xj4bDsBpocnTS5*U5?{ox~ki>RvzW6g_8 zQ<%kNmE;OTLWKuw3`rFXDM!|QNaLy(*Hm1`hKdZbj%+&1oEJA7AkVPn7#IxO3^yfA zm#aqJC~Xw#rM+S%SCtSf9PuI7J8ws?B(*>rF%*ds3-ZuaLRq|!V+jp&sA$+hm7$=a z2I5$yT-(i8bJVV37kdo1H0&$PR?qA<`g~}`o7SVh zDc$G}Y~JZ`yKQy#?D4>+Ld6=`t-e{?DbzQ)%^Q4RYPd&s2>m-L@3!>Z)27*TC=K`V zKzx-`E(tO5O+F)DyT6A6=Hp}D85pgu)i<-`AR!zPTnULEp3n2)$p1S#PUXgt*|bxO z2NGQT@KAhGQqruLC|jPhaAQFjEIsm$F;!ZA50#$FH-`2M{^i&^_>=B8P@U*h(jAoN z++$2XhZ+qA#+ccsQfVnRM(8AZ0ttR>qlh4R&eN1vpph=ph?b}l#c9M5flm1gNYEe1 qVwL*WiAbWPAVn{n7Cvw9T%19lKq38wK!)MGLIfZaDG}#HtA79;41HVx diff --git a/src-util/buildvalidation/src/org/openbravo/buildvalidation/DatabaseDecimalNumberCheck.java b/src-util/buildvalidation/src/org/openbravo/buildvalidation/DatabaseDecimalNumberCheck.java index 7961096e..8bb72347 100644 --- a/src-util/buildvalidation/src/org/openbravo/buildvalidation/DatabaseDecimalNumberCheck.java +++ b/src-util/buildvalidation/src/org/openbravo/buildvalidation/DatabaseDecimalNumberCheck.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.openbravo.base.ExecutionLimits; import org.openbravo.database.ConnectionProvider; import org.openbravo.modulescript.OpenbravoVersion; @@ -43,17 +44,14 @@ public List execute() { try { String numberString = new BigDecimal(ORIGINAL_NUMBER).toString(); String returnedNumber; - if (cp.getRDBMS().equalsIgnoreCase("POSTGRE")) { + if (StringUtils.equalsIgnoreCase("POSTGRE", cp.getRDBMS())) { returnedNumber = DatabaseDecimalNumberCheckData.checkToNumberPG(cp, numberString); } else { returnedNumber = DatabaseDecimalNumberCheckData.checkToNumberORA(cp, numberString); } - if (!ORIGINAL_NUMBER.equals(returnedNumber)) { - errors - .add("The decimal numbers are not being retrieved properly from the database. " - + "This could be caused because the current database locale uses a decimal separator different from a period(.). " - + "For more information, please visit the following url: " - + "http://wiki.openbravo.com/wiki/Installation/Custom/PostgreSQL_Database"); + if (!StringUtils.equals(ORIGINAL_NUMBER, returnedNumber)) { + errors.add( + "The decimal numbers are not being retrieved properly from the database. This could be caused because the current database locale uses a decimal separator different from a period(.). For more information, please visit the following url: https://docs.etendo.software/getting-started/installation/"); } } catch (Exception e) { return handleError(e); From 2e10f82711773181976bc946adb8e2b140671eb2 Mon Sep 17 00:00:00 2001 From: Pixel Date: Tue, 7 Nov 2023 16:50:47 -0300 Subject: [PATCH 06/23] Issue #232: Error when trying to insert an alert rule EPL-1066: Error when trying to insert an alert rule --- ...WrongPaymentScheduleDetailsCheckData.class | Bin 23378 -> 25318 bytes ...WrongPaymentScheduleDetailsCheck_data.xsql | 43 +-- .../WrongPaymentScheduleDetailsCheckData.java | 277 +++++++++++------- 3 files changed, 178 insertions(+), 142 deletions(-) diff --git a/modules_core/org.openbravo.advpaymentmngt/build/classes/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.class b/modules_core/org.openbravo.advpaymentmngt/build/classes/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.class index 89de7fa8e0cc54cbc172f26136ff35a1b66c2e58..5bf66b3b30591131bbbfcd68721e6767832e6576 100644 GIT binary patch literal 25318 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 - ''VO'' - AND NOT EXISTS (SELECT 1 FROM c_invoice_reverse WHERE c_invoice_reverse.c_invoice_id = inv.c_invoice_id)' - ) - ]]> + ''VO'' AND NOT EXISTS (SELECT 1 FROM c_invoice_reverse WHERE c_invoice_reverse.c_invoice_id = inv.c_invoice_id)')]]> diff --git a/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.java b/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.java index 6997608c..1e279a71 100644 --- a/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.java +++ b/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.java @@ -3,16 +3,18 @@ import java.sql.*; -import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.LogManager; import javax.servlet.ServletException; import org.openbravo.data.FieldProvider; import org.openbravo.database.ConnectionProvider; import org.openbravo.data.UtilSql; +import org.openbravo.database.SessionInfo; import java.util.*; +@SuppressWarnings("serial") class WrongPaymentScheduleDetailsCheckData implements FieldProvider { static Logger log4j = LogManager.getLogger(); private String InitRecordNumber="0"; @@ -90,7 +92,7 @@ public static WrongPaymentScheduleDetailsCheckData[] select(ConnectionProvider c " FROM DUAL"; ResultSet result; - Vector vector = new Vector(0); + Vector vector = new Vector(0); PreparedStatement st = null; try { @@ -131,16 +133,24 @@ public static WrongPaymentScheduleDetailsCheckData[] select(ConnectionProvider c } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } WrongPaymentScheduleDetailsCheckData objectWrongPaymentScheduleDetailsCheckData[] = new WrongPaymentScheduleDetailsCheckData[vector.size()]; @@ -188,16 +198,24 @@ public static boolean existWrongPaymentSchedules(ConnectionProvider connectionPr } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(boolReturn); @@ -222,16 +240,24 @@ public static String getUUID(ConnectionProvider connectionProvider) throws Se } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(strReturn); @@ -258,16 +284,24 @@ public static boolean existsAlertRule(ConnectionProvider connectionProvider) } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(boolReturn); @@ -294,16 +328,24 @@ public static String getAlertRuleId(ConnectionProvider connectionProvider) th } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(strReturn); @@ -324,7 +366,7 @@ public static WrongPaymentScheduleDetailsCheckData[] selectAlertRule(ConnectionP " WHERE AD_ALERTRULE_ID = ?"; ResultSet result; - Vector vector = new Vector(0); + Vector vector = new Vector(0); PreparedStatement st = null; int iParameter = 0; @@ -365,16 +407,24 @@ public static WrongPaymentScheduleDetailsCheckData[] selectAlertRule(ConnectionP } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } WrongPaymentScheduleDetailsCheckData objectWrongPaymentScheduleDetailsCheckData[] = new WrongPaymentScheduleDetailsCheckData[vector.size()]; @@ -396,7 +446,7 @@ public static WrongPaymentScheduleDetailsCheckData[] selectAlert(ConnectionProvi ") AAA "; ResultSet result; - Vector vector = new Vector(0); + Vector vector = new Vector(0); PreparedStatement st = null; try { @@ -427,16 +477,24 @@ public static WrongPaymentScheduleDetailsCheckData[] selectAlert(ConnectionProvi } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } WrongPaymentScheduleDetailsCheckData objectWrongPaymentScheduleDetailsCheckData[] = new WrongPaymentScheduleDetailsCheckData[vector.size()]; @@ -465,16 +523,24 @@ public static boolean existsStatusColumn(ConnectionProvider connectionProvider) } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(boolReturn); @@ -505,16 +571,24 @@ public static boolean existsReference(ConnectionProvider connectionProvider, Str } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(boolReturn); @@ -545,16 +619,24 @@ public static boolean existsReferenceOld(ConnectionProvider connectionProvider, } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(boolReturn); @@ -563,46 +645,7 @@ public static boolean existsReferenceOld(ConnectionProvider connectionProvider, public static int insertAlertRule(ConnectionProvider connectionProvider, String alertRuleId) throws ServletException { String strSql = ""; strSql = strSql + - " INSERT INTO AD_ALERTRULE (" + - " AD_ALERTRULE_ID, AD_CLIENT_ID, AD_ORG_ID,ISACTIVE," + - " CREATED, CREATEDBY, UPDATED, UPDATEDBY," + - " NAME, AD_TAB_ID, FILTERCLAUSE, TYPE," + - " SQL" + - " ) VALUES (" + - " ?, '0', '0', 'Y'," + - " now(), '100', now(), '100'," + - " 'Wrong payment plan on invoiced orders', '263', '', 'D'," + - " 'SELECT distinct inv.c_invoice_id as referencekey_id," + - " ad_column_identifier(''C_Invoice'', inv.c_invoice_id, ''en_US'') as record_id," + - " 0 as ad_role_id, null as ad_user_id," + - " ''This invoice belongs to an order that has its payment plan wrong distributed through its invoices. Please reactivate all the invoices related to the order and complete them again.'' as description," + - " ''Y'' as isActive," + - " inv.ad_org_id, inv.ad_client_id," + - " now() as created, 0 as createdBy, now() as updated, 0 as updatedBy" + - " FROM (" + - " SELECT o.c_order_id" + - " FROM c_order o" + - " JOIN fin_payment_schedule pso ON o.c_order_id = pso.c_order_id" + - " WHERE EXISTS (SELECT 1 " + - " FROM c_invoice i" + - " JOIN c_invoiceline il ON il.c_invoice_id = i.c_invoice_id" + - " JOIN c_orderline ol ON il.c_orderline_id = ol.c_orderline_id" + - " WHERE ol.c_order_id = o.c_order_id" + - " AND i.docstatus = ''CO''" + - " AND NOT EXISTS (SELECT 1 FROM fin_payment_scheduledetail psd" + - " JOIN fin_payment_schedule psi ON psd.fin_payment_schedule_invoice = psi.fin_payment_schedule_id" + - " WHERE il.c_invoice_id = psi.c_invoice_id" + - " AND psd.fin_payment_schedule_order = pso.fin_payment_schedule_id)" + - " GROUP BY il.c_invoice_id" + - " HAVING sum(il.linenetamt +coalesce(c_getinvoiceline_taxamount(il.c_invoiceline_id),0)) != 0)" + - " AND EXISTS (SELECT 1 FROM fin_payment_scheduledetail psdo" + - " WHERE psdo.fin_payment_schedule_order = pso.fin_payment_schedule_id)) o" + - " JOIN c_orderline ol ON ol.c_order_id = o.c_order_id" + - " JOIN c_invoiceline il ON il.c_orderline_id = ol.c_orderline_id" + - " JOIN c_invoice inv ON inv.c_invoice_id = il.c_invoice_id" + - " WHERE inv.docstatus <> ''VO'' " + - " AND NOT EXISTS (SELECT 1 FROM c_invoice_reverse WHERE c_invoice_reverse.c_invoice_id = inv.c_invoice_id)'" + - " )"; + "INSERT INTO AD_ALERTRULE (AD_ALERTRULE_ID, AD_CLIENT_ID, AD_ORG_ID,ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY, NAME, AD_TAB_ID, FILTERCLAUSE, TYPE, SQL) VALUES (?, '0', '0', 'Y', now(), '100', now(), '100', 'Wrong payment plan on invoiced orders', '263', '', 'D', 'SELECT distinct inv.c_invoice_id as referencekey_id, ad_column_identifier(''C_Invoice'', inv.c_invoice_id, ''en_US'') as record_id, 0 as ad_role_id, null as ad_user_id, ''This invoice belongs to an order that has its payment plan wrong distributed through its invoices. Please reactivate all the invoices related to the order and complete them again.'' as description, ''Y'' as isActive, inv.ad_org_id, inv.ad_client_id, now() as created, 0 as createdBy, now() as updated, 0 as updatedBy FROM (SELECT o.c_order_id FROM c_order o JOIN fin_payment_schedule pso ON o.c_order_id = pso.c_order_id WHERE EXISTS (SELECT 1 FROM c_invoice i JOIN c_invoiceline il ON il.c_invoice_id = i.c_invoice_id JOIN c_orderline ol ON il.c_orderline_id = ol.c_orderline_id WHERE ol.c_order_id = o.c_order_id AND i.docstatus = ''CO'' AND NOT EXISTS (SELECT 1 FROM fin_payment_scheduledetail psd JOIN fin_payment_schedule psi ON psd.fin_payment_schedule_invoice = psi.fin_payment_schedule_id WHERE il.c_invoice_id = psi.c_invoice_id AND psd.fin_payment_schedule_order = pso.fin_payment_schedule_id) GROUP BY il.c_invoice_id HAVING sum(il.linenetamt +coalesce(c_getinvoiceline_taxamount(il.c_invoiceline_id),0)) != 0) AND EXISTS (SELECT 1 FROM fin_payment_scheduledetail psdo WHERE psdo.fin_payment_schedule_order = pso.fin_payment_schedule_id)) o JOIN c_orderline ol ON ol.c_order_id = o.c_order_id JOIN c_invoiceline il ON il.c_orderline_id = ol.c_orderline_id JOIN c_invoice inv ON inv.c_invoice_id = il.c_invoice_id WHERE inv.docstatus <> ''VO'' AND NOT EXISTS (SELECT 1 FROM c_invoice_reverse WHERE c_invoice_reverse.c_invoice_id = inv.c_invoice_id)')"; int updateCount = 0; PreparedStatement st = null; @@ -612,18 +655,27 @@ public static int insertAlertRule(ConnectionProvider connectionProvider, String st = connectionProvider.getPreparedStatement(strSql); iParameter++; UtilSql.setValue(st, iParameter, 12, null, alertRuleId); + SessionInfo.saveContextInfoIntoDB(connectionProvider.getConnection()); updateCount = st.executeUpdate(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(updateCount); @@ -653,18 +705,27 @@ public static int insertAlert(ConnectionProvider connectionProvider, String clie iParameter++; UtilSql.setValue(st, iParameter, 12, null, recordId); iParameter++; UtilSql.setValue(st, iParameter, 12, null, referencekey_id); + SessionInfo.saveContextInfoIntoDB(connectionProvider.getConnection()); updateCount = st.executeUpdate(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(updateCount); @@ -693,16 +754,24 @@ public static boolean existAPRMbasetables(ConnectionProvider connectionProvider) } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(boolReturn); @@ -731,16 +800,24 @@ public static boolean before30MP3(ConnectionProvider connectionProvider) thro } result.close(); } catch(SQLException e){ - log4j.error("SQL error in query: " + strSql + "Exception:"+ e); + if (log4j.isDebugEnabled()) { + log4j.error("SQL error in query: " + strSql, e); + } else { + log4j.error("SQL error in query: " + strSql + " :" + e); + } throw new ServletException("@CODE=" + Integer.toString(e.getErrorCode()) + "@" + e.getMessage()); } catch(Exception ex){ - log4j.error("Exception in query: " + strSql + "Exception:"+ ex); + if (log4j.isDebugEnabled()) { + log4j.error("Exception in query: " + strSql, ex); + } else { + log4j.error("Exception in query: " + strSql + " :" + ex); + } throw new ServletException("@CODE=@" + ex.getMessage()); } finally { try { connectionProvider.releasePreparedStatement(st); - } catch(Exception ignore){ - ignore.printStackTrace(); + } catch(Exception e){ + log4j.error("Error during release*Statement of query: " + strSql, e); } } return(boolReturn); From 803b088a149bd12bb98278d7ae2ba5c8deb77944 Mon Sep 17 00:00:00 2001 From: jortolano Date: Wed, 1 Nov 2023 15:33:40 -0300 Subject: [PATCH 07/23] Issue #227: Xml tables in modules_core are now read as system tables EPL-962 --- src/org/openbravo/service/system/SystemService.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/org/openbravo/service/system/SystemService.java b/src/org/openbravo/service/system/SystemService.java index 271afaea..2715a724 100644 --- a/src/org/openbravo/service/system/SystemService.java +++ b/src/org/openbravo/service/system/SystemService.java @@ -450,13 +450,19 @@ private void enableConstraints(Platform platform) { Vector dirs = new Vector(); dirs.add(new File(obDir, "/src-db/database/model/")); File modules = new File(obDir, "/modules"); - for (int j = 0; j < modules.listFiles().length; j++) { final File dirF = new File(modules.listFiles()[j], "/src-db/database/model/"); if (dirF.exists()) { dirs.add(dirF); } } + File modulesCore = new File(obDir, "/modules_core"); + for (int j = 0; j < modulesCore.listFiles().length; j++) { + final File dirF = new File(modulesCore.listFiles()[j], "/src-db/database/model/"); + if (dirF.exists()) { + dirs.add(dirF); + } + } File[] fileArray = new File[dirs.size()]; for (int i = 0; i < dirs.size(); i++) { fileArray[i] = dirs.get(i); From db2baaea8cc055c5acea10f88595fadaea2fef35 Mon Sep 17 00:00:00 2001 From: jortolano Date: Fri, 10 Nov 2023 16:39:01 -0300 Subject: [PATCH 08/23] Issue #227: Update dbsm, Solved Sonar code smells EPL-962 --- src-db/database/lib/dbsourcemanager.jar | Bin 763781 -> 763948 bytes .../service/system/SystemService.java | 36 ++++++++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src-db/database/lib/dbsourcemanager.jar b/src-db/database/lib/dbsourcemanager.jar index 239a84099aa235748d7143c1240e37dc00ed29a1..602f1e5f0a64dd413649f60d33a51d41a49943f2 100644 GIT binary patch delta 49555 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 delta 49029 zcmZU)V{oQj6Ezy!p4hgHi6>4b&cx=#&XtL6+nCt4ZQI7&vCs2;Z=FBqRCU!_)wR2; z_OI@}YVFEd=HMA-6lFO`CcP`u}o?`AEF~OKl-J!l3`3j>TcDp$ZUSVEa&D zV1kKrNhA$^nE!8w7i>Ai{~ebh>m>XigA*S4U!nK!6MY{gFfgGyFfhjdQVoyr8(QM=DY?8}vR=|ixEfkb>8P}}wXL;{5`d#z(;6NwNlSLK zW6=<2Xq)whClf8>?xOdH|J922gY;fehKvlJiVO{7UdA8q;v=`s{ieDonF-XnbN8lS zdorCZa5R~&W-(o9u-p9&qvNZ?-lO^C!h9X!1IyF5$-#P1yKB)8cR)i zr&sGF@0rG`8UHekSUIv+>>k6a850s-Gob@5U{U$}D9BJvnfJSo9fM8|#bluomeW2} zFuRT1QB8kG(xRVGUCWxP`&nHK0_#G6315sOh36V94S6Zo>9#LdhEcEhVC2fmeWQp6 zPztWmddgHN_`U_7m6O|x02u}&zu8j~9kZfNOd)76JsXWh6x0%V>EIJo#TnH@&dQvw z3;R`*Q!;GFh|>3Y&cT>-_tn%s8a3c|e-MqfS*2u5C!_AC1~PF48vOML;P@7#oh1Ne zQ)%vet*m&gWz9TWas0C6)6}bq$ka5d8mfK%yION<3_OLuUsc-a3cy#i<|}VlG`4RE zGKlFXXXTY+QlAN)V03L%VtQI|7bAB9n#duuNleO<{X9!`hL~cS79CUga~f!F^)z(P zCFFu%y82Y3{pRw>QzCS%ql=eeWGm8&73&whdaPBaQmpHKRur!@y4Dx3d-@&-FYT3f zsFxOVKQBtj*?}g;0PBWg#k$4v6n-WdVtv7y2cHEt#iWKKz<$>9L>?* z_54eS-1b>j+?O*)SGJW8#klu(zQjbZn#m`hb9ND-ilAcVlN0PLpWMBkc~wpAb8Ekz z;nM1dg^Ed7zWOqA*fSzB+l4=Vyo!l09yN0`y zQ)+QL;{zn|p?yzU@pau|mvB?`&dtGLXiEEzD(bDONSZ8(kvXkTSYjxj=U@%7`j*)E zF<-U%2H)DAn!v}sd&upLHE!a>LDm~OjnZ$BDH>Co@LlCkC0M#t1Ls8!;fKoH$KMk| z=QLS@7Ud@#z!D92t%HVjL3ZE31t7 zmG);&qR8*A*g(!G&nL_tJQ@R3)vz^}EaSC8;e*2&K==VS_cd$fttP$T=f_m(=k(Fn zC>Hj4uGqTL2ZPMOQmWW`F8C|I428#N{N@>t7=E$W`#!0H82voEOriQ@DOX8}(5ZxX zASVoV(-E$-ONi3jhcU4T$A>Yv2&7+~jD^3YD-O+?-+GBN@7TkcpbT7y2V=<6i^m*v zS`qU-a6#r(Rvh}r-xaQG`R(QYcaK)}(+Rrt^Mi~~gtKG{@l;-P-MyAyOvAm0oKo$* zL@qN-g;>Iw?BrKGY4ibIw1v#XyKy%2h{Z3Xvmd!RjH4v>)_?7yUAQF=0s^>bf_Z`% z1O$u~k|zqIiK?zRpv@LXmYahF_%{jz%pWUQfr^qQUpq4!-Nxd4q0am!b_}ci8pn>9 zt-JZ<$*iOFXxz(?&aCYs04`c<%=9njw;TmdnMch;ouR(( z)xM`RMWn{Ic3q0rh^^RPk9j9CFFzY7qQk{OodVbFDdf3Fv%QcKT1-hBlU6IwR-xe= z#r$h6+yl?*Xt$pofvH$Z`0uyc4@7&zz=M`T=}6_HrC?J7l8c>5v_SQ?_lzt*CZ+MS zZghHHU>hA&sH>>#P4MvHhAt062Jh*17b#9>M`uDij(BUuWZ5>qX5v zoT7nwpX{CWwRxiyaAk{*1-A&qSNQ=t;&}(=>Ck>^v&0Uo@K&c#E~PSHO{&^Is*Mfb;~$Ntd!8F zrUWU!-ZCy*{6pvBz>iPExTQU_pITs}b2ops6$!25*vCqpV;ZC*dW@;^^YTRhiEEyFcR;!3E3MP9!X4pJaTa@=3=*-yC&>{ao z;Opw@h)SFe4pA$acI!^Q)(NpOl?3V6J2_`EvG{sLC@DRhLHc@SC@Fd%haQm`Y zJJ{*#u$2AfB`TP&75^e<1Wdg*MK>1LHdS%$hu6KigEINkUsUH(Qx6A^<{n$qHI9TW zT~ra?Ht^T#zhwsNq-47aOk6$0oL4HpHs>yPn2OqM>rTDgiv`4dy7i*e+bA2T+3-S0 zMGkxN;WTkeYU#_%(6BG0%WQKgMk1jpyV!esdvH+uRsP~y))^C;0Zc*cOZy@58)TAf zXc`e4dA5_HIMM}>yP`gnmalnv=PMesw1wXIYD~$JRae|Xi+G;78q%WINZ~_saltA@ z?L*CmmoQY`Ej$SkiCj}*ln+Lm-8yJLc&AQ3>ZWc-@hn*y2CS?aQ+aUe#6V7L3&)dv zE~(1}`(%#|@n*-D0NAgs1Xg@@!r~D~i{X84sR731SbWCs-O$^WT2K^tg%pMtr%;3x zz0lDYn0Sr2CH&n*T=p(lE)pzmR@T3~cV&~gs%%#H&n5DqGVFT!pO@#?E;GuOm=FsH z3KXjBnjz+Evr^W64v|~@!`DrCG*}7PZ)A_WYS`AeJN0$s0Sr-sC@SnOYs|^<0#<^! zcH&?AoSiHheVzMv`}v2#b#L}Mkwk58e6|TpQDF?{LBC6F7bKC+s47cbuy{N=xHhgs zpyQbOT_ZhBsV0yc`7ZkZdCt*dn%F8t*(IL$rG10^Q|qxE@LL+M zcMa)sb`8f!0B}3=pre7`;#sw3Ag$R~|LaLgdPVPxto*Gh(OUtTHFW(5wqi#tg+MqK5*`|h=xo>r&d zx5%+Z#2pAFpzY$eQgP4e`5#;^u8P*~S&5^! z5P%N%o5Qnj^G%V2%r+d}`D|%@AHg=*0{bB*;o;NnxSL0MJLH)jvbFlSszk+X0@1nZ z*>ZljCQRD8r(3cvu$g4mc8WxV^xpv`nCaG+EA`TRF_1&2&`FsEC@mR#~ z5nyM^wxe5`Y#tqSu{5G@==ib6ZPp+WYJ(0%PDeq>T?GR!HxJ4f*$BN}4)mNll~Hua z^BwmUp9pc<0;03PxlcpbLV3Lm8&nRbfBUw;JwmJ+3iZhZ#xp)@Y56|dB89s(x^sh= znP=}Nzx22>&rpAad}%uQRSyjf_+8 zdLnhWhv7|)uJ!U)7ezvEUxM};Y)-4QVO+)mA};_SZ2moXuerHoDz4DR*ye&@!^Dp0 zF(a45(wqp%W#rSnC=Fbiw9aN%y1SbV$#Z90TE?w6B}%hjsS-*Ezr1m+oOi(Rss5t=+xe=Ct?jO?NDeo^%UQ$~g)n$uV}7lfDShFK~Y_tmW~* zKP#k1vgTjqt^bvtg>1eIpFWHk&M9GB<$HUG0*+PsXwcf8raycwU-F;@3J;z)=zMzMas`ra_Q|Rdh8qnMm5a zc~Ph;v0Qf?etGw9s7`}V;41CjM0ArDFO7Y57#=_9T8ddYe;)W!*G=ms+h(ZjPPWHZ02b`X~Gx3(LWHVI$vq>{<7`Un1im;i1e8IGhXHHFxi&#XvBeJE zZ7!?9xEIWApp8ZhrG{o2$G@QLq!is0eL>;*cXnR{vrk!|1$>`Vm>ZssvGnDfo?Y|t zN@|Gb@1@2+9au2G@q#|ETK^~Zus?V#=EM>uApel#b(LV&(&i8eAQ}3#9$c`wi^DHh z4pY;(^cmb_@b8wG`iMch6QWs!H;C2yY6_5MNXm(3G5UXY`t?zP&oS?V&y9`2RJVjX zXY#ot&{%|VKr7(srHPBq%!k6^i0Tqb+@vS zI-A;yvY@RP&A|u)Ik39P;P75XqAdH&D2eoWsM6$jZLUqN7+fjPgQ@!rxx(b6H!IRG zrY%15v$3gFkvLSbHW8SIS{kOPY~^Kq>vh#!s#uY@O>Sc=v z`_KcrBkklP5=`r@%*(CSw1nYUe6aWN>T#(NjmHgUq7F7P$l7RnR^5M27LTcthe5u-`saE1xt)il|7A07|^OOOS|HfTtUHfuyY)+rBv3gcK@ zOaRGWPzc^7<%2V8^YGub6-OXmDZ7O8GI_0*(`*<3y9F9p7Xb{%*jAprgZ)eY>$vgx z>;PIIk7sn!f15Tr&lBZaagH?hRF(Uv5Dp!K(>(+(b$!VGCeF2r7bC`O=KZn1a4@t6 zsk$KSefevnzi@WwB6em5nc6hi*9Au#X@^id^*XVgRTTacbKcCn1?*tYpaGw|o~Sun zW5Yck_?fh#5A!E|nG0FscWk&~TF0N7Nvs|K(iG(sx^jP8`*i6H;_2N3bU=xKLZ#ouk6i5(5QzkV3=Bm^SOWnTbgCUVZ&kh+-dr z>z(HJj(pyK-HgebET$mlKN^tETmn%ex{iV--gA+vg=lQsVsFGXmP31psmzSV*O>;+ z_W{9(DCwBRIL6hCQPI(=a5piJ{tqHxz?L6v%aEQOdf2;U~*RNexQ# zjL;1pP0GRSJ$p>)K4LvlK-vIfc4sLSK?hpZ=@^aK+IiL{mm4oXq?^crg6$^+B(|jV z9h+G}N@UvaiR0+KDQs-fz9&-fL)POyN7?Hb&PqkY3cS-CQ;vTDg(u5!87U}0#`L1m zF-!IiYMehI(}-xw=>*JaKHHzZKVEovz3o52AVJVCZ+Hw<983 z!S%u^R{XnD#?E(LD(s*V`B1p!O=3^W%t)&TQt}HQ9p7m!d;X|k&#s&SOsv>X0fn8M zh$@`^2QDe85q08#G9A|ea)Lk9!C>vNZ<)NK2gClK zWV(z`&LA)v)cUT|Uz^1CoQ@mQ`$Tc%sQ2P}LqB}rPeUIlz(2~aVa{Xq>kXMb;2TMH zkTBalxiXXU{LLh%JA4T}NApwsqJ{>{z`K6kz@27a235)&Nw^pRms3l(Q|awu|GGM8 zV*=L+1iVt$5f{9lWzlf%);b;1SB)l?Bs3-63jGD8`qMV4wsC*P=}X3vEWYT7R;Ma} zJ9dC!ldy{{Z?CRl*(?1$otn1B*H<`o^tNbRaI1^VB9fU+C__FSS^Kn3Cg59}94i<8 zpg`;N>z`MGxmSAy&ip^w7&iV{b%l4sLV8y1Rg}f<(y(j3rcQ|k1?cYdOP7sMHuVQP&e>!Vn`dIMygI)gfnf}?P z^hKTrj0N^ER3n}moEZpg--1yv+i+QT3NJ%&ya|0|`hQjdpT9(VX1LE`_ig2X(*+Xf z`|ptRqkpIBw%M78_A7_n z7hm2N`Aq%&$t9f0WKUmeqAr!`@(y(L_Q`c|@fZ5+*P;Q`p`DYr=r%LJ2^R2n)no|s zR%Wpn{EH9B`x+8H?s-Us9PLdqN6K3GAxxEftYM)2YGXe3rRBvV(o=U&9A}hW?9GTO zCV7KsjLDmIxe9`FIfw_3{k}sy#X>xBKxA0{=0FLtMrpCn4myThHsb_Gv#b5aC{Nun|$wiI(!xM1Xqe18V=glNS&hZ(!u{k z_5cY%gDd4*jCP;RttB49<@j6BI$&O5@Vp8RK;*>1q6}k#WS?@6dp8wG#^mIclVR zeXhtX-kAUw-Eh1RyOjtTBsdZyPyd$u@@ZGD5wJyfFyARg;v8fTDNn;(MFpacrhE!Q z8`-F4tkk$Smx5%F_s;fF2*r$NS^)h&o8pW;a<~qykmbOuX zd7A}Zs=PT^ng-_f@Ph>1$wK$Vx(!WcEs;&E8vTv=b>eJ?-epI)xUS&bCxPZZttP;- zyLN0h!%l_RIo+4KMx`#DBy*!6hEplfaM!gfl7E{)ip3cwiiG&yYJ3)4Q3`Bk__w!Q zE*b#KAXvH?qJj1?{4-<1uA!VhxQrT=kWNS$uWE)*tyW1`wai_{n$YfiDNm0#KKqKP zJWuN}n(EjR;5_;+SG_hFUW#)x_zJ-M^`3l?L(}HP_yz`E@t!l6!&dIi3i+I4MU|B{ z`n21BQ3%$?wpmBMT!+HfJv!RRR&0=q7@OYndyGA7<`ul-?sxAX__Q;E#C*$z>9TD{ z>M->)b^v`u57jp_F!gXmJ^f4*-hFO*9`*+)Wc(&NN1VY@xw6Jp#&H0{eQZ8w zjESf3&F$CQv1q**itv5R5=p|k5Q^; zDn)f~_+esKgNm8sJ9zM#J+F(=y4?fUT+Hxbn{>^Tr-=^D(?_uH#L_WE_w2mRLOa{K zy&RQU{{o7lc$L*DPj=D4P%N;4Yjf41Fx^$8;yd&8x}&C(*;_u8%AcN-ebI>QxT-`n zM`grZ=iv;|&NgjPPlwhkVO;||ciY{V9}a(}#mqE1Y?@@H8YU8{0( za8_E1je>|nY=p{tB)I~5%IR%|${tIU8mm-f;}Umza1WxYlQEdfY7s~y(v10UaQU@Q z3bh{*EXZx1%2Uxx=1OkM89HZNhqV4?Va=ax+DoZLe5$~ZrGY{r|=8%AE;5Z(Qt{fha109N_N6lna2;V~6R+`2+^ z0shZzbeFpx)>gzu`E3J|d&UNd=bx|!$SafyNN}KdTl&3RDhzb?p&7)jOv~Ujcr|O> z7Tj8Pv&N5os|+OC8gr1_tiaryhbqTgI)Ms29DLD4+$W0EJ^tpL2;B}Zb$1|c=dln` z%XApax`LTHjTugW&CP&BSFPv}Z^0*3!nYT`ZuG+^H^k(MNPEADqSI?A5HA|fV&QAG z%Z65SJLZZ+(E#|V5A`(<#Wwh|8*g-+tE6RWa52SjU1Qi)C!vQ(&BKEJZ;6F9RNQ9Y zP9ZA6WqPcrQLI1R@oE2WUFQ5xc9EyP+VwfUaGUCIp^-GZhTR>xo?Ty*LlRs#KueVqz(DNVLY zW`hC*`?5cj97JmSEHh{6nC<@>P3>u=L5A7L_w@d^++f#3mlGsR5hk7*NWRd>g_PpA z+0mV{!CV4^z9Za2YhBQ>-2GgkHtj;rLbvAPL z*ILB_O*B{Mj3-kiG2dXdl{n*4XB2GdGwmEED+|k971oK&)qn_H5znOV8L6XdBaeMI zRrJk2fBt|vcqU$O!6nRgi24@|ZMX4Foh~t@vr>SqF4o+GVFK4!wbkh#h^>EE!K?pR z|D4iS6qJvae?!T`JQe^udZ1p|^KtB^TPC~+lluGe%AIR?H-j#LE6(bP6cS}6oEB%E zW3ra#5OAwtf!@%^gwg3wZEq;5w_DiZ1M%Q5Mq1kkZxSXoekmUD+`Bcnuh zItr)fzYO+F#Xv_j+lDo@G~dEZ7Da#qaHRm?e@?oUGnukn09wqaT8U zEr9QwP;lM41 zQ!{*a>lQf;_YM-FsCMGZKSGn$<5EEV%JTzZuC{NQsRgJB19#h;eAkEh-k&>Jdjp=P z5L3VJhyCcr)9YYMLvt$(opPQMbEVP+4W!u84P4@tT)n$fkI7N!HIl>^?blK9q=U9L(^hm1g1>uVs)GU6?=@t*tSf z53zD~OG%TfuLS{V^|3!hAQSOL`(il1?`mIbXyAZhS9AlxwQozArugSpMPmoG_d{J4 z^Rf8A;sABp*lQFY8o6aFFFtCYIf^w^Qzu8@l_Bz->#z z%v(s(E5Sc^wcMM`Hy@GWnKz((pY!R%1#}k;afm9troC@lbh29&i3Kkh%iQ)o)n@NEp?)6~kmo-=OJT*y+C7xxTmT-1xyDnpUa1?@^2cEKY< zEU`SoeE&<5Gcu+?e9*HDyA~YtgrJs#_pu-R6)oX-#2%5j;PQmd1{XLo%-am5Be+3r zH8C@>mbe>}L!?c`36H!D89Oehh}?Qna%mrzck7=;SP0zl5rmkbPyrD+hA&v6jK9d` z9iq<+dkqmJIWz4n>gsTvo+CBz);cKj)&N9B@(8A+S z;T6L^$jZU3>(IX7DWNoJx)2_aD3@DU=aEsEYH{%wC}|AUjzFAaRqOPbBSO!Cm1F2u z<4&`%kfbWyl#>^RvE2G2zrvfV)rNz@#&%+fuiEq z+E|C>^Z5MkXY5><4&%cplM6X z8lWgElS)IS_F3cg_AS?8BQLU{&bPdB<34CAp)=xdv2+5qJq<%5AGy2I# zYnd^da=^dZ*+|R;_dofR%Fi&YLV0saFbb#5#{hcZAEWH1MPk8oK3V5~>K`|=??xCf znXzc_EtM)O31;H_hr4oH9zBz&Ccjp5AU!1;+g09=w7K`JsF{#s6vHI%4y{%t?QdDH zctp>pxX4wYl#qLr4CXN`lEI-4TDU%6)~5sOEZ`g6%ipB;$+#BEL-^_Q5^>_$>`@fkadp!ZD$&6zhvrO-ke5iih&kXZu2-}u}U)bI6XXcfHeNB&1I_2ovKC8YNF00#n0gS%YSZs2TXk)+ITDz z#4G|yS5c{Uv8kBjX9D{6aQ&nsL^GX~!yGJh2UAE#)WZ#_-WNH6OD+!iE9gxv;dg!N z(&{hIU9&b7l6k?!34H}d<7g*Hn#YjI-GH(b57X88%dGY-JwyDM^1?^(r^Jd&%GqM> zsf*7M_J_FO z;U122tk8wob-@hm5N2J`eF3HO3MjH5CEm^(IeWUNc+JWwsyU_G%O@GQ_m)B`v>38{ z4W}(W8RYcRpUlS{^zo8qEYTdK_fqGawJ{dzV&*?Xc7*AIKR9G6J7^iozE@k7ya@|E zJK2|gE%pfC#&(#i8LT;7*?+pvc}Dz@dJpwuV0z7FEP66S_az;fm#)wH1V}CBMx2O0 zRJiA8*cEffk?(0dseP$g3PdJs&RCpqeVKPkdd6c<9Y74Pq2nbY6%enf_=;Z|CZ}@h zKMcyn&up*@zsk7RtM>1s+v6Y01j?jc;Z--zP|x9w%1Sxc9_f$kM^&h~; zMZ{lD`e)ene~L0h7aRZc2RzUcyy2mT#M2USTSu{CMTZ9z^62(e<`lHk60;|YAB;OZ zqMB-N!{SE`WQF4yKtm|^#^H0{BeIQgkuHXM=MPF!)$a?Q(YwtdGB<`WpYg%A$@gV_ zrXU_QB1&($2%ZJ>1fy&CdSjH{@eDW)sa)zjV1~0uI3C3~+|;O#fs4aKL0+lKKp&7i zo46oi=|}=@_}D(psM+XPZRHy1{%@*PnGnyiIDB?UR^dXNH%gbxxGG7+N%Sw3GCwMP zG!}N`3WKmzuw>~@+suqm!C%H#c>G_urcc2zUQ5mEppEc9{<)PT zwi)RKko$sre#6r&0DgRT@hs?ts^DVqDIQwf{V3|-@%ALsNTBr|GVGk+dTxW?6dG+6 zE|S-E98fdXkZHbQ;6^||kWTEM+gw8dw!$X-PYSGR2Z~9~9|k?)<2?#R2a?)ahramLKD~qn@=JY&I(H9*X3I*t_6V%3)3xkLnODASAbH9?+!nC-N< zu-keB@DF8qZ@g!kpyX{-c5eWmN@`Yu4Wl-uAW#y0D)9X;y2&XXTS^S}0WBkSKRO*u zY)q;7p+MYD*on4B4g>YKdlst5W3lTm49f>q4kFu6@z)0E`+3)qP78`@B-sFftZ)Bv3#;`#zIo&rjFdote=*3wP4Rw>qy-rAt>aNvGAgFNm6SH}OkoW1RT+ ziYbD*OaWn#uGot)JKP;u

r%rrH^)Bk8gceihn69gLb)Rhk%0IQ@!q`Ji2zu;}VHG9(rdf^ya~5wDJb*pR7seJ~vn40-7U z)H)2te4Ompps0I*Bd87GyD_a_tO_w7aWMuKI)gOEcT4MrIpV@aU~{L(ge4P@$)~6z z*}|xQPuGzO{dQ7#yG+2Cb_J8o{v{;hJzE@#aSIi0ecDGsD@_QGtOi-94(r>Vc0PzP z+pn@ndQL|l<2IyEgdNrct}?yn%ptC9i@e*O}af&-1#Ak|JPRAPN zFzb0@Lv}haR zQ&y2=UlQ7BSlc%xV_+0_^@3EJA^fuIu?-8&kni_(PKWT6oiLKasCCFQ&Y8I( zgqxR1_asKv=Wu;>=12=?vk6YrcgCtHOJeWnNRD*e{;k}=yjEQ}3VNnh z3~%spn!b12^ZPPjuX;+WyDxlWz#vHn!Y_pqs&hg+E)}Fk z8jy0vh>rq$eR1px)P7xn;I`#4R`##>)1>n79EAplk(Gyd0ut>5GMzZ4Fk1Y{?Td?N zC8GCH&VweJWj7T{BRWo9<|I#gTVI$7VWpNGcZan(#l52W8pG&|XVS#Q^CRq>PhG;? zo7L0VnO*4)R7X4k<$EHlZ@NpUCgBQ{&|x#|)CqPl$#vg;UgB?e`2;u^D&ccH%F!F1 zkmAZE#GA`bpEprje60M(>nXqarcxdNjg(J&SD{)7Z*`QY^*zBP}$ zfdt!;gv-H%%l-txa4JtiIS>Wo7^YT2=_k-e832qA8vzFs(Qu?0m$i;|+WUmXjD5qd zm7;P}Zh7kV&ez@_yiebLUpH`yy$Agmy88)Ei)p^}JIuRq%LB{ZKGDp-$4qSIYXbizrD!Cj0&DYR9E+tPCfr*X|2`ickass-%I9qbCy|8Y-P z3=suR=d%Uc?o?mw4KMElJ}_Uxyl|^IbZ^C$wKUot>H0 zGF7~5!fI`JJ3R}MCWh!w=R+6w5VEh?aVN5AfFC}5yxI@kzC2yYkpnuFc_=!aU<^O| z62SQkqV%1fTy1)W+Gp>C%LQ>O=0=muJ-MTIW!7W&jG^J?0MnZmEDGm`*qhuvMT1q; zWWI5_QZaihT?~qpC-%=tpR;1B=We7O&AqpO&)xVtO5Z&b8_TrKXUFE1GF47o7Wr^p znMJb^RZbAJMK#A5+hKN^_cxfH-2}R~!T|@=-Hn0z*)1Ex*cUQB!pN5ODXxJ;lb5Q~ z@0Li+YA&UBOExLIV$8AlsqX|`7(zp!|{27bQJqusF@e&>sa>PIVtWqA5H1W)ICPNk5Uh^J#N9|53e zO%|MW)`?QWn9x{wo1fMSLabUsKI)tUHJ4M?X$&qUYsp!lk(2p3UF542zMF;g#*~?n zcSeMxL8a?BIMsNW{B=1W*`$vZ4svM!RQ0v0RRP zWOUfi++~-CE;?$7M{hDlL*u_qtqR02mgGBOoK|7nbAP*cBR#c4NFFQa{G}Mk%mO}@ zJTIs%6{&mzx2PS!|4`O|0s~@2tnP(eXPs!vwu}(A&N`tP&Rh&-`$+1P}34iZE7FtWHcTf06CJpdo(26)GLlt3N2;jjYIttq~yaPI6%T|Z%L zicMXAJN(?JU0yg<&IsjN9A)a;F`@f$k@bWO<_rJhxh;J9526b?D08x-YuRF!R{l=8 z@_~@GS8zP;u5KBzb{WwsNe_@nJT&4|CstfAC0h1iBci{k8Rw(9%z?8|Zzh&X}iqJ=ZWQTdM<>p{xX?~kW8xm*o&w0J37i~0W z<{-WePF&%neV>nJ2;mSPg{HCnTJZGw+vImDjW28Ohq;;LdbshC6b9gq_KqN9*olfl z3?3T($0<0~s_t7&{o{A|^9>B?b&Qcu(wEfbETVhYm;gpN{gu?EiNt(H^F)PeN-9m2 z62X)JP%GAw_HIN51gyEFCkm{oYDjcy(uc#C$i&Gi%9q5qClw~^=7p5?`rT#w_U>v% z4@lxZf~&M>Q2nlg#}**VBc6Y7gwvS>?I78nZC`O#V5{4`ISnel2dAL4=oRc4B|~pu zqE{NMMV>u~PNJgV)RQ8ESf0mfLn->tZC;mSK88m`u2e8!n%J>-0R1m26fT~1X5vty zfypauq8Z7}xD7?lXj!G`5zqV~9475dC~0Pdm@lTWXA~8ODFk4w*Z!F=CxX9)-dV`( zVUdiot$yTajM`aj)>ln*4>{!hDs1x8u2__AgjhcH-f&cR`zddG0%@ydbfIPR32SRh z;fa#}ydZ&|1o6h3tTUY_R?cs%YFwr>h&|^}t<`7rc%e5Fc6RJ|>}Cbb&+p{K$|c-W zUwkFKv`EUCoC8`9asDP(9;Eeyjo(7>pzF@$rXq^l|=fxQ>tjrnWL}p(W>chnX&ds*ybh-iOs<1kAaC7mtbw{8twDoB5zjL ziGK@+rW+h`ytb?XUc0`p^M2fafnvTz3=kMCra0R63!W)$oU1E21eGjwI2?^Q^m;x- zY*)ssbfaA{J>vF?f=Fczh+6-Kr>1-G0`i#an|0jiGiLgv1T~u8uVieWTKbN6zQ0F8 zFHQ|KGx-3Pxn_4jZYP65GQl`P^>vAtDE9ceENZ$|RHgE@qE}kOFCmAZ`j-I;j|pa` z0YtceDpwL_cuM&J&co`b$Gu3~cpjCR&6-ES?B6}9zYpcY^?5KQnJA?}Vj#3OFO0lo zIdk*gvC3~Nu8R#0PMAQ8iKq{i5W>WbS;@`Vhr~Q37pXnjBQbato?+Y!b*Ysnm&6z-DTpZt>vr ze!&B*gVE`D#+3e&6s8=!K!7c)l3x#6XYY;2xVdMBr#>wU_mLaYkPHe-!VZ<3A8HoB zxBi|nJaJRFr0#!V9ky*#CZ&(4;6o&Nh@+*Yo9|mw%5j8Td+89g+yzevaQtF$$j>~g za%t&A)_A|VZ|zLXNp+u-tB>4{cVB=75d*LC+j0iucHbx7Bt$=zu}0s9lwbVus7SCH z4#f);h3RABx5&v!Fcq9aPvZoJph436PA@^NV#0LSaZ2ILFO97RpLhkI+W*?$!#y;G zY5Zt%ae)Muu%6LW(-I%(>YWPKX8lymLjuEHo+G4}6g|?N6fRJyQ?QS8b&3e2BH+iQ zlyC#i&=Xe$N_8sq!F_&d5=1q_-S>pf(Hz@J^9c3)?Qs(#pM@ZsD7P|i>-;lW+@N2R zA5Fu&diHtZq`;FLLcabegT-F-n)DDsg6Qz5FV0KM5u7pi+vriGHkP|i=kO=*R>{MH@l&UUBRRF&~tF`u*v3NZjIJ~VGEP!!HC=-W> zNB0SH1c+nWhHpW}lDDLGat{f6rrnJMu~L4n&inAf3j7{CUP*f3(me-nZY$zt77W+qt;HHpvmFxH9JGZ$8 z207xw+{GlA+>4SEO-f%GOu&zMN4f!(R?{zSU;22=+W9sU9E${8Tstlo*j+e#y_LXn zxv4gg$%tuoe}%n&ceJK#+^Cp2;}TzP@2leBjnBuX+Bh4^*p(|jjw6eNUYtNv_R=-x zT#dxLN^WQ{M$FD+phMr6SDt&MW-e1d~g(Ou?TKghpBk~7+8l^3`f6u zowlMqeZ;ApP>I4Mfy{EsDfNiI$s$Vt%s;KZId3(i;I(b6U5@veFZDiww#6uIGn5hA8TiXZl*d{c_f8Hz9+q&+gsa{l+fl zhj3q8a^V}_aDd9uxj2a_2-SKbr&ONDi}IN);(R<&($%bMhIz()hFRn<$Y+Ar1chT; zv4_WKn9$4? ztGI7GqHYoJa1WFLGMKPQ!G=RgsP>DKh~f5voq_E;3IGK#6_))%Hcl^BMXe`@*`!kSQ^EPmE)ET^rd&|(7*EO z&!o80uK^9%*+Odsp{kPkiE~je1%*PTC70Jw{xG+Sz~Ex@u(%AmA4`lX`R0*A_$rs=%I zq4H5ry(5S7fn4`;OS4O;;!p$wtv5|QeOVwDF#?;kxp~hZmlC_A|P=u`6 zZf&61@3^5=9>r2{R)V7+G01cp)b~j*E;hZ=*h92TrWCNO$C61{-Y^c&f{@%h^!9W9 zE)Bpn<8!$6PN454{8?tA_R|6`#dK9BGtSmAR+QDrtqGnxD1PlY%30XPZh4QY*z71z z0yPvmpzCwd;!Z1DrtNRvR*wYaiompU*8w2t$)3{B4Zm*WOP6RPrI@L=86G*7NMydp zw?fAQ#tvgu2sw|97k@x>rzS?<*z1w|0By|#tv)GaFNuj;=JWp#SlVg31hVCecaudF z51#$Vozp<}vLh0e&mY*JMUJSg`;%_4=I^MDZ2~Beo07nPlfvcy6JUp%bfac?%1TXQ z>J4+%V2teXJU!zr3kGiUCs6x*B4pd0m!ls|pUD<>Yq z%DZejD+*so+I=4#XOZ-+@A;SZueb(F&pb2+8b@VkZNY8%g#J!RTa-y^X#!?6zC&{_ z2LBIPZvhoou&fKiFu1!zaCdhL7F>e66N0;CaDqF7I|K<9EVu-BcMI+g!TC7}_doBx zH*3vWMepvf%er@Os-|{L`Ve}Y7?)5xs|eQnI>%fi<1eJF#~6O_?0cSnTJ#G3WP-zL z`o9L_%vzii>@4q_pe0kF}boK<(`gb&rn@aU3gDJ ziVY+dY|ry+zoKxKSyC>{pt!R&|DE(4Qx zCl?$*UzEU>9V$)HXs@VBZ{`dkQhY&c8IAK8OkxZAQQUq}dsOq6}d2itcX zg5NEZ=<;?^#O)HMHqKUbdV02@wGeY>U)+2IjU+y0iflw#q55#BcZ!;}ZTSlZ683L? z9x5#9{rQ_T#61sffy5O3a+G-yD(%FWLdw;2kaaV-N~!oF7|55ZE3z#RgyBN?)KO)S z>mE9ep)tB>_i2@`V`L@3Q|ZD$l4iL6bxLer2W1$9Nk}dN4IkaU6HsA{JGsS-&k`&mwzEw zF3FE!>ANr_Yd`(mshPtyE@k)`*K((hV`{{_*W!C9Vao#R`nGkaCJpA$=%xF?wE`ax@=-|Lt~2ek`V>&vu1wB=;N! z$LJ6Yu^{1~PjmoPt~~9kxKeJzIB1Qj*X5ch3&~gyx**Ogr6v5d>T{^WvY6?NVySYo zRkasUz`3+bh8F;4KViBetEgsLX;1H35NQ(ED%~s2K!qg`$sjj-^GWC$#y4lRpuHq} zQe;LTgj3NUZ$YY%T8BGSV_d_Nsx~cqv=GM=yIYBxsc6XvXkhJejtJ A>~<1$Mg?yJ$3EL#SB!pUFG#DZO`mHqb774oB2v`93dy!?-`lB*FcT(`|7})G5n)J z_46G?#Rj7sl5Q3e(!?dz>6wg#z#K2El~SOambMa0oh+Fryk~$nJYV~uu1WG>1eZw- z>cQCkorXKKIHFEI(OqFtQWLHW7t%BB%=Tyq0#mIZRs# zeidu2vt7MOB9TF+vF6sa2WPSS5tHT0HW$a@TT9n46Bez%J{f((xQm^(N|qI`Hu}$= zn&1#z3;RN{9Rj0d=459&ZQY=Eknc&--{Ad z+8p5^{98z~J!ww)ClI95l_|gIQ=CP|Kz6=x;jigz+C1TW>T63a3{Wn^%&rUgo?&Zu zZI4XQy|{gf_0V*@J1=;c8^%ZqVAkC(NDdjXK4O$=G)UZ^LSdo%f{9Yd!tpU_wG|>v$lDm zK#%(B-3K9>H8~KYWE<~zhB0o39j$lt&}9JOrC!T+kX7?c%jY|+HoPegIS+V#Goq-alsR(lI5hh zzUWL-Z1Ow9${H)aRn6Z*kv{KtmDORbi3ih^aiqUMU3>$PfhtHo?Oi&IkD`@2*YEdE zVEtB?oFH zS5XjRU=RD3-gWw0Keapfy!SIV$oras2LJVvw7;3S@)Nz^u+&6Jz0)qpkeyv0_u#O{ zi)$s}=jAcT@g^)*t`RVzfKbQQI}DSksq_aA^N1^1a+R5_h_eu38W0&+u6Lre=hTKd z+dQbqHZr^Glb?EhmjK^+DCZ#%`)SHHeX7ru`Uh869#4KjqGV_64aaAiOy;tA6zL#^(e${xM z#66(b9bH@@xbsxRjru*e%9RN}%vriAxH46@n^usq@>Fu+WQ$xSVEO){C6$P}Zf0IhVnO&UV7wC7t;j=^la?#8{{+l~4uE6vsV;m#k85 z%(ePGNRL!zZO@uqQwdk%TFe9_D18{%0~C^wpZaJLC;Xmq*120%NRz01H!LNKMX|R= z;*>>kB0|qo5UI8|D@`*pMA>K{Ly~lgpCT3N44s5Eej2vKBPy-{M@RyUFPkRDG9f7y ze_zd7wk;$@VkkyR0Dl7Q%0noST6kSj;UmHYGDZqh!|X+K`g7A1Zr&RpSdT=SDYGz4 zzZPrw6(OagEmvrI&qG;?dJ$)AQMk*K`~8NU{0YO4VJWxv`znmKytut_)>zC|Q6>*d z%qNX%ydkf9B6FKW1a~W)a}9n7uRugG`J<5@8N4I-#IRaW~9=w?tqtA zLEg5#ZDYo(rt=&?;R<5{Z<20Z)vQk?OT$NWS9&bTehDMV_M{d!*A^B^EEYFu3Tt!o zXpmF)AJj@IQ&WZAk)1QwEtEv;ZaPIw?b=$w_&th*DZiEbqBr<^V-KFn;1t3PB_Un{ z%Cd2s>y_AdO^r9Db25xYyWTuMp$XCuW({ljUzk1wu*xEtH& za;n5K@Fbo-s(x)G%Cz(pduxWqJ5Y;(EV382%c!GExNw%@T-m;pFZnIM{GUCTGms0# z@i@8{!I-6MqQQ*Ko?2`2bH$uWOf-D9uq@Wz_4*+-n=DTRluJZP$x=7K_Xn?hLj;A3 zUPg{UH-Vt3SBcdOVNZ!y0YeoaNZu=@!s&B?<~~-R z6afnk9`jAWX*Q4EQ9im!NzL2}3P|ZXbSIpNc6xi)M(;}-wb*t))lr=dQY%fl2S>7v zb$Px~h3|lHa2@zE+GRuUCyTp4i#}kLnYMq^PmDp|99-ufXxLuFw*KQ`8!Flcts7~b zU_7GvJ+f6pJ@-E3G=3hf=>f|KZiLwWib>e9I(SxyGWq~Vu0fR>6cU4c0xC9r!3mkd zjQ+%QwJa4E%Y3C+a)IxQcfr=6^}XwPFyoBqt3aUV@38&UPhL5!$|>-($ajcPYNbc| z{fypv&+vG^jPcDgw4DqfC~xa0dgt6#6f=*<=bSS>;fEsW)MmOh?j~3SzRwm*7ETY@ zN3_ao!wZ?DQZH$jhCLjzY6CqBXXaD}Z8U}}&T9TbYl7+aWLhbx%x}KJSq%9T`dUGy zE!b^8J;%qcX!pAO1ZF@Xk%<)OX*RW8+b)RS$jBdt0!AgXoEYHL6lN3#h-HcnMK&De ze`wMY4yX(tv6&0kA6#6IgqU?^+Z>y8|5!IQ>ksNt>g5 z)U|Y$_vvc>oYO1Y;=6OGIkKvuX4eSMnh9gC>NeDO|AeB|pjEF=w6cpkag}NP1$KDs zB|c|UMZ_+^Aj~4Mz(AalK>@CH@yE9wCyxkorLgT46G{C$H^*U(KKrHFnaiTp9Rz|) z3DkSL@4tmOKdeQ#F2jJxE+z0<{xr|YQL82|8z&C3euw7ZVMxOdDWvQ1%`(P|$;kFR zoBt-Uri`xz-=7X8BzwYT(1^*gxZTU~-7SyuLJsTk%ZppJ)2zd3xz8#0_GI}2#5k%1 zm9RM9y~^NJOku|T79rl<7MX;vR0877t&_vqNh60 zEwMC`NB!WIe--wY!1zDngg=KG<88PFEqCr(Id+tWwQY|E6Z9&ya zOcESVwp@AT<}zGumTeEO*~jFhPdxC#TO>hi$@eWbsn7uuRL{ZCO+`MvRH;hN-KrQiIYb=Bt(`YUfbb=`f%rb!2ljqj?Kk*dzTJG zrm$((C<{9RI4TNs-F@9UXm*ZH@0UJ5;yK;LB$kWFk}dk&MJ^kC<(Miq@5CKJMx_B| zcO~`<43}?Mg0_`1{Ii|DNEA(WXYWQ}@W-X z3)4f+2y;a^I|7Rf<+?xQzMD!2&oU`GRadQcio+j{67drpC5r~$AxpNx+DuFEk;qaA zhWC1MDxBY1htMRH3N5(Q(#Z6AI9V0afC&UWYkLz;d#56E0=MO~3;TVE@@wlTM-9L{w@0!aMWqI>=YBRTd&) za4F9kpyAQ$87{O*SI_~vf=$aokSP{VK;hblOGr+0$&^*%*~h0Ankv{$z4A#gFqu3} zyHZV9wVUjdzfY6}eV)WsxQ~`y)rG9FVZD-#H$u}(( zc=OJ56$};#C%`D^m`qN-K>fGQ;eVjN*n3?SNMv<$9_DdNOPY#wgPfWPk#UAF_MPKx$rQnl~RkA_hv-S0L^>q&h&6RFXHKdEr zquvPv^6a!X5BI)XZOs|ZCw%Rf&AY3=C%!3V034v73qi)nP6Ugr%p;K2C>k}X;|_2< zWgaCk*nFvtlD~!=Y=S;jR&?5&=^!(CWO6o?d9;S`FXwI`6X0y3AoHw`vaZthu2PPq ze{7MIpg4isEWhwg=d=g!5dRnv;A%m1mv!ciq##(0`tw?=EBsIJ`4?o|@J=Zo(KOUg zKM6@y*~mc#zFIxfT@LC#wFJ`VY{O+XS}87i&T6lZB8{>fWjSr` z?QC|GpD8#p=GS@at<7fXi}#m)I7-`(b*vsX*VBE)8bI=>NWw4b@3NywxQ>i$n5uHN z!23fxZduFif_#OA+}!YaQ&~=+B*WIOR&T*gi7y@W@$h@(cDbf9zRgO>yXoTsd1%*G zjozcN!ccklW;V0*jo1Xvqs$PS0bUXO3n@k&yJOeo-$5J}79o13%d!QkZlg6vpT!s7 zXP-*A!9FZkI?Z2U>0zax%Gt1PA0BZgWNoSna$0y$AgEKgJCv=JITH6RZU4+i3Ll~q zsg>aaee}&vVmqq9?{WSBm4cTJpJ$$R(PY%?gfXX6-{{sVDzc70Fd=NpSg9^#glvh# zvik#crwy&vYemUtLM`1aw}2jzlq;QzobsKYK|op?+r`JMOS~y6#FADfgHDJXUew^)E6rw8J8(xnu)a)Td%SM~JlAnVFKIxy7-7r__j41g1DGp+YIS}zA5T%5yMWh_J^ezV05QEz$tX`jeaQRn3E>9 zsaEXSb&)p-Ka|f0U+bAhcH=v$E;P~0vvfT@W@rT^@C(Pls%K1|zayDEhhF}+XLxuO6*b4^Obw4H|Hzn1m4^vVPu-4kjHwA7h!cX^ag-Pblp&n!VjzNqO zEcSlv>MG|H#3H>)E{|9|?Cv6no4fp9{Atu5Rr@M|H+k#zNCW6w3xtE(ZuG`p7S!96 z2+Kzvioqd$UIr>g;voT9puW4g$rB8Aw*mj5!GWP09qs!c>>57R&?L#zhUmIwzvphF zroXfQ5ZLxSTjGn5?5i4-LC`^H8Ur0L;-0p$fMpSe;TxM$eH&9g$?0$YUfumEBo%*6 zPv9-3-%hQyfV>QvKD{pJYk}t<)tNG1x-%QYQP%u z;k7G@mb0ioN=P?$ziVpa-!Hh_VqK|zpS7Nxs&I9ipo@rk6s1d-u-y{E_8D}M&7*q8 zV(JJQmHO!{R6eY)F^zPkc)_^hK)rlh(`@9~yokY&x4CA6diSWcPbnr1kX=cm@vzc-s}~ zl4Np3)#~BAFCQDWh%#3Db$SN!hPLt6n{&)}n$QZdB{o4*+3Br`pCDV3jdr3+BN!~o zmxQKHtBv|xuck7d!Y!rU!Ljw5d5AF8vwpOvZg?q2bmE>pE8g3b{fBnlbIxXrhiYh4 zZFu{Ko_k%{kvjIx(c;v->r;~w-iJs*kj-Qb1@_CkqSk1RG(yw;g~S0+ie1BdGFh+h z^K&h&>lMwT{RMbe;iA>@ZDR$rW1}y&Z1WeXuDZLGZiMwhMxI@j*q1m^mVtu$0#IZ6 zFE7QH89hFk+a8pOb@>7mruoO1aV<^*?E8TqrQbSJW93RG&sYNoF+U)Fw3d8AEe0f^@8wBi4 zQrpGDzXm%~hJHXduYdUAeevVZl&fQ#z$zh)!#TuH4@h420+3^sErNpYq;(9ZlCd?Y zk8)HfQs>KPzWN@mc+wQ_OBUdZTqCvv6fsFRM$=3XZXCC_tYt zJ}<9Jc|t{+LOXkl~{*KDh;!j3fE_B6h8|vn;VC(jca`iD# z(8|Pgqf?~gr6)TKmZg_x3IRaK_4-eiwuc?xUEdw^)fbNkln&zWxJH{!B-(ltLum#T z2is{;huri?js9aZc6i4ejB~$=ch4bDuYy5y$M+IcPxDJzM{DL)OM*E1_-u)X-j9CX z!l+&b5|ZqD6K>qpGb%{md#d_jpYZ1zys^y;lca zdJ@_EQ22$3@_sz}R?H))z~gax3Ougnk*8+!Ehe8${yJz;nCRd`;eA6jPQSzHoY`)% zuyH*fJ`eSjf@Ue_nm7fK6!E!engHpqrjjSK1&nGhyxu{n88P^ZK%xs2gcPTBqeU_F zDI~%dXZ?^=iut}{p@nQY+wz5IeJV zW(Zq9XIU9^s|GB1IWEgD%kG%u@i|X^rb(I7;{FJ(GTERXRb^CGNWK!x$o{Vj{(Y>G zS$BG?!QQsx3jF7VJcm8dD1Wcwdu@sWUMr{r6T}Y56Dt28C-9xW2T2ooe09D9Oh`&nQd^sk$77bl!Zt= zF@u%Iueh_|E1!S~7m)stJuf*NBlWaymI!NW+_syq<6i1h8%J_IW{N5hcBeizj{$I) zicp?a{E^1070t0dN!7-X2x00*Ub1W~-zh;fAT|@#xk|3zrC^Wv=&K5)FBAPXoV$_m z@rkaGwg|Bb)tJkXKf{(5yvNx$O0MWTx$B*lASRq#_m=9l8W7fw?dV8LMSqaX62cZH zODq9Bj0+=Pah}CG$}Cq3%*h6c{f&n))UNV7!N=2Mj0+lAa;z^r=(&$$`f!MDRkja$ zBbSCDhKGD2n;r4CY+L(?g%{OAZUy$uf%h4S+L7+0LQfUaTJ)KU^gJqCsF^TocT0Wf zYTl-1tn3RIOCYmtjy+5PHnUsBl6S3A$-bsiq9_rcWy?7}eCavjUD9z4pGS`*NRN@} zrJfmwKSz&;58g!DP@|;I10IFrG_Tt$-SY&wyDcvrg&M-xN@m+ZwVxUa`)oo7qV4 z;JGIP`F}Z9#^ol|-zVbbLZIvkJ_Lk~5CjAZm@N*H^wp7YLFzqsFKq+o-05I6ZpJD< zG%Qw1vN9sEE^|0dPFM`P+Mf$6K}jPgKbj!}>Tu+A%Y=>#Z+bO8+vv6=C#nnT*y!5U zl`qcb&8*Ip3LUl2XuP6%+ViBF!B3D3j;5#bT&~Ow5B)I^am)CMQ_7HWMVDoN2B4Wc z7q=dDo@6utZBh1IPwFy`U|1)As2P?e^l0qd#dU;)a}YVSPPHakV=gd3B?pM9}cY*7bsW^`xsy&U}=n zOh7NO&jtyFmzUOtpLp5)Op)fJqfFY6*)}s73u9$7D3j=SF((`Bshd*(e1NPet1)k}hn*7#$?JMh0il3_Bng`e2d94ePN^f&I zPhBPnY|fZHpX~5Y;&(n-ubPg-d%8yjR=TRPw9j>(I-fltKl{a&H25lek+R?N)7W+* zfl@>^K{7&($Wk07)O{UeN@s|WG~IF?UHsFCVf7pRmwWQPg_E2(=TrMHQ;`sA3(XimA_0g zGKVazA+PDw-nqtlYe%Es(}&#Fx9*MHHYRzO2Rhb%RKUePBY+io$NyYkd@W|(Mls^9 zuikGHKJMKw2?JVNC*|Gej~jA*{F>vd?j@4ABR%=3mDcxuL{skar=L&PdNyk#L4Mq* zvSzagNjO!xaKZvs7;rPn*pM7uo;6CF7y%YDYT_h?%-08Emb$zqv zZxF4UcUt~Ab0y2po3D1D+w0^06)998ZPLLRGGDUsDLOjhN`Ad7F^1 z{XFjeMLo@Ct_*H+l3)D$NnBaGi(u~nlxI3M&tHSYOtuU>+?9*fP4Egf5<~Pw@K7}j zn&m@Z)P7Q8!Bc_#iw76dQ!WVe{okGOgo4OBXR}VCjeG(tDTuHhRoYov25?aa=Cg*C zPLTYwKaI$8;zYW1`+DcCioRP;KnliOEnul0YMumNx!z)QMzKTZjd+aX$|$jqRMzq$ zO16?`_0-h##QRSp|LDS3_Up=&FAQ{N=fjMR6j{jg^qUAgC0SstF)&74q{n|7Fjkr z$1=^;%Wm!htIcQ$(0{|ESVTrA#@`f-wU_na)+m@I%E1B&f zxb$0PvM`fZ?-L?>UL-zQ|2DNz;swoP?MJfTNsX=1#v-|UI!<(nN{bRYei;TYhe^M~ zQZfSsL0sA)+@pg;w{ANPmI&p%Pf~wru;7308^VeB0|el>^E+_4RxILv=qMenAc|(- zDVIFXt@z5afC)Po{L3BrS1REk-Z&ZJXF$hMo{CB=VH(B8;VcpxS1Vn-Qy|FIT)@;u zT`$U7Z2N`>cSZb`%m4CNLP8H-ut{hU^AGHt^>IvDMkWIXWeE9m_U*Jf+8jotJ2ccc zIQ~)jL|ME?j;(+odnJc=xQzYS@=Adp&BnY_2ibLb`XppCC09~Qit3NfG{$W`y~B#- z(YU%d+YGv=a!agIuKEU}T~t90?n$Ttle2UNy`1*63=0&GL0!Mkkl~MV;TWY|$vd$J zSkY${cSqSjMwQ@C&8s5(nM+<;vi^u0oH^m}4i6kH1w}XzoMCOj{Pow-+ByxSag`&_ z3DUj0tO5ls)5Qf8v4X9<<+eJ0P9YCZ9b^rHi|C(c4^Hl!hlZDL;+D*y7oyBNdSf%E zWcBaIgn7*Y=qZ)`!*SznG*<%g!dhOcO+8^&edfvmRN>;r@@oagNf_V^R?y%gx(Le$S$aR_Nd9)H8p5?Zdk75cF2UK)YvW4OBR&oT{=nq};77Pt zAoZ?$wV9!9$6NZMqPfHJ1Y?ky&4vUaGw3Wa^blZXCpI7l9iEc1xIEk(sN@c z2l`f5o1JKFfPj$6-!mwp!3 z5dwWW7GSH@g`D`J`(885i!AMPP2h{kh2fof!VC4t%lVo@Q<(5rZ64nNqUa$uhAq9( zBz7v4PcREcF`i3?;Y^d$N1M&r@KKN2W)nF%=U`?a(sSrQ_!SK=3|GZBSn z+;*5Y1C~uq&^fPmQNQ~4#F7j3wh{#OTnT*n8tHPPM0NbZPk&rP6}%!zqyq*dD_W${ zV{J8JWZ(g~MJ%@LJN2z`hjTrL2S+ zMQe6Fd`g|flgs^zJFAVJeLn_Bk^V=j4dCxk5=2$`{``w~6$V&~59wwZqtPL`-MM#=?Y0XC} zc1>1+N|3d)YE2J)sd`<>r#%z~=^%cIPCwz9fL*@4uR7b3!oud*p_}4SC8OvR0-A7H z5g~{_W38p!o@1nx_o$b=O{%Sk7Wn1TFQJz1!?FMcty`m-=+1Bo`8iSYkZ^luv(Vfn5r)1T@*sJwa;Q>1eaVkt>RY;TEyOl|XS(6KT&ZLp7nxD=|>;LcH*;3EdlM~ILx(U*Xd z01R0H?CC}|M)m?`iSHkq<*_wZ0&BB`iRI6!H=gmK&gnB}S} zep?Fpk(TKENMc*B2s83g>PN-!!W=MaXwV0VESAf@H^eGW#vdrIcXGSjb7!fqM>VP_ z9@e)o#|}W0`gmv#{;*Up>$`zut}kdNkVXyX&-8jcwwLc1NmCy$A zCETw2dS=udp1o085$CofCaUCv0JSVMr1~P?^@|jverbf{3 z4O7bp{CVa%nCDuEZOR>4)UN%0o8h*9i&gG4C`r4ndny*PUcdPGE)gXQs(;i$2@ubC z7Mkzm&rWS2DVzJ7O(Dfp7_}cM7fVR@NsnOvxL~Yhz3~qKfpNnx<!140L>Fy01YdnprhQK(_AW$ovB{&|fTH@qv>Hs!B?}0;&l{ zs3*tLC|g2i5ewmj_%=sK$H@$ArW%2T*sDzum&>!qU>IvuK8K-g3wy-F9CtMe8HUtB zphBMdT2ln+h+#Ga16AA88T6Zw3)^PXx{oJNih^YEc;}Tgp{Mm)Z2i_PO;? z%sY$z+)jqeR3}Cbn^5AXJ_O|7XW^>_*a6PAS*^a%dSy-z2v5~c{R@4Al^TpGo@tB9 z_GqwSz&|L7^LJ!VOpYcuJIDf?6Rr4bv?J=q0$bu}-Bk_svtTgsG z!Y>|*jV==N)#pJvT;F0MDeyZsA%luZ@_Xj%gFaZ(DddaMN&Sz?1Vod#!k=J*M-LlxUx`3)mS4c1$rXIN z7JNsDX=T=Qn6NIuW+Dsn%?_%uD@m4G^}>Q)X5Pjx^;IX3K+<$U@fBVa*_oP#@B4}j z|LN`*Pl9{O4w@#c8sZdGlT{@utQ@-O5;hGZefat{i9erkiWYw&z5_q(ed&0hmf9{* zG$~^*9?U`RhDkLQU2WKdOmDFn7~jfVQZj82U#UngB|y_&mEOGXk6OJ=qsJ!=Oo7h~ zyY*D%Ecqk~La~g8vIVM34M?(mb>S(F{8fsf9@qws#}D_HQIl>0pppkx>cco-I&@A z5Ykr6#3uK}pGEPsd8LoKWj4{Ot_)ks&QRY;#`x0hr^Lh@ny;D;s~=zp5PvJ?C|SUp zn83We2NAYkWsL_o1lX~?7KVMT;K&&k#`pC_64S_tJ6ObD9F)fPvh9Ho8e;worC|!4 zFxF)t0;Yodb#n=bWMsfG5~=YghCnCp+W+Y346XM(N%yf2RmIbF1`GdN@lDRgFB-#f ztBW7vLn9DAc%x2;1)eEIWYdMnKj0X$3bJjsra=CWLDVLy$%via2KnS3sO<@#;?QwMx+5<(v!76ZJPmOA8nN>qLHE4R3fT9rP!JD#jB#$OZA7hHRYA$KUwF zq7n6Xi3=r}p44NMYkv}u`M`gXJJ)qfA!72#0;TVG;N-12rJFGbKch3>0={~nZ-URB zE49uo_nuhPNRCf|KL+2sgeaI?*<--j5~ABxQfyP zQ$9XTLy&7;scb6GJPOHi6(Ki$%^HI@r84?H2)UWfXT-aWSqL4-0((c5vSgT)H^Zas zE>aFzP{$N6pQf`rz3Y7uGl#u3gWZI<0v&3VO0%ZV+pv0u=j$TY`fIb81Qo?&csJKD@W5A<-s0HXWr-;skIPPQ*u=l zutqZnR#qMN{Ci5uxdG7nNL*Rtvp+zj;dSbDq@SL2H7FZqUr1*oF6z}fW%0^#F)!DU zbxf5Rp8fgbJ)P%UvhcLn>2_y9%AE{f85HjxV06(*0opKVBsEx$&?L4Mu5?X%Qfc2G z4qZW!Ck^=^DC|E|Ftj$C=no5eQQ&mdT0UDfWn(!75nC}*HhW!#!;DSWJ5P`+^a;TI znJkUBPoK4+t!h!t>cJ7R_Nw`S0?=J2B#DdKl_ONrNZ@~oA$FOJqtK6{@D*~zK!;=f z@$ffsw`op4d+B<$`UrDcpPkO|W=Wio@($%s!=G0mmiJmj7e2IcSKuD&p>2>F&l(6~>C_B|{y z3n45BnF>;Mju&aA5tF?9Peygio~u}gRv)Uu9}W*P=85LF)?mvu%0x7xodCK z`eq5hFSO9za;jJ@{)4;fa+MsC`o6W7X9K&aYGS^^sy^o#6#SjDd1)Yo1=TcYV7IgE zxsQ_*an$am6+KJ90862>Cp=|+2F}G@+U1?7Fv0fRz#1|$SBf&M<{^qPkwi1yY}gikGulFg;1<%(KkF5hVL zEXTtRQnkX}4)I+!yr@BOc?DTw-=xQmWG4)S0!Q2Y^TXU64WI!U2@!LXW_Ee_K4c@m zElM{vbVhA!lUed2JcJkvgvv-(Dm=+o+!@sC+GChS zKG+ju;PO52vi5SvxO~w@@l#}mc?Wr0z?9wCpQTx_XZvR|iHQp|WB9Fsp_DHG%Xvm) z+WGV+ji%BmLnsH)_*e<;=WXq<4elkNn=+drg5#|fk^8%YJ7XBgv|h2&Eyc7Eef&)p z7;|dyo|Z;;p#xj+cluU#U%|vxt%s{W?C&XFMuIO3)zIm6=R5tW15q~qC^Cbg1xMo% zh_LR0`!0d$m(53@cu%*GOLt;xoSo9(Mm?dCDoityais=}d3cN|B&8(0K6F+hssvLb zH=ZM56bsDP)F=5bT(&oO8urzFRZtN^Dhr>piWh29n;guFh>pa%tA~9N1!V<`k!HgX z&hT2(;jY(aB#^h1HCi=$6VMB{+S#|Rn>nG)zv}bYoF|@x)UPf$ldW-*Tde)qNt7*i z4!7teEkBO1VW|bp>we9vSuOUA)pN3FqL!S~kQ3&Lo|mQ>D4TI&+{^!SGx2c0_jE0( zwNJ+{MH(A8UDq%LdzeYGd)~Cs!arr(6oEQXNAhhcL)UPF?jn)smvQoe-2Fbk=!1iA z$u}&O2Z}6J5TB37hv-RZwJSEWwbgRZtjC*swk*}L6fECmwY0p$!p7XTVKohrS&kcz zOoqyeW&IO3;=I(X>XVDc>rF1H967~MTVt?1$NEip{n$xWGwD4FAH4TYT0 zey(?@zV43U!j3E->kgaN=SaSt9TOKr-24*#YV4ko2NFNYmqm&@H|{_|nsq#iM-KS}^tnMO{#djA=Ep|6Hk5+({4;R&I`Ywp6<61JR}wyFutY z8s&_vSu93ind|6b-Sa+faf5j`mqz1{z}`%YBv4i>ivD4CUAYrhhstFO^|dO)r@In! z#YRSAw`u>GhHI4`+d$vA3IdmDSyKOq`Ldpab!T=Slc{U37Uz+Je5F;f1Zedeva+;` zJ3YuTXU{AY#XE@RU=39$UnzkWB5TWuZ)9Uk9$#=6G&b(|1PRXs-zz4mKYT>>^eC+8 zBxaPc94>Qhj%EoVVfo!~h9Y!xc=KiDi(JFn)bXzu)c+k!YN$qs48{B#oNN%Jg0vw5 z{wI9iP$mYc0Q;}?Q3ewGUktqg`y-?*_20--hffI#Bsv6yBrOC4_ut4{uQFDn#PNY34gR?ajQfh*eaKM&@h-C8TW{_N05d!0o#Sq{7VaOn5sIso^_0xM7c6F&G!> zzZiE0gvSc2rAOmWKJ+MiHscC|!`{vKrWTQ}$^KOB^}zyJc+&LWlSesyiHAORV;^T% z@!vV%o!?HA)(hk5t-DJv5K}nk#qk}f+6$I`41#4xl>h#lbkf?l;zV9R)qWuY zBlx>tEV`n-FZ6?Ikfm&LR6?dnw2OO+pQk!JesYzGApIB3Sjf6#XL;XldVkjtssL5j zd!lWQ`9dXH?QFU}g3Tx8vkDX&=@uznGSXi?_I*8ZLYs~!bhcp2lfdI_R zfe42W1@XVRBZUW(sK53bOF%{-`P&721O&i?BRLS!8*~8xgSVMmfq-vhf2RXmQ3GiH zI`)6C|7Qv;u)iPx7w!LsZ|I{2z`_2F;_KGP9n`<-K^qEuE(ah0BXc3XYrtg&bo|o; zc!>qT_a-|lKpN`r7&>a{OzPJu)PZ1BR=C$g1q%SaA(jIm`9G@R0)YSJ4K%n20@mMD zqa_Z2`_};+p$JC_uIvOrCyXGyEzHdK0GhYq{ZatJw=uhNfY5(|V!zAfubHo@(+RJs z(`;bJ_W+`XbR|GL{6F3dv;i7#hWn`lxPDvr)h2*txPKkuYycnL;MZ&c_iyBi10e8? zG;;<}DE{jk(FtgNYyHp-Nc#7_`2SO@@4&Bl^myPZK}1A?|68^95iNLHuP>v=f(K8; z0|~%>+W;gmybvOO!{;G@3GlClsv958qF({qU%zbs#R5ABA))ruGZu-NIV75_791LhV$@=Ymv+ki{JU)#+m zReZ*J?Rg9d9s|P>g5QZEk~gI70Z86@w(J8o{t5pd(^G;wsG#7%V@H5DGp!u~)B(u< zN&kRxZyba66f+~G$Rlm21{Bf=(o8YSfQrg zpryH?s73#o#L*3EgXABnnFQ7T#vDN^)R(upGt!{~{^k02(|QCrzAlojS7(p}pZ|d3 z0{b09AvHK;zVh)8;wBr4@{J_PgR*}^iz|dGd?WcwpnTr!(o_mX4fofAWOer%$UG1b z@%~^Vc4!K4hYTV%I8x!2eU2I^T%Lc>iU&|fZ_vWWP?m3!lw3fmyg@%-L&g462fiU| z)2G)P;SD+1PYuWg9xsG~2KOr=Vl^DxLb;&B|Hs&m_wZ~~;M{a5VX%-gB5Fe|0+8j6 zv0X$U>l-{FI`HXD@kBVlpnpyfU7Ix(gbD$HKn|`nhyCjWBn>XP;pdlb+|0$ou5Qq$R_=t$mpsNG)e;d562fTfgW7zVq(l9~8{y)pTJ@R$AD|15Qf$dnK-?ok~tkBbMy4GNa zo_r%2IiVNcNO*4O#W!-72l@c=ujiHVaWR3wDBRE@;7Vgelm;4p=rG8?JlT*xtB6rR zKsagsy9+7D0`VHo1fW$Y{$4iswq=F?KkOA?2u=9La;`Bn!<&fX=FqDDEJAH_)X(+0 zR_WmW?Fz}Jh$Ib;R?s5Azi@cDm>7Dm`{w^w$92F(bv*y$;COfM(Yq7@MLR1{Dwv74x85^F5686I#)}1to8{*4_d;pNxGKCvWYsyAHJNV>&X?j zo2v6v>^4pJuU780Z_^=P4dl$TYGE9nr*q`2(`V^A1j(9rZ#gr%9SS~XEyoLE^;X?D zny~3T+grq-uJ`rKrJEQ_cj&rtyHxMd-QY+U_v^kO{^1uguV2UUZPBq^roM6SLES6P zwBxXD{&HE|s5h^z9h^0qIRR_~tPiI~N#4f1&eopX7uTm)>nQa&9o{-^FDf=&Ad4>> zjTWy;xBim5{H{!EzEQ)Dk=Czd^yI%DZeETmWavocpGR4jkbN)jzPJ4`Qrt}Ttz$ej zRzWbH%(hmn=r-OusGOWV-c5MMM;zrP{KN&j`w9ce`z}{`S6D(+fmKV$87B$Gul)pD zKH^LD1SO5Q&_IarAi%e=!Vx}0N81RcJTRtr6h7zO+!KUU5(85bg~rrtZ=!IRZ|`G1 z5+0F5ZVw-EBn4-uo=BO51Ew{`ygtG_a>%Av4mf{{4w+#IWs@?I|fKor3H4+-Jf{9$VA) z3lcYe)X6>5P@91$$bWtM|V5yM!D~kb?%zIP4(ktnef0ZSk$(%C+&lDAeO$+g=r# zammxJ2~PZL!4JY%vhbnn0uK=G+w>#i(X5kgpzu$Oe$~?@U*r5+LLxWe^?QP|8;N@M zr*N51_tDqFuXU((yQ?0^1_kRrE@+4|Z`4DijU`R(no7Y6j^;_h#&sV0#$3B=-g zqoTgP0S~mgNPQ(2`dd?dAZ@Nc<(zN%8Znb3@b|@Sn7NBFHb(EqIn&$fm4i#a4*Ez@ z)`=zRO-Z}c$@(97YP7ze{v7W$B2_<>=U119>&rxWjrKf$Eq5G>`aw@=-~BSZ&bU5T zzknQf)R>|9TX5OmuqL;V$=xUEFLJl5J53+Vzjn>jHz3U8^*cIQqjd`<7Arh~b%Fw{ zm^E%&pbyf?TVU?No8MF*@DRO5(}AVc0r0#`FTl*X7=Z$p=^t@aheG{+ZvHc%f52_I zqgZdpM|Gr3U&?2CNV)zVseSnBr+JU9H5zYw+5lv=$9$%@;}ej#ProdTY-M*>U&&El zKG5?71D^k^Z$|W>U-U^_fhkY)JxD5Cs?y&j`tE9+OWBmS+C91CX`|8n>Pw5fx=L?- z=&imLpXoS*;XWOYTz~rV_@_ATa3_r>6#NGpd|>xtJS(Q!8a7ed*tBuTkp8IuPc{(s zi{8)J$jy*T$x_{{8$0^hX*80*MiWAPQVCtbZtK z;(U8dm)jJOY`a235Kod@o-;V}dG2w+@P_9?J?@xVN8B}B=V@x&=Z1ecZ|iDnx1bb9^kBTj^b-R&{$W|zz5pZN1V!Azx5Me@~=k%#B@F; z{}6E&4P;hq`HQ(Yfu&A--2{k^##>?HM(#?}8;dQt*BP6O^(jWfy}sh_a+=U`!rl#f zI5I|T1PPy_XSnwloroP84HDmxT_aM(8(ar5UHp%K)n|%M{A=Bj;%ffYI7aNtKlim%8~Q@iy2ybKpag<~kVQWOK0r{9THBZ_rk;4#kV`xF0LNN4dxK5M`&xl@&}Ylbnr9cZd~S_}D$- zA=)tq+MWDqGOm+kT%$@KW1oHEI-NX)l{aR;?+80UjD&(sk`p`wQ8IQsBzE9H%f1xT z$QhvOxOk9M-+n?o!(A}62@+0t%cw%(F*^o{f1io3bRr(G8P`FxgK z6E{;Lc;4mO+e$QkiW0&V;~S@67ysqbrrZ>rTu6uI&%|%ER!#dk_A&OZ5Z^QkiX7c?ml=@4J<=$|^U!vRt>eQ3M zWr>hjPijHmuI5OdP*zV0qW@m1CneH1ulmvu`ZlY+luF<3*OxNrTjv0&6MZWTkW%Pd zRe&^{z71#~4Ww^}8%Trbn@6D3PrezMp7U$kjPCf0F)$-gN+ROrK*>|PWL43F4t0yF zSJ{X5NVL$pSc)2rUaw&X?1CR!)Mf!(SpIMXh0Su;lK? zF4P$VPPzQ?=KpFm4w~ojIR}g457mWB!HVFDU=+OTAULkD2#3Iil9TDT)}U=e$xVCi zT2bMv(4y1dJHWXx$wnSqtIezZif{wlfg4za37(D3{eLq2-G-8{%*lScEgUtOiEFQ& zit|+k!-dWvQUkJjP6#S8uM*NjrKUwo?mNT3jk!3Rir1Th5ugaeP-7Ly>xZ(qtI?7z zgoa9Pvdr5D++i%Pmpt5y+o;$lK4IudGS?TT--xQs6 zT9{Nv22uS+j7rqWzY!$LY_j)BKkaOeC#|?f_=2J0eB%K7qooLV;b>uiutv(fv~Gk# z7X&a`U0|sTYzvp1XgRH8w7=UDEoHZb1N<6qQNv*O?iKrA!xMv-7bXcRVVx7G6TY5c zzS_mY8oGxo5(kGP>X6>V&;zg3p#)pV1VPa&ha^loC}OL;Ri+w1;=QK5)KHD#^zBss7u$I7C!J*6dz`z z;`15t7&-n+tL-j}ZZrN4G%YVz;-z+73oZC-wSJ9i#|+cM1g@QyDl4Z_msYR=*BC+V zZj4ZRD;cUG1WcBk2Cy*3x+#$aJ&J!=B>AF&R+Bw`L_~T{ddA4ih}yy#r_vFh0r-b? zyoYDHmXg~CA#Q+XbmbY$nfhaT+feC%|CZ-F1VA~9@wpom&2`Oua!#EyOgR7#M1k5%?cp=7H&TlXmaM$lo4KsGc}WC~YallIRDl@0)b$dwVF3pkXUM z;+V+?-oD2Xvj>nU)rc!b6Ms%CKG-K~>|GC{ljPul)th!m7O`G!CDEG#yljOMgL9}k zI7SMQ&9!A~m#MdtG@8h=+7rHaJh7r(9AHC?!GZZ^q}X2C`(;!gjaI!cpT15Ak#U?ga%I5tvpCEPILsK8uvHbr zTF_P!VD??D3*5zpM`Dk}q1Z1fYcQ1D=M1uIm|xN~nx-n$aA?~`>L8D^Pyc%%n^1Hl zipHa*=~JG+?H58``cUg$L+bN3D0SnnLfGbmsDNf4k3zOF^FjJ z9&BX~|Fo0nBmfTWk=FGs(fm@a>>%l#R`?*s&90nw`2mhA2VJ3~O436elqE<_vv%;#{r(SeJ${0AQ1dqg#|~0&+1y|J`1Hm!1WmzN>#PFJl}w1StyIcEMElNTj8&tc?t~ULX9=c}#R&i!n&5OtljC7;b+FvJ-g7 zS^dS?jD>Y^$)a1dRq-GBnDHl*n#(Qk_Q4ryj-j`QifhvYVdkeMVK#8N zi{vaHgW-MX&*RF(atMFY_?R~l(jGr%$21&}QZk>c! z5uXzc--_v|F}tsK?h16`Z*W1hSE;o2F=LH}+%<)MX~o~0q%FUGC&$WGRxyJKS9?HEO%d-I?0dHl&rur2DsY* z=^r8BkUo+XdzR+A*`OXsiik`M$pJ!oDf1NH3u!LVj1~e5dP!lj?&pV`sP`8A)AfU3Gp_@|+;_3G2j|`jOh|8p zdDw~3S};@F*Oi48K-?>!}<|^Hj1`sP+IgkdhxDO(P4yqwJJk`p{oZQxX zTrr)!(bYu{ReNVpnhDDRzV4|+qv?GS&?BAEn!)A1Qh>b7e?5G0jRoWmms~BnfkQv3 zy=)8fGkonGuVgeh_QON(rhbx(3{du+4LU}3e~c4v#uDvCmX#iC`zt={(;o%*%4W0x zNbN5L%OcD#_q7jeM`tk|eW7Hwl{?%q!8~O!>7S5@W&;$jPac5HhvriA+5yVs>|@R1 z0z$&w*8{@F^1ziCkeMEbmSc{p-p&^;CYZDo$wl7rR#+#!mXP%|h7>hx9VkrUdCI@H zS43DL(}(H7vn!+auJg$%#@~h9C2bHQ{C0%3L_x(-E85d!gtZSMBYtaze+zR(?L2D!Ws^jH zvJFc`m{WQv9D)-NIY{z=S*ctRw~C1mo8p~R6AWVN>w@vNCVpF}L+od?BcxNk`}L5CiSx&uG2$ehJraT13TxAU^G8~45^`P7IU3O?Zx|k49UTw z4NAXN`a2gcx4Z3J1Oxtd<4?$wh|4?LFz%}D8;Jl8EyAxq#YK7 z2=HQrLVL$(F?&c2k@qQ#fE?2)?8rE{T zMssq4MXdwiUq)iZkm&$(8%a+7Y#Er#O==%@XLYiM+;KWzI6X?a{I42?7gCP~Si}Bj z+PV-jS_+Uc%!Mem16kD&&Wp7v{2=!AXvBCm46%3U!ohlsG7mmuu>G$QoWK7V$xFsI z7p&ACdi6*dBLYsDFm5x9Yh!qO;8nHWwmhM{$9AiU1v z`GQ;+gF)iMo#mvj3DA=j%{a@Rf7F=a3dcvI=eySWdM5n;JsyWlOt|qE&|DFQ~A4`k;W$5`E2k+m4D*S^#>buL~ z0}0x8f)psTc4}WYhiUyi<}>O?gMovHHEV*BQ?HnS=CU2kn(F`-B-wpnvxJz*8=P>e zWAK@%lgb9w!$?Q8L8$pfAfj~kjk75EI!?EFJ7zoN@R7v7Vxn>zwQnLypOi(-k0(kV zvi^%s&->~P9&3+$RQv93(j3OxlH4Q>?Wz5G6Kkmhuvw^6W04(UwDH^Ezl{D-T&BVM$XEE8|O|B~FoenZY>LES;q0 zJyVomS;3m$og%a1?C8N~s**3n;5TjT8KU`|6-1ahRWZ+UM(cK#EE@c+;0-;dE3_&` z%e+9efNA_Tu*tC7#zzK%kI zU*eDYw)W2VjNc!Q{~*}Z&}PVV#7g`hX%loEZM(;$=`luIev@dUZ{aBHXDFlaoq;sJ zdxSY?2G2f+#P%4s2q$wiUVo|=O!Ge(D^~T)P|mrR7=r#aHUIWnaDh5`d{z^7wh3at zK2nLsP+zeB;R22`B_FINvxbp*N~oHh#}su}NOGZB6FDKg;J(-WEGm@ipwR@W{KFd@ zX5w4Ce4W&FCiV}iFZXAG$PL!cRJNhLjMgK9(dw|E<^}I(Dn_uMg|x;^84WAan(5tO z;4FnUhS5@65hfO@dBJfL?JA?~YC|+!#1cSTJzCfF(9vc#GHhzk7~JTIXX$KYbc*Ah$7Ut24kyeF<-L zz7!<0J{ViKpB>&ctU)~W!uos=V@)8-z0F5OJ%+Ou{M!Y?ag@*V`6Qal=rkHUWtl$Z z`A2g|*!oWtU-;@1gvtGwnz5G78*EK4g+6nTHfk!-I#1Kv$|6X7E~BlULA332r25o+ zl{Fum&zb`P3+&v@TB(ZcOggck>Vr?S%%s_KC91E29di+8AikkuGrrjB;qhF_OSaCx ztptwqo>hs~bpg@_ zR1jwCyWChr+s$aLA5cHfpY*a3R8s=gmb6 zxe+tY#@u#7Z?wVvEx?4prsC9NLU^)}pDVLEM|&0_%K`jRr&sP(#M*ih--8DJcrxJ; zB0A!Mx`7JyAI`dNk>oC~8FO`FZB&2wZjsbRp6b}{GcK*fIJ6aSgVgh|2oLj%**F*T zbU{_bs1lupMYW5S?e@xIv_`Tkb;dGAd)e7#VX9I_6~c2bh+m@A1m!J3gry;bFa~QI zKgc!AWsbGu-iB!EHlwkDPS>*FK;54~mN<=mU20qHj~L<~yi|Eoo3<3Cx9m&J9{mh9 zaBQhE(^nX6a2nCDOwtaHrt^5P*QH?VJT&Bw7>?CXV-tqK{z6PIQZfyWA5<1~*|=^A zE3CPVl_KgLtqYVclUk9Z-dl!p8|0c))q&S?z9-G_j97RSJ@sE)OzJJ5{=^#mISPMS zhD~ccz-d0mA9W;cFq!yIESLOc2ilqK+_1TwMsvzfqX|?^muAfhsi|z)cL!`L+M$;N z`lQ+)r_TqA6}Tl1TwoAk#tOxROIP4fG)qZTfF zB3CLyX^X`j+67fL81hzfb)WRqFWQZ^iAUS04^!)2!v2*~YjPA;9-=M!gCV$4EoFF- zf*x0dwC_1Br$`E=E+wq_nk_si#`LM82uu0oq``g_HZO9Z<}63i9o{37JWmaG7WeuJ z<3*xV?L2s)3*!%hL#rfjnYG6YZCn7VydBxqufVIl2^woI@fFxdbcKl3il%K=qiiQX z!g}K;)`91171~Zl69S0#VzqKYuwR4CV;i#O`jEUvY9fm_7v>g0j`I!?z#t51A)gL6=XtRe!h;9dQsBqyZg5y@sa@B>q8z zLeLAWZejkWm%in8<&T4X# zU4*(}z*DF6y@nB}TuvLC$wx|V^>!^Dw>Oms;`#Ujwk-S3Ftj$&sw$~v3{CFvljsV5CES62iTR}4 z-xxWIF~X{^JAPTj_=DieV$sDsiRO~(+Wb)kgs;?B^H;bb8&P(45z(-un%|IJWX;uU zYILzHQ373L3DOp=BU)Ao&pABo|7cN;ZosY-)ai*w39)`xqFC}JLl8@Apf@R1%$ZV( zv}Wau76g7sd)%+=bpS5x>F!ovD(e{vzOGK5+2Sq%|bvds^=`HW`VO*GU>g7erS zFEVrWc5PqD-Anvf%3ae}k~Se$+`$@hu&leTj1`jdW~m+e{YIQSweR0NT!a6wO_Gni zpaNYyPv)TYX5f!{mv048o0VNYd$Z(e@ds;=tL~#{xDT*Zd*mAi8w}e{@pUSzVXhOe zt;UtJHPpbOabDH4s~oY;Tq4@za%F|tZo%d!-%<0GYZ&W$Y*gZHE~6FxuLc|zk=KYV z+lx}(e~-yaD|`^a?a%bVH1`JUBp>kbntnZZ`|{h@OY$&mSfJ~xO>yff@uzIXgAS`k zhy1N5yW|CI*eZEYOV~Eav$e dirs = new Vector(); - dirs.add(new File(obDir, "/src-db/database/model/")); - File modules = new File(obDir, "/modules"); - for (int j = 0; j < modules.listFiles().length; j++) { - final File dirF = new File(modules.listFiles()[j], "/src-db/database/model/"); - if (dirF.exists()) { - dirs.add(dirF); - } - } - File modulesCore = new File(obDir, "/modules_core"); - for (int j = 0; j < modulesCore.listFiles().length; j++) { - final File dirF = new File(modulesCore.listFiles()[j], "/src-db/database/model/"); - if (dirF.exists()) { - dirs.add(dirF); - } - } + addDirectory(dirs, obDir, "/src-db/database/model/"); + addModuleDirectories(dirs, obDir, "/modules"); + addModuleDirectories(dirs, obDir, "/modules_core"); File[] fileArray = new File[dirs.size()]; for (int i = 0; i < dirs.size(); i++) { fileArray[i] = dirs.get(i); @@ -485,4 +473,22 @@ private void enableConstraints(Platform platform) { } } } + + private void addDirectory(Vector dirs, String baseDir, String subPath) { + File directory = new File(baseDir, subPath); + if (directory.exists()) { + dirs.add(directory); + } + } + + private void addModuleDirectories(Vector dirs, String baseDir, String modulePath) { + File modulesDir = new File(baseDir, modulePath); + File[] moduleFiles = modulesDir.listFiles(); + + if (moduleFiles != null) { + for (File moduleFile : moduleFiles) { + addDirectory(dirs, moduleFile.getAbsolutePath(), "/src-db/database/model/"); + } + } + } } From 89846f266566c66a95f7e6914b89962008c4e786 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 10 Nov 2023 22:15:28 +0100 Subject: [PATCH 09/23] :zap: Update version to 23.3.2 --- build.gradle | 4 ++-- .../src-db/database/sourcedata/AD_MODULE.xml | 6 +++--- src-db/database/sourcedata/AD_MODULE.xml | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 71cba086..d1af216e 100644 --- a/build.gradle +++ b/build.gradle @@ -35,9 +35,9 @@ dependencies { } -final String CURRENT_VERSION = "23.3.1" +final String CURRENT_VERSION = "23.3.2" final String NEXT_RELEASE = "23.4.0" -final String NEXT_HOTFIX = "23.3.2" +final String NEXT_HOTFIX = "23.3.3" final String DEV_URL = "https://repo.futit.cloud/repository/maven-snapshots/" final String PROD_URL = uri("https://maven.pkg.github.com/etendosoftware/etendo_core/") diff --git a/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml b/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml index 73bb6568..ace62d55 100644 --- a/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml +++ b/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml @@ -6,7 +6,7 @@ - + @@ -20,8 +20,8 @@ - - + + diff --git a/src-db/database/sourcedata/AD_MODULE.xml b/src-db/database/sourcedata/AD_MODULE.xml index 1f3a17ae..bc2e3a36 100644 --- a/src-db/database/sourcedata/AD_MODULE.xml +++ b/src-db/database/sourcedata/AD_MODULE.xml @@ -6,7 +6,7 @@ - + @@ -21,9 +21,9 @@ You may obtain a copy of the License at support@etendo.software or in the legal - + - + From 88f55bf91d54470071b1bf2ee0d26cf8b545339a Mon Sep 17 00:00:00 2001 From: Valeria Garcia Date: Mon, 20 Nov 2023 13:22:03 +0000 Subject: [PATCH 10/23] Feature ETO-261: Add update.database task execution in pipelines --- pipelines/unittests/Jenkinsfile | 11 +++++++---- pipelines/unittests/JenkinsfileOracle | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pipelines/unittests/Jenkinsfile b/pipelines/unittests/Jenkinsfile index 3875d0b2..7bb08a42 100644 --- a/pipelines/unittests/Jenkinsfile +++ b/pipelines/unittests/Jenkinsfile @@ -130,10 +130,13 @@ spec: sh './gradlew prepareConfig --info --stacktrace' sh 'curl -o apache-tomcat-8.5.75.tar.gz https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.75/bin/apache-tomcat-8.5.75.tar.gz' sh 'tar -xvf apache-tomcat-8.5.75.tar.gz -C $WORKSPACE' - sh './gradlew setup --info' - sh './gradlew expandModules --info' - sh './gradlew install --info --stacktrace' - sh './gradlew smartbuild --info' + sh """ + ./gradlew setup --stacktrace + ./gradlew expandModules --stacktrace + ./gradlew install --stacktrace + ./gradlew update.database --stacktrace + ./gradlew smartbuild --stacktrace + """ sh '$WORKSPACE/apache-tomcat-8.5.75/bin/catalina.sh start ' sh 'sleep 1m' env.STATUSTEST = "1" //flag to indicate if any test failed diff --git a/pipelines/unittests/JenkinsfileOracle b/pipelines/unittests/JenkinsfileOracle index eb5d56d5..32c3a3d9 100644 --- a/pipelines/unittests/JenkinsfileOracle +++ b/pipelines/unittests/JenkinsfileOracle @@ -148,10 +148,13 @@ spec: sh './gradlew prepareConfig --info --stacktrace' sh 'curl -o apache-tomcat-8.5.75.tar.gz https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.75/bin/apache-tomcat-8.5.75.tar.gz' sh 'tar -xvf apache-tomcat-8.5.75.tar.gz -C $WORKSPACE' - sh './gradlew setup --info --stacktrace' - sh './gradlew expandModules --info --stacktrace' - sh './gradlew install --info --stacktrace' - sh './gradlew smartbuild --info --stacktrace' + sh """ + ./gradlew setup --stacktrace + ./gradlew expandModules --stacktrace + ./gradlew install --stacktrace + ./gradlew update.database --stacktrace + ./gradlew smartbuild --stacktrace + """ sh '$WORKSPACE/apache-tomcat-8.5.75/bin/catalina.sh start ' sh 'sleep 1m' echo 'Build of Etendo Core Finished' From cfc379321b5686d96d363b70f29c40e7087e3dba Mon Sep 17 00:00:00 2001 From: Valentin Vivaldi Date: Tue, 21 Nov 2023 15:56:59 -0300 Subject: [PATCH 11/23] Issue #192: Validation for UIPattrn in Backgrnd Process EPL-750: Validation to prevent new ().execute(pb); error. --- src-db/database/sourcedata/AD_MESSAGE.xml | 12 ++++ .../BackgroundProcessUIPatValidation.java | 68 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/org/openbravo/event/BackgroundProcessUIPatValidation.java diff --git a/src-db/database/sourcedata/AD_MESSAGE.xml b/src-db/database/sourcedata/AD_MESSAGE.xml index c6d816d4..049d690a 100644 --- a/src-db/database/sourcedata/AD_MESSAGE.xml +++ b/src-db/database/sourcedata/AD_MESSAGE.xml @@ -18148,6 +18148,18 @@ Do you want to enable the Heartbeat and continue?]]> + + + + + + + + + + + + diff --git a/src/org/openbravo/event/BackgroundProcessUIPatValidation.java b/src/org/openbravo/event/BackgroundProcessUIPatValidation.java new file mode 100644 index 00000000..6185f4e4 --- /dev/null +++ b/src/org/openbravo/event/BackgroundProcessUIPatValidation.java @@ -0,0 +1,68 @@ +package org.openbravo.event; + + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.hibernate.criterion.Restrictions; +import org.openbravo.base.exception.OBException; +import org.openbravo.base.model.Entity; +import org.openbravo.base.model.ModelProvider; +import org.openbravo.base.model.Property; +import org.openbravo.client.kernel.event.EntityNewEvent; +import org.openbravo.client.kernel.event.EntityPersistenceEvent; +import org.openbravo.client.kernel.event.EntityPersistenceEventObserver; +import org.openbravo.client.kernel.event.EntityUpdateEvent; + +import org.openbravo.dal.service.OBCriteria; +import org.openbravo.dal.service.OBDal; +import org.openbravo.erpCommon.utility.OBMessageUtils; +import org.openbravo.model.ad.domain.ModelImplementation; +import org.openbravo.model.ad.ui.Process; + + +import javax.enterprise.event.Observes; + +public class BackgroundProcessUIPatValidation extends EntityPersistenceEventObserver { + private static Entity[] entities = { + ModelProvider.getInstance().getEntity(Process.class) }; + protected Logger logger = Logger.getLogger(this.getClass()); + + @Override + protected Entity[] getObservedEntities() { + return entities; + } + + public void onUpdate(@Observes EntityUpdateEvent event) { + if (!isValidEvent(event)) { + return; + } + doCheck(event); + } + + + public void onSave(@Observes EntityNewEvent event) { + if (!isValidEvent(event)) { + return; + } + doCheck(event); + } + + private static void doCheck(EntityPersistenceEvent event) { + Property propBackground = event.getTargetInstance().getEntity().getProperty(Process.PROPERTY_BACKGROUND); + Property propUIPattern = event.getTargetInstance().getEntity().getProperty(Process.PROPERTY_UIPATTERN); + if (((boolean) event.getCurrentState(propBackground)) + && StringUtils.equalsIgnoreCase((String) event.getCurrentState(propUIPattern), "S") + && notHasProcessClasses(event)) { + throw new OBException(OBMessageUtils.messageBD("BackgndProcessValidationUIPat")); + } + } + + private static boolean notHasProcessClasses(EntityPersistenceEvent event) { + String processId = (String) event.getTargetInstance().getId(); + OBCriteria modelImplCrit = OBDal.getInstance().createCriteria( + ModelImplementation.class); + modelImplCrit.add(Restrictions.eq(ModelImplementation.PROPERTY_PROCESS + ".id", processId)); + return modelImplCrit.setMaxResults(1).uniqueResult() == null; + } +} + From 5772fcd816b10d4e5d7135920dfbde5cff0c9121 Mon Sep 17 00:00:00 2001 From: Ruben Rafael Danielle Date: Tue, 21 Nov 2023 16:20:09 -0300 Subject: [PATCH 12/23] Issue #251: Fix error that caused a discount to be applied twice EPL-1111 --- src/org/openbravo/erpCommon/ad_callouts/SL_Order_Amt.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/openbravo/erpCommon/ad_callouts/SL_Order_Amt.java b/src/org/openbravo/erpCommon/ad_callouts/SL_Order_Amt.java index c477681e..1835dfb7 100644 --- a/src/org/openbravo/erpCommon/ad_callouts/SL_Order_Amt.java +++ b/src/org/openbravo/erpCommon/ad_callouts/SL_Order_Amt.java @@ -72,7 +72,7 @@ protected void execute(CalloutInfo info) throws ServletException { to avoid errors when applying custom discounts using the discount field. Check EPL-512 for more information. */ - boolean cancelPriceAd = true; + boolean cancelPriceAd = StringUtils.equals(info.getStringParameter("inpcancelpricead"), "Y"); Order order = OBDal.getInstance().get(Order.class, strCOrderId); Product product = OBDal.getInstance().get(Product.class, strProduct); From 1d151bf954f83354504de7e12da4a607d71e5133 Mon Sep 17 00:00:00 2001 From: Valeria Garcia Date: Thu, 30 Nov 2023 17:22:24 +0000 Subject: [PATCH 13/23] Hotfix ETO-267: Fix tests pipelines issues with Java Version --- pipelines/unittests/Jenkinsfile | 359 +++++++++++++----------- pipelines/unittests/JenkinsfileOracle | 375 ++++++++++++++------------ 2 files changed, 408 insertions(+), 326 deletions(-) diff --git a/pipelines/unittests/Jenkinsfile b/pipelines/unittests/Jenkinsfile index 7bb08a42..6aba528c 100644 --- a/pipelines/unittests/Jenkinsfile +++ b/pipelines/unittests/Jenkinsfile @@ -5,6 +5,7 @@ pipeline { } environment { + // gradle.properties variables CONTEXT_NAME = 'etendo' BBDD_SID = 'etendo' BBDD_PORT = '5432' @@ -16,20 +17,30 @@ pipeline { NEXUS_PASSWORD = credentials('nexus-admin-passwd') GITHUB_USER = 'etendobot' GITHUB_TOKEN = credentials('github-read-package-token') - JAVA_HOME = '/opt/java/openjdk/' LANG = 'en_US.UTF-8' - CATALINA_HOME = "${WORKSPACE}/apache-tomcat-8.5.75" + ACCESS_TOKEN = credentials('access_token') EMAIL_ADDRESS = credentials('email_builds') + URL_REPO = 'https://github.com/etendosoftware/etendo_core' + URL_REPO_GIT = 'git@github.com:etendosoftware/etendo_core.git' COMMIT_AUTHOR_NAME = sh(returnStdout: true, script: "git log -1 --pretty=format:'%an'").trim() COMMIT_AUTHOR_EMAIL = sh(returnStdout: true, script: "git log -1 --pretty=format:'%ae'").trim() - POSTGRES_VERSION = '14' + + SUCCESS = "SUCCESS" + FAILED = "FAILED" + UNSTABLE = "UNSTABLE" + + // Stack + JAVA_HOME = "/usr/lib/jvm/java-11-openjdk-amd64" + TOMCAT_URL = "https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.75/bin/apache-tomcat-8.5.75.tar.gz" + TOMCAT_FOLDER = "apache-tomcat-8.5.75" + POSTGRES_VERSION = "16" } agent { kubernetes { - label 'jenkins-node-core-unittests' + inheritFrom 'jenkins-node-core-unittests' defaultContainer 'jnlp' yaml """ apiVersion: v1 @@ -51,7 +62,7 @@ spec: type: '' containers: - name: compiler - image: futit/etendo_compiler:1.0.10 + image: etendo/compiler_jenkins:1.0.6 ports: - name: ssh containerPort: 22 @@ -107,46 +118,55 @@ spec: stages { stage('Build Environment') { steps { - script { - try { - sh 'printenv' - sh 'chmod a+x ./pipelines/unittests/build-update.sh' - sh './pipelines/unittests/build-update.sh etendo_core pending "Starting build" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' - sh """ - echo -e "context.name=${CONTEXT_NAME}\n - bbdd.sid=${BBDD_SID}\n - bbdd.port=${BBDD_PORT}\n - bbdd.systemUser=${BBDD_SYSTEMUSER}\n - bbdd.systemPassword=${BBDD_SYSTEMPASS}\n - bbdd.user=${BBDD_USER}\n - bbdd.password=${BBDD_PASSWORD}\n - nexusUser=${NEXUS_USER}\n - nexusPassword=${NEXUS_PASSWORD}\n - githubUser=${GITHUB_USER}\n - githubToken=${GITHUB_TOKEN}\n - allow.root=true\n - org.gradle.jvmargs=-Xmx3g -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8" > gradle.properties - """ - sh './gradlew prepareConfig --info --stacktrace' - sh 'curl -o apache-tomcat-8.5.75.tar.gz https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.75/bin/apache-tomcat-8.5.75.tar.gz' - sh 'tar -xvf apache-tomcat-8.5.75.tar.gz -C $WORKSPACE' - sh """ - ./gradlew setup --stacktrace - ./gradlew expandModules --stacktrace - ./gradlew install --stacktrace - ./gradlew update.database --stacktrace - ./gradlew smartbuild --stacktrace - """ - sh '$WORKSPACE/apache-tomcat-8.5.75/bin/catalina.sh start ' - sh 'sleep 1m' - env.STATUSTEST = "1" //flag to indicate if any test failed - sh 'echo Build Succesful' - env.STATUSBUILD = "1" - } catch (Exception e) { - echo 'Build of Etendo Core FAILED' - currentBuild.result = 'FAILED' - error('Build Etendo Core FAILED!') - env.STATUSBUILD = "0" + container('compiler') { + script { + try { + sh 'printenv' + sh 'chmod a+x ./pipelines/unittests/build-update.sh' + sh './pipelines/unittests/build-update.sh etendo_core pending "Starting build" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' + sh "wget -O apache-tomcat.tar.gz $TOMCAT_URL" + sh "tar -xvf apache-tomcat.tar.gz -C $WORKSPACE" + env.CATALINA_HOME="${WORKSPACE}/${TOMCAT_FOLDER}" + env.CATALINA_BASE="${WORKSPACE}/${TOMCAT_FOLDER}" + withCredentials([sshUserPrivateKey(credentialsId: 'my-credentials', keyFileVariable: 'keyfile')]) { + sh "GIT_SSH_COMMAND=\"ssh -i ${keyfile} -o \"UserKnownHostsFile=/dev/null\" -o \"StrictHostKeyChecking=no\"\" git clone --branch $BRANCH_NAME $URL_REPO_GIT" + } + dir('etendo_core') { + sh """ + echo -e "context.name=${CONTEXT_NAME}\n + bbdd.sid=${BBDD_SID}\n + bbdd.port=${BBDD_PORT}\n + bbdd.systemUser=${BBDD_SYSTEMUSER}\n + bbdd.systemPassword=${BBDD_SYSTEMPASS}\n + bbdd.user=${BBDD_USER}\n + bbdd.password=${BBDD_PASSWORD}\n + nexusUser=${NEXUS_USER}\n + nexusPassword=${NEXUS_PASSWORD}\n + githubUser=${GITHUB_USER}\n + githubToken=${GITHUB_TOKEN}\n + allow.root=true\n + org.gradle.jvmargs=-Xmx3g -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8" > gradle.properties + """ + sh """ + ./gradlew prepareConfig --info + ./gradlew setup --info + ./gradlew expandModules --info + ./gradlew install --info + ./gradlew update.database --info + ./gradlew smartbuild --info + """ + } + sh "$WORKSPACE/$TOMCAT_FOLDER/bin/catalina.sh start" + sh "sleep 1m" + env.STATUSTEST = "1" //flag to indicate if any test failed + sh 'echo Build Succesful' + env.STATUSBUILD = "1" + } catch (Exception e) { + echo 'Build of Etendo Core FAILED' + currentBuild.result = FAILED + error('Build Etendo Core FAILED!') + env.STATUSBUILD = "0" + } } } } @@ -155,7 +175,7 @@ spec: sh './pipelines/unittests/build-update.sh etendo_core pending "Build successful" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' } failure { - sh './pipelines/unittests/build-update.sh etendo_core pending "Build failed" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' + sh './pipelines/unittests/build-update.sh etendo_core failure "Build failed" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' } } } @@ -169,37 +189,41 @@ spec: } steps { sh './pipelines/unittests/build-update.sh etendo_core pending "Run test suites" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' - script { - try { - sh './gradlew test --tests org.openbravo.test.WebserviceTestSuite --info' - publishHTML([ - allowMissing: true, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/reports/tests/test', - reportFiles: '*.html', - reportName: 'WEB SERVICES TESTS REPORT', - reportTitles: '' - ]) - } catch (Exception e) { - echo 'Exception occurred: ' + e.toString() - echo '....TEST WEBSERVICE FAILED....' - currentBuild.result = 'UNSTABLE' - unstable('Web Service Test Failed') - env.STATUSTEST = "0" - publishHTML([ - allowMissing: false, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/reports/tests/test', - reportFiles: '*.html', - reportName: 'WEBSERVICES TESTS REPORT', - reportTitles: '' - ]) + container('compiler') { + script { + dir('etendo_core') { + try { + sh './gradlew test --tests org.openbravo.test.WebserviceTestSuite --info' + publishHTML([ + allowMissing: true, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/reports/tests/test', + reportFiles: '*.html', + reportName: 'WEB SERVICES TESTS REPORT', + reportTitles: '' + ]) + } catch (Exception e) { + echo 'Exception occurred: ' + e.toString() + echo '....TEST WEBSERVICE FAILED....' + currentBuild.result = UNSTABLE + unstable('Web Service Test Failed') + env.STATUSTEST = "0" + publishHTML([ + allowMissing: false, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/reports/tests/test', + reportFiles: '*.html', + reportName: 'WEBSERVICES TESTS REPORT', + reportTitles: '' + ]) + } + sh "$WORKSPACE/$TOMCAT_FOLDER/bin/catalina.sh stop" + sh './gradlew --stop' + } } } - sh '$WORKSPACE/apache-tomcat-8.5.75/bin/catalina.sh stop' - sh './gradlew --stop' } } //___________________________________________________________________________________________ @@ -214,21 +238,25 @@ spec: } } steps { - script { - try { - sh './gradlew --stop' - sh 'sed -i "s/bbdd.sid=etendo/bbdd.sid=\${BBDD_SID}/g" gradle.properties' - sh 'cat gradle.properties' - sh './gradlew setup --info' - echo 'Creating Database...' - sh './gradlew install --info --stacktrace' - sh './gradlew smartbuild --info' - echo 'Database Cleaned' - } catch (Exception e) { - echo 'Clean Database FAILED' - currentBuild.result = 'FAILED' - error('Clean Database FAILED!') - env.STATUSBUILD = "0" + container('compiler') { + script { + dir('etendo_core') { + try { + sh './gradlew --stop' + sh 'sed -i "s/bbdd.sid=etendo/bbdd.sid=\${BBDD_SID}/g" gradle.properties' + sh 'cat gradle.properties' + sh './gradlew setup --info' + echo 'Creating Database...' + sh './gradlew install --info' + sh './gradlew smartbuild --info' + echo 'Database Cleaned' + } catch (Exception e) { + echo 'Clean Database FAILED' + currentBuild.result = FAILED + error('Clean Database FAILED!') + env.STATUSBUILD = "0" + } + } } } } @@ -237,7 +265,7 @@ spec: sh './pipelines/unittests/build-update.sh etendo_core pending "Restart successful" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' } failure { - sh './pipelines/unittests/build-update.sh etendo_core pending "Restart failed" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' + sh './pipelines/unittests/build-update.sh etendo_core failure "Restart failed" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' } } } @@ -250,33 +278,37 @@ spec: } } steps { - script { - try { - sh './gradlew test --tests org.openbravo.test.StandaloneTestSuite --info ' - publishHTML([ - allowMissing: true, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/reports/tests/test', - reportFiles: '*.html', - reportName: 'STANDALONE TESTS REPORT', - reportTitles: '' - ]) - } catch (Exception e) { - echo 'Exception occurred: ' + e.toString() - echo '....TEST STANDALONE FAILED....' - currentBuild.result = 'UNSTABLE' - unstable('Standalone Test Failed!') - env.STATUSTEST = "0" - publishHTML([ - allowMissing: false, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/reports/tests/test', - reportFiles: '*.html', - reportName: 'STANDALONE TESTS REPORT', - reportTitles: '' - ]) + container('compiler') { + script { + dir('etendo_core') { + try { + sh './gradlew test --tests org.openbravo.test.StandaloneTestSuite --info ' + publishHTML([ + allowMissing: true, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/reports/tests/test', + reportFiles: '*.html', + reportName: 'STANDALONE TESTS REPORT', + reportTitles: '' + ]) + } catch (Exception e) { + echo 'Exception occurred: ' + e.toString() + echo '....TEST STANDALONE FAILED....' + currentBuild.result = UNSTABLE + unstable('Standalone Test Failed!') + env.STATUSTEST = "0" + publishHTML([ + allowMissing: false, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/reports/tests/test', + reportFiles: '*.html', + reportName: 'STANDALONE TESTS REPORT', + reportTitles: '' + ]) + } + } } } } @@ -290,33 +322,37 @@ spec: } } steps { - script { - try { - sh './gradlew test --tests "com.etendoerp.*" --info' - publishHTML([ - allowMissing: true, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/spock-reports/', - reportFiles: '*.html', - reportName: 'SPOCK TESTS REPORT', - reportTitles: '' - ]) - } catch (Exception e) { - echo 'Exception occurred: ' + e.toString() - echo '....TEST SPOCK FAILED....' - currentBuild.result = 'UNSTABLE' - unstable('Spock Test failed!') - env.STATUSTEST = "0" - publishHTML([ - allowMissing: false, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/spock-reports/', - reportFiles: '*.html', - reportName: 'SPOCK TESTS REPORT', - reportTitles: '' - ]) + container('compiler') { + script { + dir('etendo_core') { + try { + sh './gradlew test --tests "com.etendoerp.*" --info' + publishHTML([ + allowMissing: true, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/spock-reports/', + reportFiles: '*.html', + reportName: 'SPOCK TESTS REPORT', + reportTitles: '' + ]) + } catch (Exception e) { + echo 'Exception occurred: ' + e.toString() + echo '....TEST SPOCK FAILED....' + currentBuild.result = UNSTABLE + unstable('Spock Test failed!') + env.STATUSTEST = "0" + publishHTML([ + allowMissing: false, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/spock-reports/', + reportFiles: '*.html', + reportName: 'SPOCK TESTS REPORT', + reportTitles: '' + ]) + } + } } } } @@ -333,17 +369,24 @@ spec: } } steps { - withCredentials([sshUserPrivateKey(credentialsId: 'my-credentials', keyFileVariable: 'keyfile')]) { - withCredentials([usernamePassword(credentialsId: "etendo_bot_credentials", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) { - sh """ - git config user.name "$GIT_USERNAME" - git config user.email "$GIT_USERNAME" - """ - sh './pipelines/unittests/build-update.sh etendo_core pending "Deploying snapshot" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' - sh 'echo version.ts=\$(date +\"%s\") > version.properties' - sh './gradlew publishCoreJar --info' - sh 'git tag \"v\$(grep version.ts version.properties|cut -c 11-)\" -m \"Release SNAPSHOT \$(grep version.tag version.properties|cut -c 13-)\"' - sh 'GIT_SSH_COMMAND=\"ssh -i ${keyfile}\" git push $GIT_URL \"v\$(grep version.ts version.properties|cut -c 11-)\"' + sh './pipelines/unittests/build-update.sh etendo_core pending "Deploying snapshot" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' + container('compiler') { + script { + dir('etendo_core') { + withCredentials([sshUserPrivateKey(credentialsId: 'my-credentials', keyFileVariable: 'keyfile')]) { + withCredentials([usernamePassword(credentialsId: "etendo_bot_credentials", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) { + sh """ + git config user.name "$GIT_USERNAME" + git config user.email "$GIT_USERNAME" + """ + sh './pipelines/unittests/build-update.sh etendo_core pending "Deploying snapshot" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' + sh 'echo version.ts=\$(date +\"%s\") > version.properties' + sh './gradlew publishCoreJar --info' + sh 'git tag \"v\$(grep version.ts version.properties|cut -c 11-)\" -m \"Release SNAPSHOT \$(grep version.tag version.properties|cut -c 13-)\"' + sh 'GIT_SSH_COMMAND=\"ssh -i ${keyfile} -o \"UserKnownHostsFile=/dev/null\" -o \"StrictHostKeyChecking=no\"\" git push $GIT_URL \"v\$(grep version.ts version.properties|cut -c 11-)\"' + } + } + } } } } @@ -357,7 +400,7 @@ spec: } } } - post{ + post { always { script { if (env.STATUSBUILD == "1") { @@ -432,4 +475,4 @@ __________________________________________________________ """ } } -} +} \ No newline at end of file diff --git a/pipelines/unittests/JenkinsfileOracle b/pipelines/unittests/JenkinsfileOracle index 32c3a3d9..57adf732 100644 --- a/pipelines/unittests/JenkinsfileOracle +++ b/pipelines/unittests/JenkinsfileOracle @@ -5,6 +5,7 @@ pipeline { } environment { + // gradle.properties variables CONTEXT_NAME = 'etendo' BBDD_SID = 'orclcdb' BBDD_PORT = '5432' @@ -16,20 +17,28 @@ pipeline { NEXUS_PASSWORD = credentials('nexus-admin-passwd') GITHUB_USER = 'etendobot' GITHUB_TOKEN = credentials('github-read-package-token') - JAVA_HOME = '/opt/java/openjdk/' - CATALINA_HOME = "${WORKSPACE}/apache-tomcat-8.5.75" TZ = 'UTC' LANG = 'en_US.UTF-8' EMAIL_ADDRESS = credentials('email_builds') + URL_REPO = 'https://github.com/etendosoftware/etendo_core' COMMIT_AUTHOR_NAME = sh(returnStdout: true, script: "git log -1 --pretty=format:'%an'").trim() COMMIT_AUTHOR_EMAIL = sh(returnStdout: true, script: "git log -1 --pretty=format:'%ae'").trim() - ORCL_VERSION = '19c' + + SUCCESS = "SUCCESS" + FAILED = "FAILED" + UNSTABLE = "UNSTABLE" + + // Stack + JAVA_HOME = "/usr/lib/jvm/java-11-openjdk-amd64" + TOMCAT_URL = "https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.75/bin/apache-tomcat-8.5.75.tar.gz" + TOMCAT_FOLDER = "apache-tomcat-8.5.75" + ORCL_VERSION = "19c" } agent { kubernetes { - label 'jenkins-node-unittests-orcl' + inheritFrom 'jenkins-node-unittests-orcl' defaultContainer 'jnlp' yaml """ apiVersion: v1 @@ -51,7 +60,7 @@ spec: type: '' containers: - name: compiler - image: futit/etendo_compiler:1.0.10 + image: etendo/compiler_jenkins:1.0.6 ports: - name: ssh containerPort: 22 @@ -100,71 +109,79 @@ spec: branch 'develop' } steps { - script { - sh """ - curl -O https://etendo-deploy.fra1.digitaloceanspaces.com/java/oracle-sqlcli-V1022102-01.tar.gz - tar xfz oracle-sqlcli-V1022102-01.tar.gz 2> /dev/null - chmod a+x sqlcl/bin/sql - """ - sh """ - echo "BEGIN - FOR r IN (select sid,serial# from v\\\$session where username='${BBDD_USER}') - LOOP - EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid || ',' || r.serial# || ''' immediate'; - END LOOP; - END; - / + container('compiler') { + script { + try { + sh """ + curl -O https://etendo-deploy.fra1.digitaloceanspaces.com/java/oracle-sqlcli-V1022102-01.tar.gz + tar xfz oracle-sqlcli-V1022102-01.tar.gz 2> /dev/null + chmod a+x sqlcl/bin/sql + """ + sh """ + echo "BEGIN + FOR r IN (select sid,serial# from v\\\$session where username='${BBDD_USER}') + LOOP + EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid || ',' || r.serial# || ''' immediate'; + END LOOP; + END; + / - DROP USER ${BBDD_USER} CASCADE; - commit; + DROP USER ${BBDD_USER} CASCADE; + commit; - exit; " > kill.sql - """ - sh './sqlcl/bin/sql sys/${BBDD_SYSTEMPASS}@db19c-oracle-db.oracle:1521/ORCLCDB AS SYSDBA @kill.sql' - } - sh 'printenv' - echo 'Building Etendo Core' - script { - try { - sh """ - echo "context.name=${CONTEXT_NAME}\n - bbdd.rdbms=ORACLE\n - bbdd.driver=oracle.jdbc.driver.OracleDriver\n - bbdd.url=jdbc:oracle:thin:@db19c-oracle-db.oracle:1521:orclcdb?oracle.net.disableOob=true\n - bbdd.sid=${BBDD_SID}\n - bbdd.systemUser=${BBDD_SYSTEMUSER}\n - bbdd.systemPassword=${BBDD_SYSTEMPASS}\n - bbdd.user=${BBDD_USER}\n - bbdd.password=${BBDD_PASSWORD}\n - bbdd.sessionConfig=ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-YYYY' NLS_NUMERIC_CHARACTERS='.,'\n + exit; " > kill.sql + """ + sh './sqlcl/bin/sql sys/${BBDD_SYSTEMPASS}@db19c-oracle-db.oracle:1521/ORCLCDB AS SYSDBA @kill.sql' + + sh 'printenv' + echo 'Building Etendo Core' + sh "wget -O apache-tomcat.tar.gz $TOMCAT_URL" + sh "tar -xvf apache-tomcat.tar.gz -C $WORKSPACE" + env.CATALINA_HOME="${WORKSPACE}/${TOMCAT_FOLDER}" + env.CATALINA_BASE="${WORKSPACE}/${TOMCAT_FOLDER}" + + sh "git clone --branch $BRANCH_NAME $URL_REPO" + dir('etendo_core') { + sh """ + echo "context.name=${CONTEXT_NAME}\n + bbdd.rdbms=ORACLE\n + bbdd.driver=oracle.jdbc.driver.OracleDriver\n + bbdd.url=jdbc:oracle:thin:@db19c-oracle-db.oracle:1521:orclcdb?oracle.net.disableOob=true\n + bbdd.sid=${BBDD_SID}\n + bbdd.systemUser=${BBDD_SYSTEMUSER}\n + bbdd.systemPassword=${BBDD_SYSTEMPASS}\n + bbdd.user=${BBDD_USER}\n + bbdd.password=${BBDD_PASSWORD}\n + bbdd.sessionConfig=ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-YYYY' NLS_NUMERIC_CHARACTERS='.,'\n - nexusUser=${NEXUS_USER}\n - nexusPassword=${NEXUS_PASSWORD}\n - githubUser=${GITHUB_USER}\n - githubToken=${GITHUB_TOKEN}\n - allow.root=true\n - org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8" > gradle.properties - """ - sh './gradlew prepareConfig --info --stacktrace' - sh 'curl -o apache-tomcat-8.5.75.tar.gz https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.75/bin/apache-tomcat-8.5.75.tar.gz' - sh 'tar -xvf apache-tomcat-8.5.75.tar.gz -C $WORKSPACE' - sh """ - ./gradlew setup --stacktrace - ./gradlew expandModules --stacktrace - ./gradlew install --stacktrace - ./gradlew update.database --stacktrace - ./gradlew smartbuild --stacktrace - """ - sh '$WORKSPACE/apache-tomcat-8.5.75/bin/catalina.sh start ' - sh 'sleep 1m' - echo 'Build of Etendo Core Finished' - env.STATUSTEST = "1" //flag to indicate if any test failed - env.STATUSBUILD = "1" - } catch (Exception e) { - echo 'Build of Etendo Core FAILED' - currentBuild.result = 'FAILED' - error('Build Etendo Core FAILED!') - env.STATUSBUILD = "0" + nexusUser=${NEXUS_USER}\n + nexusPassword=${NEXUS_PASSWORD}\n + githubUser=${GITHUB_USER}\n + githubToken=${GITHUB_TOKEN}\n + allow.root=true\n + org.gradle.jvmargs=-Xmx3g -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8" > gradle.properties + """ + + sh """ + mkdir -p build/lib/runtime + ./gradlew prepareConfig --info + ./gradlew setup --info + ./gradlew install --info + ./gradlew expandModules --info + ./gradlew smartbuild --info + """ + } + sh "$WORKSPACE/$TOMCAT_FOLDER/bin/catalina.sh start" + sh "sleep 1m" + echo 'Build of Etendo Core Finished' + env.STATUSTEST = "1" //flag to indicate if any test failed + env.STATUSBUILD = "1" + } catch (Exception e) { + echo 'Build of Etendo Core FAILED' + currentBuild.result = FAILED + error('Build Etendo Core FAILED!') + env.STATUSBUILD = "0" + } } } } @@ -181,37 +198,41 @@ spec: } } steps { - script { - try { - sh './gradlew test --tests org.openbravo.test.WebserviceTestSuite --info ' - publishHTML([ - allowMissing: true, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/reports/tests/test', - reportFiles: '*.html', - reportName: 'WEB SERVICES TESTS REPORT', - reportTitles: '' - ]) - } catch (Exception e) { - echo 'Exception occurred: ' + e.toString() - echo '....TEST WEBSERVICE FAILED....' - currentBuild.result = 'UNSTABLE' - unstable('Web Service Test Failed') - env.STATUSTEST = "0" - publishHTML([ - allowMissing: false, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/reports/tests/test', - reportFiles: '*.html', - reportName: 'WEBSERVICES TESTS REPORT', - reportTitles: '' - ]) + container('compiler') { + script { + dir('etendo_core') { + try { + sh './gradlew test --tests org.openbravo.test.WebserviceTestSuite --info ' + publishHTML([ + allowMissing: true, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/reports/tests/test', + reportFiles: '*.html', + reportName: 'WEB SERVICES TESTS REPORT', + reportTitles: '' + ]) + } catch (Exception e) { + echo 'Exception occurred: ' + e.toString() + echo '....TEST WEBSERVICE FAILED....' + currentBuild.result = UNSTABLE + unstable('Web Service Test Failed') + env.STATUSTEST = "0" + publishHTML([ + allowMissing: false, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/reports/tests/test', + reportFiles: '*.html', + reportName: 'WEBSERVICES TESTS REPORT', + reportTitles: '' + ]) + } + } } + sh "$WORKSPACE/$TOMCAT_FOLDER/bin/catalina.sh stop" + sh './gradlew --stop' } - sh '$WORKSPACE/apache-tomcat-8.5.75/bin/catalina.sh stop' - sh './gradlew --stop' } } //___________________________________________________________________________________________ @@ -226,18 +247,25 @@ spec: } } steps { - script { - try { - echo 'Cleaning Database...' - sh './sqlcl/bin/sql sys/${BBDD_SYSTEMPASS}@db19c-oracle-db.oracle:1521/ORCLCDB AS SYSDBA @kill.sql' - sh './gradlew install --info --stacktrace' //run a gradle task - sh './gradlew smartbuild --info' //run a gradle task - echo 'Database Cleaned' - } catch (Exception e) { - echo 'Clean Database FAILED' - currentBuild.result = 'FAILED' - error('Clean Database FAILED!') - env.STATUSBUILD = "0" + container('compiler') { + script { + try { + echo 'Cleaning Database...' + sh './sqlcl/bin/sql sys/${BBDD_SYSTEMPASS}@db19c-oracle-db.oracle:1521/ORCLCDB AS SYSDBA @kill.sql' + dir('etendo_core') { + sh """ + ./gradlew install --info + ./gradlew update.database --info + ./gradlew smartbuild --info + """ + } + echo 'Database Cleaned' + } catch (Exception e) { + echo 'Clean Database FAILED' + currentBuild.result = FAILED + error('Clean Database FAILED!') + env.STATUSBUILD = "0" + } } } } @@ -254,33 +282,37 @@ spec: } } steps { - script { - try { - sh './gradlew test --tests org.openbravo.test.StandaloneTestSuite --info ' - publishHTML([ - allowMissing: true, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/reports/tests/test', - reportFiles: '*.html', - reportName: 'STANDALONE TESTS REPORT', - reportTitles: '' - ]) - } catch (Exception e) { - echo 'Exception occurred: ' + e.toString() - echo '....TEST STANDALONE FAILED....' - currentBuild.result = 'UNSTABLE' - unstable('Standalone Test Failed!') - env.STATUSTEST = "0" - publishHTML([ - allowMissing: false, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/reports/tests/test', - reportFiles: '*.html', - reportName: 'STANDALONE TESTS REPORT', - reportTitles: '' - ]) + container('compiler') { + script { + dir('etendo_core') { + try { + sh './gradlew test --tests org.openbravo.test.StandaloneTestSuite --info ' + publishHTML([ + allowMissing: true, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/reports/tests/test', + reportFiles: '*.html', + reportName: 'STANDALONE TESTS REPORT', + reportTitles: '' + ]) + } catch (Exception e) { + echo 'Exception occurred: ' + e.toString() + echo '....TEST STANDALONE FAILED....' + currentBuild.result = UNSTABLE + unstable('Standalone Test Failed!') + env.STATUSTEST = "0" + publishHTML([ + allowMissing: false, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/reports/tests/test', + reportFiles: '*.html', + reportName: 'STANDALONE TESTS REPORT', + reportTitles: '' + ]) + } + } } } } @@ -297,33 +329,37 @@ spec: } } steps { - script { - try { - sh './gradlew test --tests "com.etendoerp.*" --info' - publishHTML([ - allowMissing: true, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/spock-reports/', - reportFiles: '*.html', - reportName: 'SPOCK TESTS REPORT', - reportTitles: '' - ]) - } catch (Exception e) { - echo 'Exception occurred: ' + e.toString() - echo '....TEST SPOCK FAILED....' - currentBuild.result = 'UNSTABLE' - unstable('Spock Test failed!') - env.STATUSTEST = "0" - publishHTML([ - allowMissing: false, - alwaysLinkToLastBuild: false, - keepAll: true, - reportDir: 'build/spock-reports/', - reportFiles: '*.html', - reportName: 'SPOCK TESTS REPORT', - reportTitles: '' - ]) + container('compiler') { + script { + dir('etendo_core') { + try { + sh './gradlew test --tests "com.etendoerp.*" --info' + publishHTML([ + allowMissing: true, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/spock-reports/', + reportFiles: '*.html', + reportName: 'SPOCK TESTS REPORT', + reportTitles: '' + ]) + } catch (Exception e) { + echo 'Exception occurred: ' + e.toString() + echo '....TEST SPOCK FAILED....' + currentBuild.result = UNSTABLE + unstable('Spock Test failed!') + env.STATUSTEST = "0" + publishHTML([ + allowMissing: false, + alwaysLinkToLastBuild: false, + keepAll: true, + reportDir: 'build/spock-reports/', + reportFiles: '*.html', + reportName: 'SPOCK TESTS REPORT', + reportTitles: '' + ]) + } + } } } } @@ -331,13 +367,16 @@ spec: } post { always { - script { - if (env.BRANCH_NAME == 'develop') { - sh './gradlew --stop' - sh './sqlcl/bin/sql sys/${BBDD_SYSTEMPASS}@db19c-oracle-db.oracle:1521/ORCLCDB AS SYSDBA @kill.sql' + container('compiler') { + script { + if (env.BRANCH_NAME == 'develop') { + dir('etendo_core') { + sh "./gradlew --stop" + } + sh './sqlcl/bin/sql sys/${BBDD_SYSTEMPASS}@db19c-oracle-db.oracle:1521/ORCLCDB AS SYSDBA @kill.sql' + } } } - cleanWs deleteDirs: true } fixed { mail to: EMAIL_ADDRESS, @@ -397,4 +436,4 @@ __________________________________________________________ """ } } -} +} \ No newline at end of file From a066051cb11c488acd6719ce0c7808b34f105fef Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 30 Nov 2023 20:03:57 +0100 Subject: [PATCH 14/23] :zap: Update version to 23.3.3 --- build.gradle | 4 ++-- .../src-db/database/sourcedata/AD_MODULE.xml | 6 +++--- src-db/database/sourcedata/AD_MODULE.xml | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index d1af216e..d9858839 100644 --- a/build.gradle +++ b/build.gradle @@ -35,9 +35,9 @@ dependencies { } -final String CURRENT_VERSION = "23.3.2" +final String CURRENT_VERSION = "23.3.3" final String NEXT_RELEASE = "23.4.0" -final String NEXT_HOTFIX = "23.3.3" +final String NEXT_HOTFIX = "23.3.4" final String DEV_URL = "https://repo.futit.cloud/repository/maven-snapshots/" final String PROD_URL = uri("https://maven.pkg.github.com/etendosoftware/etendo_core/") diff --git a/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml b/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml index ace62d55..fc383a0b 100644 --- a/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml +++ b/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml @@ -6,7 +6,7 @@ - + @@ -20,8 +20,8 @@ - - + + diff --git a/src-db/database/sourcedata/AD_MODULE.xml b/src-db/database/sourcedata/AD_MODULE.xml index bc2e3a36..085afcf0 100644 --- a/src-db/database/sourcedata/AD_MODULE.xml +++ b/src-db/database/sourcedata/AD_MODULE.xml @@ -6,7 +6,7 @@ - + @@ -21,9 +21,9 @@ You may obtain a copy of the License at support@etendo.software or in the legal - + - + From 1315c125303b84faaa8c9b8ed512668902aa6186 Mon Sep 17 00:00:00 2001 From: Isaias Battaglia Date: Thu, 30 Nov 2023 17:11:20 -0300 Subject: [PATCH 15/23] Issue #144: Handle null exception in product param and add test EPL-549 --- .../financial/FinancialUtilsTest.java | 35 +++++++++++++++++++ .../openbravo/financial/FinancialUtils.java | 18 ++++++---- 2 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 src-test/src/org/openbravo/financial/FinancialUtilsTest.java diff --git a/src-test/src/org/openbravo/financial/FinancialUtilsTest.java b/src-test/src/org/openbravo/financial/FinancialUtilsTest.java new file mode 100644 index 00000000..e79c9e2c --- /dev/null +++ b/src-test/src/org/openbravo/financial/FinancialUtilsTest.java @@ -0,0 +1,35 @@ +package org.openbravo.financial; + +import java.util.Date; + +import org.openbravo.model.common.businesspartner.BusinessPartner; +import org.junit.Test; +import org.openbravo.base.exception.OBException; +import org.openbravo.dal.service.OBDal; +import org.openbravo.base.weld.test.WeldBaseTest; +import org.openbravo.model.pricing.pricelist.PriceList; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + + +public class FinancialUtilsTest extends WeldBaseTest { + protected static final String BP_HEALTHY_FOOD = "B3ABB0B4AFEA4541AC1E29891D496079"; + + + @Test + public void testGetProductPriceWithNullProduct() { + // Given + Date date = new Date(); + boolean useSalesPriceList = true; + BusinessPartner healthyFoodBP = OBDal.getInstance().get(BusinessPartner.class, BP_HEALTHY_FOOD); + PriceList priceList = healthyFoodBP.getPurchasePricelist(); + // When + try { + FinancialUtils.getProductPrice(null, date, useSalesPriceList, priceList); + fail("Expected an OBException to be thrown"); + } catch (OBException e) { + assertEquals("@ParameterMissing@", e.getMessage()); + } + } +} diff --git a/src/org/openbravo/financial/FinancialUtils.java b/src/org/openbravo/financial/FinancialUtils.java index 840a6ee3..2597afa3 100644 --- a/src/org/openbravo/financial/FinancialUtils.java +++ b/src/org/openbravo/financial/FinancialUtils.java @@ -71,7 +71,7 @@ public static BigDecimal getProductStdPrice(final Product product, final Date da * ProductPrice to be used. In case a conversion is needed it uses the * {@link #getConvertedAmount(BigDecimal, Currency, Currency, Date, Organization, String) * getConvertedAmount()} method. - * + * * @param product * Product to get its ProductPrice. * @param date @@ -131,7 +131,7 @@ public static ProductPrice getProductPrice(final Product product, final Date dat * Method to get a valid ProductPrice for the given Product. It only considers PriceList versions * valid on the given date. If a PriceList is given it searches on that one. If PriceList null is * passed it search on any Sales or Purchase PriceList based on the useSalesPriceList. - * + * * @param product * Product to get its ProductPrice. * @param date @@ -151,6 +151,10 @@ public static ProductPrice getProductPrice(final Product product, final Date dat public static ProductPrice getProductPrice(final Product product, final Date date, final boolean useSalesPriceList, final PriceList priceList, final boolean throwException, final boolean usePriceIncludeTax) throws OBException { + + if (product == null) { + throw new OBException("@ParameterMissing@"); + } //@formatter:off String hql = "as pp" + @@ -209,7 +213,7 @@ public static ProductPrice getProductPrice(final Product product, final Date dat * Method to get the conversion rate defined at system level. If there is not a conversion rate * defined on the given Organization it is searched recursively on its parent organization until * one is found. If no conversion rate is found null is returned. - * + * * @param date * Date conversion is being performed. * @param fromCurrency @@ -274,7 +278,7 @@ public static BigDecimal getConvertedAmount(final BigDecimal amount, final Curre /** * Converts an amount. - * + * * @param amount * BigDecimal amount to convert. * @param curFrom @@ -343,7 +347,7 @@ public static Currency getLegalEntityCurrency(final Organization organization) { /** * Calculates the net unit price using the C_GET_NET_PRICE_FROM_GROSS stored procedure. - * + * * @param strTaxId * Tax that applies to the price. * @param grossAmount @@ -355,7 +359,7 @@ public static Currency getLegalEntityCurrency(final Organization organization) { * @param quantity * number of units to divide the amount to get the price. * @return the net unit price - * + * * @deprecated Use {@link #calculateNetAmtFromGross} instead */ @Deprecated @@ -380,7 +384,7 @@ public static BigDecimal calculateNetFromGross(final String strTaxId, /** * Calculates the net unit price using the C_GET_NET_AMOUNT_FROM_GROSS stored procedure. - * + * * @param strTaxId * Tax that applies to the price. * @param grossAmount From 41b279751caedeee7fb2e4dcebd01f1ce2530083 Mon Sep 17 00:00:00 2001 From: Isaias Battaglia Date: Thu, 30 Nov 2023 17:38:29 -0300 Subject: [PATCH 16/23] Issue #144:Add FinancialUtilsTest test in StandaloneTestSuite EPL-549 --- src-test/src/org/openbravo/test/StandaloneTestSuite.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-test/src/org/openbravo/test/StandaloneTestSuite.java b/src-test/src/org/openbravo/test/StandaloneTestSuite.java index f2c58703..3a105482 100644 --- a/src-test/src/org/openbravo/test/StandaloneTestSuite.java +++ b/src-test/src/org/openbravo/test/StandaloneTestSuite.java @@ -150,6 +150,7 @@ import org.openbravo.test.xml.EntityXMLIssues; import org.openbravo.test.xml.UniqueConstraintImportTest; import org.openbravo.userinterface.selectors.test.ExpressionsTest; +import org.openbravo.financial.FinancialUtilsTest; /** * This test class is called from the ant task run.all.tests by the CI server. It contains all the @@ -355,6 +356,7 @@ // others DocumentNumberGeneration.class, // GridExport.class, // + FinancialUtilsTest.class, // // Cancel and Replace Tests From 2957d6136479202e9b669b9c2e121731c0c8617a Mon Sep 17 00:00:00 2001 From: Valeria Garcia Date: Thu, 30 Nov 2023 22:58:41 +0000 Subject: [PATCH 17/23] Hotfix ETO-267: Change permission pipelines/unittests/build-update.sh --- pipelines/unittests/Jenkinsfile | 4 +--- pipelines/unittests/build-update.sh | 0 2 files changed, 1 insertion(+), 3 deletions(-) mode change 100644 => 100755 pipelines/unittests/build-update.sh diff --git a/pipelines/unittests/Jenkinsfile b/pipelines/unittests/Jenkinsfile index 6aba528c..8f587dd1 100644 --- a/pipelines/unittests/Jenkinsfile +++ b/pipelines/unittests/Jenkinsfile @@ -35,7 +35,7 @@ pipeline { JAVA_HOME = "/usr/lib/jvm/java-11-openjdk-amd64" TOMCAT_URL = "https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.75/bin/apache-tomcat-8.5.75.tar.gz" TOMCAT_FOLDER = "apache-tomcat-8.5.75" - POSTGRES_VERSION = "16" + POSTGRES_VERSION = "14" } agent { @@ -122,7 +122,6 @@ spec: script { try { sh 'printenv' - sh 'chmod a+x ./pipelines/unittests/build-update.sh' sh './pipelines/unittests/build-update.sh etendo_core pending "Starting build" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' sh "wget -O apache-tomcat.tar.gz $TOMCAT_URL" sh "tar -xvf apache-tomcat.tar.gz -C $WORKSPACE" @@ -379,7 +378,6 @@ spec: git config user.name "$GIT_USERNAME" git config user.email "$GIT_USERNAME" """ - sh './pipelines/unittests/build-update.sh etendo_core pending "Deploying snapshot" $ACCESS_TOKEN $GIT_COMMIT $BUILD_URL' sh 'echo version.ts=\$(date +\"%s\") > version.properties' sh './gradlew publishCoreJar --info' sh 'git tag \"v\$(grep version.ts version.properties|cut -c 11-)\" -m \"Release SNAPSHOT \$(grep version.tag version.properties|cut -c 13-)\"' diff --git a/pipelines/unittests/build-update.sh b/pipelines/unittests/build-update.sh old mode 100644 new mode 100755 From 899f2190f1fdf9a6d3611de9c6bd1212f8a67c4f Mon Sep 17 00:00:00 2001 From: Isaias Battaglia Date: Fri, 1 Dec 2023 08:49:05 -0300 Subject: [PATCH 18/23] Issue #144: Improve exeption message EPL-549 --- src-test/src/org/openbravo/financial/FinancialUtilsTest.java | 2 +- src/org/openbravo/financial/FinancialUtils.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src-test/src/org/openbravo/financial/FinancialUtilsTest.java b/src-test/src/org/openbravo/financial/FinancialUtilsTest.java index e79c9e2c..91d096fa 100644 --- a/src-test/src/org/openbravo/financial/FinancialUtilsTest.java +++ b/src-test/src/org/openbravo/financial/FinancialUtilsTest.java @@ -29,7 +29,7 @@ public void testGetProductPriceWithNullProduct() { FinancialUtils.getProductPrice(null, date, useSalesPriceList, priceList); fail("Expected an OBException to be thrown"); } catch (OBException e) { - assertEquals("@ParameterMissing@", e.getMessage()); + assertEquals("@ParameterMissing@ @Product@", e.getMessage()); } } } diff --git a/src/org/openbravo/financial/FinancialUtils.java b/src/org/openbravo/financial/FinancialUtils.java index 2597afa3..3518389f 100644 --- a/src/org/openbravo/financial/FinancialUtils.java +++ b/src/org/openbravo/financial/FinancialUtils.java @@ -153,7 +153,7 @@ public static ProductPrice getProductPrice(final Product product, final Date dat final boolean usePriceIncludeTax) throws OBException { if (product == null) { - throw new OBException("@ParameterMissing@"); + throw new OBException("@ParameterMissing@ @Product@"); } //@formatter:off String hql = From aba414b31c3d78e2b5c13c80bf48e3f6f5300ea9 Mon Sep 17 00:00:00 2001 From: Isaias Battaglia Date: Fri, 1 Dec 2023 13:02:18 -0300 Subject: [PATCH 19/23] Issue #144:Remove redundant variable EPL-549 --- src-test/src/org/openbravo/financial/FinancialUtilsTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src-test/src/org/openbravo/financial/FinancialUtilsTest.java b/src-test/src/org/openbravo/financial/FinancialUtilsTest.java index 91d096fa..6219752b 100644 --- a/src-test/src/org/openbravo/financial/FinancialUtilsTest.java +++ b/src-test/src/org/openbravo/financial/FinancialUtilsTest.java @@ -21,12 +21,11 @@ public class FinancialUtilsTest extends WeldBaseTest { public void testGetProductPriceWithNullProduct() { // Given Date date = new Date(); - boolean useSalesPriceList = true; BusinessPartner healthyFoodBP = OBDal.getInstance().get(BusinessPartner.class, BP_HEALTHY_FOOD); PriceList priceList = healthyFoodBP.getPurchasePricelist(); // When try { - FinancialUtils.getProductPrice(null, date, useSalesPriceList, priceList); + FinancialUtils.getProductPrice(null, date, true, priceList); fail("Expected an OBException to be thrown"); } catch (OBException e) { assertEquals("@ParameterMissing@ @Product@", e.getMessage()); From 43c0c2b78a4a8a4e74a71fbf49ef60c4ac48c88e Mon Sep 17 00:00:00 2001 From: Pixel Date: Mon, 4 Dec 2023 10:44:14 -0300 Subject: [PATCH 20/23] Issue #232: Fix error when trying to insert an alert rule EPL-1066: Fix error when trying to insert an alert rule --- ...WrongPaymentScheduleDetailsCheckData.class | Bin 25318 -> 25665 bytes ...WrongPaymentScheduleDetailsCheck_data.xsql | 34 +++++++++++++++++- .../WrongPaymentScheduleDetailsCheckData.java | 32 ++++++++++++++++- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/modules_core/org.openbravo.advpaymentmngt/build/classes/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.class b/modules_core/org.openbravo.advpaymentmngt/build/classes/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.class index 5bf66b3b30591131bbbfcd68721e6767832e6576..0fc782c780c1e2e6b4ee19184e701599b00c23b5 100644 GIT binary patch delta 940 zcmYk(Sx8i26bJDCcfKe!bzEvvTf8$)bG5=`!WPq}$tBH6M@Ma=tkh_r4GeoIn1_g> zdi&@l2uz5Iu*GSQC{3+M9}Fs@w5YVzN-`HH>CiakeYl*%J^%0g?!7%NqVa*acvqVp z)F!mQS6+cTySPNlD<~<{99iWKCwIlA&TK8w|6J2lr#5fAzflI$tU$TYWKA0#aThuL zRgzZbaF%Af|A*~!G(ANR+}3b4deT1A^uS56(-PHPQ&gbsFf9lko#N#a%&swAnb|s~ z+iQMk{Wq!U`Wju=HdSk$YDdLxPfb-|7muj21oN2So`ftFH2I{OVT@5}mP6`R+(fnA z7_OQu&sA-VP1Vh;RNG<`!nY+?lzVp6?DSMrm3t~xymdpw|9xCJ3bItklvH)ax&b_$bQyc;Dvr=~oT3{zO*hd%x6nej@r3T+JvHJZ=leL{&-npr z7UQW^1k-&S0I&ri$VCK>`!1|HM&3slM{NkBr--0uh^FT-(hF$x5_72&OQ;Jg=@l=2 zjqUUXHS`u<>c>GE#9{i0qcngMG=y4uhdSy;J@ufGKHxEZ!Wa6Cuk;1O)GNa1o0vg; zB87ek8}*Ac8Wb7yQ`kdjK)7f~xM|qezV;e83cozh!`0LO@<>$8jv9) zktxl{morfy6X22-Y?M}1$S73FXzY@cuwNRXWDM$MEH216+>}$%E~leY#^akbp^x*! zod3o75orYfQ~y90&04^Lxnz>dOyLC^FV4oy z<}&7So6C?(yohvO2t%1@CJjR|o3Sx>O`6E%aeLv-v*-8w?Yrl*-_zJEo;Qiw1|vRV zxtNk0@D&sqQ*sOQjI2qeS$dmpL+jOYA9*3G>O$}|azK;lQL=-onAGcrt zw_*^tA&J|ON`>(}ifmRRhsQ9P$5G4^n8_WO&7D}pU0B0C*u=d!#(k*fe$?>*ns^ZR zco;8u1TS^IL+3knzKh32I8TV)Jc;!H7Qlwdh{oQKtz;*IH3;J=^kF@sc@8nWfLLCH z!Als)%b3UpOk<;d_zITtDps-yLEgs(wqqk7U^ClrfDdtq*HFdls9`f2c>{NN6K~jp zcf5sewu(NyEgZZnl6g<0@V*$wc9FpcBGbk;k#Jm6q3(i<4e7rS9&{d zVdr}d`T&a^$lyn0%P>rp5y+LjkT1hAS4N_YohaugEMphe@iP>^Xv|lfW)IHu8(R1S zkEOtSDbbdf7$!@c0z%9(IQkaccBPIL(2ZJ$v8wwJNn5%u*-ND z(g8~jL56f{NQ#Dx(U4RP8Lc5{D3dOfOE;Fu1gw*ZP|`$=v~XG`;k+D*7CBr)Mrz0? b4N1|EF&dJpA)_@UO+(WEd{d}!-dph#s`c8C diff --git a/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheck_data.xsql b/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheck_data.xsql index 06fffdb2..8b46a0a7 100644 --- a/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheck_data.xsql +++ b/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheck_data.xsql @@ -137,7 +137,39 @@ - ''VO'' AND NOT EXISTS (SELECT 1 FROM c_invoice_reverse WHERE c_invoice_reverse.c_invoice_id = inv.c_invoice_id)')]]> + ''VO'' + AND NOT EXISTS (SELECT 1 FROM c_invoice_reverse WHERE c_invoice_reverse.c_invoice_id = inv.c_invoice_id)' + ) + ]]> diff --git a/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.java b/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.java index 1e279a71..e13a07cb 100644 --- a/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.java +++ b/modules_core/org.openbravo.advpaymentmngt/src-util/buildvalidation/src/src/org/openbravo/advpaymentmngt/buildvalidation/WrongPaymentScheduleDetailsCheckData.java @@ -645,7 +645,37 @@ public static boolean existsReferenceOld(ConnectionProvider connectionProvider, public static int insertAlertRule(ConnectionProvider connectionProvider, String alertRuleId) throws ServletException { String strSql = ""; strSql = strSql + - "INSERT INTO AD_ALERTRULE (AD_ALERTRULE_ID, AD_CLIENT_ID, AD_ORG_ID,ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY, NAME, AD_TAB_ID, FILTERCLAUSE, TYPE, SQL) VALUES (?, '0', '0', 'Y', now(), '100', now(), '100', 'Wrong payment plan on invoiced orders', '263', '', 'D', 'SELECT distinct inv.c_invoice_id as referencekey_id, ad_column_identifier(''C_Invoice'', inv.c_invoice_id, ''en_US'') as record_id, 0 as ad_role_id, null as ad_user_id, ''This invoice belongs to an order that has its payment plan wrong distributed through its invoices. Please reactivate all the invoices related to the order and complete them again.'' as description, ''Y'' as isActive, inv.ad_org_id, inv.ad_client_id, now() as created, 0 as createdBy, now() as updated, 0 as updatedBy FROM (SELECT o.c_order_id FROM c_order o JOIN fin_payment_schedule pso ON o.c_order_id = pso.c_order_id WHERE EXISTS (SELECT 1 FROM c_invoice i JOIN c_invoiceline il ON il.c_invoice_id = i.c_invoice_id JOIN c_orderline ol ON il.c_orderline_id = ol.c_orderline_id WHERE ol.c_order_id = o.c_order_id AND i.docstatus = ''CO'' AND NOT EXISTS (SELECT 1 FROM fin_payment_scheduledetail psd JOIN fin_payment_schedule psi ON psd.fin_payment_schedule_invoice = psi.fin_payment_schedule_id WHERE il.c_invoice_id = psi.c_invoice_id AND psd.fin_payment_schedule_order = pso.fin_payment_schedule_id) GROUP BY il.c_invoice_id HAVING sum(il.linenetamt +coalesce(c_getinvoiceline_taxamount(il.c_invoiceline_id),0)) != 0) AND EXISTS (SELECT 1 FROM fin_payment_scheduledetail psdo WHERE psdo.fin_payment_schedule_order = pso.fin_payment_schedule_id)) o JOIN c_orderline ol ON ol.c_order_id = o.c_order_id JOIN c_invoiceline il ON il.c_orderline_id = ol.c_orderline_id JOIN c_invoice inv ON inv.c_invoice_id = il.c_invoice_id WHERE inv.docstatus <> ''VO'' AND NOT EXISTS (SELECT 1 FROM c_invoice_reverse WHERE c_invoice_reverse.c_invoice_id = inv.c_invoice_id)')"; + " INSERT INTO AD_ALERTRULE (" + + " AD_ALERTRULE_ID, AD_CLIENT_ID, AD_ORG_ID,ISACTIVE," + + " CREATED, CREATEDBY, UPDATED, UPDATEDBY," + + " NAME, AD_TAB_ID, FILTERCLAUSE, TYPE," + + " SQL" + + " ) VALUES (" + + " ?, '0', '0', 'Y'," + + " now(), '100', now(), '100'," + + " 'Wrong payment plan on invoiced orders', '263', '', 'D'," + + " 'SELECT distinct inv.c_invoice_id as referencekey_id," + + " ad_column_identifier(''C_Invoice'', inv.c_invoice_id, ''en_US'') as record_id," + + " 0 as ad_role_id, null as ad_user_id," + + " ''This invoice belongs to an order that has its payment plan wrong distributed through its invoices. Please reactivate all the invoices related to the order and complete them again.'' as description," + + " ''Y'' as isActive," + + " inv.ad_org_id, inv.ad_client_id," + + " now() as created, 0 as createdBy, now() as updated, 0 as updatedBy" + + " FROM (" + + " SELECT o.c_order_id" + + " FROM c_order o" + + " JOIN fin_payment_schedule pso ON o.c_order_id = pso.c_order_id" + + " WHERE EXISTS (SELECT 1 FROM c_invoice i JOIN c_invoiceline il ON il.c_invoice_id = i.c_invoice_id JOIN c_orderline ol ON il.c_orderline_id = ol.c_orderline_id" + + " WHERE ol.c_order_id = o.c_order_id AND i.docstatus = ''CO'' AND NOT EXISTS (SELECT 1 FROM fin_payment_scheduledetail psd JOIN fin_payment_schedule psi ON psd.fin_payment_schedule_invoice = psi.fin_payment_schedule_id" + + " WHERE il.c_invoice_id = psi.c_invoice_id AND psd.fin_payment_schedule_order = pso.fin_payment_schedule_id)" + + " GROUP BY il.c_invoice_id HAVING sum(il.linenetamt +coalesce(c_getinvoiceline_taxamount(il.c_invoiceline_id),0)) != 0)" + + " AND EXISTS (SELECT 1 FROM fin_payment_scheduledetail psdo WHERE psdo.fin_payment_schedule_order = pso.fin_payment_schedule_id)) o" + + " JOIN c_orderline ol ON ol.c_order_id = o.c_order_id" + + " JOIN c_invoiceline il ON il.c_orderline_id = ol.c_orderline_id" + + " JOIN c_invoice inv ON inv.c_invoice_id = il.c_invoice_id" + + " WHERE inv.docstatus <> ''VO'' " + + " AND NOT EXISTS (SELECT 1 FROM c_invoice_reverse WHERE c_invoice_reverse.c_invoice_id = inv.c_invoice_id)'" + + " )"; int updateCount = 0; PreparedStatement st = null; From f094a6e9c0101ec3cf7b59ab1f4a5b852836cbc3 Mon Sep 17 00:00:00 2001 From: Roman Magnoli Date: Mon, 4 Dec 2023 15:34:20 -0300 Subject: [PATCH 21/23] Issue #148: Change the throwed error message. EPL-553 --- .../event/FIN_FinaccTransactionEventListener.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules_core/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/event/FIN_FinaccTransactionEventListener.java b/modules_core/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/event/FIN_FinaccTransactionEventListener.java index b5dc083f..75b12b3a 100644 --- a/modules_core/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/event/FIN_FinaccTransactionEventListener.java +++ b/modules_core/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/event/FIN_FinaccTransactionEventListener.java @@ -32,6 +32,7 @@ import org.openbravo.client.kernel.event.EntityPersistenceEvent; import org.openbravo.client.kernel.event.EntityPersistenceEventObserver; import org.openbravo.client.kernel.event.EntityUpdateEvent; +import org.openbravo.erpCommon.utility.OBMessageUtils; import org.openbravo.model.financialmgmt.gl.GLItem; import org.openbravo.model.financialmgmt.payment.FIN_FinaccTransaction; import org.openbravo.model.financialmgmt.payment.FIN_Payment; @@ -79,8 +80,10 @@ private void validateTransactionType(final EntityPersistenceEvent event) { if ((StringUtils.equals(transactionType, APRMConstants.TRXTYPE_BPDeposit) || StringUtils.equals(transactionType, APRMConstants.TRXTYPE_BPWithdrawal)) && glItem == null && payment == null) { - logger.debug("@APRM_INVALID_TRANSACTION@"); - throw new OBException("@APRM_INVALID_TRANSACTION@"); + if (logger.isDebugEnabled()) { + logger.debug(OBMessageUtils.parseTranslation("@APRM_INVALID_TRANSACTION@")); + } + throw new OBException(OBMessageUtils.parseTranslation("@APRM_INVALID_TRANSACTION@")); } } } From a41f8a50ca0a92a8f7e97acfcb45c2720f6b7680 Mon Sep 17 00:00:00 2001 From: Valentin Vivaldi Date: Thu, 30 Nov 2023 10:18:24 -0300 Subject: [PATCH 22/23] Issue #260: prevent hide message bar when refresh child tab EPL-571 --- .../js/main/ob-standard-view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules_core/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js b/modules_core/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js index 9f97cbc5..a0ec6f61 100644 --- a/modules_core/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js +++ b/modules_core/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js @@ -1698,7 +1698,7 @@ isc.OBStandardView.addProperties({ // at this point the time fields of the record are formatted in local time localTime = true; this.messageBar.hide(); - if (this.parentView) { + if (this.parentView && (this.parentView.entity !== this.entity)) { this.parentView.messageBar.hide(); } From 311c3ad37c83aa728d763d49f4bf7146aad53c5f Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 5 Dec 2023 21:11:28 +0100 Subject: [PATCH 23/23] :zap: Update version to 23.3.4 --- build.gradle | 4 ++-- .../src-db/database/sourcedata/AD_MODULE.xml | 6 +++--- src-db/database/sourcedata/AD_MODULE.xml | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index d9858839..b1a2b918 100644 --- a/build.gradle +++ b/build.gradle @@ -35,9 +35,9 @@ dependencies { } -final String CURRENT_VERSION = "23.3.3" +final String CURRENT_VERSION = "23.3.4" final String NEXT_RELEASE = "23.4.0" -final String NEXT_HOTFIX = "23.3.4" +final String NEXT_HOTFIX = "23.3.5" final String DEV_URL = "https://repo.futit.cloud/repository/maven-snapshots/" final String PROD_URL = uri("https://maven.pkg.github.com/etendosoftware/etendo_core/") diff --git a/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml b/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml index fc383a0b..f40bc210 100644 --- a/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml +++ b/modules_core/org.openbravo.v3/src-db/database/sourcedata/AD_MODULE.xml @@ -6,7 +6,7 @@ - + @@ -20,8 +20,8 @@ - - + + diff --git a/src-db/database/sourcedata/AD_MODULE.xml b/src-db/database/sourcedata/AD_MODULE.xml index 085afcf0..01c2516e 100644 --- a/src-db/database/sourcedata/AD_MODULE.xml +++ b/src-db/database/sourcedata/AD_MODULE.xml @@ -6,7 +6,7 @@ - + @@ -21,9 +21,9 @@ You may obtain a copy of the License at support@etendo.software or in the legal - + - +