From 965920e2652a87a7c3a0b9e801931e73563681c3 Mon Sep 17 00:00:00 2001 From: mwithi Date: Fri, 16 Feb 2024 12:27:31 +0100 Subject: [PATCH 01/86] Remove -SNAPSHOT --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1ad8ad61b4..2510c6820a 100644 --- a/pom.xml +++ b/pom.xml @@ -13,10 +13,10 @@ org.isf OH-gui jar - 1.14.0-SNAPSHOT + 1.14.0 - 1.14.0-SNAPSHOT + 1.14.0 17 UTF-8 5.3.31 From 79ef8e69bcc36a827efc659d6a01fa1df6e6114f Mon Sep 17 00:00:00 2001 From: mwithi Date: Wed, 20 Mar 2024 02:56:04 +0100 Subject: [PATCH 02/86] Update version --- README.md | 2 +- pom.xml | 4 ++-- rsc/version.properties | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 212a5eece7..08113db8cf 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ or any similar SQL database (e.g. MariaDB). ### Launch within IDE -Be sure to have configured properly the classpath for the project (see [5 Installing Open Hospital 1.14.0 in Eclipse EE](https://github.com/informatici/openhospital-doc/blob/develop/doc_admin/AdminManual.adoc#5-installing-open-hospital-1-14-0-in-eclipse-ee)) +Be sure to have configured properly the classpath for the project (see [5 Installing Open Hospital 1.14.1 in Eclipse EE](https://github.com/informatici/openhospital-doc/blob/develop/doc_admin/AdminManual.adoc#5-installing-open-hospital-1-14-0-in-eclipse-ee)) Before running the application, you should generate the config files with the `g)` option, or manually copying and renaming the files `*.dist` files in `rsc/` folder and edit them accordingly: diff --git a/pom.xml b/pom.xml index 71653e26ea..3dca17a8aa 100644 --- a/pom.xml +++ b/pom.xml @@ -13,10 +13,10 @@ org.isf OH-gui jar - 1.14.0 + 1.14.1 - 1.14.0 + 1.14.1 17 UTF-8 5.3.32 diff --git a/rsc/version.properties b/rsc/version.properties index 0f50ca8864..ff246b66b7 100644 --- a/rsc/version.properties +++ b/rsc/version.properties @@ -1,4 +1,4 @@ # This file is not meant to be modified by the user VER_MAJOR=1 VER_MINOR=14 -VER_RELEASE=0 +VER_RELEASE=1 From 37c102cec2570737b4944c970f8f7cc1772f0975 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Wed, 27 Mar 2024 00:02:24 +0100 Subject: [PATCH 03/86] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08113db8cf..d51bf60ba6 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ or any similar SQL database (e.g. MariaDB). ### Launch within IDE -Be sure to have configured properly the classpath for the project (see [5 Installing Open Hospital 1.14.1 in Eclipse EE](https://github.com/informatici/openhospital-doc/blob/develop/doc_admin/AdminManual.adoc#5-installing-open-hospital-1-14-0-in-eclipse-ee)) +Be sure to have configured properly the classpath for the project (see [5 Installing Open Hospital 1.14.1 in Eclipse EE](https://github.com/informatici/openhospital-doc/blob/develop/doc_admin/AdminManual.adoc#5-installing-open-hospital-1-14-1-in-eclipse-ee)) Before running the application, you should generate the config files with the `g)` option, or manually copying and renaming the files `*.dist` files in `rsc/` folder and edit them accordingly: From 3a5619ef52ba5fa19beef6736ae3137dc0dfa4ea Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Wed, 27 Mar 2024 00:02:24 +0100 Subject: [PATCH 04/86] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 212a5eece7..d51bf60ba6 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ or any similar SQL database (e.g. MariaDB). ### Launch within IDE -Be sure to have configured properly the classpath for the project (see [5 Installing Open Hospital 1.14.0 in Eclipse EE](https://github.com/informatici/openhospital-doc/blob/develop/doc_admin/AdminManual.adoc#5-installing-open-hospital-1-14-0-in-eclipse-ee)) +Be sure to have configured properly the classpath for the project (see [5 Installing Open Hospital 1.14.1 in Eclipse EE](https://github.com/informatici/openhospital-doc/blob/develop/doc_admin/AdminManual.adoc#5-installing-open-hospital-1-14-1-in-eclipse-ee)) Before running the application, you should generate the config files with the `g)` option, or manually copying and renaming the files `*.dist` files in `rsc/` folder and edit them accordingly: From ab166a693fe57a6a9d092484e9581b54b5bc598d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 04:37:22 +0000 Subject: [PATCH 05/86] Chore(deps): Bump org.slf4j:slf4j-reload4j from 2.0.12 to 2.0.13 Bumps org.slf4j:slf4j-reload4j from 2.0.12 to 2.0.13. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-reload4j dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 95ec9477e4..5c749dce4e 100644 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,7 @@ org.slf4j slf4j-reload4j - 2.0.12 + 2.0.13 org.igniterealtime.smack From eda28ae7450366a399d38cc9326ab0f2d24bb49c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 04:37:26 +0000 Subject: [PATCH 06/86] Chore(deps): Bump org.apache.maven.plugins:maven-jar-plugin Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.3.0...maven-jar-plugin-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 95ec9477e4..ac28b55325 100644 --- a/pom.xml +++ b/pom.xml @@ -214,7 +214,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.3.0 + 3.4.0 From 28a93da355f480113098de9ed1e2f66724967ff2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 04:37:28 +0000 Subject: [PATCH 07/86] Chore(deps): Bump org.slf4j:slf4j-api from 2.0.12 to 2.0.13 Bumps org.slf4j:slf4j-api from 2.0.12 to 2.0.13. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 95ec9477e4..eaaa4e558c 100644 --- a/pom.xml +++ b/pom.xml @@ -298,7 +298,7 @@ org.slf4j slf4j-api - 2.0.12 + 2.0.13 org.slf4j From 008a7f7b9f2e1632c6aa54dd4a18b7b73f132b76 Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Tue, 16 Apr 2024 17:13:40 -0400 Subject: [PATCH 08/86] OP-1149 Update to Spring Boot 3.2.x (#1979) * OP-1149 Update to Spring Boot 3.2.x * OP-1149 Update to Spring Boot 3.2.x * Update pom.xml update to 1.14.1-SNAPSHOT --- .../eclipse/OpenHospital.importorder | 10 +++--- .../OpenHospital-code-style-configuration.xml | 4 ++- pom.xml | 26 ++------------- rsc/version.properties | 2 +- src/main/java/org/isf/Application.java | 33 +++++++++++++++++++ src/main/java/org/isf/menu/gui/Menu.java | 19 ++++++----- 6 files changed, 55 insertions(+), 39 deletions(-) create mode 100644 src/main/java/org/isf/Application.java diff --git a/.ide-settings/eclipse/OpenHospital.importorder b/.ide-settings/eclipse/OpenHospital.importorder index b86f00e0ab..2d1b06c8a3 100755 --- a/.ide-settings/eclipse/OpenHospital.importorder +++ b/.ide-settings/eclipse/OpenHospital.importorder @@ -1,8 +1,10 @@ #Organize Import Order -#Fri Jul 31 13:21:30 EDT 2020 -5= -4=com -3=org +#Wed Mar 13 13:21:30 EDT 2024 +6= +5=com +4=org +3=jakarta 2=javax 1=java 0=\# + diff --git a/.ide-settings/idea/OpenHospital-code-style-configuration.xml b/.ide-settings/idea/OpenHospital-code-style-configuration.xml index 63a25edc80..6f1e2f5576 100644 --- a/.ide-settings/idea/OpenHospital-code-style-configuration.xml +++ b/.ide-settings/idea/OpenHospital-code-style-configuration.xml @@ -1,4 +1,4 @@ - + - - org.igniterealtime.smack - smack - 3.2.1 - - - org.igniterealtime.smack - smackx - 3.2.1 - org.imgscalr imgscalr-lib 4.2 - - org.springframework - spring-context - ${spring.framework.version} - com.jgoodies jgoodies-common @@ -355,11 +338,6 @@ LGoodDatePicker 11.2.1 - - org.springframework.boot - spring-boot - ${spring.boot.version} - org.junit.jupiter junit-jupiter-engine diff --git a/rsc/version.properties b/rsc/version.properties index 0f50ca8864..ff246b66b7 100644 --- a/rsc/version.properties +++ b/rsc/version.properties @@ -1,4 +1,4 @@ # This file is not meant to be modified by the user VER_MAJOR=1 VER_MINOR=14 -VER_RELEASE=0 +VER_RELEASE=1 diff --git a/src/main/java/org/isf/Application.java b/src/main/java/org/isf/Application.java new file mode 100644 index 0000000000..e65a868eb8 --- /dev/null +++ b/src/main/java/org/isf/Application.java @@ -0,0 +1,33 @@ +/* + * Open Hospital (www.open-hospital.org) + * Copyright © 2006-2024 Informatici Senza Frontiere (info@informaticisenzafrontiere.org) + * + * Open Hospital is a free and open source software for healthcare data management. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * https://www.gnu.org/licenses/gpl-3.0-standalone.html + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.isf; + +import org.isf.menu.gui.Menu; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String... args) { + new Menu(args); + } +} diff --git a/src/main/java/org/isf/menu/gui/Menu.java b/src/main/java/org/isf/menu/gui/Menu.java index d46a9ad063..ec7e7977a6 100644 --- a/src/main/java/org/isf/menu/gui/Menu.java +++ b/src/main/java/org/isf/menu/gui/Menu.java @@ -34,6 +34,7 @@ import javax.swing.UIManager; import javax.swing.plaf.FontUIResource; +import org.isf.Application; import org.isf.generaldata.GeneralData; import org.isf.generaldata.MessageBundle; import org.isf.generaldata.Version; @@ -41,8 +42,8 @@ import org.isf.utils.jobjects.WaitCursorEventQueue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; public class Menu { @@ -158,15 +159,15 @@ public static void fontChecker() { } } - public static void main(String[] args) { - ApplicationContext context = null; - try { - context = new ClassPathXmlApplicationContext("applicationContext.xml"); - } catch (Exception e) { - LOGGER.error("Fatal: fail to load application context. {}", e.getMessage(), e); - System.exit(1); - } + public Menu(String[] args) { + ApplicationContext context = createApplicationContext(args); Context.setApplicationContext(context); SwingUtilities.invokeLater(() -> createAndShowGUI()); } + + private static ApplicationContext createApplicationContext(String... args) { + return new SpringApplicationBuilder(Application.class) + .headless(false) + .run(args); + } } From 9a38cd750f1cd3c1d5be81650ef296cba0c534fa Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Tue, 16 Apr 2024 17:15:45 -0400 Subject: [PATCH 09/86] Chore: update min java version to JDK 17 (#1977) --- src/main/java/org/isf/menu/gui/Menu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/isf/menu/gui/Menu.java b/src/main/java/org/isf/menu/gui/Menu.java index ec7e7977a6..560649bc20 100644 --- a/src/main/java/org/isf/menu/gui/Menu.java +++ b/src/main/java/org/isf/menu/gui/Menu.java @@ -50,7 +50,7 @@ public class Menu { private static final Logger LOGGER = LoggerFactory.getLogger(Menu.class); private static final Pattern DELIMITER = Pattern.compile("[._\\-+]"); - private static final String MIN_JAVA_VERSION = "11"; + private static final String MIN_JAVA_VERSION = "17"; /** * Create the GUI and show it. From 16666885e1f7cb741138de5a167ca82b8d374d78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 12:31:12 +0000 Subject: [PATCH 10/86] Chore(deps): Bump org.apache.maven.plugins:maven-compiler-plugin Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.12.1 to 3.13.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.12.1...maven-compiler-plugin-3.13.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 60b4a6cf33..5f7657dcac 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ maven-compiler-plugin - 3.12.1 + 3.13.0 ${java.version} From 9c6b58140660b163a507093993a709e8976daf0c Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Thu, 18 Apr 2024 08:35:47 -0400 Subject: [PATCH 11/86] OP-1149 The main class is no longer `org.isf.menu.gui.Menu` but `org.isf.Application` (#1985) --- oh.bat | 2 +- oh.ps1 | 4 ++-- oh.sh | 2 +- ohmac.sh | 2 +- pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/oh.bat b/oh.bat index 8fb44dad2b..61b39824d5 100644 --- a/oh.bat +++ b/oh.bat @@ -346,7 +346,7 @@ REM ###### Start Open Hospital ##### echo Starting Open Hospital GUI... cd /d %OH_PATH%\%OH_DIR% -%JAVA_BIN% -client -Xms64m -Xmx1024m -Dsun.java2d.dpiaware=false -Djava.library.path=%NATIVE_LIB_PATH% -cp %CLASSPATH% org.isf.menu.gui.Menu +%JAVA_BIN% -client -Xms64m -Xmx1024m -Dsun.java2d.dpiaware=false -Djava.library.path=%NATIVE_LIB_PATH% -cp %CLASSPATH% org.isf.Application REM # Shutdown MySQL echo Shutting down MySQL... diff --git a/oh.ps1 b/oh.ps1 index 3578c2d296..31c83df8be 100644 --- a/oh.ps1 +++ b/oh.ps1 @@ -1133,10 +1133,10 @@ function start_gui { # OH GUI launch cd "$OH_PATH\$OH_DIR" # workaround for hard coded paths - #$JAVA_ARGS="-client -Dlog4j.configuration=`"`'$OH_PATH\$OH_DIR\rsc\$LOG4J_SETTINGS`'`" -Dsun.java2d.dpiaware=false -Djava.library.path=`"`'$NATIVE_LIB_PATH`'`" -cp `"`'$OH_CLASSPATH`'`" org.isf.menu.gui.Menu" + #$JAVA_ARGS="-client -Dlog4j.configuration=`"`'$OH_PATH\$OH_DIR\rsc\$LOG4J_SETTINGS`'`" -Dsun.java2d.dpiaware=false -Djava.library.path=`"`'$NATIVE_LIB_PATH`'`" -cp `"`'$OH_CLASSPATH`'`" org.isf.Application" # log4j configuration is now read directly -$JAVA_ARGS="-client -Xms64m -Xmx1024m -Dsun.java2d.dpiaware=false -Djava.library.path=`"$NATIVE_LIB_PATH`" -cp `"`'$OH_CLASSPATH`'`" org.isf.menu.gui.Menu" +$JAVA_ARGS="-client -Xms64m -Xmx1024m -Dsun.java2d.dpiaware=false -Djava.library.path=`"$NATIVE_LIB_PATH`" -cp `"`'$OH_CLASSPATH`'`" org.isf.Application" Start-Process -FilePath "$JAVA_BIN" -ArgumentList $JAVA_ARGS -Wait -NoNewWindow -RedirectStandardOutput "$LOG_DIR/$LOG_FILE" -RedirectStandardError "$LOG_DIR/$LOG_FILE_ERR" diff --git a/oh.sh b/oh.sh index 0d3544b1c7..aaf2162028 100644 --- a/oh.sh +++ b/oh.sh @@ -998,7 +998,7 @@ function start_gui { # OH GUI launch cd "$OH_PATH/$OH_DIR" # workaround for hard coded paths - $JAVA_BIN -client -Xms64m -Xmx1024m -Dsun.java2d.dpiaware=false -Djava.library.path=${NATIVE_LIB_PATH} -classpath $OH_CLASSPATH org.isf.menu.gui.Menu >> ../$LOG_DIR/$LOG_FILE 2>&1 + $JAVA_BIN -client -Xms64m -Xmx1024m -Dsun.java2d.dpiaware=false -Djava.library.path=${NATIVE_LIB_PATH} -classpath $OH_CLASSPATH org.isf.Application >> ../$LOG_DIR/$LOG_FILE 2>&1 if [ $? -ne 0 ]; then echo "An error occurred while starting Open Hospital. Exiting." diff --git a/ohmac.sh b/ohmac.sh index 949c359d19..97db64525f 100755 --- a/ohmac.sh +++ b/ohmac.sh @@ -547,7 +547,7 @@ function start_gui { echo "Starting Open Hospital GUI..." # OH GUI launch - $JAVA_BIN -client -Xms64m -Xmx1024m -Dsun.java2d.dpiaware=false -Djava.library.path=${NATIVE_LIB_PATH} -classpath $OH_CLASSPATH org.isf.menu.gui.Menu >> $OH_DIR/$LOG_DIR/$LOG_FILE 2>&1 + $JAVA_BIN -client -Xms64m -Xmx1024m -Dsun.java2d.dpiaware=false -Djava.library.path=${NATIVE_LIB_PATH} -classpath $OH_CLASSPATH org.isf.Application >> $OH_DIR/$LOG_DIR/$LOG_FILE 2>&1 if [ $? -ne 0 ]; then echo "An error occurred while starting Open Hospital. Exiting." diff --git a/pom.xml b/pom.xml index cbbe47bc15..f79a07fcc5 100644 --- a/pom.xml +++ b/pom.xml @@ -218,7 +218,7 @@ true lib/ - org.isf.menu.gui.Menu + org.isf.Application . From 256b686841b2f9cfe2facc71d6d12d55f3e706ae Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Mon, 22 Apr 2024 09:02:50 -0400 Subject: [PATCH 12/86] OP-1210 quick "fix" for changes from CORE PR-1210. (#1987) --- .../isf/accounting/gui/BillDataLoaderTest.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java b/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java index ccbb8d9ee9..eb3f4ec9bf 100644 --- a/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java +++ b/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java @@ -31,15 +31,20 @@ import org.isf.accounting.TestBill; import org.isf.accounting.manager.BillBrowserManager; import org.isf.accounting.model.Bill; +import org.isf.accounting.service.AccountingIoOperations; import org.isf.patient.model.Patient; import org.isf.utils.exception.OHServiceException; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; class BillDataLoaderTest { private static final String NO_USERNAME = null; + private AccountingIoOperations accountingIoOperations; + @Test + @Disabled void shouldLoadPendingBillsFromManagerForParentPatient() throws OHServiceException { // given: Patient patientParent = new Patient(); @@ -48,7 +53,7 @@ void shouldLoadPendingBillsFromManagerForParentPatient() throws OHServiceExcepti Collections.emptyList(), Collections.emptyList(), patientParent, - new BillBrowserManager() { + new BillBrowserManager(accountingIoOperations) { @Override public List getPendingBillsAffiliate(int patID) throws OHServiceException { return new ArrayList<>(Arrays.asList( @@ -68,6 +73,7 @@ public List getPendingBillsAffiliate(int patID) throws OHServiceException } @Test + @Disabled void shouldLoadPendingBillsFromPeriodOnly() throws OHServiceException { // given: BillDataLoader billDataLoader = new BillDataLoader( @@ -80,7 +86,7 @@ void shouldLoadPendingBillsFromPeriodOnly() throws OHServiceException { TestBill.notDeletedBillWithStatus(3, "O") ), null, - new BillBrowserManager() + new BillBrowserManager(accountingIoOperations) ); // when: @@ -91,6 +97,7 @@ void shouldLoadPendingBillsFromPeriodOnly() throws OHServiceException { } @Test + @Disabled void shouldLoadAllBillsMergedWithBillsFromPaymentWithoutDuplicates() throws OHServiceException { // given: BillDataLoader billDataLoader = new BillDataLoader( @@ -103,7 +110,7 @@ void shouldLoadAllBillsMergedWithBillsFromPaymentWithoutDuplicates() throws OHSe TestBill.notDeletedBillWithStatus(3, "C") ), null, - new BillBrowserManager() + new BillBrowserManager(accountingIoOperations) ); // when: @@ -114,6 +121,7 @@ void shouldLoadAllBillsMergedWithBillsFromPaymentWithoutDuplicates() throws OHSe } @Test + @Disabled void shouldLoadClosedBillFromGivenPeriod() throws OHServiceException { // given: BillDataLoader billDataLoader = new BillDataLoader( @@ -126,7 +134,7 @@ void shouldLoadClosedBillFromGivenPeriod() throws OHServiceException { TestBill.notDeletedBillWithStatus(3, "C") ), null, - new BillBrowserManager() + new BillBrowserManager(accountingIoOperations) ); // when: From cda4e5db57e8ec171a3c1a254dd51d11656eafbd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:09:59 +0000 Subject: [PATCH 13/86] Chore(deps): Bump org.apache.maven.plugins:maven-jar-plugin Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.4.0...maven-jar-plugin-3.4.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f79a07fcc5..252df84475 100644 --- a/pom.xml +++ b/pom.xml @@ -212,7 +212,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 From 4e1bf33606085b53a50f05e566aa221291bd5df2 Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Wed, 24 Apr 2024 14:54:58 -0400 Subject: [PATCH 14/86] OP-1230: re-enable tests (#1988) --- pom.xml | 6 ++++++ .../org/isf/accounting/gui/BillDataLoaderTest.java | 10 +++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 252df84475..01b5bec59e 100644 --- a/pom.xml +++ b/pom.xml @@ -350,5 +350,11 @@ 3.25.3 test + + org.mockito + mockito-junit-jupiter + 5.11.0 + test + diff --git a/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java b/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java index eb3f4ec9bf..11a185488e 100644 --- a/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java +++ b/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java @@ -34,17 +34,17 @@ import org.isf.accounting.service.AccountingIoOperations; import org.isf.patient.model.Patient; import org.isf.utils.exception.OHServiceException; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.mockito.Mock; class BillDataLoaderTest { private static final String NO_USERNAME = null; + @Mock private AccountingIoOperations accountingIoOperations; @Test - @Disabled void shouldLoadPendingBillsFromManagerForParentPatient() throws OHServiceException { // given: Patient patientParent = new Patient(); @@ -73,7 +73,6 @@ public List getPendingBillsAffiliate(int patID) throws OHServiceException } @Test - @Disabled void shouldLoadPendingBillsFromPeriodOnly() throws OHServiceException { // given: BillDataLoader billDataLoader = new BillDataLoader( @@ -97,7 +96,6 @@ void shouldLoadPendingBillsFromPeriodOnly() throws OHServiceException { } @Test - @Disabled void shouldLoadAllBillsMergedWithBillsFromPaymentWithoutDuplicates() throws OHServiceException { // given: BillDataLoader billDataLoader = new BillDataLoader( @@ -121,7 +119,6 @@ void shouldLoadAllBillsMergedWithBillsFromPaymentWithoutDuplicates() throws OHSe } @Test - @Disabled void shouldLoadClosedBillFromGivenPeriod() throws OHServiceException { // given: BillDataLoader billDataLoader = new BillDataLoader( @@ -144,5 +141,4 @@ void shouldLoadClosedBillFromGivenPeriod() throws OHServiceException { assertThat(result).hasSize(1); } - -} \ No newline at end of file +} From b199aa01d7e4737e04ca74da93c7ac9dad4d5a4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 04:22:44 +0000 Subject: [PATCH 15/86] Chore(deps): Bump license.maven.plugin.version from 4.3 to 4.4 Bumps `license.maven.plugin.version` from 4.3 to 4.4. Updates `com.mycila:license-maven-plugin-git` from 4.3 to 4.4 - [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.3...license-maven-plugin-4.4) Updates `com.mycila:license-maven-plugin` from 4.3 to 4.4 - [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.3...license-maven-plugin-4.4) --- updated-dependencies: - dependency-name: com.mycila:license-maven-plugin-git dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.mycila:license-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 01b5bec59e..e2af43fd74 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ 1.14.1-SNAPSHOT 17 UTF-8 - 4.3 + 4.4 From a46d626587f59dc3ab04f69cf0f0a859afc32602 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Thu, 9 May 2024 14:56:13 +0200 Subject: [PATCH 16/86] OP-1235 Reflecting changes in CORE (#1990) * Fix with new constructors Also fix naming test helper class conflicting with core * Apply suggestions from code review --- .../accounting/gui/BillDataLoaderTest.java | 191 +++++++++--------- .../isf/accounting/{ => gui}/TestBill.java | 2 +- .../isf/accounting/{ => gui}/TestPayment.java | 2 +- .../gui/totals/BalanceTotalTest.java | 2 +- .../gui/totals/PaymentsTotalTest.java | 4 +- .../accounting/gui/totals/UserTotalTest.java | 4 +- .../gui/ward/WardBrowserManagerStub.java | 10 + .../gui/ward/WardComboBoxInitializerTest.java | 71 +++---- 8 files changed, 140 insertions(+), 146 deletions(-) rename src/test/java/org/isf/accounting/{ => gui}/TestBill.java (97%) rename src/test/java/org/isf/accounting/{ => gui}/TestPayment.java (97%) diff --git a/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java b/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java index 11a185488e..54a12a956b 100644 --- a/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java +++ b/src/test/java/org/isf/accounting/gui/BillDataLoaderTest.java @@ -28,7 +28,6 @@ import java.util.Collections; import java.util.List; -import org.isf.accounting.TestBill; import org.isf.accounting.manager.BillBrowserManager; import org.isf.accounting.model.Bill; import org.isf.accounting.service.AccountingIoOperations; @@ -38,107 +37,97 @@ import org.mockito.Mock; class BillDataLoaderTest { - + private static final String NO_USERNAME = null; - @Mock - private AccountingIoOperations accountingIoOperations; - - @Test - void shouldLoadPendingBillsFromManagerForParentPatient() throws OHServiceException { - // given: - Patient patientParent = new Patient(); - patientParent.setCode(1); - BillDataLoader billDataLoader = new BillDataLoader( - Collections.emptyList(), - Collections.emptyList(), - patientParent, - new BillBrowserManager(accountingIoOperations) { - @Override - public List getPendingBillsAffiliate(int patID) throws OHServiceException { - return new ArrayList<>(Arrays.asList( - TestBill.notDeletedBillWithStatus(1, "O"), - TestBill.notDeletedBillWithStatus(2, "O"), - TestBill.notDeletedBillWithStatus(3, "O") - )); - } - } - ); - - // when: - List result = billDataLoader.loadBills("O", NO_USERNAME); - - // then: - assertThat(result).hasSize(3); - } - - @Test - void shouldLoadPendingBillsFromPeriodOnly() throws OHServiceException { - // given: - BillDataLoader billDataLoader = new BillDataLoader( - Arrays.asList( - TestBill.notDeletedBillWithStatus(1, "C"), - TestBill.notDeletedBillWithStatus(2, "O") - ), - Arrays.asList( - TestBill.notDeletedBillWithStatus(1, "C"), - TestBill.notDeletedBillWithStatus(3, "O") - ), - null, - new BillBrowserManager(accountingIoOperations) - ); - - // when: - List result = billDataLoader.loadBills("O", NO_USERNAME); - - // then: - assertThat(result).hasSize(1); - } - - @Test - void shouldLoadAllBillsMergedWithBillsFromPaymentWithoutDuplicates() throws OHServiceException { - // given: - BillDataLoader billDataLoader = new BillDataLoader( - Arrays.asList( - TestBill.notDeletedBillWithStatus(1, "O"), - TestBill.notDeletedBillWithStatus(2, "C") - ), - Arrays.asList( - TestBill.notDeletedBillWithStatus(1, "0"), - TestBill.notDeletedBillWithStatus(3, "C") - ), - null, - new BillBrowserManager(accountingIoOperations) - ); - - // when: - List result = billDataLoader.loadBills("ALL", NO_USERNAME); - - // then: - assertThat(result).hasSize(3); - } - - @Test - void shouldLoadClosedBillFromGivenPeriod() throws OHServiceException { - // given: - BillDataLoader billDataLoader = new BillDataLoader( - Arrays.asList( - TestBill.notDeletedBillWithStatus(1, "O"), - TestBill.notDeletedBillWithStatus(2, "C") - ), - Arrays.asList( - TestBill.notDeletedBillWithStatus(1, "0"), - TestBill.notDeletedBillWithStatus(3, "C") - ), - null, - new BillBrowserManager(accountingIoOperations) - ); - - // when: - List result = billDataLoader.loadBills("C", NO_USERNAME); - - // then: - assertThat(result).hasSize(1); - } + @Mock + private AccountingIoOperations accountingIoOperations; + + @Test + void shouldLoadPendingBillsFromManagerForParentPatient() throws OHServiceException { + // given: + Patient patientParent = new Patient(); + patientParent.setCode(1); + BillDataLoader billDataLoader = new BillDataLoader( + Collections.emptyList(), + Collections.emptyList(), + patientParent, + new BillBrowserManager(accountingIoOperations) { + + @Override + public List getPendingBillsAffiliate(int patID) throws OHServiceException { + return new ArrayList<>(Arrays.asList( + TestBill.notDeletedBillWithStatus(1, "O"), + TestBill.notDeletedBillWithStatus(2, "O"), + TestBill.notDeletedBillWithStatus(3, "O"))); + } + }); + + // when: + List result = billDataLoader.loadBills("O", NO_USERNAME); + + // then: + assertThat(result).hasSize(3); + } + + @Test + void shouldLoadPendingBillsFromPeriodOnly() throws OHServiceException { + // given: + BillDataLoader billDataLoader = new BillDataLoader( + Arrays.asList( + TestBill.notDeletedBillWithStatus(1, "C"), + TestBill.notDeletedBillWithStatus(2, "O")), + Arrays.asList( + TestBill.notDeletedBillWithStatus(1, "C"), + TestBill.notDeletedBillWithStatus(3, "O")), + null, + new BillBrowserManager(accountingIoOperations)); + + // when: + List result = billDataLoader.loadBills("O", NO_USERNAME); + + // then: + assertThat(result).hasSize(1); + } + + @Test + void shouldLoadAllBillsMergedWithBillsFromPaymentWithoutDuplicates() throws OHServiceException { + // given: + BillDataLoader billDataLoader = new BillDataLoader( + Arrays.asList( + TestBill.notDeletedBillWithStatus(1, "O"), + TestBill.notDeletedBillWithStatus(2, "C")), + Arrays.asList( + TestBill.notDeletedBillWithStatus(1, "0"), + TestBill.notDeletedBillWithStatus(3, "C")), + null, + new BillBrowserManager(accountingIoOperations)); + + // when: + List result = billDataLoader.loadBills("ALL", NO_USERNAME); + + // then: + assertThat(result).hasSize(3); + } + + @Test + void shouldLoadClosedBillFromGivenPeriod() throws OHServiceException { + // given: + BillDataLoader billDataLoader = new BillDataLoader( + Arrays.asList( + TestBill.notDeletedBillWithStatus(1, "O"), + TestBill.notDeletedBillWithStatus(2, "C")), + Arrays.asList( + TestBill.notDeletedBillWithStatus(1, "0"), + TestBill.notDeletedBillWithStatus(3, "C")), + null, + new BillBrowserManager(accountingIoOperations)); + + // when: + List result = billDataLoader.loadBills("C", NO_USERNAME); + + // then: + assertThat(result).hasSize(1); + } } diff --git a/src/test/java/org/isf/accounting/TestBill.java b/src/test/java/org/isf/accounting/gui/TestBill.java similarity index 97% rename from src/test/java/org/isf/accounting/TestBill.java rename to src/test/java/org/isf/accounting/gui/TestBill.java index 3a41f75cc7..b502648f0a 100644 --- a/src/test/java/org/isf/accounting/TestBill.java +++ b/src/test/java/org/isf/accounting/gui/TestBill.java @@ -19,7 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.isf.accounting; +package org.isf.accounting.gui; import org.isf.accounting.model.Bill; diff --git a/src/test/java/org/isf/accounting/TestPayment.java b/src/test/java/org/isf/accounting/gui/TestPayment.java similarity index 97% rename from src/test/java/org/isf/accounting/TestPayment.java rename to src/test/java/org/isf/accounting/gui/TestPayment.java index 97e0988123..1dc8a4c91d 100644 --- a/src/test/java/org/isf/accounting/TestPayment.java +++ b/src/test/java/org/isf/accounting/gui/TestPayment.java @@ -19,7 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.isf.accounting; +package org.isf.accounting.gui; import org.isf.accounting.model.Bill; import org.isf.accounting.model.BillPayments; diff --git a/src/test/java/org/isf/accounting/gui/totals/BalanceTotalTest.java b/src/test/java/org/isf/accounting/gui/totals/BalanceTotalTest.java index 7c62cace19..6d39a3b06d 100644 --- a/src/test/java/org/isf/accounting/gui/totals/BalanceTotalTest.java +++ b/src/test/java/org/isf/accounting/gui/totals/BalanceTotalTest.java @@ -26,7 +26,7 @@ import java.math.BigDecimal; import java.util.Arrays; -import org.isf.accounting.TestBill; +import org.isf.accounting.gui.TestBill; import org.junit.jupiter.api.Test; class BalanceTotalTest { diff --git a/src/test/java/org/isf/accounting/gui/totals/PaymentsTotalTest.java b/src/test/java/org/isf/accounting/gui/totals/PaymentsTotalTest.java index 4ebf3d8add..aab1e1f412 100644 --- a/src/test/java/org/isf/accounting/gui/totals/PaymentsTotalTest.java +++ b/src/test/java/org/isf/accounting/gui/totals/PaymentsTotalTest.java @@ -26,8 +26,8 @@ import java.math.BigDecimal; import java.util.Arrays; -import org.isf.accounting.TestBill; -import org.isf.accounting.TestPayment; +import org.isf.accounting.gui.TestBill; +import org.isf.accounting.gui.TestPayment; import org.junit.jupiter.api.Test; class PaymentsTotalTest { diff --git a/src/test/java/org/isf/accounting/gui/totals/UserTotalTest.java b/src/test/java/org/isf/accounting/gui/totals/UserTotalTest.java index baf48c6a99..7ffd2bf395 100644 --- a/src/test/java/org/isf/accounting/gui/totals/UserTotalTest.java +++ b/src/test/java/org/isf/accounting/gui/totals/UserTotalTest.java @@ -26,8 +26,8 @@ import java.math.BigDecimal; import java.util.Arrays; -import org.isf.accounting.TestBill; -import org.isf.accounting.TestPayment; +import org.isf.accounting.gui.TestBill; +import org.isf.accounting.gui.TestPayment; import org.junit.jupiter.api.Test; class UserTotalTest { diff --git a/src/test/java/org/isf/admission/gui/ward/WardBrowserManagerStub.java b/src/test/java/org/isf/admission/gui/ward/WardBrowserManagerStub.java index 14f1a31708..3080544e18 100644 --- a/src/test/java/org/isf/admission/gui/ward/WardBrowserManagerStub.java +++ b/src/test/java/org/isf/admission/gui/ward/WardBrowserManagerStub.java @@ -24,11 +24,21 @@ import java.util.ArrayList; import java.util.List; +import org.isf.admission.manager.AdmissionBrowserManager; import org.isf.ward.manager.WardBrowserManager; import org.isf.ward.model.Ward; +import org.isf.ward.service.WardIoOperations; +import org.mockito.Mock; public class WardBrowserManagerStub extends WardBrowserManager { + @Mock + private WardIoOperations wardIoOperations; + + public WardBrowserManagerStub(AdmissionBrowserManager admissionBrowserManager, WardIoOperations wardIoOperations) { + super(admissionBrowserManager, wardIoOperations); + } + private final List wards = new ArrayList<>(); @Override diff --git a/src/test/java/org/isf/admission/gui/ward/WardComboBoxInitializerTest.java b/src/test/java/org/isf/admission/gui/ward/WardComboBoxInitializerTest.java index 8c8496c206..ce283549ef 100644 --- a/src/test/java/org/isf/admission/gui/ward/WardComboBoxInitializerTest.java +++ b/src/test/java/org/isf/admission/gui/ward/WardComboBoxInitializerTest.java @@ -43,7 +43,7 @@ class WardComboBoxInitializerTest { @BeforeEach void setUp() { - wardBrowserManager = new WardBrowserManagerStub(); + wardBrowserManager = new WardBrowserManagerStub(null, null); wardComboBox = new JComboBox(); } @@ -57,13 +57,12 @@ void shouldSkipFemaleWardForMalePatient() throws OHServiceException { // when: new WardComboBoxInitializer( - wardComboBox, - wardBrowserManager, - patient, - null, - false, - TestAdmission.withAdmAndDisDate(TimeTools.getNow(), TimeTools.getNow()) - ).initialize(); + wardComboBox, + wardBrowserManager, + patient, + null, + false, + TestAdmission.withAdmAndDisDate(TimeTools.getNow(), TimeTools.getNow())).initialize(); // then: assertThat(wardComboBox.getItemCount()).isEqualTo(2); @@ -82,13 +81,12 @@ void shouldSkipWardWithoutBeds() throws OHServiceException { // when: new WardComboBoxInitializer( - wardComboBox, - wardBrowserManager, - patient, - null, - false, - TestAdmission.withAdmAndDisDate(TimeTools.getNow(), TimeTools.getNow()) - ).initialize(); + wardComboBox, + wardBrowserManager, + patient, + null, + false, + TestAdmission.withAdmAndDisDate(TimeTools.getNow(), TimeTools.getNow())).initialize(); // then: assertThat(wardComboBox.getItemCount()).isEqualTo(2); @@ -106,13 +104,12 @@ void shouldSkipMaleWardForFemalePatient() throws OHServiceException { // when: new WardComboBoxInitializer( - wardComboBox, - wardBrowserManager, - patient, - null, - false, - TestAdmission.withAdmAndDisDate(TimeTools.getNow(), TimeTools.getNow()) - ).initialize(); + wardComboBox, + wardBrowserManager, + patient, + null, + false, + TestAdmission.withAdmAndDisDate(TimeTools.getNow(), TimeTools.getNow())).initialize(); // then: assertThat(wardComboBox.getItemCount()).isEqualTo(2); @@ -131,13 +128,12 @@ void shouldSelectRecentlySavedWard() throws OHServiceException { // when: new WardComboBoxInitializer( - wardComboBox, - wardBrowserManager, - patient, - recentlySavedWard, - false, - TestAdmission.withAdmAndDisDate(TimeTools.getNow(), TimeTools.getNow()) - ).initialize(); + wardComboBox, + wardBrowserManager, + patient, + recentlySavedWard, + false, + TestAdmission.withAdmAndDisDate(TimeTools.getNow(), TimeTools.getNow())).initialize(); // then: assertThat(((Ward) wardComboBox.getSelectedItem()).getCode()).isEqualTo(recentlySavedWard.getCode()); @@ -152,18 +148,17 @@ void shouldSelectWardFromAdmissionWhenEditing() throws OHServiceException { wardBrowserManager.newWard(editedWard); wardBrowserManager.newWard(TestWard.femaleWardWithBeds("2")); Admission admission = TestAdmission.withAdmAndDisDateAndWard(TimeTools.getNow(), - TimeTools.getNow(), - editedWard); + TimeTools.getNow(), + editedWard); // when: new WardComboBoxInitializer( - wardComboBox, - wardBrowserManager, - patient, - null, - true, - admission - ).initialize(); + wardComboBox, + wardBrowserManager, + patient, + null, + true, + admission).initialize(); // then: assertThat(((Ward) wardComboBox.getSelectedItem()).getCode()).isEqualTo(editedWard.getCode()); From 2faa612b7a0160aea9f86278fb1eefd0663b12c0 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Thu, 9 May 2024 22:08:13 +0200 Subject: [PATCH 17/86] OP-1229 Medicals sorted by name in Pharmaceutical Stock (#1993) --- src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java index 72cd9f8a60..e2784335e9 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java @@ -496,7 +496,7 @@ private JPanel getMedicalSearchPanel() { medicalBox.removeAllItems(); List medicals; try { - medicals = medicalBrowsingManager.getMedicals(); + medicals = medicalBrowsingManager.getMedicalsSortedByName(); } catch (OHServiceException e1) { medicals = null; OHServiceExceptionUtil.showMessages(e1); @@ -547,7 +547,7 @@ private JComboBox getMedicalBox() { medicalBox.setPreferredSize(new Dimension(200, 25)); List medical; try { - medical = medicalBrowsingManager.getMedicals(); + medical = medicalBrowsingManager.getMedicalsSortedByName(); } catch (OHServiceException e1) { medical = null; OHServiceExceptionUtil.showMessages(e1); From 1992ff48f55065f049bfa7028718580097357ab5 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Thu, 9 May 2024 22:09:18 +0200 Subject: [PATCH 18/86] Fix MedicalBrowser style and filtering (#1992) - Fix CellRenderer using the actual showing data - Fix MedicalBrowser filtering after edit - Fix columns auto resizing in MedicalBrowser --- .../org/isf/medicals/gui/MedicalBrowser.java | 95 ++++++++++--------- 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java index 5b2d8d05f3..63f7b968ac 100644 --- a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java +++ b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java @@ -122,7 +122,9 @@ public void medicalUpdated(AWTEvent e) { table.setRowSelectionInterval(selectedrow, selectedrow); } repaint(); - + int keyCode = 0; // simulate ENTER on the search field + KeyEvent enterPressed = new KeyEvent(searchString, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, keyCode, '\n'); + searchString.dispatchEvent(enterPressed); } private int selectedrow; @@ -132,7 +134,7 @@ public void medicalUpdated(AWTEvent e) { MessageBundle.getMessage("angal.common.type.txt").toUpperCase(), MessageBundle.getMessage("angal.common.code.txt").toUpperCase(), MessageBundle.getMessage("angal.common.description.txt").toUpperCase(), - MessageBundle.getMessage("angal.medicals.pcsperpck.col"), // not uppercased so column reads better + MessageBundle.getMessage("angal.medicals.pcsperpck.col"), // not uppercased so column reads better MessageBundle.getMessage("angal.medicals.stock.col").toUpperCase(), MessageBundle.getMessage("angal.medicals.critlevel.col").toUpperCase(), MessageBundle.getMessage("angal.medicals.outofstock.col").toUpperCase() @@ -195,6 +197,7 @@ private JTable getJTable() { model = new MedicalBrowsingModel(); table = new JTable(model); table.setAutoCreateRowSorter(true); + table.setAutoCreateColumnsFromModel(false); table.setDefaultRenderer(Object.class, new ColorTableCellRenderer()); for (int i = 0; i < pColumnWidth.length; i++) { table.getColumnModel().getColumn(i).setMinWidth(pColumnWidth[i]); @@ -306,10 +309,10 @@ private JButton getJButtonStock() { Icon icon = new ImageIcon("rsc/icons/calendar_dialog.png"); //$NON-NLS-1$ String dateOption = (String) MessageDialog.inputDialog(this, - icon, - dateOptions.toArray(), - dateOptions.get(0), - "angal.medicals.pleaseselectareport.msg"); + icon, + dateOptions.toArray(), + dateOptions.get(0), + "angal.medicals.pleaseselectareport.msg"); if (dateOption == null) { return; @@ -320,10 +323,10 @@ private JButton getJButtonStock() { lotOptions.add(MessageBundle.getMessage("angal.medicals.withlot")); String lotOption = (String) MessageDialog.inputDialog(this, - icon, - lotOptions.toArray(), - lotOptions.get(0), - "angal.medicals.pleaseselectareport.msg"); + icon, + lotOptions.toArray(), + lotOptions.get(0), + "angal.medicals.pleaseselectareport.msg"); /* Getting Report parameters */ String sortBy; @@ -332,7 +335,7 @@ private JButton getJButtonStock() { if (pbox.getSelectedItem() instanceof MedicalType) { groupBy = ((MedicalType) pbox.getSelectedItem()).getDescription(); } - List sortedKeys = table.getRowSorter().getSortKeys(); + List< ? > sortedKeys = table.getRowSorter().getSortKeys(); if (!sortedKeys.isEmpty()) { int sortedColumn = ((SortKey) sortedKeys.get(0)).getColumn(); SortOrder sortedOrder = ((SortKey) sortedKeys.get(0)).getSortOrder(); @@ -349,7 +352,7 @@ private JButton getJButtonStock() { sortBy = columnName + ' ' + columnOrder; } - } else { //default values + } else { // default values groupBy = "%%"; sortBy = "MDSRT_DESC, MDSR_DESC"; } @@ -375,11 +378,11 @@ private JButton getJButtonStock() { GoodDateChooser dateChooser = new GoodDateChooser(LocalDate.now(), true, false); int r = JOptionPane.showConfirmDialog(this, - dateChooser, - MessageBundle.getMessage("angal.common.date.txt"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.PLAIN_MESSAGE, - icon); + dateChooser, + MessageBundle.getMessage("angal.common.date.txt"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.PLAIN_MESSAGE, + icon); if (r == JOptionPane.OK_OPTION) { new GenericReportPharmaceuticalStock(dateChooser.getDateEndOfDay(), report, filter, groupBy, sortBy, false); @@ -411,7 +414,7 @@ private JButton getJButtonStockCard() { if (!dataRange.isCancel()) { new GenericReportPharmaceuticalStockCard("ProductLedger", dateFrom.atStartOfDay(), dateTo.atTime(LocalTime.MAX), medical, - null, toExcel); + null, toExcel); } } }); @@ -446,9 +449,9 @@ private JButton getJButtonReport() { } } catch (IOException exc) { JOptionPane.showMessageDialog(this, - exc.getMessage(), - MessageBundle.getMessage("angal.messagedialog.error.title"), - JOptionPane.PLAIN_MESSAGE); + exc.getMessage(), + MessageBundle.getMessage("angal.messagedialog.error.title"), + JOptionPane.PLAIN_MESSAGE); LOGGER.error("Export to excel error : {}", exc.getMessage()); } } @@ -459,8 +462,8 @@ private JButton getJButtonReport() { private String compileFileName() { StringBuilder filename = new StringBuilder(MessageBundle.getMessage("angal.medicals.stock.txt")); if (pbox.isEnabled() - && !pbox.getSelectedItem().equals( - MessageBundle.getMessage("angal.common.all.txt").toUpperCase())) { + && !pbox.getSelectedItem().equals( + MessageBundle.getMessage("angal.common.all.txt").toUpperCase())) { filename.append('_').append(pbox.getSelectedItem()); } @@ -562,10 +565,10 @@ protected void launchExpiringReport() { Icon icon = new ImageIcon("rsc/icons/calendar_dialog.png"); //$NON-NLS-1$ String option = (String) MessageDialog.inputDialog(this, - icon, - options.toArray(), - options.get(0), - "angal.medicals.pleaseselectperiod.msg"); + icon, + options.toArray(), + options.get(0), + "angal.medicals.pleaseselectperiod.msg"); if (option == null) { return; @@ -581,7 +584,7 @@ protected void launchExpiringReport() { to = from; } if (options.indexOf(option) == ++i) { - //this month + // this month LocalDate gc = getFromDate(); from = TimeTools.formatDateTime(gc.atStartOfDay(), DATE_FORMAT_DD_MM_YYYY); @@ -590,17 +593,17 @@ protected void launchExpiringReport() { } if (options.indexOf(option) == ++i) { from = TimeTools.formatDateTime(getFromDate().atStartOfDay(), DATE_FORMAT_DD_MM_YYYY); - //next month + // next month to = TimeTools.formatDateTime(getToDatePlusMonth(1).atTime(LocalTime.MAX), DATE_FORMAT_DD_MM_YYYY); } if (options.indexOf(option) == ++i) { from = TimeTools.formatDateTime(getFromDate().atStartOfDay(), DATE_FORMAT_DD_MM_YYYY); - //next two month + // next two month to = TimeTools.formatDateTime(getToDatePlusMonth(2).atTime(LocalTime.MAX), DATE_FORMAT_DD_MM_YYYY); } if (options.indexOf(option) == ++i) { from = TimeTools.formatDateTime(getFromDate().atStartOfDay(), DATE_FORMAT_DD_MM_YYYY); - //next three month + // next three month to = TimeTools.formatDateTime(getToDatePlusMonth(3).atTime(LocalTime.MAX), DATE_FORMAT_DD_MM_YYYY); } if (options.indexOf(option) == ++i) { @@ -608,11 +611,11 @@ protected void launchExpiringReport() { icon = new ImageIcon("rsc/icons/calendar_dialog.png"); //$NON-NLS-1$ JMonthYearChooser monthYearChooser = new JMonthYearChooser(); int r = JOptionPane.showConfirmDialog(this, - monthYearChooser, - MessageBundle.getMessage("angal.billbrowser.month.txt"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.PLAIN_MESSAGE, - icon); + monthYearChooser, + MessageBundle.getMessage("angal.billbrowser.month.txt"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.PLAIN_MESSAGE, + icon); if (r == JOptionPane.OK_OPTION) { monthYear = monthYearChooser.getLocalDate(); @@ -623,17 +626,17 @@ protected void launchExpiringReport() { LocalDate fromDate = getFromDate(); from = TimeTools.formatDateTime(fromDate.atStartOfDay(), DATE_FORMAT_DD_MM_YYYY); LocalDate toDate = monthYear; - toDate = toDate.with (TemporalAdjusters.lastDayOfMonth()); + toDate = toDate.with(TemporalAdjusters.lastDayOfMonth()); to = TimeTools.formatDateTime(toDate.atTime(LocalTime.MAX), DATE_FORMAT_DD_MM_YYYY); } new GenericReportFromDateToDate( - from, - to, - "rpt_base", - "PharmaceuticalExpiration", - MessageBundle.getMessage("angal.medicals.expiringreport"), - false); + from, + to, + "rpt_base", + "PharmaceuticalExpiration", + MessageBundle.getMessage("angal.medicals.expiringreport"), + false); } private LocalDate getToDatePlusMonth(int monthsToMove) { @@ -699,7 +702,7 @@ public MedicalBrowsingModel() { } @Override - public Class getColumnClass(int c) { + public Class< ? > getColumnClass(int c) { if (c == 0) { return String.class; } else if (c == 1) { @@ -774,10 +777,10 @@ class ColorTableCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) { + boolean hasFocus, int row, int column) { Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); cell.setForeground(Color.BLACK); - Medical med = pMedicals.get(row); + Medical med = (Medical) table.getValueAt(row, -1); double actualQty = med.getInitialqty() + med.getInqty() - med.getOutqty(); if ((boolean) table.getValueAt(row, 6)) { cell.setForeground(Color.GRAY); // out of stock From 8cf7c1b35f0376571ef02d9cf1aeaaf320c96898 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Thu, 9 May 2024 22:10:56 +0200 Subject: [PATCH 19/86] OP-1228 Add product code column to Pharmaceutical Stock (#1994) --- .../isf/medicalstock/gui/MovStockBrowser.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java index e2784335e9..e32db3471d 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java @@ -140,25 +140,26 @@ public class MovStockBrowser extends ModalJFrame { MessageBundle.getMessage("angal.common.type.txt").toUpperCase(), // 3 MessageBundle.getMessage("angal.common.ward.txt").toUpperCase(), // 4 MessageBundle.getMessage("angal.common.qty.txt").toUpperCase(), // 5 - MessageBundle.getMessage("angal.medicalstock.pharmaceutical.col").toUpperCase(), // 6 - MessageBundle.getMessage("angal.medicalstock.medtype.col").toUpperCase(), // 7 - MessageBundle.getMessage("angal.medicalstock.lot.col").toUpperCase(), // 8 - MessageBundle.getMessage("angal.medicalstock.prepdate.col").toUpperCase(), // 9 - MessageBundle.getMessage("angal.medicalstock.duedate.col").toUpperCase(), // 10 - MessageBundle.getMessage("angal.medicalstock.origin.col").toUpperCase(), // 11 - MessageBundle.getMessage("angal.medicalstock.cost.col").toUpperCase(), // 12 - MessageBundle.getMessage("angal.common.total.txt").toUpperCase(), // 13 - MessageBundle.getMessage("angal.common.userid").toUpperCase() // 14 + MessageBundle.getMessage("angal.common.code.txt").toUpperCase(), // 6 + MessageBundle.getMessage("angal.medicalstock.pharmaceutical.col").toUpperCase(), // 7 + MessageBundle.getMessage("angal.medicalstock.medtype.col").toUpperCase(), // 8 + MessageBundle.getMessage("angal.medicalstock.lot.col").toUpperCase(), // 9 + MessageBundle.getMessage("angal.medicalstock.prepdate.col").toUpperCase(), // 10 + MessageBundle.getMessage("angal.medicalstock.duedate.col").toUpperCase(), // 11 + MessageBundle.getMessage("angal.medicalstock.origin.col").toUpperCase(), // 12 + MessageBundle.getMessage("angal.medicalstock.cost.col").toUpperCase(), // 13 + MessageBundle.getMessage("angal.common.total.txt").toUpperCase(), // 14 + MessageBundle.getMessage("angal.common.userid").toUpperCase() // 15 }; - private boolean[] pColumnBold = { true, false, false, false, false, false, false, false, false, false, false, false, false, false }; + private boolean[] pColumnBold = { true, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; private int[] columnAlignment = { SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.CENTER, - SwingConstants.LEFT, SwingConstants.LEFT, SwingConstants.CENTER, + SwingConstants.CENTER, SwingConstants.LEFT, SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.RIGHT, SwingConstants.RIGHT, SwingConstants.CENTER }; private boolean isSingleUser = GeneralData.getGeneralData().getSINGLEUSER(); - private boolean[] pColumnVisible = { true, true, true, true, true, true, true, !GeneralData.AUTOMATICLOT_IN, !GeneralData.AUTOMATICLOT_IN, true, true, + private boolean[] pColumnVisible = { true, true, true, true, true, true, true, true, !GeneralData.AUTOMATICLOT_IN, !GeneralData.AUTOMATICLOT_IN, true, true, GeneralData.LOTWITHCOST, GeneralData.LOTWITHCOST, !isSingleUser }; - private int[] pColumnWidth = { 50, 90, 45, 130, 50, 150, 70, 70, 80, 80, 50, 50, 70, 70 }; + private int[] pColumnWidth = { 50, 90, 45, 130, 50, 30, 150, 70, 70, 80, 80, 50, 50, 70, 70 }; /* * Adds to facilitate the selection of products @@ -1126,6 +1127,7 @@ public int getColumnCount() { @Override public Object getValueAt(int r, int c) { Movement movement = moves.get(r); + Medical medical = movement.getMedical(); Lot lot = movement.getLot(); BigDecimal cost = lot.getCost(); int qty = movement.getQuantity(); @@ -1148,9 +1150,11 @@ public Object getValueAt(int r, int c) { } else if (c == ++col) { return qty; } else if (c == ++col) { - return movement.getMedical().getDescription(); + return medical.getProdCode(); } else if (c == ++col) { - return movement.getMedical().getType().getDescription(); + return medical.getDescription(); + } else if (c == ++col) { + return medical.getType().getDescription(); } else if (c == ++col) { if (isAutomaticLot()) { return MessageBundle.getMessage("angal.medicalstock.generated"); From 33bd26a68d404f02f9d58cce966be39a33fbe916 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Thu, 9 May 2024 22:40:50 +0200 Subject: [PATCH 20/86] OP-1225 Allow to change MedicalType (#1995) --- .../org/isf/medicals/gui/MedicalEdit.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/isf/medicals/gui/MedicalEdit.java b/src/main/java/org/isf/medicals/gui/MedicalEdit.java index ff47f1668f..9a34dbc369 100644 --- a/src/main/java/org/isf/medicals/gui/MedicalEdit.java +++ b/src/main/java/org/isf/medicals/gui/MedicalEdit.java @@ -420,19 +420,16 @@ private JTextField getPcsperpckField() { private JComboBox getTypeComboBox() { if (typeComboBox == null) { typeComboBox = new JComboBox<>(); - if (insert) { - List types; - try { - types = medicalTypeManager.getMedicalType(); - for (MedicalType elem : types) { - typeComboBox.addItem(elem); - } - } catch (OHServiceException e) { - OHServiceExceptionUtil.showMessages(e); + try { + List types = medicalTypeManager.getMedicalType(); + for (MedicalType elem : types) { + typeComboBox.addItem(elem); } - } else { - typeComboBox.addItem(medical.getType()); - typeComboBox.setEnabled(false); + } catch (OHServiceException e) { + OHServiceExceptionUtil.showMessages(e); + } + if (!insert) { + typeComboBox.setSelectedItem(medical.getType()); } } return typeComboBox; From b76ca3c8db3f1830d662de91d152ee9e831ddf1b Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Thu, 9 May 2024 22:41:45 +0200 Subject: [PATCH 21/86] OP-1227 Show 2 decimals only for prices in Pharmaceutical Stock (#1996) --- src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java index e32db3471d..a552a5d13a 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java @@ -1229,7 +1229,6 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole class DecimalFormatRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; - private final DecimalFormat formatter100 = new DecimalFormat("#,##0.000"); private final DecimalFormat formatter10 = new DecimalFormat("#,##0.00"); private final DecimalFormat formatter1 = new DecimalFormat("#,##0"); @@ -1241,7 +1240,7 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole value = formatter1.format(value); } if (column == 11 && value instanceof Number) { - value = formatter100.format(value); + value = formatter10.format(value); } if (column == 12 && value instanceof Number) { value = formatter10.format(value); From 4cb5eeba4b1c5785fdedb8d84ed178f703b8851c Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Fri, 10 May 2024 17:29:08 +0200 Subject: [PATCH 22/86] OP-1219 Add Ward comparator to sort in combobox (#1997) --- .../java/org/isf/medicalstock/gui/MovStockBrowser.java | 9 +++++---- .../medicalstock/gui/MovStockMultipleDischarging.java | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java index a552a5d13a..64390878c4 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java @@ -475,14 +475,15 @@ private JComboBox getWardBox() { wardBox = new JComboBox(); wardBox.setPreferredSize(new Dimension(200, 25)); wardBox.addItem(MessageBundle.getMessage("angal.common.all.txt")); - List wardList; + List wardsList; try { - wardList = wardBrowserManager.getWards(); + wardsList = wardBrowserManager.getWards(); + wardsList.sort(new Ward.WardDescriptionComparator()); } catch (OHServiceException e) { - wardList = new ArrayList<>(); + wardsList = new ArrayList<>(); OHServiceExceptionUtil.showMessages(e); } - for (Ward elem : wardList) { + for (Ward elem : wardsList) { wardBox.addItem(elem); } wardBox.setEnabled(false); diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java index efc5ff7e43..80a870861a 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java @@ -742,6 +742,7 @@ private JComboBox getJComboBoxDestination() { List wardsList; try { wardsList = wardBrowserManager.getWards(); + wardsList.sort(new Ward.WardDescriptionComparator()); } catch (OHServiceException e) { wardsList = new ArrayList<>(); OHServiceExceptionUtil.showMessages(e); From 3b59e8340d64bc1e1a220f1bea28c59e66c504cd Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Fri, 10 May 2024 17:47:56 +0200 Subject: [PATCH 23/86] OP-1220 Add Supplier comparator to sort in combobox (#1999) --- .../java/org/isf/medicalstock/gui/MovStockMultipleCharging.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java index ebffaa9dc7..e1286b9ea4 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java @@ -728,6 +728,7 @@ private JComboBox getJComboBoxSupplier() { List suppliers = null; try { suppliers = supplierBrowserManager.getList(); + suppliers.sort(new Supplier.SupplierNameComparator()); } catch (OHServiceException e) { OHServiceExceptionUtil.showMessages(e); } From b3b26282269007f159fb1eb23ae1ca2b7b91d0a6 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Fri, 10 May 2024 18:16:22 +0200 Subject: [PATCH 24/86] OP-1221 Improve filtering for all charge or discharge MovementType(s) (#1998) * OP-1221 Improve filtering for all charge or discharge MovementType(s) * Apply suggestions from code review * Factorize constant strings --------- Co-authored-by: David B Malkovsky --- bundle/language_en.properties | 2 + .../isf/medicalstock/gui/MovStockBrowser.java | 78 ++++++++++++------- 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/bundle/language_en.properties b/bundle/language_en.properties index 89746f971b..4634fe8dad 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -785,6 +785,8 @@ angal.medicals.thismonth angal.medicals.today = Today angal.medicals.type = Type angal.medicals.withlot = With lots +angal.medicalstock.allcharges.txt = All charges +angal.medicalstock.alldischarges.txt = All discharges angal.medicalstock.charge.btn = Charge angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = Choose a medical. diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java index 64390878c4..e2d8626fd8 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java @@ -112,6 +112,9 @@ public class MovStockBrowser extends ModalJFrame { private static final String FROM_LABEL = MessageBundle.getMessage("angal.common.from.txt") + ':'; private static final String TO_LABEL = MessageBundle.getMessage("angal.common.to.txt") + ':'; + private static final String TEXT_ALL = MessageBundle.getMessage("angal.common.all.txt"); + private static final String TEXT_ALLCHARGES = MessageBundle.getMessage("angal.medicalstock.allcharges.txt"); + private static final String TEXT_ALLDISCHARGES = MessageBundle.getMessage("angal.medicalstock.alldischarges.txt"); private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT_DD_MM_YYYY); @@ -120,7 +123,7 @@ public class MovStockBrowser extends ModalJFrame { private JCheckBox jCheckBoxKeepFilter; private JComboBox medicalBox; private JComboBox medicalTypeBox; - private JComboBox typeBox; + private JComboBox movementTypeBox; private JComboBox wardBox; private GoodDateChooser movDateFrom; private GoodDateChooser movDateTo; @@ -314,7 +317,7 @@ public void updateTotals() { totalAmount = new BigDecimal(0); // quantity - if (!medicalBox.getSelectedItem().equals(MessageBundle.getMessage("angal.common.all.txt"))) { + if (!medicalBox.getSelectedItem().equals(TEXT_ALL)) { for (Movement mov : moves) { if (mov.getType().getType().contains("+")) { totalQti += mov.getQuantity(); @@ -474,7 +477,7 @@ private JPanel getLotDueDatePanel() { private JComboBox getWardBox() { wardBox = new JComboBox(); wardBox.setPreferredSize(new Dimension(200, 25)); - wardBox.addItem(MessageBundle.getMessage("angal.common.all.txt")); + wardBox.addItem(TEXT_ALL); List wardsList; try { wardsList = wardBrowserManager.getWards(); @@ -508,7 +511,7 @@ private JPanel getMedicalSearchPanel() { int originalSize = medicals.size(); int resultsSize = results.size(); if (originalSize == resultsSize) { - medicalBox.addItem(MessageBundle.getMessage("angal.common.all.txt")); + medicalBox.addItem(TEXT_ALL); } for (Medical aMedical : results) { medicalBox.addItem(aMedical); @@ -554,7 +557,7 @@ private JComboBox getMedicalBox() { medical = null; OHServiceExceptionUtil.showMessages(e1); } - medicalBox.addItem(MessageBundle.getMessage("angal.common.all.txt")); + medicalBox.addItem(TEXT_ALL); if (null != medical) { for (Medical aMedical : medical) { medicalBox.addItem(aMedical); @@ -594,7 +597,7 @@ private JComboBox getMedicalTypeBox() { medicalTypeBox.setPreferredSize(new Dimension(200, 25)); List medical; - medicalTypeBox.addItem(MessageBundle.getMessage("angal.common.all.txt")); + medicalTypeBox.addItem(TEXT_ALL); try { medical = medicalTypeBrowserManager.getMedicalType(); @@ -636,36 +639,42 @@ public void mouseClicked(MouseEvent e) { } private JComboBox getMovementTypeBox() { - typeBox = new JComboBox(); - typeBox.setPreferredSize(new Dimension(200, 25)); - List type; + movementTypeBox = new JComboBox(); + movementTypeBox.setPreferredSize(new Dimension(200, 25)); + List movementTypeList; try { - type = medicalDsrStockMovementTypeBrowserManager.getMedicalDsrStockMovementType(); + movementTypeList = medicalDsrStockMovementTypeBrowserManager.getMedicalDsrStockMovementType(); } catch (OHServiceException e1) { - type = null; + movementTypeList = null; OHServiceExceptionUtil.showMessages(e1); } - typeBox.addItem(MessageBundle.getMessage("angal.common.all.txt")); - if (null != type) { - for (MovementType movementType : type) { - typeBox.addItem(movementType); + movementTypeBox.addItem(TEXT_ALL); + movementTypeBox.addItem(TEXT_ALLCHARGES); + movementTypeBox.addItem(TEXT_ALLDISCHARGES); + if (null != movementTypeList) { + for (MovementType movementType : movementTypeList) { + movementTypeBox.addItem(movementType); } } - typeBox.addActionListener(actionEvent -> { - if (!(typeBox.getSelectedItem() instanceof String)) { - MovementType selected = (MovementType) typeBox.getSelectedItem(); + movementTypeBox.addActionListener(actionEvent -> { + Object selectedMovementType = movementTypeBox.getSelectedItem(); + + if (!(selectedMovementType instanceof String)) { + MovementType selected = (MovementType) selectedMovementType; if (selected.getType().contains("-")) { wardBox.setEnabled(true); } else { wardBox.setSelectedIndex(0); wardBox.setEnabled(false); } + } else if (TEXT_ALLDISCHARGES.equals(selectedMovementType)) { + wardBox.setEnabled(true); } else { wardBox.setSelectedIndex(0); wardBox.setEnabled(false); } }); - return typeBox; + return movementTypeBox; } private JTable getMovTable() { @@ -791,7 +800,7 @@ private JButton getFilterButton() { filterButton.addActionListener(actionEvent -> { Integer medicalSelected = null; String medicalTypeSelected = null; - String typeSelected = null; + String movementTypeSelected = null; String wardSelected = null; boolean dateOk = true; @@ -845,9 +854,18 @@ private JButton getFilterButton() { .getSelectedItem()).getCode(); } } - if (!(typeBox.getSelectedItem() instanceof String)) { - typeSelected = ((MovementType) typeBox + if (!(movementTypeBox.getSelectedItem() instanceof String)) { + movementTypeSelected = ((MovementType) movementTypeBox .getSelectedItem()).getCode(); + } else { + movementTypeSelected = (String) movementTypeBox.getSelectedItem(); + if (movementTypeSelected.equals(TEXT_ALL)) { + movementTypeSelected = null; + } else if (movementTypeSelected.equals(TEXT_ALLCHARGES)) { + movementTypeSelected = "+"; + } else if (movementTypeSelected.equals(TEXT_ALLDISCHARGES)) { + movementTypeSelected = "-"; + } } if (!(wardBox.getSelectedItem() instanceof String)) { wardSelected = ((Ward) wardBox.getSelectedItem()) @@ -855,7 +873,7 @@ private JButton getFilterButton() { } if (!isAutomaticLot()) { model = new MovBrowserModel(medicalSelected, - medicalTypeSelected, wardSelected, typeSelected, + medicalTypeSelected, wardSelected, movementTypeSelected, movDateFrom.getDateStartOfDay(), movDateTo.getDateStartOfDay(), lotPrepFrom.getDateStartOfDay(), @@ -864,7 +882,7 @@ private JButton getFilterButton() { lotDueTo.getDateStartOfDay()); } else { model = new MovBrowserModel(medicalSelected, - medicalTypeSelected, wardSelected, typeSelected, + medicalTypeSelected, wardSelected, movementTypeSelected, movDateFrom.getDateStartOfDay(), movDateTo.getDateStartOfDay(), null, @@ -1025,22 +1043,22 @@ private String compileFileName() { StringBuilder filename = new StringBuilder("Stock Ledger"); if (medicalBox.isEnabled() && !medicalBox.getSelectedItem().equals( - MessageBundle.getMessage("angal.common.all.txt"))) { + TEXT_ALL)) { filename.append('_').append(medicalBox.getSelectedItem()); } if (medicalTypeBox.isEnabled() && !medicalTypeBox.getSelectedItem().equals( - MessageBundle.getMessage("angal.common.all.txt"))) { + TEXT_ALL)) { filename.append('_').append(medicalTypeBox.getSelectedItem()); } - if (typeBox.isEnabled() && - !typeBox.getSelectedItem().equals(MessageBundle.getMessage("angal.common.all.txt"))) { - filename.append('_').append(typeBox.getSelectedItem()); + if (movementTypeBox.isEnabled() && + !movementTypeBox.getSelectedItem().equals(TEXT_ALL)) { + filename.append('_').append(movementTypeBox.getSelectedItem()); } if (wardBox.isEnabled() && - !wardBox.getSelectedItem().equals(MessageBundle.getMessage("angal.common.all.txt"))) { + !wardBox.getSelectedItem().equals(TEXT_ALL)) { filename.append('_').append(wardBox.getSelectedItem()); } filename.append('_').append(TimeTools.formatDateTime(movDateFrom.getDateStartOfDay(), DATE_FORMAT_YYYYMMDD)) From 19f8d1a2acb09544cb4081b8a6ed26b12038d7a2 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Fri, 10 May 2024 18:20:21 +0200 Subject: [PATCH 25/86] OP-1224 add reset button for pharmaceutical stock filter (#2000) * OP-1224 Add Reset button for Pharmaceutical Stock filter * Fix bundles --- bundle/language_en.properties | 2 ++ .../isf/medicalstock/gui/MovStockBrowser.java | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/bundle/language_en.properties b/bundle/language_en.properties index 4634fe8dad..194e8713e1 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -887,6 +887,8 @@ angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto angal.medicalstock.prepdate = Preparation date angal.medicalstock.prepdate.col = Prep Date angal.medicalstock.refno.col = Ref. No. +angal.medicalstock.reset.btn = Reset +angal.medicalstock.reset.btn.key = T angal.medicalstock.selectionpanel = Selection Panel angal.medicalstock.stockmovement.title = Stock Movement angal.medicalstock.stockmovementbrowser.title = Stock Movement Browser diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java index e2d8626fd8..11c63df650 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java @@ -120,6 +120,7 @@ public class MovStockBrowser extends ModalJFrame { private final JFrame myFrame; private JButton filterButton; + private JButton resetButton; private JCheckBox jCheckBoxKeepFilter; private JComboBox medicalBox; private JComboBox medicalTypeBox; @@ -364,6 +365,7 @@ private JPanel getFilterContentPanel() { filterContentPanel.add(getLotDueDatePanel()); JPanel filterButtonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); filterButtonPanel.add(getFilterButton()); + filterButtonPanel.add(getResetButton()); filterButtonPanel.add(getJCheckBoxKeepFilter()); filterContentPanel.add(filterButtonPanel); return filterContentPanel; @@ -904,6 +906,35 @@ private JButton getFilterButton() { return filterButton; } + private JButton getResetButton() { + resetButton = new JButton(MessageBundle.getMessage("angal.medicalstock.reset.btn")); + resetButton.setMnemonic(MessageBundle.getMnemonic("angal.medicalstock.reset.btn.key")); + resetButton.addActionListener(actionEvent -> { + + searchTextField.setText(""); + searchButton.doClick(); + medicalTypeBox.setSelectedIndex(0); + movementTypeBox.setSelectedItem(MessageBundle.getMessage("angal.common.all.txt")); + wardBox.setSelectedItem(MessageBundle.getMessage("angal.common.all.txt")); + + movDateFrom.setDate(LocalDate.now().minusWeeks(1)); + movDateTo.setDate(LocalDate.now()); + + if (!isAutomaticLot()) { + lotPrepFrom.setDate(null); + lotPrepTo.setDate(null); + } + lotDueFrom.setDate(null); + lotDueTo.setDate(null); + + if (jCheckBoxKeepFilter.isSelected()) { + filterButton.doClick(); + } + }); + return resetButton; + + } + /** * This method creates the button that close the mask * From 905d21df10645bc737dc51e62e6500fee700bca0 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Fri, 10 May 2024 18:21:07 +0200 Subject: [PATCH 26/86] OP-1222 ProductLedger improvements (#2001) --- rpt_base/ProductLedger.jasper | Bin 61812 -> 63960 bytes rpt_base/ProductLedger.jrxml | 35 ++++++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/rpt_base/ProductLedger.jasper b/rpt_base/ProductLedger.jasper index 207ec571fc3cb28c7a7e1118eb9c31bedb21db03..82f95339c572f3648c53f19ed038fb6159d33efb 100644 GIT binary patch delta 14639 zcmcIr33yaRwm#L}>F%VP>@i^pB!ndiAtZr7*vU!)SrC#SipC~sLPH=S>9DBS1VM3O zSV~!CaX}DKfk46{lIS1`A_6Llg4?_|^Sx1@jx&zFd86-~s@wN=C#}GHZ}_zCIj5@5 zf6lpe>%Vmy{`!Uf^7s0EdxBXH-j>mW*BLF%7lJ?3MFcfC7uVQx7uD6<8yXz7^X9{Y z5Z1gitckI@=6(@{{(gNL>mh}&86DHSp=Tahul3r<_#gX+^G9PBvbqDkQS(oX;4jDB zhn@ZVpqi2t&M)?T0M(LysLn`^;Q!sf5!Lzes4h)qQE}Z z**ffmnV)$wfDhXg)cl9BPKx)A%zDNz<%RR>Sr4K*JsZ_8^27NTIS-*~&#h-HjbF~& zh)UgfR0i`e^LL=~Pyr5nq$HgCPkbBI^AqctCB2afv>X8ZdF;5@sK{jd{6mS--p&ZrhJbBT9hM|=C7S*cPa1sS z$qtF9$b_ei?~t#)KjB$MsO#HG>$~}$X*2K<;%#?2EO!#HXv!q8H246P9THfP30N85 z5x7hwIw8FbbnNn1a zt1zb`Q=8(^Q95l>XAqk4E3PUg=jIicXs&J}bPHuz*bzl`p*g24*CT&QCX{BGuq(S{ zN~z*3q$)a$%%WU*lS_&;5NV%MHmRaGv&bV{X`ebdr-NO(r=V^xou;`DCii~jnT2I; zABZWVoKl*J<@4@}YRsNYlF73D?MeNf(7JqqQk)!j|Y z#eI$E-wliAZPgZ&SYG;ze88+;IBp`g7x|o7JyCvaRy4}HXT^BT>B+yI6^z!O#fWIf zNR+2Jy7!b`gT-oTbUJF13u`NFHFmf2bq)%m72Ava69+l}2eub^x7ifvnAsyxUOYP% z(P zqeMyh@`II8QErds?8f?f`@BleG(wk)(a;?k*tF0?4dCkE4G++z&cPGBh{jCTt;xWLOw^9E*+ zHP3C$cY>~V7MTjL(dkIaZT@NAVaBF%wk!X8bOt(fr#rU7Ejo z@NJzM=IN%PC}S##7$#T}Vls*;PxDgolm}PZgQ+?QPSPM3_Ic52edY_Zk zGT@-Pm0NB+Xxx3yQ9C7c^wB> z_zeI9y323k+NA4SeBo0)d%uUG{!lZy$X7mhRj*F@pcJxh71`F%}eiPwDD8#qf&; z+lBAhvc!#)m06fsoSmy71$CIlZF|C)kzTv_J=6UC<>?_H#-HQM@i5|Fco?6`P&`D$ z_|LO1jLE5O#4Rm8B>_t+yei=-@5^*MMPa?F;u&6$Ruw`G307a##lZz%(cLGP5IVX1 z2BvzJk)X^T&P$%YOZR>qkA1Q)KmYU`*1&Dsd*Pep^sNrdV!At`Y2@>FrSy`zESu*W zvmCRSx9v(X$}xO?{-Cak8Iu-8aUX8{8u`|3!`LYP;kL(BxTV`2mh}WDnsowB>OSCP zhk#Q=giDZ9*LQ+jM`c(35W-4+en)>cy7{LaFEYf>j1S{2&qiX(XP+I(_HqB`n$)QF zJZBdNEOSyghrm}vaTApB9r3Tz+dNr0cL%?H zXtGIB#6oj-bbvI5iX5Lk5YC_5JDx!I3ecAkbP$1xCQ*V)gAY)pLxM_0f+`&yK@$b& zv4bIe$1BAM`k$}##!N$AU2dVb5u<3b_;)8#q*%bu?~ied!3S0AGp7e7C}vzCUJsBl z%h%fB2U|k;;eAC2Y1~hF_TQhx#`D$3M_FtHESkFou+#;xA`-A73ScRB0>0ZP@R`FQ zy!k*fo_{GZ{G;#-@isnKl3;hV8(HG0scJy-@KlpBtNd*%*ULtU>FllPyuRA$O4SBgkTsZ(O5BzK_)4OU>vLlrR`LM#&%hQkycXzp^K)kM3)AMuE+vi zkqKRjozVOGLg!uIiQs;34iIHX#0aLpN$EfMraS#?3P3btWB}4215jiUfFe@>QtTAK z7@q;$b|!>(KbeovRVNAh;gf3ecM-N|rb=vSkl2bWuoaoGrPv7@Kl-YF&?~-4AZPQG zvmre6)IenoOg%*pz?@SQ#i~>80?-SbNi=mb2x*W(D6$Abktql%b_zm`00k|GgmWSM z{k{gC{0@=%;&%vs%R6cjRuR5v9+mjgAn_Gh;43oWOR*FFqaFdM_$-#6%ZcDgXJ{X= zo$X~Uqu79!u-_+q*%=Dw`7`cn?4oEy^Q??U8e}wzETU0libjf^qIuR=G`ukuf2uf3 zl>fw8f_~+!T8R^cEt+EzTN)&`A`5IqCTuBo!an8`dt+P(A90S@&~eVmR`BcRx?=m| zxxQ=y@A-Zdw!_}PXYGg}7Zr#Vf(5^a)H!PG#kRS2GU*B-q{>lmuXN@vu+=o$ocLo; z19s?FEULp_cyxDV?fpLTN29s)GabO9I)Iq`(?1`59gloN;Byn`7!*&EUu+8PRn_+T zis4l=Z1%yGLsAE)WTe^#&q$k*X1C9*N=UJ%rwy@H4w;#eVNaczQJImNF=M8!vNCme zT3S`A-9B_i`ml`jw2X9aJ^wpC`9dU1=1mvk%>M+}0!EO-!PU>xO` z=Wvc;ppQ=|XJE*#t+EGz9(q~vi&GDO{2UN#1wSy76lVpKl=@o14E|*6Z-oFUC0M~C zr2$s3g1?Kp2U?+vG!C*tpp;Ur5G19+R{SO<+@xC}L`uV~5DH;5ceoY8r8LqC5mFj$ zh1;Yw)(VkQ%Cth1l(MbRRZ6*5VBPq~7pEI1SYaX*^3fmkyQA0&B~Zv9fKtw*nl}U> z&h1v1OlC8g%Wd@yX28O@KQ&sQ9PTi|RJc?G$JIVPCFgUCxM(~Uh#8z{pbsz=#brfVxu(e`SioSA5`EZoGc3Y*)Q=WsxDR36-yh8I0KzCA z63p-*E+hGczzj>VLpk@GVHtMFwP%Lq*g-PR;xj%<%XpMQm?&tCZC>@D(pmMj3u&#I z;Bj2gT1QrGZH?VFF92+?$_l@O)%?&$eNxxrTGqx)an?KLRhxk`V5tGH2A;CQdf0&A z@~27$5xnkFxa&?cY{DUf1K=^(LhJi!ygBiACX}0Co0miRogo0W!VVht3=PXkC?~^n zR(KwEV(qHLw}^7wSnT5A$q9f)SY?LYh>&K2Jq#i{M92#-1$4O!R#Aj6Tj3RWl~-O$ zH@^t`3FH9Zaj9F#LG%?fFeU(Agcd8b!eM^q(nuU~)C$MoH6D1mkM(uDsb#oQahbO9 z?Uy5rZ&=|?_&q;*Id#lixW=+;Y8$W|SvD+erQHl~IoYI}?cPJ5NMV4l;C+ZtiL zOIT-l%9XU?=P=or+LWkDp4RR%@xG9%YE3M+u(G}MORhSaoq}^;%)u=l|&ZCdtZGtK}QcU z?!r3gCaz|DMsY8~HX5z(qMhNjDzTNnb9Hi$M0NPH}sj2-?wQFiTs@0mBh^j+VlTe*=#3ds`U&*M?)w)wqt<}^tROf5z5H0LP zOdl}RAee+<-wp$DyBq~muoR_mCzOE$OT7rD!Xt18ri5FmlG1*Wk_%ulx^7ThHy(na zs4mph3{)3u>IhWt*VIv{F45F6sJb+D9I8#4nuY2^nkp89ORk1~;Eze%i%Hlpi5Zwg zB_>gYN!T%onV3X1CNT>`UjYwe8js*;18OU2(HVz;k?x&g9V_bo5?)tfZ#e!>e_q7@ z$@ew<9}C6k9$WC5fLAMki&dl01r0m#8i?03cn!kkjh#q(pew>_FTCD|*CBXaiq~|! z?#Am-06netVR$8n8F*cW*Wq}56|W=kiXZJU6)@!Ebu?aQ<8=&PR~&=KrX{)#LZ23R zq7BxBu4{oOH$&G%&9YHgO!{45FtozvqFwrC>`fEnx1NH)W3Y8vU@L6j1zj{dj#@<> znxzGvMI}W}L!}m{;HYXeCb}f}DTvpGczKS}?7P6?M#Sj}G~GShBb2_{1TRMvq7p;V zF5RD%5M5(h;Dt8WDq|d_D%B!J-ASC}uFo#4#wO^87Hv-8hRtANyMUrptX@&-miu&| z;kZ0KC}wXD*~j2TDrQUzyo9&uFzjuGeWA@Qa0rdPr4f}DID%>27J3}pVC+##LrSu& zle|w!QYqTS{*-vorKU%>f0IZi3ukmrT8r5oayJ~OhD_znk>x|rt5F*waB!Va1R1hR zMxgZIxM~;nxv_2(LFckl1ZvqSf-E(HKo7^XjyH)gyatcM!7jY_MZ4g0kJ0iui14sz z^GA555ib+O>9oGRv#=(Ho@jygT`jZpYW1)eTnlh# zS_q%P{kStdz>N5YmHiyPHC_8zQf zpTP#59yaPMupT$9O}Zf1s*8nfx*XW9D@3^ncIYO-^SFWS)GdJ*aRb|ID~7pn&9DNl8&<*>hBfdX@B!xk z1dRA^*lPmUhrhr8(3^lU6MP6dGwj9xe!&r{O)qWC7+GL~t@^%wtmEk#si^&>s$7!% zy5guc`iTBkF`Bfks@79zak8sh&u-&PE*u-%4dLO^|1YuJB(J#sRm375h|8ULMObK^ zg!JXz~HALJc6~&uZF1O+R5A`AzWt@ADRfvVGUQxP3;NKAMH`32LOnz* za$CJ&1TKZo$pcB0Ouvpxka*2qYFc*v%_y7@I-i758+PLQF_3 z8W<7__G21uVo~RBf{w%@y1a;mEW7aBp*?}W!7DD6SP=dM}Z)hvL`cCkRVj0Lgh@w$@*v)wG5onaB|J=T?d z#=7bBth>&_y6UW~hc1Z4=wex{E{FBj6{1|k;&hW(f8Bj7UbloL>6WsAx`$Y*ZZ}KQ zy~Kv<+SxGO4=h6uY^a{G;d%obtxsTM^hqpBpT)BE3t5id)r872maAXE3iPkC3Hk%9 zSpN|#(SMECZ`dULcdXQ4Wo3o|tlTgj<$N~PFp=G5n9Zge=CXSYE11o&lGzPw*jz7S zxk+Ae!QOujv8cTA$#3$C>y}R}H%Tlv$t!sNyTucW_nX%L^}r(E|8C{PBH!FpV!@-6 zPhugv*M{rn6*_BaOyt7D)2*FYaHqK@H!FO?aqmM>EJ;F^7Nosy&c@rfyH&pCzcK`+I0H*)dNe1q!nHvtK6t_T3n)j8nMuAQ%@|~ zK#voP+*d_;I#FAPqG`9vT{MMPG{-I^7Sb?+Up=vCqmfwTU^lU-VW`9+EE+E%uV~YK z99Zc6L#EM@SUhs^INKx&1P${cOCM|TI3auys`m#Wh3&+)5t4Zkyo}MuRN`DS=n|Z zmgkUIo=0NYiNx|863YunEPIexUP5Ad6^UgZ63am(mP1G^N03;KBC#ApVmX4u@){CL z8xl)963a;>mbZ{tPU)LaUdG-=UU?UJ_TF>g2ZwO ziRCI1%XK7{Pmx%@L}K{^63d^ESib$=5X(*Sic5d1Cl-}hKEp$j4)8C!-rVnCzJCTA z?&Ehb`W4PFVeB~c50E1MZZgRO$PUv{Vh!~$k~c+1@YP=j@Yb*L=r=yob+w=VCbH>s zRn>c|2I??=gXob7I#~4ZdH+6`~yVva98{EKyo{Pd*Mx_5uof0Zg{){7y392zn zGm3vVA+ibQKYxA4z0=h}5!xW9YP?Mt|3dD5ry3)*kuRvmC~ah$YV6v;YlA7o0Dk$K zB-drNqnkGRFRHP-F#eOW3{Z_d)RCq>sxewKj#7<1HDkGIjM0oMU8*%!SOwA!)!17b zdQ>&W2_x0hbU`(WKulB>Sg9KOijl&oRi&S1Y-HhXRQO zs>VchBomXw?G(#Yjuii7M;Mc|k@qyrcPZ<5pk`g9I>mpzgE><8Y@KQxq#5_B#uQtP@BSLr1Dcea#|rt>a_AOaC8LR)u>2 delta 12874 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 DFC|?- diff --git a/rpt_base/ProductLedger.jrxml b/rpt_base/ProductLedger.jrxml index 4b68a2c798..cff09a0199 100644 --- a/rpt_base/ProductLedger.jrxml +++ b/rpt_base/ProductLedger.jrxml @@ -1,5 +1,5 @@ - + @@ -7,6 +7,7 @@ + @@ -57,7 +58,7 @@ LEFT JOIN OH_MEDICALDSRSTOCKMOV ON MDSR_ID = MMV_MDSR_ID LEFT JOIN OH_MEDICALDSRTYPE ON MDSRT_ID_A = MDSR_MDSRT_ID_A LEFT JOIN OH_MEDICALDSRSTOCKMOVTYPE ON MMV_MMVT_ID_A = MMVT_ID_A - WHERE DATE(MMV_DATE) <= DATE($P{fromdate}) + WHERE DATE(MMV_DATE) < DATE($P{fromdate}) AND MDSR_ID = $P{productID} GROUP BY MDSR_ID, MMV_LT_ID_A, MMV_MMVT_ID_A) AS QUANTITY JOIN OH_MEDICALDSRLOT ON MMV_LT_ID_A = LT_ID_A @@ -70,7 +71,7 @@ LEFT JOIN OH_MEDICALDSRSTOCKMOV ON MDSR_ID = MMV_MDSR_ID LEFT JOIN OH_MEDICALDSRTYPE ON MDSRT_ID_A = MDSR_MDSRT_ID_A LEFT JOIN OH_MEDICALDSRSTOCKMOVTYPE ON MMV_MMVT_ID_A = MMVT_ID_A - WHERE DATE(MMV_DATE) <= DATE($P{fromdate}) + WHERE DATE(MMV_DATE) < DATE($P{fromdate}) AND MDSR_ID = $P{productID} GROUP BY MDSR_ID, MMV_LT_ID_A, MMV_MMVT_ID_A) AS QUANTITY JOIN OH_MEDICALDSRLOT ON MMV_LT_ID_A = LT_ID_A @@ -83,7 +84,7 @@ LEFT JOIN OH_MEDICALDSRSTOCKMOV ON MDSR_ID = MMV_MDSR_ID LEFT JOIN OH_MEDICALDSRTYPE ON MDSRT_ID_A = MDSR_MDSRT_ID_A LEFT JOIN OH_MEDICALDSRSTOCKMOVTYPE ON MMV_MMVT_ID_A = MMVT_ID_A - WHERE DATE(MMV_DATE) <= DATE($P{fromdate}) + WHERE DATE(MMV_DATE) < DATE($P{fromdate}) AND MDSR_ID = $P{productID} GROUP BY MDSR_ID, MMV_LT_ID_A, MMV_MMVT_ID_A) AS QUANTITY JOIN OH_MEDICALDSRLOT ON MMV_LT_ID_A = LT_ID_A @@ -207,6 +208,16 @@ ORDER BY ORDERING_FIELD ASC, MMV_DATE ASC, MMV_REFNO DESC]]> + + + + + + @@ -732,7 +743,7 @@ ORDER BY ORDERING_FIELD ASC, MMV_DATE ASC, MMV_REFNO DESC]]> - + @@ -743,9 +754,11 @@ ORDER BY ORDERING_FIELD ASC, MMV_DATE ASC, MMV_REFNO DESC]]> - + - + @@ -758,7 +771,7 @@ ORDER BY ORDERING_FIELD ASC, MMV_DATE ASC, MMV_REFNO DESC]]> - + @@ -769,9 +782,11 @@ ORDER BY ORDERING_FIELD ASC, MMV_DATE ASC, MMV_REFNO DESC]]> - + - + From 091b757db1a7c90b9f0c366f6df98ee09b251207 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Fri, 10 May 2024 18:33:16 +0200 Subject: [PATCH 27/86] OP-1223 Improve Pharmaceutical Stock label and graphics (#2002) --- bundle/language_en.properties | 1 + .../isf/medicalstock/gui/MovStockBrowser.java | 43 ++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/bundle/language_en.properties b/bundle/language_en.properties index 194e8713e1..812756170c 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -795,6 +795,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = Choose a valid movement date. angal.medicalstock.chooseavalidpreparationdate = Choose a valid preparation date angal.medicalstock.clickdrugs = Double click to show lot details +angal.medicalstock.codeordescription.txt = Code or Description angal.medicalstock.cost.col = Cost angal.medicalstock.deletemovementsuccess.msg = Last movement successfully deleted. angal.medicalstock.discharge.btn = Discharge diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java index 11c63df650..09151f1adc 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java @@ -49,6 +49,7 @@ import javax.swing.BorderFactory; import javax.swing.BoxLayout; +import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; @@ -56,6 +57,7 @@ import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; @@ -63,6 +65,8 @@ import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; +import javax.swing.ToolTipManager; +import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; @@ -107,6 +111,9 @@ */ public class MovStockBrowser extends ModalJFrame { + private static final int defaultInitDelay = ToolTipManager.sharedInstance().getInitialDelay(); + private static final Color defaultBackgroundColor = (Color) UIManager.get("ToolTip.background"); + private static final long serialVersionUID = 1L; private static final Logger LOGGER = LoggerFactory.getLogger(MovStockBrowser.class); @@ -384,7 +391,7 @@ private JPanel getMedicalPanel() { medicalPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory .createLineBorder(Color.GRAY), MessageBundle.getMessage("angal.medicalstock.pharmaceutical"))); JPanel label1Panel = new JPanel(new FlowLayout(FlowLayout.CENTER)); - label1Panel.add(new JLabel(MessageBundle.getMessage("angal.common.description.txt"))); + label1Panel.add(new JLabel(MessageBundle.getMessage("angal.medicalstock.codeordescription.txt"))); medicalPanel.add(label1Panel); medicalPanel.add(getMedicalSearchPanel()); JPanel medicalDescPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); @@ -551,6 +558,7 @@ public void keyTyped(KeyEvent e) { private JComboBox getMedicalBox() { medicalBox = new JComboBox(); + medicalBox.setRenderer(new ToolTipListCellRenderer()); medicalBox.setPreferredSize(new Dimension(200, 25)); List medical; try { @@ -565,14 +573,21 @@ private JComboBox getMedicalBox() { medicalBox.addItem(aMedical); } } + medicalBox.addActionListener(actionEvent -> { + medicalBox.setToolTipText(getTooltipFromObject(medicalBox.getSelectedItem())); + }); medicalBox.addMouseListener(new MouseListener() { @Override public void mouseExited(MouseEvent e) { + ToolTipManager.sharedInstance().setInitialDelay(defaultInitDelay); + UIManager.put("ToolTip.background", defaultBackgroundColor); } @Override public void mouseEntered(MouseEvent e) { + ToolTipManager.sharedInstance().setInitialDelay(0); + UIManager.put("ToolTip.background", Color.white); } @Override @@ -1298,4 +1313,30 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } } + + private String getTooltipFromObject(Object value) { + String tooltip = ""; + if (value instanceof Medical) { + tooltip = ((Medical) value).getDescription(); + } else if (value instanceof String) { + tooltip = (String) value; + } + return tooltip; + } + + public class ToolTipListCellRenderer extends DefaultListCellRenderer { + + @Override + public Component getListCellRendererComponent(JList< ? > list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + // I'd extract the basic "text" representation of the value + // and pass that to the super call, which will apply it to the + // JLabel via the setText method, otherwise it will use the + // objects toString method to generate a representation + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + String tooltip = getTooltipFromObject(value); + setToolTipText(tooltip); + return this; + } + + } } From 812e08faba836b1c4222cb8583e85c2ccdbcbbff Mon Sep 17 00:00:00 2001 From: mwithi Date: Fri, 10 May 2024 18:38:50 +0200 Subject: [PATCH 28/86] Update version --- README.md | 2 +- pom.xml | 4 ++-- rsc/version.properties | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d51bf60ba6..92823a43f4 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ or any similar SQL database (e.g. MariaDB). ### Launch within IDE -Be sure to have configured properly the classpath for the project (see [5 Installing Open Hospital 1.14.1 in Eclipse EE](https://github.com/informatici/openhospital-doc/blob/develop/doc_admin/AdminManual.adoc#5-installing-open-hospital-1-14-1-in-eclipse-ee)) +Be sure to have configured properly the classpath for the project (see [5 Installing Open Hospital 1.14.2 in Eclipse EE](https://github.com/informatici/openhospital-doc/blob/develop/doc_admin/AdminManual.adoc#5-installing-open-hospital-1-14-2-in-eclipse-ee)) Before running the application, you should generate the config files with the `g)` option, or manually copying and renaming the files `*.dist` files in `rsc/` folder and edit them accordingly: diff --git a/pom.xml b/pom.xml index 3dca17a8aa..2e07e3c92f 100644 --- a/pom.xml +++ b/pom.xml @@ -13,10 +13,10 @@ org.isf OH-gui jar - 1.14.1 + 1.14.2 - 1.14.1 + 1.14.2 17 UTF-8 5.3.32 diff --git a/rsc/version.properties b/rsc/version.properties index ff246b66b7..2a25d843c3 100644 --- a/rsc/version.properties +++ b/rsc/version.properties @@ -1,4 +1,4 @@ # This file is not meant to be modified by the user VER_MAJOR=1 VER_MINOR=14 -VER_RELEASE=1 +VER_RELEASE=2 From f7b3c235887116f68858884c9af577f9f7400104 Mon Sep 17 00:00:00 2001 From: mwithi Date: Fri, 10 May 2024 18:40:23 +0200 Subject: [PATCH 29/86] Fix pom --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2e07e3c92f..a37c3e3e3f 100644 --- a/pom.xml +++ b/pom.xml @@ -13,10 +13,10 @@ org.isf OH-gui jar - 1.14.2 + 1.14.2-SNAPSHOT - 1.14.2 + 1.14.2-SNAPSHOT 17 UTF-8 5.3.32 From e0fcb279c2e5005cb2aa6580ae23f3824375362b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 04:42:39 +0000 Subject: [PATCH 30/86] Chore(deps-dev): Bump org.mockito:mockito-junit-jupiter Bumps [org.mockito:mockito-junit-jupiter](https://github.com/mockito/mockito) from 5.11.0 to 5.12.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.11.0...v5.12.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2af43fd74..eed064c888 100644 --- a/pom.xml +++ b/pom.xml @@ -353,7 +353,7 @@ org.mockito mockito-junit-jupiter - 5.11.0 + 5.12.0 test From 3083400c40371bcef14715083135bc1efb55599f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 04:42:44 +0000 Subject: [PATCH 31/86] Chore(deps): Bump license.maven.plugin.version from 4.4 to 4.5 Bumps `license.maven.plugin.version` from 4.4 to 4.5. Updates `com.mycila:license-maven-plugin-git` from 4.4 to 4.5 - [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.4...license-maven-plugin-4.5) Updates `com.mycila:license-maven-plugin` from 4.4 to 4.5 - [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.4...license-maven-plugin-4.5) --- updated-dependencies: - dependency-name: com.mycila:license-maven-plugin-git dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.mycila:license-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2af43fd74..aac27b3a0f 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ 1.14.1-SNAPSHOT 17 UTF-8 - 4.4 + 4.5 From 61e40cbff721ccf20eb99eb5a52e2bb0336c2735 Mon Sep 17 00:00:00 2001 From: mwithi Date: Mon, 13 May 2024 19:11:47 +0200 Subject: [PATCH 32/86] Update license headers --- src/main/java/org/isf/medicals/gui/MedicalBrowser.java | 2 +- src/main/java/org/isf/medicals/gui/MedicalEdit.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java index 63f7b968ac..1b8ba7d363 100644 --- a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java +++ b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java @@ -1,6 +1,6 @@ /* * Open Hospital (www.open-hospital.org) - * Copyright © 2006-2023 Informatici Senza Frontiere (info@informaticisenzafrontiere.org) + * Copyright © 2006-2024 Informatici Senza Frontiere (info@informaticisenzafrontiere.org) * * Open Hospital is a free and open source software for healthcare data management. * diff --git a/src/main/java/org/isf/medicals/gui/MedicalEdit.java b/src/main/java/org/isf/medicals/gui/MedicalEdit.java index 9a34dbc369..8906a6af52 100644 --- a/src/main/java/org/isf/medicals/gui/MedicalEdit.java +++ b/src/main/java/org/isf/medicals/gui/MedicalEdit.java @@ -1,6 +1,6 @@ /* * Open Hospital (www.open-hospital.org) - * Copyright © 2006-2023 Informatici Senza Frontiere (info@informaticisenzafrontiere.org) + * Copyright © 2006-2024 Informatici Senza Frontiere (info@informaticisenzafrontiere.org) * * Open Hospital is a free and open source software for healthcare data management. * From c0f71e585df2e70db766212d304d97e2db519f57 Mon Sep 17 00:00:00 2001 From: mwithi Date: Tue, 14 May 2024 23:07:59 +0200 Subject: [PATCH 33/86] Remove -SNAPSHOT before release --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a37c3e3e3f..2e07e3c92f 100644 --- a/pom.xml +++ b/pom.xml @@ -13,10 +13,10 @@ org.isf OH-gui jar - 1.14.2-SNAPSHOT + 1.14.2 - 1.14.2-SNAPSHOT + 1.14.2 17 UTF-8 5.3.32 From f2442d8a242ce27b5ad13cf3209a15cd33a2b06b Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Wed, 22 May 2024 03:24:37 -0400 Subject: [PATCH 34/86] OP-1239 re-enable logging to a physical file (#1991) * OP-1239 re-enable logging to a physical file * OP-1239 change `log4.properties` to `log4j2-spring.properties` --- README.md | 12 +++---- oh.bat | 18 +++++----- oh.ps1 | 2 +- oh.sh | 2 +- ohmac.sh | 2 +- pom.xml | 5 --- rsc/log4j.properties.dist | 40 --------------------- rsc/log4j2-spring.properties.dist | 58 +++++++++++++++++++++++++++++++ 8 files changed, 76 insertions(+), 63 deletions(-) delete mode 100644 rsc/log4j.properties.dist create mode 100755 rsc/log4j2-spring.properties.dist diff --git a/README.md b/README.md index 92823a43f4..99c01ac609 100644 --- a/README.md +++ b/README.md @@ -29,12 +29,12 @@ Be sure to have configured properly the classpath for the project (see [5 Instal Before running the application, you should generate the config files with the `g)` option, or manually copying and renaming the files `*.dist` files in `rsc/` folder and edit them accordingly: -| Dist file | Property file | Properties to fill in | -|--------------------------|---------------------|---------------------------------------------------------------| -| database.properties.dist | database.properties | DBSERVER, DBPORT, DBNAME, DBUSER, DBPASS | -| dicom.properties.dist | dicom.properties | OH_PATH_SUBSTITUTE/DICOM_DIR, DICOM_SIZE | -| log4j.properties.dist | log4j.properties | LOG_DEST, DBSERVER, DBPORT, DBNAME, DBUSER, DBPASS, LOG_LEVEL | -| settings.properties.dist | settings.properties | OH_LANGUAGE,(SINGLEUSER=)YES_OR_NO, PHOTO_DIR, OH_DOC_DIR | +| Dist file | Property file | Properties to fill in | +|-------------------------------|--------------------------|---------------------------------------------------------------| +| database.properties.dist | database.properties | DBSERVER, DBPORT, DBNAME, DBUSER, DBPASS | +| dicom.properties.dist | dicom.properties | OH_PATH_SUBSTITUTE/DICOM_DIR, DICOM_SIZE | +| log4j2-spring.properties.dist | log4j2-spring.properties | LOG_DEST, DBSERVER, DBPORT, DBNAME, DBUSER, DBPASS, LOG_LEVEL | +| settings.properties.dist | settings.properties | OH_LANGUAGE,(SINGLEUSER=)YES_OR_NO, PHOTO_DIR, OH_DOC_DIR | *For further information, please refer to the Admin and User manuals in the [Doc project][openhospital-doc].* diff --git a/oh.bat b/oh.bat index 61b39824d5..481f2042c1 100644 --- a/oh.bat +++ b/oh.bat @@ -241,18 +241,18 @@ echo f | xcopy %OH_PATH%\%OH_DIR%\rsc\settings.properties.dist %OH_PATH%\%OH_DIR %REPLACE_PATH%\replace.exe PHOTO_DIR %PHOTO_DIR% -- %OH_PATH%\%OH_DIR%\rsc\settings.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 %REPLACE_PATH%\replace.exe YES_OR_NO %OH_SINGLE_USER% -- %OH_PATH%\%OH_DIR%\rsc\settings.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 -REM ### Setup log4j.properties +REM ### Setup log4j2-spring.properties REM # replace backslash with slash set OH_LOG_DIR=%LOG_DIR:\=/% set OH_LOG_DEST=../%OH_LOG_DIR%/%OH_LOG_FILE% -echo f | xcopy %OH_PATH%\%OH_DIR%\rsc\log4j.properties.dist %OH_PATH%\%OH_DIR%\rsc\log4j.properties /y >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 -%REPLACE_PATH%\replace.exe DBSERVER %DATABASE_SERVER% -- %OH_PATH%\%OH_DIR%\rsc\log4j.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 -%REPLACE_PATH%\replace.exe DBPORT %DATABASE_PORT% -- %OH_PATH%\%OH_DIR%\rsc\log4j.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 -%REPLACE_PATH%\replace.exe DBUSER %DATABASE_USER% -- %OH_PATH%\%OH_DIR%\rsc\log4j.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 -%REPLACE_PATH%\replace.exe DBPASS %DATABASE_PASSWORD% -- %OH_PATH%\%OH_DIR%\rsc\log4j.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 -%REPLACE_PATH%\replace.exe DBNAME %DATABASE_NAME% -- %OH_PATH%\%OH_DIR%\rsc\log4j.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 -%REPLACE_PATH%\replace.exe LOG_LEVEL %LOG_LEVEL% -- %OH_PATH%\%OH_DIR%\rsc\log4j.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 -%REPLACE_PATH%\replace.exe LOG_DEST %OH_LOG_DEST% -- %OH_PATH%\%OH_DIR%\rsc\log4j.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 +echo f | xcopy %OH_PATH%\%OH_DIR%\rsc\log4j2-spring.properties.dist %OH_PATH%\%OH_DIR%\rsc\log4j2-spring.properties /y >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 +%REPLACE_PATH%\replace.exe DBSERVER %DATABASE_SERVER% -- %OH_PATH%\%OH_DIR%\rsc\log4j2-spring.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 +%REPLACE_PATH%\replace.exe DBPORT %DATABASE_PORT% -- %OH_PATH%\%OH_DIR%\rsc\log4j2-spring.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 +%REPLACE_PATH%\replace.exe DBUSER %DATABASE_USER% -- %OH_PATH%\%OH_DIR%\rsc\log4j2-spring.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 +%REPLACE_PATH%\replace.exe DBPASS %DATABASE_PASSWORD% -- %OH_PATH%\%OH_DIR%\rsc\log4j2-spring.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 +%REPLACE_PATH%\replace.exe DBNAME %DATABASE_NAME% -- %OH_PATH%\%OH_DIR%\rsc\log4j2-spring.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 +%REPLACE_PATH%\replace.exe LOG_LEVEL %LOG_LEVEL% -- %OH_PATH%\%OH_DIR%\rsc\log4j2-spring.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 +%REPLACE_PATH%\replace.exe LOG_DEST %OH_LOG_DEST% -- %OH_PATH%\%OH_DIR%\rsc\log4j2-spring.properties >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 REM ### Setup other OH property files echo f | xcopy %OH_PATH%\%OH_DIR%\rsc\examination.properties.dist %OH_PATH%\%OH_DIR%\rsc\examination.properties /y >> "%OH_PATH%\%LOG_DIR%\%LOG_FILE%" 2>&1 diff --git a/oh.ps1 b/oh.ps1 index 31c83df8be..81d1d0c2bf 100644 --- a/oh.ps1 +++ b/oh.ps1 @@ -175,7 +175,7 @@ $script:OH_SETTINGS="settings.properties" $script:DATABASE_SETTINGS="database.properties" $script:EXAMINATION_SETTINGS="examination.properties" $script:IMAGING_SETTINGS="dicom.properties" -$script:LOG4J_SETTINGS="log4j.properties" +$script:LOG4J_SETTINGS="log4j2-spring.properties" $script:PRINTER_SETTINGS="txtPrinter.properties" $script:SMS_SETTINGS="sms.properties" $script:TELEMETRY_SETTINGS="telemetry.properties" diff --git a/oh.sh b/oh.sh index aaf2162028..000cf21fb2 100644 --- a/oh.sh +++ b/oh.sh @@ -116,7 +116,7 @@ OH_SETTINGS="settings.properties" DATABASE_SETTINGS="database.properties" EXAMINATION_SETTINGS="examination.properties" IMAGING_SETTINGS="dicom.properties" -LOG4J_SETTINGS="log4j.properties" +LOG4J_SETTINGS="log4j2-spring.properties" PRINTER_SETTINGS="txtPrinter.properties" SMS_SETTINGS="sms.properties" TELEMETRY_SETTINGS="telemetry.properties" diff --git a/ohmac.sh b/ohmac.sh index 97db64525f..447e822c43 100755 --- a/ohmac.sh +++ b/ohmac.sh @@ -46,7 +46,7 @@ OH_API_JAR="openhospital-api-0.1.0.jar" OH_SETTINGS="settings.properties" DATABASE_SETTINGS="database.properties" IMAGING_SETTINGS="dicom.properties" -LOG4J_SETTINGS="log4j.properties" +LOG4J_SETTINGS="log4j2-spring.properties" API_SETTINGS="application.properties" HELP_FILE="OH-readme.txt" diff --git a/pom.xml b/pom.xml index 07cfc4fb5a..bc86661580 100644 --- a/pom.xml +++ b/pom.xml @@ -298,11 +298,6 @@ slf4j-api 2.0.13 - - org.slf4j - slf4j-reload4j - 2.0.13 - org.imgscalr imgscalr-lib diff --git a/rsc/log4j.properties.dist b/rsc/log4j.properties.dist deleted file mode 100644 index 74187a2a26..0000000000 --- a/rsc/log4j.properties.dist +++ /dev/null @@ -1,40 +0,0 @@ -# global logging to RollingFile (logs/ folder), available levels INFO, DEBUG, FINEST (debug++) -log4j.rootCategory=INFO,RollingFile - -# Null appender (off) -log4j.appender.null=org.apache.log4j.varia.NullAppender - -# StdOut Appender (with classes) (not used) -log4j.appender.StdOut = org.apache.log4j.ConsoleAppender -log4j.appender.StdOut.layout=org.apache.log4j.PatternLayout -log4j.appender.StdOut.layout.ConversionPattern=[%d{dd/MMM/yyyy HH:mm:ss}] [%X{OHUserGroup}:%X{OHUser}] %-p - %m%n - -# File Appender (with classes), daily rotation -log4j.appender.RollingFile=org.apache.log4j.RollingFileAppender -log4j.appender.RollingFile.PatternLayout.pattern='.'yyyy-MM-dd -log4j.appender.RollingFile.File=LOG_DEST -log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout -log4j.appender.RollingFile.Policies.TimeBasedTriggeringPolicy=1 -log4j.appender.RollingFile.layout.ConversionPattern=[%d{dd/MMM/yyyy HH:mm:ss}] [%X{OHUserGroup}:%X{OHUser}] %-p - %m (%l)%n - -# DB Appender (table columns) -log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender -log4j.appender.DB.URL=jdbc:mysql://DBSERVER:DBPORT/DBNAME?autoReconnect=true -log4j.appender.DB.user=DBUSER -log4j.appender.DB.password=DBPASS -log4j.appender.DB.sql=INSERT INTO LOG (LOG_TYPE, LOG_CLASS, LOG_METHOD, LOG_TIME, LOG_MESS, LOG_USER) VALUES (1, '%C', '%M', '%d{yyyy-MM-dd HH:mm:ss}', LEFT('%m', 1024), '%X{OHUser}') -log4j.appender.DB.layout=org.apache.log4j.PatternLayout - -# Security settings - see log4j CVE-2021-44228 -log4j.formatMsgNoLookups=true - -# Assigning appenders to packages (application loggers) -log4j.logger.org.isf=LOG_LEVEL,RollingFile -log4j.additivity.org.isf = false - -# Assigning appenders to Hibernate packages (DB loggers) -# - hibernate.SQL to DEBUG for SQL queries to be logged -# - hibernate.type to TRACE for queries parameters to be logged with "binding parameter [?]" -log4j.logger.org.hibernate=LOG_LEVEL,RollingFile,StdOut -#log4j.logger.org.hibernate.SQL=INFO,RollingFile,StdOut -#log4j.logger.org.hibernate.type=INFO,RollingFile,StdOut diff --git a/rsc/log4j2-spring.properties.dist b/rsc/log4j2-spring.properties.dist new file mode 100755 index 0000000000..a16a10a803 --- /dev/null +++ b/rsc/log4j2-spring.properties.dist @@ -0,0 +1,58 @@ + +status = INFO +rootLogger.level = INFO +rootLogger.appenderRef.console.ref = STDOUT +rootLogger.appenderRef.rolling.ref = RollingFile + +# Direct log messages to STDOUT +appender.console.type = Console +appender.console.name = STDOUT +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = [%d{dd/MMM/yyyy HH:mm:ss}] [%X{OHUserGroup}:%X{OHUser}] %-p - %m%n + +# File Appender (with classes), daily rotation +appender.rolling.type = RollingFile +appender.rolling.name = RollingFile +appender.rolling.fileName= LOG_DEST/openhospital.log +appender.rolling.filePattern= LOG_DEST/openhospital.log.%d{yyyy-MM-dd} +appender.rolling.layout.type = PatternLayout +appender.rolling.layout.pattern = [%d{dd/MMM/yyyy HH:mm:ss}] [%X{OHUserGroup}:%X{OHUser}] %-p - %m (%l)%n +appender.rolling.policies.type = Policies +# To change log file every day +appender.rolling.policies.time.type = TimeBasedTriggeringPolicy +appender.rolling.policies.time.interval = 1 +appender.rolling.policies.time.modulate = true + + +# DB Appender (table columns) +appender.jdbc.type = JDBC +appender.jdbc.name = jdbc +appender.jdbc.connectionSource.driverClassName = com.mysql.cj.jdbc.Driver +appender.jdbc.connectionSource.type = DriverManager +appender.jdbc.connectionSource.connectionString = dbc:mysql://DBSERVER:DBPORT/DBNAME?autoReconnect=true +appender.jdbc.connectionSource.userName = DBUSER +appender.jdbc.connectionSource.password = DBPASS +appender.jdbc.tableName = logs +appender.jdbc.ignoreExceptions = false +appender.jdbc.columnConfigs[0].type = COLUMN +appender.jdbc.columnConfigs[0].name = LOG_TIME +appender.jdbc.columnConfigs[0].pattern = %d +appender.jdbc.columnConfigs[0].isUnicode = false +appender.jdbc.columnConfigs[1].type = COLUMN +appender.jdbc.columnConfigs[1].name = LOG_LEVEL +appender.jdbc.columnConfigs[1].pattern = %5p +appender.jdbc.columnConfigs[1].isUnicode = false +appender.jdbc.columnConfigs[2].type = COLUMN +appender.jdbc.columnConfigs[2].name = MESSAGE +appender.jdbc.columnConfigs[2].pattern = %mm%ex%n +appender.jdbc.columnConfigs[2].isUnicode = false + + +# Assigning appenders to Hibernate packages (DB loggers) +# - hibernate.SQL to DEBUG for SQL queries to be logged +# - hibernate.type to TRACE for queries parameters to be logged with "binding parameter [?]" +##logger.hibernate-SQL.name=org.hibernate.SQL +##logger.hibernate-SQL.level=DEBUG +## +##logger.hibernate-type.name=org.hibernate.type +##logger.hibernate-type.level=TRACE From 42ee9328c08f0f0a6f053e35a05df91e2474107e Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Fri, 24 May 2024 11:15:57 +0200 Subject: [PATCH 35/86] OP-1218 Add Medical soft deletion GUI management (#2009) * Add Medical soft deletion GUI management * Remove old way of tracking changes * Remove old way of tracking changes --- bundle/language_en.properties | 7 +- .../org/isf/medicals/gui/MedicalBrowser.java | 64 +++++++++++++++---- .../org/isf/medicals/gui/MedicalEdit.java | 61 ++++++++++-------- .../gui/MovStockMultipleCharging.java | 2 +- .../gui/MovStockMultipleDischarging.java | 2 +- 5 files changed, 95 insertions(+), 41 deletions(-) diff --git a/bundle/language_en.properties b/bundle/language_en.properties index 812756170c..98dfd72a63 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -746,11 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = No name selected angal.malnutrition.pleaseinsertavalidcontroldate.msg = Please insert a valid control date. angal.malnutrition.pleaseinsertavalidvisitdate.msg = Please insert a valid visit date. +angal.medicals.active.txt = Active +angal.medicals.activeonly.txt = Active only angal.medicals.averagemonthlyconsumption.btn = AMC angal.medicals.averagemonthlyconsumption.btn.key = M -angal.medicals.criticallevel = Critical level +angal.medicals.criticallevel.txt = Critical level angal.medicals.critlevel.col = Crit. Level angal.medicals.deletemedical.fmt.msg = Delete medical: {0}? +angal.medicals.disabledonly.txt = Disabled only angal.medicals.editmedical.title = Edit Medical angal.medicals.expiring.btn = Expiring angal.medicals.expiring.btn.key = P @@ -769,7 +772,7 @@ angal.medicals.order.btn.key angal.medicals.othermonth = Other month... angal.medicals.outofstock.col = Out of Stock angal.medicals.pcsperpck.col = PcsXPck -angal.medicals.pcsperpckExt = Pieces per Packet +angal.medicals.pcsperpck.txt = Pieces per Packet angal.medicals.pharmaceuticalbrowser.title = Pharmaceutical Browser angal.medicals.pleaseselectareport.msg = Please select a report: angal.medicals.pleaseselectperiod.msg = Please select a period: diff --git a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java index 1b8ba7d363..9d7ac4f98a 100644 --- a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java +++ b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java @@ -28,8 +28,10 @@ import java.awt.Color; import java.awt.Component; import java.awt.Dimension; +import java.awt.Font; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import java.awt.font.TextAttribute; import java.io.File; import java.io.IOException; import java.time.LocalDate; @@ -37,6 +39,7 @@ import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.List; +import java.util.Map; import javax.swing.Icon; import javax.swing.ImageIcon; @@ -84,23 +87,18 @@ import com.github.lgooddatepicker.zinternaltools.WrapLayout; /** - * This class shows a complete extended list of medical drugs, - * supplies-sundries, diagnostic kits -reagents, laboratory chemicals. It is - * possible to filter data with a selection combo box - * and edit-insert-delete records - * - * @author bob - * 11-dic-2005 - * modified by alex: - * - product code - * - pieces per packet + * This class shows a complete extended list of medical drugs, supplies-sundries, diagnostic kits -reagents, laboratory chemicals. It is possible to filter data + * with a selection combo box and edit-insert-delete records */ public class MedicalBrowser extends ModalJFrame implements MedicalListener { private static final long serialVersionUID = 1L; private static final Logger LOGGER = LoggerFactory.getLogger(MedicalBrowser.class); - private static final String STR_ALL = MessageBundle.getMessage("angal.common.all.txt").toUpperCase(); + private static final String STR_ALL = MessageBundle.getMessage("angal.common.all.txt"); + + private static final String STR_ACTIVE_ONLY = MessageBundle.getMessage("angal.medicals.activeonly.txt"); + private static final String STR_DISABLED_ONLY = MessageBundle.getMessage("angal.medicals.disabledonly.txt"); @Override public void medicalInserted(Medical medical) { @@ -122,6 +120,7 @@ public void medicalUpdated(AWTEvent e) { table.setRowSelectionInterval(selectedrow, selectedrow); } repaint(); + activeComboBox.setSelectedItem(activeComboBox.getSelectedItem()); // simulate selections int keyCode = 0; // simulate ENTER on the search field KeyEvent enterPressed = new KeyEvent(searchString, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, keyCode, '\n'); searchString.dispatchEvent(enterPressed); @@ -129,6 +128,7 @@ public void medicalUpdated(AWTEvent e) { private int selectedrow; private JComboBox pbox; + private JComboBox activeComboBox; private List pMedicals; private String[] pColumns = { MessageBundle.getMessage("angal.common.type.txt").toUpperCase(), @@ -149,6 +149,7 @@ public void medicalUpdated(AWTEvent e) { private final JFrame me; private String pSelection; + private String activeSelection = STR_ACTIVE_ONLY; private JTextField searchString; protected boolean altKeyReleased = true; private String lastKey = ""; @@ -211,6 +212,7 @@ private JTable getJTable() { private JPanel getJButtonPanel() { JPanel buttonPanel = new JPanel(new WrapLayout()); + buttonPanel.add(getComboBoxActive()); buttonPanel.add(new JLabel(MessageBundle.getMessage("angal.medicals.selecttype"))); buttonPanel.add(getComboBoxMedicalType()); buttonPanel.add(getSearchBox()); @@ -525,10 +527,32 @@ private JButton getJButtonNew() { return buttonNew; } + private JComboBox getComboBoxActive() { + if (activeComboBox == null) { + activeComboBox = new JComboBox(); + activeComboBox.addItem(STR_ACTIVE_ONLY); + activeComboBox.addItem(STR_ALL); + activeComboBox.addItem(STR_DISABLED_ONLY); + activeSelection = STR_ACTIVE_ONLY; + } + activeComboBox.addActionListener(actionEvent -> { + activeSelection = activeComboBox.getSelectedItem().toString(); + if (pSelection.compareTo(STR_ALL) == 0) { + model = new MedicalBrowsingModel(); + } else { + model = new MedicalBrowsingModel(pSelection, true); + } + table.setModel(model); + model.fireTableDataChanged(); + table.updateUI(); + }); + return activeComboBox; + } + private JComboBox getComboBoxMedicalType() { if (pbox == null) { pbox = new JComboBox(); - pbox.addItem(MessageBundle.getMessage("angal.common.all.txt").toUpperCase()); + pbox.addItem(STR_ALL); List type; try { type = medicalTypeManager.getMedicalType(); @@ -538,6 +562,7 @@ private JComboBox getComboBoxMedicalType() { } catch (OHServiceException e) { OHServiceExceptionUtil.showMessages(e); } + pSelection = STR_ALL; } pbox.addActionListener(actionEvent -> { pSelection = pbox.getSelectedItem().toString(); @@ -658,6 +683,11 @@ public MedicalBrowsingModel(String key, boolean isType) { if (isType) { try { medicalList = pMedicals = medicalBrowsingManager.getMedicals(key, false); + if (activeSelection.equals(STR_ACTIVE_ONLY)) { + medicalList = pMedicals = new ArrayList<>(pMedicals.stream().filter(med -> med.getDeleted() == 'N').toList()); + } else if (activeSelection.equals(STR_DISABLED_ONLY)) { + medicalList = pMedicals = new ArrayList<>(pMedicals.stream().filter(med -> med.getDeleted() == 'Y').toList()); + } } catch (OHServiceException e) { pMedicals = null; OHServiceExceptionUtil.showMessages(e); @@ -695,6 +725,11 @@ public MedicalBrowsingModel(String key, boolean isType) { public MedicalBrowsingModel() { try { medicalList = pMedicals = medicalBrowsingManager.getMedicals(null, false); + if (activeSelection.equals(STR_ACTIVE_ONLY)) { + medicalList = pMedicals = new ArrayList<>(pMedicals.stream().filter(med -> med.getDeleted() == 'N').toList()); + } else if (activeSelection.equals(STR_DISABLED_ONLY)) { + medicalList = pMedicals = new ArrayList<>(pMedicals.stream().filter(med -> med.getDeleted() == 'Y').toList()); + } } catch (OHServiceException e) { pMedicals = null; OHServiceExceptionUtil.showMessages(e); @@ -788,6 +823,11 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole if (med.getMinqty() != 0 && actualQty <= med.getMinqty()) { cell.setForeground(Color.RED); // under critical level } + if (activeSelection.equals(STR_ALL) && med.getDeleted() == 'Y') { + Map attributes = cell.getFont().getAttributes(); + attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); + cell.setFont(new Font(attributes)); + } return cell; } } diff --git a/src/main/java/org/isf/medicals/gui/MedicalEdit.java b/src/main/java/org/isf/medicals/gui/MedicalEdit.java index 8906a6af52..61825d0143 100644 --- a/src/main/java/org/isf/medicals/gui/MedicalEdit.java +++ b/src/main/java/org/isf/medicals/gui/MedicalEdit.java @@ -29,6 +29,7 @@ import java.util.List; import javax.swing.JButton; +import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; @@ -58,12 +59,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** - * 18-ago-2008 - * added by alex: - * - product code - * - pieces per packet - */ public class MedicalEdit extends JDialog { private static final long serialVersionUID = 1L; @@ -71,19 +66,20 @@ public class MedicalEdit extends JDialog { private static final Logger LOGGER = LoggerFactory.getLogger(MedicalEdit.class); private EventListenerList medicalListeners = new EventListenerList(); - + public interface MedicalListener extends EventListener { - void medicalUpdated(AWTEvent e); - void medicalInserted(Medical medical); - } - public void addMedicalListener(MedicalListener l) { - medicalListeners.add(MedicalListener.class, l); - } + void medicalUpdated(AWTEvent e); + void medicalInserted(Medical medical); + } + + public void addMedicalListener(MedicalListener l) { + medicalListeners.add(MedicalListener.class, l); + } - public void removeMedicalListener(MedicalListener listener) { - medicalListeners.remove(MedicalListener.class, listener); - } + public void removeMedicalListener(MedicalListener listener) { + medicalListeners.remove(MedicalListener.class, listener); + } private void fireMedicalInserted(Medical medical) { new AWTEvent(new Object(), AWTEvent.RESERVED_ID_MAX + 1) { @@ -119,6 +115,7 @@ private void fireMedicalUpdated() { private VoLimitedTextField codeTextField; private VoDoubleTextField minQtiField; private JComboBox typeComboBox; + private JCheckBox activeCheckbox; private Medical oldMedical; private Medical medical; private boolean insert; @@ -127,8 +124,7 @@ private void fireMedicalUpdated() { private MedicalBrowsingManager medicalBrowsingManager = Context.getApplicationContext().getBean(MedicalBrowsingManager.class); /** - * This is the default constructor; we pass the arraylist and the - * selectedrow because we need to update them + * This is the default constructor; we pass the arraylist and the selectedrow because we need to update them */ public MedicalEdit(Medical old, boolean inserting, JFrame owner) { super(owner, true); @@ -184,8 +180,9 @@ private JPanel getDataPanel() { JLabel typeLabel = new JLabel(MessageBundle.getMessage("angal.medicals.type") + ':'); JLabel codeLabel = new JLabel(MessageBundle.getMessage("angal.common.code.txt") + ':'); JLabel descLabel = new JLabel(MessageBundle.getMessage("angal.common.description.txt") + ':'); - JLabel pcsperpckLabel = new JLabel(MessageBundle.getMessage("angal.medicals.pcsperpckExt") + ':'); - JLabel criticLabel = new JLabel(MessageBundle.getMessage("angal.medicals.criticallevel") + ':'); + JLabel pcsperpckLabel = new JLabel(MessageBundle.getMessage("angal.medicals.pcsperpck.txt") + ':'); + JLabel criticLabel = new JLabel(MessageBundle.getMessage("angal.medicals.criticallevel.txt") + ':'); + JLabel activeLabel = new JLabel(MessageBundle.getMessage("angal.medicals.active.txt") + ':'); dataPanel.add(typeLabel); dataPanel.add(getTypeComboBox()); @@ -197,11 +194,21 @@ private JPanel getDataPanel() { dataPanel.add(getPcsperpckField()); dataPanel.add(criticLabel); dataPanel.add(getMinQtiField()); - SpringUtilities.makeCompactGrid(dataPanel, 5, 2, 5, 5, 5, 5); + dataPanel.add(activeLabel); + dataPanel.add(getActiveField()); + SpringUtilities.makeCompactGrid(dataPanel, 6, 2, 5, 5, 5, 5); } return dataPanel; } + private JCheckBox getActiveField() { + if (activeCheckbox == null) { + activeCheckbox = new JCheckBox("Active"); + activeCheckbox.setSelected(medical.getDeleted() == 'N'); + } + return activeCheckbox; + } + /** * This method initializes buttonPanel * @@ -240,6 +247,7 @@ private JButton getOkButton() { okButton = new JButton(MessageBundle.getMessage("angal.common.ok.btn")); okButton.setMnemonic(MessageBundle.getMnemonic("angal.common.ok.btn.key")); okButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { boolean result = false; @@ -252,6 +260,7 @@ public void actionPerformed(ActionEvent e) { newMedical.setProdCode(codeTextField.getText()); newMedical.setPcsperpck(pcsperpckField.getValue()); newMedical.setMinqty(minQtiField.getValue()); + newMedical.setDeleted(activeCheckbox.isSelected() ? 'N' : 'Y'); } catch (CloneNotSupportedException cloneNotSupportedException) { LOGGER.error(cloneNotSupportedException.getMessage(), cloneNotSupportedException); } @@ -293,6 +302,7 @@ public void actionPerformed(ActionEvent e) { oldMedical.setProdCode(codeTextField.getText()); oldMedical.setPcsperpck(pcsperpckField.getValue()); oldMedical.setMinqty(minQtiField.getValue()); + oldMedical.setDeleted(activeCheckbox.isSelected() ? 'N' : 'Y'); try { Medical updatedMedical = medicalBrowsingManager.updateMedical(oldMedical); if (updatedMedical != null) { @@ -335,6 +345,7 @@ public void actionPerformed(ActionEvent e) { medical.setPcsperpck(pcsperpckField.getValue()); medical.setMinqty(minQtiField.getValue()); medical.setLock(updatedMedical.getLock()); + medical.setDeleted(updatedMedical.getDeleted()); fireMedicalUpdated(); dispose(); } @@ -345,10 +356,10 @@ public void actionPerformed(ActionEvent e) { } private int manageSimilarFoundWarning(OHExceptionMessage error) { - /* Already shown by OHServiceExceptionUtil - int messageType = error.getLevel().getSwingSeverity(); - JOptionPane.showMessageDialog(MedicalEdit.this, error.getMessage(), - error.getTitle(), messageType);*/ + /* + * Already shown by OHServiceExceptionUtil int messageType = error.getLevel().getSwingSeverity(); + * JOptionPane.showMessageDialog(MedicalEdit.this, error.getMessage(), error.getTitle(), messageType); + */ return MessageDialog.yesNoCancel(MedicalEdit.this, "angal.common.doyouwanttoproceed.msg"); } }); diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java index e1286b9ea4..ffd32a2181 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java @@ -163,7 +163,7 @@ public MovStockMultipleCharging(JFrame owner) { private void initialize() { List medicals; try { - medicals = medicalBrowsingManager.getMedicals(); + medicals = new ArrayList<>(medicalBrowsingManager.getMedicals().stream().filter(med -> med.getDeleted() == 'N').toList()); } catch (OHServiceException e) { OHServiceExceptionUtil.showMessages(e); medicals = null; diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java index 80a870861a..e073e185c3 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java @@ -164,7 +164,7 @@ private void initialize() { List medicals; try { - medicals = medicalBrowsingManager.getMedicals(); + medicals = new ArrayList<>(medicalBrowsingManager.getMedicals().stream().filter(med -> med.getDeleted() == 'N').toList()); } catch (OHServiceException e) { medicals = null; OHServiceExceptionUtil.showMessages(e); From 0f2322449793c1deb2731aead561e4a1f644fce2 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 24 May 2024 11:21:18 +0200 Subject: [PATCH 36/86] Updates for project OpenHospital (#2010) * Translate bundle/language_en.properties in es 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'es'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in zh_CN 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'zh_CN'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in ar 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'ar'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in am_ET 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'am_ET'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- bundle/language_am_ET.properties | 12 ++++++++++-- bundle/language_ar.properties | 12 ++++++++++-- bundle/language_de.properties | 12 ++++++++++-- bundle/language_es.properties | 12 ++++++++++-- bundle/language_it.properties | 12 ++++++++++-- bundle/language_sq.properties | 12 ++++++++++-- bundle/language_zh_CN.properties | 12 ++++++++++-- 7 files changed, 70 insertions(+), 14 deletions(-) diff --git a/bundle/language_am_ET.properties b/bundle/language_am_ET.properties index 955af314a1..4a299402d8 100644 --- a/bundle/language_am_ET.properties +++ b/bundle/language_am_ET.properties @@ -746,11 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = የተመረጠ ስም የለም angal.malnutrition.pleaseinsertavalidcontroldate.msg = እባክዎ ትክክለኛ የቁጥጥር ቀን ያስገቡ። angal.malnutrition.pleaseinsertavalidvisitdate.msg = እባክዎ ትክክለኛ የጉብኝት ቀን ያስገቡ። +angal.medicals.active.txt = Active +angal.medicals.activeonly.txt = Active only angal.medicals.averagemonthlyconsumption.btn = AMC angal.medicals.averagemonthlyconsumption.btn.key = ኤም -angal.medicals.criticallevel = የወሳኝነት ደረጃ +angal.medicals.criticallevel.txt = የወሳኝነት ደረጃ angal.medicals.critlevel.col = የወሳኝነት ደረጃ angal.medicals.deletemedical.fmt.msg = ሕክምና ይሰረዝ፡ {0}? +angal.medicals.disabledonly.txt = Disabled only angal.medicals.editmedical.title = ሜዲካል አርትዕ/አስተካክል angal.medicals.expiring.btn = ጊዜው ያለፈበት angal.medicals.expiring.btn.key = ፒ @@ -769,7 +772,7 @@ angal.medicals.order.btn.key angal.medicals.othermonth = ሌላ ወር... angal.medicals.outofstock.col = መጋዘን ውስጥ የለም angal.medicals.pcsperpck.col = PcsXPck -angal.medicals.pcsperpckExt = በፓኬት ውስጥ ያሉት ብዛቶች +angal.medicals.pcsperpck.txt = በፓኬት ውስጥ ያሉት ብዛቶች angal.medicals.pharmaceuticalbrowser.title = ፋርማሲዩቲካል አሳሽ angal.medicals.pleaseselectareport.msg = እባክዎ ሪፖርት ይምረጡ፡- angal.medicals.pleaseselectperiod.msg = እባክዎን ጊዜ ይምረጡ፡ @@ -785,6 +788,8 @@ angal.medicals.thismonth angal.medicals.today = ዛሬ angal.medicals.type = ዓይነት angal.medicals.withlot = ከብዙ ጋር +angal.medicalstock.allcharges.txt = All charges +angal.medicalstock.alldischarges.txt = All discharges angal.medicalstock.charge.btn = ክፍያ angal.medicalstock.charge.btn.key = ኤች angal.medicalstock.chooseamedical.msg = ሕክምና ይምረጡ። @@ -793,6 +798,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = ትክክለኛ የእንቅስቃሴ ቀን ይምረጡ። angal.medicalstock.chooseavalidpreparationdate = ትክክለኛ የዝግጅት ቀን ይምረጡ angal.medicalstock.clickdrugs = ዝርዝር መረጃዎችን ለማየት ሁለቴ ጠቅ ያድርጉ +angal.medicalstock.codeordescription.txt = Code or Description angal.medicalstock.cost.col = ወጪ angal.medicalstock.deletemovementsuccess.msg = Last movement successfully deleted. angal.medicalstock.discharge.btn = መፍሰስ @@ -885,6 +891,8 @@ angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto angal.medicalstock.prepdate = የዝግጅት ቀን angal.medicalstock.prepdate.col = የዝግጅት ቀን angal.medicalstock.refno.col = ማጣቀሻ.ቁ. +angal.medicalstock.reset.btn = ዳግም አስጀምር +angal.medicalstock.reset.btn.key = ቲ angal.medicalstock.selectionpanel = የምርጫ ፓነል angal.medicalstock.stockmovement.title = የ ክምችት/ዕቃ እንቅስቃሴ angal.medicalstock.stockmovementbrowser.title = የክምችት/ዕቃ እንቅስቃሴ አሳሽ diff --git a/bundle/language_ar.properties b/bundle/language_ar.properties index 587d06a4ff..c857d0cd93 100644 --- a/bundle/language_ar.properties +++ b/bundle/language_ar.properties @@ -746,11 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = لم يتم اختيار اسم angal.malnutrition.pleaseinsertavalidcontroldate.msg = إدخال تاريخ مراجعة صالح angal.malnutrition.pleaseinsertavalidvisitdate.msg = إدخال تاريخ زيارة صالح +angal.medicals.active.txt = Active +angal.medicals.activeonly.txt = Active only angal.medicals.averagemonthlyconsumption.btn = (AMC) متوسط الاستهلاك الشهري angal.medicals.averagemonthlyconsumption.btn.key = M -angal.medicals.criticallevel = مستوى حرج +angal.medicals.criticallevel.txt = مستوى حرج angal.medicals.critlevel.col = مستوى حرج angal.medicals.deletemedical.fmt.msg = حذف منتج طبي: {0}؟ +angal.medicals.disabledonly.txt = Disabled only angal.medicals.editmedical.title = تعديل منتج طبي angal.medicals.expiring.btn = تنتهي الصلاحية angal.medicals.expiring.btn.key = P @@ -769,7 +772,7 @@ angal.medicals.order.btn.key angal.medicals.othermonth = شهر آخر angal.medicals.outofstock.col = غير متوفر angal.medicals.pcsperpck.col = قطعة لكل عبوة -angal.medicals.pcsperpckExt = قطعة لكل عبوة +angal.medicals.pcsperpck.txt = قطعة لكل عبوة angal.medicals.pharmaceuticalbrowser.title = متصفح الصيدلانية angal.medicals.pleaseselectareport.msg = اختيار تقرير angal.medicals.pleaseselectperiod.msg = اختيار فترة @@ -785,6 +788,8 @@ angal.medicals.thismonth angal.medicals.today = اليوم angal.medicals.type = نوع angal.medicals.withlot = مع دفعات +angal.medicalstock.allcharges.txt = All charges +angal.medicalstock.alldischarges.txt = All discharges angal.medicalstock.charge.btn = فرض angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = اختر منتج طبي @@ -793,6 +798,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = اختر تاريخ حركة صالحًا angal.medicalstock.chooseavalidpreparationdate = اختر تاريخ تحضير صالحًا angal.medicalstock.clickdrugs = انقر نقرًا مزدوجًا لإظهار تفاصيل الدُفعة +angal.medicalstock.codeordescription.txt = Code or Description angal.medicalstock.cost.col = كلفة angal.medicalstock.deletemovementsuccess.msg = تم حذف الحركة الأخيرة بنجاح angal.medicalstock.discharge.btn = التخريج @@ -885,6 +891,8 @@ angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto angal.medicalstock.prepdate = تاريخ الإعداد angal.medicalstock.prepdate.col = تاريخ التحضير angal.medicalstock.refno.col = رقم المرجع +angal.medicalstock.reset.btn = إعادة تعيين +angal.medicalstock.reset.btn.key = T angal.medicalstock.selectionpanel = لوحة الاختيار angal.medicalstock.stockmovement.title = حركة المخزون angal.medicalstock.stockmovementbrowser.title = متصفح حركة المخزون diff --git a/bundle/language_de.properties b/bundle/language_de.properties index 173e616bf6..142aed6e8f 100644 --- a/bundle/language_de.properties +++ b/bundle/language_de.properties @@ -746,11 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = Kein Name ausgewählt angal.malnutrition.pleaseinsertavalidcontroldate.msg = Bitte geben Sie ein gültiges Kontrolldatum ein. angal.malnutrition.pleaseinsertavalidvisitdate.msg = Bitte geben Sie ein gültiges Besuchsdatum ein. +angal.medicals.active.txt = Active +angal.medicals.activeonly.txt = Active only angal.medicals.averagemonthlyconsumption.btn = AMC angal.medicals.averagemonthlyconsumption.btn.key = M -angal.medicals.criticallevel = Kritischer Stand +angal.medicals.criticallevel.txt = Kritischer Stand angal.medicals.critlevel.col = Krit. Stufe angal.medicals.deletemedical.fmt.msg = Medikament löschen: {0}? +angal.medicals.disabledonly.txt = Disabled only angal.medicals.editmedical.title = Medikament bearbeiten angal.medicals.expiring.btn = Ablaufend angal.medicals.expiring.btn.key = P @@ -769,7 +772,7 @@ angal.medicals.order.btn.key angal.medicals.othermonth = Anderer Monat... angal.medicals.outofstock.col = Nicht auf Lager angal.medicals.pcsperpck.col = PcsXPck -angal.medicals.pcsperpckExt = Stück pro Packung +angal.medicals.pcsperpck.txt = Stück pro Packung angal.medicals.pharmaceuticalbrowser.title = Arzneimittelbrowser angal.medicals.pleaseselectareport.msg = Wählen Sie bitte einen Bericht aus: angal.medicals.pleaseselectperiod.msg = Wählen Sie bitte einen Zeitraum: @@ -785,6 +788,8 @@ angal.medicals.thismonth angal.medicals.today = Heute angal.medicals.type = Typ angal.medicals.withlot = Mit Lots +angal.medicalstock.allcharges.txt = All charges +angal.medicalstock.alldischarges.txt = All discharges angal.medicalstock.charge.btn = Berechnen angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = Wählen sie einen Medikament. @@ -793,6 +798,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = Wählen Sie ein gültiges Verschiebungsdatum. angal.medicalstock.chooseavalidpreparationdate = Wählen Sie ein gültiges Vorbereitungsdatum aus angal.medicalstock.clickdrugs = Doppelklicken Sie, um Lotdetails anzuzeigen +angal.medicalstock.codeordescription.txt = Code or Description angal.medicalstock.cost.col = Kosten angal.medicalstock.deletemovementsuccess.msg = Letzte Bewegung erfolgreich gelöscht. angal.medicalstock.discharge.btn = Entlassen @@ -885,6 +891,8 @@ angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto angal.medicalstock.prepdate = Herstellungsdatum angal.medicalstock.prepdate.col = Vorb Datum angal.medicalstock.refno.col = Ref. Nr. +angal.medicalstock.reset.btn = Zurücksetzen +angal.medicalstock.reset.btn.key = T angal.medicalstock.selectionpanel = Auwahlmenü angal.medicalstock.stockmovement.title = Lagerbewegung angal.medicalstock.stockmovementbrowser.title = Bestandsbewegungsbrowser diff --git a/bundle/language_es.properties b/bundle/language_es.properties index 58807013f8..150cafd555 100644 --- a/bundle/language_es.properties +++ b/bundle/language_es.properties @@ -746,11 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = Ningún nombre seleccionado angal.malnutrition.pleaseinsertavalidcontroldate.msg = Por favor digitar una fecha de control válida angal.malnutrition.pleaseinsertavalidvisitdate.msg = Por favor digitar una fecha visita válida +angal.medicals.active.txt = Active +angal.medicals.activeonly.txt = Active only angal.medicals.averagemonthlyconsumption.btn = AMC angal.medicals.averagemonthlyconsumption.btn.key = A -angal.medicals.criticallevel = Nivel critico +angal.medicals.criticallevel.txt = Nivel crítico angal.medicals.critlevel.col = Crit. Nivel angal.medicals.deletemedical.fmt.msg = Eliminar médico: {0}? +angal.medicals.disabledonly.txt = Disabled only angal.medicals.editmedical.title = Modificar de Fármaco angal.medicals.expiring.btn = Vencimiento angal.medicals.expiring.btn.key = I @@ -769,7 +772,7 @@ angal.medicals.order.btn.key angal.medicals.othermonth = Otro mes... angal.medicals.outofstock.col = Agotado angal.medicals.pcsperpck.col = UndXPqt -angal.medicals.pcsperpckExt = Unidades por Paquete +angal.medicals.pcsperpck.txt = Unidades por Paquete angal.medicals.pharmaceuticalbrowser.title = Lista Fármacos angal.medicals.pleaseselectareport.msg = Seleccionar un informe angal.medicals.pleaseselectperiod.msg = Por favor seleccione un peróodo @@ -785,6 +788,8 @@ angal.medicals.thismonth angal.medicals.today = Hoy angal.medicals.type = Tipología angal.medicals.withlot = Con lotes +angal.medicalstock.allcharges.txt = All charges +angal.medicalstock.alldischarges.txt = All discharges angal.medicalstock.charge.btn = Carga angal.medicalstock.charge.btn.key = G angal.medicalstock.chooseamedical.msg = Escoger un fármaco @@ -793,6 +798,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = Escoger una fecha movimiento válida angal.medicalstock.chooseavalidpreparationdate = Escoger una fecha preparación válida angal.medicalstock.clickdrugs = Haga doble clic para mostrar los detalles del lote +angal.medicalstock.codeordescription.txt = Code or Description angal.medicalstock.cost.col = Costo angal.medicalstock.deletemovementsuccess.msg = Last movement successfully deleted. angal.medicalstock.discharge.btn = Descarga @@ -885,6 +891,8 @@ angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto angal.medicalstock.prepdate = Fecha preparación angal.medicalstock.prepdate.col = Fecha Preparación angal.medicalstock.refno.col = Núm. Ref. +angal.medicalstock.reset.btn = Reinicializar +angal.medicalstock.reset.btn.key = T angal.medicalstock.selectionpanel = Grupo seleccionar angal.medicalstock.stockmovement.title = Movimientos Almacén angal.medicalstock.stockmovementbrowser.title = Lista Movimientos Almacén diff --git a/bundle/language_it.properties b/bundle/language_it.properties index c484b857c2..6c4cb25bfe 100644 --- a/bundle/language_it.properties +++ b/bundle/language_it.properties @@ -746,11 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = Nessun nome selezionato. angal.malnutrition.pleaseinsertavalidcontroldate.msg = Si prega di inserire una data di controllo valida. angal.malnutrition.pleaseinsertavalidvisitdate.msg = Si prega di inserire una data di visita valida. +angal.medicals.active.txt = Active +angal.medicals.activeonly.txt = Active only angal.medicals.averagemonthlyconsumption.btn = CMM angal.medicals.averagemonthlyconsumption.btn.key = M -angal.medicals.criticallevel = Livello critico +angal.medicals.criticallevel.txt = Livello critico angal.medicals.critlevel.col = Livello Crit. angal.medicals.deletemedical.fmt.msg = Elimina medico: {0}? +angal.medicals.disabledonly.txt = Disabled only angal.medicals.editmedical.title = Modifica Voce di Farmaco angal.medicals.expiring.btn = Scadenza angal.medicals.expiring.btn.key = A @@ -769,7 +772,7 @@ angal.medicals.order.btn.key angal.medicals.othermonth = Altro mese... angal.medicals.outofstock.col = Fuori Magazzino angal.medicals.pcsperpck.col = PcsXPck -angal.medicals.pcsperpckExt = Pezzi per Scatola +angal.medicals.pcsperpck.txt = Pezzi per Scatola angal.medicals.pharmaceuticalbrowser.title = Lista Farmaci angal.medicals.pleaseselectareport.msg = Selezionare un report: angal.medicals.pleaseselectperiod.msg = Selezionare un periodo: @@ -785,6 +788,8 @@ angal.medicals.thismonth angal.medicals.today = Oggi angal.medicals.type = Tipologia angal.medicals.withlot = Con lotti +angal.medicalstock.allcharges.txt = All charges +angal.medicalstock.alldischarges.txt = All discharges angal.medicalstock.charge.btn = Carico angal.medicalstock.charge.btn.key = C angal.medicalstock.chooseamedical.msg = Scegli un farmaco. @@ -793,6 +798,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = Choose a valid movement date. angal.medicalstock.chooseavalidpreparationdate = Scegliere una data preparazione valida. angal.medicalstock.clickdrugs = Doppio click per mostrare i dettagli del lotto +angal.medicalstock.codeordescription.txt = Code or Description angal.medicalstock.cost.col = Costo angal.medicalstock.deletemovementsuccess.msg = Last movement successfully deleted. angal.medicalstock.discharge.btn = Scarico @@ -885,6 +891,8 @@ angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto angal.medicalstock.prepdate = Data preparazione angal.medicalstock.prepdate.col = Data preparazione angal.medicalstock.refno.col = Nr.Bolla +angal.medicalstock.reset.btn = Azzera +angal.medicalstock.reset.btn.key = A angal.medicalstock.selectionpanel = Pannello seleziona angal.medicalstock.stockmovement.title = Movimento Delle Scorte angal.medicalstock.stockmovementbrowser.title = Lista Movimenti Magazzino diff --git a/bundle/language_sq.properties b/bundle/language_sq.properties index fc99eef4d3..0c4f15e0a3 100644 --- a/bundle/language_sq.properties +++ b/bundle/language_sq.properties @@ -746,11 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = Nuk u zgjodh asnjë emër angal.malnutrition.pleaseinsertavalidcontroldate.msg = Vendosni një datë të vlefshme kontrolli. angal.malnutrition.pleaseinsertavalidvisitdate.msg = Ju lutemi vendosni një datë të vlefshme vizite. +angal.medicals.active.txt = Active +angal.medicals.activeonly.txt = Active only angal.medicals.averagemonthlyconsumption.btn = AMC angal.medicals.averagemonthlyconsumption.btn.key = M -angal.medicals.criticallevel = Niveli kritik +angal.medicals.criticallevel.txt = Niveli kritik angal.medicals.critlevel.col = Niveli kritik angal.medicals.deletemedical.fmt.msg = Fshij medikamentin: {0}? +angal.medicals.disabledonly.txt = Disabled only angal.medicals.editmedical.title = Redakto Medikamentin angal.medicals.expiring.btn = Që skadojnë angal.medicals.expiring.btn.key = P @@ -769,7 +772,7 @@ angal.medicals.order.btn.key angal.medicals.othermonth = Muajin tjetër... angal.medicals.outofstock.col = Jashtë gjendjes angal.medicals.pcsperpck.col = PcsXPck -angal.medicals.pcsperpckExt = Copë për paketë +angal.medicals.pcsperpck.txt = Copë për paketë angal.medicals.pharmaceuticalbrowser.title = Shfletuesi Farmaceutik angal.medicals.pleaseselectareport.msg = Ju lutemi zgjidhni një raport: angal.medicals.pleaseselectperiod.msg = Ju lutemi zgjidhni një periudhë: @@ -785,6 +788,8 @@ angal.medicals.thismonth angal.medicals.today = Sot angal.medicals.type = Lloji angal.medicals.withlot = Me etapa +angal.medicalstock.allcharges.txt = All charges +angal.medicalstock.alldischarges.txt = All discharges angal.medicalstock.charge.btn = Pagesa angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = Zgjidhni një medikament. @@ -793,6 +798,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = Zgjidhni një datë të vlefshme lëvizjeje. angal.medicalstock.chooseavalidpreparationdate = Zgjidhni një datë të vlefshme përgatitjeje angal.medicalstock.clickdrugs = Klikoni dy herë për të treguar detajet +angal.medicalstock.codeordescription.txt = Code or Description angal.medicalstock.cost.col = Kostoja angal.medicalstock.deletemovementsuccess.msg = Lëvizja e fundit u fshi me sukses. angal.medicalstock.discharge.btn = Lëshim @@ -885,6 +891,8 @@ angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto angal.medicalstock.prepdate = Data e përgatitjes angal.medicalstock.prepdate.col = Data e përgatitjes angal.medicalstock.refno.col = Nr. Ref. +angal.medicalstock.reset.btn = Rivendos +angal.medicalstock.reset.btn.key = T angal.medicalstock.selectionpanel = Paneli i zgjedhjes angal.medicalstock.stockmovement.title = Lëvizje stoku angal.medicalstock.stockmovementbrowser.title = Shfletuesi i lëvizjes së stokut diff --git a/bundle/language_zh_CN.properties b/bundle/language_zh_CN.properties index 63b8cbcd33..19229fb553 100644 --- a/bundle/language_zh_CN.properties +++ b/bundle/language_zh_CN.properties @@ -746,11 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = 未选中姓名 angal.malnutrition.pleaseinsertavalidcontroldate.msg = 请输入有效控制日期. angal.malnutrition.pleaseinsertavalidvisitdate.msg = 请输入有效就诊日期. +angal.medicals.active.txt = Active +angal.medicals.activeonly.txt = Active only angal.medicals.averagemonthlyconsumption.btn = AMC angal.medicals.averagemonthlyconsumption.btn.key = M -angal.medicals.criticallevel = 临界水平 +angal.medicals.criticallevel.txt = 临界水平 angal.medicals.critlevel.col = 临界水平 angal.medicals.deletemedical.fmt.msg = 删除医聊: {0}? +angal.medicals.disabledonly.txt = Disabled only angal.medicals.editmedical.title = 修改医疗 angal.medicals.expiring.btn = 即将到期 angal.medicals.expiring.btn.key = P @@ -769,7 +772,7 @@ angal.medicals.order.btn.key angal.medicals.othermonth = 其它月份... angal.medicals.outofstock.col = 缺货 angal.medicals.pcsperpck.col = PcsXPck -angal.medicals.pcsperpckExt = 每包件数 +angal.medicals.pcsperpck.txt = 每包件数 angal.medicals.pharmaceuticalbrowser.title = 药房浏览 angal.medicals.pleaseselectareport.msg = 请选择报告: angal.medicals.pleaseselectperiod.msg = 请选择时期: @@ -785,6 +788,8 @@ angal.medicals.thismonth angal.medicals.today = 今日 angal.medicals.type = 类型 angal.medicals.withlot = 批次 +angal.medicalstock.allcharges.txt = All charges +angal.medicalstock.alldischarges.txt = All discharges angal.medicalstock.charge.btn = 收费 angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = 选择医疗. @@ -793,6 +798,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = 选择有效移动日期. angal.medicalstock.chooseavalidpreparationdate = 选择有效准备日期 angal.medicalstock.clickdrugs = 双击显示批次详情 +angal.medicalstock.codeordescription.txt = Code or Description angal.medicalstock.cost.col = 成本 angal.medicalstock.deletemovementsuccess.msg = Last movement successfully deleted. angal.medicalstock.discharge.btn = 出院 @@ -885,6 +891,8 @@ angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto angal.medicalstock.prepdate = 准备日期 angal.medicalstock.prepdate.col = 准备日期 angal.medicalstock.refno.col = 参考编号 +angal.medicalstock.reset.btn = 重置 +angal.medicalstock.reset.btn.key = T angal.medicalstock.selectionpanel = 选择面板 angal.medicalstock.stockmovement.title = 库存移动 angal.medicalstock.stockmovementbrowser.title = 库存移动浏览 From e9965e87dac73ad464c035caf5b2ed1f31e49151 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 31 May 2024 08:47:59 +0200 Subject: [PATCH 37/86] Update translations for project OpenHospital (#2012) * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 100% translated source file: 'bundle/language_en.properties' on 'sq'. --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- bundle/language_sq.properties | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bundle/language_sq.properties b/bundle/language_sq.properties index 0c4f15e0a3..c90961b215 100644 --- a/bundle/language_sq.properties +++ b/bundle/language_sq.properties @@ -746,14 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = Nuk u zgjodh asnjë emër angal.malnutrition.pleaseinsertavalidcontroldate.msg = Vendosni një datë të vlefshme kontrolli. angal.malnutrition.pleaseinsertavalidvisitdate.msg = Ju lutemi vendosni një datë të vlefshme vizite. -angal.medicals.active.txt = Active -angal.medicals.activeonly.txt = Active only +angal.medicals.active.txt = Aktive +angal.medicals.activeonly.txt = Vetëm aktive angal.medicals.averagemonthlyconsumption.btn = AMC angal.medicals.averagemonthlyconsumption.btn.key = M angal.medicals.criticallevel.txt = Niveli kritik angal.medicals.critlevel.col = Niveli kritik angal.medicals.deletemedical.fmt.msg = Fshij medikamentin: {0}? -angal.medicals.disabledonly.txt = Disabled only +angal.medicals.disabledonly.txt = Jo-aktive angal.medicals.editmedical.title = Redakto Medikamentin angal.medicals.expiring.btn = Që skadojnë angal.medicals.expiring.btn.key = P @@ -788,8 +788,8 @@ angal.medicals.thismonth angal.medicals.today = Sot angal.medicals.type = Lloji angal.medicals.withlot = Me etapa -angal.medicalstock.allcharges.txt = All charges -angal.medicalstock.alldischarges.txt = All discharges +angal.medicalstock.allcharges.txt = Të gjitha tarifat +angal.medicalstock.alldischarges.txt = Të gjitha shkarkimet angal.medicalstock.charge.btn = Pagesa angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = Zgjidhni një medikament. @@ -798,7 +798,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = Zgjidhni një datë të vlefshme lëvizjeje. angal.medicalstock.chooseavalidpreparationdate = Zgjidhni një datë të vlefshme përgatitjeje angal.medicalstock.clickdrugs = Klikoni dy herë për të treguar detajet -angal.medicalstock.codeordescription.txt = Code or Description +angal.medicalstock.codeordescription.txt = Kodi i përshkrimit angal.medicalstock.cost.col = Kostoja angal.medicalstock.deletemovementsuccess.msg = Lëvizja e fundit u fshi me sukses. angal.medicalstock.discharge.btn = Lëshim From 42b505499d5e8095d1e39c85aa37cfd91ac52f51 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 31 May 2024 18:18:39 +0200 Subject: [PATCH 38/86] Update translations for project OpenHospital (#2014) * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 100% translated source file: 'bundle/language_en.properties' on 'de'. --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- bundle/language_de.properties | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bundle/language_de.properties b/bundle/language_de.properties index 142aed6e8f..6f59087daa 100644 --- a/bundle/language_de.properties +++ b/bundle/language_de.properties @@ -746,14 +746,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = Kein Name ausgewählt angal.malnutrition.pleaseinsertavalidcontroldate.msg = Bitte geben Sie ein gültiges Kontrolldatum ein. angal.malnutrition.pleaseinsertavalidvisitdate.msg = Bitte geben Sie ein gültiges Besuchsdatum ein. -angal.medicals.active.txt = Active -angal.medicals.activeonly.txt = Active only +angal.medicals.active.txt = Aktiv +angal.medicals.activeonly.txt = Nur aktive angal.medicals.averagemonthlyconsumption.btn = AMC angal.medicals.averagemonthlyconsumption.btn.key = M angal.medicals.criticallevel.txt = Kritischer Stand angal.medicals.critlevel.col = Krit. Stufe angal.medicals.deletemedical.fmt.msg = Medikament löschen: {0}? -angal.medicals.disabledonly.txt = Disabled only +angal.medicals.disabledonly.txt = Nur deaktiviert angal.medicals.editmedical.title = Medikament bearbeiten angal.medicals.expiring.btn = Ablaufend angal.medicals.expiring.btn.key = P @@ -788,8 +788,8 @@ angal.medicals.thismonth angal.medicals.today = Heute angal.medicals.type = Typ angal.medicals.withlot = Mit Lots -angal.medicalstock.allcharges.txt = All charges -angal.medicalstock.alldischarges.txt = All discharges +angal.medicalstock.allcharges.txt = Alle Einweisungen +angal.medicalstock.alldischarges.txt = Alle Entlassungen angal.medicalstock.charge.btn = Berechnen angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = Wählen sie einen Medikament. @@ -798,7 +798,7 @@ angal.medicalstock.chooseavalidduedate.msg angal.medicalstock.chooseavalidmovementdate.msg = Wählen Sie ein gültiges Verschiebungsdatum. angal.medicalstock.chooseavalidpreparationdate = Wählen Sie ein gültiges Vorbereitungsdatum aus angal.medicalstock.clickdrugs = Doppelklicken Sie, um Lotdetails anzuzeigen -angal.medicalstock.codeordescription.txt = Code or Description +angal.medicalstock.codeordescription.txt = Code oder Beschreibung angal.medicalstock.cost.col = Kosten angal.medicalstock.deletemovementsuccess.msg = Letzte Bewegung erfolgreich gelöscht. angal.medicalstock.discharge.btn = Entlassen From 3aff2783149cebfe9fd527e149adf3a7e907c3f9 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Wed, 12 Jun 2024 09:10:04 +0200 Subject: [PATCH 39/86] OP-1217 Add Medical Stock Feature (#2013) * First commit * Add new AMC_ver2 report * Add Movement Type category field 'production' or 'inventory' * Improve report clarity * Add MedicalType category * Fix javadoc * Restore original report name * Add hidden column for stock movement Excel export * Refactor category admitted values * Apply suggestions from code review --------- Co-authored-by: David B Malkovsky --- bundle/language_en.properties | 5 + rpt_base/PharmaceuticalAMC_ver2.jasper | Bin 0 -> 56064 bytes rpt_base/PharmaceuticalAMC_ver2.jrxml | 794 ++++++++++++++++++ rpt_base/PharmaceuticalAMC_ver2.properties | 27 + rsc/settings.properties.dist | 2 +- .../org/isf/medicals/gui/MedicalBrowser.java | 42 +- .../isf/medicalstock/gui/MovStockBrowser.java | 15 +- .../medicalstockward/gui/WardPharmacy.java | 110 +-- .../MedicalDsrStockMovementTypeBrowser.java | 51 +- ...edicalDsrStockMovementTypeBrowserEdit.java | 101 ++- .../gui/MedicalsrMovPatList.java | 9 +- .../GenericReportPharmaceuticalAMC.java | 84 ++ 12 files changed, 1115 insertions(+), 125 deletions(-) create mode 100644 rpt_base/PharmaceuticalAMC_ver2.jasper create mode 100644 rpt_base/PharmaceuticalAMC_ver2.jrxml create mode 100644 rpt_base/PharmaceuticalAMC_ver2.properties create mode 100644 src/main/java/org/isf/stat/gui/report/GenericReportPharmaceuticalAMC.java diff --git a/bundle/language_en.properties b/bundle/language_en.properties index 98dfd72a63..8feb27cca9 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -790,6 +790,7 @@ angal.medicals.type angal.medicals.withlot = With lots angal.medicalstock.allcharges.txt = All charges angal.medicalstock.alldischarges.txt = All discharges +angal.medicalstock.category.col = Category angal.medicalstock.charge.btn = Charge angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = Choose a medical. @@ -980,6 +981,10 @@ angal.medicalstockwardedit.selectpatient.btn.key angal.medicalstockwardedit.title = New / Edit angal.medicalstockwardedit.tooltip.associateapatientwiththismovement = Associate a Patient with this movement angal.medicalstockwardedit.tooltip.removepatientassociationwiththismovement = Remove Patient association with this movement +angal.medstockmovtype.allowedcategoriesare.fmt.msg = Allowed categories are: {0} +angal.medstockmovtype.category.txt = Category +angal.medstockmovtype.category.operational.txt = Operational +angal.medstockmovtype.category.nonoperational.txt = Non-Operational angal.medstockmovtype.deletemovementtype.fmt.msg = Delete movement type: {0}? angal.medstockmovtype.editmedicalstockmovementtype.title = Edit Medical Stock Movement Type angal.medstockmovtype.medicalstockmovementtypebrowser.title = Medical Stock Movement Type Browser diff --git a/rpt_base/PharmaceuticalAMC_ver2.jasper b/rpt_base/PharmaceuticalAMC_ver2.jasper new file mode 100644 index 0000000000000000000000000000000000000000..35c75a69de5a2e59526e01b9766aad633809311a GIT binary patch literal 56064 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 + + + + + + + + + + + + + + + + + + + + + + + = $P{START_DATE} AND MS_DATE_NEXT_MOV IS NOT NULL AND MS_DATE_NEXT_MOV <= $P{END_DATE}, + DATEDIFF(MS_DATE_NEXT_MOV, MS_DATE_BALANCE), + IF(MS_DATE_BALANCE >= $P{START_DATE} AND MS_DATE_NEXT_MOV IS NOT NULL AND MS_DATE_NEXT_MOV > $P{END_DATE}, + DATEDIFF($P{END_DATE}, MS_DATE_BALANCE), + IF(MS_DATE_BALANCE < $P{START_DATE} AND MS_DATE_NEXT_MOV IS NOT NULL AND MS_DATE_NEXT_MOV <= $P{END_DATE}, + DATEDIFF(MS_DATE_NEXT_MOV, $P{START_DATE}), + IF(MS_DATE_NEXT_MOV IS NULL, + DATEDIFF($P{END_DATE}, MS_DATE_BALANCE), + 0))))), + 0) AS DOS + FROM OH_MEDICALDSRSTOCK + WHERE MS_BALANCE = 0 + AND MS_MDSR_ID = MDSR_ID + AND MS_DATE_BALANCE BETWEEN $P{START_DATE} AND $P{END_DATE}) AS DOS_12_MONTHS, + (SELECT COALESCE( + SUM(IF(MS_DATE_BALANCE >= $P{START_DATE} AND MS_DATE_NEXT_MOV IS NOT NULL AND MS_DATE_NEXT_MOV <= $P{END_DATE}, + DATEDIFF(MS_DATE_NEXT_MOV, MS_DATE_BALANCE) * MS_BALANCE, + IF(MS_DATE_BALANCE >= $P{START_DATE} AND MS_DATE_NEXT_MOV IS NOT NULL AND MS_DATE_NEXT_MOV > $P{END_DATE}, + DATEDIFF($P{END_DATE}, MS_DATE_BALANCE) * MS_BALANCE, + IF(MS_DATE_BALANCE < $P{START_DATE} AND MS_DATE_NEXT_MOV IS NOT NULL AND MS_DATE_NEXT_MOV <= $P{END_DATE}, + DATEDIFF(MS_DATE_NEXT_MOV, $P{START_DATE}) * MS_BALANCE, + IF(MS_DATE_NEXT_MOV IS NULL, + DATEDIFF($P{END_DATE}, MS_DATE_BALANCE) * MS_BALANCE, + 0))))), + 0) AS BALANCE_X_DAYS + FROM OH_MEDICALDSRSTOCK + WHERE MS_MDSR_ID = MDSR_ID + AND (MS_DATE_BALANCE BETWEEN $P{START_DATE} AND $P{END_DATE} + OR MS_DATE_NEXT_MOV BETWEEN $P{START_DATE} AND $P{END_DATE})) AS BALANCE_X_DAYS + FROM OH_MEDICALDSR + LEFT JOIN OH_MEDICALDSRSTOCKMOV ON MDSR_ID = MMV_MDSR_ID + LEFT JOIN OH_MEDICALDSRSTOCKMOVTYPE ON MMVT_ID_A = MMV_MMVT_ID_A + WHERE MMVT_TYPE LIKE '-%' AND MMVT_CATEGORY = 'operational' + AND MDSR_DELETED = 'N' + GROUP BY MDSR_ID, DATE_FORMAT(MMV_DATE,'%Y/%m') + ORDER BY MDSR_ID, DATE(MMV_DATE) DESC) AS MONTHLY +GROUP BY MDSR_CODE]]> + + + + + + + + + + + + + + + + + + + + <band height="95" splitType="Stretch"> + <textField isBlankWhenNull="false"> + <reportElement key="textField-18" x="370" y="0" width="412" height="22" uuid="63af8059-3dde-42a9-bafa-2d775144ff55"/> + <box> + <topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.0" lineColor="#000000"/> + <rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Right"> + <font fontName="DejaVu Sans" size="12" isBold="true"/> + </textElement> + <textFieldExpression><![CDATA[$P{Hospital}]]></textFieldExpression> + </textField> + <textField isBlankWhenNull="false"> + <reportElement key="textField-19" x="370" y="22" width="412" height="17" uuid="9a3bce9d-e81e-44fc-9e95-36697f068a82"/> + <box> + <topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.0" lineColor="#000000"/> + <rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Right"/> + <textFieldExpression><![CDATA[$P{Address} + " - " + $P{City}]]></textFieldExpression> + </textField> + <textField isBlankWhenNull="false"> + <reportElement key="textField-20" x="370" y="39" width="412" height="17" uuid="ec19e110-fd6f-4496-9be7-a2db19f688f3"/> + <box> + <topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.0" lineColor="#000000"/> + <rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Right"/> + <textFieldExpression><![CDATA[$P{Email}]]></textFieldExpression> + </textField> + <textField isBlankWhenNull="false"> + <reportElement key="textField-21" x="370" y="56" width="412" height="17" uuid="b486e474-285c-4ead-89d6-13725002b4b3"/> + <box> + <topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.0" lineColor="#000000"/> + <rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Right"/> + <textFieldExpression><![CDATA[$P{Telephone}]]></textFieldExpression> + </textField> + <line> + <reportElement key="line-3" mode="Opaque" x="0" y="94" width="782" height="1" forecolor="#000000" backcolor="#FFFFFF" uuid="cde25c9c-3b2d-40ed-bdf2-03dc5e482904"/> + </line> + <textField> + <reportElement key="staticText-19" x="0" y="40" width="170" height="20" uuid="c26c66d3-7f76-43bc-b8ff-61aacae06a3d"/> + <box leftPadding="10"> + <topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.0" lineColor="#000000"/> + <rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Left" verticalAlignment="Middle"> + <font fontName="DejaVu Sans" size="10" isBold="true"/> + </textElement> + <textFieldExpression><![CDATA[$R{SOHatDate}+":"]]></textFieldExpression> + </textField> + <textField textAdjust="StretchHeight" pattern="dd/MM/yyyy" isBlankWhenNull="false"> + <reportElement key="textField-39" x="170" y="40" width="80" height="20" uuid="3a4ccfcf-f3ad-4ed8-aeb7-1fcd5d89ee80"/> + <box leftPadding="5"> + <topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.0" lineColor="#000000"/> + <rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Center" verticalAlignment="Middle"> + <font size="10"/> + </textElement> + <textFieldExpression><![CDATA[$P{TODAY_DATE}.toLocalDate()]]></textFieldExpression> + </textField> + <textField> + <reportElement key="staticText-20" x="0" y="60" width="170" height="20" uuid="2297c1ca-99bd-47ae-be00-4736d8c8d922"/> + <box leftPadding="10"> + <topPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.25" lineColor="#000000"/> + <rightPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Left" verticalAlignment="Middle"> + <font fontName="DejaVu Sans" size="10" isBold="true"/> + </textElement> + <textFieldExpression><![CDATA[$R{ReferencePeriod}]]></textFieldExpression> + </textField> + <textField textAdjust="StretchHeight" pattern="dd/MM/yyyy" isBlankWhenNull="false"> + <reportElement key="textField-40" x="170" y="60" width="80" height="20" uuid="c744b3c3-db6a-413e-a7a0-2eb2271aad17"/> + <box leftPadding="5"> + <topPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.25" lineColor="#000000"/> + <rightPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Center" verticalAlignment="Middle"> + <font size="10"/> + </textElement> + <textFieldExpression><![CDATA[$P{START_DATE}.toLocalDate()]]></textFieldExpression> + </textField> + <textField textAdjust="StretchHeight" pattern="dd/MM/yyyy" isBlankWhenNull="false"> + <reportElement key="textField-41" x="250" y="60" width="80" height="20" uuid="035d3411-1236-41cc-a8a1-19525171582f"/> + <box leftPadding="5"> + <topPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.25" lineColor="#000000"/> + <rightPen lineWidth="0.25" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Center" verticalAlignment="Middle"> + <font size="10"/> + </textElement> + <textFieldExpression><![CDATA[$P{END_DATE}.toLocalDate()]]></textFieldExpression> + </textField> + <textField> + <reportElement key="staticText-19" x="0" y="0" width="370" height="30" uuid="cf55d60b-59e7-4fbc-a70b-e655921f6511"/> + <box leftPadding="5"> + <topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + <bottomPen lineWidth="0.0" lineColor="#000000"/> + <rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/> + </box> + <textElement textAlignment="Left" verticalAlignment="Middle"> + <font fontName="DejaVu Sans" size="14" isBold="true"/> + </textElement> + <textFieldExpression><![CDATA[$R{Title}]]></textFieldExpression> + </textField> + </band> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rpt_base/PharmaceuticalAMC_ver2.properties b/rpt_base/PharmaceuticalAMC_ver2.properties new file mode 100644 index 0000000000..29110bdfe5 --- /dev/null +++ b/rpt_base/PharmaceuticalAMC_ver2.properties @@ -0,0 +1,27 @@ +#Generated by Eclipse Messages Editor (Eclipse Babel) + +Title = Average Monthly Consumption report + +SOHatDate = Stock on Hand (SOH) date + +ReferencePeriod = Reference Period + +Code = Code + +Description = Description + +Critical = Critical + +SOH = SOH + +FootNotes1 = Stock on Hand (SOH): Displayed in red if the SOH is below the critical level. + +FootNotes2 = Consumptions: Calculated using only the "operational" category of discharges movements. + +FootNotes3 = Stock Levels and Days Out of Stock (DOS): Calculated using all "operational" and "non-operational" movements. + +Date = Date + +Page = Page + +of = of \ No newline at end of file diff --git a/rsc/settings.properties.dist b/rsc/settings.properties.dist index 3bded160dc..886d240161 100644 --- a/rsc/settings.properties.dist +++ b/rsc/settings.properties.dist @@ -53,7 +53,7 @@ LOTWITHCOST=yes PHARMACEUTICALORDER=PharmaceuticalOrder PHARMACEUTICALSTOCK=PharmaceuticalStock_ver4 PHARMACEUTICALSTOCKLOT=PharmaceuticalStock_ver5 -PHARMACEUTICALAMC=PharmaceuticalAMC +PHARMACEUTICALAMC=PharmaceuticalAMC_ver2 # dicom / imaging settings DICOMMODULEENABLED=yes diff --git a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java index 9d7ac4f98a..a160da3424 100644 --- a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java +++ b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java @@ -69,6 +69,7 @@ import org.isf.menu.gui.MainMenu; import org.isf.menu.manager.Context; import org.isf.stat.gui.report.GenericReportFromDateToDate; +import org.isf.stat.gui.report.GenericReportPharmaceuticalAMC; import org.isf.stat.gui.report.GenericReportPharmaceuticalOrder; import org.isf.stat.gui.report.GenericReportPharmaceuticalStock; import org.isf.stat.gui.report.GenericReportPharmaceuticalStockCard; @@ -239,7 +240,46 @@ private JButton getJButtonAMC() { if (buttonAMC == null) { buttonAMC = new JButton(MessageBundle.getMessage("angal.medicals.averagemonthlyconsumption.btn")); buttonAMC.setMnemonic(MessageBundle.getMnemonic("angal.medicals.averagemonthlyconsumption.btn.key")); - buttonAMC.addActionListener(actionEvent -> new GenericReportPharmaceuticalOrder(GeneralData.PHARMACEUTICALAMC)); + buttonAMC.addActionListener(actionEvent -> { + + List dateOptions = new ArrayList<>(); + dateOptions.add(MessageBundle.getMessage("angal.medicals.today")); + dateOptions.add(MessageBundle.getMessage("angal.common.date.txt")); + + Icon icon = new ImageIcon("rsc/icons/calendar_dialog.png"); //$NON-NLS-1$ + String dateOption = (String) MessageDialog.inputDialog(this, + icon, + dateOptions.toArray(), + dateOptions.get(0), + "angal.medicals.pleaseselectareport.msg"); + + if (dateOption == null) { + return; + } + int i = 0; + if (dateOptions.indexOf(dateOption) == i) { + new GenericReportPharmaceuticalAMC(null, GeneralData.PHARMACEUTICALAMC, false); + new GenericReportPharmaceuticalAMC(null, GeneralData.PHARMACEUTICALAMC, true); + return; + } + if (dateOptions.indexOf(dateOption) == ++i) { + + icon = new ImageIcon("rsc/icons/calendar_dialog.png"); //$NON-NLS-1$ + + GoodDateChooser dateChooser = new GoodDateChooser(LocalDate.now(), true, false); + int r = JOptionPane.showConfirmDialog(this, + dateChooser, + MessageBundle.getMessage("angal.common.date.txt"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.PLAIN_MESSAGE, + icon); + + if (r == JOptionPane.OK_OPTION) { + new GenericReportPharmaceuticalAMC(dateChooser.getDateEndOfDay(), GeneralData.PHARMACEUTICALAMC, false); + new GenericReportPharmaceuticalAMC(dateChooser.getDateEndOfDay(), GeneralData.PHARMACEUTICALAMC, true); + } + } + }); } return buttonAMC; } diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java index 09151f1adc..99ab7dc533 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockBrowser.java @@ -106,8 +106,7 @@ import com.github.lgooddatepicker.zinternaltools.WrapLayout; /** - * MovStockBrowser - list medicals movement. let the user search for movements - * and insert a new movements + * MovStockBrowser - list medicals movement. Let the user search for movements and insert a new movement. */ public class MovStockBrowser extends ModalJFrame { @@ -148,6 +147,7 @@ public class MovStockBrowser extends ModalJFrame { private String[] pColumns = { MessageBundle.getMessage("angal.medicalstock.refno.col").toUpperCase(), // 1 MessageBundle.getMessage("angal.common.date.txt").toUpperCase(), // 2 + MessageBundle.getMessage("angal.medicalstock.category.col").toUpperCase(), // 3 MessageBundle.getMessage("angal.common.type.txt").toUpperCase(), // 3 MessageBundle.getMessage("angal.common.ward.txt").toUpperCase(), // 4 MessageBundle.getMessage("angal.common.qty.txt").toUpperCase(), // 5 @@ -162,15 +162,16 @@ public class MovStockBrowser extends ModalJFrame { MessageBundle.getMessage("angal.common.total.txt").toUpperCase(), // 14 MessageBundle.getMessage("angal.common.userid").toUpperCase() // 15 }; - private boolean[] pColumnBold = { true, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; + private boolean[] pColumnBold = { true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; private int[] columnAlignment = { SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.CENTER, - SwingConstants.CENTER, SwingConstants.LEFT, SwingConstants.LEFT, SwingConstants.CENTER, + SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.LEFT, SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.CENTER, SwingConstants.RIGHT, SwingConstants.RIGHT, SwingConstants.CENTER }; private boolean isSingleUser = GeneralData.getGeneralData().getSINGLEUSER(); - private boolean[] pColumnVisible = { true, true, true, true, true, true, true, true, !GeneralData.AUTOMATICLOT_IN, !GeneralData.AUTOMATICLOT_IN, true, true, + private boolean[] pColumnVisible = { true, true, false, true, true, true, true, true, true, !GeneralData.AUTOMATICLOT_IN, !GeneralData.AUTOMATICLOT_IN, + true, true, GeneralData.LOTWITHCOST, GeneralData.LOTWITHCOST, !isSingleUser }; - private int[] pColumnWidth = { 50, 90, 45, 130, 50, 30, 150, 70, 70, 80, 80, 50, 50, 70, 70 }; + private int[] pColumnWidth = { 50, 90, 45, 45, 130, 50, 30, 150, 70, 70, 80, 80, 50, 50, 70, 70 }; /* * Adds to facilitate the selection of products @@ -1203,6 +1204,8 @@ public Object getValueAt(int r, int c) { return movement.getRefNo(); } else if (c == ++col) { return formatDateTime(movement.getDate()); + } else if (c == ++col) { + return movement.getType().getCategory(); } else if (c == ++col) { return movement.getType().toString(); } else if (c == ++col) { diff --git a/src/main/java/org/isf/medicalstockward/gui/WardPharmacy.java b/src/main/java/org/isf/medicalstockward/gui/WardPharmacy.java index efc2d4aa76..5c50678441 100644 --- a/src/main/java/org/isf/medicalstockward/gui/WardPharmacy.java +++ b/src/main/java/org/isf/medicalstockward/gui/WardPharmacy.java @@ -112,8 +112,8 @@ import com.github.lgooddatepicker.zinternaltools.WrapLayout; public class WardPharmacy extends ModalJFrame implements - WardPharmacyNew.MovementWardListeners, - MovementWardListeners { + WardPharmacyNew.MovementWardListeners, + MovementWardListeners { @Override public void movementInserted(AWTEvent e) { @@ -126,7 +126,7 @@ public void movementUpdated(AWTEvent e) { jTableOutcomes.setModel(new OutcomesModel()); jTableDrugs.setModel(new DrugsModel()); } - + private static final long serialVersionUID = 1L; private static final Logger LOGGER = LoggerFactory.getLogger(WardPharmacy.class); @@ -234,7 +234,7 @@ public void movementUpdated(AWTEvent e) { private List wardOutcomes; private List wardIncomes; - //private static final String PREFERRED_LOOK_AND_FEEL = "javax.swing.plaf.metal.MetalLookAndFeel"; //$NON-NLS-1$ + // private static final String PREFERRED_LOOK_AND_FEEL = "javax.swing.plaf.metal.MetalLookAndFeel"; //$NON-NLS-1$ /* * Adds to facilitate the selection of products @@ -329,13 +329,13 @@ private JButton getJButtonStockCard() { if (!stockCardDialog.isCancel()) { new GenericReportPharmaceuticalStockCard("ProductLedgerWard", stockCardDialog.getLocalDateTimeFrom(), - stockCardDialog.getLocalDateTimeTo(), medical, wardSelected, toExcel); + stockCardDialog.getLocalDateTimeTo(), medical, wardSelected, toExcel); } }); } return jButtonStockCard; } - + private JButton getJButtonStockLedger() { if (jButtonStockLedger == null) { jButtonStockLedger = new JButton(MessageBundle.getMessage("angal.common.stockledger.btn")); @@ -346,7 +346,7 @@ private JButton getJButtonStockLedger() { StockLedgerDialog stockCardDialog = new StockLedgerDialog(this, dateFrom, dateTo); if (!stockCardDialog.isCancel()) { new GenericReportPharmaceuticalStockCard("ProductLedgerWard_multi", stockCardDialog.getLocalDateTimeFrom(), - stockCardDialog.getLocalDateTimeTo(), null, wardSelected, false); + stockCardDialog.getLocalDateTimeTo(), null, wardSelected, false); } }); } @@ -390,8 +390,8 @@ private JButton getJButtonDelete() { jButtonDelete.setMnemonic(MessageBundle.getMnemonic("angal.common.delete.btn.key")); jButtonDelete.setVisible(false); jButtonDelete.addActionListener(actionEvent -> { - - if (jTableOutcomes.getSelectedRowCount() > 1 ) { + + if (jTableOutcomes.getSelectedRowCount() > 1) { MessageDialog.error(this, "angal.medicalstock.pleaseselectonlyonemovement.msg"); return; } @@ -400,7 +400,7 @@ private JButton getJButtonDelete() { MessageDialog.error(this, "angal.medicalstock.pleaseselectoucomemovement.msg"); return; } - MovementWard selectedMovement = (MovementWard)jTableOutcomes.getValueAt(selectedRow, -1); + MovementWard selectedMovement = (MovementWard) jTableOutcomes.getValueAt(selectedRow, -1); try { MovementWard movWard = movWardBrowserManager.getLastMovementWard(wardSelected); if (movWard.getCode() == selectedMovement.getCode()) { @@ -414,7 +414,7 @@ private JButton getJButtonDelete() { MessageDialog.error(this, "angal.medicalstock.onlythelastmovementcanbedeleted.msg"); return; } - + } catch (OHServiceException e) { OHServiceExceptionUtil.showMessages(e); return; @@ -422,12 +422,12 @@ private JButton getJButtonDelete() { MessageDialog.info(this, "angal.medicalstock.deletemovementsuccess.msg"); filterButton.doClick(); jTableDrugs.setModel(new DrugsModel()); - + }); } return jButtonDelete; } - + private JPanel getJPanelWard() { if (jPanelWard == null) { jPanelWard = new JPanel(); @@ -520,9 +520,9 @@ private JScrollPane getJScrollPaneDrugs() { if (jScrollPaneDrugs == null) { jScrollPaneDrugs = new JScrollPane(); jScrollPaneDrugs.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), - MessageBundle.getMessage("angal.medicalstock.clickdrugs"), - TitledBorder.LEFT, - TitledBorder.TOP)); + MessageBundle.getMessage("angal.medicalstock.clickdrugs"), + TitledBorder.LEFT, + TitledBorder.TOP)); jScrollPaneDrugs.setViewportView(getJTableDrugs()); } return jScrollPaneDrugs; @@ -550,16 +550,16 @@ public void mouseClicked(MouseEvent me) { JTable target = (JTable) me.getSource(); int row = target.getSelectedRow(); // select a row - /*Checking the row or column is valid or not*/ + /* Checking the row or column is valid or not */ if (row < jTableDrugs.getRowCount() && row >= 0 && column < jTableDrugs.getColumnCount() && column >= 0) { Object value = jTableDrugs.getValueAt(row, column); if (value instanceof JButton) { - /*perform a click event*/ + /* perform a click event */ ((JButton) value).doClick(); } } - if (me.getClickCount() == 2) { // to detect double click events + if (me.getClickCount() == 2) { // to detect double click events showLotDetail(wardDrugs, (String) jTableDrugs.getValueAt(row, 0));// get the value of a row and column. } @@ -596,9 +596,9 @@ private void showLotDetail(List drug, String me) { panel.add(new JScrollPane(lotTable), BorderLayout.CENTER); JOptionPane.showMessageDialog(this, - panel, - MessageBundle.getMessage("angal.medicalstock.multipledischarging.lotinformations"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); + panel, + MessageBundle.getMessage("angal.medicalstock.multipledischarging.lotinformations"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); } class StockMovModel extends DefaultTableModel { @@ -784,7 +784,7 @@ public void focusLost(FocusEvent e) { if (weightTo < 0 || weightTo > 200) { jWeightToTextField.setText(""); //$NON-NLS-1$ JOptionPane - .showMessageDialog(WardPharmacy.this, MessageBundle.getMessage("angal.medicalstockward.insertavalidweight")); //$NON-NLS-1$ + .showMessageDialog(WardPharmacy.this, MessageBundle.getMessage("angal.medicalstockward.insertavalidweight")); //$NON-NLS-1$ } } catch (NumberFormatException ex) { jWeightToTextField.setText("0"); //$NON-NLS-1$ @@ -992,7 +992,7 @@ private JPanel getJPanelMedicalsSearch() { }); searchTextField = new JTextField(15); - //searchTextField.setToolTipText(MessageBundle.getMessage("angal.medicalstock.pharmaceutical")); + // searchTextField.setToolTipText(MessageBundle.getMessage("angal.medicalstock.pharmaceutical")); searchTextField.addKeyListener(new KeyListener() { @Override @@ -1203,20 +1203,20 @@ public IncomesModel() { } } - //List movements from other wards + // List movements from other wards for (MovementWard wMvnt : movWardBrowserManager.getWardMovementsToWard(wardSelected.getCode(), dateFrom, dateTo)) { if (wMvnt.getWardTo().getDescription() != null) { if (wMvnt.getWardTo().equals(wardSelected)) { - MovementType typeCharge = new MovementType("fromward", wMvnt.getWard().getDescription(), "*"); + MovementType typeCharge = new MovementType("fromward", wMvnt.getWard().getDescription(), "*", "*"); wardIncomes.add(new Movement( - wMvnt.getMedical(), - typeCharge, - wardSelected, - wMvnt.getLot(), - wMvnt.getDate(), - wMvnt.getQuantity().intValue(), - null, - null)); + wMvnt.getMedical(), + typeCharge, + wardSelected, + wMvnt.getLot(), + wMvnt.getDate(), + wMvnt.getQuantity().intValue(), + null, + null)); } } } @@ -1363,7 +1363,7 @@ public OutcomesModel() { if (weightTo != 0) { ok = ok && weight >= weightFrom && weight <= weightTo; } - + // filter out movements to this ward, already shown in 'Incomings' table if (wardFrom != null) { ok = false; @@ -1575,10 +1575,10 @@ private JButton getPrintTableButton() { Icon icon = new ImageIcon("rsc/icons/calendar_dialog.png"); //$NON-NLS-1$ String option = (String) MessageDialog.inputDialog(this, - icon, - options.toArray(), - options.get(0), - "angal.medicals.pleaseselectareport.msg"); + icon, + options.toArray(), + options.get(0), + "angal.medicals.pleaseselectareport.msg"); if (option == null) { return; @@ -1595,11 +1595,11 @@ private JButton getPrintTableButton() { GoodDateChooser dateChooser = new GoodDateChooser(LocalDate.now(), true, false); int r = JOptionPane.showConfirmDialog(this, - dateChooser, - MessageBundle.getMessage("angal.common.date.txt"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.PLAIN_MESSAGE, - icon); + dateChooser, + MessageBundle.getMessage("angal.common.date.txt"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.PLAIN_MESSAGE, + icon); if (r == JOptionPane.OK_OPTION) { new GenericReportPharmaceuticalStockWard(dateChooser.getDateEndOfDay(), "PharmaceuticalStockWard", wardSelected); //$NON-NLS-1$ @@ -1655,9 +1655,9 @@ private JButton getExportToExcelButton() { } } catch (IOException exc) { JOptionPane.showMessageDialog(this, - exc.getMessage(), - MessageBundle.getMessage("angal.messagedialog.error.title"), - JOptionPane.PLAIN_MESSAGE); + exc.getMessage(), + MessageBundle.getMessage("angal.messagedialog.error.title"), + JOptionPane.PLAIN_MESSAGE); LOGGER.info("Export to excel error : {}", exc.getMessage()); } @@ -1679,19 +1679,19 @@ private String compileFileName() { filename.append('_').append(MessageBundle.getMessage("angal.medicalstockward.drugs")); } if (jComboBoxTypes.isEnabled() - && !jComboBoxTypes.getSelectedItem().equals( - MessageBundle.getMessage("angal.common.alltypes.txt"))) { + && !jComboBoxTypes.getSelectedItem().equals( + MessageBundle.getMessage("angal.common.alltypes.txt"))) { filename.append('_').append(jComboBoxTypes.getSelectedItem()); } if (jComboBoxMedicals.isEnabled() - && !jComboBoxMedicals.getSelectedItem().equals( - MessageBundle.getMessage("angal.medicalstockward.allmedicals"))) { + && !jComboBoxMedicals.getSelectedItem().equals( + MessageBundle.getMessage("angal.medicalstockward.allmedicals"))) { filename.append('_').append(jComboBoxMedicals.getSelectedItem()); } filename.append('_').append(TimeTools.formatDateTime(jCalendarFrom.getDateStartOfDay(), DATE_FORMAT_YYYYMMDD)) - .append('_').append(TimeTools.formatDateTime(jCalendarTo.getDateStartOfDay(), DATE_FORMAT_YYYYMMDD)); + .append('_').append(TimeTools.formatDateTime(jCalendarTo.getDateStartOfDay(), DATE_FORMAT_YYYYMMDD)); return filename.toString(); } @@ -1702,7 +1702,7 @@ class CenterBoldTableCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) { + boolean hasFocus, int row, int column) { Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); cell.setForeground(Color.BLACK); @@ -1718,7 +1718,7 @@ class BlueBoldTableCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) { + boolean hasFocus, int row, int column) { Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); cell.setForeground(Color.BLACK); @@ -1752,7 +1752,7 @@ private List getSearchMedicalsResults(String s, List medicalsL for (String pattern : patterns) { if (code.contains(pattern.toLowerCase()) || description.contains(pattern.toLowerCase())) { patternFound = true; - //It is sufficient that only one pattern matches the query + // It is sufficient that only one pattern matches the query break; } } diff --git a/src/main/java/org/isf/medstockmovtype/gui/MedicalDsrStockMovementTypeBrowser.java b/src/main/java/org/isf/medstockmovtype/gui/MedicalDsrStockMovementTypeBrowser.java index 623082520c..873aa24694 100644 --- a/src/main/java/org/isf/medstockmovtype/gui/MedicalDsrStockMovementTypeBrowser.java +++ b/src/main/java/org/isf/medstockmovtype/gui/MedicalDsrStockMovementTypeBrowser.java @@ -55,9 +55,10 @@ public class MedicalDsrStockMovementTypeBrowser extends ModalJFrame implements M private String[] pColumns = { MessageBundle.getMessage("angal.common.code.txt").toUpperCase(), MessageBundle.getMessage("angal.common.description.txt").toUpperCase(), - MessageBundle.getMessage("angal.common.type.txt").toUpperCase() + MessageBundle.getMessage("angal.common.type.txt").toUpperCase(), + MessageBundle.getMessage("angal.medstockmovtype.category.txt").toUpperCase() }; - private int[] pColumnWidth = { 80, 200, 40 }; + private int[] pColumnWidth = { 80, 200, 40, 100 }; private JPanel jContainPanel; private JPanel jButtonPanel; @@ -68,10 +69,11 @@ public class MedicalDsrStockMovementTypeBrowser extends ModalJFrame implements M private JTable jTable; private MedicalDsrStockMovementTypeBrowserModel model; private int selectedrow; - private MedicalDsrStockMovementTypeBrowserManager medicalDsrStockMovementTypeBrowserManager = Context.getApplicationContext().getBean(MedicalDsrStockMovementTypeBrowserManager.class); + private MedicalDsrStockMovementTypeBrowserManager medicalDsrStockMovementTypeBrowserManager = Context.getApplicationContext() + .getBean(MedicalDsrStockMovementTypeBrowserManager.class); private MovementType medicalDsrStockMovementType; private final JFrame myFrame; - + /** * This method initializes */ @@ -88,7 +90,7 @@ private void initialize() { pack(); setLocationRelativeTo(null); } - + private JPanel getJContainPanel() { if (jContainPanel == null) { jContainPanel = new JPanel(); @@ -99,7 +101,7 @@ private JPanel getJContainPanel() { } return jContainPanel; } - + private JPanel getJButtonPanel() { if (jButtonPanel == null) { jButtonPanel = new JPanel(); @@ -116,7 +118,7 @@ private JButton getJNewButton() { jNewButton = new JButton(MessageBundle.getMessage("angal.common.new.btn")); jNewButton.setMnemonic(MessageBundle.getMnemonic("angal.common.new.btn.key")); jNewButton.addActionListener(actionEvent -> { - MovementType mdsr = new MovementType("", "", ""); + MovementType mdsr = new MovementType("", "", "", ""); MedicalDsrStockMovementTypeBrowserEdit newrecord = new MedicalDsrStockMovementTypeBrowserEdit(myFrame, mdsr, true); newrecord.addMedicalDsrStockMovementTypeListener(this); newrecord.setVisible(true); @@ -126,9 +128,9 @@ private JButton getJNewButton() { } /** - * This method initializes jEditButton - * - * @return javax.swing.JButton + * This method initializes jEditButton + * + * @return javax.swing.JButton */ private JButton getJEditButton() { if (jEditButton == null) { @@ -148,11 +150,11 @@ private JButton getJEditButton() { } return jEditButton; } - + /** - * This method initializes jCloseButton - * - * @return javax.swing.JButton + * This method initializes jCloseButton + * + * @return javax.swing.JButton */ private JButton getJCloseButton() { if (jCloseButton == null) { @@ -162,11 +164,11 @@ private JButton getJCloseButton() { } return jCloseButton; } - + /** * This method initializes jDeleteButton - * - * @return javax.swing.JButton + * + * @return javax.swing.JButton */ private JButton getJDeleteButton() { if (jDeleteButton == null) { @@ -198,12 +200,13 @@ private JTable getJTable() { if (jTable == null) { model = new MedicalDsrStockMovementTypeBrowserModel(); jTable = new JTable(model); - jTable.getColumnModel().getColumn(0).setMinWidth(pColumnWidth[0]); - jTable.getColumnModel().getColumn(1).setMinWidth(pColumnWidth[1]); + for (int i = 0; i < pColumnWidth.length; i++) { + jTable.getColumnModel().getColumn(i).setMinWidth(pColumnWidth[i]); + } } return jTable; } - + class MedicalDsrStockMovementTypeBrowserModel extends DefaultTableModel { private static final long serialVersionUID = 1L; @@ -246,6 +249,8 @@ public Object getValueAt(int r, int c) { return movType.getDescription(); } else if (c == 2) { return movType.getType(); + } else if (c == 3) { + return medicalDsrStockMovementTypeBrowserManager.getCategoryTranslated(movType.getCategory()); } return null; } @@ -256,7 +261,6 @@ public boolean isCellEditable(int arg0, int arg1) { } } - @Override public void medicalDsrStockMovementTypeUpdated(AWTEvent e) { pMedicalDsrStockMovementType.set(selectedrow, medicalDsrStockMovementType); @@ -266,11 +270,10 @@ public void medicalDsrStockMovementTypeUpdated(AWTEvent e) { jTable.setRowSelectionInterval(selectedrow, selectedrow); } } - - + @Override public void medicalDsrStockMovementTypeInserted(AWTEvent e) { - medicalDsrStockMovementType = (MovementType)e.getSource(); + medicalDsrStockMovementType = (MovementType) e.getSource(); pMedicalDsrStockMovementType.add(0, medicalDsrStockMovementType); ((MedicalDsrStockMovementTypeBrowserModel) jTable.getModel()).fireTableDataChanged(); if (jTable.getRowCount() > 0) { diff --git a/src/main/java/org/isf/medstockmovtype/gui/MedicalDsrStockMovementTypeBrowserEdit.java b/src/main/java/org/isf/medstockmovtype/gui/MedicalDsrStockMovementTypeBrowserEdit.java index b968d32a8c..9ec2af20a9 100644 --- a/src/main/java/org/isf/medstockmovtype/gui/MedicalDsrStockMovementTypeBrowserEdit.java +++ b/src/main/java/org/isf/medstockmovtype/gui/MedicalDsrStockMovementTypeBrowserEdit.java @@ -24,6 +24,7 @@ import java.awt.AWTEvent; import java.awt.BorderLayout; import java.util.EventListener; +import java.util.List; import javax.swing.JButton; import javax.swing.JComboBox; @@ -62,9 +63,9 @@ public void addMedicalDsrStockMovementTypeListener(MedicalDsrStockMovementTypeLi medicalDsrStockMovementTypeListeners.add(MedicalDsrStockMovementTypeListener.class, l); } - public void removeMedicalDsrStockMovementTypeListener(MedicalDsrStockMovementTypeListener listener) { - medicalDsrStockMovementTypeListeners.remove(MedicalDsrStockMovementTypeListener.class, listener); - } + public void removeMedicalDsrStockMovementTypeListener(MedicalDsrStockMovementTypeListener listener) { + medicalDsrStockMovementTypeListeners.remove(MedicalDsrStockMovementTypeListener.class, listener); + } private void fireMedicaldsrstockmovInserted(MovementType anMedicalDsrStockMovementType) { AWTEvent event = new AWTEvent(anMedicalDsrStockMovementType, AWTEvent.RESERVED_ID_MAX + 1) { @@ -89,7 +90,7 @@ private void fireMedicaldsrstockmovUpdated() { ((MedicalDsrStockMovementTypeListener) listener).medicalDsrStockMovementTypeUpdated(event); } } - + private JPanel jContentPane; private JPanel dataPanel; private JPanel buttonPanel; @@ -98,11 +99,14 @@ private void fireMedicaldsrstockmovUpdated() { private JTextField descriptionTextField; private VoLimitedTextField codeTextField; private JComboBox typeComboBox; + private JComboBox categoryComboBox; private String lastdescription; + private String lastCategory; private MovementType medicalDsrStockMovementType; private boolean insert; private JPanel jDataPanel; - private MedicalDsrStockMovementTypeBrowserManager medicalDsrStockMovementTypeBrowserManager = Context.getApplicationContext().getBean(MedicalDsrStockMovementTypeBrowserManager.class); + private MedicalDsrStockMovementTypeBrowserManager medicalDsrStockMovementTypeBrowserManager = Context.getApplicationContext() + .getBean(MedicalDsrStockMovementTypeBrowserManager.class); /** * This is the default constructor @@ -110,8 +114,9 @@ private void fireMedicaldsrstockmovUpdated() { public MedicalDsrStockMovementTypeBrowserEdit(JFrame owner, MovementType old, boolean inserting) { super(owner, true); insert = inserting; - medicalDsrStockMovementType = old;//disease will be used for every operation + medicalDsrStockMovementType = old;// disease will be used for every operation lastdescription = medicalDsrStockMovementType.getDescription(); + lastCategory = medicalDsrStockMovementType.getCategory(); initialize(); } @@ -147,9 +152,9 @@ private JPanel getJContentPane() { } /** - * This method initializes dataPanel - * - * @return javax.swing.JPanel + * This method initializes dataPanel + * + * @return javax.swing.JPanel */ private JPanel getDataPanel() { if (dataPanel == null) { @@ -160,9 +165,9 @@ private JPanel getDataPanel() { } /** - * This method initializes buttonPanel - * - * @return javax.swing.JPanel + * This method initializes buttonPanel + * + * @return javax.swing.JPanel */ private JPanel getButtonPanel() { if (buttonPanel == null) { @@ -174,9 +179,9 @@ private JPanel getButtonPanel() { } /** - * This method initializes cancelButton - * - * @return javax.swing.JButton + * This method initializes cancelButton + * + * @return javax.swing.JButton */ private JButton getCancelButton() { if (cancelButton == null) { @@ -199,13 +204,16 @@ private JButton getOkButton() { okButton.addActionListener(actionEvent -> { String description = descriptionTextField.getText(); + String category = medicalDsrStockMovementTypeBrowserManager.getCategoryKey((String) categoryComboBox.getSelectedItem()); medicalDsrStockMovementType.setDescription(description); medicalDsrStockMovementType.setCode(codeTextField.getText()); medicalDsrStockMovementType.setType((String) typeComboBox.getSelectedItem()); + medicalDsrStockMovementType.setCategory(category); if (insert) { // inserting try { - MovementType insertedMovementType = medicalDsrStockMovementTypeBrowserManager.newMedicalDsrStockMovementType(medicalDsrStockMovementType); + MovementType insertedMovementType = medicalDsrStockMovementTypeBrowserManager + .newMedicalDsrStockMovementType(medicalDsrStockMovementType); if (insertedMovementType != null) { fireMedicaldsrstockmovInserted(medicalDsrStockMovementType); dispose(); @@ -216,11 +224,12 @@ private JButton getOkButton() { OHServiceExceptionUtil.showMessages(e1); } } else { // updating - if (description.equals(lastdescription)) { + if (description.equals(lastdescription) && category.equals(lastCategory)) { dispose(); } else { try { - MovementType updatedMovementType = medicalDsrStockMovementTypeBrowserManager.updateMedicalDsrStockMovementType(medicalDsrStockMovementType); + MovementType updatedMovementType = medicalDsrStockMovementTypeBrowserManager + .updateMedicalDsrStockMovementType(medicalDsrStockMovementType); if (updatedMovementType != null) { fireMedicaldsrstockmovUpdated(); dispose(); @@ -238,25 +247,25 @@ private JButton getOkButton() { } /** - * This method initializes descriptionTextField - * - * @return javax.swing.JTextField + * This method initializes descriptionTextField + * + * @return javax.swing.JTextField */ private JTextField getDescriptionTextField() { if (descriptionTextField == null) { descriptionTextField = new JTextField(20); if (!insert) { descriptionTextField.setText(medicalDsrStockMovementType.getDescription()); - lastdescription=medicalDsrStockMovementType.getDescription(); - } + lastdescription = medicalDsrStockMovementType.getDescription(); + } } return descriptionTextField; } - + /** - * This method initializes codeTextField - * - * @return javax.swing.JTextField + * This method initializes codeTextField + * + * @return javax.swing.JTextField */ private JTextField getCodeTextField() { if (codeTextField == null) { @@ -268,11 +277,11 @@ private JTextField getCodeTextField() { } return codeTextField; } - + /** - * This method initializes typeTextField - * - * @return javax.swing.JTextField + * This method initializes typeComboBox + * + * @return javax.swing.JTextField */ private JComboBox getTypeComboBox() { if (typeComboBox == null) { @@ -288,9 +297,29 @@ private JComboBox getTypeComboBox() { } /** - * This method initializes jDataPanel - * - * @return javax.swing.JPanel + * This method initializes categoryComboBox + * + * @return javax.swing.JTextField + */ + private JComboBox getCategoryComboBox() { + if (categoryComboBox == null) { + categoryComboBox = new JComboBox<>(); + List categoryList = medicalDsrStockMovementTypeBrowserManager.getCategoryList(); + for (String description : categoryList) { + categoryComboBox.addItem(description); + } + if (!insert) { + categoryComboBox.setSelectedItem(medicalDsrStockMovementTypeBrowserManager.getCategoryTranslated(medicalDsrStockMovementType.getCategory())); + lastCategory = medicalDsrStockMovementType.getCategory(); + } + } + return categoryComboBox; + } + + /** + * This method initializes jDataPanel + * + * @return javax.swing.JPanel */ private JPanel getJDataPanel() { if (jDataPanel == null) { @@ -301,7 +330,9 @@ private JPanel getJDataPanel() { jDataPanel.add(getDescriptionTextField()); jDataPanel.add(new JLabel(MessageBundle.getMessage("angal.medstockmovtype.type") + ':')); jDataPanel.add(getTypeComboBox()); - SpringUtilities.makeCompactGrid(jDataPanel, 3, 2, 5, 5, 5, 5); + jDataPanel.add(new JLabel(MessageBundle.getMessage("angal.medstockmovtype.category.txt") + ':')); + jDataPanel.add(getCategoryComboBox()); + SpringUtilities.makeCompactGrid(jDataPanel, 4, 2, 5, 5, 5, 5); } return jDataPanel; } diff --git a/src/main/java/org/isf/medstockmovtype/gui/MedicalsrMovPatList.java b/src/main/java/org/isf/medstockmovtype/gui/MedicalsrMovPatList.java index c73203dfe8..90f476f1cd 100644 --- a/src/main/java/org/isf/medstockmovtype/gui/MedicalsrMovPatList.java +++ b/src/main/java/org/isf/medstockmovtype/gui/MedicalsrMovPatList.java @@ -40,6 +40,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/* + * TODO: Move under package org.isf.medicalstockward.gui + */ public class MedicalsrMovPatList extends JPanel { private static final Logger LOGGER = LoggerFactory.getLogger(MedicalsrMovPatList.class); @@ -58,11 +61,11 @@ public MedicalsrMovPatList(Object object) { JScrollPane scrollPaneData = new JScrollPane(); panelData.add(scrollPaneData); - + if (object instanceof Patient) { myPatient = (Patient) object; } - + if (myPatient != null) { try { List movPat = movWardBrowserManager.getMovementToPatient(myPatient); @@ -88,7 +91,7 @@ public MedicalsrMovPatList(Object object) { dialogDrug.setLocationRelativeTo(null); dialogDrug.setModal(true); } - + public List getDrugsData() { return drugsData; } diff --git a/src/main/java/org/isf/stat/gui/report/GenericReportPharmaceuticalAMC.java b/src/main/java/org/isf/stat/gui/report/GenericReportPharmaceuticalAMC.java new file mode 100644 index 0000000000..b643471918 --- /dev/null +++ b/src/main/java/org/isf/stat/gui/report/GenericReportPharmaceuticalAMC.java @@ -0,0 +1,84 @@ +/* + * Open Hospital (www.open-hospital.org) + * Copyright © 2006-2024 Informatici Senza Frontiere (info@informaticisenzafrontiere.org) + * + * Open Hospital is a free and open source software for healthcare data management. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * https://www.gnu.org/licenses/gpl-3.0-standalone.html + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.isf.stat.gui.report; + +import static org.isf.utils.Constants.DATE_FORMAT_YYYYMMDD; + +import java.io.File; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import javax.swing.JFileChooser; +import javax.swing.filechooser.FileNameExtensionFilter; + +import org.isf.menu.manager.Context; +import org.isf.stat.dto.JasperReportResultDto; +import org.isf.stat.manager.JasperReportsManager; +import org.isf.utils.excel.ExcelExporter; +import org.isf.utils.jobjects.MessageDialog; +import org.isf.utils.time.TimeTools; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GenericReportPharmaceuticalAMC extends DisplayReport { + + private static final Logger LOGGER = LoggerFactory.getLogger(GenericReportPharmaceuticalAMC.class); + private JasperReportsManager jasperReportsManager = Context.getApplicationContext().getBean(JasperReportsManager.class); + + public GenericReportPharmaceuticalAMC(LocalDateTime date, String jasperFileName, boolean toExcel) { + try { + + if (date == null) { + date = TimeTools.getNow(); + } + + File defaultFilename = new File(compileAMCFilename(jasperFileName, date)); + + if (toExcel) { + JFileChooser fcExcel = ExcelExporter.getJFileChooserExcel(defaultFilename); + int iRetVal = fcExcel.showSaveDialog(null); + if (iRetVal == JFileChooser.APPROVE_OPTION) { + File exportFile = fcExcel.getSelectedFile(); + FileNameExtensionFilter selectedFilter = (FileNameExtensionFilter) fcExcel.getFileFilter(); + String extension = selectedFilter.getExtensions()[0]; + if (!exportFile.getName().endsWith(extension)) { + exportFile = new File(exportFile.getAbsoluteFile() + "." + extension); + } + jasperReportsManager.getGenericReportPharmaceuticalAMCExcel(date, jasperFileName, exportFile.getAbsolutePath()); + } + } else { + JasperReportResultDto jasperReportResultDto = jasperReportsManager.GenericReportPharmaceuticalAMCPdf(date, jasperFileName); + showReport(jasperReportResultDto); + } + } catch (Exception e) { + LOGGER.error("", e); + MessageDialog.error(null, "angal.stat.reporterror.msg"); + } + } + + private String compileAMCFilename(String jasperFileName, LocalDateTime date) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_FORMAT_YYYYMMDD); + StringBuilder fileName = new StringBuilder(jasperFileName); + fileName.append('_').append(dateTimeFormatter.format(date)); + return fileName.toString(); + } +} From cb848084e19a43fa6fc4ecf6d3590d50b486ef3e Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Wed, 12 Jun 2024 16:21:39 +0200 Subject: [PATCH 40/86] Update Eclipse settings (#2018) --- .../OpenHospital-Java-CodeStyle-Formatter.xml | 777 +++++++++--------- 1 file changed, 399 insertions(+), 378 deletions(-) diff --git a/.ide-settings/eclipse/OpenHospital-Java-CodeStyle-Formatter.xml b/.ide-settings/eclipse/OpenHospital-Java-CodeStyle-Formatter.xml index 71186b4c20..3ad7b0d08d 100755 --- a/.ide-settings/eclipse/OpenHospital-Java-CodeStyle-Formatter.xml +++ b/.ide-settings/eclipse/OpenHospital-Java-CodeStyle-Formatter.xml @@ -1,380 +1,401 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 41d00f8c10998db1edcb9e1e04109d928c22bf5c Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Thu, 13 Jun 2024 03:37:55 -0400 Subject: [PATCH 41/86] OP-1278 resource bundle addition (#2015) --- bundle/language_en.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/bundle/language_en.properties b/bundle/language_en.properties index 8feb27cca9..bcd1ffb948 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -8,6 +8,7 @@ angal.admission.admissionanddischarge.title angal.admission.admissiondate.border = Admission Date * angal.admission.admissiondate.txt = Admission Date * angal.admission.admissiondatecannotbeempty.msg = Admission date cannot be empty. +angal.admission.admissionpatientcannotbeempty.msg = Admission patient cannot be empty. angal.admission.admissionstatus.border = Admission Status angal.admission.admissiontype.border = Admission Type * angal.admission.admissionwardcannotbeempty.msg = Admission ward cannot be empty. From d0f2e0177f24982599c5e237b8253c60fc4c05a4 Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Fri, 14 Jun 2024 18:24:05 -0400 Subject: [PATCH 42/86] Chore: update Intellij settings to match Eclipse (#2019) --- .../OpenHospital-code-style-configuration.xml | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.ide-settings/idea/OpenHospital-code-style-configuration.xml b/.ide-settings/idea/OpenHospital-code-style-configuration.xml index 6f1e2f5576..87a358cd6c 100644 --- a/.ide-settings/idea/OpenHospital-code-style-configuration.xml +++ b/.ide-settings/idea/OpenHospital-code-style-configuration.xml @@ -1,6 +1,8 @@ \ No newline at end of file From c62a84668e8c1f281189ae08828c9f3c43b4bd59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 04:51:55 +0000 Subject: [PATCH 43/86] Chore(deps): Bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.2.5 to 3.3.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.5...surefire-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bc86661580..8b502f96de 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.2.5 + 3.3.0 org.apache.maven.plugins From b8b66ff9a5cf2714082b94bc615ad7fbb127acc8 Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Mon, 17 Jun 2024 16:03:38 -0400 Subject: [PATCH 44/86] Hibernate renamed org.hibernate.type to org.hibernate.orm.jdbc.bind (#2021) --- rsc/log4j2-spring.properties.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rsc/log4j2-spring.properties.dist b/rsc/log4j2-spring.properties.dist index a16a10a803..5afd7c08ad 100755 --- a/rsc/log4j2-spring.properties.dist +++ b/rsc/log4j2-spring.properties.dist @@ -54,5 +54,5 @@ appender.jdbc.columnConfigs[2].isUnicode = false ##logger.hibernate-SQL.name=org.hibernate.SQL ##logger.hibernate-SQL.level=DEBUG ## -##logger.hibernate-type.name=org.hibernate.type +##logger.hibernate-type.name=org.hibernate.orm.jdbc.bind ##logger.hibernate-type.level=TRACE From 14fefebd72f10734d849bb2809520f76608a269f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 04:59:41 +0000 Subject: [PATCH 45/86] Chore(deps): Bump org.apache.maven.plugins:maven-jar-plugin Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.4.1 to 3.4.2. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.4.1...maven-jar-plugin-3.4.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bc86661580..2c3bdac4d8 100644 --- a/pom.xml +++ b/pom.xml @@ -212,7 +212,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 From 802e5c24a9bf591d38071cfb70be67cf2d049155 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 04:54:54 +0000 Subject: [PATCH 46/86] Chore(deps-dev): Bump org.junit.jupiter:junit-jupiter-engine Bumps [org.junit.jupiter:junit-jupiter-engine](https://github.com/junit-team/junit5) from 5.10.2 to 5.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.2...r5.10.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ad543da9e9..61bdbb2b9b 100644 --- a/pom.xml +++ b/pom.xml @@ -336,7 +336,7 @@ org.junit.jupiter junit-jupiter-engine - 5.10.2 + 5.10.3 test From 04cad6cf7d6b0389d8aec9bedb57ec6417beeeca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:58:39 +0000 Subject: [PATCH 47/86] Chore(deps-dev): Bump org.assertj:assertj-core from 3.25.3 to 3.26.0 Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.0. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.0) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 61bdbb2b9b..66088d2fcb 100644 --- a/pom.xml +++ b/pom.xml @@ -342,7 +342,7 @@ org.assertj assertj-core - 3.25.3 + 3.26.0 test From 77b3d83cba5d8f5d9db536f4ccd55d8576b80c92 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:59:12 +0000 Subject: [PATCH 48/86] Chore(deps): Bump org.apache.maven.plugins:maven-dependency-plugin Bumps [org.apache.maven.plugins:maven-dependency-plugin](https://github.com/apache/maven-dependency-plugin) from 3.6.1 to 3.7.1. - [Release notes](https://github.com/apache/maven-dependency-plugin/releases) - [Commits](https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.6.1...maven-dependency-plugin-3.7.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-dependency-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 61bdbb2b9b..fb34f9cbe9 100644 --- a/pom.xml +++ b/pom.xml @@ -192,7 +192,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.6.1 + 3.7.1 copy-dependencies From f153d0e9011b22e0a455afe6bcd5042f07be3bad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 04:42:52 +0000 Subject: [PATCH 49/86] Chore(deps-dev): Bump org.assertj:assertj-core from 3.26.0 to 3.26.3 Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.0 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.26.0...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3013e88195..a678a2c45e 100644 --- a/pom.xml +++ b/pom.xml @@ -342,7 +342,7 @@ org.assertj assertj-core - 3.26.0 + 3.26.3 test From 2b494789320492f78d34219387607117b7a0ba12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jul 2024 04:45:33 +0000 Subject: [PATCH 50/86] Chore(deps): Bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.3.0 to 3.3.1. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.3.0...surefire-3.3.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a678a2c45e..73fe7220dd 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.3.0 + 3.3.1 org.apache.maven.plugins From 37499d719fa70875fc06209d57f38f3c35871377 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Wed, 24 Jul 2024 23:02:52 +0200 Subject: [PATCH 51/86] OP-1301-fix-units-packets-management-in-main-store (#2027) * Improve quantity check for single lot * Add exception for AUTOMATICLOT_OUT case * Apply project standards * Deprecate initialQty * Apply suggestions from code review --------- Co-authored-by: David B Malkovsky --- bundle/language_en.properties | 4 +++- .../org/isf/medicals/gui/MedicalBrowser.java | 2 +- .../gui/MovStockMultipleDischarging.java | 20 +++++++++++-------- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/bundle/language_en.properties b/bundle/language_en.properties index bcd1ffb948..1640814b1a 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -823,7 +823,7 @@ angal.medicalstock.lotpreparationdate angal.medicalstock.medtype.col = Med Type angal.medicalstock.movement = Movement angal.medicalstock.movementdatefromcannotbelaterthanmovementdateto = Movement Date From cannot be later than movement Date To -angal.medicalstock.movementquantityisgreaterthanthequantityof.msg = Movement quantity is greater than the quantity of the lot selected; split the movement. +angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg = Movement quantity ({0}) is greater than the quantity of the lot selected ({1}); split the movement or adjust Units/Packets. angal.medicalstock.multiplecharging.adateinthefutureisnotallowed.msg = A date in the future is not allowed. angal.medicalstock.multiplecharging.chargetype = Charge Type angal.medicalstock.multiplecharging.chooseamedical = Choose a Medical @@ -864,7 +864,9 @@ angal.medicalstock.multipledischarging.isabouttoend angal.medicalstock.multipledischarging.lotinformations = Lot Information angal.medicalstock.multipledischarging.lotnumberabb = Lot No. angal.medicalstock.multipledischarging.lyinginstock = Lying in stock: +angal.medicalstock.multipledischarging.movementexceedstheavailablequantityformedical.fmt.msg = Movement exceeds the available quantity ({0}) for medical {1}. angal.medicalstock.multipledischarging.noelementtosave = No elements to save +angal.medicalstock.multipledischarging.nolotswithavailablequantityfoundformedicalpleasereport.fmt.msg = No lots with available quantity found for medical {0}; please report to system administrator. angal.medicalstock.multipledischarging.outofstock = Out of stock! angal.medicalstock.multipledischarging.packets = Packets angal.medicalstock.multipledischarging.pleaseinsertavalidvalue = Insert a valid value diff --git a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java index a160da3424..231810640a 100644 --- a/src/main/java/org/isf/medicals/gui/MedicalBrowser.java +++ b/src/main/java/org/isf/medicals/gui/MedicalBrowser.java @@ -559,7 +559,7 @@ private JButton getJButtonNew() { buttonNew.setMnemonic(MessageBundle.getMnemonic("angal.common.new.btn.key")); buttonNew.addActionListener(actionEvent -> { // medical will reference the new record - medical = new Medical(null, new MedicalType("", ""), "", "", 0, 0, 0, 0, 0); + medical = new Medical(null, new MedicalType("", ""), "", "", 0, 0, 0, 0); MedicalEdit newrecord = new MedicalEdit(medical, true, me); newrecord.addMedicalListener(this); newrecord.setVisible(true); diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java index e073e185c3..e3c2b89c28 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleDischarging.java @@ -114,7 +114,7 @@ public class MovStockMultipleDischarging extends JDialog { MessageBundle.getMessage("angal.medicalstock.multipledischarging.expiringdate").toUpperCase() }; private final Class[] columnClasses = { String.class, String.class, Integer.class, Integer.class, String.class, Integer.class, String.class, String.class }; - private boolean[] columnEditable = { false, false, false, false, true, false, false, false }; + private boolean[] columnEditable = { false, false, false, true, true, false, false, false }; private int[] columnWidth = { 50, 100, 70, 50, 70, 50, 100, 80 }; private boolean[] columnResizable = { false, true, false, false, false, false, false, false }; private boolean[] columnVisible = { true, true, true, true, true, true, !GeneralData.AUTOMATICLOT_OUT, !GeneralData.AUTOMATICLOT_OUT }; @@ -315,12 +315,7 @@ private JTextField getJTextFieldSearch() { String refNo = jTextFieldReference.getText(); Movement movement = new Movement(med, (MovementType) jComboBoxDischargeType.getSelectedItem(), null, lot, date, qty, null, refNo); - if (med.getPcsperpck() > 1) { - model.addItem(movement, PACKETS); - } else { - model.addItem(movement, UNITS); - } - + model.addItem(movement, UNITS); jTextFieldSearch.setText(""); //$NON-NLS-1$ jTextFieldSearch.requestFocus(); } @@ -596,7 +591,7 @@ protected Lot chooseLot(List lots, double qty) { private boolean checkQuantityInLot(Lot lot, double qty) { double lotQty = lot.getMainStoreQuantity(); if (qty > lotQty) { - MessageDialog.error(this, "angal.medicalstock.movementquantityisgreaterthanthequantityof.msg"); + MessageDialog.error(this, "angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg", qty, lotQty); return false; } return true; @@ -862,6 +857,15 @@ public Object getValueAt(int r, int c) { @Override public void setValueAt(Object value, int r, int c) { Movement movement = movements.get(r); + if (c == 3) { + int oldQuantity = movement.getQuantity(); + movement.setQuantity((int) value); + + int total = calcTotal(movement, units.get(r)); + if (!checkQuantityInMovement(movement, total)) { + movement.setQuantity(oldQuantity); + } + } if (c == 4) { int newOption = 0; if (qtyOption[1].equals(value)) { From 262918035b3753138b566a9c968e5cb5cebbb61e Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Wed, 31 Jul 2024 02:48:40 -0400 Subject: [PATCH 52/86] OP-1315 add MessageType to sms.properties.dist (#2029) * OP-1315 add MessageType to sms.properties.dist * OP-1315 fix spelling of LENGTH * Update rsc/sms.properties.dist --------- Co-authored-by: Alessandro Domanico --- rsc/sms.properties.dist | 2 ++ src/main/java/org/isf/sms/gui/SmsEdit.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/rsc/sms.properties.dist b/rsc/sms.properties.dist index 9f43c626b2..dd68e21265 100644 --- a/rsc/sms.properties.dist +++ b/rsc/sms.properties.dist @@ -28,6 +28,8 @@ skebby-gateway-service.ribbon.base-url=https://api.skebby.it:443 # USER_KEY and ACCESS_TOKEN avoids the login call every time we need to send sms skebby-gateway-service.accessToken= skebby-gateway-service.userKey= +# message_type: GP for Classic+, TI for Classic, SI for Basic (default) +#skebby-gateway-service.messageType= ################################################################## diff --git a/src/main/java/org/isf/sms/gui/SmsEdit.java b/src/main/java/org/isf/sms/gui/SmsEdit.java index e94c6f0062..73a90e9d5d 100644 --- a/src/main/java/org/isf/sms/gui/SmsEdit.java +++ b/src/main/java/org/isf/sms/gui/SmsEdit.java @@ -95,7 +95,7 @@ public SmsEdit(JFrame owner) { } private void initialize() { - maxLength = SmsManager.MAX_LENGHT; + maxLength = SmsManager.MAX_LENGTH; } private void initComponents() { From 185740a1a2a505158ccf14387b56f431a63cc7b9 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Tue, 6 Aug 2024 16:19:49 +0200 Subject: [PATCH 53/86] OP-1319 Fix prices update upon pricelist change (#2031) * Add prices update and check upon pricelist change * Update src/main/java/org/isf/accounting/gui/PatientBillEdit.java Co-authored-by: David B Malkovsky --------- Co-authored-by: David B Malkovsky --- src/main/java/org/isf/accounting/gui/PatientBillEdit.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/isf/accounting/gui/PatientBillEdit.java b/src/main/java/org/isf/accounting/gui/PatientBillEdit.java index 260a037644..ba5ee9d05b 100644 --- a/src/main/java/org/isf/accounting/gui/PatientBillEdit.java +++ b/src/main/java/org/isf/accounting/gui/PatientBillEdit.java @@ -107,8 +107,7 @@ import com.github.lgooddatepicker.zinternaltools.TimeChangeEvent; /** - * Create a single Patient Bill - * it affects tables BILLS, BILLITEMS and BILLPAYMENTS + * Create a single Patient Bill which affects tables BILLS, BILLITEMS and BILLPAYMENTS * * @author Mwithi */ @@ -721,6 +720,8 @@ private JComboBox getJComboBoxPriceList() { thisBill.setPriceList(selectedPricelist); thisBill.setIsList(true); setCurrencyCodeFromList(selectedPricelist); + setPriceListArray(); + checkBill(); updateGUI(); }); } From d758e134bf9070c4f4c9f72a08dfad22c2f26b85 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Thu, 8 Aug 2024 17:19:21 +0200 Subject: [PATCH 54/86] OP-1323 Fix shared report between "base" and "stat" (#2034) --- .../org/isf/accounting/gui/BillBrowser.java | 311 +++++++++--------- 1 file changed, 155 insertions(+), 156 deletions(-) diff --git a/src/main/java/org/isf/accounting/gui/BillBrowser.java b/src/main/java/org/isf/accounting/gui/BillBrowser.java index 5c17ffdd0e..530bddfd98 100644 --- a/src/main/java/org/isf/accounting/gui/BillBrowser.java +++ b/src/main/java/org/isf/accounting/gui/BillBrowser.java @@ -101,7 +101,7 @@ * @author Mwithi */ public class BillBrowser extends ModalJFrame implements PatientBillListener { - + protected static final String NO_USERNAME = null; private static final Logger LOGGER = LoggerFactory.getLogger(BillBrowser.class); @@ -193,13 +193,13 @@ public void billInserted(AWTEvent event) { private int[] columnsWidth = { 50, 50, 150, 50, 50, 100, 150, 50, 100, 50 }; private int[] maxWidth = { 70, 150, 150, 150, 200, 100, 150, 50, 100, 50 }; private boolean[] columnsResizable = { false, false, false, false, true, false, false, false, false, false }; - private Class[] columnsClasses = { String.class, Integer.class, String.class, String.class, String.class, Double.class, String.class, String.class, + private Class< ? >[] columnsClasses = { String.class, Integer.class, String.class, String.class, String.class, Double.class, String.class, String.class, Double.class, ImageIcon.class }; private boolean[] alignStringCenter = { false, true, true, true, false, false, true, true, false, false }; private boolean[] alingStringBoldCenter = { false, true, false, false, false, false, false, false, false, false }; private boolean[] showColumn = { !isSingleUser, true, true, true, true, true, true, true, true, true, true }; - //Totals + // Totals private BigDecimal totalToday; private BigDecimal balanceToday; private BigDecimal totalPeriod; @@ -209,7 +209,7 @@ public void billInserted(AWTEvent event) { private int month; private int year; - //Bills & Payments + // Bills & Payments private BillBrowserManager billBrowserManager = Context.getApplicationContext().getBean(BillBrowserManager.class); private List billPeriod; private List paymentsPeriod; @@ -217,7 +217,7 @@ public void billInserted(AWTEvent event) { private String currencyCod; - //Users + // Users private String user = UserBrowsingManager.getCurrentUser(); private List users; @@ -251,7 +251,7 @@ private void initComponents() { @Override public void windowClosing(WindowEvent e) { - //to free memory + // to free memory billPeriod.clear(); users.clear(); dispose(); @@ -284,20 +284,20 @@ private JPanel getJPanelTotals() { return jPanelTotals; } - private GoodDateChooser getJCalendarFrom() { - if (jCalendarFrom == null) { - jCalendarFrom = new GoodDateChooser(LocalDate.now()); - jCalendarFrom.addDateChangeListener(event -> { - LocalDate newDate = event.getNewDate(); - if (newDate != null) { + private GoodDateChooser getJCalendarFrom() { + if (jCalendarFrom == null) { + jCalendarFrom = new GoodDateChooser(LocalDate.now()); + jCalendarFrom.addDateChangeListener(event -> { + LocalDate newDate = event.getNewDate(); + if (newDate != null) { dateFrom = newDate.atStartOfDay(); jButtonToday.setEnabled(true); billInserted(null); - } - }); - } - return jCalendarFrom; - } + } + }); + } + return jCalendarFrom; + } private GoodDateChooser getJCalendarTo() { if (jCalendarTo == null) { @@ -333,10 +333,10 @@ private JButton getJButtonReport() { } Icon icon = new ImageIcon("rsc/icons/calendar_dialog.png"); String option = (String) MessageDialog.inputDialog(this, - icon, - options.toArray(), - options.get(0), - "angal.billbrowser.pleaseselectareport.msg"); + icon, + options.toArray(), + options.get(0), + "angal.billbrowser.pleaseselectareport.msg"); if (option == null) { return; } @@ -374,17 +374,17 @@ private JButton getJButtonReport() { if (options.indexOf(option) == ++i) { month = jComboBoxMonths.getMonth() + 1; LocalDateTime thisMonthFrom = dateFrom.toLocalDate() - .withMonth(month) - .withDayOfMonth(1) - .atStartOfDay() - .truncatedTo(ChronoUnit.SECONDS); + .withMonth(month) + .withDayOfMonth(1) + .atStartOfDay() + .truncatedTo(ChronoUnit.SECONDS); LocalDateTime thisMonthTo = dateTo.toLocalDate() - .withMonth(month) - .withDayOfMonth(YearMonth.of(dateFrom.getYear(), month).lengthOfMonth()) - .atStartOfDay() - .toLocalDate() - .atTime(LocalTime.MAX) - .truncatedTo(ChronoUnit.SECONDS); + .withMonth(month) + .withDayOfMonth(YearMonth.of(dateFrom.getYear(), month).lengthOfMonth()) + .atStartOfDay() + .toLocalDate() + .atTime(LocalTime.MAX) + .truncatedTo(ChronoUnit.SECONDS); from = TimeTools.formatDateTime(thisMonthFrom, DATE_FORMAT_DD_MM_YYYY); to = TimeTools.formatDateTime(thisMonthTo, DATE_FORMAT_DD_MM_YYYY); } @@ -394,11 +394,11 @@ private JButton getJButtonReport() { JMonthChooser monthChooser = new JMonthChooser(); int r = JOptionPane.showConfirmDialog(this, - monthChooser, - MessageBundle.getMessage("angal.billbrowser.month.txt"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.PLAIN_MESSAGE, - icon); + monthChooser, + MessageBundle.getMessage("angal.billbrowser.month.txt"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.PLAIN_MESSAGE, + icon); if (r == JOptionPane.OK_OPTION) { month = monthChooser.getMonth() + 1; @@ -407,17 +407,17 @@ private JButton getJButtonReport() { } LocalDateTime thisMonthFrom = dateFrom.toLocalDate() - .withMonth(month) - .withDayOfMonth(1) - .atStartOfDay() - .truncatedTo(ChronoUnit.SECONDS); + .withMonth(month) + .withDayOfMonth(1) + .atStartOfDay() + .truncatedTo(ChronoUnit.SECONDS); LocalDateTime thisMonthTo = dateTo.toLocalDate() - .withMonth(month) - .withDayOfMonth(YearMonth.of(dateFrom.getYear(), month).lengthOfMonth()) - .atStartOfDay() - .toLocalDate() - .atTime(LocalTime.MAX) - .truncatedTo(ChronoUnit.SECONDS); + .withMonth(month) + .withDayOfMonth(YearMonth.of(dateFrom.getYear(), month).lengthOfMonth()) + .atStartOfDay() + .toLocalDate() + .atTime(LocalTime.MAX) + .truncatedTo(ChronoUnit.SECONDS); from = TimeTools.formatDateTime(thisMonthFrom, DATE_FORMAT_DD_MM_YYYY); to = TimeTools.formatDateTime(thisMonthTo, DATE_FORMAT_DD_MM_YYYY); } @@ -427,27 +427,27 @@ private JButton getJButtonReport() { Bill bill = null; int selectedRow; int currentTab = jTabbedPaneBills.getSelectedIndex(); - switch(currentTab) { - case 0: - selectedRow = jTableBills.getSelectedRow(); - if (selectedRow >= 0) { - bill = (Bill)jTableBills.getValueAt(selectedRow, -1); - } - break; - case 1: - selectedRow = jTablePending.getSelectedRow(); - if (selectedRow >= 0) { - bill = (Bill)jTablePending.getValueAt(selectedRow, -1); - } - break; - case 2: - selectedRow = jTableClosed.getSelectedRow(); - if (selectedRow >= 0) { - bill = (Bill)jTableClosed.getValueAt(selectedRow, -1); - } - break; - default: - break; + switch (currentTab) { + case 0: + selectedRow = jTableBills.getSelectedRow(); + if (selectedRow >= 0) { + bill = (Bill) jTableBills.getValueAt(selectedRow, -1); + } + break; + case 1: + selectedRow = jTablePending.getSelectedRow(); + if (selectedRow >= 0) { + bill = (Bill) jTablePending.getValueAt(selectedRow, -1); + } + break; + case 2: + selectedRow = jTableClosed.getSelectedRow(); + if (selectedRow >= 0) { + bill = (Bill) jTableClosed.getValueAt(selectedRow, -1); + } + break; + default: + break; } if (bill != null) { patient = bill.getBillPatient(); @@ -466,21 +466,21 @@ private JButton getJButtonReport() { icon = new ImageIcon("rsc/icons/list_dialog.png"); option = (String) MessageDialog.inputDialog(this, - icon, - options.toArray(), - options.get(0), - "angal.billbrowser.pleaseselectareport.msg"); + icon, + options.toArray(), + options.get(0), + "angal.billbrowser.pleaseselectareport.msg"); if (option == null) { return; } if (options.indexOf(option) == 0) { - new GenericReportFromDateToDate(from, to, "rpt_base", GeneralData.BILLSREPORTPENDING, - MessageBundle.getMessage("angal.billbrowser.shortreportonlybaddebt.txt"), false); + new GenericReportFromDateToDate(from, to, "rpt_stat", GeneralData.BILLSREPORTPENDING, + MessageBundle.getMessage("angal.billbrowser.shortreportonlybaddebt.txt"), false); } if (options.indexOf(option) == 1) { - new GenericReportFromDateToDate(from, to, "rpt_base", GeneralData.BILLSREPORT, - MessageBundle.getMessage("angal.billbrowser.fullreportallbills.txt"), false); + new GenericReportFromDateToDate(from, to, "rpt_stat", GeneralData.BILLSREPORT, + MessageBundle.getMessage("angal.billbrowser.fullreportallbills.txt"), false); } }); } @@ -492,7 +492,7 @@ private JButton getJButtonClose() { jButtonClose = new JButton(MessageBundle.getMessage("angal.common.close.btn")); jButtonClose.setMnemonic(MessageBundle.getMnemonic("angal.common.close.btn.key")); jButtonClose.addActionListener(actionEvent -> { - //to free memory + // to free memory billPeriod.clear(); users.clear(); dispose(); @@ -635,7 +635,7 @@ private JButton getJButtonPrintReceipt() { String fromDate = dateFrom.format(DATE_TIME_FORMATTER); String toDate = dateTo.format(DATE_TIME_FORMATTER); new GenericReportBill(billsIdList.get(0), GeneralData.PATIENTBILLGROUPED, patientParent, billsIdList, fromDate, toDate, true, - true); + true); } else { MessageDialog.error(this, "angal.billbrowser.thebillisstillopen.msg"); return; @@ -895,15 +895,15 @@ private JMonthChooser getJComboMonths() { jComboBoxMonths.addPropertyChangeListener("month", propertyChangeEvent -> { month = jComboBoxMonths.getMonth() + 1; dateFrom = dateFrom.toLocalDate() - .withMonth(month) - .withDayOfMonth(1) - .atStartOfDay(); + .withMonth(month) + .withDayOfMonth(1) + .atStartOfDay(); dateTo = dateTo.toLocalDate() - .withMonth(month) - .withDayOfMonth(YearMonth.of(dateFrom.getYear(), month).lengthOfMonth()) - .atStartOfDay() - .toLocalDate() - .atTime(LocalTime.MAX); + .withMonth(month) + .withDayOfMonth(YearMonth.of(dateFrom.getYear(), month).lengthOfMonth()) + .atStartOfDay() + .toLocalDate() + .atTime(LocalTime.MAX); jCalendarFrom.setDate(dateFrom.toLocalDate()); jCalendarTo.setDate(dateTo.toLocalDate()); }); @@ -917,17 +917,17 @@ private JYearChooser getJComboYears() { jComboBoxYears.getModel().addChangeListener(e -> { year = jComboBoxYears.getYear(); dateFrom = LocalDate.now() - .withYear(year) - .withMonth(1) - .withDayOfMonth(1) - .atStartOfDay(); + .withYear(year) + .withMonth(1) + .withDayOfMonth(1) + .atStartOfDay(); dateTo = LocalDate.now() - .withYear(year) - .withMonth(12) - .withDayOfMonth(YearMonth.of(year, 12).lengthOfMonth()) - .atStartOfDay() - .toLocalDate() - .atTime(LocalTime.MAX); + .withYear(year) + .withMonth(12) + .withDayOfMonth(YearMonth.of(year, 12).lengthOfMonth()) + .atStartOfDay() + .toLocalDate() + .atTime(LocalTime.MAX); jCalendarFrom.setDate(dateFrom.toLocalDate()); jCalendarTo.setDate(dateTo.toLocalDate()); }); @@ -1035,31 +1035,31 @@ private JTable getJTableToday() { if (jTableToday == null) { jTableToday = new JTable(); jTableToday.setModel( - new DefaultTableModel(new Object[][] { - { - "" + MessageBundle.getMessage("angal.billbrowser.paidtodaycolon.txt") + "", - currencyCod, - totalToday, - "" + MessageBundle.getMessage("angal.billbrowser.notpaidcolon.txt") + "", - currencyCod, - balanceToday - } - }, - new String[] { "", "", "", "", "", "" }) { - - private static final long serialVersionUID = 1L; - Class[] types = new Class[] { JLabel.class, JLabel.class, Double.class, JLabel.class, JLabel.class, Double.class }; - - @Override - public Class getColumnClass(int columnIndex) { - return types[columnIndex]; - } + new DefaultTableModel(new Object[][] { + { + "" + MessageBundle.getMessage("angal.billbrowser.paidtodaycolon.txt") + "", + currencyCod, + totalToday, + "" + MessageBundle.getMessage("angal.billbrowser.notpaidcolon.txt") + "", + currencyCod, + balanceToday + } + }, + new String[] { "", "", "", "", "", "" }) { + + private static final long serialVersionUID = 1L; + Class< ? >[] types = new Class< ? >[] { JLabel.class, JLabel.class, Double.class, JLabel.class, JLabel.class, Double.class }; + + @Override + public Class< ? > getColumnClass(int columnIndex) { + return types[columnIndex]; + } - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }); + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }); jTableToday.getColumnModel().getColumn(1).setMinWidth(3); jTableToday.getColumnModel().getColumn(4).setMinWidth(3); jTableToday.setRowSelectionAllowed(false); @@ -1072,22 +1072,22 @@ private JTable getJTablePeriod() { if (jTablePeriod == null) { jTablePeriod = new JTable(); jTablePeriod.setModel(new DefaultTableModel( - new Object[][] { - { - "" + MessageBundle.getMessage("angal.billbrowser.paidperiodcolon.txt") + "", - currencyCod, - totalPeriod, - "" + MessageBundle.getMessage("angal.billbrowser.notpaidcolon.txt") + "", - currencyCod, - balancePeriod } - }, - new String[] { "", "", "", "", "", "" }) { + new Object[][] { + { + "" + MessageBundle.getMessage("angal.billbrowser.paidperiodcolon.txt") + "", + currencyCod, + totalPeriod, + "" + MessageBundle.getMessage("angal.billbrowser.notpaidcolon.txt") + "", + currencyCod, + balancePeriod } + }, + new String[] { "", "", "", "", "", "" }) { private static final long serialVersionUID = 1L; - Class[] types = new Class[] { JLabel.class, JLabel.class, Double.class, JLabel.class, JLabel.class, Double.class }; + Class< ? >[] types = new Class< ? >[] { JLabel.class, JLabel.class, Double.class, JLabel.class, JLabel.class, Double.class }; @Override - public Class getColumnClass(int columnIndex) { + public Class< ? > getColumnClass(int columnIndex) { return types[columnIndex]; } @@ -1109,28 +1109,27 @@ private JTable getJTableUser() { if (jTableUser == null) { jTableUser = new JTable(); jTableUser.setModel( - new DefaultTableModel(new Object[][] - { { - "" + user + ' ' + MessageBundle.getMessage("angal.billbrowser.todaycolon.txt") + "", - userToday, - "" + user + ' ' + MessageBundle.getMessage("angal.billbrowser.periodcolon.txt") + "", - userPeriod - } }, - new String[] { "", "", "", "" }) { - - private static final long serialVersionUID = 1L; - Class[] types = new Class[] { JLabel.class, Double.class, JLabel.class, Double.class }; - - @Override - public Class getColumnClass(int columnIndex) { - return types[columnIndex]; - } + new DefaultTableModel(new Object[][] { { + "" + user + ' ' + MessageBundle.getMessage("angal.billbrowser.todaycolon.txt") + "", + userToday, + "" + user + ' ' + MessageBundle.getMessage("angal.billbrowser.periodcolon.txt") + "", + userPeriod + } }, + new String[] { "", "", "", "" }) { + + private static final long serialVersionUID = 1L; + Class< ? >[] types = new Class< ? >[] { JLabel.class, Double.class, JLabel.class, Double.class }; + + @Override + public Class< ? > getColumnClass(int columnIndex) { + return types[columnIndex]; + } - @Override - public boolean isCellEditable(int row, int column) { - return false; - } - }); + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + }); jTableUser.setRowSelectionAllowed(false); jTableUser.setGridColor(Color.WHITE); } @@ -1199,9 +1198,9 @@ private void updateTotals() { userPeriod = new BigDecimal(0); List notDeletedBills = billPeriod.stream() - .filter(bill -> !bill.getStatus().equals("D")) - .map(Bill::getId) - .collect(Collectors.toList()); + .filter(bill -> !bill.getStatus().equals("D")) + .map(Bill::getId) + .collect(Collectors.toList()); // Bills in range contribute for Not Paid (balance) balancePeriod = new BalanceTotal(billPeriod).getValue(); @@ -1248,7 +1247,7 @@ private void loadData(String status, String username) { } @Override - public Class getColumnClass(int columnIndex) { + public Class< ? > getColumnClass(int columnIndex) { return columnsClasses[columnIndex]; } From fb826b2d94e6eb95c30b85391d27d83c49ca04c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 04:44:25 +0000 Subject: [PATCH 55/86] Chore(deps): Bump org.slf4j:slf4j-api from 2.0.13 to 2.0.16 Bumps org.slf4j:slf4j-api from 2.0.13 to 2.0.16. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 73fe7220dd..9e22b21cf9 100644 --- a/pom.xml +++ b/pom.xml @@ -296,7 +296,7 @@ org.slf4j slf4j-api - 2.0.13 + 2.0.16 org.imgscalr From d25528d92f8db3efc412d80691f717ed976defb6 Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Sat, 17 Aug 2024 05:08:27 -0400 Subject: [PATCH 56/86] OP-1322: add message for valid validation of user id (#2035) * OP-1322: add message for valid validation of user id * OP-1322: improve message for invalid user name user id * OP-1322: improve message for invalid user name --- bundle/language_en.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/bundle/language_en.properties b/bundle/language_en.properties index 1640814b1a..21ebc8273c 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -1720,6 +1720,7 @@ angal.userbrowser.step2.pleaserepeatthenewpassword.label angal.userbrowser.theadminusercannotbedeleted.msg = The "admin" user cannot be deleted. angal.userbrowser.thepasswordhasbeenchanged.msg = The password has been changed. angal.userbrowser.theuseralreadyexists.fmt.msg = The user "{0}" already exists. +angal.userbrowser.theusernamecontainsinvalidcharacters.msg = The user name must contain only a-z, 0-9, dash, period and underscore characters. angal.userbrowser.title = User Browser angal.userbrowser.user.col = User angal.vaccine.deletevaccine.fmt.msg = Delete vaccine: {0}? From 41a6000386158d6853e9573b1656ce40c0cdbc03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 04:40:32 +0000 Subject: [PATCH 57/86] Chore(deps): Bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.3.1...surefire-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9e22b21cf9..3775d3defb 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.3.1 + 3.4.0 org.apache.maven.plugins From df61c90a23c4beaed2db9956305a5fcf9fd08c7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Aug 2024 04:28:38 +0000 Subject: [PATCH 58/86] Chore(deps): Bump org.apache.maven.plugins:maven-dependency-plugin Bumps [org.apache.maven.plugins:maven-dependency-plugin](https://github.com/apache/maven-dependency-plugin) from 3.7.1 to 3.8.0. - [Release notes](https://github.com/apache/maven-dependency-plugin/releases) - [Commits](https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.7.1...maven-dependency-plugin-3.8.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-dependency-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3775d3defb..b8c495c520 100644 --- a/pom.xml +++ b/pom.xml @@ -192,7 +192,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.7.1 + 3.8.0 copy-dependencies From 814488469a5c0bf65492dbe19fd48c09774792a7 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Tue, 10 Sep 2024 15:15:30 +0200 Subject: [PATCH 59/86] Update jdbc.url in .ps1 (#2050) --- oh.ps1 | 2 +- rsc/database.properties.dist | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/oh.ps1 b/oh.ps1 index 81d1d0c2bf..4051d3ecf1 100644 --- a/oh.ps1 +++ b/oh.ps1 @@ -1039,7 +1039,7 @@ function write_config_files { (Get-Content "$OH_PATH/$OH_DIR/rsc/$DATABASE_SETTINGS").replace("DBNAME","$DATABASE_NAME") | Set-Content "$OH_PATH/$OH_DIR/rsc/$DATABASE_SETTINGS" # direct creation of $DATABASE_SETTINGS - deprecated - #Set-Content -Path $OH_PATH/$OH_DIR/rsc/$DATABASE_SETTINGS -Value "jdbc.url=jdbc:mysql://"$DATABASE_SERVER":$DATABASE_PORT/$DATABASE_NAME" + #Set-Content -Path $OH_PATH/$OH_DIR/rsc/$DATABASE_SETTINGS -Value "jdbc.url=jdbc:mariadb://"$DATABASE_SERVER":$DATABASE_PORT/$DATABASE_NAME" #Add-Content -Path $OH_PATH/$OH_DIR/rsc/$DATABASE_SETTINGS -Value "jdbc.username=$DATABASE_USER" #Add-Content -Path $OH_PATH/$OH_DIR/rsc/$DATABASE_SETTINGS -Value "jdbc.password=$DATABASE_PASSWORD" } diff --git a/rsc/database.properties.dist b/rsc/database.properties.dist index a42f5a2a6d..da1db1c2fa 100644 --- a/rsc/database.properties.dist +++ b/rsc/database.properties.dist @@ -1,3 +1,3 @@ -jdbc.url=jdbc:mysql://DBSERVER:DBPORT/DBNAME +jdbc.url=jdbc:mariadb://DBSERVER:DBPORT/DBNAME jdbc.username=DBUSER jdbc.password=DBPASS From 10dcc514a42ef86467cc6ecf8a72774b99e3bbb1 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Tue, 10 Sep 2024 15:24:01 +0200 Subject: [PATCH 60/86] Update script to use the new application.properties.dist file (#2049) --- oh.ps1 | 7 +++++-- oh.sh | 5 ++++- ohmac.sh | 6 +++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/oh.ps1 b/oh.ps1 index 4051d3ecf1..ca4812a1a7 100644 --- a/oh.ps1 +++ b/oh.ps1 @@ -984,8 +984,11 @@ function write_api_config_file { # generate OH API token and save to settings file $JWT_TOKEN_SECRET=( -join ($(for($i=0; $i -lt 64; $i++) { ((65..90)+(97..122)+(".")+("!")+("?")+("&") | Get-Random | % {[char]$_}) })) ) Write-Host "Writing OH API configuration file -> $API_SETTINGS..." - (Get-Content "$OH_PATH/$OH_DIR/rsc/$API_SETTINGS.dist").replace("JWT_TOKEN_SECRET","$JWT_TOKEN_SECRET") | Set-Content "$OH_PATH/$OH_DIR/rsc/$API_SETTINGS" - (Get-Content "$OH_PATH/$OH_DIR/rsc/$API_SETTINGS").replace("OH_API_PID","$OH_API_PID") | Set-Content "$OH_PATH/$OH_DIR/rsc/$API_SETTINGS" + (Get-Content "$OH_PATH/$OH_DIR/rsc/$API_SETTINGS.dist") ` + -replace "JWT_TOKEN_SECRET", "$JWT_TOKEN_SECRET" ` + -replace "OH_API_PID", "$OH_API_PID" ` + -replace "API_HOST:API_PORT", "localhost:8080" ` + | Set-Content "$OH_PATH/$OH_DIR/rsc/$API_SETTINGS" } } diff --git a/oh.sh b/oh.sh index 000cf21fb2..16cceb9fa7 100644 --- a/oh.sh +++ b/oh.sh @@ -876,7 +876,10 @@ function write_api_config_file { # JWT_TOKEN_SECRET=`openssl rand -base64 64 | xargs` JWT_TOKEN_SECRET=`LC_ALL=C tr -dc A-Za-z0-9 $API_SETTINGS..." - sed -e "s/JWT_TOKEN_SECRET/"$JWT_TOKEN_SECRET"/g" -e "s&OH_API_PID&"$OH_API_PID"&g" ./$OH_DIR/rsc/$API_SETTINGS.dist > ./$OH_DIR/rsc/$API_SETTINGS + sed -e "s/JWT_TOKEN_SECRET/"$JWT_TOKEN_SECRET"/g" \ + -e "s&OH_API_PID&"$OH_API_PID"&g" \ + -e "s/API_HOST:API_PORT/localhost:8080/g" \ + ./$OH_DIR/rsc/$API_SETTINGS.dist > ./$OH_DIR/rsc/$API_SETTINGS fi } diff --git a/ohmac.sh b/ohmac.sh index 447e822c43..05e2cf529d 100755 --- a/ohmac.sh +++ b/ohmac.sh @@ -268,7 +268,11 @@ function write_api_config_file { JWT_TOKEN_SECRET=`LC_ALL=C tr -dc A-Za-z0-9 $API_SETTINGS..." - sed -i '' -e "s/JWT_TOKEN_SECRET/"$JWT_TOKEN_SECRET"/g" -e "s&OH_API_PID&"$OH_API_PID"&g" $SET_FILE.dist + sed -i '' \ + -e "s/JWT_TOKEN_SECRET/$JWT_TOKEN_SECRET/g" \ + -e "s/API_HOST:API_PORT/localhost:8080/g" \ + -e "s&OH_API_PID&$OH_API_PID&g" \ + $SET_FILE.dist cp -f $SET_FILE.dist $SET_FILE fi } From 4c3f8600c4caa4936fdf880ba8083bf673b92e4e Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Mon, 23 Sep 2024 18:31:01 +0200 Subject: [PATCH 61/86] Fix when SINGLEUSER=yes. (#2052) --- src/main/java/org/isf/menu/gui/MainMenu.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/isf/menu/gui/MainMenu.java b/src/main/java/org/isf/menu/gui/MainMenu.java index a2943a59a3..d6a6fa0ca4 100644 --- a/src/main/java/org/isf/menu/gui/MainMenu.java +++ b/src/main/java/org/isf/menu/gui/MainMenu.java @@ -180,6 +180,15 @@ public MainMenu(User myUserIn) { if (singleUser) { LOGGER.info("Logging: Single User mode."); myUser = new User(ADMIN_STR, new UserGroup(ADMIN_STR, ""), ADMIN_STR, ""); + try { + userBrowsingManager.setLastLogin(myUser); + } catch (OHServiceException e) { + LOGGER.error("Unable to update last login time for {}.", myUser.getUserName()); + } + if (myUser.getFailedAttempts() > 0) { + userBrowsingManager.resetFailedAttempts(myUser); + } + RestartUserSession.setUser(myUser); } else { // get an user LOGGER.info("Logging: Multi User mode."); @@ -211,7 +220,7 @@ public MainMenu(User myUserIn) { try { this.sessionAuditId = sessionAuditManager.newSessionAudit(new SessionAudit(myUser.getUserName(), LocalDateTime.now(), null)); } catch (OHServiceException e1) { - LOGGER.error("Unable to log user login in the session_audit table"); + LOGGER.error("Unable to log user login in the session_audit table."); } // get menu items try { From 1b8e42fb034b853e4894b24f604c38d05a99e6f6 Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Mon, 23 Sep 2024 13:07:52 -0400 Subject: [PATCH 62/86] OP-1333: correct usage for dialog (#2053) * OP-1333: correct usage for dialog * OP-1333: .fmg. -> .fmt. --- bundle/language_am_ET.properties | 2 +- bundle/language_ar.properties | 2 +- bundle/language_de.properties | 2 +- bundle/language_en.properties | 2 +- bundle/language_es.properties | 2 +- bundle/language_it.properties | 2 +- bundle/language_sq.properties | 2 +- bundle/language_zh_CN.properties | 2 +- src/main/java/org/isf/accounting/gui/PatientBillEdit.java | 3 +-- 9 files changed, 9 insertions(+), 10 deletions(-) diff --git a/bundle/language_am_ET.properties b/bundle/language_am_ET.properties index 4a299402d8..ac25dddba8 100644 --- a/bundle/language_am_ET.properties +++ b/bundle/language_am_ET.properties @@ -1192,7 +1192,7 @@ angal.newbill.selectamedical.txt angal.newbill.selectanexam.txt = ምርመራ ይምረጡ፡- angal.newbill.selectanoperation.txt = ኦፕሬሽን ይምረጡ፡- angal.newbill.selectapricelist.title = የዋጋ ዝርዝር ይምረጡ -angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmg.msg = አንዳንድ ዋጋዎች ተለውጠዋል፡ {0}\n\nየእቃዎቹን ዋጋ ማስተካከል ይፈልጋሉ? +angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg = አንዳንድ ዋጋዎች ተለውጠዋል፡ {0}\n\nየእቃዎቹን ዋጋ ማስተካከል ይፈልጋሉ? angal.newbill.somepricesnotfound.fmt.msg = አንዳንድ ዋጋዎች አልተገኙም፦ {0} angal.newbill.somepricesnotfoundandsomeotherchangeddoyouwanttoupdatetheitemsprices.fmt.msg = አንዳንድ ዋጋዎች አልተገኙም እና ሌሎች ተለውጠዋል፡-\nአልተገኘም፦ {0}\nተቀይሯል፡ {1} angal.newbill.thedateisbeforethelastpayment.msg = ቀኑ ከመጨረሻው ክፍያ በፊት ነው። diff --git a/bundle/language_ar.properties b/bundle/language_ar.properties index c857d0cd93..0b0551c212 100644 --- a/bundle/language_ar.properties +++ b/bundle/language_ar.properties @@ -1192,7 +1192,7 @@ angal.newbill.selectamedical.txt angal.newbill.selectanexam.txt = حدد الفحص angal.newbill.selectanoperation.txt = حدد عملية angal.newbill.selectapricelist.title = حدد قائمة الأسعار -angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmg.msg = Some prices have been changed : {0}\n\nDo you want to update the items' prices? +angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Some prices have been changed : {0}\n\nDo you want to update the items' prices? angal.newbill.somepricesnotfound.fmt.msg = لم يتم العثور على بعض الأسعار: {0} angal.newbill.somepricesnotfoundandsomeotherchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Some prices not found and some other changed:\nNot found: {0}\nChanged: {1}\n\nDo you want to update the existing items' prices? angal.newbill.thedateisbeforethelastpayment.msg = التاريخ قبل الدفعة الأخيرة diff --git a/bundle/language_de.properties b/bundle/language_de.properties index 6f59087daa..9480ecf399 100644 --- a/bundle/language_de.properties +++ b/bundle/language_de.properties @@ -1192,7 +1192,7 @@ angal.newbill.selectamedical.txt angal.newbill.selectanexam.txt = Exam wählen: angal.newbill.selectanoperation.txt = Wähle ein Operation: angal.newbill.selectapricelist.title = Wähle eine Preisliste -angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmg.msg = Einige Preise wurden geändert: {0}\n\nMöchten Sie die Preise der Artikel aktualisieren? +angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Einige Preise wurden geändert: {0}\n\nMöchten Sie die Preise der Artikel aktualisieren? angal.newbill.somepricesnotfound.fmt.msg = Einige Preise wurden nicht gefunden: {0} angal.newbill.somepricesnotfoundandsomeotherchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Einige Preise wurden nicht gefunden und andere geändert:\nNicht gefunden: {0}\nGeändert: {1}\n\nMöchten Sie die Preise der vorhandenen Artikel aktualisieren? angal.newbill.thedateisbeforethelastpayment.msg = Das Datum liegt vor der letzten Zahlung. diff --git a/bundle/language_en.properties b/bundle/language_en.properties index 21ebc8273c..afa5ba4888 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -1200,7 +1200,7 @@ angal.newbill.selectamedical.txt angal.newbill.selectanexam.txt = Select an exam: angal.newbill.selectanoperation.txt = Select an operation: angal.newbill.selectapricelist.title = Select a PriceList -angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmg.msg = Some prices have been changed : {0}\n\nDo you want to update the items' prices? +angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Some prices have been changed : {0}\n\nDo you want to update the items' prices? angal.newbill.somepricesnotfound.fmt.msg = Some prices not found: {0} angal.newbill.somepricesnotfoundandsomeotherchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Some prices not found and some other changed:\nNot found: {0}\nChanged: {1}\n\nDo you want to update the existing items' prices? angal.newbill.thedateisbeforethelastpayment.msg = The date is before the last payment. diff --git a/bundle/language_es.properties b/bundle/language_es.properties index 150cafd555..d6c4f1931f 100644 --- a/bundle/language_es.properties +++ b/bundle/language_es.properties @@ -1192,7 +1192,7 @@ angal.newbill.selectamedical.txt angal.newbill.selectanexam.txt = Seleccionar un examen. angal.newbill.selectanoperation.txt = Seleccionar una operación. angal.newbill.selectapricelist.title = Seleccionar una Lista -angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmg.msg = Algunos precios han cambiado : {0}Quiere usted actualizar los nuevos precios? +angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Algunos precios han cambiado : {0}Quiere usted actualizar los nuevos precios? angal.newbill.somepricesnotfound.fmt.msg = No he encontrado algunos precios: {0} angal.newbill.somepricesnotfoundandsomeotherchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Algunos precios no encontrados y otros cambiados : No encontrado: {0} Modificado: {1} Quiere usted actualizar los nuevos precios? angal.newbill.thedateisbeforethelastpayment.msg = La fecha es anterior al último pago. diff --git a/bundle/language_it.properties b/bundle/language_it.properties index 6c4cb25bfe..ad426e5b2d 100644 --- a/bundle/language_it.properties +++ b/bundle/language_it.properties @@ -1192,7 +1192,7 @@ angal.newbill.selectamedical.txt angal.newbill.selectanexam.txt = Seleziona un esame: angal.newbill.selectanoperation.txt = Seleziona un'operazione: angal.newbill.selectapricelist.title = Seleziona un Listino -angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmg.msg = Alcuni prezzi sono cambiati: {0}\n\nVuoi aggiornare i prezzi degli articoli? +angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Alcuni prezzi sono cambiati: {0}\n\nVuoi aggiornare i prezzi degli articoli? angal.newbill.somepricesnotfound.fmt.msg = Alcuni prezzi non trovati: {0} angal.newbill.somepricesnotfoundandsomeotherchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Alcuni prezzi non trovati e altri modificati:\nNon trovato: {0}\nModificato: {1}\n\nVuoi aggiornare i prezzi degli articoli esistenti? angal.newbill.thedateisbeforethelastpayment.msg = La data è precedente all'ultimo pagamento. diff --git a/bundle/language_sq.properties b/bundle/language_sq.properties index c90961b215..e16f311ca5 100644 --- a/bundle/language_sq.properties +++ b/bundle/language_sq.properties @@ -1192,7 +1192,7 @@ angal.newbill.selectamedical.txt angal.newbill.selectanexam.txt = Zgjidhni një ekzaminim: angal.newbill.selectanoperation.txt = Zgjidh një operacion: angal.newbill.selectapricelist.title = Zgjidh një ListëÇmimesh -angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmg.msg = Disa çmime janë ndryshuar: {0}\n\nDëshiron të përditësosh çmimet e artikujve? +angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Disa çmime janë ndryshuar: {0}\n\nDëshiron të përditësosh çmimet e artikujve? angal.newbill.somepricesnotfound.fmt.msg = Disa çmime nuk u gjetën: {0} angal.newbill.somepricesnotfoundandsomeotherchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Disa çmime nuk u gjetën dhe disa të tjera ndryshuan:\nNuk u gjet: {0}\nNdryshuar: {1}\n\nDëshiron të përditësosh çmimet e artikujve ekzistues? angal.newbill.thedateisbeforethelastpayment.msg = Data është para pagesës së fundit. diff --git a/bundle/language_zh_CN.properties b/bundle/language_zh_CN.properties index 19229fb553..448f5e94b7 100644 --- a/bundle/language_zh_CN.properties +++ b/bundle/language_zh_CN.properties @@ -1192,7 +1192,7 @@ angal.newbill.selectamedical.txt angal.newbill.selectanexam.txt = 选择一项检查: angal.newbill.selectanoperation.txt = 选择一项手术: angal.newbill.selectapricelist.title = 选择一份价目表 -angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmg.msg = 有些价格已变动:{0}是否更新这些价格? +angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg = 有些价格已变动:{0}是否更新这些价格? angal.newbill.somepricesnotfound.fmt.msg = 未发现有些价格:{0} angal.newbill.somepricesnotfoundandsomeotherchangeddoyouwanttoupdatetheitemsprices.fmt.msg = 未发现有些价格,有些已变动:未发现:{0} 变动:{1} 是否更新? angal.newbill.thedateisbeforethelastpayment.msg = 日期早于上一次支付日期. diff --git a/src/main/java/org/isf/accounting/gui/PatientBillEdit.java b/src/main/java/org/isf/accounting/gui/PatientBillEdit.java index ba5ee9d05b..4923780d49 100644 --- a/src/main/java/org/isf/accounting/gui/PatientBillEdit.java +++ b/src/main/java/org/isf/accounting/gui/PatientBillEdit.java @@ -557,8 +557,7 @@ private void checkBill() { MessageDialog.warning(this, MessageBundle.formatMessage("angal.newbill.somepricesnotfound.fmt.msg", String.join(", ", notFoundPriceList))); } else if (!changedPriceList.isEmpty()) { - int ok = MessageDialog.yesNo(this, MessageBundle.formatMessage( - "angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmg.msg", String.join(", ", changedPriceList))); + int ok = MessageDialog.yesNo(this, "angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg", String.join(", ", changedPriceList)); if (ok == JOptionPane.OK_OPTION) { updatePrices(); } From 4284e6d023de38682d5e7c4e8f7c74753d17aac5 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 21:50:29 +0200 Subject: [PATCH 63/86] Update translations for project OpenHospital (#2017) * Translate bundle/language_en.properties in es 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'es'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in zh_CN 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'zh_CN'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in ar 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'ar'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in am_ET 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'am_ET'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate rpt_base/operationslist.properties in fr 100% translated source file: 'rpt_base/operationslist.properties' on 'fr'. * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 95% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 96% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate MOH717_Monthly_Workload_Report_for_Hospitals_page2b.properties in fr 100% translated source file: 'MOH717_Monthly_Workload_Report_for_Hospitals_page2b.properties' on 'fr'. * Translate hmis033_weekly_epid_surv_over_5.properties in fr 100% translated source file: 'hmis033_weekly_epid_surv_over_5.properties' on 'fr'. * Translate hmis033_weekly_epid_surv_under_5.properties in fr 100% translated source file: 'hmis033_weekly_epid_surv_under_5.properties' on 'fr'. * Translate hmis055b_lab_monthly_formatted.properties in fr 100% translated source file: 'hmis055b_lab_monthly_formatted.properties' on 'fr'. * Translate patient_opd_chart.properties in fr 100% translated source file: 'patient_opd_chart.properties' on 'fr'. * Translate OH007_lab_result_report.properties in fr 100% translated source file: 'OH007_lab_result_report.properties' on 'fr'. * Translate hmis105_opd_referrals.properties in fr 100% translated source file: 'hmis105_opd_referrals.properties' on 'fr'. * Translate hmis105_opd_attendance.properties in fr 100% translated source file: 'hmis105_opd_attendance.properties' on 'fr'. * Translate rpt_extra/hmis108_cover.properties in fr 100% translated source file: 'rpt_extra/hmis108_cover.properties' on 'fr'. * Translate BillsReportMonthlyWard.properties in fr 100% translated source file: 'BillsReportMonthlyWard.properties' on 'fr'. * Translate OH005_opd_count_monthly_report.properties in fr 100% translated source file: 'OH005_opd_count_monthly_report.properties' on 'fr'. * Translate OH007_lab_monthly_report.properties in fr 100% translated source file: 'OH007_lab_monthly_report.properties' on 'fr'. * Translate MOH705A_Under_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet.properties in fr 100% translated source file: 'MOH705A_Under_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet.properties' on 'fr'. * Translate MOH705B_Over_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet.properties in fr 100% translated source file: 'MOH705B_Over_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet.properties' on 'fr'. * Translate OH008_lab_summary_for_opd.properties in fr 100% translated source file: 'OH008_lab_summary_for_opd.properties' on 'fr'. * Translate hmis108_operations.properties in fr 100% translated source file: 'hmis108_operations.properties' on 'fr'. * Translate hmis108_operations.properties in fr 100% translated source file: 'hmis108_operations.properties' on 'fr'. * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in ar 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'ar'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in es 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'es'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in zh_CN 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'zh_CN'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in am_ET 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'am_ET'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in zh_CN 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'zh_CN'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in ar 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'ar'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in es 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'es'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in am_ET 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'am_ET'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in ar 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'ar'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in zh_CN 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'zh_CN'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in am_ET 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'am_ET'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in es 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'es'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'it'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 100% translated source file: 'bundle/language_en.properties' on 'it'. * Translate bundle/language_en.properties in ar 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'ar'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in es 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'es'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in zh_CN 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'zh_CN'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in am_ET 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'am_ET'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in it 100% translated source file: 'bundle/language_en.properties' on 'it'. * Translate bundle/language_en.properties in fr 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'fr'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in sq 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'sq'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in zh_CN 98% of minimum 95% translated source file: 'bundle/language_en.properties' on 'zh_CN'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in de 99% of minimum 95% translated source file: 'bundle/language_en.properties' on 'de'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in es 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'es'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate bundle/language_en.properties in am_ET 97% of minimum 95% translated source file: 'bundle/language_en.properties' on 'am_ET'. Sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format * Translate hmis033_weekly_epid_surv_over_5.properties in fr 100% translated source file: 'hmis033_weekly_epid_surv_over_5.properties' on 'fr'. * Translate hmis033_weekly_epid_surv_over_5.properties in fr 100% translated source file: 'hmis033_weekly_epid_surv_over_5.properties' on 'fr'. --------- Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- bundle/language_am_ET.properties | 11 +- bundle/language_ar.properties | 11 +- bundle/language_de.properties | 11 +- bundle/language_es.properties | 11 +- bundle/language_fr.properties | 347 +++++++++++++++--- bundle/language_it.properties | 61 +-- bundle/language_sq.properties | 11 +- bundle/language_zh_CN.properties | 11 +- rpt_base/operationslist_fr.properties | 8 + rpt_base/patient_opd_chart_fr.properties | 16 + ...ient_Morbidity_Summary_Sheet_fr.properties | 2 + ...ient_Morbidity_Summary_Sheet_fr.properties | 2 + ..._Report_for_Hospitals_page2b_fr.properties | 2 +- ...s033_weekly_epid_surv_over_5_fr.properties | 2 + ...033_weekly_epid_surv_under_5_fr.properties | 4 +- ...is055b_lab_monthly_formatted_fr.properties | 2 + .../hmis105_opd_attendance_fr.properties | 2 + rpt_extra/hmis105_opd_referrals_fr.properties | 2 + rpt_extra/hmis108_cover_fr.properties | 2 + rpt_extra/hmis108_operations_fr.properties | 3 + rpt_stat/BillsReportMonthlyWard_fr.properties | 23 ++ ...005_opd_count_monthly_report_fr.properties | 4 +- .../OH007_lab_monthly_report_fr.properties | 4 +- .../OH007_lab_result_report_fr.properties | 4 +- .../OH008_lab_summary_for_opd_fr.properties | 4 +- 25 files changed, 470 insertions(+), 90 deletions(-) create mode 100644 rpt_base/operationslist_fr.properties create mode 100644 rpt_stat/BillsReportMonthlyWard_fr.properties diff --git a/bundle/language_am_ET.properties b/bundle/language_am_ET.properties index ac25dddba8..d597245ec8 100644 --- a/bundle/language_am_ET.properties +++ b/bundle/language_am_ET.properties @@ -8,6 +8,7 @@ angal.admission.admissionanddischarge.title angal.admission.admissiondate.border = የቅበላቀን * angal.admission.admissiondate.txt = የቅበላ ቀን * angal.admission.admissiondatecannotbeempty.msg = የቅበላ ቀን ባዶ ሊሆን አይችልም። +angal.admission.admissionpatientcannotbeempty.msg = Admission patient cannot be empty. angal.admission.admissionstatus.border = የቅበላሁኔታ angal.admission.admissiontype.border = የቅበላ አይነት * angal.admission.admissionwardcannotbeempty.msg = የቅበላ ዋርድ ባዶ ሊሆን አይችልም። @@ -790,6 +791,7 @@ angal.medicals.type angal.medicals.withlot = ከብዙ ጋር angal.medicalstock.allcharges.txt = All charges angal.medicalstock.alldischarges.txt = All discharges +angal.medicalstock.category.col = ምድብ angal.medicalstock.charge.btn = ክፍያ angal.medicalstock.charge.btn.key = ኤች angal.medicalstock.chooseamedical.msg = ሕክምና ይምረጡ። @@ -821,7 +823,7 @@ angal.medicalstock.lotpreparationdate angal.medicalstock.medtype.col = የሕክምና ዓይነት angal.medicalstock.movement = እንቅስቃሴ angal.medicalstock.movementdatefromcannotbelaterthanmovementdateto = ከ እንቅስቃሴ ቀን ከ እስከ እንቅስቃሴ ቀን በኋላ ሊሆን አይችልም -angal.medicalstock.movementquantityisgreaterthanthequantityof.msg = የእንቅስቃሴ መጠን ከተመረጠው ዕጣ መጠን ይበልጣል; እንቅስቃሴውን ከፋፍል. +angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg = Movement quantity ({0}) is greater than the quantity of the lot selected ({1}); split the movement or adjust Units/Packets. angal.medicalstock.multiplecharging.adateinthefutureisnotallowed.msg = የወደፊቱ ቀን አይፈቀድም. angal.medicalstock.multiplecharging.chargetype = የክፍያ ዓይነት angal.medicalstock.multiplecharging.chooseamedical = ሕክምና ይምረጡ @@ -862,7 +864,9 @@ angal.medicalstock.multipledischarging.isabouttoend angal.medicalstock.multipledischarging.lotinformations = የ ሎት መረጃ angal.medicalstock.multipledischarging.lotnumberabb = የሎት ቁጥር angal.medicalstock.multipledischarging.lyinginstock = በክምችት ውስጥ ያሉ፡ +angal.medicalstock.multipledischarging.movementexceedstheavailablequantityformedical.fmt.msg = Movement exceeds the available quantity ({0}) for medical {1}. angal.medicalstock.multipledischarging.noelementtosave = ምንም የሚቀመጡ ነገሮች የሉም +angal.medicalstock.multipledischarging.nolotswithavailablequantityfoundformedicalpleasereport.fmt.msg = No lots with available quantity found for medical {0}; please report to system administrator. angal.medicalstock.multipledischarging.outofstock = ከመጋዘን ተጠናቀቀ! angal.medicalstock.multipledischarging.packets = እሽጎች angal.medicalstock.multipledischarging.pleaseinsertavalidvalue = ትክክለኛ ዋጋ/ዳታ አስገባ @@ -980,6 +984,10 @@ angal.medicalstockwardedit.selectpatient.btn.key angal.medicalstockwardedit.title = አዲስ / አርትዕ angal.medicalstockwardedit.tooltip.associateapatientwiththismovement = ከዚህ እንቅስቃሴ ጋር ታካሚ ያገናኙ angal.medicalstockwardedit.tooltip.removepatientassociationwiththismovement = ከዚህ እንቅስቃሴ ጋር የተየያዘ ታካሚው ያስወግዱ +angal.medstockmovtype.allowedcategoriesare.fmt.msg = Allowed categories are: {0} +angal.medstockmovtype.category.txt = ምድብ +angal.medstockmovtype.category.operational.txt = Operational +angal.medstockmovtype.category.nonoperational.txt = Non-Operational angal.medstockmovtype.deletemovementtype.fmt.msg = የእንቅስቃሴ አይነት ይሰረዝ፡ {0}? angal.medstockmovtype.editmedicalstockmovementtype.title = የሕክምና ቁሳቁስ እንቅስቃሴ ዓይነትን ያርትዑ angal.medstockmovtype.medicalstockmovementtypebrowser.title = የሕክምና ቁሳቁስ እንቅስቃሴ አይነት አሳሽ @@ -1712,6 +1720,7 @@ angal.userbrowser.step2.pleaserepeatthenewpassword.label angal.userbrowser.theadminusercannotbedeleted.msg = የ"አስተዳዳሪ/admin" ተጠቃሚ ሊሰረዝ አይችልም። angal.userbrowser.thepasswordhasbeenchanged.msg = የይለፍ ቃሉ ተለውጧል። angal.userbrowser.theuseralreadyexists.fmt.msg = ተጠቃሚው "{0}" አስቀድሞ አለ። +angal.userbrowser.theusernamecontainsinvalidcharacters.msg = The user name must contain only a-z, 0-9, dash, period and underscore characters. angal.userbrowser.title = የተጠቃሚ አሳሽ angal.userbrowser.user.col = ተጠቃሚ angal.vaccine.deletevaccine.fmt.msg = ክትባት ይሰረዝ፡ {0}? diff --git a/bundle/language_ar.properties b/bundle/language_ar.properties index 0b0551c212..7c2a1b6a35 100644 --- a/bundle/language_ar.properties +++ b/bundle/language_ar.properties @@ -8,6 +8,7 @@ angal.admission.admissionanddischarge.title angal.admission.admissiondate.border = تاريخ القبول angal.admission.admissiondate.txt = تاريخ القبول angal.admission.admissiondatecannotbeempty.msg = لا يمكن أن يكون تاريخ القبول فارغًا +angal.admission.admissionpatientcannotbeempty.msg = Admission patient cannot be empty. angal.admission.admissionstatus.border = حالة الإقامة angal.admission.admissiontype.border = نوع الإقامة angal.admission.admissionwardcannotbeempty.msg = لا يمكن أن يكون جناح الإقامة فارغًا @@ -790,6 +791,7 @@ angal.medicals.type angal.medicals.withlot = مع دفعات angal.medicalstock.allcharges.txt = All charges angal.medicalstock.alldischarges.txt = All discharges +angal.medicalstock.category.col = Category angal.medicalstock.charge.btn = فرض angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = اختر منتج طبي @@ -821,7 +823,7 @@ angal.medicalstock.lotpreparationdate angal.medicalstock.medtype.col = نوع الدواء angal.medicalstock.movement = حركة angal.medicalstock.movementdatefromcannotbelaterthanmovementdateto = لا يمكن أن يكون تاريخ النقل من بعد تاريخ الحركة إلى -angal.medicalstock.movementquantityisgreaterthanthequantityof.msg = كمية الحركة أكبر من كمية الدفعة المحدد، قم بتقسيم الحركة +angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg = Movement quantity ({0}) is greater than the quantity of the lot selected ({1}); split the movement or adjust Units/Packets. angal.medicalstock.multiplecharging.adateinthefutureisnotallowed.msg = تاريخ في المستقبل غير مسموح به angal.medicalstock.multiplecharging.chargetype = نوع الفرض angal.medicalstock.multiplecharging.chooseamedical = اختر منتج طبي @@ -862,7 +864,9 @@ angal.medicalstock.multipledischarging.isabouttoend angal.medicalstock.multipledischarging.lotinformations = معلومات الدفعة angal.medicalstock.multipledischarging.lotnumberabb = رقم الدفعة angal.medicalstock.multipledischarging.lyinginstock = موجود في المستودع +angal.medicalstock.multipledischarging.movementexceedstheavailablequantityformedical.fmt.msg = Movement exceeds the available quantity ({0}) for medical {1}. angal.medicalstock.multipledischarging.noelementtosave = لا توجد عناصر لحفظها +angal.medicalstock.multipledischarging.nolotswithavailablequantityfoundformedicalpleasereport.fmt.msg = No lots with available quantity found for medical {0}; please report to system administrator. angal.medicalstock.multipledischarging.outofstock = غير متوفر angal.medicalstock.multipledischarging.packets = حزم angal.medicalstock.multipledischarging.pleaseinsertavalidvalue = أدخل قيمة صالحة @@ -980,6 +984,10 @@ angal.medicalstockwardedit.selectpatient.btn.key angal.medicalstockwardedit.title = جديد / تعديل angal.medicalstockwardedit.tooltip.associateapatientwiththismovement = ربط المريض بهذه الحركة angal.medicalstockwardedit.tooltip.removepatientassociationwiththismovement = حذف ارتباط المريض بهذه الحركة +angal.medstockmovtype.allowedcategoriesare.fmt.msg = Allowed categories are: {0} +angal.medstockmovtype.category.txt = Category +angal.medstockmovtype.category.operational.txt = Operational +angal.medstockmovtype.category.nonoperational.txt = Non-Operational angal.medstockmovtype.deletemovementtype.fmt.msg = حذف نوع الحركة: {0}؟ angal.medstockmovtype.editmedicalstockmovementtype.title = تعديل نوع حركة المخزون الطبي angal.medstockmovtype.medicalstockmovementtypebrowser.title = تصفح نوع حركة المخزون الطبي @@ -1712,6 +1720,7 @@ angal.userbrowser.step2.pleaserepeatthenewpassword.label angal.userbrowser.theadminusercannotbedeleted.msg = لا يمكن حذف المستخدم المسؤول angal.userbrowser.thepasswordhasbeenchanged.msg = تم تغيير كلمة المرور angal.userbrowser.theuseralreadyexists.fmt.msg = المستخدم "{0}" موجود بالفعل +angal.userbrowser.theusernamecontainsinvalidcharacters.msg = The user name must contain only a-z, 0-9, dash, period and underscore characters. angal.userbrowser.title = متصفح المستخدم angal.userbrowser.user.col = مستخدم angal.vaccine.deletevaccine.fmt.msg = حذف اللقاح: {0}؟ diff --git a/bundle/language_de.properties b/bundle/language_de.properties index 9480ecf399..9d0edac1d9 100644 --- a/bundle/language_de.properties +++ b/bundle/language_de.properties @@ -8,6 +8,7 @@ angal.admission.admissionanddischarge.title angal.admission.admissiondate.border = Aufnahmedatum * angal.admission.admissiondate.txt = Aufnahmedatum * angal.admission.admissiondatecannotbeempty.msg = Aufnahmedatum darf nicht leer sein. +angal.admission.admissionpatientcannotbeempty.msg = Admission patient cannot be empty. angal.admission.admissionstatus.border = Aufnahmestatus angal.admission.admissiontype.border = Aufnahmetyp * angal.admission.admissionwardcannotbeempty.msg = Die Aufnahmestation darf nicht leer sein. @@ -790,6 +791,7 @@ angal.medicals.type angal.medicals.withlot = Mit Lots angal.medicalstock.allcharges.txt = Alle Einweisungen angal.medicalstock.alldischarges.txt = Alle Entlassungen +angal.medicalstock.category.col = Kategorie angal.medicalstock.charge.btn = Berechnen angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = Wählen sie einen Medikament. @@ -821,7 +823,7 @@ angal.medicalstock.lotpreparationdate angal.medicalstock.medtype.col = Med Typ angal.medicalstock.movement = Bewegung angal.medicalstock.movementdatefromcannotbelaterthanmovementdateto = Das Bewegungsdatum von darf nicht später als das Bewegungsdatum bis sein -angal.medicalstock.movementquantityisgreaterthanthequantityof.msg = Die Bewegungsmenge ist größer als die Menge des ausgewählten Lots; die Bewegung trennen. +angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg = Movement quantity ({0}) is greater than the quantity of the lot selected ({1}); split the movement or adjust Units/Packets. angal.medicalstock.multiplecharging.adateinthefutureisnotallowed.msg = Ein Datum in der Zukunft ist nicht zulässig. angal.medicalstock.multiplecharging.chargetype = Kostenart angal.medicalstock.multiplecharging.chooseamedical = Wählen Sie einen Medikament @@ -862,7 +864,9 @@ angal.medicalstock.multipledischarging.isabouttoend angal.medicalstock.multipledischarging.lotinformations = Lotinformationen angal.medicalstock.multipledischarging.lotnumberabb = Lot Nr. angal.medicalstock.multipledischarging.lyinginstock = Vorrätig: +angal.medicalstock.multipledischarging.movementexceedstheavailablequantityformedical.fmt.msg = Movement exceeds the available quantity ({0}) for medical {1}. angal.medicalstock.multipledischarging.noelementtosave = Keine Elemente zum Speichern vorhanden +angal.medicalstock.multipledischarging.nolotswithavailablequantityfoundformedicalpleasereport.fmt.msg = No lots with available quantity found for medical {0}; please report to system administrator. angal.medicalstock.multipledischarging.outofstock = Nicht vorrättig! angal.medicalstock.multipledischarging.packets = Pakete angal.medicalstock.multipledischarging.pleaseinsertavalidvalue = Geben Sie einen gültigen Wert ein. @@ -980,6 +984,10 @@ angal.medicalstockwardedit.selectpatient.btn.key angal.medicalstockwardedit.title = Neu / Bearbeiten angal.medicalstockwardedit.tooltip.associateapatientwiththismovement = Verknüpfen Sie einen Patienten mit dieser Bewegung angal.medicalstockwardedit.tooltip.removepatientassociationwiththismovement = Patientenzuordnung zu dieser Bewegung entfernen +angal.medstockmovtype.allowedcategoriesare.fmt.msg = Allowed categories are: {0} +angal.medstockmovtype.category.txt = Kategorie +angal.medstockmovtype.category.operational.txt = Operational +angal.medstockmovtype.category.nonoperational.txt = Non-Operational angal.medstockmovtype.deletemovementtype.fmt.msg = Bewegungsart löschen: {0}? angal.medstockmovtype.editmedicalstockmovementtype.title = Bearbeiten von Bewegungsart des medizinischen Bestands angal.medstockmovtype.medicalstockmovementtypebrowser.title = Browser für Bewegungsarten medizinischer Bestände @@ -1712,6 +1720,7 @@ angal.userbrowser.step2.pleaserepeatthenewpassword.label angal.userbrowser.theadminusercannotbedeleted.msg = Der „admin“-Benutzer kann nicht gelöscht werden. angal.userbrowser.thepasswordhasbeenchanged.msg = Das Passwort wurde geändert. angal.userbrowser.theuseralreadyexists.fmt.msg = Benutzer "{0}" existiert bereits. +angal.userbrowser.theusernamecontainsinvalidcharacters.msg = The user name must contain only a-z, 0-9, dash, period and underscore characters. angal.userbrowser.title = Nutzerbrowser angal.userbrowser.user.col = Benutzer angal.vaccine.deletevaccine.fmt.msg = Impfstoff löschen: {0}? diff --git a/bundle/language_es.properties b/bundle/language_es.properties index d6c4f1931f..6f7f9a84f7 100644 --- a/bundle/language_es.properties +++ b/bundle/language_es.properties @@ -8,6 +8,7 @@ angal.admission.admissionanddischarge.title angal.admission.admissiondate.border = Fecha Hospitalización * angal.admission.admissiondate.txt = Fecha Hospitalización * angal.admission.admissiondatecannotbeempty.msg = La fecha de admisión no puede estar vacía. +angal.admission.admissionpatientcannotbeempty.msg = Admission patient cannot be empty. angal.admission.admissionstatus.border = Estado Hospitalización angal.admission.admissiontype.border = Tipologías Hospitalización * angal.admission.admissionwardcannotbeempty.msg = El pabellón de admisiones no puede estar vacío. @@ -790,6 +791,7 @@ angal.medicals.type angal.medicals.withlot = Con lotes angal.medicalstock.allcharges.txt = All charges angal.medicalstock.alldischarges.txt = All discharges +angal.medicalstock.category.col = Categoría angal.medicalstock.charge.btn = Carga angal.medicalstock.charge.btn.key = G angal.medicalstock.chooseamedical.msg = Escoger un fármaco @@ -821,7 +823,7 @@ angal.medicalstock.lotpreparationdate angal.medicalstock.medtype.col = Med Tipo angal.medicalstock.movement = Movimiento angal.medicalstock.movementdatefromcannotbelaterthanmovementdateto = La Fecha Movimiento DE no puede ser después de la Fecha Movimiento A -angal.medicalstock.movementquantityisgreaterthanthequantityof.msg = La cantidad en movimiento es mas grande que cantidad del lote seleccionado: dividir el movimiento +angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg = Movement quantity ({0}) is greater than the quantity of the lot selected ({1}); split the movement or adjust Units/Packets. angal.medicalstock.multiplecharging.adateinthefutureisnotallowed.msg = No se permite una fecha en el futuro. angal.medicalstock.multiplecharging.chargetype = Tipo de Carga angal.medicalstock.multiplecharging.chooseamedical = Elija un Medicinal @@ -862,7 +864,9 @@ angal.medicalstock.multipledischarging.isabouttoend angal.medicalstock.multipledischarging.lotinformations = Informaciones del lote angal.medicalstock.multipledischarging.lotnumberabb = Lote Núm. angal.medicalstock.multipledischarging.lyinginstock = Hay depòsito en el almacén: +angal.medicalstock.multipledischarging.movementexceedstheavailablequantityformedical.fmt.msg = Movement exceeds the available quantity ({0}) for medical {1}. angal.medicalstock.multipledischarging.noelementtosave = No hay datos para salvar +angal.medicalstock.multipledischarging.nolotswithavailablequantityfoundformedicalpleasereport.fmt.msg = No lots with available quantity found for medical {0}; please report to system administrator. angal.medicalstock.multipledischarging.outofstock = agotado! angal.medicalstock.multipledischarging.packets = Paquetes angal.medicalstock.multipledischarging.pleaseinsertavalidvalue = Digitar un valor válido @@ -980,6 +984,10 @@ angal.medicalstockwardedit.selectpatient.btn.key angal.medicalstockwardedit.title = Nuevo / Modificar angal.medicalstockwardedit.tooltip.associateapatientwiththismovement = Asociar un paciente a este movimiento angal.medicalstockwardedit.tooltip.removepatientassociationwiththismovement = Remover el paciente asociado a este movimiento +angal.medstockmovtype.allowedcategoriesare.fmt.msg = Allowed categories are: {0} +angal.medstockmovtype.category.txt = Categoría +angal.medstockmovtype.category.operational.txt = Operational +angal.medstockmovtype.category.nonoperational.txt = Non-Operational angal.medstockmovtype.deletemovementtype.fmt.msg = ¿Eliminar tipo de movimiento: {0}? angal.medstockmovtype.editmedicalstockmovementtype.title = Modificar Expresión Tipología Movimiento Almacén Fármacos angal.medstockmovtype.medicalstockmovementtypebrowser.title = Lista Tipologías Movimientos Fármacos en Almacén @@ -1712,6 +1720,7 @@ angal.userbrowser.step2.pleaserepeatthenewpassword.label angal.userbrowser.theadminusercannotbedeleted.msg = El usuario "admin" no se puede eliminar. angal.userbrowser.thepasswordhasbeenchanged.msg = La contraseña ha sido cambiada. angal.userbrowser.theuseralreadyexists.fmt.msg = El usuario "{0}" ya existe. +angal.userbrowser.theusernamecontainsinvalidcharacters.msg = The user name must contain only a-z, 0-9, dash, period and underscore characters. angal.userbrowser.title = Lista Usuarios angal.userbrowser.user.col = Usuario angal.vaccine.deletevaccine.fmt.msg = ¿Eliminar vacuna: {0}? diff --git a/bundle/language_fr.properties b/bundle/language_fr.properties index 21363b5a10..b096d8daeb 100644 --- a/bundle/language_fr.properties +++ b/bundle/language_fr.properties @@ -8,11 +8,13 @@ angal.admission.admissionanddischarge.title angal.admission.admissiondate.border = Date d'hospitalisation * angal.admission.admissiondate.txt = Date d'hospitalisation * angal.admission.admissiondatecannotbeempty.msg = La date d'admission ne peut pas être vide. +angal.admission.admissionpatientcannotbeempty.msg = Admission patient cannot be empty. angal.admission.admissionstatus.border = État Hospitalisation angal.admission.admissiontype.border = Typologie d'hospitalisation * angal.admission.admissionwardcannotbeempty.msg = Le départment ne peut pas être vide. angal.admission.admitted.txt = Hospitalisé angal.admission.age.border = Âge +angal.admission.anamnesis = Anamnèse angal.admission.beddays.border = Jours de Lit angal.admission.bill.btn = Facture angal.admission.bill.btn.key = F @@ -39,7 +41,9 @@ angal.admission.deliverydate.border angal.admission.deliveryresultype.border = Typologie Résultat Accouchement angal.admission.deliverytype.border = Typologie Accouchement angal.admission.diagnosisin.col = Diagnostic Entrée +angal.admission.diagnosisincannotbeempty.msg = Le diagnostic -IN- ne peut pas être vide. angal.admission.diagnosisinstar.border = Diagnostic -Entrée- * +angal.admission.diagnosisinisnotallowed.msg = Le diagnostic -IN- n'est pas autorisé. angal.admission.diagnosisout.border = Diagnostic -Sortie- angal.admission.diagnosisout.col = Diagnostic Sortie angal.admission.dischargedate.border = Date Démission @@ -73,7 +77,7 @@ angal.admission.malnutritioncontrol.btn.key angal.admission.maritalstatus.label = État Civil angal.admission.merge = Fusionner angal.admission.merge.btn = Fusionner -angal.admission.merge.btn.key = I +angal.admission.merge.btn.key = C angal.admission.motherisalive = Mère vivante angal.admission.motherisdead = Mère décédée angal.admission.newadmission.title = Nouvelle Hospitalisation @@ -106,12 +110,13 @@ angal.admission.patientfolder.admchart.btn.key angal.admission.patientfolder.admission.txt = Hospitalisation angal.admission.patientfolder.btn = Dossier Clinique angal.admission.patientfolder.btn.key = Q -angal.admission.patientfolder.dicom.btn = DICOM -angal.admission.patientfolder.dicom.btn.key = D +angal.admission.patientfolder.dicom.btn = Images +angal.admission.patientfolder.dicom.btn.key = É angal.admission.patientfolder.dischart.btn = Graphique de Décharge angal.admission.patientfolder.dischart.btn.key = E angal.admission.patientfolder.drugs.title = Médicaments angal.admission.patientfolder.drugs.txt = Médicaments +angal.admission.patientfolder.examination.txt = EXAMEN angal.admission.patientfolder.exams.title = Examens angal.admission.patientfolder.laboratory.txt = Laboratoires angal.admission.patientfolder.nodatatoshow.msg = Aucune donnée a afficher. @@ -134,7 +139,6 @@ angal.admission.pleaseinsertavalidadmissiondate.msg angal.admission.pleaseinsertavalidcontroln1date.msg = Veuillez insérer une date de contrôle n.1 valide. angal.admission.pleaseinsertavalidcontroln2date.msg = Veuillez insérer une date de contrôle n.2 valide. angal.admission.pleaseinsertavaliddeliverydate.msg = Veuillez insérer une date d'accouchement valide. -angal.admission.pleaseinsertavalidvisitdate.msg = Veuillez insérer une date de visite valide. angal.admission.pleaseinsertavalidweightvalue.msg = Veuillez insérer un valeur de poids valide. angal.admission.pleaseselectatleastfirstdiagnosisout.msg = Veuillez sélectionner au moins le premier diagnostique de -SORTIE-. angal.admission.pleaseselectavalidadmissiontype.msg = Veuillez sélectionner une typologie d'hospitalisation valide. @@ -151,6 +155,7 @@ angal.admission.searchkey.border angal.admission.selectedpatientshavedifferentsex.msg = Les patients sélectionnés ont un diffèrent sexe. angal.admission.sex.border = Sexe angal.admission.sharealertwithnobody.txt = -- Partager l'alerte avec: personne -- +angal.admission.specifieddiseaseoutisnoenabledforipd.fmt.msg = La maladie spécifiée ({0}) n'est pas activée pour le service d'hospitalisation. angal.admission.taxcode.label = NID angal.admission.telephone.label = Téléphone angal.admission.theoperationdatenewerthan.fmt.msg = Date intervention non valide la date de l'intervention doit être avant {0}. @@ -160,7 +165,7 @@ angal.admission.therapy.btn angal.admission.therapy.btn.key = T angal.admission.thereismorethanonependingbillforthispatientcontinue.msg = Il y a plus que une facture en attente pour ce patient, continuer? angal.admission.theselectedadmissionhasnoconcernwithmalnutrition.msg = L'hospitalisation sélectionnée n'a pas de relation avec la malnutrition. -angal.admission.thispatienthasapendingbill.msg = Ce patient a une facture en attente. +angal.admission.theselectedadmissionisnotfound.msg = L'admission sélectionnée est introuvable. angal.admission.treatmenttype.border = Typologies traitement angal.admission.unknown = inconnu angal.admission.visitdate.border = Date de Visites @@ -171,6 +176,7 @@ angal.admission.withthisoperationthepatientwillbedeletedandhisherhistorytransfer angal.admission.youareeditinganoldadmission.msg = Vous modifiez une ancienne hospitalisation. angal.admisssion.discharedpatientfor.fmt.msg = Patient Démissionné: {0} pour {1}. angal.admtype.admissiontypebrowser.title = Liste Typologie Hospitalisation +angal.admtype.admissiontypenotfound.fmt.msg = Le type d'admission « {0} » n'a pas été trouvé. angal.admtype.delete.fmt.msg = Supprimer typologie hospitalisation: "{0}"? angal.admtype.editadmissiontype.title = Modification Typologie Hospitalisation angal.admtype.newadmissiontype.title = Nouvelle Typologie Hospitalisation @@ -186,6 +192,111 @@ angal.agetype.newborn angal.agetype.newborn.txt = Nouveau né angal.agetype.overlappedrangespleasecheckthevalues.msg = Chevauchement des périodes, contrôlez les valeurs. angal.agetype.somerangesarenotdefinedpleasecheckthevalues.msg = Certaines gammes pas définies, veuillez contrôler les valeurs. +angal.anamnesis.alcool.no.txt = Non +angal.anamnesis.alcool.txt = Alcool +angal.anamnesis.alcool.yes.txt = Oui +angal.anamnesis.alvo.normal.txt = Normal +angal.anamnesis.alvo.other.txt = Autre +angal.anamnesis.alvo.txt = Alvo +angal.anamnesis.cancel.txt = Annuler +angal.anamnesis.closed.cardiovascolaris.txt = Cardiovasculaire +angal.anamnesis.closed.diseases.txt = Maladies +angal.anamnesis.closed.drugsaddiction.txt = Toxicomanie +angal.anamnesis.closed.endocrinometabol.txt = Endocrinien / Métabolique +angal.anamnesis.closed.excludenothingtodeclare.tooltip = Exclure « Rien à déclarer ». +angal.anamnesis.closed.gyno.txt = Gynécologie / Obstétrique +angal.anamnesis.closed.hypertension.txt = Hypertension artérielle +angal.anamnesis.closed.infective.txt = Infectieux +angal.anamnesis.closed.neoplastic.txt = Néoplasique +angal.anamnesis.closed.nothingtodeclare.txt = Rien à déclarer +angal.anamnesis.closed.orto.txt = Ortho-rhumatologie +angal.anamnesis.closed.other.txt = Autre +angal.anamnesis.closed.pastproblems.border = Problèmes antérieurs (Clos) +angal.anamnesis.closed.remarks.border = Remarques (Clos) +angal.anamnesis.closed.resetpastproblems.tooltip = Réinitialiser les problèmes antérieurs +angal.anamnesis.closed.respiratory.txt = Respiratoire +angal.anamnesis.closed.tooltip.excludenothingtodeclare.txt = Exclure « Rien à déclarer ». +angal.anamnesis.closed.tooltip.resetpastproblems.txt = Réinitialiser les problèmes antérieurs +angal.anamnesis.diet.normal.txt = Normal +angal.anamnesis.diet.other.txt = Autre +angal.anamnesis.diet.txt = Régime alimentaire +angal.anamnesis.diuresis.normal.txt = Normal +angal.anamnesis.diuresis.other.txt = Autre +angal.anamnesis.diuresis.txt = Diurèse +angal.anamnesis.drugs.no.txt = Non +angal.anamnesis.drugs.txt = Médicaments +angal.anamnesis.drugs.yes.txt = Oui +angal.anamnesis.examination.txt = Examen +angal.anamnesis.extra.allergy.border = Allergies +angal.anamnesis.extra.medicine.border = Médicaments habituels +angal.anamnesis.extra.remarks.border = Remarques (supplémentaires) +angal.anamnesis.extra.surgery.border = Chirurgies +angal.anamnesis.extra.therapy.border = Thérapies +angal.anamnesis.family.cardiovascolaris.txt = Cardiovasculaire +angal.anamnesis.family.diseases.txt = Maladies +angal.anamnesis.family.drugsaddiction.txt = Toxicomanie +angal.anamnesis.family.endocrinometabol.txt = Endocrinien / Métabolique +angal.anamnesis.family.excludenothingtodeclare.tooltip = Exclure « Rien à déclarer ». +angal.anamnesis.family.familyhistory.border = Historique familiale +angal.anamnesis.family.gyno.txt = Gynécologie / Obstétrique +angal.anamnesis.family.hypertension.txt = Hypertension artérielle +angal.anamnesis.family.infective.txt = Infectieux +angal.anamnesis.family.neoplastic.txt = Néoplasique +angal.anamnesis.family.nothingtodeclare.txt = Rien à déclarer +angal.anamnesis.family.orto.txt = Ortho-rhumatologie +angal.anamnesis.family.other.txt = Autre +angal.anamnesis.family.remarks.border = Observations (famille) +angal.anamnesis.family.resetfamilyhistory.tooltip = Réinitialiser l'historique familiale +angal.anamnesis.family.respiratory.txt = Respiratoire +angal.anamnesis.family.tooltip.excludenothingtodeclare.txt = Exclure « Rien à déclarer ». +angal.anamnesis.family.tooltip.resetfamilyhistory.txt = Réinitialiser l'historique familiale +angal.anamnesis.firstname.label = Prénom +angal.anamnesis.hrt.no.txt = Non +angal.anamnesis.hrt.txt = THS +angal.anamnesis.hrt.yes.txt = Oui +angal.anamnesis.insertpatientexamination.tooltip = Insérer l'examen du patient +angal.anamnesis.menopause.no.txt = Non +angal.anamnesis.menopause.txt = Ménopause +angal.anamnesis.menopause.years.txt = Années +angal.anamnesis.menopause.yes.txt = Oui +angal.anamnesis.open.anamnesis.btn = Anamnèse +angal.anamnesis.open.cardiovascolaris.txt = Cardiovasculaire +angal.anamnesis.open.diseases.txt = Maladies +angal.anamnesis.open.drugsaddiction.txt = Toxicomanie +angal.anamnesis.open.endocrinometabol.txt = Endocrinien / Métabolique +angal.anamnesis.open.gyno.txt = Gynécologie / Obstétrique +angal.anamnesis.open.hypertension.txt = Hypertension artérielle +angal.anamnesis.open.infective.txt = Infectieux +angal.anamnesis.open.neoplastic.txt = Néoplasique +angal.anamnesis.open.nothingtodeclare.txt = Rien à déclarer +angal.anamnesis.open.orto.txt = Ortho-rhumatologie +angal.anamnesis.open.other.txt = Autre +angal.anamnesis.open.recentproblems.border = Problèmes récents (Ouvert) +angal.anamnesis.open.remarks.border = Remarques (Ouvertes) +angal.anamnesis.open.respiratory.txt = Respiratoire +angal.anamnesis.open.tooltip.excludenothingtodeclare.txt = Exclure « Rien à déclarer ». +angal.anamnesis.open.tooltip.resetrecentproblems.txt = Réinitialiser les problèmes récents +angal.anamnesis.patid.label = Code : +angal.anamnesis.patient.txt = Patient +angal.anamnesis.period.normal.txt = Normal +angal.anamnesis.period.other.txt = Autre +angal.anamnesis.period.txt = Période +angal.anamnesis.physiologicalhistory.border = Historique physiologique +angal.anamnesis.pregnancies.abort.txt = Avortée +angal.anamnesis.pregnancies.delivery.txt = Délivrée +angal.anamnesis.pregnancies.no.txt = Non +angal.anamnesis.pregnancies.nr.txt = Numéro +angal.anamnesis.pregnancies.txt = Grossesses +angal.anamnesis.pregnancies.yes.txt = Oui +angal.anamnesis.save.txt = Enregistrer +angal.anamnesis.savethepatienthistory.tooltip = Sauvegarder l'historique du patient +angal.anamnesis.secondname.label = Nom de famille : +angal.anamnesis.smoke.no.txt = Non +angal.anamnesis.smoke.txt = Fumer +angal.anamnesis.smoke.yes.txt = Oui +angal.anamnesis.taxcode.txt = Numéro d'identification fiscale : +angal.anamnesis.title.txt = Anamnèse +angal.anamnesis.tooltip.savethepatienthistory.txt = Sauvegarder l'historique du patient angal.billbrowser.balance.col = Bilan angal.billbrowser.bills.title = Factures angal.billbrowser.closed.title = Fermé @@ -196,26 +307,31 @@ angal.billbrowser.editbill angal.billbrowser.editbill.btn = Modifiez Facture angal.billbrowser.editbill.btn.key = F angal.billbrowser.fullreportallbills.txt = Rapport complet (Toutes les factures) +angal.billbrowser.inout.col = ENTRÉE/SORTIE angal.billbrowser.lastpayment.col = Dernier Payement angal.billbrowser.month.txt = Mois angal.billbrowser.newbill.btn = Nouvelle Facture angal.billbrowser.newbill.btn.key = N angal.billbrowser.notpaidcolon.txt = Pas Payé: +angal.billbrowser.paidperiodcolon.txt = Période de paiement : +angal.billbrowser.paidtodaycolon.txt = Payé aujourd'hui : angal.billbrowser.patientID.col = ID.Pat angal.billbrowser.patientbillmanagment.title = Gestion des Factures du Patient angal.billbrowser.patientstatement.txt = Relevé du Patient angal.billbrowser.pending.title = En attente angal.billbrowser.period.txt = Période angal.billbrowser.periodcolon.txt = Période: -angal.billbrowser.pickmonth.txt = Choisir Mois... angal.billbrowser.pleaseselectabill.msg = Veuillez sélectionner une facture angal.billbrowser.pleaseselectareport.msg = Veuillez sélectionner un rapport angal.billbrowser.pleaseselectonlyonebill.msg = Veuillez sélectionner une seule facture angal.billbrowser.receipt.btn = Reçu angal.billbrowser.receipt.btn.key = U +angal.billbrowser.removeapatient.tooltip = Supprimer un patient. angal.billbrowser.report = Rapport angal.billbrowser.report.btn = Rapport angal.billbrowser.report.btn.key = R +angal.billbrowser.selectapatient.tooltip = Sélectionnez un patient. +angal.billbrowser.selectmonth.txt = Sélectionnez un mois angal.billbrowser.shortreportonlybaddebt.txt = Rapport Bref (seulement factures BadDebts) angal.billbrowser.thebilldeleted.msg = La Facture est Supprimée angal.billbrowser.thebillisstillopen.msg = Cette facture est encore ouverte. @@ -227,7 +343,6 @@ angal.billbrowser.todayclosure.txt angal.billbrowser.todaycolon.txt = Aujourd'hui angal.billbrowser.user.txt = Utilisateur angal.billbrowser.youcannoteditaclosedbill.msg = Vous ne pouvez pas modifier une facture fermée (Administrateur peut) -angal.billitempicker.find.txt = Chercher angal.common.address.txt = Adresse angal.common.age.label = Âge: angal.common.age.txt = Âge @@ -235,6 +350,7 @@ angal.common.agefrom.label angal.common.ageto.label = Jusqu'à l'âge: angal.common.all.btn = Toute angal.common.all.txt = Tous +angal.common.alldiseasetypes.txt = Tous types de maladies angal.common.alltypes.txt = Tous les Types angal.common.amount.txt = Montant angal.common.arterialpressureabbr.txt = PA @@ -258,6 +374,7 @@ angal.common.delete.btn angal.common.delete.btn.key = S angal.common.description.txt = Description angal.common.discharge.txt = Décharger +angal.common.documenthasnopages.msg = Le document n'a pas de pages. angal.common.doyouwanttoproceed.msg = Voulez-vous poursuivre? angal.common.edit = Modification angal.common.edit.btn = Modification @@ -275,7 +392,6 @@ angal.common.filter.btn.key angal.common.from.txt = de angal.common.group.txt = Groupe angal.common.height.txt = Hanteur -angal.common.hours = Heures angal.common.id.txt = ID angal.common.info.title = Information angal.common.laboratory.txt = Laboratoire @@ -283,7 +399,6 @@ angal.common.launchreport.btn angal.common.launchreport.btn.key = R angal.common.male.btn = Mâle angal.common.male.txt = Masculin -angal.common.minutes = Minutes angal.common.minutesabbr = Min angal.common.months.txt = Mois angal.common.name.txt = Nom @@ -291,18 +406,22 @@ angal.common.new.btn angal.common.new.btn.key = N angal.common.newpatient.btn = Nouveau Patient angal.common.newpatient.btn.key = N +angal.common.nodatatoshow.msg = Aucune donnée a afficher. angal.common.notapplicable.txt = NPA angal.common.notdefined.txt = N/D angal.common.note.title = Remarque angal.common.note.txt = Remarque angal.common.ok.btn = OK angal.common.ok.btn.key = O +angal.common.opd.txt = DDP angal.common.patient.txt = Patient angal.common.patientID = ID.Pat angal.common.pleaseinsertacode.msg = Veuillez insérer un code. angal.common.pleaseinsertavaliddescription.msg = Veuillez insérer une description valide. +angal.common.pleaseinsertavalidnumber.msg = Veuillez insérer un numéro valide. angal.common.pleaseselectapatient.msg = Veuillez sélectionner un patient. angal.common.pleaseselectarow.msg = Veuillez sélectionner sélectionner une ligne. +angal.common.pleaseselectaward.msg = Veuillez sélectionner un département angal.common.print.btn = Imprimer angal.common.print.btn.key = I angal.common.qty.txt = Qté @@ -353,28 +472,31 @@ angal.common.uom.mmHg angal.common.uom.percentage = % angal.common.update.btn = Mettre à Jour angal.common.update.btn.key = J +angal.common.user.col = Utilisateur +angal.common.userid = Utilisateur angal.common.userid.label = Usager: angal.common.ward.txt = Departement angal.common.weight.txt = Poids angal.common.years.txt = Années angal.dicom.afileinthefolderistoobigpleasesetdicommaxsizeindicomproperties.fmt.msg = Un fichier du répertoire est trop grand. Veuillez modifier 'dicom.max.size' dans dicom.properties ({0}). -angal.dicom.delete.btn = Supprimer DICOM +angal.dicom.delete.btn = Éliminer image angal.dicom.delete.btn.key = S angal.dicom.delete.no = Non angal.dicom.delete.request = Voulez-vous vraiment supprimer le fichier? angal.dicom.delete.title = Confirmer Suppression angal.dicom.delete.yes = Oui +angal.dicom.dicomformatnotsupported.fmt.msg = Le format d'image n'est pas pris en charge : {0} angal.dicom.err = Erreur angal.dicom.image.frames = Images -angal.dicom.image.patient.dicom = DICOM Patient +angal.dicom.image.patient.dicom = Images Patient angal.dicom.image.patient.oh = Patient angal.dicom.image.serie.n = Numéro série angal.dicom.image.studyid = Étude id angal.dicom.image.zoom = Zoom -angal.dicom.load.btn = Charger DICOM +angal.dicom.load.btn = Charger Image angal.dicom.load.btn.key = G angal.dicom.loading = Chargement en cours... -angal.dicom.open.txt = Ouvrir DICOM +angal.dicom.open.txt = Ouvrir Image angal.dicom.thefileisinanunknownformat.fmt.msg = Le fichier est d'un format inconnu: {0}. angal.dicom.thefileisnotindicomformat.fmt.msg = Le fichier n'est pas du format DICOM: {0}. angal.dicom.thefileistoobigpleasesetdicommaxsizeproperty.fmt.msg = Le fichier est trop gros. Veuillez définir 'dicom.max.size' dans dicom.properties ({0}) @@ -385,15 +507,15 @@ angal.dicom.thumbnail.series angal.dicom.thumbnail.sernum = Numéro de Série angal.dicom.thumbnail.study = Étude angal.dicom.unknownsizeformatpleasesetdicommaxsizeproperty.fmt.msg = Taille du fichier inconnue. Veuillez modifier 'dicom.max.size' dans dicom.properties ({0}). -angal.dicommanager.errorwiththedicomimplmentationclass.fmt.msg = Erreur avec la DICOM implmentation class: {0}. +angal.dicommanager.errorwiththedicomimplmentationclass.fmt.msg = Erreur avec la implementation de class: {0}. angal.dicommanager.genericerror.fmt.msg = Erreur générique: {0} -angal.dicomtype.delete.fmt.msg = Supprimer typologie DICOM: "{0}"? -angal.dicomtype.dicomtypebrowser.title = Liste Typologie DICOM -angal.dicomtype.editdicomtype.title = Modification Typologie DICOM -angal.dicomtype.newdicomtype.title = Nouvelle Typologie DICOM +angal.dicomtype.delete.fmt.msg = Supprimer typologie des images: "{0}"? +angal.dicomtype.dicomtypebrowser.title = Liste Typologies des Images +angal.dicomtype.editdicomtype.title = Modifiez la typologie des images +angal.dicomtype.newdicomtype.title = Nouveau Typologie des Images angal.dicomview.frames.title = Images angal.dicomview.zoom.title = Zoom -angal.dicomviewer.title = Visionneuse DICOM +angal.dicomviewer.title = Visionneuse d'images angal.disctype.codem = Code angal.disctype.deleterow.fmt.msg = Supprimer typologie démission: "{0}"? angal.disctype.dischargetypebrowser.title = Liste Typologie Démissions @@ -523,15 +645,23 @@ angal.groupsbrowser.theadmingroupcannotbedeleted.msg angal.groupsbrowser.thegroupalreadyexists.fmt.msg = Le groupe "{0}" existe déjà. angal.groupsbrowser.thisgrouphasusersandcannotbedeleted.msg = Le groupe contient des utilisateurs et ne peux pas être supprimé. angal.groupsbrowser.title = Liste Groupes -angal.help.pdfviewernotfound = PDF Viewer introuvable.\nLe Guide de l'utilisateur se trouve dans le dossier Documents. -angal.help.pdfviewernotfoundoruserguidenotfound = PDF Viewer introuvable ou Guide de l'utilisateur ne figure pas dans le dossier Documents -angal.help.userguidenotfound = Guide de l'utilisateur non trouvé dans le dossier Documents +angal.help.pdfviewernotfound.msg = PDF Viewer introuvable.\nLe Guide de l'utilisateur se trouve dans le dossier Documents. +angal.help.pdfviewernotfoundoruserguidenotfound.msg = La visionneuse PDF est introuvable ou le guide de l'utilisateur est introuvable dans le dossier Documents.\nVoulez-vous consulter la version sur le site web d'Open Hospital ? +angal.help.userguidenotfound.msg = Le guide de l'utilisateur ne se trouve pas dans le dossier Documents.\nSouhaitez-vous consulter une version en ligne ? +angal.hopsital.thehospitalnamecannotbeblank.msg = Le nom de l'hôpital ne peut pas être vide. angal.hospital = Open Hospital angal.hospital.currencycod = Code Devise angal.hospital.emailaddress = Adresse e-mail angal.hospital.faxnumber = No. Fax angal.hospital.hospitalinformation.title = Renseignement Hôpital angal.hospital.savethechanges.msg = Enregistrer modification +angal.hospital.thestartofvisitinghoursislaterthantheendhour.msg = Le début des heures de visite est postérieur à l'heure de fin. +angal.hospital.thevisitdurationcannotbeblank.msg = La durée de la visite ne peut pas être vide. +angal.hospital.thevisitdurationmustbepositiveandlessthanthelengthofthevisitinghours.msg = La durée de la visite doit être positive et inférieure à la durée des heures de visite. +angal.hospital.thevisitinghourvaluesmustbeintherange0to24.msg = Les heures de visite doivent être comprises entre 0 et 24. +angal.hospital.visitduration.txt = Durée de la visite +angal.hospital.visitendhour.txt = Heure de fin de visite +angal.hospital.visitstarthour.txt = Heure de début de la visite angal.lab.allnegative.txt = Tout négatif angal.lab.blood.txt = Sang angal.lab.cfs.txt = CFS @@ -593,10 +723,15 @@ angal.labnew.title angal.labnew.tooltip.associateapatientwiththisexam = Associez un Patient avec cet examen angal.labnew.tooltip.changethepatientassociatedwiththisexams = Changer le Patient associé à cet examen angal.labnew.tooltip.removepatientassociationwiththisexam = Supprimez le Patient associé avec cet examen +angal.login.accounthasnotbeenusedindayscontacttheadministrator.fmt.msg = Le compte n'a pas été utilisé depuis {0} jours.\nContactez l'administrateur. +angal.login.accountislocked.msg = Le compte est bloqué. +angal.login.accountisnowlockedforminutes.fmt.msg = Le compte est maintenant bloqué pour {0} minutes. +angal.login.accountisstilllockedformoreminutes.fmt.msg = Le compte est toujours bloqué pendant {0} minutes supplémentaires. angal.login.password.label = Mot de passe: angal.login.passwordisincorrectpleaseretry.msg = Le mot de passe est incorrect, réprouvez. angal.login.title = Accès -angal.mainmenu.fmt.title = Usager: {0} +angal.log.foldererror.fmt.msg = Un problème s'est produit lors de l'ouverture du dossier de logs : {0} +angal.mainmenu.username.fmt = Usager: {0} angal.malnutrition.controldatemustbeaftervisitdate.msg = La date de contrôle doit être successive à la date de consultation. angal.malnutrition.dateconf.col = Date Approbation angal.malnutrition.dateofthenextcontrol = Date du prochain contrôle @@ -612,11 +747,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = Aucun nom sélectionné angal.malnutrition.pleaseinsertavalidcontroldate.msg = Veuillez insérer une date de contrôle valide. angal.malnutrition.pleaseinsertavalidvisitdate.msg = Veuillez insérer une date de visite valide. +angal.medicals.active.txt = Actif +angal.medicals.activeonly.txt = Actif uniquement angal.medicals.averagemonthlyconsumption.btn = CMM angal.medicals.averagemonthlyconsumption.btn.key = CM -angal.medicals.criticallevel = Niveau critique +angal.medicals.criticallevel.txt = Niveau critique angal.medicals.critlevel.col = Niveau critique angal.medicals.deletemedical.fmt.msg = Supprimer produit médical: {0}? +angal.medicals.disabledonly.txt = Désactivé uniquement angal.medicals.editmedical.title = Modifier Produit Médical angal.medicals.expiring.btn = Péremption angal.medicals.expiring.btn.key = T @@ -635,7 +773,7 @@ angal.medicals.order.btn.key angal.medicals.othermonth = Autre mois... angal.medicals.outofstock.col = Rupture de stock! angal.medicals.pcsperpck.col = PcsXPqt -angal.medicals.pcsperpckExt = Pieces par Paquet +angal.medicals.pcsperpck.txt = Pieces par Paquet angal.medicals.pharmaceuticalbrowser.title = Liste Medicaments angal.medicals.pleaseselectareport.msg = Veuillez sélectionner un rapport angal.medicals.pleaseselectperiod.msg = Veuillez sélectionner une période @@ -651,16 +789,23 @@ angal.medicals.thismonth angal.medicals.today = aujourd'hui angal.medicals.type = Typologie angal.medicals.withlot = Avec lots +angal.medicalstock.allcharges.txt = Tous les frais +angal.medicalstock.alldischarges.txt = Toutes les sorties +angal.medicalstock.category.col = Catégorie angal.medicalstock.charge.btn = Charge angal.medicalstock.charge.btn.key = C angal.medicalstock.chooseamedical.msg = Choisir un Produit Médical. +angal.medicalstock.choosealot.msg = Choisir un lot angal.medicalstock.chooseavalidduedate.msg = Choisir une date d'échéance valide. angal.medicalstock.chooseavalidmovementdate.msg = Choisir une date mouvement valide. angal.medicalstock.chooseavalidpreparationdate = Choisir une date préparation valide. angal.medicalstock.clickdrugs = Double clic pour les détails du lot +angal.medicalstock.codeordescription.txt = Code ou description angal.medicalstock.cost.col = Cout +angal.medicalstock.deletemovementsuccess.msg = Dernière action supprimée avec succès. angal.medicalstock.discharge.btn = Décharger -angal.medicalstock.discharge.btn.key = É +angal.medicalstock.discharge.btn.key = E +angal.medicalstock.notpossibletodeletethismovementthemedicalhasbeenusedafterbeenreceivedinward.fmt.msg = Impossible de supprimer cette action : le service médical {0} a déjà été utilisé après avoir été reçu dans le service {1}. angal.medicalstock.duedate = Date échéance angal.medicalstock.duedate.col = Date échéance angal.medicalstock.duedatefromcannotbelaterthanduedateto = La date De ne peut pas être successive á la date d'échéance Á @@ -678,7 +823,7 @@ angal.medicalstock.lotpreparationdate angal.medicalstock.medtype.col = Type Med angal.medicalstock.movement = Mouvement angal.medicalstock.movementdatefromcannotbelaterthanmovementdateto = La date mouvement De ne peut être successive à la date mouvement À -angal.medicalstock.movementquantityisgreaterthanthequantityof.msg = La quantité en mouvement est plus grande que la quantité du lot sélectionné: divisez le mouvement. +angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg = Movement quantity ({0}) is greater than the quantity of the lot selected ({1}); split the movement or adjust Units/Packets. angal.medicalstock.multiplecharging.adateinthefutureisnotallowed.msg = Date future non permise. angal.medicalstock.multiplecharging.chargetype = Typologie de Charge angal.medicalstock.multiplecharging.chooseamedical = Choisir un Produit Médical @@ -710,7 +855,7 @@ angal.medicalstock.multiplecharging.units angal.medicalstock.multiplecharging.useanexistinglot = Utiliser un lot existant? angal.medicalstock.multiplecharging.zerocostsarenotallowed.msg = Zéro coûts non permis. angal.medicalstock.multipledischarging.alert = ALERTE: -angal.medicalstock.multipledischarging.alreadyinthisform = Already in this form! +angal.medicalstock.multipledischarging.alreadyinthisform = Déjà dans ce formulaire angal.medicalstock.multipledischarging.chooseamedical = Choisir un Produit Médical angal.medicalstock.multipledischarging.destination = Destination angal.medicalstock.multipledischarging.dischargetype = Typologie Démissions @@ -719,7 +864,9 @@ angal.medicalstock.multipledischarging.isabouttoend angal.medicalstock.multipledischarging.lotinformations = Information Lot angal.medicalstock.multipledischarging.lotnumberabb = Lot No. angal.medicalstock.multipledischarging.lyinginstock = Dans le magasin: +angal.medicalstock.multipledischarging.movementexceedstheavailablequantityformedical.fmt.msg = Movement exceeds the available quantity ({0}) for medical {1}. angal.medicalstock.multipledischarging.noelementtosave = Pas d'éléments à enregistrer +angal.medicalstock.multipledischarging.nolotswithavailablequantityfoundformedicalpleasereport.fmt.msg = No lots with available quantity found for medical {0}; please report to system administrator. angal.medicalstock.multipledischarging.outofstock = Pas de stock! angal.medicalstock.multipledischarging.packets = Paquets angal.medicalstock.multipledischarging.pleaseinsertavalidvalue = Insérez une valeur valide @@ -736,18 +883,24 @@ angal.medicalstock.multipledischarging.youaregoingundercriticalevel angal.medicalstock.nodate = Aucune date angal.medicalstock.nodescription.txt = aucune description angal.medicalstock.nolot.txt = Aucun Lot +angal.medicalstock.onlythelastmovementcanbedeleted.msg = Seule la dernière action peut être supprimée. angal.medicalstock.origin.col = Origine angal.medicalstock.pharmaceutical = Médicament angal.medicalstock.pharmaceutical.col = Médicament angal.medicalstock.pleasechooseatype.msg = Choisir une typologie. -angal.medicalstock.pleaseselectalot = Veuillez sélectionner un lot +angal.medicalstock.pleaseselectamovement.msg = Veuillez sélectionner une action. +angal.medicalstock.pleaseselectonlyonemovement.msg = Veuillez sélectionner qu'une seule action. +angal.medicalstock.pleaseselectoucomemovement.msg = Please select an outcome movement. angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto = La date Préparation Da ne peut pas être successive á la date Préparation á angal.medicalstock.prepdate = Date préparation angal.medicalstock.prepdate.col = Date Prep angal.medicalstock.refno.col = Ref. No. +angal.medicalstock.reset.btn = Réinitialiser +angal.medicalstock.reset.btn.key = É angal.medicalstock.selectionpanel = Sélectionner Panneau angal.medicalstock.stockmovement.title = Mouvement Magasin angal.medicalstock.stockmovementbrowser.title = Liste Mouvements Magasin +angal.medicalstock.doyoureallywanttodeletethismovement.msg = Voulez vous vraiment supprimer ce mouvement? angal.medicalstock.thelotidistoolongmax50chars.msg = ID du lot trop long (max 50 caractères). angal.medicalstock.thepreparationdatecannotbyaftertheduedate.msg = Le date de préparation ne peut être successive à la date d'échéance. angal.medicalstock.thequantitymustnotbezero.msg = La quantité ne doit pas être 0. @@ -793,6 +946,7 @@ angal.medicalstockward.rectify.medical angal.medicalstockward.rectify.pieces = pièces angal.medicalstockward.rectify.pleaseinsertavalidvalue = Insérez une valeur valide angal.medicalstockward.rectify.pleaseselectadrug = Veuillez sélectionner un médicament +angal.medicalstockward.rectify.pleaseselectalot = Veuillez sélectionner un lot angal.medicalstockward.rectify.pleasespecifythereason = Veuillez préciser la raison angal.medicalstockward.rectify.preparationdate = Date préparation angal.medicalstockward.rectify.reason = Raison @@ -815,9 +969,6 @@ angal.medicalstockwardedit.internaluse angal.medicalstockwardedit.medical.btn = Produit Médical angal.medicalstockwardedit.medical.btn.key = T angal.medicalstockwardedit.patient = Patient -angal.medicalstockwardedit.pickpatient = Trouver Patient -angal.medicalstockwardedit.pickpatient.btn = Trouver Patient -angal.medicalstockwardedit.pickpatient.btn.key = P angal.medicalstockwardedit.pieces = pièces angal.medicalstockwardedit.pleaseinsertadescriptionfortheinternaluse.msg = Veuillez insérer une description pour usage interne. angal.medicalstockwardedit.pleaseselectadrug.msg = Veuillez sélectionner un médicament. @@ -827,9 +978,16 @@ angal.medicalstockwardedit.removeitem.btn angal.medicalstockwardedit.removeitem.btn.key = É angal.medicalstockwardedit.selectadrug = Sélectionner un médicament angal.medicalstockwardedit.selectapatient = Sélectionner un patient +angal.medicalstockwardedit.selectpatient = Sélectionnez un Patient +angal.medicalstockwardedit.selectpatient.btn = Sélectionnez un Patient +angal.medicalstockwardedit.selectpatient.btn.key = T angal.medicalstockwardedit.title = Nouveau / Modification angal.medicalstockwardedit.tooltip.associateapatientwiththismovement = Associez un Patient avec ce mouvement angal.medicalstockwardedit.tooltip.removepatientassociationwiththismovement = supprimez l'association du Patient avec ce mouvement +angal.medstockmovtype.allowedcategoriesare.fmt.msg = Les catégories autorisées sont les suivantes : {0} +angal.medstockmovtype.category.txt = Catégorie +angal.medstockmovtype.category.operational.txt = Opérationnel +angal.medstockmovtype.category.nonoperational.txt = Non opérationnel angal.medstockmovtype.deletemovementtype.fmt.msg = Supprimer typologie mouvement: "{0}"? angal.medstockmovtype.editmedicalstockmovementtype.title = Modification Typologie Mouvement Magasin Produits Médicaux angal.medstockmovtype.medicalstockmovementtypebrowser.title = Liste Typologie Mouvements Magasin Produits Médicaux @@ -856,6 +1014,7 @@ angal.menu.btn.agetype angal.menu.btn.billsmanager = Gestion des factures angal.menu.btn.btnadmbill = Facture angal.menu.btn.btnbillreceipt = Reçue +angal.menu.btn.btnmedicalswarddelete = Supprimer angal.menu.btn.btnmedicalswardexcel = Excel angal.menu.btn.btnmedicalswardrectify = Rectifier angal.menu.btn.btnmedicalswardreport = Rapport @@ -864,12 +1023,13 @@ angal.menu.btn.btnpharmstockdischarge angal.menu.btn.chat = Communication angal.menu.btn.deliverytype = Typologie accouchement angal.menu.btn.delresulttype = Typologie résultat accouchement -angal.menu.btn.dicom = DICOM -angal.menu.btn.dicomtype = Typologie DICOM +angal.menu.btn.dicom = Images Patient +angal.menu.btn.dicomtype = Typologie des images angal.menu.btn.disctype = Typologie Démissions angal.menu.btn.disease = Maladies angal.menu.btn.diseaselist = Liste Maladies angal.menu.btn.diseasetype = Typologie Maladies +angal.menu.btn.doc = Documentation angal.menu.btn.examlist1 = Liste Examens angal.menu.btn.exams = Examens angal.menu.btn.examtype = Typologie Examen @@ -879,6 +1039,7 @@ angal.menu.btn.help angal.menu.btn.hospital = Hôpital angal.menu.btn.labbrowsing = Parcourir Laboratoire angal.menu.btn.laboratory = Laboratoire +angal.menu.btn.logfile = Journaux de bord angal.menu.btn.medicals = Médicaments angal.menu.btn.medicalstock = Magasin des Médicaments angal.menu.btn.medicalstype = Typologie Produit Médicaux @@ -888,6 +1049,7 @@ angal.menu.btn.newbill angal.menu.btn.opd = DDP angal.menu.btn.opdchart = Dossier DDP angal.menu.btn.operation = Interventions +angal.menu.btn.operationlist = Liste des opérations angal.menu.btn.operationtype = Typologie Intervention angal.menu.btn.otherprices = Autres Prix angal.menu.btn.patientvaccine = Vaccins du Patient @@ -899,6 +1061,7 @@ angal.menu.btn.printing angal.menu.btn.smsmanager = Gestionnaire de SMS angal.menu.btn.statistics = Statistiques angal.menu.btn.supplier = Fournisseur +angal.menu.btn.telemetry = Télémétrie angal.menu.btn.types = Typologies angal.menu.btn.users = Utilisateurs & Groupes angal.menu.btn.usersusers = Usagers @@ -922,6 +1085,7 @@ angal.menu.disctype angal.menu.disease = Maladies angal.menu.diseaselist = Liste Maladies angal.menu.diseasetype = Typologie Maladies +angal.menu.doc = Documentation angal.menu.examlist1 = Liste Examens angal.menu.exams = Examens angal.menu.examtype = Typologie Examen @@ -931,6 +1095,9 @@ angal.menu.help angal.menu.hospital = Hôpital angal.menu.labbrowsing = Liste Laboratoires angal.menu.laboratory = Laboratoires +angal.menu.logfile = Journaux de bord +angal.menu.logout.btn = Se déconnecter +angal.menu.logout.btn.key = S angal.menu.medicals = Médicaments angal.menu.medicalstock = Stock Médicaments angal.menu.medicalstype = Produits Médicaux @@ -940,6 +1107,7 @@ angal.menu.newbill angal.menu.opd = DDP angal.menu.opdchart = DDP Rapport angal.menu.operation = Interventions +angal.menu.operationlist = Liste des opérations angal.menu.operationtype = Typologie Intervention angal.menu.otherprices = Autres Prix angal.menu.patientvaccine = Vaccins du Patient @@ -951,6 +1119,7 @@ angal.menu.printing angal.menu.smsmanager = Gestionnaire des SMS angal.menu.statistics = Statistiques angal.menu.supplier = Fournisseur +angal.menu.telemetry = Télémétrie angal.menu.types = Typologies angal.menu.users = Usagers angal.menu.usersusers = Usagers @@ -1001,8 +1170,9 @@ angal.newbill.item.title angal.newbill.list.txt = Liste angal.newbill.medical.btn = Produit Médical angal.newbill.medical.title = Produit Médical +angal.newbill.multipleopenedbillsnotallowedpleasesolve.msg = L'ouverture de plusieurs factures n'est pas autorisée, veuillez résoudre le problème. angal.newbill.newdescription.txt = Nouvelle description -angal.newbill.nopricelistselectedwilbeused.fmt.msg = Pas de liste des prix sélectionnée. {0} sera utilisé. +angal.newbill.nopricelistselectedwillbeused.fmt.msg = Pas de liste des prix sélectionnée. {0} sera utilisé. angal.newbill.operation.btn = Opération angal.newbill.operation.btn.key = O angal.newbill.operation.title = Opération @@ -1030,22 +1200,33 @@ angal.newbill.selectamedical.txt angal.newbill.selectanexam.txt = Sélectionner un examen: angal.newbill.selectanoperation.txt = Sélectionner une Opération: angal.newbill.selectapricelist.title = Veuillez sélectionner une Liste des Prix +angal.newbill.somepriceshavebeenchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Certains prix ont été modifiés : {0}\n\nVoulez-vous mettre à jour les prix des articles ? +angal.newbill.somepricesnotfound.fmt.msg = Certains prix n'ont pas été trouvés : {0} +angal.newbill.somepricesnotfoundandsomeotherchangeddoyouwanttoupdatetheitemsprices.fmt.msg = Certains prix n'ont pas été trouvés et d'autres ont été modifiés :\nIntrouvable : {0}\nModifié : {1}\n\nVoulez-vous mettre à jour les prix des articles existants ? angal.newbill.thedateisbeforethelastpayment.msg = La date est antérieure au dernier payement +angal.newbill.thepatienthaschangedwardsarrow.fmt.msg = Le patient a changé de service : {0} -> {1} angal.newbill.thepricelistassociatedwiththisbillnolongerexists.msg = La liste de prix associés avec cette facture n'existe plus +angal.newbill.thepricelistcurrencycodehaschangedarrow.fmt.msg = La devise du tarif a changé : {0} -> {1} +angal.newbill.thisbillwaslinkedtoapreviousadmissiondoyouwanttolinkittothecurrentadmissioninstead.msg = Cette facture était liée à une admission précédente. Voulez-vous la rattacher à l'admission actuelle ? angal.newbill.thispatienthasapendingbill.msg = Ce patient a une facture en attente. angal.newbill.thispatienthasapendingbilldoyouwanttocreateanother.msg = Ce Patient a une facture en attente. Voulez-vous en créer une autre? angal.newbill.thispatienthasmorethanonependingbilldoyouwanttocreateanother.msg = Ce patient a plus d'une facture en attente. Voulez-vous en créer une autre? angal.newbill.thispatienthasmorethanonependingbilldoyouwanttoopenthelastpendingbill.msg = Ce patient a plus d'une facture en attente. Voulez-vous ouvrir la dernière facture ouverte? +angal.newbill.thispatientisadmittednowdoyouwanttolinkthisbilltothecurrentadmission.msg = Ce patient est actuellement admis. Voulez-vous lier cette facture à l'admission en cours ? +angal.newbill.thispatientisnolongeradmitteddoyouwanttounlinkthisbillfromthepreviousadmission.msg = Ce patient n'est plus admis. Voulez-vous dissocier cette facture de l'admission précédente ? angal.newbill.topay.txt = À PAYER angal.newbill.youcannotdeletealreadysaveditems.msg = Vous ne pouvez pas supprimer les éléments déjà enregistrés angal.newbill.youcannotdeletepastpayments.msg = Vous ne pouvez pas supprimer des payements du passé angal.opd.agefrommustbelowerthanageto.msg = 'Depuis l'âge' doit être inférieur à 'Jusqu'à l'âge'. angal.opd.alldiseases.txt = Toutes les Maladies -angal.opd.attendancedate.txt = Date Admission +angal.opd.allwards.txt = Tous les services +angal.opd.anamnesis = Anamnèse +angal.opd.anamnesis.btn.key = M +angal.opd.attendancedate.txt = date assistence angal.opd.cannotsetadateinthepastfornextvisit.msg = Vous ne pouvez pas entrer une date du passé pour la prochaine visite. angal.opd.datefrommustbebefordateto.msg = La "Date De" doit être avant la "Date à". -angal.opd.deletefollowingopd.fmt.msg = Supprimer les DDP suivants?\n\nDate d'enregistrement={0}\nMaladie={1}\nÂge={2}, Sexe={3}\nDate Consultation={4} -angal.opd.deletefollowingopdextended.fmt.msg = Supprimer l'opd suivant ?\n\nPatient={0}\nDate d'enregistrement={1}\nMaladie={2}\nÂge={3}, Sexe={4}\nDate de visite={5} +angal.opd.deletefollowingopd.fmt.msg = Supprimer les DDP suivants?\n\nDate d'enregistrement={0}\nMaladie={1}\nÂge={2}\nSexe={3}\nDate Consultation={4} +angal.opd.deletefollowingopdextended.fmt.msg = Supprimer les DDP suivants?\n\nPatient: {0}\nDate d'enregistrement: {1}\nMaladie: {2}\nÂge: {3}\nSexe: {4}\nDate Consultation: {5} angal.opd.diagnosis.txt = Diagnostic angal.opd.diagnosisnfulllist2.txt = Diagnostic n.2 (liste compléte) angal.opd.diagnosisnfulllist3.txt = Diagnostic n.3 (liste compléte) @@ -1065,8 +1246,9 @@ angal.opd.fullname.col angal.opd.insertavalidage.msg = Insérez une âge valide. angal.opd.lastopdnote.txt = Remarques angal.opd.lastopdvisitm.txt = DDP DÈRNIERE VISITE +angal.opd.mypatient.btn = Mes patients angal.opd.new.btn = Nouveau -angal.opd.newattendance.txt = Nouvelle Admission +angal.opd.newattendance.txt = Nouvelle assistence angal.opd.newopdregistration.title = Nouveau DDP Registration angal.opd.nextofkin.txt = Plus proche Parent angal.opd.nextvisitdate.txt = Date du prochain rendez-vous @@ -1080,11 +1262,15 @@ angal.opd.opdnumberalreadyexist.msg angal.opd.opdnumbermustbeanumber.msg = DDP No. doit être un numéro. angal.opd.opdoutpatientdepartment.title = DDP Département Démission patient angal.opd.operation = Intervention +angal.opd.otherfilters.border = Autres filtres angal.opd.patientcode.fmt.msg = Patient (code: {0}) angal.opd.patientid.col = ID.Pat angal.opd.patientstatus.col = Statu -angal.opd.pleaseinsertattendancedate.msg = Veuillez insérer une date d'admission. -angal.opd.pleaseinsertavalidattendancedate.msg = Veuillez insérer une date d'admission valide. +angal.opd.patienttype.label = Type de patient : +angal.opd.pleasechooseavalidtimeforthenextvisit.msg = Veuillez choisir une heure valide pour la prochaine visite. +angal.opd.pleasechooseawardforthenextvisit.msg = Veuillez choisir un service pour la prochaine visite. +angal.opd.pleaseinsertattendancedate.msg = Insérez une date assistence +angal.opd.pleaseinsertavalidattendancedate.msg = Insérez une date assistence valide angal.opd.pleaseinsertthepatientsage.msg = Veuillez insérer insérer l'âge du patient. angal.opd.pleaseselectadisease.msg = Veuillez sélectionner une maladie. angal.opd.pleaseselectpatientssex.msg = Veuillez sélectionner le sexe du patient. @@ -1092,9 +1278,17 @@ angal.opd.reattendance.btn angal.opd.reattendance.txt = Re-Assistence angal.opd.referral.txt = Référé angal.opd.referralto.txt = Référé à +angal.opd.reset.btn = Réinitialiser +angal.opd.reset.btn.key = E +angal.opd.searchbycodespressenter.border = Recherche par code (appuyer sur ENTRÉE) +angal.opd.searchdisease.label = Recherche de maladie : angal.opd.secondname.txt = Nom angal.opd.selectapatient.txt = Sélectionner un Patient +angal.opd.selectaward.txt = Sélectionner un Département +angal.opd.specifieddiseaseisnoenabledforopdservice.fmt.msg = La maladie spécifiée ({0}) n'est pas activée pour le service ambulatoire. +angal.opd.specifiedwardisnotenabledforopdservice.msg = Le service spécifié n'est pas activé pour le service ambulatoire. angal.opd.specifyingduplicatediseasesisnotallowed.msg = Spécification de maladies dupliquées non autorisées. +angal.opd.ward.txt = Re-accouchement angal.operation.deleteoperation.fmt.msg = Supprimer intervention: {0}? angal.operation.editoperation.title = Modification Intervention angal.operation.major = Majeur @@ -1111,6 +1305,7 @@ angal.operation.selecttype angal.operation.type = Typologie angal.operationrow.clear.btn = Effacer angal.operationrow.clear.btn.key = G +angal.operationrow.not.found.msg = La ligne d'opération n'a pas été trouvée. angal.operationrowedit.operation = Opération: angal.operationrowedit.remark = Remarques: angal.operationrowedit.saveerror = Erreur lors de l'enregistrement @@ -1136,6 +1331,7 @@ angal.opetype.newoperationtype.title angal.opetype.operationtypebrowser.title = Liste Type Interventions angal.patient.agestar = Âge * angal.patient.alive.btn = en vie +angal.patient.anamnesis = Anamnèse angal.patient.birthdate = Date de naissance angal.patient.bloodtype = Groupe Sanguin angal.patient.bloodtype.unknown = Inconnu @@ -1144,6 +1340,8 @@ angal.patient.dead.btn angal.patient.deletepatient.fmt.msg = Supprimer patient: {0}? angal.patient.doyouwanttodeletethepatientsphoto.msg = Voulez-vous supprimer la photo du patient? angal.patient.editpatient.title = Modification Patient +angal.patient.examination.nonzero.msg = La taille ou le poids ne doit pas être nul. +angal.patient.examination.minmaxvalues.msg = Certaines valeurs introduites sont égales à leur valeur minimale ou maximale. Voulez-vous vraiment les confirmer ? angal.patient.fathername = Nom du Père angal.patient.firstname = Prénom * angal.patient.hasinsurance = Est Assuré @@ -1170,9 +1368,15 @@ angal.patient.newpatient.title angal.patient.nextkin = Plus proche Parent angal.patient.no.btn = Non angal.patient.note = Remarques +angal.patient.consensus.consensus.txt = A consulté et approuvé le formulaire de consentement au traitement +angal.patient.consensus.consensus.mandatory.msg = La mention « a consulté et approuvé le formulaire de consentement au traitement » est obligatoire. +angal.patient.consensus.service.txt = Consent à l'utilisation des données par d'autres services. +angal.patient.consensus.border = Le patient angal.patient.parenttogether = Parents vivant ensemble angal.patient.patientbrowser.title = Liste Patients angal.patient.patientphoto = Photo du Patient +angal.patient.patientphoto.error.filenotfound.msg = Le fichier photo du patient n'a pas été trouvé. +angal.patient.patientphoto.error.title = Erreur de photo du patient angal.patient.patientselection.title = Sélection Patient angal.patient.photodeleted = Supprimé angal.patient.photonotdeleted = Photo non supprimée @@ -1250,7 +1454,7 @@ angal.priceslist.adescription angal.priceslist.changelist = Changez Liste angal.priceslist.copy.btn = Copie angal.priceslist.copy.btn.key = P -angal.priceslist.copyof = Copie de +angal.priceslist.copyof.fmt = Copie de {0} angal.priceslist.currency.col = Devise angal.priceslist.currencystar = Devise* angal.priceslist.deletethislistandallitsprices.fmt.msg = Supprimer cette liste et tous ses prix: {0}? @@ -1315,17 +1519,18 @@ angal.sms.deletetheselectedsms.msg angal.sms.doyouwanttosplitinmoremessages = Voulez-vous le diviser en plusieurs messages angal.sms.newsms.title = Nouveau SMS angal.sms.number = Numéro +angal.sms.pleaseenteravaliddateandtime.msg = Veuillez saisir une date et une heure valides. angal.sms.pleaseinsertatextmessage.msg = Veuillez insérer un texte de message. angal.sms.pleaseinsertavalidtelephonenumber.msg = Veuillez insérer un numéro de téléphone valide. angal.sms.scheduleddate = Date prévue angal.sms.scheduleddate.col = Heure prévue -angal.sms.scheduledtime = Heure prévue angal.sms.sent.col = Envoyé angal.sms.smsmanager.title = Gestionnaire de SMS angal.sms.themessageislongerthencharacters.fmt.msg = Le message est plus long que {0} caractères. angal.sql.anunexpectederroroccurredpleasecheckthelogs.msg = Une erreur inattendue s'est produite, veuillez vérifier les journaux. angal.sql.constraintviolation.msg = Violation de contrainte. angal.sql.databaseserverstoppedornetworkfailure.msg = Serveur du data-base arrêté ou problème de réseau. +angal.sql.onefieldisnotcorrectlyset.msg = Un champ n'est pas correctement défini. angal.sql.operationnotpermittedprotectedelement = Opération interdite. Élément Protégé. angal.sql.pleaseconsiderenablingtheenhancedsearchsettingseeadminmanualformoreinfo.msg = Veuillez envisager d'activer le paramètre ENHANCEDSEARCH.\n\nVoir le manuel d'administration pour plus d'informations. angal.sql.problemsoccurredwithserverconnection.msg = Il y a des problèmes avec la connexion au serveur. @@ -1334,6 +1539,7 @@ angal.sql.thedatahasbeenupdatedbysomeoneelse.msg angal.sql.theselecteditemisstillusedsomewhere.msg = l'élément sélectionné est encore utilisé quelque part. angal.stat.allIncomes = OH011A - Chiffre d'affaires, Revenus & Créances (Tous) angal.stat.allIncomesmonth = OH011C - Revenues, Entrées & Recevables (Mois) +angal.stat.allIncomesmonthward = OH011D - Recettes, revenus et créances (service / mois) angal.stat.allIncomespending = OH011B- Chiffre d'affaires, Revenus & Créances (en attente) angal.stat.april = Avril angal.stat.august = Août @@ -1345,7 +1551,6 @@ angal.stat.diseasereport.title angal.stat.examslist = Liste Examens angal.stat.examsreport.title = Rapport Examens angal.stat.february = Février -angal.stat.fromdate = Du Jour angal.stat.incomesallbypricecodes = OH004 - Tous les reçus par code angal.stat.inpatientdiagnosisin = HMIS 108 - Patients entrant (diagnostic entrée) angal.stat.inpatientdiagnosisout = HMIS 108 - Patients hospitalisé (diagnostic sortie) @@ -1367,6 +1572,8 @@ angal.stat.october angal.stat.opdattendance = HMIS 105 - Présences DDP angal.stat.opdbydiagnosis = HMIS 105 - DDP pour diagnostic angal.stat.opdreferrals = HMIS 105 - DDP références +angal.stat.operationlist = Liste des opérations +angal.stat.operationreport.title = Rapport d'opération angal.stat.outpatientcount = OH005 - Compte des Patient Ambulatoire angal.stat.outpatientdiagnoses = OH006 - Nombre diagnostiques ambulatoire angal.stat.outpatientreport = OH010 - Rapport Ambulatoire @@ -1381,12 +1588,13 @@ angal.stat.report angal.stat.reporterror.msg = Une erreur s'est produite pendant la génération du rapport. angal.stat.reportlauncher.title = Afficher Rapport angal.stat.rundiseaseslistbytype.btn = Rapport Liste Maladies par Type -angal.stat.rundiseaseslistbytype.btn.key = M +angal.stat.rundiseaseslistbytype.btn.key = É angal.stat.runexamslistreportbytype.btn = Rapport Liste Examens par Type -angal.stat.runexamslistreportbytype.btn.key = E +angal.stat.runexamslistreportbytype.btn.key = X +angal.stat.runoperationslistbytype.btn = Rapport de la liste des opérations par type +angal.stat.runoperationslistbytype.btn.key = D angal.stat.september = Septembre angal.stat.sharereportwithnobody.txt = -- Partager le rapport avec: personne -- -angal.stat.todate = À la date angal.stat.weeklyepidemsurveil = HMIS 33b - Surveillance Hebdomadaire épidémiologique angal.stat.weeklyepidemsurveilover5 = HMIS 33b - Moniteur Hebdomadaire épidémiologique >=5 ans angal.stat.weeklyepidemsurveilunder5 = HMIS 33b - Surveillance Hebdomadaire épidémiologique <5 ans @@ -1404,6 +1612,18 @@ angal.supplier.requiredfields angal.supplier.suppliersbrowser.title = Liste Fournisseurs angal.supplier.taxcode = NID angal.supplier.taxcode.col = NID +angal.telemetry.about.txt = Collecter des données d'utilisation anonymes et les envoyer à open-hospital.org +angal.telemetry.body = Veuillez sélectionner le type d'informations que vous souhaitez partager (vous pouvez désactiver le partage à tout moment) +angal.telemetry.button.label.askmelater = Me demander plus tard +angal.telemetry.button.label.disableandneveraskagain = Désactiver et ne plus jamais demander +angal.telemetry.button.label.disable = Désactiver +angal.telemetry.button.label.confirmandsend = Confirmer et envoyer +angal.telemetry.checkbox.label = J'accepte que ces informations soient envoyées automatiquement tous les jours +angal.telemetry.confirmation.dialog.message = Êtes-vous sûr de vouloir envoyer ces informations ? +angal.telemetry.info = Open Hospital est le premier d'une série de logiciels développés par Informatici Senza Frontiere pour soutenir la gestion de l'information et les activités des hôpitaux et des centres de santé de la manière la plus simple possible, en fournissant des outils pour les opérations administratives de l'hôpital (comme l'enregistrement des patients, la gestion des analyses de laboratoire et des stocks de produits pharmaceutiques) et pour produire des statistiques et des rapports détaillés. +angal.telemetry.title = Aidez-nous à améliorer Open Hospital +angal.telemetry.enabled = Activer +angal.telemetry.fmt.confirm.pleaseselecttoproceed = Veuillez sélectionner « {0} » pour continuer. angal.therapy.actions = Actions angal.therapy.addtherapy.btn = Ajoutez une Thérapie angal.therapy.addtherapy.btn.key = A @@ -1475,11 +1695,17 @@ angal.userbrowser.deleteuser.fmt.msg angal.userbrowser.description.label = Description: angal.userbrowser.edituser.title = Modification Usager angal.userbrowser.group.label = Groupe: +angal.userbrowser.locked.col = Verrouillé +angal.userbrowser.locked.label = Verrouillé : angal.userbrowser.name.label = Nom: angal.userbrowser.password.label = Mot de passe: +angal.userbrowser.passwordistoolongmaximumof72characters.msg = Le mot de passe est trop long ; 72 caractères au maximum. angal.userbrowser.passwordmustbeatleast6characters.msg = Le mot de passe doit être au moins 6 caractères; veuillez réessayer. +angal.userbrowser.passwordmustbeatleastncharacters.fmt.msg = Le mot de passe doit comporter au moins {0} caractères ; veuillez réessayer. +angal.userbrowser.passwordmustnotbeblank.msg = Le mot de passe ne doit pas être vide. angal.userbrowser.passwordsdonotmatchpleasecorrect.msg = Les mots de passe ne correspondent pas; veuillez corriger. angal.userbrowser.passwordsdonotmatchpleaseretry.msg = Les mots de passe ne correspondent pas; veuillez réessayer. +angal.userbrowser.passwordsmustcontainatleastonealphabeticnumericandspecialcharacter.msg = Le mot de passe doit contenir au moins un caractère alphabétique, numérique et spécial. angal.userbrowser.pleaseprovideapassword.msg = Veuillez insérer un mot de passe. angal.userbrowser.pleaseprovideavalidusername.msg = Insérer un nom utilisateur valide. angal.userbrowser.pleaseprovidetheretypepassword.msg = Veuillez 'retaper' le mot de passe. @@ -1488,11 +1714,13 @@ angal.userbrowser.resetpassword.btn.key angal.userbrowser.resetpassword.title = Réinitialiser Mot de Passe angal.userbrowser.retype.password.label = Retaper le mot de passe: angal.userbrowser.selectgroup.label = Sélectionner groupe: -angal.userbrowser.step1.pleaseinsertanew.password.label = Veuillez insérer un nouveau mot de passe (min 6 caractères). +angal.userbrowser.step1.pleaseinsertanew.password.msg = Veuillez insérer un nouveau mot de passe. +angal.userbrowser.step1.pleaseinsertanew.password.fmt.msg = Veuillez insérer un nouveau mot de passe (minimum de {0} caractères). angal.userbrowser.step2.pleaserepeatthenewpassword.label = Veuillez répéter le nouveau mot de passe. angal.userbrowser.theadminusercannotbedeleted.msg = L’utilisateur "admin" ne peux pas être supprimé. angal.userbrowser.thepasswordhasbeenchanged.msg = Les mots de passe a été changé. angal.userbrowser.theuseralreadyexists.fmt.msg = L'utilisateur "{0}" existe déjà. +angal.userbrowser.theusernamecontainsinvalidcharacters.msg = The user name must contain only a-z, 0-9, dash, period and underscore characters. angal.userbrowser.title = Liste Usagers angal.userbrowser.user.col = Utilisateur angal.vaccine.deletevaccine.fmt.msg = Supprimer vaccin: {0}? @@ -1519,9 +1747,15 @@ angal.visit.findpatient.btn angal.visit.findpatient.btn.key = C angal.visit.gotodate.btn = Aller à la Date angal.visit.gotodate.btn.key = D +angal.visit.invalidvisitduration.msg = La durée de la visite doit être positive +angal.visit.manyoverlappingpatientvisitsindifferentwards.msg = La visite chevauche les visites de ces patients : {0} angal.visit.nextarrow.btn = Prochain-> angal.visit.nextarrow.btn.key = N +angal.visit.overlappingmanyvisitsinward.msg = La visite chevauche ces visites existantes dans le même service : {0} +angal.visit.overlappingpatientvisitsindifferentwards.msg = La visite chevauche la visite de ce patient dans un service différent : {0} +angal.visit.overlappingvisitinward.msg = La visite chevauche cette visite existante dans le même service : {0} angal.visit.pleasechooseadate.msg = Veuillez choisir une date. +angal.visit.pleasechooseavaliddateandtime.msg = Veuillez choisir une date et une heure valides. angal.visit.pleasechooseapatient.msg = Veuillez choisir un patient. angal.visit.pleasechooseaward.msg = Veuillez choisir un département. angal.visit.pleaseselectapatient.title = Veuillez Sélectionner un Patient @@ -1531,24 +1765,30 @@ angal.visit.printthisdaysvisits2.btn angal.visit.printthisdaysvisits2.btn.key = 2 angal.visit.removevisit.btn = Supprimez Visite angal.visit.removevisit.msg = Supprimez la visite? -angal.visit.selectaward = Sélectionner un Département +angal.visit.selectaward.txt = angal.visit.service = Service +angal.visit.thepatientssexandwarddonotagree.msg = Le sexe du patient et le service ne concordent pas. angal.visit.today.btn = Aujourd'hui angal.visit.today.btn.key = H angal.visit.visits = Visites +angal.visit.ward.border = Re-accouchement angal.visit.worksheet.title = Feuille de Travail angal.ward.beds.col = Lits angal.ward.bedsedit = Nombre de lits * angal.ward.cannotdeletematernityward.msg = Il est impossible de supprimer le département maternité, +angal.ward.cannotdeleteopdward.msg = Impossible de supprimer le service ambulatoire angal.ward.deleteward.fmt.msg = Supprimer département: {0}? angal.ward.doctors.col = Médecins angal.ward.doctorsedit = Nombre de Médecins * +angal.ward.duration.col = Durée angal.ward.editward.title = Modifier Département angal.ward.emailedit = E-mail angal.ward.femaleward = Département Femmes +angal.ward.hasopd.col = Dispose d'un département ambulatoire angal.ward.haspharmacy.col = A-t-il une Pharmacie -angal.ward.insertavalidbedsnumber = Insérer un numéro de lits valide -angal.ward.insertavaliddoctorsnumber = Insérez un nombre de médecins valide +angal.ward.insertavalidbedsnumber = Insérer un nombre valide de lits. +angal.ward.insertavaliddoctorsnumber = Insérez un nombre des docteurs valide +angal.ward.insertavaliddurationvalue.msg = Insérer une valeur valide pour la durée de la visite. angal.ward.insertavalidnursesnumber = Insérez un nombre d'infirmières valide angal.ward.maleward = Département Hommes angal.ward.maternity.txt = Maternité @@ -1556,6 +1796,7 @@ angal.ward.nameedit angal.ward.newward.title = Nouveau Département angal.ward.nurses.col = Infirmières angal.ward.nursesedit = Nombre d'Infirmières * +angal.ward.opd.txt = DDP angal.ward.pleasecheckinadmissionpatients.msg = Contrôle admission / patients. angal.ward.requiredfields = * champs obligatoires angal.ward.theemailmustbevalid.msg = L’e-mail doit être valide. @@ -1563,7 +1804,9 @@ angal.ward.thenumberofbedsmustbepositive.msg angal.ward.thenumberofdoctorsmustbepositive.msg = Le nombre des docteurs doit être positif. angal.ward.thenumberofnursesmustbepositive.msg = Le numéro des infirmières doit être positif. angal.ward.theselectedwardhaspatients.fmt.msg = Le département sélectionné a {0} patients. +angal.ward.visitdurationedit = Durée de la visite * angal.ward.wardbrowser.title = Liste Départements +angal.ward.wardwithopd = Services ambulatoires angal.ward.wardwithpharmacy = Département avec pharmacie angal.wardpharmacy.lotduedate.col = Date échéance Lot angal.wardpharmacy.lotnumber.col = Lot No. @@ -1586,4 +1829,4 @@ angal.xmpp.userinfo.fmt.txt angal.xmpp.usersinfo.border = Informations Usagers angal.xmpp.wantstosharewithyouthisreport.fmt.msg = \n*** {0} veut partager avec vous ce rapport: {1}\n angal.xmpp.wouldliketosend.fmt.msg = {0} voudrais envoyer: \n{1} -angal.xmpp.youhaverejectedthefiletransfer.txt = vous avez refusé le transfert de fichier +angal.xmpp.youhaverejectedthefiletransfer.txt = Vous avez refusé le transfert de fichier. diff --git a/bundle/language_it.properties b/bundle/language_it.properties index ad426e5b2d..29c3906b00 100644 --- a/bundle/language_it.properties +++ b/bundle/language_it.properties @@ -8,6 +8,7 @@ angal.admission.admissionanddischarge.title angal.admission.admissiondate.border = Data Ricovero * angal.admission.admissiondate.txt = Data Ricovero * angal.admission.admissiondatecannotbeempty.msg = La data di ricovero non può essere vuota +angal.admission.admissionpatientcannotbeempty.msg = Il campo Paziente non può essere vuoto angal.admission.admissionstatus.border = Stato Ricovero angal.admission.admissiontype.border = Tipologia Ricovero * angal.admission.admissionwardcannotbeempty.msg = Il reparto non può essere vuoto @@ -179,7 +180,7 @@ angal.admtype.admissiontypenotfound.fmt.msg angal.admtype.delete.fmt.msg = Eliminare il tipo di ammissione: "{0}"? angal.admtype.editadmissiontype.title = Modifica Tipo di Ammissione angal.admtype.newadmissiontype.title = Nuovo Tipo di Ammissione -angal.agepattern.txt = {0}y {1}m {2}d +angal.agepattern.txt = {0}a {1}m {2}g angal.agetype.adolescents = Adolescente angal.agetype.adult = Adulto angal.agetype.agetypebrowser.title = Browser del Tipo di Età @@ -531,7 +532,7 @@ angal.disease.opd angal.disease.selecttype = Seleziona tipologia angal.disease.thediseasisealreadypresent.msg = La malattia è già presente. angal.disease.type = Tipologia -angal.distype.deletediseasetype.fmt.msg = Delete disease type: "{0}"? +angal.distype.deletediseasetype.fmt.msg = Eliminare il tipo di patologia: "{0}"? angal.distype.diseasetypebrowser.title = Lista Tipologie Patologie angal.distype.editdiseasetype.title = Modifica Voce Tipologia Patologia angal.distype.newdiseasetype.title = Nuova Voce di Tipologia Patologia @@ -746,14 +747,14 @@ angal.malnutrition.nodate.msg angal.malnutrition.nonameselected = Nessun nome selezionato. angal.malnutrition.pleaseinsertavalidcontroldate.msg = Si prega di inserire una data di controllo valida. angal.malnutrition.pleaseinsertavalidvisitdate.msg = Si prega di inserire una data di visita valida. -angal.medicals.active.txt = Active -angal.medicals.activeonly.txt = Active only +angal.medicals.active.txt = Attivo +angal.medicals.activeonly.txt = Solo attivi angal.medicals.averagemonthlyconsumption.btn = CMM angal.medicals.averagemonthlyconsumption.btn.key = M angal.medicals.criticallevel.txt = Livello critico angal.medicals.critlevel.col = Livello Crit. angal.medicals.deletemedical.fmt.msg = Elimina medico: {0}? -angal.medicals.disabledonly.txt = Disabled only +angal.medicals.disabledonly.txt = Solo disabilitati angal.medicals.editmedical.title = Modifica Voce di Farmaco angal.medicals.expiring.btn = Scadenza angal.medicals.expiring.btn.key = A @@ -788,22 +789,23 @@ angal.medicals.thismonth angal.medicals.today = Oggi angal.medicals.type = Tipologia angal.medicals.withlot = Con lotti -angal.medicalstock.allcharges.txt = All charges -angal.medicalstock.alldischarges.txt = All discharges +angal.medicalstock.allcharges.txt = Tutti i carichi +angal.medicalstock.alldischarges.txt = Tutti gli scarichi +angal.medicalstock.category.col = Tipologia angal.medicalstock.charge.btn = Carico angal.medicalstock.charge.btn.key = C angal.medicalstock.chooseamedical.msg = Scegli un farmaco. angal.medicalstock.choosealot.msg = Specificare un lotto. angal.medicalstock.chooseavalidduedate.msg = Scegliere una data scadenza valida. -angal.medicalstock.chooseavalidmovementdate.msg = Choose a valid movement date. +angal.medicalstock.chooseavalidmovementdate.msg = Scegli una data movimento valida. angal.medicalstock.chooseavalidpreparationdate = Scegliere una data preparazione valida. angal.medicalstock.clickdrugs = Doppio click per mostrare i dettagli del lotto -angal.medicalstock.codeordescription.txt = Code or Description +angal.medicalstock.codeordescription.txt = Codice o descrizione angal.medicalstock.cost.col = Costo -angal.medicalstock.deletemovementsuccess.msg = Last movement successfully deleted. +angal.medicalstock.deletemovementsuccess.msg = Ultimo movimento eliminato con successo. angal.medicalstock.discharge.btn = Scarico angal.medicalstock.discharge.btn.key = C -angal.medicalstock.notpossibletodeletethismovementthemedicalhasbeenusedafterbeenreceivedinward.fmt.msg = Not possible to delete this movement: the medical {0} has already been used after been received in ward {1}. +angal.medicalstock.notpossibletodeletethismovementthemedicalhasbeenusedafterbeenreceivedinward.fmt.msg = Non è possibile eliminare questo movimento: il prodotto {0} è stato già usato dopo essere stato ricevuto nel reparto {1}. angal.medicalstock.duedate = Data scadenza angal.medicalstock.duedate.col = Data scadenza angal.medicalstock.duedatefromcannotbelaterthanduedateto = La Data Scadenza DA non può essere successiva alla Data Scadenza A. @@ -821,7 +823,7 @@ angal.medicalstock.lotpreparationdate angal.medicalstock.medtype.col = Tipologia Farmaco angal.medicalstock.movement = Movimento angal.medicalstock.movementdatefromcannotbelaterthanmovementdateto = La Data Movimento DA non può essere successiva alla Data Movinemto A. -angal.medicalstock.movementquantityisgreaterthanthequantityof.msg = La quantità in movimento è più grande della quantità del lotto selezionato: dividi il movimento. +angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg = La quantità nel movimento ({0}) è più grande della quantità nel lotto selezionato ({1}); dividere il movimento o cambiare Unità/Scatole angal.medicalstock.multiplecharging.adateinthefutureisnotallowed.msg = Non è consentita una data futura. angal.medicalstock.multiplecharging.chargetype = Tipo Carico angal.medicalstock.multiplecharging.chooseamedical = Selezionare un farmaco @@ -848,7 +850,7 @@ angal.medicalstock.multiplecharging.supplier angal.medicalstock.multiplecharging.theinsertedreferencenumberalreadyexists.msg = Il numero di riferimento inserito esiste già. angal.medicalstock.multiplecharging.totalcost = Costo Totale angal.medicalstock.multiplecharging.unitcost = Costo Unità -angal.medicalstock.multiplecharging.unitpack = Unità/Pacco +angal.medicalstock.multiplecharging.unitpack = Unità/Scatola angal.medicalstock.multiplecharging.units = Unità angal.medicalstock.multiplecharging.useanexistinglot = Usare un lotto esistente? angal.medicalstock.multiplecharging.zerocostsarenotallowed.msg = Non sono ammessi costi zero. @@ -862,7 +864,9 @@ angal.medicalstock.multipledischarging.isabouttoend angal.medicalstock.multipledischarging.lotinformations = Informazioni Lotto angal.medicalstock.multipledischarging.lotnumberabb = Nr. Lotto angal.medicalstock.multipledischarging.lyinginstock = Giacenza +angal.medicalstock.multipledischarging.movementexceedstheavailablequantityformedical.fmt.msg = Il movimento eccede la quantità disponibile ({0}) per il prodotto {1}. angal.medicalstock.multipledischarging.noelementtosave = Nessun elemento da salvare +angal.medicalstock.multipledischarging.nolotswithavailablequantityfoundformedicalpleasereport.fmt.msg = Non sono stati trovati lotti con quantità disponibili per il prodotto {0}; si prega di informare l'amministratore di sistema. angal.medicalstock.multipledischarging.outofstock = Esaurito angal.medicalstock.multipledischarging.packets = Pacchi angal.medicalstock.multipledischarging.pleaseinsertavalidvalue = Inserire un valore valido. @@ -873,20 +877,20 @@ angal.medicalstock.multipledischarging.referencenumber angal.medicalstock.multipledischarging.selectalot = Selezionare un lotto angal.medicalstock.multipledischarging.sharealertwithnobody = -- Condividi evento con: Nessuno -- angal.medicalstock.multipledischarging.thequantityisnotavailable = La quantità non è disponibile -angal.medicalstock.multipledischarging.unitpack = Unità/Pacco +angal.medicalstock.multipledischarging.unitpack = Unità/Scatola angal.medicalstock.multipledischarging.units = Unità angal.medicalstock.multipledischarging.youaregoingundercriticalevel = Stai andando sotto la quantità di LIVELLO CRITICO.. Continuare? angal.medicalstock.nodate = Nessuna Data angal.medicalstock.nodescription.txt = nessuna descrizione angal.medicalstock.nolot.txt = Nessun Lotto -angal.medicalstock.onlythelastmovementcanbedeleted.msg = Only the last movement can be deleted. +angal.medicalstock.onlythelastmovementcanbedeleted.msg = Solo l'ultimo movimento può essere eliminato. angal.medicalstock.origin.col = Origine angal.medicalstock.pharmaceutical = Farmaco angal.medicalstock.pharmaceutical.col = Farmaco angal.medicalstock.pleasechooseatype.msg = Si prega di scegliere un tipo. -angal.medicalstock.pleaseselectamovement.msg = Please select a movement. -angal.medicalstock.pleaseselectonlyonemovement.msg = Please select only one movement. -angal.medicalstock.pleaseselectoucomemovement.msg = Please select an outcome movement. +angal.medicalstock.pleaseselectamovement.msg = Selezionare un movimento. +angal.medicalstock.pleaseselectonlyonemovement.msg = Selezionare un solo movimento. +angal.medicalstock.pleaseselectoucomemovement.msg = Selezionare un movimento di uscita. angal.medicalstock.preparationdatefromcannotbelaterpreparationdateto = La Data Preparazione Da non può essere successiva alla Data Preparazione A angal.medicalstock.prepdate = Data preparazione angal.medicalstock.prepdate.col = Data preparazione @@ -980,6 +984,10 @@ angal.medicalstockwardedit.selectpatient.btn.key angal.medicalstockwardedit.title = Nuovo / Modifica angal.medicalstockwardedit.tooltip.associateapatientwiththismovement = Associa un paziente a questo movimento angal.medicalstockwardedit.tooltip.removepatientassociationwiththismovement = Rimuove il paziente associato a questo movimento +angal.medstockmovtype.allowedcategoriesare.fmt.msg = Le categorie ammesse sono: {0} +angal.medstockmovtype.category.txt = Tipologia +angal.medstockmovtype.category.operational.txt = Operativo +angal.medstockmovtype.category.nonoperational.txt = Non-Operativo angal.medstockmovtype.deletemovementtype.fmt.msg = Elimina tipo di movimento: {0}? angal.medstockmovtype.editmedicalstockmovementtype.title = Modifica il Tipo di Movimento delle Scorte Mediche angal.medstockmovtype.medicalstockmovementtypebrowser.title = Browser del Tipo di Movimento delle Scorte Mediche @@ -1268,7 +1276,7 @@ angal.opd.pleaseselectadisease.msg angal.opd.pleaseselectpatientssex.msg = Si prega di selezionare il sesso del paziente. angal.opd.reattendance.btn = Visita di Controllo angal.opd.reattendance.txt = Visita di Controllo -angal.opd.referral.txt = Referral +angal.opd.referral.txt = Trasferito angal.opd.referralto.txt = Presso altro Ospedale angal.opd.reset.btn = Azzera angal.opd.reset.btn.key = C @@ -1332,8 +1340,8 @@ angal.patient.dead.btn angal.patient.deletepatient.fmt.msg = Elimina paziente: {0}? angal.patient.doyouwanttodeletethepatientsphoto.msg = Vuoi davvero eliminare la foto del paziente? angal.patient.editpatient.title = Modifica Paziente -angal.patient.examination.nonzero.msg = Height or weight must not be zero. -angal.patient.examination.minmaxvalues.msg = Some entered values are equal to their minimum or maximum values. Do you really want to confirm them? +angal.patient.examination.nonzero.msg = Altezza e peso non possono essere zero. +angal.patient.examination.minmaxvalues.msg = Alcuni valori inseriti sono uguali ai loro valori minimi o massimi. Vuoi davvero confermarli? angal.patient.fathername = Nome del padre angal.patient.firstname = Nome * angal.patient.hasinsurance = Assicurazione @@ -1375,7 +1383,7 @@ angal.patient.photonotdeleted angal.patient.pleaseselectasex.msg = Seleziona un sesso. angal.patient.pleaseselectpatientssex.msg = Si prega di selezionare il sesso del paziente. angal.patient.profession = Professione -angal.patient.profession.business.txt = Business +angal.patient.profession.business.txt = Affari angal.patient.profession.construction.txt = Edilizia angal.patient.profession.engineering.txt = Ingegneria angal.patient.profession.farming.txt = Agricoltura @@ -1392,15 +1400,15 @@ angal.patient.secondname angal.patient.sexstar = Sesso * angal.patient.taxcode = Codice Fiscale angal.patient.thepatientisalreadypresent.msg = Il paziente è già presente; continuo? -angal.patient.tobm = TOB +angal.patient.tobm = ABO angal.patient.unknown.btn = Sonosciuto angal.patient.yes.btn = Si -angal.patient.ymd.fmt.msg = {0}y {1}m {2}d +angal.patient.ymd.fmt.msg = {0}a {1}m {2}g angal.patientbill.editpatientbill.fmt.title = Modifica Fattura Paziente: {0} angal.patientbill.newpatientbill.title = Nuova Fattura Paziente angal.patientphoto.file.btn = File angal.patientphoto.file.btn.key = F -angal.patientphoto.imagefiles.txt = Image files +angal.patientphoto.imagefiles.txt = Files immagini angal.patientphoto.newphoto.btn = Nuova Foto angal.patientphoto.newphoto.btn.key = N angal.patvac.agefrommustbelowerthanageto = 'Da anni' deve essere minore di 'Ad anni' @@ -1434,7 +1442,7 @@ angal.patvac.vaccinetype.col angal.photoboothcomponent.capture.btn = Catturare angal.photoboothcomponent.capture.btn.key = C angal.photoboothcomponent.resolution.txt = Risoluzione -angal.photoboothcomponent.webcam.txt = Webcam +angal.photoboothcomponent.webcam.txt = Camera angal.photoframe.originalpicitureresoultion.fmt.txt = Risoluzione immagine originale: {0} angal.photoframe.photopreview.title = Anteprima Foto angal.preagtreattype.deletetreatmenttype.fmt.msg = Elimina tipo di trattamento: {0}? @@ -1712,6 +1720,7 @@ angal.userbrowser.step2.pleaserepeatthenewpassword.label angal.userbrowser.theadminusercannotbedeleted.msg = L'utente "admin" non può essere eliminato. angal.userbrowser.thepasswordhasbeenchanged.msg = La password è stata modificata. angal.userbrowser.theuseralreadyexists.fmt.msg = L'utente "{0}" esiste già. +angal.userbrowser.theusernamecontainsinvalidcharacters.msg = Lo username deve contenere solo lettere minuscole, numeri, trattini, punti e/o sottolinature. angal.userbrowser.title = Browser Utente angal.userbrowser.user.col = Utenti angal.vaccine.deletevaccine.fmt.msg = Elimina vaccino: {0}? diff --git a/bundle/language_sq.properties b/bundle/language_sq.properties index e16f311ca5..9e9c765051 100644 --- a/bundle/language_sq.properties +++ b/bundle/language_sq.properties @@ -8,6 +8,7 @@ angal.admission.admissionanddischarge.title angal.admission.admissiondate.border = Data e pranimit * angal.admission.admissiondate.txt = Data e pranimit * angal.admission.admissiondatecannotbeempty.msg = Data e pranimit nuk mund të jetë bosh +angal.admission.admissionpatientcannotbeempty.msg = Admission patient cannot be empty. angal.admission.admissionstatus.border = Statusi i pranimit angal.admission.admissiontype.border = Lloji i pranimit * angal.admission.admissionwardcannotbeempty.msg = Reparti i pranimit nuk mund të jetë bosh @@ -790,6 +791,7 @@ angal.medicals.type angal.medicals.withlot = Me etapa angal.medicalstock.allcharges.txt = Të gjitha tarifat angal.medicalstock.alldischarges.txt = Të gjitha shkarkimet +angal.medicalstock.category.col = Kategoria angal.medicalstock.charge.btn = Pagesa angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = Zgjidhni një medikament. @@ -821,7 +823,7 @@ angal.medicalstock.lotpreparationdate angal.medicalstock.medtype.col = Lloji medikamentit angal.medicalstock.movement = Lëvizje angal.medicalstock.movementdatefromcannotbelaterthanmovementdateto = Data e Lëvizjes nga nuk mund të jetë më vonë se data e lëvizjes Deri në -angal.medicalstock.movementquantityisgreaterthanthequantityof.msg = Sasia e lëvizjes është më e madhe se sasia e lotit të përzgjedhur; ndani lëvizjen. +angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg = Movement quantity ({0}) is greater than the quantity of the lot selected ({1}); split the movement or adjust Units/Packets. angal.medicalstock.multiplecharging.adateinthefutureisnotallowed.msg = Një datë në të ardhmen nuk lejohet. angal.medicalstock.multiplecharging.chargetype = Lloji i Tarifës angal.medicalstock.multiplecharging.chooseamedical = Zgjidhni një Medikament @@ -862,7 +864,9 @@ angal.medicalstock.multipledischarging.isabouttoend angal.medicalstock.multipledischarging.lotinformations = Informacioni i Lot-it angal.medicalstock.multipledischarging.lotnumberabb = Etapa Nr. angal.medicalstock.multipledischarging.lyinginstock = Gjënden në magazinë: +angal.medicalstock.multipledischarging.movementexceedstheavailablequantityformedical.fmt.msg = Movement exceeds the available quantity ({0}) for medical {1}. angal.medicalstock.multipledischarging.noelementtosave = Asnjë element për ruajtje +angal.medicalstock.multipledischarging.nolotswithavailablequantityfoundformedicalpleasereport.fmt.msg = No lots with available quantity found for medical {0}; please report to system administrator. angal.medicalstock.multipledischarging.outofstock = Nuk ka gjëndje angal.medicalstock.multipledischarging.packets = Paketa angal.medicalstock.multipledischarging.pleaseinsertavalidvalue = Vendosni një datë të vlefshme @@ -980,6 +984,10 @@ angal.medicalstockwardedit.selectpatient.btn.key angal.medicalstockwardedit.title = E re / Redakto angal.medicalstockwardedit.tooltip.associateapatientwiththismovement = Caktoni një pacient me këtë lëvizje angal.medicalstockwardedit.tooltip.removepatientassociationwiththismovement = Hiqni lidhjen e pacientit me këtë lëvizje +angal.medstockmovtype.allowedcategoriesare.fmt.msg = Allowed categories are: {0} +angal.medstockmovtype.category.txt = Kategoria +angal.medstockmovtype.category.operational.txt = Operational +angal.medstockmovtype.category.nonoperational.txt = Non-Operational angal.medstockmovtype.deletemovementtype.fmt.msg = Fshij llojin e lëvizjes: {0}? angal.medstockmovtype.editmedicalstockmovementtype.title = Redakto llojin e lëvizjes së stokut medikal angal.medstockmovtype.medicalstockmovementtypebrowser.title = Shfletuesi i llojeve të lëvizjes së stokut medikal @@ -1712,6 +1720,7 @@ angal.userbrowser.step2.pleaserepeatthenewpassword.label angal.userbrowser.theadminusercannotbedeleted.msg = Përdoruesi "admin" nuk mund të fshihet. angal.userbrowser.thepasswordhasbeenchanged.msg = Fjalëkalimi është ndërruar. angal.userbrowser.theuseralreadyexists.fmt.msg = Përdoruesi "{0}" ekziston tashmë. +angal.userbrowser.theusernamecontainsinvalidcharacters.msg = The user name must contain only a-z, 0-9, dash, period and underscore characters. angal.userbrowser.title = Shfletuesi i Përdoruesve angal.userbrowser.user.col = Përdoruesi angal.vaccine.deletevaccine.fmt.msg = Fshij vaksinën: {0}? diff --git a/bundle/language_zh_CN.properties b/bundle/language_zh_CN.properties index 448f5e94b7..ff072be992 100644 --- a/bundle/language_zh_CN.properties +++ b/bundle/language_zh_CN.properties @@ -8,6 +8,7 @@ angal.admission.admissionanddischarge.title angal.admission.admissiondate.border = 入院日期 * angal.admission.admissiondate.txt = 入院日期 * angal.admission.admissiondatecannotbeempty.msg = 入院日期不可为空. +angal.admission.admissionpatientcannotbeempty.msg = Admission patient cannot be empty. angal.admission.admissionstatus.border = 入院情况 angal.admission.admissiontype.border = 入院类型 * angal.admission.admissionwardcannotbeempty.msg = 病房不可为空. @@ -790,6 +791,7 @@ angal.medicals.type angal.medicals.withlot = 批次 angal.medicalstock.allcharges.txt = All charges angal.medicalstock.alldischarges.txt = All discharges +angal.medicalstock.category.col = 类别 angal.medicalstock.charge.btn = 收费 angal.medicalstock.charge.btn.key = H angal.medicalstock.chooseamedical.msg = 选择医疗. @@ -821,7 +823,7 @@ angal.medicalstock.lotpreparationdate angal.medicalstock.medtype.col = 药品类型 angal.medicalstock.movement = 移动 angal.medicalstock.movementdatefromcannotbelaterthanmovementdateto = 移动日期“从”不能晚于“到” -angal.medicalstock.movementquantityisgreaterthanthequantityof.msg = 移动数量大于已选中批次所包含数量; 拆分移动. +angal.medicalstock.movementquantityisgreaterthanthequantityof.fmt.msg = Movement quantity ({0}) is greater than the quantity of the lot selected ({1}); split the movement or adjust Units/Packets. angal.medicalstock.multiplecharging.adateinthefutureisnotallowed.msg = 禁止未来日期. angal.medicalstock.multiplecharging.chargetype = 收费类型 angal.medicalstock.multiplecharging.chooseamedical = 选择医疗 @@ -862,7 +864,9 @@ angal.medicalstock.multipledischarging.isabouttoend angal.medicalstock.multipledischarging.lotinformations = 批次信息 angal.medicalstock.multipledischarging.lotnumberabb = 批次编号 angal.medicalstock.multipledischarging.lyinginstock = Lying in stock: +angal.medicalstock.multipledischarging.movementexceedstheavailablequantityformedical.fmt.msg = Movement exceeds the available quantity ({0}) for medical {1}. angal.medicalstock.multipledischarging.noelementtosave = 没有需保存成分 +angal.medicalstock.multipledischarging.nolotswithavailablequantityfoundformedicalpleasereport.fmt.msg = No lots with available quantity found for medical {0}; please report to system administrator. angal.medicalstock.multipledischarging.outofstock = 缺货! angal.medicalstock.multipledischarging.packets = 包 angal.medicalstock.multipledischarging.pleaseinsertavalidvalue = 输入有效值 @@ -980,6 +984,10 @@ angal.medicalstockwardedit.selectpatient.btn.key angal.medicalstockwardedit.title = 新开 / 修改 angal.medicalstockwardedit.tooltip.associateapatientwiththismovement = 将一个病人与此移动关联 angal.medicalstockwardedit.tooltip.removepatientassociationwiththismovement = 移除与此移动关联的病人 +angal.medstockmovtype.allowedcategoriesare.fmt.msg = Allowed categories are: {0} +angal.medstockmovtype.category.txt = 类别 +angal.medstockmovtype.category.operational.txt = Operational +angal.medstockmovtype.category.nonoperational.txt = Non-Operational angal.medstockmovtype.deletemovementtype.fmt.msg = 删除移动类型: {0}? angal.medstockmovtype.editmedicalstockmovementtype.title = 修改医药库存移动类型 angal.medstockmovtype.medicalstockmovementtypebrowser.title = 医药库存移动类型浏览 @@ -1712,6 +1720,7 @@ angal.userbrowser.step2.pleaserepeatthenewpassword.label angal.userbrowser.theadminusercannotbedeleted.msg = 不能删除管理员. angal.userbrowser.thepasswordhasbeenchanged.msg = 密码已重置. angal.userbrowser.theuseralreadyexists.fmt.msg = 用户"{0}" 已存在. +angal.userbrowser.theusernamecontainsinvalidcharacters.msg = The user name must contain only a-z, 0-9, dash, period and underscore characters. angal.userbrowser.title = 用户浏览 angal.userbrowser.user.col = 用户 angal.vaccine.deletevaccine.fmt.msg = 删除疫苗: {0}? diff --git a/rpt_base/operationslist_fr.properties b/rpt_base/operationslist_fr.properties new file mode 100644 index 0000000000..bca50fbf18 --- /dev/null +++ b/rpt_base/operationslist_fr.properties @@ -0,0 +1,8 @@ +#Generated by Eclipse Messages Editor (Eclipse Babel) + +Operation.Type = Intervention / Typologie + +Operations.List = Liste Interventions + +InOut.Patient = Patient hospitalisé / ambulatoire + diff --git a/rpt_base/patient_opd_chart_fr.properties b/rpt_base/patient_opd_chart_fr.properties index 20372e688c..5ab6974ab6 100644 --- a/rpt_base/patient_opd_chart_fr.properties +++ b/rpt_base/patient_opd_chart_fr.properties @@ -5,3 +5,19 @@ DoctorSignature = Signature Médecin OpdChart = DDP RAPPORT version = version + +Id = ID + +Date = Date + +Time = Heure + +Type = Typologie + +ClinicalRemarks = Remarques cliniques + +Diagnosis = diagnostic + +SecondDiagnosis = Deuxième diagnostic + +ThirdDiagnosis = Troisième diagnostic diff --git a/rpt_extra/MOH705A_Under_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet_fr.properties b/rpt_extra/MOH705A_Under_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet_fr.properties index c10920c3cb..4b13fd78b0 100644 --- a/rpt_extra/MOH705A_Under_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet_fr.properties +++ b/rpt_extra/MOH705A_Under_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet_fr.properties @@ -15,3 +15,5 @@ Totals = Totales Under5YearsDailyOutpatientMorbiditySummarySheet = MOINS QUE 5 ANS - AMBULATOIRE FEUILLE RÉCAPITULATIVE MORBIDITÉ JOURNALIÈRE Year = ANNÉE + +jTitle = MOH 705A - Moins de 5 ans - Feuille de résumé quotidien de la morbidité en consultation externe diff --git a/rpt_extra/MOH705B_Over_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet_fr.properties b/rpt_extra/MOH705B_Over_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet_fr.properties index 904023d7ad..d10cb1806e 100644 --- a/rpt_extra/MOH705B_Over_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet_fr.properties +++ b/rpt_extra/MOH705B_Over_5_Years_Daily_Outpatient_Morbidity_Summary_Sheet_fr.properties @@ -17,3 +17,5 @@ RepublicOfKenyaMinistryOfHealth = MINISTÈRE DE LA ANTE Totals = Totales Year = ANNÉE + +jTitle = MOH 705B - Plus de 5 ans - Feuille de résumé quotidien de la morbidité chez les patients ambulatoires diff --git a/rpt_extra/MOH717_Monthly_Workload_Report_for_Hospitals_page2b_fr.properties b/rpt_extra/MOH717_Monthly_Workload_Report_for_Hospitals_page2b_fr.properties index 7fc9d8a5dc..793fccbec6 100644 --- a/rpt_extra/MOH717_Monthly_Workload_Report_for_Hospitals_page2b_fr.properties +++ b/rpt_extra/MOH717_Monthly_Workload_Report_for_Hospitals_page2b_fr.properties @@ -82,4 +82,4 @@ XRayNumberOfExaminations = X-Ray - Nombre d'Examens YRS = ANNEES -jTitle = MOH 717 - Monthly Workload Report For Hospitals (page 2b) +jTitle = MOH 717 - Rapport mensuel sur la charge de travail des hôpitaux (page 2b) diff --git a/rpt_extra/hmis033_weekly_epid_surv_over_5_fr.properties b/rpt_extra/hmis033_weekly_epid_surv_over_5_fr.properties index 594d4c8a77..2d27c0424b 100644 --- a/rpt_extra/hmis033_weekly_epid_surv_over_5_fr.properties +++ b/rpt_extra/hmis033_weekly_epid_surv_over_5_fr.properties @@ -17,3 +17,5 @@ In.Patient.Diag.Out = Patient hospitalisé (diag sortie) Out.Patient = Patient Ambulatoire To.DateYear = À DateAnnée + +jTitle = HMIS 33b - Surveillance épidémiologique hebdomadaire des plus de 5 ans diff --git a/rpt_extra/hmis033_weekly_epid_surv_under_5_fr.properties b/rpt_extra/hmis033_weekly_epid_surv_under_5_fr.properties index 7dba3bbe90..0d6350c428 100644 --- a/rpt_extra/hmis033_weekly_epid_surv_under_5_fr.properties +++ b/rpt_extra/hmis033_weekly_epid_surv_under_5_fr.properties @@ -4,7 +4,7 @@ Cases = Cas Dead = Décédé -Diagnosis = Diagnostique +Diagnosis = diagnostic From.Date = Du jour @@ -17,3 +17,5 @@ In.Patient.Diag.Out = Patient hospitalisé (diag sortie) Out.Patient = Patient Ambulatoire To.DateYear = À DateAnnée + +jTitle = HMIS 33b - Surveillance épidémiologique hebdomadaire des plus de 5 ans diff --git a/rpt_extra/hmis055b_lab_monthly_formatted_fr.properties b/rpt_extra/hmis055b_lab_monthly_formatted_fr.properties index 29bd3dcb6c..9a65d84f6c 100644 --- a/rpt_extra/hmis055b_lab_monthly_formatted_fr.properties +++ b/rpt_extra/hmis055b_lab_monthly_formatted_fr.properties @@ -31,3 +31,5 @@ Total.Tests.Done = Total des tests effectués Urine = Urine Year = Année + +jTitle = HMIS 55b - Tests de laboratoire diff --git a/rpt_extra/hmis105_opd_attendance_fr.properties b/rpt_extra/hmis105_opd_attendance_fr.properties index 74edef0c90..b90e81d865 100644 --- a/rpt_extra/hmis105_opd_attendance_fr.properties +++ b/rpt_extra/hmis105_opd_attendance_fr.properties @@ -17,3 +17,5 @@ Month = Mois Under.Five.Years.Older = Âgé moins de cinq ans Year = Année + +jTitle = HMIS 105 - Présence à la consultation ambulatoire diff --git a/rpt_extra/hmis105_opd_referrals_fr.properties b/rpt_extra/hmis105_opd_referrals_fr.properties index a287593b18..43f10b4183 100644 --- a/rpt_extra/hmis105_opd_referrals_fr.properties +++ b/rpt_extra/hmis105_opd_referrals_fr.properties @@ -17,3 +17,5 @@ Month = Mois Under.Five.Years.Older = Âgé moins de cinq ans Year = Année + +jTitle = HMIS 105 - Références ambulatoire diff --git a/rpt_extra/hmis108_cover_fr.properties b/rpt_extra/hmis108_cover_fr.properties index d589f7d0c1..60e3a8db3f 100644 --- a/rpt_extra/hmis108_cover_fr.properties +++ b/rpt_extra/hmis108_cover_fr.properties @@ -25,3 +25,5 @@ ReportVersionPatientDaysDischargedThisMonthDaysDismissionMinusAdmissionPlusOne = To = À: ePatientDays = (E)\nJours Patient + +jTitle = HMIS 108 - Rapport mensuel sur les patients hospitalisés diff --git a/rpt_extra/hmis108_operations_fr.properties b/rpt_extra/hmis108_operations_fr.properties index 6e2a9c7131..072a539b9b 100644 --- a/rpt_extra/hmis108_operations_fr.properties +++ b/rpt_extra/hmis108_operations_fr.properties @@ -21,3 +21,6 @@ TotalCount = Total count Undefined = Non definé Year = Année + +jTitle = HMIS 108 - Rapport mensuel d'activité + diff --git a/rpt_stat/BillsReportMonthlyWard_fr.properties b/rpt_stat/BillsReportMonthlyWard_fr.properties new file mode 100644 index 0000000000..c0e2e92bcf --- /dev/null +++ b/rpt_stat/BillsReportMonthlyWard_fr.properties @@ -0,0 +1,23 @@ +#Generated by Eclipse Messages Editor (Eclipse Babel) + +Billed.Income = Facturé / Revenue + +Cash.Collections = Encaissements + +Month = Mois + +Receivable = Recevable + +Report.From = Rapport de + +To = À + +Periodic.Incomes.Billed.And.Receivables.Report = Rapport periodique Entrées / Facturé et Recevables + +Month.Summary.per.Ward = (synthèse mensuelle par service) + +Summary = Synthèse + +OPD.wards = Services ambulatoires + +jTitle = OH011D - Recettes, revenus et créances (service / mois) diff --git a/rpt_stat/OH005_opd_count_monthly_report_fr.properties b/rpt_stat/OH005_opd_count_monthly_report_fr.properties index b0018f98c0..c40f8a4297 100644 --- a/rpt_stat/OH005_opd_count_monthly_report_fr.properties +++ b/rpt_stat/OH005_opd_count_monthly_report_fr.properties @@ -12,4 +12,6 @@ age = âge category = category -sex = sexe \ No newline at end of file +sex = sexe + +jTitle = OH005 - Nombre de patients ambulatoires par âge et par sexe diff --git a/rpt_stat/OH007_lab_monthly_report_fr.properties b/rpt_stat/OH007_lab_monthly_report_fr.properties index eb9a649d5a..a2907e8770 100644 --- a/rpt_stat/OH007_lab_monthly_report_fr.properties +++ b/rpt_stat/OH007_lab_monthly_report_fr.properties @@ -22,4 +22,6 @@ Negative = Négatif TotalTestsDone = Total des tests effectués -TestsDone = Tests effectués \ No newline at end of file +TestsDone = Tests effectués + +jTitle = OH007 - Rapport mensuel du laboratoire diff --git a/rpt_stat/OH007_lab_result_report_fr.properties b/rpt_stat/OH007_lab_result_report_fr.properties index 50c39b0531..d1b17f7d65 100644 --- a/rpt_stat/OH007_lab_result_report_fr.properties +++ b/rpt_stat/OH007_lab_result_report_fr.properties @@ -16,4 +16,6 @@ Address=Adresse Page=Page -of=sur \ No newline at end of file +of=sur + +jTitle = OH007 - Rapport de résultats de laboratoire diff --git a/rpt_stat/OH008_lab_summary_for_opd_fr.properties b/rpt_stat/OH008_lab_summary_for_opd_fr.properties index 9a54095b53..bd0f777aa1 100644 --- a/rpt_stat/OH008_lab_summary_for_opd_fr.properties +++ b/rpt_stat/OH008_lab_summary_for_opd_fr.properties @@ -26,4 +26,6 @@ Male = M Female = T -TestDone = Test effectué \ No newline at end of file +TestDone = Test effectué + +jTitle = OH008 - Rapport mensuel de laboratoire (ambulatoire uniquement) From f74ea924719163a4457f22b49dab3691b1408e1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 04:27:56 +0000 Subject: [PATCH 64/86] Chore(deps): Bump license.maven.plugin.version from 4.5 to 4.6 Bumps `license.maven.plugin.version` from 4.5 to 4.6. Updates `com.mycila:license-maven-plugin-git` from 4.5 to 4.6 - [Release notes](https://github.com/mathieucarbou/license-maven-plugin/releases) - [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.5...license-maven-plugin-4.6) Updates `com.mycila:license-maven-plugin` from 4.5 to 4.6 - [Release notes](https://github.com/mathieucarbou/license-maven-plugin/releases) - [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.5...license-maven-plugin-4.6) --- updated-dependencies: - dependency-name: com.mycila:license-maven-plugin-git dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.mycila:license-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3775d3defb..2372cb9fbc 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ 1.14.2-SNAPSHOT 17 UTF-8 - 4.5 + 4.6 From 6b97e835f06fc089b621a252709c137ed464513e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 20:13:44 +0000 Subject: [PATCH 65/86] Chore(deps-dev): Bump org.junit.jupiter:junit-jupiter-engine Bumps [org.junit.jupiter:junit-jupiter-engine](https://github.com/junit-team/junit5) from 5.10.3 to 5.11.1. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.3...r5.11.1) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b8c495c520..086c6a89a3 100644 --- a/pom.xml +++ b/pom.xml @@ -336,7 +336,7 @@ org.junit.jupiter junit-jupiter-engine - 5.10.3 + 5.11.1 test From 354ae30662a6ebab07bb5699ad954d292289b4d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 20:17:21 +0000 Subject: [PATCH 66/86] Chore(deps-dev): Bump org.mockito:mockito-junit-jupiter Bumps [org.mockito:mockito-junit-jupiter](https://github.com/mockito/mockito) from 5.12.0 to 5.14.1. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.12.0...v5.14.1) --- updated-dependencies: - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b8c495c520..bd308b89a9 100644 --- a/pom.xml +++ b/pom.xml @@ -348,7 +348,7 @@ org.mockito mockito-junit-jupiter - 5.12.0 + 5.14.1 test From 83d1534986ab5e09cf675e72a2f4b2149f9e2028 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 11:46:51 +0000 Subject: [PATCH 67/86] Chore(deps): Bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.4.0...surefire-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 52c6c70e4a..56d8fda0f3 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.4.0 + 3.5.0 org.apache.maven.plugins From 8876f0fdc2347b4f649a2f637a8db200ad93b65a Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Wed, 2 Oct 2024 15:02:01 -0400 Subject: [PATCH 68/86] OP-1344: dialog method takes bundle key and not the final text (#2060) --- src/main/java/org/isf/stat/gui/report/DisplayReport.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/isf/stat/gui/report/DisplayReport.java b/src/main/java/org/isf/stat/gui/report/DisplayReport.java index 644dd800b7..6bfde5c442 100644 --- a/src/main/java/org/isf/stat/gui/report/DisplayReport.java +++ b/src/main/java/org/isf/stat/gui/report/DisplayReport.java @@ -25,7 +25,6 @@ import java.util.Locale; import org.isf.generaldata.GeneralData; -import org.isf.generaldata.MessageBundle; import org.isf.stat.dto.JasperReportResultDto; import org.isf.utils.jobjects.MessageDialog; @@ -35,7 +34,7 @@ public class DisplayReport { protected void showReport(JasperReportResultDto jasperReportResultDto) throws IOException { if (jasperReportResultDto.getJasperPrint().getPages().isEmpty()) { - MessageDialog.info(null, MessageBundle.getMessage("angal.common.documenthasnopages.msg")); + MessageDialog.info(null, "angal.common.documenthasnopages.msg"); return; } if (GeneralData.INTERNALVIEWER) { From 440c2bdd07300f29b4b2fb6e645d35cdbe2b71a0 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Fri, 4 Oct 2024 12:34:03 +0200 Subject: [PATCH 69/86] Fix one label (#2061) --- .../java/org/isf/telemetry/gui/TelemetryEdit.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/isf/telemetry/gui/TelemetryEdit.java b/src/main/java/org/isf/telemetry/gui/TelemetryEdit.java index 07f70f4e78..497418c7cb 100644 --- a/src/main/java/org/isf/telemetry/gui/TelemetryEdit.java +++ b/src/main/java/org/isf/telemetry/gui/TelemetryEdit.java @@ -174,8 +174,7 @@ private JButton buildCloseButton() { } /** - * We could load checkboxes information from somewhere (properties file or from - * other strange places) + * We could load checkboxes information from somewhere (properties file or from other strange places) * * @return */ @@ -208,8 +207,7 @@ private List buildPermissionCheckboxes(ApplicationContext appli } /** - * Action for confirmation button: inserts for the first time in the telemetry - * table or updates the existing row + * Action for confirmation button: inserts for the first time in the telemetry table or updates the existing row * * @param checkboxes * @param telemetryManager @@ -223,8 +221,8 @@ public void actionPerformed(ActionEvent e) { if (!agreementCheckbox.isSelected()) { MessageDialog.info(TelemetryEdit.this, - MessageBundle.formatMessage("angal.telemetry.fmt.confirm.pleaseselecttoproceed", - MessageBundle.getMessage(KEY_TELEMETRY_CHECKBOX))); + "angal.telemetry.fmt.confirm.pleaseselecttoproceed", + MessageBundle.getMessage(KEY_TELEMETRY_CHECKBOX)); return; } Map consentMap = buildConsentData(checkboxes); @@ -244,7 +242,7 @@ public void actionPerformed(ActionEvent e) { return; } } catch (RuntimeException | OHException f) { - LOGGER.error("Something strange happened: {}", f.getMessage()); + LOGGER.error("Something strange happened: {}", f.getMessage()); LOGGER.debug(f.getMessage(), f); } } else { From 0afa5677b5e390f8c32a31fb97b099a65b1bec9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 04:28:49 +0000 Subject: [PATCH 70/86] Chore(deps-dev): Bump org.junit.jupiter:junit-jupiter-engine Bumps [org.junit.jupiter:junit-jupiter-engine](https://github.com/junit-team/junit5) from 5.11.1 to 5.11.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.11.1...r5.11.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 56d8fda0f3..ed7117a872 100644 --- a/pom.xml +++ b/pom.xml @@ -336,7 +336,7 @@ org.junit.jupiter junit-jupiter-engine - 5.11.1 + 5.11.2 test From 8a3a33f1dec9921b9f27d31f57af2d15d5448957 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 04:28:54 +0000 Subject: [PATCH 71/86] Chore(deps): Bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.5.0 to 3.5.1. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.5.0...surefire-3.5.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 56d8fda0f3..4b247d7ad9 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.5.0 + 3.5.1 org.apache.maven.plugins From 3dab79ee331f0a678b216c2f59ac44486eb04f0e Mon Sep 17 00:00:00 2001 From: Steve Tsala <45661418+SteveGT96@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:38:30 +0100 Subject: [PATCH 72/86] OP-1351 | Update operation opeFor field (#2062) * update(OP-1351): Update operation opeFor field * fix: Update operation target enum --------- Co-authored-by: SteveGT96 --- .../isf/operation/gui/OperationBrowser.java | 90 ++++++------ .../org/isf/operation/gui/OperationEdit.java | 134 ++++++++---------- 2 files changed, 97 insertions(+), 127 deletions(-) diff --git a/src/main/java/org/isf/operation/gui/OperationBrowser.java b/src/main/java/org/isf/operation/gui/OperationBrowser.java index 4c9fbeb4cf..3e1342d8dd 100644 --- a/src/main/java/org/isf/operation/gui/OperationBrowser.java +++ b/src/main/java/org/isf/operation/gui/OperationBrowser.java @@ -42,6 +42,7 @@ import org.isf.generaldata.MessageBundle; import org.isf.menu.manager.Context; +import org.isf.operation.enums.OperationTarget; import org.isf.operation.gui.OperationEdit.OperationListener; import org.isf.operation.manager.OperationBrowserManager; import org.isf.operation.model.Operation; @@ -53,62 +54,38 @@ import org.isf.utils.jobjects.ModalJFrame; /** - * This class shows a list of operations. It is possible to filter data with a - * selection combo box and edit-insert-delete records - * + * This class shows a list of operations. It is possible to filter data with a selection combo box and edit-insert-delete records * @author Rick, Vero, Pupo */ public class OperationBrowser extends ModalJFrame implements OperationListener { - private static final long serialVersionUID = 1L; - private static final String STR_ALL = MessageBundle.getMessage("angal.common.all.txt").toUpperCase(); - - @Override - public void operationInserted(AWTEvent e) { - pOperation.add(0, operation); - ((OperationBrowserModel) table.getModel()).fireTableDataChanged(); - if (table.getRowCount() > 0) { - table.setRowSelectionInterval(0, 0); - } - } - - @Override - public void operationUpdated(AWTEvent e) { - pOperation.set(selectedrow, operation); - ((OperationBrowserModel) table.getModel()).fireTableDataChanged(); - table.updateUI(); - if ((table.getRowCount() > 0) && selectedrow > -1) { - table.setRowSelectionInterval(selectedrow, selectedrow); - } - } - //TODO: replace with mapping mnemonic / translation in OperationBrowserManager public static final String OPD = MessageBundle.getMessage("angal.admission.opd.txt").toUpperCase(); public static final String ADMISSION = MessageBundle.getMessage("angal.admission.admission.txt").toUpperCase(); public static final String OPD_ADMISSION = OPD + " / " + ADMISSION; - + private static final long serialVersionUID = 1L; + private static final String STR_ALL = MessageBundle.getMessage("angal.common.all.txt").toUpperCase(); private static final int pfrmBase = 8; private static final int pfrmWidth = 5; private static final int pfrmHeight = 5; private int selectedrow; - private JComboBox diseaseTypeFilter; + private final JComboBox diseaseTypeFilter; private List pOperation; - private String[] pColumns = { - MessageBundle.getMessage("angal.common.id.txt").toUpperCase(), - MessageBundle.getMessage("angal.common.type.txt").toUpperCase(), - MessageBundle.getMessage("angal.common.name.txt").toUpperCase(), - MessageBundle.getMessage("angal.operation.operationcontext.col").toUpperCase() + private final String[] pColumns = { + MessageBundle.getMessage("angal.common.id.txt").toUpperCase(), + MessageBundle.getMessage("angal.common.type.txt").toUpperCase(), + MessageBundle.getMessage("angal.common.name.txt").toUpperCase(), + MessageBundle.getMessage("angal.operation.operationcontext.col").toUpperCase() }; - private int[] pColumnWidth = { 50, 180, 200, 100 }; + private final int[] pColumnWidth = { 50, 180, 200, 100 }; private Operation operation; private DefaultTableModel model; - private JTable table; - private JFrame myFrame; + private final JTable table; + private final JFrame myFrame; private String pSelection; - - private OperationBrowserManager operationBrowserManager = Context.getApplicationContext().getBean(OperationBrowserManager.class); - private OperationTypeBrowserManager operationTypeBrowserManager = Context.getApplicationContext().getBean(OperationTypeBrowserManager.class); - + private final OperationBrowserManager operationBrowserManager = Context.getApplicationContext().getBean(OperationBrowserManager.class); + private final OperationTypeBrowserManager operationTypeBrowserManager = Context.getApplicationContext().getBean(OperationTypeBrowserManager.class); + public OperationBrowser() { setTitle(MessageBundle.getMessage("angal.operation.operationsbrowser.title")); @@ -117,7 +94,7 @@ public OperationBrowser() { int pfrmBordX = (screensize.width - (screensize.width / pfrmBase * pfrmWidth)) / 2; int pfrmBordY = (screensize.height - (screensize.height / pfrmBase * pfrmHeight)) / 2; this.setBounds(pfrmBordX, pfrmBordY, screensize.width / pfrmBase * pfrmWidth, - screensize.height / pfrmBase * pfrmHeight); + screensize.height / pfrmBase * pfrmHeight); myFrame = this; model = new OperationBrowserModel(); table = new JTable(model); @@ -214,6 +191,23 @@ public OperationBrowser() { setVisible(true); } + @Override + public void operationInserted(AWTEvent e) { + pOperation.add(0, operation); + ((OperationBrowserModel) table.getModel()).fireTableDataChanged(); + if (table.getRowCount() > 0) { + table.setRowSelectionInterval(0, 0); + } + } + @Override + public void operationUpdated(AWTEvent e) { + pOperation.set(selectedrow, operation); + ((OperationBrowserModel) table.getModel()).fireTableDataChanged(); + table.updateUI(); + if ((table.getRowCount() > 0) && selectedrow > -1) { + table.setRowSelectionInterval(selectedrow, selectedrow); + } + } class OperationBrowserModel extends DefaultTableModel { @@ -257,7 +251,7 @@ public int getColumnCount() { @Override public Object getValueAt(int r, int c) { Operation operation = pOperation.get(r); - String p = operation.getOpeFor(); + OperationTarget opeFor = operation.getOpeFor(); if (c == 0) { return operation.getCode(); } else if (c == -1) { @@ -267,14 +261,12 @@ public Object getValueAt(int r, int c) { } else if (c == 2) { return operation.getDescription(); } else if (c == 3) { // TODO: use bundles - if (p != null) { - if (p.equals("1")) { - return OPD_ADMISSION; - } else if (p.equals("2")) { - return ADMISSION; - } else { - return OPD; - } + if (opeFor != null) { + return switch (opeFor) { + case admission -> ADMISSION; + case opd -> OPD; + default -> OPD_ADMISSION; + }; } else { return MessageBundle.getMessage("angal.common.notdefined.txt"); } diff --git a/src/main/java/org/isf/operation/gui/OperationEdit.java b/src/main/java/org/isf/operation/gui/OperationEdit.java index 02a3b2055e..cd07434b18 100644 --- a/src/main/java/org/isf/operation/gui/OperationEdit.java +++ b/src/main/java/org/isf/operation/gui/OperationEdit.java @@ -42,6 +42,7 @@ import org.isf.generaldata.MessageBundle; import org.isf.menu.manager.Context; +import org.isf.operation.enums.OperationTarget; import org.isf.operation.manager.OperationBrowserManager; import org.isf.operation.model.Operation; import org.isf.opetype.manager.OperationTypeBrowserManager; @@ -58,22 +59,38 @@ public class OperationEdit extends JDialog { private static final long serialVersionUID = 1L; - private EventListenerList operationListeners = new EventListenerList(); - - public interface OperationListener extends EventListener { - void operationUpdated(AWTEvent e); - - void operationInserted(AWTEvent e); + private final EventListenerList operationListeners = new EventListenerList(); + private final OperationBrowserManager operationBrowserManager = Context.getApplicationContext().getBean(OperationBrowserManager.class); + private final OperationTypeBrowserManager operationTypeBrowserManager = Context.getApplicationContext().getBean(OperationTypeBrowserManager.class); + private final Operation operation; + private final boolean insert; + private JPanel jContentPane; + private JPanel dataPanel; + private JPanel buttonPanel; + private JButton cancelButton; + private JButton okButton; + private JTextField descriptionTextField; + private JTextField codeTextField; + private JComboBox operationTypeComboBox; + private String lastdescription; + private JRadioButton major; + private JPanel radioButtonPanel; + private JComboBox opeForBox; + /** + * This is the default constructor; we pass the arraylist and the selectedrow because we need to update them + */ + public OperationEdit(JFrame parent, Operation old, boolean inserting) { + super(parent, true); + insert = inserting; + operation = old; // operation will be used for every operation + initialize(); } - public void addOperationListener(OperationListener l) { operationListeners.add(OperationListener.class, l); } - public void removeOperationListener(OperationListener listener) { operationListeners.remove(OperationListener.class, listener); } - private void fireOperationInserted() { AWTEvent event = new AWTEvent(new Object(), AWTEvent.RESERVED_ID_MAX + 1) { @@ -85,7 +102,6 @@ private void fireOperationInserted() { ((OperationListener) listener).operationInserted(event); } } - private void fireOperationUpdated() { AWTEvent event = new AWTEvent(new Object(), AWTEvent.RESERVED_ID_MAX + 1) { @@ -97,36 +113,6 @@ private void fireOperationUpdated() { ((OperationListener) listener).operationUpdated(event); } } - - private OperationBrowserManager operationBrowserManager = Context.getApplicationContext().getBean(OperationBrowserManager.class); - private OperationTypeBrowserManager operationTypeBrowserManager = Context.getApplicationContext().getBean(OperationTypeBrowserManager.class); - - private JPanel jContentPane; - private JPanel dataPanel; - private JPanel buttonPanel; - private JButton cancelButton; - private JButton okButton; - private JTextField descriptionTextField; - private JTextField codeTextField; - private JComboBox operationTypeComboBox; - private String lastdescription; - private Operation operation; - private JRadioButton major; - private JPanel radioButtonPanel; - private boolean insert; - private JComboBox operBox; - - /** - * This is the default constructor; we pass the arraylist and the selectedrow - * because we need to update them - */ - public OperationEdit(JFrame parent, Operation old, boolean inserting) { - super(parent, true); - insert = inserting; - operation = old; // operation will be used for every operation - initialize(); - } - /** * This method initializes this */ @@ -141,10 +127,8 @@ private void initialize() { pack(); setLocationRelativeTo(null); } - /** * This method initializes jContentPane - * * @return javax.swing.JPanel */ private JPanel getJContentPane() { @@ -156,10 +140,8 @@ private JPanel getJContentPane() { } return jContentPane; } - /** * This method initializes dataPanel - * * @return javax.swing.JPanel */ private JPanel getDataPanel() { @@ -179,35 +161,33 @@ private JPanel getDataPanel() { dataPanel.add(new JLabel("")); dataPanel.add(getRadioButtonPanel()); dataPanel.add(operForLabel); - dataPanel.add(getOperFor()); + dataPanel.add(getOpeFor()); SpringUtilities.makeCompactGrid(dataPanel, 5, 2, 5, 5, 5, 5); } return dataPanel; } + private JComboBox getOpeFor() { - private JComboBox getOperFor() { - - operBox = new JComboBox<>(); + opeForBox = new JComboBox<>(); //TODO: replace integer values with mnemonic ones - operBox.addItem(OperationBrowser.OPD_ADMISSION); // = "1" - operBox.addItem(OperationBrowser.ADMISSION); // = "2" - operBox.addItem(OperationBrowser.OPD); // = "3" - + opeForBox.addItem(OperationBrowser.OPD_ADMISSION); + opeForBox.addItem(OperationBrowser.ADMISSION); + opeForBox.addItem(OperationBrowser.OPD); + if (!insert) { - int index = operation.getOpeFor().equals("1") ? 0 - : operation.getOpeFor().equals("2") ? 1 - : operation.getOpeFor().equals("3") ? 2 - : 0; // default - operBox.setSelectedIndex(index); + int index = switch (operation.getOpeFor()) { + case admission -> 1; + case opd -> 2; + default -> 0; + }; + opeForBox.setSelectedIndex(index); } - return operBox; + return opeForBox; } - /** * This method initializes buttonPanel - * * @return javax.swing.JPanel */ private JPanel getButtonPanel() { @@ -218,10 +198,8 @@ private JPanel getButtonPanel() { } return buttonPanel; } - /** * This method initializes cancelButton - * * @return javax.swing.JButton */ private JButton getCancelButton() { @@ -232,10 +210,8 @@ private JButton getCancelButton() { } return cancelButton; } - /** * This method initializes okButton - * * @return javax.swing.JButton */ private JButton getOkButton() { @@ -268,12 +244,16 @@ private JButton getOkButton() { } else { if (operationBrowserManager.descriptionControl(descriptionTextField.getText(), - ((OperationType) operationTypeComboBox.getSelectedItem()).getCode())) { + ((OperationType) operationTypeComboBox.getSelectedItem()).getCode())) { MessageDialog.error(null, "angal.operation.operationalreadypresent"); return; } } - String opeForSelection = String.valueOf(operBox.getSelectedIndex()+1); + OperationTarget opeForSelection = switch (opeForBox.getSelectedIndex()) { + case 1 -> OperationTarget.admission; + case 2 -> OperationTarget.opd; + default -> OperationTarget.opd_admission; + }; operation.setOpeFor(opeForSelection); operation.setType((OperationType) operationTypeComboBox.getSelectedItem()); operation.setDescription(descriptionTextField.getText()); @@ -300,8 +280,7 @@ private JButton getOkButton() { } if (!result) { MessageDialog.error(null, "angal.common.datacouldnotbesaved.msg"); - } - else { + } else { dispose(); } } catch (OHServiceException ex) { @@ -311,10 +290,8 @@ private JButton getOkButton() { } return okButton; } - /** * This method initializes descriptionTextField - * * @return javax.swing.JTextField */ private JTextField getDescriptionTextField() { @@ -327,10 +304,8 @@ private JTextField getDescriptionTextField() { } return descriptionTextField; } - /** * This method initializes radioButtonPanel - * * @return javax.swing.JPanel */ private JPanel getRadioButtonPanel() { @@ -364,17 +339,14 @@ private JPanel getRadioButtonPanel() { } return radioButtonPanel; } - private JRadioButton getRadioButton(String label, boolean active) { JRadioButton rb = new JRadioButton(label); rb.setSelected(active); rb.setName(label); return rb; } - /** * This method initializes codeTextField - * * @return javax.swing.JTextField */ private JTextField getCodeTextField() { @@ -387,10 +359,8 @@ private JTextField getCodeTextField() { } return codeTextField; } - /** * This method initializes operationTypeComboBox - * * @return javax.swing.JComboBox */ private JComboBox getOperationTypeComboBox() { @@ -413,7 +383,8 @@ private JComboBox getOperationTypeComboBox() { selectedOperationType = elem; } } - } if (selectedOperationType != null) { + } + if (selectedOperationType != null) { operationTypeComboBox.setSelectedItem(selectedOperationType); } } @@ -425,4 +396,11 @@ private JComboBox getOperationTypeComboBox() { return operationTypeComboBox; } + public interface OperationListener extends EventListener { + + void operationUpdated(AWTEvent e); + + void operationInserted(AWTEvent e); + } + } From d5cee70a0283cd5e2f426c3c1767924e91081e6e Mon Sep 17 00:00:00 2001 From: mwithi Date: Fri, 11 Oct 2024 00:28:06 +0200 Subject: [PATCH 73/86] Update Eclipse code style --- .ide-settings/eclipse/OpenHospital-Java-CodeStyle-Formatter.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ide-settings/eclipse/OpenHospital-Java-CodeStyle-Formatter.xml b/.ide-settings/eclipse/OpenHospital-Java-CodeStyle-Formatter.xml index 3ad7b0d08d..bae456b72e 100755 --- a/.ide-settings/eclipse/OpenHospital-Java-CodeStyle-Formatter.xml +++ b/.ide-settings/eclipse/OpenHospital-Java-CodeStyle-Formatter.xml @@ -212,7 +212,7 @@ - + From dfde269142679c3c34bad8d9fa554a047e869e6e Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Tue, 15 Oct 2024 14:01:20 +0200 Subject: [PATCH 74/86] OP-1340 Force Lot's cost definition when LOTWITHCOST=yes and AUTOMATICLOT_IN=no (#2066) * Force Lot's cost definition when LOTWITHCOST=yes and AUTOMATICLOT_IN=no * Apply code review suggestions --- bundle/language_en.properties | 1 + .../gui/MovStockMultipleCharging.java | 85 ++++++++++--------- 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/bundle/language_en.properties b/bundle/language_en.properties index afa5ba4888..421d525dda 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -846,6 +846,7 @@ angal.medicalstock.multiplecharging.preparationdate angal.medicalstock.multiplecharging.qtypacket = Qty/Packet angal.medicalstock.multiplecharging.referencenumberabb = Reference No. angal.medicalstock.multiplecharging.selectedlot = Selected Lot +angal.medicalstock.multiplecharging.selectedlotwithoutcostpleasespecify = Selected Lot {0} has no cost information, please specify... angal.medicalstock.multiplecharging.supplier = Supplier angal.medicalstock.multiplecharging.theinsertedreferencenumberalreadyexists.msg = The inserted reference number already exists. angal.medicalstock.multiplecharging.totalcost = Total cost diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java index ffd32a2181..a4d6c1750f 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java @@ -138,11 +138,12 @@ public class MovStockMultipleCharging extends JDialog { }; private JComboBox comboBoxUnits = new JComboBox(qtyOption); private int optionSelected = UNITS; + private List updateLots = new ArrayList(); private MovStockInsertingManager movStockInsertingManager = Context.getApplicationContext().getBean(MovStockInsertingManager.class); private MedicalBrowsingManager medicalBrowsingManager = Context.getApplicationContext().getBean(MedicalBrowsingManager.class); private MedicalDsrStockMovementTypeBrowserManager medicalDsrStockMovementTypeBrowserManager = Context.getApplicationContext() - .getBean(MedicalDsrStockMovementTypeBrowserManager.class); + .getBean(MedicalDsrStockMovementTypeBrowserManager.class); private SupplierBrowserManager supplierBrowserManager = Context.getApplicationContext().getBean(SupplierBrowserManager.class); private boolean isAutomaticLotIn() { @@ -380,9 +381,9 @@ private JTextField getJTextFieldSearch() { jTextFieldSearch.setColumns(10); TextPrompt suggestion = new TextPrompt( - MessageBundle.getMessage("angal.medicalstock.typeacodeoradescriptionandpressenter"), //$NON-NLS-1$ - jTextFieldSearch, - Show.FOCUS_LOST); + MessageBundle.getMessage("angal.medicalstock.typeacodeoradescriptionandpressenter"), //$NON-NLS-1$ + jTextFieldSearch, + Show.FOCUS_LOST); suggestion.setFont(new Font("Tahoma", Font.PLAIN, 14)); //$NON-NLS-1$ suggestion.setForeground(Color.GRAY); @@ -412,11 +413,12 @@ private JTextField getJTextFieldSearch() { // Lot (PreparationDate && ExpiringDate) Lot lot; boolean isNewLot = false; + boolean updateLot = false; if (isAutomaticLotIn()) { LocalDateTime preparationDate = TimeTools.getNow().truncatedTo(ChronoUnit.MINUTES); LocalDateTime expiringDate = askExpiringDate(); lot = new Lot("", preparationDate, expiringDate); //$NON-NLS-1$ - // Cost + // Lot Cost BigDecimal cost = new BigDecimal(0); if (GeneralData.LOTWITHCOST) { cost = askCost(qty); @@ -434,15 +436,16 @@ private JTextField getJTextFieldSearch() { if (lot == null) { return; } - // Lot Cost - BigDecimal cost = new BigDecimal(0); - if (GeneralData.LOTWITHCOST) { - cost = askCost(qty); - if (cost.compareTo(new BigDecimal(0)) == 0) { - return; - } + } + // Lot Cost + BigDecimal cost = lot.getCost(); + if ((cost == null || cost.equals(new BigDecimal(0))) && GeneralData.LOTWITHCOST) { + MessageDialog.warning(null, "angal.medicalstock.multiplecharging.selectedlotwithoutcostpleasespecify", lot.getCode()); + cost = askCost(qty); + if (cost.compareTo(new BigDecimal(0)) == 0) { + return; } - isNewLot = true; + updateLot = true; lot.setCost(cost); } } while (lot == null); @@ -455,7 +458,7 @@ private JTextField getJTextFieldSearch() { String refNo = jTextFieldReference.getText().trim(); Movement movement = new Movement(med, (MovementType) jComboBoxChargeType.getSelectedItem(), null, lot, date, qty, new Supplier(), refNo); - model.addItem(movement, isNewLot); + model.addItem(movement, isNewLot, updateLot); units.add(PACKETS); @@ -499,8 +502,8 @@ protected BigDecimal askCost(int qty) { double cost = 0.; do { String input = JOptionPane.showInputDialog(this, - MessageBundle.getMessage("angal.medicalstock.multiplecharging.unitcost"), //$NON-NLS-1$ - 0.); + MessageBundle.getMessage("angal.medicalstock.multiplecharging.unitcost"), //$NON-NLS-1$ + 0.); if (input != null) { try { cost = Double.parseDouble(input); @@ -523,8 +526,8 @@ protected BigDecimal askCost(int qty) { protected double askTotalCost() { String input = JOptionPane.showInputDialog(this, - MessageBundle.getMessage("angal.medicalstock.multiplecharging.totalcost"), //$NON-NLS-1$ - 0.); + MessageBundle.getMessage("angal.medicalstock.multiplecharging.totalcost"), //$NON-NLS-1$ + 0.); double total = 0.; if (input != null) { try { @@ -566,10 +569,10 @@ protected Lot askLot() { do { int ok = JOptionPane.showConfirmDialog( - this, - panel, - MessageBundle.getMessage("angal.medicalstock.multiplecharging.lotinformations"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION); + this, + panel, + MessageBundle.getMessage("angal.medicalstock.multiplecharging.lotinformations"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION); if (ok == JOptionPane.OK_OPTION) { String lotName = lotNameTextField.getText(); @@ -608,10 +611,10 @@ protected Medical chooseMedical(String text) { panel.add(new JScrollPane(medTable)); int ok = JOptionPane.showConfirmDialog( - this, - panel, - MessageBundle.getMessage("angal.medicalstock.multiplecharging.chooseamedical"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION); + this, + panel, + MessageBundle.getMessage("angal.medicalstock.multiplecharging.chooseamedical"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION); if (ok == JOptionPane.OK_OPTION) { int row = medTable.getSelectedRow(); @@ -644,13 +647,13 @@ protected Lot chooseLot(Medical med) { int row; do { int ok = JOptionPane.showOptionDialog(this, - panel, - MessageBundle.getMessage("angal.medicalstock.multiplecharging.existinglot"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, - options, - options[0]); + panel, + MessageBundle.getMessage("angal.medicalstock.multiplecharging.existinglot"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, + options, + options[0]); if (ok == JOptionPane.YES_OPTION) { row = lotTable.getSelectedRow(); @@ -676,8 +679,8 @@ protected LocalDateTime askExpiringDate() { panel.add(expireDateChooser); int ok = JOptionPane.showConfirmDialog(this, panel, - MessageBundle.getMessage("angal.medicalstock.multiplecharging.expiringdate"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION); + MessageBundle.getMessage("angal.medicalstock.multiplecharging.expiringdate"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION); if (ok == JOptionPane.OK_OPTION) { date = expireDateChooser.getLocalDateTime(); @@ -698,9 +701,9 @@ protected int askQuantity(Medical med) { int qty = 0; do { String quantity = JOptionPane.showInputDialog(this, - message.toString(), - title.toString(), - JOptionPane.QUESTION_MESSAGE); + message.toString(), + title.toString(), + JOptionPane.QUESTION_MESSAGE); if (quantity != null) { try { qty = Integer.parseInt(quantity); @@ -764,9 +767,12 @@ public void removeItem(int row) { fireTableDataChanged(); } - public void addItem(Movement movement, Boolean isNewLot) { + public void addItem(Movement movement, Boolean isNewLot, boolean updateLot) { movements.add(movement); newLots.add(isNewLot); + if (updateLot) { + updateLots.add(movement.getLot()); + } fireTableDataChanged(); } @@ -922,6 +928,7 @@ private boolean save() { boolean ok = true; List movements = model.getMovements(); try { + movStockInsertingManager.updateLot(updateLots); movStockInsertingManager.newMultipleChargingMovements(movements, movements.get(0).getRefNo()); } catch (OHServiceException e) { ok = false; From 7e76177340734034c745e442bdf875a9b1b4a3e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 04:23:14 +0000 Subject: [PATCH 75/86] Chore(deps-dev): Bump org.mockito:mockito-junit-jupiter Bumps [org.mockito:mockito-junit-jupiter](https://github.com/mockito/mockito) from 5.14.1 to 5.14.2. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.14.1...v5.14.2) --- updated-dependencies: - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 593597f578..42739d24bc 100644 --- a/pom.xml +++ b/pom.xml @@ -348,7 +348,7 @@ org.mockito mockito-junit-jupiter - 5.14.1 + 5.14.2 test From b66c498f6c6bdb79065d16505b70edef6f53a294 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 04:55:31 +0000 Subject: [PATCH 76/86] Chore(deps-dev): Bump org.junit.jupiter:junit-jupiter-engine Bumps [org.junit.jupiter:junit-jupiter-engine](https://github.com/junit-team/junit5) from 5.11.2 to 5.11.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.11.2...r5.11.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 42739d24bc..14e1f75c7b 100644 --- a/pom.xml +++ b/pom.xml @@ -336,7 +336,7 @@ org.junit.jupiter junit-jupiter-engine - 5.11.2 + 5.11.3 test From 2dab8f12bb90965400ebb561bcae0b67ddb3144e Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Thu, 24 Oct 2024 05:47:56 +0200 Subject: [PATCH 77/86] Same as for API (#2071) --- .github/workflows/maven.yml | 43 +++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 916c75029d..29a475fc1f 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -5,22 +5,37 @@ name: Java CI with Maven on: [push, pull_request] +env: + MAVEN_ARGS: '-B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn' + jobs: build: - runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: 'zulu' - java-version: 17 - java-package: jdk - - name: Checkout core - run: git clone --depth=50 --branch=develop https://github.com/informatici/openhospital-core.git openhospital-core - - name: Install core - run: cd openhospital-core && mvn install -DskipTests=true && cd .. - - name: Build GUI with Maven - run: mvn -B package --file pom.xml + - uses: actions/checkout@v4 + + - name: Determine PR source branch + id: extract_branch + run: echo "BRANCH_NAME=${GITHUB_HEAD_REF:-develop}" >> $GITHUB_ENV + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + java-package: jdk + + - name: Checkout core + run: | + git clone --depth=50 https://github.com/informatici/openhospital-core.git openhospital-core + cd openhospital-core + git fetch origin ${{ env.BRANCH_NAME }} || git fetch origin develop + git checkout ${{ env.BRANCH_NAME }} || git checkout develop + cd .. + + - name: Install core + run: cd openhospital-core && mvn install -DskipTests=true && cd .. + + - name: Build GUI with Maven + run: mvn -B package --file pom.xml From 42f51c8857c3da5da67007ee980006d9f9069df1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 04:52:29 +0000 Subject: [PATCH 78/86] Chore(deps): Bump org.apache.maven.plugins:maven-dependency-plugin Bumps [org.apache.maven.plugins:maven-dependency-plugin](https://github.com/apache/maven-dependency-plugin) from 3.8.0 to 3.8.1. - [Release notes](https://github.com/apache/maven-dependency-plugin/releases) - [Commits](https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.8.0...maven-dependency-plugin-3.8.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-dependency-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c7b26babec..2c73b6ab6d 100644 --- a/pom.xml +++ b/pom.xml @@ -192,7 +192,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.8.0 + 3.8.1 copy-dependencies From b24196c53005432ba03f4aeb9d0f904c78580a19 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Mon, 28 Oct 2024 20:29:16 +0100 Subject: [PATCH 79/86] workflow: try to get pull-requests branches from fork (#2073) * Try to get pull-requests branches from fork * Fix history commit depth --- .github/workflows/maven.yml | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 29a475fc1f..d71a136bd4 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -15,9 +15,11 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Determine PR source branch - id: extract_branch - run: echo "BRANCH_NAME=${GITHUB_HEAD_REF:-develop}" >> $GITHUB_ENV + - name: Determine PR source branch and fork repository + id: vars + run: | + echo "BRANCH_NAME=${GITHUB_HEAD_REF:-develop}" >> $GITHUB_ENV + echo "FORK_REPO=${GITHUB_HEAD_REPOSITORY:-informatici/openhospital-core}" >> $GITHUB_ENV - name: Set up JDK 17 uses: actions/setup-java@v4 @@ -28,14 +30,16 @@ jobs: - name: Checkout core run: | - git clone --depth=50 https://github.com/informatici/openhospital-core.git openhospital-core - cd openhospital-core - git fetch origin ${{ env.BRANCH_NAME }} || git fetch origin develop - git checkout ${{ env.BRANCH_NAME }} || git checkout develop - cd .. + git clone --depth=1 --no-single-branch https://github.com/${{ env.FORK_REPO }}.git openhospital-core + pushd openhospital-core + git checkout -B ${{ env.BRANCH_NAME }} origin/${{ env.BRANCH_NAME }} || git checkout develop + popd - name: Install core - run: cd openhospital-core && mvn install -DskipTests=true && cd .. + run: | + pushd openhospital-core + mvn install -DskipTests=true + popd - name: Build GUI with Maven run: mvn -B package --file pom.xml From 0c745710ad0a7b89919565d73e2e22b70217d8ad Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Tue, 29 Oct 2024 17:24:42 +0100 Subject: [PATCH 80/86] workflow: get fork and branch upon pull_request and push events (#2076) * Try to get pull-requests branches from fork * Fix history commit depth * workflow: get fork and branch upon pull_request and push events --- .github/workflows/maven.yml | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index d71a136bd4..91e0b29c70 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -14,12 +14,41 @@ jobs: steps: - uses: actions/checkout@v4 + + - name: Debug GitHub variables + run: | + echo "GITHUB_EVENT_NAME: ${GITHUB_EVENT_NAME}" + echo "GITHUB_HEAD_REPOSITORY: ${GITHUB_HEAD_REPOSITORY}" + echo "GITHUB_HEAD_REF: ${GITHUB_HEAD_REF}" + echo "GITHUB_REPOSITORY: ${GITHUB_REPOSITORY}" + echo "GITHUB_REF: ${GITHUB_REF}" + echo "GITHUB_ACTOR: ${GITHUB_ACTOR}" - name: Determine PR source branch and fork repository id: vars run: | - echo "BRANCH_NAME=${GITHUB_HEAD_REF:-develop}" >> $GITHUB_ENV - echo "FORK_REPO=${GITHUB_HEAD_REPOSITORY:-informatici/openhospital-core}" >> $GITHUB_ENV + # Get branch name from either pull_request or push context + if [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]]; then + # Get branch and fork repo for PR events + echo "BRANCH_NAME=${GITHUB_HEAD_REF}" >> $GITHUB_ENV + echo "FORK_REPO=${GITHUB_HEAD_REPOSITORY:-informatici/openhospital-core}" >> $GITHUB_ENV + elif [[ "${GITHUB_EVENT_NAME}" == "push" ]]; then + # Get branch name for push events + echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV + + # Default FORK_REPO to main repository, with option to fallback if the fork exists + OWNER=${GITHUB_ACTOR} + if curl -s -o /dev/null -w "%{http_code}" "https://api.github.com/repos/${OWNER}/openhospital-core/branches/${GITHUB_REF##*/}" | grep -q "200"; then + echo "FORK_REPO=${OWNER}/openhospital-core" >> $GITHUB_ENV + else + echo "FORK_REPO=informatici/openhospital-core" >> $GITHUB_ENV + fi + fi + + - name: Log variables + run: | + echo "FORK_REPO: ${{ env.FORK_REPO }}" + echo "BRANCH_NAME: ${{ env.BRANCH_NAME }}" - name: Set up JDK 17 uses: actions/setup-java@v4 From 7ce5c114ffb2792d0323c1f75e359d27a04731a7 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Tue, 29 Oct 2024 21:07:26 +0100 Subject: [PATCH 81/86] OP-1340 Fix when medical has no previous lots (#2075) * Fix when medical has no previous lots * Improve * Fix when AUTOMATICLOT_IN=true * Simplify the logic * Remove comments * Update src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java * Update src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java --- .../gui/MovStockMultipleCharging.java | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java index a4d6c1750f..8e458a6c4e 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java @@ -410,43 +410,33 @@ private JTextField getJTextFieldSearch() { return; } - // Lot (PreparationDate && ExpiringDate) + // Lot Lot lot; boolean isNewLot = false; boolean updateLot = false; if (isAutomaticLotIn()) { - LocalDateTime preparationDate = TimeTools.getNow().truncatedTo(ChronoUnit.MINUTES); - LocalDateTime expiringDate = askExpiringDate(); - lot = new Lot("", preparationDate, expiringDate); //$NON-NLS-1$ - // Lot Cost - BigDecimal cost = new BigDecimal(0); - if (GeneralData.LOTWITHCOST) { - cost = askCost(qty); - if (cost.compareTo(new BigDecimal(0)) == 0) { - return; - } - } + lot = createNewLot(med, qty); isNewLot = true; - lot.setCost(cost); } else { do { lot = chooseLot(med); if (lot == null) { - lot = askLot(); + lot = askLot(med); if (lot == null) { return; } + if (!setOrValidateCost(lot, qty)) { + return; + } + isNewLot = true; } - // Lot Cost - BigDecimal cost = lot.getCost(); - if ((cost == null || cost.equals(new BigDecimal(0))) && GeneralData.LOTWITHCOST) { + // Lot without cost + if (needsCostUpdate(lot)) { MessageDialog.warning(null, "angal.medicalstock.multiplecharging.selectedlotwithoutcostpleasespecify", lot.getCode()); - cost = askCost(qty); - if (cost.compareTo(new BigDecimal(0)) == 0) { + if (!setOrValidateCost(lot, qty)) { return; } updateLot = true; - lot.setCost(cost); } } while (lot == null); } @@ -470,6 +460,34 @@ private JTextField getJTextFieldSearch() { return jTextFieldSearch; } + private Lot createNewLot(Medical med, int qty) { + LocalDateTime preparationDate = TimeTools.getNow().truncatedTo(ChronoUnit.MINUTES); + LocalDateTime expiringDate = askExpiringDate(); + Lot newLot = new Lot("", preparationDate, expiringDate); + newLot.setMedical(med); + + if (!setOrValidateCost(newLot, qty)) { + return null; + } + return newLot; + } + + private boolean setOrValidateCost(Lot lot, int qty) { + BigDecimal cost = lot.getCost() != null ? lot.getCost() : BigDecimal.ZERO; + if (GeneralData.LOTWITHCOST && (cost.equals(BigDecimal.ZERO) || lot.getCost() == null)) { + cost = askCost(qty); + if (cost.compareTo(BigDecimal.ZERO) == 0) { + return false; + } + lot.setCost(cost); + } + return true; + } + + private boolean needsCostUpdate(Lot lot) { + return (lot.getCost() == null || lot.getCost().equals(BigDecimal.ZERO)) && GeneralData.LOTWITHCOST; + } + private GoodDateTimeSpinnerChooser getJDateChooser() { if (jDateChooser == null) { jDateChooser = new GoodDateTimeSpinnerChooser(TimeTools.getNow()); @@ -542,7 +560,7 @@ protected double askTotalCost() { return total; } - protected Lot askLot() { + protected Lot askLot(Medical med) { LocalDateTime preparationDate; LocalDateTime expiringDate; Lot lot = null; @@ -585,6 +603,7 @@ protected Lot askLot() { expiringDate = expireDateChooser.getDateEndOfDay(); preparationDate = preparationDateChooser.getDateStartOfDay(); lot = new Lot(lotName, preparationDate, expiringDate); + lot.setMedical(med); } } else { return null; From c5edc362a96cdc8c68ceb409f582f1224cac1b82 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Wed, 30 Oct 2024 17:47:09 +0100 Subject: [PATCH 82/86] workflow: use PR fork and branch (#2078) * Align with API * Improve logging * Fix CHECK_BRANCH_URL --- .github/workflows/maven.yml | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 91e0b29c70..1c510b6f32 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -27,23 +27,27 @@ jobs: - name: Determine PR source branch and fork repository id: vars run: | - # Get branch name from either pull_request or push context - if [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]]; then - # Get branch and fork repo for PR events - echo "BRANCH_NAME=${GITHUB_HEAD_REF}" >> $GITHUB_ENV - echo "FORK_REPO=${GITHUB_HEAD_REPOSITORY:-informatici/openhospital-core}" >> $GITHUB_ENV - elif [[ "${GITHUB_EVENT_NAME}" == "push" ]]; then - # Get branch name for push events - echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV - - # Default FORK_REPO to main repository, with option to fallback if the fork exists - OWNER=${GITHUB_ACTOR} - if curl -s -o /dev/null -w "%{http_code}" "https://api.github.com/repos/${OWNER}/openhospital-core/branches/${GITHUB_REF##*/}" | grep -q "200"; then - echo "FORK_REPO=${OWNER}/openhospital-core" >> $GITHUB_ENV - else - echo "FORK_REPO=informatici/openhospital-core" >> $GITHUB_ENV - fi + # Set default FORK_REPO and BRANCH_NAME values. + BRANCH_NAME="${GITHUB_HEAD_REF:-${GITHUB_REF##*/}}" + FORK_REPO="${GITHUB_HEAD_REPOSITORY:-${GITHUB_ACTOR}/openhospital-core}" + CHECK_BRANCH_URL="https://github.com/${GITHUB_ACTOR}/openhospital-core/tree/$BRANCH_NAME" + echo "Checking branch existence with: curl -s -o /dev/null -w \"%{http_code}\" $CHECK_BRANCH_URL" + + # Determine FORK_REPO with fallback logic + if [[ -n "${GITHUB_HEAD_REPOSITORY}" ]]; then + echo "Using ${GITHUB_HEAD_REPOSITORY}." + FORK_REPO=${GITHUB_HEAD_REPOSITORY} + elif curl -s -o /dev/null -w "%{http_code}" $CHECK_BRANCH_URL | grep -q "200"; then + echo "Using ${GITHUB_ACTOR}/openhospital-core" + FORK_REPO=${GITHUB_ACTOR}/openhospital-core + else + echo "Using informatici/openhospital-core." + FORK_REPO="informatici/openhospital-core" fi + + # Export FORK_REPO and BRANCH_NAME to GITHUB_ENV for the next step + echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV + echo "FORK_REPO=$FORK_REPO" >> $GITHUB_ENV - name: Log variables run: | From 82dfb0a8cb8b27f1418f1444d48a86be26cf78d9 Mon Sep 17 00:00:00 2001 From: Alessandro Domanico Date: Wed, 30 Oct 2024 23:23:15 +0100 Subject: [PATCH 83/86] OP-1339 Fix lots overlooking when they reach zero quantity (#2074) * Add checkbox to hide empty lots (and improve the code) * Add bundles and improve code * Add code check on new lots * Try to fix build upon "push" events * Restore previous repo var for pull_request events * debug current folder * Fix core repository * Fix for contributors * Trying different cases * Add more debugging * Fix * Fix --- bundle/language_en.properties | 4 + .../gui/MovStockMultipleCharging.java | 214 +++++++++++------- 2 files changed, 141 insertions(+), 77 deletions(-) diff --git a/bundle/language_en.properties b/bundle/language_en.properties index 421d525dda..c564bae156 100644 --- a/bundle/language_en.properties +++ b/bundle/language_en.properties @@ -829,10 +829,13 @@ angal.medicalstock.multiplecharging.chargetype angal.medicalstock.multiplecharging.chooseamedical = Choose a Medical angal.medicalstock.multiplecharging.cost = Cost angal.medicalstock.multiplecharging.datecannotbebeforelastmovementdate.msg = Date cannot be before last movement date. +angal.medicalstock.multiplecharging.empty = Empty angal.medicalstock.multiplecharging.existinglot = Existing Lots +angal.medicalstock.multiplecharging.expired = Expired angal.medicalstock.multiplecharging.expiringdate = Expiring angal.medicalstock.multiplecharging.expiringdateinthepastnotallowed = Expiring date in the past not allowed angal.medicalstock.multiplecharging.expirydatebeforepreparationdate = Expiring date before Preparation date not allowed +angal.medicalstock.multiplecharging.hideemptylots = Hide empty lots angal.medicalstock.multiplecharging.lotid = Lot id angal.medicalstock.multiplecharging.lotinformations = Lot Information angal.medicalstock.multiplecharging.lotnumberabb = Lot No. @@ -849,6 +852,7 @@ angal.medicalstock.multiplecharging.selectedlot angal.medicalstock.multiplecharging.selectedlotwithoutcostpleasespecify = Selected Lot {0} has no cost information, please specify... angal.medicalstock.multiplecharging.supplier = Supplier angal.medicalstock.multiplecharging.theinsertedreferencenumberalreadyexists.msg = The inserted reference number already exists. +angal.medicalstock.multiplecharging.theinsertedlotcodealreaedyexists.msg = The inserted lot code already exists. angal.medicalstock.multiplecharging.totalcost = Total cost angal.medicalstock.multiplecharging.unitcost = Unit cost angal.medicalstock.multiplecharging.unitpack = Unit/Pack diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java index 8e458a6c4e..6fc884994c 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java @@ -44,9 +44,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import javax.swing.DefaultCellEditor; import javax.swing.JButton; +import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; @@ -139,6 +141,16 @@ public class MovStockMultipleCharging extends JDialog { private JComboBox comboBoxUnits = new JComboBox(qtyOption); private int optionSelected = UNITS; private List updateLots = new ArrayList(); + private final String[] lotSelectionColumnNames = { + MessageBundle.getMessage("angal.medicalstock.lotid").toUpperCase(), + MessageBundle.getMessage("angal.medicalstock.prepdate.col").toUpperCase(), + MessageBundle.getMessage("angal.medicalstock.duedate").toUpperCase(), + MessageBundle.getMessage("angal.common.quantity.txt").toUpperCase(), + MessageBundle.getMessage("angal.medicalstock.multiplecharging.cost").toUpperCase(), + MessageBundle.getMessage("angal.common.note.txt").toUpperCase() + }; + private boolean[] lotSelectionColumnVisible = { true, true, true, true, GeneralData.LOTWITHCOST, true }; + private final Class[] lotSelectionColumnClasse = { String.class, String.class, String.class, Integer.class, Double.class, String.class }; private MovStockInsertingManager movStockInsertingManager = Context.getApplicationContext().getBean(MovStockInsertingManager.class); private MedicalBrowsingManager medicalBrowsingManager = Context.getApplicationContext().getBean(MedicalBrowsingManager.class); @@ -594,16 +606,23 @@ protected Lot askLot(Medical med) { if (ok == JOptionPane.OK_OPTION) { String lotName = lotNameTextField.getText(); - - if (expireDateChooser.getDate().isBefore(preparationDateChooser.getDate())) { - MessageDialog.error(this, "angal.medicalstock.multiplecharging.expirydatebeforepreparationdate"); - } else if (expireDateChooser.getDate().isBefore(jDateChooser.getLocalDateTime().toLocalDate())) { - MessageDialog.error(this, "angal.medicalstock.multiplecharging.expiringdateinthepastnotallowed"); - } else { - expiringDate = expireDateChooser.getDateEndOfDay(); - preparationDate = preparationDateChooser.getDateStartOfDay(); - lot = new Lot(lotName, preparationDate, expiringDate); - lot.setMedical(med); + try { + if (movStockInsertingManager.lotExists(lotName)) { + MessageDialog.error(this, "angal.medicalstock.multiplecharging.theinsertedlotcodealreaedyexists.msg"); + continue; + } + if (expireDateChooser.getDate().isBefore(preparationDateChooser.getDate())) { + MessageDialog.error(this, "angal.medicalstock.multiplecharging.expirydatebeforepreparationdate"); + } else if (expireDateChooser.getDate().isBefore(jDateChooser.getLocalDateTime().toLocalDate())) { + MessageDialog.error(this, "angal.medicalstock.multiplecharging.expiringdateinthepastnotallowed"); + } else { + expiringDate = expireDateChooser.getDateEndOfDay(); + preparationDate = preparationDateChooser.getDateStartOfDay(); + lot = new Lot(lotName, preparationDate, expiringDate); + lot.setMedical(med); + } + } catch (OHServiceException e) { + OHServiceExceptionUtil.showMessages(e); } } else { return null; @@ -647,47 +666,70 @@ protected Medical chooseMedical(String text) { protected Lot chooseLot(Medical med) { List lots; try { - lots = movStockInsertingManager.getLotByMedical(med); + lots = movStockInsertingManager.getLotByMedical(med, false); // get also empty lots } catch (OHServiceException e) { lots = new ArrayList<>(); OHServiceExceptionUtil.showMessages(e); } - Lot lot = null; - if (!lots.isEmpty()) { - JTable lotTable = new JTable(new StockMovModel(lots)); - lotTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - JPanel panel = new JPanel(new BorderLayout()); - panel.add(new JLabel(MessageBundle.getMessage("angal.medicalstock.multiplecharging.useanexistinglot")), BorderLayout.NORTH); //$NON-NLS-1$ - panel.add(new JScrollPane(lotTable), BorderLayout.CENTER); - Object[] options = { - MessageBundle.getMessage("angal.medicalstock.multiplecharging.selectedlot"), //$NON-NLS-1$ - MessageBundle.getMessage("angal.medicalstock.multiplecharging.newlot") }; //$NON-NLS-1$ - - int row; - do { - int ok = JOptionPane.showOptionDialog(this, - panel, - MessageBundle.getMessage("angal.medicalstock.multiplecharging.existinglot"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - null, - options, - options[0]); - - if (ok == JOptionPane.YES_OPTION) { - row = lotTable.getSelectedRow(); - if (row != -1) { - lot = lots.get(row); - } else { - MessageDialog.error(this, "angal.common.pleaseselectarow.msg"); - } + if (lots.isEmpty()) { + return null; + } + + StockLotModel lotModel = new StockLotModel(lots); + JTable lotTable = createLotTable(lotModel); + JCheckBox filterZeroQuantityCheckBox = createFilterCheckbox(lotModel); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(new JLabel(MessageBundle.getMessage("angal.medicalstock.multiplecharging.useanexistinglot")), BorderLayout.NORTH); + panel.add(new JScrollPane(lotTable), BorderLayout.CENTER); + panel.add(filterZeroQuantityCheckBox, BorderLayout.SOUTH); + + Lot selectedLot = null; + Object[] options = { + MessageBundle.getMessage("angal.medicalstock.multiplecharging.selectedlot"), + MessageBundle.getMessage("angal.medicalstock.multiplecharging.newlot") + }; + + int row; + do { + int ok = JOptionPane.showOptionDialog(this, panel, + MessageBundle.getMessage("angal.medicalstock.multiplecharging.existinglot"), + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); + + if (ok == JOptionPane.YES_OPTION) { + row = lotTable.getSelectedRow(); + if (row != -1) { + selectedLot = lots.get(row); } else { - row = 0; + MessageDialog.error(this, "angal.common.pleaseselectarow.msg"); } + } else { + row = 0; + } + } while (row == -1); + + return selectedLot; + } - } while (row == -1); + private JTable createLotTable(StockLotModel lotModel) { + JTable lotTable = new JTable(lotModel); + lotTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + for (int i = 0; i < lotSelectionColumnNames.length; i++) { + if (!lotSelectionColumnVisible[i]) { + TableColumn column = lotTable.getColumnModel().getColumn(i); + column.setMinWidth(0); + column.setMaxWidth(0); + column.setWidth(0); + } } - return lot; + return lotTable; + } + + private JCheckBox createFilterCheckbox(StockLotModel lotModel) { + JCheckBox filterZeroQuantityCheckBox = new JCheckBox(MessageBundle.getMessage("angal.medicalstock.multiplecharging.hideemptylots")); + filterZeroQuantityCheckBox.setSelected(true); + filterZeroQuantityCheckBox.addActionListener(e -> lotModel.setFilterZeroQuantity(filterZeroQuantityCheckBox.isSelected())); + return filterZeroQuantityCheckBox; } protected LocalDateTime askExpiringDate() { @@ -1002,68 +1044,86 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole } } - class StockMovModel extends DefaultTableModel { + class StockLotModel extends DefaultTableModel { + private static final String EMPTY = MessageBundle.getMessage("angal.medicalstock.multiplecharging.empty"); + private static final String EXPIRED = MessageBundle.getMessage("angal.medicalstock.multiplecharging.expired"); private static final long serialVersionUID = 1L; private List lotList; + private List displayedLots; + private boolean filterZeroQuantity = true; - public StockMovModel(List lots) { - lotList = lots; + @Override + public Class< ? > getColumnClass(int columnIndex) { + return lotSelectionColumnClasse[columnIndex]; + } + + public StockLotModel(List lots) { + this.lotList = new ArrayList<>(lots); + updateFilteredLots(); + } + + public void setFilterZeroQuantity(boolean filter) { + this.filterZeroQuantity = filter; + updateFilteredLots(); + fireTableDataChanged(); + } + + private void updateFilteredLots() { + if (filterZeroQuantity) { + // Only include lots with quantity greater than zero + displayedLots = lotList.stream() + .filter(lot -> lot.getMainStoreQuantity() > 0) + .collect(Collectors.toList()); + } else { + // Show all lots + displayedLots = new ArrayList<>(lotList); + } } @Override public int getRowCount() { - if (lotList == null) { + if (displayedLots == null) { return 0; } - return lotList.size(); + return displayedLots.size(); } @Override public String getColumnName(int c) { - if (c == 0) { - return MessageBundle.getMessage("angal.medicalstock.lotid").toUpperCase(); - } - if (c == 1) { - return MessageBundle.getMessage("angal.medicalstock.prepdate").toUpperCase(); - } - if (c == 2) { - return MessageBundle.getMessage("angal.medicalstock.duedate").toUpperCase(); - } - if (c == 3) { - return MessageBundle.getMessage("angal.common.quantity.txt").toUpperCase(); - } - if (GeneralData.LOTWITHCOST) { - if (c == 4) { - return MessageBundle.getMessage("angal.medicalstock.multiplecharging.cost").toUpperCase(); - } - } - return ""; //$NON-NLS-1$ + return lotSelectionColumnNames[c]; } @Override public int getColumnCount() { - if (GeneralData.LOTWITHCOST) { - return 5; - } - return 4; + return lotSelectionColumnNames.length; } @Override public Object getValueAt(int r, int c) { - Lot lot = lotList.get(r); - if (c == -1) { + Lot lot = displayedLots.get(r); + int i = -1; + if (c == i) { return lot; - } else if (c == 0) { + } else if (c == ++i) { return lot.getCode(); - } else if (c == 1) { + } else if (c == ++i) { return TimeTools.formatDateTime(lot.getPreparationDate(), DATE_FORMAT_DD_MM_YYYY); - } else if (c == 2) { + } else if (c == ++i) { return TimeTools.formatDateTime(lot.getDueDate(), DATE_FORMAT_DD_MM_YYYY); - } else if (c == 3) { + } else if (c == ++i) { return lot.getMainStoreQuantity(); - } else if (c == 4) { + } else if (c == ++i) { return lot.getCost(); + } else if (c == ++i) { + List statuses = new ArrayList<>(); + if (lot.getDueDate().isBefore(TimeTools.getDateToday0())) { + statuses.add(EXPIRED); + } + if (lot.getMainStoreQuantity() == 0) { + statuses.add(EMPTY); + } + return String.join(",", statuses); } return null; } From b9faed476b3018b65bc83ffe3cfe5ffdf7101729 Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Thu, 7 Nov 2024 15:39:45 -0500 Subject: [PATCH 84/86] Chore: replace explicit type with <> (#2082) --- .../java/org/isf/medicalstock/gui/MovStockMultipleCharging.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java index 6fc884994c..90e5937876 100644 --- a/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java +++ b/src/main/java/org/isf/medicalstock/gui/MovStockMultipleCharging.java @@ -140,7 +140,7 @@ public class MovStockMultipleCharging extends JDialog { }; private JComboBox comboBoxUnits = new JComboBox(qtyOption); private int optionSelected = UNITS; - private List updateLots = new ArrayList(); + private List updateLots = new ArrayList<>(); private final String[] lotSelectionColumnNames = { MessageBundle.getMessage("angal.medicalstock.lotid").toUpperCase(), MessageBundle.getMessage("angal.medicalstock.prepdate.col").toUpperCase(), From 4642e990a26f0878197b69d51505ffdf02b7bfcc Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Sat, 9 Nov 2024 05:36:28 -0500 Subject: [PATCH 85/86] OP-1157 use pattern matching for instanceof (JDK 16) (#2083) --- .../admission/gui/PatientFolderBrowser.java | 9 +++---- .../java/org/isf/opd/gui/OpdEditExtended.java | 3 +-- .../org/isf/session/LoginEventListener.java | 3 +-- .../java/org/isf/therapy/gui/TherapyEdit.java | 6 ++--- .../isf/utils/jobjects/OhTableDrugsModel.java | 3 +-- .../org/isf/utils/jobjects/OhTableModel.java | 24 +++++++------------ .../utils/jobjects/OhTableOperationModel.java | 6 ++--- .../java/org/isf/video/PhotoboothTester.java | 10 ++++---- .../video/gui/PhotoboothComponentImpl.java | 10 ++++---- 9 files changed, 26 insertions(+), 48 deletions(-) diff --git a/src/main/java/org/isf/admission/gui/PatientFolderBrowser.java b/src/main/java/org/isf/admission/gui/PatientFolderBrowser.java index ec84046472..6420b94444 100644 --- a/src/main/java/org/isf/admission/gui/PatientFolderBrowser.java +++ b/src/main/java/org/isf/admission/gui/PatientFolderBrowser.java @@ -452,19 +452,16 @@ public void mouseClicked(MouseEvent mouseEvent) { } } - if (selectedObject instanceof Admission) { + if (selectedObject instanceof Admission ad) { - Admission ad = (Admission) selectedObject; startDate = ad.getAdmDate(); endDate = ad.getDisDate(); - } else if (selectedObject instanceof Opd) { + } else if (selectedObject instanceof Opd opd) { - Opd opd = (Opd) selectedObject; startDate = opd.getDate(); - } else if (selectedObject instanceof PatientExamination) { - PatientExamination exam = (PatientExamination) selectedObject; + } else if (selectedObject instanceof PatientExamination exam) { startDate = exam.getPex_date(); } diff --git a/src/main/java/org/isf/opd/gui/OpdEditExtended.java b/src/main/java/org/isf/opd/gui/OpdEditExtended.java index 4602a078bd..3c44beac58 100644 --- a/src/main/java/org/isf/opd/gui/OpdEditExtended.java +++ b/src/main/java/org/isf/opd/gui/OpdEditExtended.java @@ -445,8 +445,7 @@ private void setAttendance() { return; } Object selectedObject = diseaseBox1.getSelectedItem(); - if (selectedObject instanceof Disease) { - Disease disease = (Disease) selectedObject; + if (selectedObject instanceof Disease disease) { if (lastOPDDisease1 != null && disease.getCode().equals(lastOPDDisease1.getCode())) { rePatientButton.setSelected(true); } else { diff --git a/src/main/java/org/isf/session/LoginEventListener.java b/src/main/java/org/isf/session/LoginEventListener.java index 54029aa21f..aec980cf45 100644 --- a/src/main/java/org/isf/session/LoginEventListener.java +++ b/src/main/java/org/isf/session/LoginEventListener.java @@ -30,8 +30,7 @@ public class LoginEventListener implements LoginListener { @Override public void loginInserted(AWTEvent e) { - if (e.getSource() instanceof User) { - User myUser = (User) e.getSource(); + if (e.getSource() instanceof User myUser) { RestartUserSession.setUser(myUser); RestartUserSession.getTimer().startTimer(); } diff --git a/src/main/java/org/isf/therapy/gui/TherapyEdit.java b/src/main/java/org/isf/therapy/gui/TherapyEdit.java index 1e6855e163..1c1b612976 100644 --- a/src/main/java/org/isf/therapy/gui/TherapyEdit.java +++ b/src/main/java/org/isf/therapy/gui/TherapyEdit.java @@ -1142,14 +1142,12 @@ public void mouseClicked(MouseEvent e) { model = list.getModel(); for (int i = 0; i < model.getSize(); i++) { Object iteratedItem = model.getElementAt(i); - if (iteratedItem instanceof Therapy) { - Therapy aTherapy = (Therapy) iteratedItem; + if (iteratedItem instanceof Therapy aTherapy) { if (therapyID != 0 && aTherapy.getTherapyID() == therapyID) { list.setSelectedIndex(i); } } - if (iteratedItem instanceof Visit) { - Visit aVisit = (Visit) iteratedItem; + if (iteratedItem instanceof Visit aVisit) { if (visitID != 0 && aVisit.getVisitID() == visitID) { list.setSelectedIndex(i); } diff --git a/src/main/java/org/isf/utils/jobjects/OhTableDrugsModel.java b/src/main/java/org/isf/utils/jobjects/OhTableDrugsModel.java index 4d1d50b63f..ebfe1b2b8f 100644 --- a/src/main/java/org/isf/utils/jobjects/OhTableDrugsModel.java +++ b/src/main/java/org/isf/utils/jobjects/OhTableDrugsModel.java @@ -97,8 +97,7 @@ public Object getValueAt(int rowIndex, int columnIndex) { String value = ""; if (rowIndex >= 0 && rowIndex < this.filteredList.size()) { T obj = this.filteredList.get(rowIndex); - if (obj instanceof MovementWard) { - MovementWard drugObj = (MovementWard) obj; + if (obj instanceof MovementWard drugObj) { switch (columnIndex) { case 0: String dt; diff --git a/src/main/java/org/isf/utils/jobjects/OhTableModel.java b/src/main/java/org/isf/utils/jobjects/OhTableModel.java index d2780e654b..6ce43fc84c 100644 --- a/src/main/java/org/isf/utils/jobjects/OhTableModel.java +++ b/src/main/java/org/isf/utils/jobjects/OhTableModel.java @@ -67,8 +67,7 @@ public T filter(String searchQuery) throws OHException { for (T t : this.dataList) { Object object = t; - if (object instanceof Price) { - Price price = (Price) object; + if (object instanceof Price price) { String strItem = price.getItem() + price.getDesc(); if (allowSearchByCode && searchQuery.equalsIgnoreCase(price.getItem())) { T resPbj = (T) object; @@ -83,8 +82,7 @@ public T filter(String searchQuery) throws OHException { } } - if (object instanceof MedicalWard) { - MedicalWard mdw = (MedicalWard) object; + if (object instanceof MedicalWard mdw) { String strItem = mdw.getMedical().getProdCode() + mdw.getMedical().getDescription(); if (allowSearchByCode && searchQuery.equalsIgnoreCase(mdw.getMedical().getProdCode())) { @@ -101,8 +99,7 @@ public T filter(String searchQuery) throws OHException { } } - if (object instanceof PricesOthers) { - PricesOthers priceO = (PricesOthers) object; + if (object instanceof PricesOthers priceO) { String strItem = priceO.getCode() + priceO.getDescription(); if (allowSearchByCode && searchQuery.equalsIgnoreCase(priceO.getCode())) { @@ -119,8 +116,7 @@ public T filter(String searchQuery) throws OHException { } } - if (object instanceof BillItems) { - BillItems priceO = (BillItems) object; + if (object instanceof BillItems priceO) { String strItem = priceO.getItemDisplayCode() + priceO.getItemDescription(); if (allowSearchByCode && searchQuery.equalsIgnoreCase(priceO.getItemDisplayCode())) { @@ -188,24 +184,21 @@ public Object getValueAt(int rowIndex, int columnIndex) { String value = ""; if (rowIndex >= 0 && rowIndex < this.filteredList.size()) { T obj = this.filteredList.get(rowIndex); - if (obj instanceof Price) { - Price priceObj = (Price) obj; + if (obj instanceof Price priceObj) { if (columnIndex == 0) { value = priceObj.getItem() != null ? priceObj.getItem() : String.valueOf(priceObj.getId()); } else { value = priceObj.getDesc(); } } - if (obj instanceof MedicalWard) { - MedicalWard mdwObj = (MedicalWard) obj; + if (obj instanceof MedicalWard mdwObj) { if (columnIndex == 0) { value = mdwObj.getMedical().getProdCode() != null ? mdwObj.getMedical().getProdCode() : String.valueOf(mdwObj.getMedical().getCode()); } else { value = mdwObj.getMedical().getDescription(); } } - if (obj instanceof PricesOthers) { - PricesOthers mdwObj = (PricesOthers) obj; + if (obj instanceof PricesOthers mdwObj) { if (columnIndex == 0) { value = mdwObj.getCode() != null ? mdwObj.getCode() : String.valueOf(mdwObj.getId()); } else { @@ -213,8 +206,7 @@ public Object getValueAt(int rowIndex, int columnIndex) { } } - if (obj instanceof BillItems) { - BillItems mdwObj = (BillItems) obj; + if (obj instanceof BillItems mdwObj) { if (columnIndex == 0) { value = mdwObj.getItemDisplayCode() != null ? mdwObj.getItemDisplayCode() : String.valueOf(mdwObj.getId()); } else { diff --git a/src/main/java/org/isf/utils/jobjects/OhTableOperationModel.java b/src/main/java/org/isf/utils/jobjects/OhTableOperationModel.java index 812c360f46..6946646975 100644 --- a/src/main/java/org/isf/utils/jobjects/OhTableOperationModel.java +++ b/src/main/java/org/isf/utils/jobjects/OhTableOperationModel.java @@ -63,8 +63,7 @@ public int filter(String searchQuery) { for (T t : this.dataList) { Object object = t; - if (object instanceof OperationRow) { - OperationRow price = (OperationRow) object; + if (object instanceof OperationRow price) { String strItem = price.getOperation().getCode() + price.getOpResult(); strItem = strItem.toLowerCase(); searchQuery = searchQuery.toLowerCase(); @@ -126,8 +125,7 @@ public Object getValueAt(int rowIndex, int columnIndex) { String value = ""; if (rowIndex >= 0 && rowIndex < this.filteredList.size()) { T obj = this.filteredList.get(rowIndex); - if (obj instanceof OperationRow) { - OperationRow opdObj = (OperationRow) obj; + if (obj instanceof OperationRow opdObj) { switch (columnIndex) { case -1: return opdObj; diff --git a/src/main/java/org/isf/video/PhotoboothTester.java b/src/main/java/org/isf/video/PhotoboothTester.java index 994f13453e..878383f5ed 100644 --- a/src/main/java/org/isf/video/PhotoboothTester.java +++ b/src/main/java/org/isf/video/PhotoboothTester.java @@ -46,16 +46,14 @@ public static void main(final String[] args) { final PhotoboothPanelPresentationModel presentationModel = new PhotoboothPanelPresentationModel(); presentationModel.addBeanPropertyChangeListener(PhotoboothPanelModel.PROPERTY_IMAGE, propertyChangeEvent -> { final Object newValue = propertyChangeEvent.getNewValue(); - if (newValue instanceof BufferedImage) { - final BufferedImage bufferedImage = (BufferedImage) newValue; - LOGGER.info("New image is being set {}x{}", bufferedImage.getWidth(), bufferedImage.getHeight()); + if (newValue instanceof BufferedImage bufferedImage) { + LOGGER.info("New image is being set {}x{}", bufferedImage.getWidth(), bufferedImage.getHeight()); } }); presentationModel.addBeanPropertyChangeListener(PhotoboothPanelModel.PROPERTY_RESOLUTION, propertyChangeEvent -> { Object newValue = propertyChangeEvent.getNewValue(); - if (newValue instanceof Dimension) { - final Dimension newDimension = (Dimension) newValue; - LOGGER.info("New dimension is {}x{}", newDimension.getWidth(), newDimension.getHeight()); + if (newValue instanceof Dimension newDimension) { + LOGGER.info("New dimension is {}x{}", newDimension.getWidth(), newDimension.getHeight()); } }); diff --git a/src/main/java/org/isf/video/gui/PhotoboothComponentImpl.java b/src/main/java/org/isf/video/gui/PhotoboothComponentImpl.java index 644e091074..25c71ad390 100644 --- a/src/main/java/org/isf/video/gui/PhotoboothComponentImpl.java +++ b/src/main/java/org/isf/video/gui/PhotoboothComponentImpl.java @@ -58,9 +58,8 @@ public Component getListCellRendererComponent(final JList list, final boolean isSelected, final boolean cellHasFocus) { final Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof Dimension) { - final Dimension valueAsDimension = (Dimension) value; - setText(String.format("%d x %d", (int) valueAsDimension.getWidth(), (int) valueAsDimension.getHeight())); + if (value instanceof Dimension valueAsDimension) { + setText(String.format("%d x %d", (int) valueAsDimension.getWidth(), (int) valueAsDimension.getHeight())); } return component; } @@ -73,9 +72,8 @@ public Component getListCellRendererComponent(final JList list, final boolean isSelected, final boolean cellHasFocus) { final Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof Webcam) { - final Webcam webcam = (Webcam) value; - setText(webcam.getName()); + if (value instanceof Webcam webcam) { + setText(webcam.getName()); } return component; } From f39d81ea77ed2da5d55581ef990e3e57cae1374e Mon Sep 17 00:00:00 2001 From: David B Malkovsky Date: Sat, 9 Nov 2024 05:36:53 -0500 Subject: [PATCH 86/86] OP-1157 use enhanced switch (JDK 14) (#2084) --- .../isf/accounting/gui/BillDataLoader.java | 19 +++++--------- .../admission/gui/AdmittedPatientBrowser.java | 14 ++++------ .../org/isf/patient/gui/PatientInsert.java | 26 +++++++------------ .../patient/gui/PatientInsertExtended.java | 13 ++++------ 4 files changed, 26 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/isf/accounting/gui/BillDataLoader.java b/src/main/java/org/isf/accounting/gui/BillDataLoader.java index 81b816e08f..05618b065c 100644 --- a/src/main/java/org/isf/accounting/gui/BillDataLoader.java +++ b/src/main/java/org/isf/accounting/gui/BillDataLoader.java @@ -47,19 +47,12 @@ public BillDataLoader(List billPeriod, List billFromPayments, Patien } public List loadBills(String status, String username) throws OHServiceException { - List tableArray = new ArrayList<>(); - - switch (status) { - case "O": - tableArray = getPendingBills(status, username); - break; - case "ALL": - tableArray = getAllBills(username); - break; - case "C": - tableArray = getClosedBills(status, username); - break; - } + List tableArray = switch (status) { + case "O" -> getPendingBills(status, username); + case "ALL" -> getAllBills(username); + case "C" -> getClosedBills(status, username); + default -> new ArrayList<>(); + }; tableArray.sort(Collections.reverseOrder()); return tableArray; diff --git a/src/main/java/org/isf/admission/gui/AdmittedPatientBrowser.java b/src/main/java/org/isf/admission/gui/AdmittedPatientBrowser.java index 0e2aa065c8..fb611a04cf 100644 --- a/src/main/java/org/isf/admission/gui/AdmittedPatientBrowser.java +++ b/src/main/java/org/isf/admission/gui/AdmittedPatientBrowser.java @@ -1206,15 +1206,11 @@ else if (patientClassBox.getSelectedItem().equals(patientClassItems[1])) { } // sex patient type - Character sex = null; - switch (patientSexBox.getSelectedIndex()) { - case 1: - sex = 'M'; - break; - case 2: - sex = 'F'; - break; - } + Character sex = switch (patientSexBox.getSelectedIndex()) { + case 1 -> 'M'; + case 2 -> 'F'; + default -> null; + }; if (sex != null && !sex.equals(ap.getPatient().getSex())) { continue; diff --git a/src/main/java/org/isf/patient/gui/PatientInsert.java b/src/main/java/org/isf/patient/gui/PatientInsert.java index 28878c1e3a..cd0d1f8a71 100644 --- a/src/main/java/org/isf/patient/gui/PatientInsert.java +++ b/src/main/java/org/isf/patient/gui/PatientInsert.java @@ -263,14 +263,11 @@ private JButton getJOkButton() { String name = jFirstNameTextField.getText() + ' ' + jSecondNameTextField.getText(); try { if (patientBrowserManager.isNamePresent(name)) { - switch (MessageDialog.yesNo(null, "angal.patient.thepatientisalreadypresent.msg")) { - case JOptionPane.OK_OPTION: - ok = true; - break; - case JOptionPane.NO_OPTION: - ok = false; - break; - } + ok = switch (MessageDialog.yesNo(null, "angal.patient.thepatientisalreadypresent.msg")) { + case JOptionPane.OK_OPTION -> true; + case JOptionPane.NO_OPTION -> false; + default -> ok; + }; } } catch (OHServiceException ex) { OHServiceExceptionUtil.showMessages(ex); @@ -320,14 +317,11 @@ private JButton getJOkButton() { if (!patient.getName().equals(name)) { try { if (patientBrowserManager.isNamePresent(name)) { - switch (MessageDialog.yesNo(null, "angal.patient.thepatientisalreadypresent.msg")) { - case JOptionPane.OK_OPTION: - ok = true; - break; - case JOptionPane.NO_OPTION: - ok = false; - break; - } + ok = switch (MessageDialog.yesNo(null, "angal.patient.thepatientisalreadypresent.msg")) { + case JOptionPane.OK_OPTION -> true; + case JOptionPane.NO_OPTION -> false; + default -> ok; + }; } } catch (OHServiceException ex) { OHServiceExceptionUtil.showMessages(ex); diff --git a/src/main/java/org/isf/patient/gui/PatientInsertExtended.java b/src/main/java/org/isf/patient/gui/PatientInsertExtended.java index 53a8a9901c..da5a0829c5 100644 --- a/src/main/java/org/isf/patient/gui/PatientInsertExtended.java +++ b/src/main/java/org/isf/patient/gui/PatientInsertExtended.java @@ -444,14 +444,11 @@ private JButton getJOkButton() { String name = firstName + ' ' + secondName; try { if (patientBrowserManager.isNamePresent(name)) { - switch (MessageDialog.yesNo(null, "angal.patient.thepatientisalreadypresent.msg")) { - case JOptionPane.OK_OPTION: - ok = true; - break; - case JOptionPane.NO_OPTION: - ok = false; - break; - } + ok = switch (MessageDialog.yesNo(null, "angal.patient.thepatientisalreadypresent.msg")) { + case JOptionPane.OK_OPTION -> true; + case JOptionPane.NO_OPTION -> false; + default -> ok; + }; } } catch (OHServiceException ex) { OHServiceExceptionUtil.showMessages(ex);