From 0b2893ecde8761026d961e10e46d1d3aed7559ed Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Fri, 7 Jul 2023 09:37:35 +0200 Subject: [PATCH 01/25] fixed missing / wrong comparer logic in case Identifier is null on the object --- ENI2/ENI2.csproj | 2 +- .../bsmd.LockingService.csproj.user | 2 +- bsmd.database/BKRA.cs | 3 +- bsmd.database/BRKD.cs | 3 +- bsmd.database/CallPurpose.cs | 3 +- bsmd.database/IBCPosition.cs | 3 +- bsmd.database/IGCPosition.cs | 3 +- bsmd.database/IMDGPosition.cs | 3 +- bsmd.database/IMSBCPosition.cs | 3 +- bsmd.database/InfectedArea.cs | 3 +- bsmd.database/LADG.cs | 3 +- bsmd.database/LastTenPortFacilitiesCalled.cs | 3 +- bsmd.database/MARPOL_Annex_I_Position.cs | 3 +- bsmd.database/PortOfCallLast30Days.cs | 3 +- .../PortOfCallLast30DaysCrewJoinedShip.cs | 3 +- bsmd.database/PortOfItinerary.cs | 3 +- bsmd.database/SERV.cs | 3 +- bsmd.database/STO.cs | 3 +- bsmd.database/SanitaryMeasuresDetail.cs | 3 +- ...vitiesDuringLastTenPortFacilitiesCalled.cs | 3 +- bsmd.database/StowawaysJoiningLocation.cs | 3 +- bsmd.database/SubsidiaryRisks.cs | 3 +- bsmd.database/TOWA.cs | 33 ++++++++++--------- bsmd.database/TOWD.cs | 3 +- bsmd.database/TreatmentFacilityProvider.cs | 3 +- bsmd.database/WAS_RCPT.cs | 3 +- bsmd.database/Waste.cs | 3 +- bsmd.database/WasteDisposalServiceProvider.cs | 3 +- bsmd.database/WasteReceived.cs | 3 +- 29 files changed, 71 insertions(+), 44 deletions(-) diff --git a/ENI2/ENI2.csproj b/ENI2/ENI2.csproj index 7fa3111c..2b9c1bf2 100644 --- a/ENI2/ENI2.csproj +++ b/ENI2/ENI2.csproj @@ -36,7 +36,7 @@ 5.4.0.0 true publish.html - 3 + 5 7.12.0.%2a false true diff --git a/bsmd.LockingService/bsmd.LockingService.csproj.user b/bsmd.LockingService/bsmd.LockingService.csproj.user index afa33dd1..3517ad61 100644 --- a/bsmd.LockingService/bsmd.LockingService.csproj.user +++ b/bsmd.LockingService/bsmd.LockingService.csproj.user @@ -2,7 +2,7 @@ true - Debug|Any CPU + Release|Any CPU diff --git a/bsmd.database/BKRA.cs b/bsmd.database/BKRA.cs index 6bbddbc4..a1c605a7 100644 --- a/bsmd.database/BKRA.cs +++ b/bsmd.database/BKRA.cs @@ -145,7 +145,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((BRKA)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((BRKA)obj).Identifier); } diff --git a/bsmd.database/BRKD.cs b/bsmd.database/BRKD.cs index 5581cee1..b4f243c3 100644 --- a/bsmd.database/BRKD.cs +++ b/bsmd.database/BRKD.cs @@ -144,7 +144,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((BRKD)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((BRKD)obj).Identifier); } diff --git a/bsmd.database/CallPurpose.cs b/bsmd.database/CallPurpose.cs index 32318505..a39cf382 100644 --- a/bsmd.database/CallPurpose.cs +++ b/bsmd.database/CallPurpose.cs @@ -133,7 +133,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((CallPurpose)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((CallPurpose)obj).Identifier); } diff --git a/bsmd.database/IBCPosition.cs b/bsmd.database/IBCPosition.cs index b34f9d1b..7e948d2a 100644 --- a/bsmd.database/IBCPosition.cs +++ b/bsmd.database/IBCPosition.cs @@ -314,7 +314,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((IBCPosition)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((IBCPosition)obj).Identifier); } diff --git a/bsmd.database/IGCPosition.cs b/bsmd.database/IGCPosition.cs index 93fe4a0c..71c09170 100644 --- a/bsmd.database/IGCPosition.cs +++ b/bsmd.database/IGCPosition.cs @@ -214,7 +214,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((IGCPosition)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((IGCPosition)obj).Identifier); } diff --git a/bsmd.database/IMDGPosition.cs b/bsmd.database/IMDGPosition.cs index 84099c60..054b2919 100644 --- a/bsmd.database/IMDGPosition.cs +++ b/bsmd.database/IMDGPosition.cs @@ -627,7 +627,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((IMDGPosition)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((IMDGPosition)obj).Identifier); } diff --git a/bsmd.database/IMSBCPosition.cs b/bsmd.database/IMSBCPosition.cs index 7299a138..e341fff2 100644 --- a/bsmd.database/IMSBCPosition.cs +++ b/bsmd.database/IMSBCPosition.cs @@ -262,7 +262,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((IMSBCPosition)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((IMSBCPosition)obj).Identifier); } diff --git a/bsmd.database/InfectedArea.cs b/bsmd.database/InfectedArea.cs index d7e7acf0..5b2ebc7b 100644 --- a/bsmd.database/InfectedArea.cs +++ b/bsmd.database/InfectedArea.cs @@ -122,7 +122,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((InfectedArea)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((InfectedArea)obj).Identifier); } diff --git a/bsmd.database/LADG.cs b/bsmd.database/LADG.cs index 3f867e8e..e7f380e7 100644 --- a/bsmd.database/LADG.cs +++ b/bsmd.database/LADG.cs @@ -242,7 +242,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((LADG)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((LADG)obj).Identifier); } diff --git a/bsmd.database/LastTenPortFacilitiesCalled.cs b/bsmd.database/LastTenPortFacilitiesCalled.cs index 6a2f592f..f990afff 100644 --- a/bsmd.database/LastTenPortFacilitiesCalled.cs +++ b/bsmd.database/LastTenPortFacilitiesCalled.cs @@ -201,7 +201,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((LastTenPortFacilitiesCalled)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((LastTenPortFacilitiesCalled)obj).Identifier); } diff --git a/bsmd.database/MARPOL_Annex_I_Position.cs b/bsmd.database/MARPOL_Annex_I_Position.cs index 89e1b816..9aa2adc5 100644 --- a/bsmd.database/MARPOL_Annex_I_Position.cs +++ b/bsmd.database/MARPOL_Annex_I_Position.cs @@ -227,7 +227,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((MARPOL_Annex_I_Position)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((MARPOL_Annex_I_Position)obj).Identifier); } diff --git a/bsmd.database/PortOfCallLast30Days.cs b/bsmd.database/PortOfCallLast30Days.cs index 7794f073..82cdefaa 100644 --- a/bsmd.database/PortOfCallLast30Days.cs +++ b/bsmd.database/PortOfCallLast30Days.cs @@ -300,7 +300,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((PortOfCallLast30Days)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((PortOfCallLast30Days)obj).Identifier); } diff --git a/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs b/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs index a2f93602..151e48f5 100644 --- a/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs +++ b/bsmd.database/PortOfCallLast30DaysCrewJoinedShip.cs @@ -120,7 +120,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((PortOfCallLast30DaysCrewJoinedShip)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((PortOfCallLast30DaysCrewJoinedShip)obj).Identifier); } diff --git a/bsmd.database/PortOfItinerary.cs b/bsmd.database/PortOfItinerary.cs index 700b0327..b48a6fa3 100644 --- a/bsmd.database/PortOfItinerary.cs +++ b/bsmd.database/PortOfItinerary.cs @@ -129,7 +129,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((PortOfItinerary)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((PortOfItinerary)obj).Identifier); } diff --git a/bsmd.database/SERV.cs b/bsmd.database/SERV.cs index 29013545..18fd9e19 100644 --- a/bsmd.database/SERV.cs +++ b/bsmd.database/SERV.cs @@ -131,7 +131,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((SERV)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((SERV)obj).Identifier); } diff --git a/bsmd.database/STO.cs b/bsmd.database/STO.cs index 01748a1f..2a058ca3 100644 --- a/bsmd.database/STO.cs +++ b/bsmd.database/STO.cs @@ -147,7 +147,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((STO)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((STO)obj).Identifier); } diff --git a/bsmd.database/SanitaryMeasuresDetail.cs b/bsmd.database/SanitaryMeasuresDetail.cs index 630ece8e..6f47c496 100644 --- a/bsmd.database/SanitaryMeasuresDetail.cs +++ b/bsmd.database/SanitaryMeasuresDetail.cs @@ -141,7 +141,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((SanitaryMeasuresDetail)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((SanitaryMeasuresDetail)obj).Identifier); } diff --git a/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs b/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs index 11a711ab..9e3f1492 100644 --- a/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs +++ b/bsmd.database/ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs @@ -234,7 +234,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((ShipToShipActivitiesDuringLastTenPortFacilitiesCalled)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((ShipToShipActivitiesDuringLastTenPortFacilitiesCalled)obj).Identifier); } diff --git a/bsmd.database/StowawaysJoiningLocation.cs b/bsmd.database/StowawaysJoiningLocation.cs index 0bb71eb6..a04ae3c1 100644 --- a/bsmd.database/StowawaysJoiningLocation.cs +++ b/bsmd.database/StowawaysJoiningLocation.cs @@ -115,7 +115,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((StowawaysJoiningLocation)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((StowawaysJoiningLocation)obj).Identifier); } diff --git a/bsmd.database/SubsidiaryRisks.cs b/bsmd.database/SubsidiaryRisks.cs index 803ad144..6076814b 100644 --- a/bsmd.database/SubsidiaryRisks.cs +++ b/bsmd.database/SubsidiaryRisks.cs @@ -108,7 +108,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((SubsidiaryRisks)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((SubsidiaryRisks)obj).Identifier); } diff --git a/bsmd.database/TOWA.cs b/bsmd.database/TOWA.cs index 8f599a6f..f590117d 100644 --- a/bsmd.database/TOWA.cs +++ b/bsmd.database/TOWA.cs @@ -25,7 +25,7 @@ namespace bsmd.database #region Properties [ShowReport] - [Validation(ValidationCode.NOT_NULL)] + [Validation(ValidationCode.NOT_NULL)] [MaxLength(100)] [ENI2Validation] public string TowageOnArrivalName { get; set; } @@ -36,42 +36,42 @@ namespace bsmd.database [ENI2Validation] public string TowageOnArrivalFlag { get; set; } - [ShowReport] + [ShowReport] [MaxLength(100)] [ENI2Validation] public string TowageOnArrivalOperatorCompanyName { get; set; } - [ShowReport] + [ShowReport] [MaxLength(100)] [ENI2Validation] public string TowageOnArrivalOperatorStreetNameAndNumber { get; set; } - [ShowReport] + [ShowReport] [MaxLength(24)] [ENI2Validation] public string TowageOnArrivalOperatorPostalCode { get; set; } - [ShowReport] + [ShowReport] [MaxLength(100)] [ENI2Validation] public string TowageOnArrivalOperatorCity { get; set; } - [ShowReport] + [ShowReport] [MaxLength(100)] [ENI2Validation] public string TowageOnArrivalOperatorCountry { get; set; } - [ShowReport] + [ShowReport] [MaxLength(100)] [ENI2Validation] public string TowageOnArrivalOperatorPhone { get; set; } - [ShowReport] + [ShowReport] [MaxLength(100)] [ENI2Validation] public string TowageOnArrivalOperatorFax { get; set; } - [ShowReport] + [ShowReport] [MaxLength(100)] [ENI2Validation] public string TowageOnArrivalOperatorEmail { get; set; } @@ -92,7 +92,7 @@ namespace bsmd.database public double? TowageOnArrivalBeam_MTR { get; set; } [ShowReport] - [Validation(ValidationCode.NOT_NULL)] + [Validation(ValidationCode.NOT_NULL)] [MaxLength(100)] [ENI2Validation] public string TowageOnArrivalPurposeOfCall { get; set; } @@ -102,7 +102,7 @@ namespace bsmd.database [ENI2Validation] public double? TowageOnArrivalDraught_DMT { get; set; } - [ShowReport] + [ShowReport] [MaxLength(255)] [ENI2Validation] public string TowageOnArrivalRemarks { get; set; } @@ -216,7 +216,7 @@ namespace bsmd.database if (!reader.IsDBNull(9)) towa.TowageOnArrivalOperatorFax = reader.GetString(9); if (!reader.IsDBNull(10)) towa.TowageOnArrivalOperatorEmail = reader.GetString(10); if (!reader.IsDBNull(11)) towa.TowageOnArrivalGrossTonnage = reader.GetInt32(11); - if (!reader.IsDBNull(12)) towa.TowageOnArrivalLengthOverall_MTR = (float) reader.GetDouble(12); + if (!reader.IsDBNull(12)) towa.TowageOnArrivalLengthOverall_MTR = (float)reader.GetDouble(12); if (!reader.IsDBNull(13)) towa.TowageOnArrivalBeam_MTR = (float)reader.GetDouble(13); if (!reader.IsDBNull(14)) towa.TowageOnArrivalPurposeOfCall = reader.GetString(14); if (!reader.IsDBNull(15)) towa.TowageOnArrivalDraught_DMT = (float)reader.GetDouble(15); @@ -271,13 +271,14 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((TOWA)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((TOWA)obj).Identifier); + + #endregion + } - - #endregion - } } diff --git a/bsmd.database/TOWD.cs b/bsmd.database/TOWD.cs index 033d3f70..94d8682d 100644 --- a/bsmd.database/TOWD.cs +++ b/bsmd.database/TOWD.cs @@ -254,7 +254,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((TOWD)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((TOWD)obj).Identifier); } diff --git a/bsmd.database/TreatmentFacilityProvider.cs b/bsmd.database/TreatmentFacilityProvider.cs index ad8cde1c..3a72b4a3 100644 --- a/bsmd.database/TreatmentFacilityProvider.cs +++ b/bsmd.database/TreatmentFacilityProvider.cs @@ -104,7 +104,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((TreatmentFacilityProvider)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((TreatmentFacilityProvider)obj).Identifier); } diff --git a/bsmd.database/WAS_RCPT.cs b/bsmd.database/WAS_RCPT.cs index d386ee0f..878a8a19 100644 --- a/bsmd.database/WAS_RCPT.cs +++ b/bsmd.database/WAS_RCPT.cs @@ -421,7 +421,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((WAS_RCPT)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((WAS_RCPT)obj).Identifier); } diff --git a/bsmd.database/Waste.cs b/bsmd.database/Waste.cs index 0f5cb68a..eb9fcc5d 100644 --- a/bsmd.database/Waste.cs +++ b/bsmd.database/Waste.cs @@ -279,7 +279,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((Waste)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((Waste)obj).Identifier); } diff --git a/bsmd.database/WasteDisposalServiceProvider.cs b/bsmd.database/WasteDisposalServiceProvider.cs index adb1f9ff..b23c4a41 100644 --- a/bsmd.database/WasteDisposalServiceProvider.cs +++ b/bsmd.database/WasteDisposalServiceProvider.cs @@ -110,7 +110,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((WasteDisposalServiceProvider)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((WasteDisposalServiceProvider)obj).Identifier); } diff --git a/bsmd.database/WasteReceived.cs b/bsmd.database/WasteReceived.cs index 9c7d4197..66245887 100644 --- a/bsmd.database/WasteReceived.cs +++ b/bsmd.database/WasteReceived.cs @@ -146,7 +146,8 @@ namespace bsmd.database public int CompareTo(object obj) { - if (obj is null) + if (this.Identifier == null) return 1; + if ((obj is null) || (((WasteReceived)obj).Identifier == null)) return 1; return this.Identifier.CompareTo(((WasteReceived)obj).Identifier); } From 04907e2104a8c6bfeb08bf274a794ca23b545255 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sat, 8 Jul 2023 12:20:40 +0200 Subject: [PATCH 02/25] SFTPSession entfernt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stattdessen wird ein open command gesendet. Gleichzeitig wird die Ausgabe nicht mehr zum Ende gelesen sondern per Events abgefragt. Die Hoffnung ist hier, dass der Prozess nicht mehr auf dem ReadToEnd() blockiert, wobei das nie bestätigt werden konnte. --- SendNSWMessageService/NSWSendService.cs | 4 +- bsmd.dakosy/sftp.cs | 65 ++++------ bsmd.dbh/MessageController.cs | 8 +- bsmd.dbh/Properties/Settings.Designer.cs | 8 +- bsmd.dbh/Properties/Settings.settings | 4 +- bsmd.dbh/RequestUtil.cs | 2 +- bsmd.dbh/ResponseUtil.cs | 2 +- bsmd.dbh/app.config | 4 +- misc/SendNSWMessageService.exe.config | 157 +++++++++++++++++++++++ 9 files changed, 195 insertions(+), 59 deletions(-) create mode 100644 misc/SendNSWMessageService.exe.config diff --git a/SendNSWMessageService/NSWSendService.cs b/SendNSWMessageService/NSWSendService.cs index 91056ea6..692a0878 100644 --- a/SendNSWMessageService/NSWSendService.cs +++ b/SendNSWMessageService/NSWSendService.cs @@ -292,9 +292,7 @@ namespace SendNSWMessageService // external processing for dbh bsmd.dbh.MessageController.SendAndReceive(); - List coresMarkedForStatusQuery = DBManager.Instance.GetMessageCoresWithNSWStatusFlag(); - - foreach (MessageCore core in coresMarkedForStatusQuery) + foreach (MessageCore core in DBManager.Instance.GetMessageCoresWithNSWStatusFlag()) { core.QueryNSWStatus = false; // reset flag Status aStatus = new Status(core); diff --git a/bsmd.dakosy/sftp.cs b/bsmd.dakosy/sftp.cs index 83c05cc5..153e28c4 100644 --- a/bsmd.dakosy/sftp.cs +++ b/bsmd.dakosy/sftp.cs @@ -97,7 +97,7 @@ namespace bsmd.dakosy } - public static void TransmitAll(string remoteDir, string localDir, Direction direction, string sessionName) + private static Process StartWinSCPProcess() { Process winscp = new Process(); winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath; @@ -107,12 +107,24 @@ namespace bsmd.dakosy winscp.StartInfo.RedirectStandardOutput = true; winscp.StartInfo.RedirectStandardError = true; winscp.StartInfo.CreateNoWindow = true; - winscp.Start(); + winscp.EnableRaisingEvents = true; + winscp.OutputDataReceived += (s, e) => _log.Debug(e.Data); + winscp.ErrorDataReceived += (s, e) => _log.Warn(e.Data); + winscp.Start(); + winscp.BeginErrorReadLine(); + winscp.BeginOutputReadLine(); + + return winscp; + } + + public static void TransmitAll(string remoteDir, string localDir, Direction direction, string openCommand) + { + Process winscp = StartWinSCPProcess(); // Feed in the scripting commands winscp.StandardInput.WriteLine("option batch abort"); winscp.StandardInput.WriteLine("option confirm off"); - winscp.StandardInput.WriteLine("open " + sessionName); + winscp.StandardInput.WriteLine(openCommand); winscp.StandardInput.WriteLine("lcd " + localDir); // winscp.StandardInput.WriteLine("ls"); if (remoteDir != null) @@ -120,63 +132,30 @@ namespace bsmd.dakosy if(direction == Direction.INCOMING) winscp.StandardInput.WriteLine("get *.xml"); if(direction == Direction.OUTGOING) - winscp.StandardInput.WriteLine("put *.xml"); - // move back up since winscp session remembers the last folder - winscp.StandardInput.WriteLine("cd .."); - winscp.StandardInput.WriteLine("cd .."); - winscp.StandardInput.Close(); - - // Collect all output - string output = winscp.StandardOutput.ReadToEnd(); - _log.Debug(output); - output = winscp.StandardError.ReadToEnd(); - if(!output.Trim().IsNullOrEmpty()) - _log.Warn(output); + winscp.StandardInput.WriteLine("put *.xml"); + winscp.StandardInput.Close(); // Wait until WinSCP finishes winscp.WaitForExit(); } - public static void RemoveProcessedFile(string remoteDir, string filename, string sessionName) + public static void RemoveProcessedFile(string remoteDir, string filename, string openCommand) { - Process winscp = new Process(); - winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath; - winscp.StartInfo.Arguments = "/xmllog=\"" + Properties.Settings.Default.SFTPLog + "\""; - winscp.StartInfo.UseShellExecute = false; - winscp.StartInfo.RedirectStandardInput = true; - winscp.StartInfo.RedirectStandardOutput = true; - winscp.StartInfo.RedirectStandardError = true; - winscp.StartInfo.CreateNoWindow = true; - winscp.Start(); + Process winscp = StartWinSCPProcess(); // Feed in the scripting commands winscp.StandardInput.WriteLine("option batch abort"); winscp.StandardInput.WriteLine("option confirm off"); - winscp.StandardInput.WriteLine("open " + sessionName); + winscp.StandardInput.WriteLine(openCommand); // winscp.StandardInput.WriteLine("ls"); if (remoteDir != null) winscp.StandardInput.WriteLine("cd " + remoteDir); - winscp.StandardInput.WriteLine("rm " + filename); - if (remoteDir != null) - { - // move back up since winscp session remembers the last folder - winscp.StandardInput.WriteLine("cd .."); - winscp.StandardInput.WriteLine("cd .."); - } - winscp.StandardInput.Close(); - - // Collect all output - string output = winscp.StandardOutput.ReadToEnd(); - _log.Debug(output); - output = winscp.StandardError.ReadToEnd(); - if (!output.Trim().IsNullOrEmpty()) - _log.Warn(output); + winscp.StandardInput.WriteLine("rm " + filename); + winscp.StandardInput.Close(); // Wait until WinSCP finishes winscp.WaitForExit(); - } - } } diff --git a/bsmd.dbh/MessageController.cs b/bsmd.dbh/MessageController.cs index f634d7b9..0dc06443 100644 --- a/bsmd.dbh/MessageController.cs +++ b/bsmd.dbh/MessageController.cs @@ -6,7 +6,7 @@ using System; using System.IO; using bsmd.database; -using System.Linq; + namespace bsmd.dbh { @@ -117,7 +117,7 @@ namespace bsmd.dbh public static void SendAndReceive() { // sent unsent messages in output folder - bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteIncomingFolder, Properties.Settings.Default.OutgoingFolder, dakosy.SFtp.Direction.OUTGOING, Properties.Settings.Default.SFTPSessionName); + bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteIncomingFolder, Properties.Settings.Default.OutgoingFolder, dakosy.SFtp.Direction.OUTGOING, Properties.Settings.Default.SFTPOpenCommand); // move files from output folder to archive folder foreach(string sentFile in Directory.GetFiles(Properties.Settings.Default.OutgoingFolder)) { @@ -130,7 +130,7 @@ namespace bsmd.dbh // receive files from remote host // SFTP verbindung öffnen und alle Dateien herunterladen - bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteOutgoingFolder, Properties.Settings.Default.IncomingFolder, dakosy.SFtp.Direction.INCOMING, Properties.Settings.Default.SFTPSessionName); + bsmd.dakosy.SFtp.TransmitAll(Properties.Settings.Default.RemoteOutgoingFolder, Properties.Settings.Default.IncomingFolder, dakosy.SFtp.Direction.INCOMING, Properties.Settings.Default.SFTPOpenCommand); foreach (string inputFile in Directory.GetFiles(Properties.Settings.Default.IncomingFolder)) { @@ -151,7 +151,7 @@ namespace bsmd.dbh File.Delete(inputFile); } // remote Dateien löschen - bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPSessionName); + bsmd.dakosy.SFtp.RemoveProcessedFile(Properties.Settings.Default.RemoteOutgoingFolder, Path.GetFileName(inputFile), Properties.Settings.Default.SFTPOpenCommand); } } diff --git a/bsmd.dbh/Properties/Settings.Designer.cs b/bsmd.dbh/Properties/Settings.Designer.cs index d448198b..c8c71aea 100644 --- a/bsmd.dbh/Properties/Settings.Designer.cs +++ b/bsmd.dbh/Properties/Settings.Designer.cs @@ -89,15 +89,17 @@ namespace bsmd.dbh.Properties { [global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("dbh")] - public string SFTPSessionName { + public string SFTPOpenCommand { get { - return ((string)(this["SFTPSessionName"])); + return ((string)(this["SFTPOpenCommand"])); } } [global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] + [global::System.Configuration.DefaultSettingValueAttribute("sftp://f-000333@fx.dbh.de/ -hostkey=\"ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5" + + "fXsUyZsVCSufyATbGKLh+ak\" -privatekey=\"C:\\work\\Services\\SendNSWMessageService\\dbh" + + "\\sshkeynp.ppk\"")] public string IncomingErrorFolder { get { return ((string)(this["IncomingErrorFolder"])); diff --git a/bsmd.dbh/Properties/Settings.settings b/bsmd.dbh/Properties/Settings.settings index 4db2b6c2..477b320d 100644 --- a/bsmd.dbh/Properties/Settings.settings +++ b/bsmd.dbh/Properties/Settings.settings @@ -23,11 +23,11 @@ test/dbh_2_bsmd - + dbh - + sftp://f-000333@fx.dbh.de/ -hostkey="ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5fXsUyZsVCSufyATbGKLh+ak" -privatekey="C:\work\Services\SendNSWMessageService\dbh\sshkeynp.ppk" 00006017 diff --git a/bsmd.dbh/RequestUtil.cs b/bsmd.dbh/RequestUtil.cs index 4aeed901..5013b7f5 100644 --- a/bsmd.dbh/RequestUtil.cs +++ b/bsmd.dbh/RequestUtil.cs @@ -778,7 +778,7 @@ namespace bsmd.dbh rootPre.TankerDetails.ConditionCargoBallastTanks = (TankCondition)pre72h.ConditionCargoBallastTanks.Value; if (pre72h.NatureOfCargo != string.Empty) rootPre.TankerDetails.TypeOfCargo = pre72h.NatureOfCargo; - bool sendVolume = pre72h.VolumeOfCargo.HasValue && (pre72h.VolumeOfCargo.Value > 0); + bool sendVolume = pre72h.VolumeOfCargo > 0; rootPre.TankerDetails.VolumeOfCargo_TNESpecified = sendVolume; if (sendVolume) rootPre.TankerDetails.VolumeOfCargo_TNE = Decimal.Round((decimal)(pre72h.VolumeOfCargo.Value), 3); diff --git a/bsmd.dbh/ResponseUtil.cs b/bsmd.dbh/ResponseUtil.cs index 5d9905e5..c7ce3086 100644 --- a/bsmd.dbh/ResponseUtil.cs +++ b/bsmd.dbh/ResponseUtil.cs @@ -129,7 +129,7 @@ namespace bsmd.dbh case Response.RootType.RESET: if(root.ReportingClassesResetted?.ReportingClass.Length > 0) { - _log.InfoFormat("Message {0} RESET confirmed, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length); ; + _log.InfoFormat("Message {0} RESET confirmed, {1} messages", sentMessage.MessageNotificationClassDisplay, root.Messages.Length); sentMessage.SendSuccess = false; // bestätigter Reset setzt grünen Buppel zurück sentMessage.Status = Message.MessageStatus.ACCEPTED; sentMessage.InternalStatus = Message.BSMDStatus.CONFIRMED; diff --git a/bsmd.dbh/app.config b/bsmd.dbh/app.config index b9d62b74..391f6795 100644 --- a/bsmd.dbh/app.config +++ b/bsmd.dbh/app.config @@ -28,11 +28,11 @@ test/dbh_2_bsmd - + dbh - + sftp://f-000333@fx.dbh.de/ -hostkey="ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5fXsUyZsVCSufyATbGKLh+ak" -privatekey="C:\work\Services\SendNSWMessageService\dbh\sshkeynp.ppk" 00006017 diff --git a/misc/SendNSWMessageService.exe.config b/misc/SendNSWMessageService.exe.config new file mode 100644 index 00000000..5edee9d4 --- /dev/null +++ b/misc/SendNSWMessageService.exe.config @@ -0,0 +1,157 @@ + + + +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + BSMD-PROD + + + t7g7fDP18#7GQw#D + + + https://www.his-nord.de/HIS-Service/StatusInfoNSW.jsp + + + + + Initial Catalog=nswtest;Data Source=192.168.2.24\SQLEXPRESS;Uid=dfuser;pwd=dfpasswd;Persist Security Info=False;Connection Reset=false + + + 30 + + + + + dakosy + + + c:\temp\sftp_log.xml + + + c:\work\dakosy\out + + + c:\work\dakosy\in + + + True + + + c:\work\Tools\WinSCP\WinSCP.com + + + in/prod/ed02 + + + in/test/ed02 + + + out/prod + + + out/test + + + + + https://edi-gate.dbh.de/bsmd-soap + + + 00003050 + + + + + 00006017 + + + C:\temp\dbh\out + + + C:\temp\dbh\out_archive + + + C:\temp\dbh\in + + + C:\temp\dbh\in_archive + + + C:\temp\dbh\in_error + + + test/bsmd_2_dbh + + + test/dbh_2_bsmd + + + open sftp://f-000333@fx.dbh.de/ -hostkey="ecdsa-sha2-nistp256 256 453JBU8hAOOQ7wEvmTw5fXsUyZsVCSufyATbGKLh+ak" -privatekey="C:\git_lager\git_bsmd\bsmd.dbh\misc\sshkeynp.ppk" + + + + + C:\work\HIS-NORD\Test + + + IMP + + + client.bat + + + 1 + + + RESULTS + + + ANSWERS + + + ANSWERS_DONE + + + ANSWERS_CORRUPT + + + + + + + + + + + + \ No newline at end of file From 85cfe5155ffa7e6cd73dfb2498190ca26e54f2bc Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 9 Jul 2023 12:19:18 +0200 Subject: [PATCH 03/25] =?UTF-8?q?Version=20erh=C3=B6ht,=20zur=C3=BCckgeste?= =?UTF-8?q?llt=20zur=20Testversion,=20Sortierung=20Waste=20/=20WAS=5FRCPT?= =?UTF-8?q?=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ENI2/App.config | 2 +- ENI2/Resources/EUREPORT.png | Bin 39708 -> 42234 bytes .../Properties/AssemblyProductInfo.cs | 2 +- .../Properties/AssemblyProjectInfo.cs | 2 +- bsmd.database/TreatmentFacilityProvider.cs | 6 ++++++ bsmd.database/WAS.cs | 2 +- bsmd.database/WAS_RCPT.cs | 2 ++ bsmd.database/Waste.cs | 2 ++ bsmd.database/WasteReceived.cs | 2 ++ 9 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ENI2/App.config b/ENI2/App.config index 4c7c4bc1..6105b6f2 100644 --- a/ENI2/App.config +++ b/ENI2/App.config @@ -29,7 +29,7 @@ http://192.168.2.24/LockingService/LockingService.svc - Initial Catalog=nsw;Data Source=192.168.2.24\SQLEXPRESS;Uid=dfuser;pwd=dfpasswd;Persist Security Info=False;Connection Reset=false + Initial Catalog=nswtest;Data Source=192.168.2.24\SQLEXPRESS;Uid=dfuser;pwd=dfpasswd;Persist Security Info=False;Connection Reset=false diff --git a/ENI2/Resources/EUREPORT.png b/ENI2/Resources/EUREPORT.png index a5a38e0c4e30f28c8b64275c1c314435775a38b2..375b2af774cc1ebfbcfab724756710c3314fda32 100644 GIT binary patch literal 42234 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 literal 39708 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 F{{y9*T1)@{ diff --git a/bsmd.database/Properties/AssemblyProductInfo.cs b/bsmd.database/Properties/AssemblyProductInfo.cs index c0ffb117..72844833 100644 --- a/bsmd.database/Properties/AssemblyProductInfo.cs +++ b/bsmd.database/Properties/AssemblyProductInfo.cs @@ -2,6 +2,6 @@ [assembly: AssemblyCompany("schick Informatik")] [assembly: AssemblyProduct("BSMD NSW interface")] -[assembly: AssemblyInformationalVersion("7.12.0")] +[assembly: AssemblyInformationalVersion("7.13.0")] [assembly: AssemblyCopyright("Copyright © 2014-2023 schick Informatik")] [assembly: AssemblyTrademark("")] \ No newline at end of file diff --git a/bsmd.database/Properties/AssemblyProjectInfo.cs b/bsmd.database/Properties/AssemblyProjectInfo.cs index ddc6e746..95f10891 100644 --- a/bsmd.database/Properties/AssemblyProjectInfo.cs +++ b/bsmd.database/Properties/AssemblyProjectInfo.cs @@ -1,4 +1,4 @@ using System.Reflection; -[assembly: AssemblyVersion("7.12.0.*")] +[assembly: AssemblyVersion("7.13.0.*")] diff --git a/bsmd.database/TreatmentFacilityProvider.cs b/bsmd.database/TreatmentFacilityProvider.cs index 3a72b4a3..d3e45e72 100644 --- a/bsmd.database/TreatmentFacilityProvider.cs +++ b/bsmd.database/TreatmentFacilityProvider.cs @@ -12,11 +12,15 @@ namespace bsmd.database public class TreatmentFacilityProvider : DatabaseEntity, ISublistElement { + #region Construction + public TreatmentFacilityProvider() { this.tablename = "[dbo].[TreatmentFacilityProvider]"; } + #endregion + #region Properties [JsonIgnore] @@ -107,6 +111,8 @@ namespace bsmd.database if (this.Identifier == null) return 1; if ((obj is null) || (((TreatmentFacilityProvider)obj).Identifier == null)) return 1; + if (Int32.TryParse(((TreatmentFacilityProvider)obj).Identifier, out int i1) && Int32.TryParse(this.Identifier, out int i2)) + return i2.CompareTo(i1); return this.Identifier.CompareTo(((TreatmentFacilityProvider)obj).Identifier); } diff --git a/bsmd.database/WAS.cs b/bsmd.database/WAS.cs index b427b419..3dcf06a3 100644 --- a/bsmd.database/WAS.cs +++ b/bsmd.database/WAS.cs @@ -582,5 +582,5 @@ namespace bsmd.database #endregion - } + } } diff --git a/bsmd.database/WAS_RCPT.cs b/bsmd.database/WAS_RCPT.cs index 878a8a19..178c0bfd 100644 --- a/bsmd.database/WAS_RCPT.cs +++ b/bsmd.database/WAS_RCPT.cs @@ -424,6 +424,8 @@ namespace bsmd.database if (this.Identifier == null) return 1; if ((obj is null) || (((WAS_RCPT)obj).Identifier == null)) return 1; + if (Int32.TryParse(((WAS_RCPT)obj).Identifier, out int i1) && Int32.TryParse(this.Identifier, out int i2)) + return i2.CompareTo(i1); return this.Identifier.CompareTo(((WAS_RCPT)obj).Identifier); } diff --git a/bsmd.database/Waste.cs b/bsmd.database/Waste.cs index eb9fcc5d..eadad093 100644 --- a/bsmd.database/Waste.cs +++ b/bsmd.database/Waste.cs @@ -282,6 +282,8 @@ namespace bsmd.database if (this.Identifier == null) return 1; if ((obj is null) || (((Waste)obj).Identifier == null)) return 1; + if (Int32.TryParse(((Waste)obj).Identifier, out int i1) && Int32.TryParse(this.Identifier, out int i2)) + return i2.CompareTo(i1); return this.Identifier.CompareTo(((Waste)obj).Identifier); } diff --git a/bsmd.database/WasteReceived.cs b/bsmd.database/WasteReceived.cs index 66245887..76e4244b 100644 --- a/bsmd.database/WasteReceived.cs +++ b/bsmd.database/WasteReceived.cs @@ -149,6 +149,8 @@ namespace bsmd.database if (this.Identifier == null) return 1; if ((obj is null) || (((WasteReceived)obj).Identifier == null)) return 1; + if (Int32.TryParse(((WasteReceived)obj).Identifier, out int i1) && Int32.TryParse(this.Identifier, out int i2)) + return i2.CompareTo(i1); return this.Identifier.CompareTo(((WasteReceived)obj).Identifier); } From b7ce7aea90a0d1fae52bbae10ff1a1d8f3bda854 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 9 Jul 2023 12:58:51 +0200 Subject: [PATCH 04/25] Value Mapping Menu Item is visible depending on user editor flag --- ENI2/MainWindow.xaml.cs | 5 +++-- bsmd.database/DBManager.cs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ENI2/MainWindow.xaml.cs b/ENI2/MainWindow.xaml.cs index b2d79b51..fe74062f 100644 --- a/ENI2/MainWindow.xaml.cs +++ b/ENI2/MainWindow.xaml.cs @@ -675,9 +675,10 @@ namespace ENI2 this.menuItemValueMappings.Visibility = Visibility.Visible; if (this.userEntity.IsAdmin) { - this.menuItemUserAdministration.Visibility = Visibility.Visible; + this.menuItemUserAdministration.Visibility = Visibility.Visible; this.sucheControl.AdminMode = true; - } + } + this.menuItemValueMappings.Visibility = this.userEntity.IsEditor ? Visibility.Visible : Visibility.Hidden; break; case ReportingParty.LogonResult.FAILED: this.labelLoginResult.Content = Properties.Resources.textWrongPassword; diff --git a/bsmd.database/DBManager.cs b/bsmd.database/DBManager.cs index 35dded31..578aa46a 100644 --- a/bsmd.database/DBManager.cs +++ b/bsmd.database/DBManager.cs @@ -801,7 +801,7 @@ namespace bsmd.database if ((this._con == null) || (this._con.State == ConnectionState.Closed)) this.Connect(this.ConnectionString); - } + } private void LogNonQueryResult(string query, int queryResult) { From ef65f2545f8c74f4cd39db3432288b00b967b130 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 9 Jul 2023 14:13:45 +0200 Subject: [PATCH 05/25] Beim Excel Import wird ChangedBy der Meldeklasse auf den aktuellen Benutzer gesetzt --- ENI2/Excel/ExcelReader.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ENI2/Excel/ExcelReader.cs b/ENI2/Excel/ExcelReader.cs index 41e315cf..bfac312f 100644 --- a/ENI2/Excel/ExcelReader.cs +++ b/ENI2/Excel/ExcelReader.cs @@ -49,9 +49,14 @@ namespace ENI2.Excel { message.CreatedBy = "EXCEL"; if (message.MessageNotificationClass == Message.NotificationClass.STO) + { message.InternalStatus = Message.BSMDStatus.PREPARE; + } else + { message.InternalStatus = Message.BSMDStatus.EXCEL; + message.ChangedBy = ReportingParty.CurrentReportingParty?.Logon; + } message.UnsentMessageWarningShown = false; DBManager.Instance.Save(message); message.SaveElements(); From 12e65a27e4b55ab1c45c5707f6d0367d675e7634 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 9 Jul 2023 14:20:27 +0200 Subject: [PATCH 06/25] Aus >100.000 Werten errors statt violations machen --- bsmd.database/BKRA.cs | 6 +++++- bsmd.database/BRKD.cs | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/bsmd.database/BKRA.cs b/bsmd.database/BKRA.cs index a1c605a7..9dbc8857 100644 --- a/bsmd.database/BKRA.cs +++ b/bsmd.database/BKRA.cs @@ -18,11 +18,15 @@ namespace bsmd.database public class BRKA : DatabaseEntity, ISublistElement { + #region Construction + public BRKA() { this.tablename = "[dbo].[BKRA]"; } + #endregion + #region Properties [ShowReport] @@ -124,7 +128,7 @@ namespace bsmd.database { if(this.BunkerFuelQuantity_TNE.HasValue && this.BunkerFuelQuantity_TNE > 10000) { - violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Bunker quantity too high?", null, this.Title, this.Identifier, "BKRA")); + errors.Add(RuleEngine.CreateError(ValidationCode.IMPLAUSIBLE, "Bunker quantity too high?", null, this.Title, this.Identifier, "BKRA")); } } diff --git a/bsmd.database/BRKD.cs b/bsmd.database/BRKD.cs index b4f243c3..d5093e4a 100644 --- a/bsmd.database/BRKD.cs +++ b/bsmd.database/BRKD.cs @@ -18,11 +18,15 @@ namespace bsmd.database public class BRKD : DatabaseEntity, ISublistElement { + #region Construction + public BRKD() { this.tablename = "[dbo].[BKRD]"; } + #endregion + #region Properties [ShowReport] @@ -123,7 +127,7 @@ namespace bsmd.database { if (this.BunkerFuelQuantity_TNE.HasValue && this.BunkerFuelQuantity_TNE > 10000) { - violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "Bunker quantity too high?", null, this.Title, this.Identifier, "BKRD")); + errors.Add(RuleEngine.CreateError(ValidationCode.IMPLAUSIBLE, "Bunker quantity too high?", null, this.Title, this.Identifier, "BKRD")); } } From 1da414a782d2c6cce6db73d65337cc7bb42ffb7e Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 9 Jul 2023 15:05:41 +0200 Subject: [PATCH 07/25] =?UTF-8?q?MV=20/=20SH=20Hafenliste=20der=20SQlite?= =?UTF-8?q?=20DB=20hinzugef=C3=BCgt=20Dadurch=20ist=20es=20m=C3=B6glich,?= =?UTF-8?q?=20f=C3=BCr=20die=20betreffenden=20H=C3=A4fen=20eine=20zus?= =?UTF-8?q?=C3=A4tzliche=20Validierung=20zu=20machen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ENI2/App.xaml.cs | 1 + ENI2/LocalizedLookup.cs | 16 ++++++++++++++++ .../bsmd.LockingService.csproj.user | 2 +- bsmd.database/LADG.cs | 15 +++++++++++++-- misc/db.sqlite | Bin 14426112 -> 14426112 bytes 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/ENI2/App.xaml.cs b/ENI2/App.xaml.cs index b2ca4b37..d2304b61 100644 --- a/ENI2/App.xaml.cs +++ b/ENI2/App.xaml.cs @@ -72,6 +72,7 @@ namespace ENI2 Dictionary cargoHandlingDict = LocalizedLookup.getLADGCargoHandlingStrings(langKey); foreach (int key in cargoHandlingDict.Keys) LADG.CargoHandlingDict.Add(key, cargoHandlingDict[key]); + LADG.MVSHLocodes.AddRange(LocalizedLookup.getMVSHLocodes()); EventManager.RegisterClassHandler(typeof(DatePicker), DatePicker.PreviewKeyDownEvent, new KeyEventHandler(this.DatePicker_PreviewKeyDown)); CREW.NationalityDict = LocalizedLookup.getNationalities(); diff --git a/ENI2/LocalizedLookup.cs b/ENI2/LocalizedLookup.cs index cf521efc..4956f671 100644 --- a/ENI2/LocalizedLookup.cs +++ b/ENI2/LocalizedLookup.cs @@ -288,5 +288,21 @@ namespace ENI2 reader.Close(); return result; } + + public static List getMVSHLocodes() + { + List result = new List(); + + string query = string.Format("SELECT locode from MVSH_ports"); + SQLiteCommand cmd = new SQLiteCommand(query, _con); + IDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + { + if (reader.IsDBNull(0)) continue; + result.Add(reader.GetString(0)); + } + reader.Close(); + return result; + } } } diff --git a/bsmd.LockingService/bsmd.LockingService.csproj.user b/bsmd.LockingService/bsmd.LockingService.csproj.user index 3517ad61..afa33dd1 100644 --- a/bsmd.LockingService/bsmd.LockingService.csproj.user +++ b/bsmd.LockingService/bsmd.LockingService.csproj.user @@ -2,7 +2,7 @@ true - Release|Any CPU + Debug|Any CPU diff --git a/bsmd.database/LADG.cs b/bsmd.database/LADG.cs index e7f380e7..6753fb63 100644 --- a/bsmd.database/LADG.cs +++ b/bsmd.database/LADG.cs @@ -41,7 +41,7 @@ namespace bsmd.database { 65, "Wechselbrücken / -behälter" }, { 66, "Eisenbahngüterwagen" }, { 67, "Reisezugwagen und Triebwagen" } - }); + }); #endregion @@ -119,6 +119,8 @@ namespace bsmd.database public static Dictionary CargoHandlingDict { get; } = new Dictionary(); + public static List MVSHLocodes { get; } = new List(); + #endregion #region DatabaseEntity implementation @@ -212,7 +214,7 @@ namespace bsmd.database #endregion - #region Validation + #region Validation public override void Validate(List errors, List violations) { @@ -234,6 +236,15 @@ namespace bsmd.database errors.Add(RuleEngine.CreateError(ValidationCode.LOCODE, "PortOfLoading", this.PortOfLoading, this.Title, this.Identifier, this.Tablename)); } + if(LADG.MVSHLocodes.Contains(this.MessageCore.PoC)) + { + if (this.CargoCodeNST_3.IsNullOrEmpty()) + violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "CargoCodeNST_3 empty", this.CargoCodeNST_3, this.Title, this.Identifier, this.Tablename)); + + if(!this.CargoLACode.HasValue) + violations.Add(RuleEngine.CreateViolation(ValidationCode.IMPLAUSIBLE, "CargoLACode empty", "not set", this.Title, this.Identifier, this.Tablename)); + } + } #endregion diff --git a/misc/db.sqlite b/misc/db.sqlite index 15570602a0e96724922429c1b456f93dc9928a33..4bfc9c1a915f3635aae44952766a8e9848eb99fb 100644 GIT binary patch delta 1458 zcmYMySy+@+9LMo@hJnNS9svau6&PGVlrmdwo#ln0nPF%aKrPH=vXTOo7OM%;{7F(N zWnqhzEmXGnFDk68#InW87AxB>y6K{u9v?62qMLs2%Y_%8^L)>9&U2n~p63i4K9w^- zyDE$QhEa6HFmhoSF0Wx2UBe5P6#9+ESf+@x5>Mms`dXJ~#C3YKYP{{#wzPY!G;5}- z)tggZQ{ztetyr3_H8;-xkG`toctE~2G$ zF~8)zeKqCUEXZl&AkcG^sL(4BM_ zW$13|rvbW$w$N6(m$ngT`*_APxFeihV;BYL@xr#je_|^PqruD=`d|IG{!{<1Pv~QM zLLbxz^r+seck3a&MQ_%F zX6`rlnS0EgCd`oy1B;sNzh04Rj}zJbs=-|zv^tiB)dDAC5moO*OG4E-VRfkalMz(& zobbifTszuZI@BCHQh~6lwIdmCSKi48sv0L^ma4WRk&LJ+Cn5X{zOqJOYO@-AoJ0iUFR44pVRXP~~Rboe& z=M>w~;)|*&c7#$1rTd*qrj+SKJgSPE2sNofCz>Owz>em4P~|%jNvS+Lnj%dq*A9!X zS9Sz_%__$Z|MIxXb|Mv39w+$1EGOcA<#xg!QZ9E6cl$yC$ROlC$PUO5MkcS`-Lv}+RfjkNsf$V`i26-Iv1msD`UdU6Bry&)BjhK@NyyKTUm(AZ I%5S~@11jR``Tzg` delta 2562 zcmaLZYj73i83*u9vL~058xi%K1f&URL<$`Da(2%iq;NtY!H`Wt2rLv3HZjl$3{bGhJI-> zzq7lO^ZfVSXW#do?7#47?tU1ZQI-;f;x`2$p9w-%wIB!^$L6a=DIwPIY%#9N#DTHx z)x2;2g8K8VpE^sj&rQ#nnRWPbsCpj$$|E&3*@NAC?2a8>O|{D!HaD+sS0pKM+d00~ zTQfW$J~1F>K{n)oe;tBc$b)<+fG`w75fnoSl)^M9gF9e4+zEHV-4KB<Tr~fSGU) z%!1EBB~-y|sD{r&4crTJ;69iOUx0Zq9~M9i?gt5EP(Xz^XrMy^3`oL4cmNi`7hy3h zffUrjQmBJvupH{40an0+&|%Hz6JyEb$A^1 z!ypX7FpPi$44ybYAi7Vk49&(YJb1pS)%~nx^?Sk`VL~WNIKPg;Sm>=F7zOUeDK~w%@eqY`vc}MfYxo_nz3jI5@D>Pp`Ek2TSE$4-t`?IfQ zcW2MdI+L|gxFPVt(Y2Lg)&s%@el>L z&z&O(r8j@dYK0mh+}fIKwL7*tUKc+%?w%DlIbJ7UbrGdkkGOa88^?~{%~LPBx#dbs zPb73jOQ^D@t*(@GH7;4%mxQX|+XXFk?JYfv9Iu049T<)9kB_)D;%3LQx!mDK?`m$Y zZBF;3x7oY**tbsj3GcZ`5FSxtsv>EUt|>{`@WT_TWaS*ro~SCvl1a&sR72Gy8Hrj_)-AD-XGKnx zhciVB9q%Dt=69)vyR*ghj<<xNUT7jE+q^_N~&?yAERc( z6IQ5DsPv1b7YE(+3k}EH$ZO9WiSUU*w@S1fZv$Vo(v3#U_Bu1&v!|=m?%RRnn`iuN z>QFhSmt8R;#}r*P6j{eX^=}c6YgXt(emOQ?UJwrIQ+V)QlP9D6{XuuG*5P>TgEw1U zb^DvG^WUs#HU&4SH0_Je@4I>0y>A^qyKEvF+)$TdMk1*yil(Zv;`d!qbu0IjQ1yR9 z`F{r8`{PJTs#P%WW=va)*@c+4Ow6^Z7~I7l z(ZXTGC`-qqGZcLxk~EAci2-3)euoTAvBG&lQf}B>-)7o;*09?oZg;#Ee*Ir3BitEw ztAlY=pc=(-2{Q)2K|fT@3jYm@#{VWBsIA?!8y&Bi4}O-ZRK=Z+XY$f_Fn_KLyERh} zWW*AB5_1n}QjeN^f zxJk{3yTBjngPEc39Kld;H2A$YVzQzt8kTTe3s#;X$yRYX7%EmCCV@ZH6H;A6&UdGIC@v4o+kT2fJylHW@`AsbeSJhh^OLagZe z%!-~I!HUNIvplo^m<`KJd)veIj;dN4*ken=Yn#?I^<#{|$L$?V#AHcPHA7Kl)t~=5)|OTJ41eP_bTFvG*1R;c zH7|DDS$=5kR46i=`ge5g4nDX&IrZ3jERoa=JuWMHFqN@K$`<}f2_l0UM5Z#4k0Fwg z%jf{3Cm9`N^bJPeWORtpw-}8w8e{ZrMu!=VGdjX(f)QtQl+iIp-(mD!M&D!feMV0) zdYaL3Mkg4ZWORzr4;Vee=rp4&IozVqGZ!mh3(M3jYG5RH=w;BD4(XSc3!{|4R ve#__*qu()lm(lMTy~pS>qxTtIVe|o`KQQ``(H|N8iP4`K{pB?Mb=Q9Zsc)1u From 59e51cd5862a8292de2a2c4f3d0e624ea7e536aa Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Mon, 10 Jul 2023 10:40:45 +0200 Subject: [PATCH 08/25] Added flag not to avoid parallel update of server status --- ENI2/Controls/ServerStatusControl.xaml.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/ENI2/Controls/ServerStatusControl.xaml.cs b/ENI2/Controls/ServerStatusControl.xaml.cs index c3ddd1e9..94a92bca 100644 --- a/ENI2/Controls/ServerStatusControl.xaml.cs +++ b/ENI2/Controls/ServerStatusControl.xaml.cs @@ -27,6 +27,7 @@ namespace ENI2.Controls private readonly static ILog _log = LogManager.GetLogger("ServerStatus"); private ProgressBar _updateProgressBar; private TextBlock _updateTextBlock; + private bool _isUpdating = false; public ServerStatusControl() { @@ -37,12 +38,14 @@ namespace ENI2.Controls } private void ServerStatusControl_Loaded(object sender, System.Windows.RoutedEventArgs e) - { + { this.refreshButton_Click(null, null); } internal void Update(LockingServiceReference.ServerStatus serverStatus) { + if (this._isUpdating) return; + _isUpdating = true; int totalNum = serverStatus.IMPFiles.Length + serverStatus.READYFiles.Length + serverStatus.CORRUPTFiles.Length; entries.Clear(); BackgroundWorker bgWorker = new BackgroundWorker(); @@ -93,10 +96,10 @@ namespace ENI2.Controls tmpList.Sort(); - System.Windows.Application.Current.Dispatcher.Invoke(delegate { + //System.Windows.Application.Current.Dispatcher.Invoke(delegate { foreach (StatusEntry se in tmpList) - entries.Add(se); - }); + entries.Add(se); + //}); }; bgWorker.RunWorkerCompleted += (o, e) => @@ -113,6 +116,8 @@ namespace ENI2.Controls this.labelStatusTransmitter.Content = transmitter.ToString(); this.busyIndicator.IsBusy = false; + + _isUpdating = false; }; this.busyIndicator.IsBusy = true; From ab2dde2f72e8246ae62bfc074294961389e18a04 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Mon, 10 Jul 2023 12:15:26 +0200 Subject: [PATCH 09/25] =?UTF-8?q?Templates=20f=C3=BCr=20WasteDisposalServi?= =?UTF-8?q?ceProvider=20Part=20I?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Datenbank Klassen, Async Zugriff. AGNT_template bei der Gelegenheit auch umgebaut --- SQL/WSDP_template.7.13.sql | 23 ++++ bsmd.database/AGNT_Template.cs | 25 ++++- bsmd.database/DBManagerAsync.cs | 18 +++ .../WasteDisposalServiceProvider_Template.cs | 104 ++++++++++++++++++ bsmd.database/bsmd.database.csproj | 1 + 5 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 SQL/WSDP_template.7.13.sql create mode 100644 bsmd.database/WasteDisposalServiceProvider_Template.cs diff --git a/SQL/WSDP_template.7.13.sql b/SQL/WSDP_template.7.13.sql new file mode 100644 index 00000000..ff8387dd --- /dev/null +++ b/SQL/WSDP_template.7.13.sql @@ -0,0 +1,23 @@ +PRINT N'Creating [dbo].[WasteDisposalServiceProvider_template]...'; + +GO +CREATE TABLE [dbo].[WasteDisposalServiceProvider_template] ( + [Id] UNIQUEIDENTIFIER NOT NULL, + [WasteDisposalServiceProviderName] NVARCHAR (50) NULL, + [Created] DATETIME NULL DEFAULT CURRENT_TIMESTAMP, + [Changed] DATETIME NULL, + PRIMARY KEY CLUSTERED ([Id] ASC) +); + +GO + +CREATE TRIGGER WasteDisposalServiceProvider_template_Trigger_Change_Log +ON + dbo.WasteDisposalServiceProvider_template + FOR UPDATE + AS + SET NOCOUNT ON + IF NOT UPDATE([Changed]) + UPDATE WasteDisposalServiceProvider_template SET [Changed] = GETDATE() WHERE Id IN (SELECT Id FROM [inserted]) + +GO \ No newline at end of file diff --git a/bsmd.database/AGNT_Template.cs b/bsmd.database/AGNT_Template.cs index 8585eee1..49d66986 100644 --- a/bsmd.database/AGNT_Template.cs +++ b/bsmd.database/AGNT_Template.cs @@ -3,13 +3,14 @@ using System; using System.Collections.Generic; +using System.Data; using System.Data.SqlClient; using System.Runtime.Serialization; namespace bsmd.database { - public class AGNT_Template : DatabaseEntity, IComparable + public class AGNT_Template : DatabaseEntityAsync, IComparable { #region Construction @@ -153,6 +154,28 @@ namespace bsmd.database return 0; } + protected override DatabaseEntityAsync ReadRowFromReader(IDataReader reader) + { + AGNT_Template agnt_t = null; + if(reader != null) + { + agnt_t = new AGNT_Template(); + agnt_t.id = reader.GetGuid(0); + if (!reader.IsDBNull(1)) agnt_t.AgentTitle = reader.GetString(1); + if (!reader.IsDBNull(2)) agnt_t.AgentCompanyName = reader.GetString(2); + if (!reader.IsDBNull(3)) agnt_t.AgentStreetAndNumber = reader.GetString(3); + if (!reader.IsDBNull(4)) agnt_t.AgentPostalCode = reader.GetString(4); + if (!reader.IsDBNull(5)) agnt_t.AgentCity = reader.GetString(5); + if (!reader.IsDBNull(6)) agnt_t.AgentCountry = reader.GetString(6); + if (!reader.IsDBNull(7)) agnt_t.AgentLastName = reader.GetString(7); + if (!reader.IsDBNull(8)) agnt_t.AgentFirstName = reader.GetString(8); + if (!reader.IsDBNull(9)) agnt_t.AgentPhone = reader.GetString(9); + if (!reader.IsDBNull(10)) agnt_t.AgentFax = reader.GetString(10); + if (!reader.IsDBNull(11)) agnt_t.AgentEMail = reader.GetString(11); + } + return agnt_t; + } + #endregion } diff --git a/bsmd.database/DBManagerAsync.cs b/bsmd.database/DBManagerAsync.cs index d3934b76..3f5202d2 100644 --- a/bsmd.database/DBManagerAsync.cs +++ b/bsmd.database/DBManagerAsync.cs @@ -103,6 +103,24 @@ namespace bsmd.database return (await vm.LoadListAsync(reader)).ConvertAll(x => (ValueMapping)x); } + public static async Task> GetAGNTTemplatesAsync() + { + SqlCommand cmd = new SqlCommand(); + AGNT_Template at = new AGNT_Template(); + at.PrepareLoadCommand(cmd, Message.LoadFilter.ALL); + SqlDataReader reader = await PerformCommandAsync(cmd); + return (await at.LoadListAsync(reader)).ConvertAll(x => (AGNT_Template)x); + } + + public static async Task> GetWastDisposalServiceProviderTemplatesAsync() + { + SqlCommand cmd = new SqlCommand(); + WasteDisposalServiceProvider_Template wdsp_t = new WasteDisposalServiceProvider_Template(); + wdsp_t.PrepareLoadCommand(cmd, Message.LoadFilter.ALL); + SqlDataReader reader = await PerformCommandAsync(cmd); + return (await wdsp_t.LoadListAsync(reader)).ConvertAll(x => (WasteDisposalServiceProvider_Template)x); + } + #endregion #endregion diff --git a/bsmd.database/WasteDisposalServiceProvider_Template.cs b/bsmd.database/WasteDisposalServiceProvider_Template.cs new file mode 100644 index 00000000..dd508c3c --- /dev/null +++ b/bsmd.database/WasteDisposalServiceProvider_Template.cs @@ -0,0 +1,104 @@ +// Copyright (c) 2023-present schick Informatik +// Description: Shadow class to track predefined waste disposal providers + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace bsmd.database +{ + public class WasteDisposalServiceProvider_Template : DatabaseEntityAsync, IComparable + { + + #region Construction + + public WasteDisposalServiceProvider_Template() + { + this.tablename = "[dbo].[WasteDisposalServiceProvider_Template]"; + } + + #endregion + + #region Properties + + [MaxLength(99)] + public string WasteDisposalServiceProviderName { get; set; } + + #endregion + + #region DatabaseEntity implementation + + public override List LoadList(IDataReader reader) + { + List result = new List(); + + while (reader.Read()) + { + WasteDisposalServiceProvider_Template wdsp_t = new WasteDisposalServiceProvider_Template(); + wdsp_t.id = reader.GetGuid(0); + if (!reader.IsDBNull(1)) wdsp_t.WasteDisposalServiceProviderName = reader.GetString(1); + + result.Add(wdsp_t); + } + reader.Close(); + return result; + } + + public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria) + { + cmd.CommandText = string.Format("SELECT Id, WasteDisposalServiceProviderName FROM {0} ", this.Tablename); + } + + public override void PrepareSave(IDbCommand cmd) + { + SqlCommand scmd = cmd as SqlCommand; + + if (!this.WasteDisposalServiceProviderName.IsNullOrEmpty()) scmd.Parameters.AddWithValue("@P1", this.WasteDisposalServiceProviderName); + else scmd.Parameters.AddWithValue("@P1", DBNull.Value); + + if (this.IsNew) + { + this.CreateId(); + scmd.Parameters.AddWithValue("@ID", this.Id); + cmd.CommandText = string.Format("INSERT INTO {0} (Id, WasteDisposalServiceProviderName) VALUES (@ID, @P1)", this.Tablename); + } + else + { + cmd.CommandText = string.Format("UPDATE {0} SET WasteDisposalServiceProviderName = @P1 WHERE Id = @ID", this.Tablename); + scmd.Parameters.AddWithValue("@ID", this.Id); + } + } + + #endregion + + #region IComparable implementation + + public int CompareTo(object obj) + { + if (obj is WasteDisposalServiceProvider_Template) + this.WasteDisposalServiceProviderName.CompareTo(((WasteDisposalServiceProvider_Template)obj).WasteDisposalServiceProviderName); + return 0; + } + + protected override DatabaseEntityAsync ReadRowFromReader(IDataReader reader) + { + WasteDisposalServiceProvider_Template wdsp_t = null; + + if(reader != null) + { + wdsp_t = new WasteDisposalServiceProvider_Template(); + wdsp_t.id = reader.GetGuid(0); + if (!reader.IsDBNull(1)) wdsp_t.WasteDisposalServiceProviderName = reader.GetString(1); + } + + return wdsp_t; + } + + #endregion + + } +} diff --git a/bsmd.database/bsmd.database.csproj b/bsmd.database/bsmd.database.csproj index 231e2259..5cea3c39 100644 --- a/bsmd.database/bsmd.database.csproj +++ b/bsmd.database/bsmd.database.csproj @@ -187,6 +187,7 @@ + From a36d0dd048387df43de19c9006fcbf48e7f49a6e Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Mon, 10 Jul 2023 12:39:19 +0200 Subject: [PATCH 10/25] =?UTF-8?q?Templates=20f=C3=BCr=20WasteDisposalServi?= =?UTF-8?q?ceProvider=20Part=20II?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ENI2/DetailViewControls/PortCallDetailControl.xaml.cs | 4 ++-- ENI2/DetailViewControls/WasteDetailControl.xaml.cs | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ENI2/DetailViewControls/PortCallDetailControl.xaml.cs b/ENI2/DetailViewControls/PortCallDetailControl.xaml.cs index 4acb71fd..b00b922b 100644 --- a/ENI2/DetailViewControls/PortCallDetailControl.xaml.cs +++ b/ENI2/DetailViewControls/PortCallDetailControl.xaml.cs @@ -72,7 +72,7 @@ namespace ENI2.DetailViewControls this.buttonDeleteTemplate.IsEnabled = DBManager.Instance.GetReportingPartyDict()[App.UserId.Value].IsEditor; } - public override void Initialize() + public async override void Initialize() { base.Initialize(); @@ -127,7 +127,7 @@ namespace ENI2.DetailViewControls if(_agntTemplates == null) { - _agntTemplates = DBManager.Instance.GetAGNTTemplates(); // inital full load + _agntTemplates = await DBManagerAsync.GetAGNTTemplatesAsync(); // inital full load _agntTemplates.Sort(); Trace.WriteLine(string.Format("{0} agent templates loaded", _agntTemplates.Count)); } diff --git a/ENI2/DetailViewControls/WasteDetailControl.xaml.cs b/ENI2/DetailViewControls/WasteDetailControl.xaml.cs index 3ade16f5..fbf1f661 100644 --- a/ENI2/DetailViewControls/WasteDetailControl.xaml.cs +++ b/ENI2/DetailViewControls/WasteDetailControl.xaml.cs @@ -27,6 +27,10 @@ namespace ENI2.DetailViewControls private Message _wasRcptMessage; private WAS_RCPT _selectedWAS_RCPT; + private static List _wsdpTemplates = null; + private WasteDisposalServiceProvider_Template _currentTemplate; + private WasteDisposalServiceProvider_Template _undoTemplate; + private static readonly string[] _wasteDeliveryList = { "ALL", From c83146c9f48869f65828fc294376bff11a9f9552 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sat, 15 Jul 2023 14:37:52 +0200 Subject: [PATCH 11/25] =?UTF-8?q?Erg=C3=A4nzung=20NST2007=20Liste?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- misc/db.sqlite | Bin 14426112 -> 14426112 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/misc/db.sqlite b/misc/db.sqlite index 4bfc9c1a915f3635aae44952766a8e9848eb99fb..fde9094681e93ad9b61b9fcdded7f51a13160ea4 100644 GIT binary patch delta 1212 zcmb`@*;5r%9Ki8=xrSMo#Z?0}p;9ZeB22T=7O1c+HI)|HzAl%b2B*ijD#>zN3O2$ix zl*-X^j2tTyWTH%xkfGDj|vOJ%OillgL)ERcn=NUG&>xk9d#tE5J*mTTl% zxlXQ^@IQ-Xi7b_6l95`uLF%MlZj_s(L2i~tX_8yyR>?}Uv`DMmCT+4@ZkH9ZQtpsD zWtFr`hjhwaa<{A&Pv>m?^o$dmGvJS`jK z8F^NolZ~=THp}z!g1jg%$;+}uUXfSjHF;g$kZyTX-jcWF9eG!_$~M_9JLEliUv|m| z(zA`;P5OHq^q-;#ia|I z8d_WGn;J`N`+Ksb71`Ft<|X|-EiIXbvKdnga-&kk=><)7{o5PL%F9ROMy5*AmD$#1 znbLXngC~hZvNVxMRVN0b|3v?a{u$jH-4op%-IYkRhX;LevopFi+8x~z-5lKzT_5d= zu8ppau8J;?W}^+!+9=VQ=%VP{=5 zPPiE++zeARe9*#ZL2=^1x6RL`hjf;tYuf6Ym)2z(GuaiH)-@~l^@ctSeH7{oeH{8E z)F1jZ^jTlT4)I+w9rCHY^aEesEERciczs)!-h%3Pl^RlF(MWs zDmHA0h#J9y4I4HrCBgC31vxkR#? zIY~~IQ{+^cE~m-qa)!*1Gi9cnC1=YyGE2^t*>awoFBixhxlrcHMRKvsllhYVXMtQI zm&#?bP%f87xk9d#t7MT}E!W7ka-Cc+i{%EnQErl(ytp9FjkDv-I6XGRx>y@)VpXh+6|ppSiXCG~EDC>zzrumAKl~Z~ z2>Zg`uqW&eJHw8!HEao+LtEGo)`it!Wmp!Lh9zNfSQHk9`C(3&m2R|b?C?)hY^{%l zLTsIuotmAJot&-9PRdTqPRNeWj?30&$7aW5M`uT6M`mlXBeKJ@!~V0Wb!Z-{vsKw4 z*}>UC*@4*s*~)DHY`<*ZY@clJY(=(Lwr93HTbAvSE&YGrJwM&DU9(-Xos-KO54ER0 zNbOARN`096DD`pblhp3ir>W0UpQpY^eVN*m`YQEx>YLQJsqa#IQ{Sh4Nd1`lDfM$| SU+S0Cuc_a*Hy-+Zef7Uq_>f)z From 5eb9e1e170fdc5210e900064f3ee106bff60bff0 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sat, 15 Jul 2023 15:01:44 +0200 Subject: [PATCH 12/25] =?UTF-8?q?Templates=20f=C3=BCr=20WasteDisposalServi?= =?UTF-8?q?ceProvider=20Part=20III:=20zus=C3=A4tzl.=20Feld=20Remark?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SQL/WSDP_template.7.13.sql | 3 +- .../WasteDisposalServiceProvider_Template.cs | 46 ++++++++++--------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/SQL/WSDP_template.7.13.sql b/SQL/WSDP_template.7.13.sql index ff8387dd..3807d510 100644 --- a/SQL/WSDP_template.7.13.sql +++ b/SQL/WSDP_template.7.13.sql @@ -3,7 +3,8 @@ PRINT N'Creating [dbo].[WasteDisposalServiceProvider_template]...'; GO CREATE TABLE [dbo].[WasteDisposalServiceProvider_template] ( [Id] UNIQUEIDENTIFIER NOT NULL, - [WasteDisposalServiceProviderName] NVARCHAR (50) NULL, + [WasteDisposalServiceProviderName] NVARCHAR (100) NULL, + [Remark] NVARCHAR (256) NULL, [Created] DATETIME NULL DEFAULT CURRENT_TIMESTAMP, [Changed] DATETIME NULL, PRIMARY KEY CLUSTERED ([Id] ASC) diff --git a/bsmd.database/WasteDisposalServiceProvider_Template.cs b/bsmd.database/WasteDisposalServiceProvider_Template.cs index dd508c3c..ec05ef00 100644 --- a/bsmd.database/WasteDisposalServiceProvider_Template.cs +++ b/bsmd.database/WasteDisposalServiceProvider_Template.cs @@ -5,9 +5,6 @@ using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace bsmd.database { @@ -28,6 +25,9 @@ namespace bsmd.database [MaxLength(99)] public string WasteDisposalServiceProviderName { get; set; } + [MaxLength(255)] + public string Remark { get; set; } + #endregion #region DatabaseEntity implementation @@ -40,7 +40,8 @@ namespace bsmd.database { WasteDisposalServiceProvider_Template wdsp_t = new WasteDisposalServiceProvider_Template(); wdsp_t.id = reader.GetGuid(0); - if (!reader.IsDBNull(1)) wdsp_t.WasteDisposalServiceProviderName = reader.GetString(1); + if (!reader.IsDBNull(1)) wdsp_t.WasteDisposalServiceProviderName = reader.GetString(1); + if (!reader.IsDBNull(2)) wdsp_t.Remark = reader.GetString(2); result.Add(wdsp_t); } @@ -50,7 +51,7 @@ namespace bsmd.database public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria) { - cmd.CommandText = string.Format("SELECT Id, WasteDisposalServiceProviderName FROM {0} ", this.Tablename); + cmd.CommandText = string.Format("SELECT Id, WasteDisposalServiceProviderName, Remark FROM {0} ", this.Tablename); } public override void PrepareSave(IDbCommand cmd) @@ -59,20 +60,37 @@ namespace bsmd.database if (!this.WasteDisposalServiceProviderName.IsNullOrEmpty()) scmd.Parameters.AddWithValue("@P1", this.WasteDisposalServiceProviderName); else scmd.Parameters.AddWithValue("@P1", DBNull.Value); + if (!this.Remark.IsNullOrEmpty()) scmd.Parameters.AddWithValue("@P2", this.Remark); + else scmd.Parameters.AddWithValue("@P2", DBNull.Value); if (this.IsNew) { this.CreateId(); scmd.Parameters.AddWithValue("@ID", this.Id); - cmd.CommandText = string.Format("INSERT INTO {0} (Id, WasteDisposalServiceProviderName) VALUES (@ID, @P1)", this.Tablename); + cmd.CommandText = string.Format("INSERT INTO {0} (Id, WasteDisposalServiceProviderName, Remark) VALUES (@ID, @P1, @P2)", this.Tablename); } else { - cmd.CommandText = string.Format("UPDATE {0} SET WasteDisposalServiceProviderName = @P1 WHERE Id = @ID", this.Tablename); + cmd.CommandText = string.Format("UPDATE {0} SET WasteDisposalServiceProviderName = @P1, Remark = @P2 WHERE Id = @ID", this.Tablename); scmd.Parameters.AddWithValue("@ID", this.Id); } } + protected override DatabaseEntityAsync ReadRowFromReader(IDataReader reader) + { + WasteDisposalServiceProvider_Template wdsp_t = null; + + if (reader != null) + { + wdsp_t = new WasteDisposalServiceProvider_Template(); + wdsp_t.id = reader.GetGuid(0); + if (!reader.IsDBNull(1)) wdsp_t.WasteDisposalServiceProviderName = reader.GetString(1); + if (!reader.IsDBNull(2)) wdsp_t.Remark = reader.GetString(2); + } + + return wdsp_t; + } + #endregion #region IComparable implementation @@ -84,20 +102,6 @@ namespace bsmd.database return 0; } - protected override DatabaseEntityAsync ReadRowFromReader(IDataReader reader) - { - WasteDisposalServiceProvider_Template wdsp_t = null; - - if(reader != null) - { - wdsp_t = new WasteDisposalServiceProvider_Template(); - wdsp_t.id = reader.GetGuid(0); - if (!reader.IsDBNull(1)) wdsp_t.WasteDisposalServiceProviderName = reader.GetString(1); - } - - return wdsp_t; - } - #endregion } From 29cead2389dbcca8993043670e3d869b96d16973 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sat, 15 Jul 2023 15:52:00 +0200 Subject: [PATCH 13/25] =?UTF-8?q?Templates=20f=C3=BCr=20WasteDisposalServi?= =?UTF-8?q?ceProvder=20Part=20IV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ENI2/DetailViewControls/WasteDetailControl.xaml | 7 +++++-- ENI2/DetailViewControls/WasteDetailControl.xaml.cs | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ENI2/DetailViewControls/WasteDetailControl.xaml b/ENI2/DetailViewControls/WasteDetailControl.xaml index 6e1b9950..2abe2483 100644 --- a/ENI2/DetailViewControls/WasteDetailControl.xaml +++ b/ENI2/DetailViewControls/WasteDetailControl.xaml @@ -35,6 +35,7 @@ +