Aktueller Stand 10.6.15

This commit is contained in:
Daniel Schick 2015-06-10 19:51:02 +00:00
parent f4b3d3caf0
commit 8de5ee810d
41 changed files with 15104 additions and 3188 deletions

Binary file not shown.

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="CrewPasCSVTool.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<applicationSettings>
<CrewPasCSVTool.Properties.Settings>
<setting name="ConnectionString" serializeAs="String">
<value>Initial Catalog=nsw;Data Source=192.168.2.5\SQLEXPRESS;Uid=dfuser;pwd=dfpasswd;Persist Security Info=False;Connection Reset=false</value>
</setting>
</CrewPasCSVTool.Properties.Settings>
</applicationSettings>
</configuration>

View File

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{85E16280-B3FF-412D-A40D-3107BA7366DD}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>CrewPasCSVTool</RootNamespace>
<AssemblyName>CrewPasCSVTool</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\bsmd.database\bsmd.database.csproj">
<Project>{19945af2-379b-46a5-b27a-303b5ec1d557}</Project>
<Name>bsmd.database</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,28 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrewPasCSVTool", "CrewPasCSVTool.csproj", "{85E16280-B3FF-412D-A40D-3107BA7366DD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "bsmd.database", "..\bsmd.database\bsmd.database.csproj", "{19945AF2-379B-46A5-B27A-303B5EC1D557}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{85E16280-B3FF-412D-A40D-3107BA7366DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{85E16280-B3FF-412D-A40D-3107BA7366DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{85E16280-B3FF-412D-A40D-3107BA7366DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{85E16280-B3FF-412D-A40D-3107BA7366DD}.Release|Any CPU.Build.0 = Release|Any CPU
{19945AF2-379B-46A5-B27A-303B5EC1D557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{19945AF2-379B-46A5-B27A-303B5EC1D557}.Debug|Any CPU.Build.0 = Debug|Any CPU
{19945AF2-379B-46A5-B27A-303B5EC1D557}.Release|Any CPU.ActiveCfg = Release|Any CPU
{19945AF2-379B-46A5-B27A-303B5EC1D557}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,116 @@
namespace CrewPasCSVTool
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.listBoxMessageCore = new System.Windows.Forms.ListBox();
this.buttonCrew = new System.Windows.Forms.Button();
this.buttonPas = new System.Windows.Forms.Button();
this.comboBoxStatus = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// listBoxMessageCore
//
this.listBoxMessageCore.FormattingEnabled = true;
this.listBoxMessageCore.Location = new System.Drawing.Point(12, 52);
this.listBoxMessageCore.Name = "listBoxMessageCore";
this.listBoxMessageCore.Size = new System.Drawing.Size(231, 134);
this.listBoxMessageCore.TabIndex = 0;
this.listBoxMessageCore.SelectedIndexChanged += new System.EventHandler(this.listBoxMessageCore_SelectedIndexChanged);
//
// buttonCrew
//
this.buttonCrew.Enabled = false;
this.buttonCrew.Location = new System.Drawing.Point(249, 52);
this.buttonCrew.Name = "buttonCrew";
this.buttonCrew.Size = new System.Drawing.Size(98, 23);
this.buttonCrew.TabIndex = 1;
this.buttonCrew.Text = "Crew";
this.buttonCrew.UseVisualStyleBackColor = true;
this.buttonCrew.Click += new System.EventHandler(this.buttonCrew_Click);
//
// buttonPas
//
this.buttonPas.Enabled = false;
this.buttonPas.Location = new System.Drawing.Point(249, 81);
this.buttonPas.Name = "buttonPas";
this.buttonPas.Size = new System.Drawing.Size(98, 23);
this.buttonPas.TabIndex = 2;
this.buttonPas.Text = "Passenger";
this.buttonPas.UseVisualStyleBackColor = true;
this.buttonPas.Click += new System.EventHandler(this.buttonPas_Click);
//
// comboBoxStatus
//
this.comboBoxStatus.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxStatus.FormattingEnabled = true;
this.comboBoxStatus.Location = new System.Drawing.Point(12, 25);
this.comboBoxStatus.Name = "comboBoxStatus";
this.comboBoxStatus.Size = new System.Drawing.Size(180, 21);
this.comboBoxStatus.TabIndex = 3;
this.comboBoxStatus.SelectedIndexChanged += new System.EventHandler(this.comboBoxStatus_SelectedIndexChanged);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(101, 13);
this.label1.TabIndex = 4;
this.label1.Text = "Status Schiffsanlauf";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(356, 195);
this.Controls.Add(this.label1);
this.Controls.Add(this.comboBoxStatus);
this.Controls.Add(this.buttonPas);
this.Controls.Add(this.buttonCrew);
this.Controls.Add(this.listBoxMessageCore);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "Form1";
this.Text = "CSV Listen";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ListBox listBoxMessageCore;
private System.Windows.Forms.Button buttonCrew;
private System.Windows.Forms.Button buttonPas;
private System.Windows.Forms.ComboBox comboBoxStatus;
private System.Windows.Forms.Label label1;
}
}

View File

@ -0,0 +1,186 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using bsmd.database;
namespace CrewPasCSVTool
{
public partial class Form1 : Form
{
bsmd.database.Message selectedCrewMessage = null;
bsmd.database.Message selectedPasMessage = null;
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!DBManager.Instance.Connect(Properties.Settings.Default.ConnectionString))
{
MessageBox.Show("cannot connect to SMSPLASH01!");
this.Close();
}
this.comboBoxStatus.DataSource = Enum.GetValues(typeof(MessageCore.BSMDStatus));
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
DBManager.Instance.Disconnect();
}
private void comboBoxStatus_SelectedIndexChanged(object sender, EventArgs e)
{
MessageCore.BSMDStatus status;
Enum.TryParse<MessageCore.BSMDStatus>(comboBoxStatus.SelectedValue.ToString(), out status);
this.listBoxMessageCore.DataSource = DBManager.Instance.GetMessageCoresByStatus(status);
}
private void listBoxMessageCore_SelectedIndexChanged(object sender, EventArgs e)
{
this.selectedCrewMessage = null;
this.selectedPasMessage = null;
Cursor currentCursor = this.Cursor;
this.Cursor = Cursors.WaitCursor;
MessageCore selectedCore = this.listBoxMessageCore.SelectedValue as MessageCore;
if (selectedCore != null)
{
List<bsmd.database.Message> messages = DBManager.Instance.GetMessagesForCore(selectedCore);
foreach (bsmd.database.Message message in messages)
{
if (message.MessageNotificationClass == bsmd.database.Message.NotificationClass.CREW)
this.selectedCrewMessage = message;
if (message.MessageNotificationClass == bsmd.database.Message.NotificationClass.PAS)
this.selectedPasMessage = message;
}
}
this.buttonCrew.Enabled = this.selectedCrewMessage != null;
this.buttonPas.Enabled = this.selectedPasMessage != null;
this.Cursor = currentCursor;
}
private void buttonCrew_Click(object sender, EventArgs e)
{
if (this.selectedCrewMessage != null)
{
using (SaveFileDialog ofd = new SaveFileDialog())
{
ofd.Filter = "CSV files (*.csv)|*.csv|All files (*.*)|*.*";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
StringBuilder sb = new StringBuilder();
foreach (CREW crew in this.selectedCrewMessage.Elements)
{
string dateOfBirth = "";
if(crew.CrewMemberDateOfBirth.HasValue)
dateOfBirth = crew.CrewMemberDateOfBirth.Value.ToString("yyyy-MM-dd");
sb.AppendLine(string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9}",
crew.CrewMemberLastName ?? "",
crew.CrewMemberFirstName ?? "",
this.GetGender(crew.CrewMemberGender),
crew.CrewMemberNationality ?? "",
crew.CrewMemberDuty ?? "",
crew.CrewMemberPlaceOfBirth ?? "",
dateOfBirth,
this.GetDocumentType(crew.CrewMemberIdentityDocumentType),
crew.CrewMemberIdentityDocumentId ?? "",
crew.CrewMemberVisaNumber ?? ""));
}
File.WriteAllText(ofd.FileName, sb.ToString(), Encoding.UTF8);
}
}
}
}
private void buttonPas_Click(object sender, EventArgs e)
{
if (this.selectedPasMessage != null)
{
using (SaveFileDialog ofd = new SaveFileDialog())
{
ofd.Filter = "CSV files (*.csv)|*.csv|All files (*.*)|*.*";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
StringBuilder sb = new StringBuilder();
foreach (PAS pas in this.selectedPasMessage.Elements)
{
string dateOfBirth = "";
if(pas.PassengerDateOfBirth.HasValue)
dateOfBirth = pas.PassengerDateOfBirth.Value.ToString("yyyy-MM-dd");
sb.AppendLine(string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};{10};{11}",
pas.PassengerLastName ?? "",
pas.PassengerFirstName ?? "",
this.GetGender(pas.PassengerGender),
pas.PassengerNationality ?? "",
pas.PassengerPortOfEmbarkation ?? "",
pas.PassengerPortOfDisembarkation ?? "",
(pas.PassengerInTransit ?? false) ? "Y" : "N",
pas.PassengerPlaceOfBirth ?? "",
dateOfBirth,
this.GetDocumentType(pas.PassengerIdentityDocumentType),
pas.PassengerIdentityDocumentId ?? "",
pas.PassengerVisaNumber ?? ""));
}
File.WriteAllText(ofd.FileName, sb.ToString(), Encoding.UTF8);
}
}
}
}
private string GetDocumentType(byte? type)
{
string documentType = "";
if (type.HasValue)
{
switch (type.Value)
{
case 0: documentType = "IDENTITY_CARD"; break;
case 1: documentType = "PASSPORT"; break;
case 2: documentType = "MUSTER_BOOK"; break;
case 3: documentType = "PICTURE_ID"; break;
case 4: documentType = "RESIDENTAL_PERMIT"; break;
default: documentType = "OTHER_LEGAL_IDENTITY_DOCUMENT"; break;
}
}
return documentType;
}
private string GetGender(byte? gender)
{
string genders = "";
if (gender.HasValue)
{
if (gender == 0) genders = "MALE";
if (gender == 1) genders = "FEMALE";
if (gender == 2) genders = "OTHER";
}
return genders;
}
}
}

View File

@ -0,0 +1,570 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAgAEBAAAAEACABoBQAAhgAAABAQAAABACAAaAQAAO4FAAAYGAAAAQAIAMgGAABWCgAAGBgAAAEA
IACICQAAHhEAACAgAAABAAgAqAgAAKYaAAAgIAAAAQAgAKgQAABOIwAAMDAAAAEACACoDgAA9jMAADAw
AAABACAAqCUAAJ5CAAAoAAAAEAAAACAAAAABAAgAAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wAmdecAyXsrAInP/wAWHJwA6b19AHCZrQDO1scArIZ2AABsowCYQSgATK33AAtC0ABCQ6EAvUYCAD6V
xgAAksUAZWWpAG6i3QAAG8QATYWiACWDrACsYzEAZ8X2AKfh/wAkOrAAQZDsAMhfFACqUxcAHVrUADKb
/wAAgLIAAl6PABAprwCum34AIE3EAGe16QAWhLoAE3ynAFKSsABdtfkAKoPyALlrKACX2f8AQpC0ADFE
rwC4XRMAWqzsACNo3gDPbBEAp0oMAL5oGgBtbbEAgcX7AHLL+QBSuP8AFkbHAEOq/wBou/0AC2+fAA2D
sgAqNacArYFsAGC88QAXJqgAAGeaABhS0AC5YisAABi7AG/B/wAiVc8AGIWyAJDT/wAQcaUAIWvlAKLc
/wBiuP8AQUGbAABjkgCAyf8AEyyyACBk3gAjbOEASYakABQqrgBpvv8AG1LQAACBtAAsg/EAitD/AAB/
sgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAADhpRVT4SAAAAAAAAAAAAIldTMR45RQscRD8AAAAAAC4CWSpLQxQrLwMdAAAAAAAAUh8kTg0F
MgY0FwAAAAAAADVHGylBMyMIDwkAAAAAAAAAQEZWDCE6OBMAAAAAAAAAADsEUE0KWkkYAAAAAAAAAC1C
GSwwTzZMNwAAAAAAAAAoERAlSlhbICYAAAAAAAAAABYnPBVUPUgHAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD//wAA//8AAP//AAD//wAA8D8AAOADAADgAwAA8AMAAPADAAD4BwAA+AcAAPAH
AADwBwAA+AcAAP//AAD//wAAKAAAABAAAAAgAAAAAQAgAAAAAABABAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AB/8AAAf/AAAH/4AAD/+AAA//wDg//////////////////////8oAAAAIAAAAEAAAAABACAAAAAAAIAQ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApCQAAJViAACUlwAAlb4AAJLaAACT5wAAkuoAAJLeAACWyAAA
lp4AAJplAACiGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAACjDgAAqm8AAKTPAACc/gYQpP8SN73/FkXH/xpPzv8aUtD/Gk/O/xdH
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
/wEAAAAAAG6jMABilp8AYpXXAF+S4gBgk88AYpWaAHGqNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////gB///AA
H//gAAB/4AAAD+AAAAfgAAAH8AAAB/AAAAf4AAAH/AAAD/4AAA//AAAf/wAAP/8AAD/+AAAf/AAAH/wA
AB/8AAAf/AAAH/wAAB/+AAA//gAAP/8A4P//////////////////////KAAAADAAAABgAAAAAQAIAAAA
AACACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A6H8WAACd0AAAAKUAWzNeAH7I/wCPIAAA7caBAABe
jABuhbsApJaLABpU0QA/of8ArF06AM/NyABCQp4ALoGoADYddgCgtc8Agk0rANadWgB4bpQADSq1AKpN
DwAgiN4AAH2wAMyDSgDB0+MAWEhAAMZuHAD//sUA/OKoAHWRnwBftP8ArHBPAGmm2gBFn9kAIm/lAFpk
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAigIACK4eAAisPwAHqGIABKZ3AACggwAAoooAAKCIAACjfgAA
o24AAKRaAAChNgAArA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAC+AwoeuTgIG7V8BhizugYTqesGEaX9BxWn/wgZqf8JHaz/CR2s/wkc
rP8IGqr/Bxao/wUQpP8DCp//AQGa/gAAmPkAAKDRAACgjQAAnDsAAP8BAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ozCoNKLuQCySx5Awlsf8NLLb/EzvB/xdIyf8bUc//GlLQ/xlP
zv8ZTcz/GEvL/xdIyf8WQ8X/FUHE/xM8wv8SOb//ETS8/w4qtv8IHKz/BA2i/wABmf4AAJXUAACgWwAA
jAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQM8hEEDDCuw8tuPwSOb//GErK/xxX0v8PLrf/G1TR/x1X
0/8bVdL/G1TR/xpS0P8aUM7/GU3M/xhKyv8WRsj/FUPF/xQ+w/8SOsD/ETa9/w8yu/8OLbf/DSm0/wsk
sP8CCJ7/AACZ/gAAoLxYF0swpTUARJ8zAF2kNgBpozUAaaM2AGmjMwBipDQATqAwADGsOgAPAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQNLv2FUHE/xtT0f8dWdX/HlrV/x5e
1/8PL7j/GlLQ/x5d1v8eW9b/HVrV/xxY1P8cVtL/G1LQ/xlPzv8YS8v/F0fI/xVDxv8UPsP/Ejq//xE1
vP8PMLn/DSy1/w0ns/8EC6H/Awyg/wEHoP8UBoX+oTgA/587BP+hPwf/oj8I/6JBCP+gPQf/njkD/5kz
AP6YMgD5oTMA2qE0AJ2hNQBWrDkACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASO8HrG1LQ/x5a
1f8eXNj/H1/Y/x9j2v8YScr/HVrV/yBj3P8gYtr/H2DZ/x5e1/8dW9b/HFjT/xtU0f8aUM7/GEzL/xdH
yP8VQsX/FD3C/xI4vv8QM7v/Di63/w0ptf8GFKf/BRKl/wYWqP8AAJj/vWIV/7hhG/+4Yxz/uWQd/7tm
H/+6Zh7/u2cf/7tmH/+3YRz/r1QU/6ZGDP+cNwL/mjEA7KI2AIeoMgARAAAAAAAAAAAAAAAAAAAAAAAA
AAAVQMTMHFTQ/yBg2f8gYtr/IWXc/yFn3f8jad//Imrg/yJq3/8iaN7/IWbd/yBj2/8fYNn/Hl3X/x1Z
1P8bVdH/GlDO/xhLy/8WRsj/FUHE/xM8wf8RNr3/DzG5/w4rt/8MJ7P/CyGv/wUUp/8LBJH/w2YV/7lk
Hf+7Zh//vGgg/71pIP+9aiH/vWsh/71pIP+9aSH/u2cf/7plHv+5ZB3/p0gN/5gzAP+ZMgDfpDQAKQAA
AAAAAAAAAAAAAAAAAAAXSMqlG1TR/yBl3P8iZ97/I2rg/yNt4f8kbuL/JG/j/yRv4/8kbuL/I2zh/yJp
3/8hZ93/IGLa/x5d1/8dWdT/G1TR/xlPzf8XScr/FkTG/xQ/w/8SOb//EDO7/w4ut/8MKLT/DCOx/wUT
qP8bDoX/xGsY/7xpIP++ayL/wG0j/8FvJP/BbyT/wW8k/8BuJP+/bSP/vmsh/7xoIP+7ZyD/pkUL/6RG
Cv+kRAr/mTIApgAAAAAAAAAAAAAAAAAAAAAXTs9rG1XS/yNp3/8jbOH/JHDj/yV05f8mduf/JnXn/yZ1
5/8mdOb/JXLl/yRu4v8ja+D/IWbd/yBh2v8eXdf/HFfT/xpS0P8ZTcz/F0fI/xVBxf8TO8H/ETa9/w8w
uf8NKrX/CyWy/wIQp/84HnT/xm8d/8BtI//CcCX/w3Mm/8R0J//FdSj/xnYo/8R0J//Dcib/wXAk/79t
I/++ayH/oDwG/6tOEP+nSQ3/mDEAnQAAAAAAAAAAAAAAAAAAAAAZW9sqHFbT/iRs4f8lcuT/JnXn/yd4
6f8oe+v/KHzr/yh76/8oeur/J3fo/yZz5v8kb+P/I2rg/yFl3P8fYNn/HVrV/xtV0v8ZT87/F0nK/xZE
xv8UPsL/Eji+/xAyuv8OLLb/DSiz/wAIo/9bM17/x3Eg/8NyJv/FdSn/yHkq/8p9LP/Lfi3/yn0s/8p9
LP/HeSr/xHYn/8JxJf/BbiT/r1UU/7ZeG/+kRAr/mDEAhAAAAAAAAAAAAAAAAAAAAAAAAAABHmHkzSJp
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
/4EAAAAAAAAAAAAAAAAAAAAAGGOIYRlbffoAZqD/AGed/wBkm/8kkPP/OJ///0Ok//9Fpf//P6H//y2a
//83ju3/bGiCgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAOaz/CjKY/95Hpv//W7H//12z//9htf//Y7f//2W4//9ouf//Z7n//2a4
//9luP//XLP//zKZ//w1q/86AAAAAABzrA8Aa6KrAGeb/gBtof8AcqX/AGOU/zGU6f9YsP//XbL//160
//9ftf//YbX//2G1//9Mqf//L5z/+Dir/0sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM6H/bDmd//9bs///YLX//2O3//9nuf//arv//2y8
//9uvf//br3//229//9su///arv//0uo//80nP+8AGeZCgBlmcQAaZz/AHKl/wB0p/8AbZ//FXey/1+2
//9ftf//Yrb//2W4//9muf//Z7n//2a6//9muf//Uqz//zGZ/+4rrP8ZAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM6D/002p//9gtf//ZLf//2m6
//9tvf//cb///3PB//90wf//dsH//3XB//9xwP//b7///2i6//80mf/+CG2psgBnmv8Ac6b/AHWo/wB2
qf8AZZf/Ppre/2O3//9luP//abr//2y8//9uvv//b77//269//9tvP//bLz//0Kh//80n/+SAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0qf8bMpn//V2z
//9jtv//abr//269//9zwP//d8P//3rF//97xv//e8b//3rF//94w///dMH//3PA//9Bo///FHrD/gBx
o/8Adqn/AHap/wB3qv8AYZL/XLL7/2e5//9rvP//cMD//3TB//92wv//d8P//3bC//9zwf//cL///2C2
//8xmf/tLov/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA3o/9GN5v//2O3//9ouf//bb3//3TA//94xP//fsb//4DJ//+Cyv//hMr//4HJ//9+x///e8X//3bC
//9RrP//IIrf/wB1pv8Ad6r/AHir/wB3qv8AZJj/aLz//2y7//9xv///eMP//3vF//9+x///f8j//3/H
//96xf//d8L//3TC//82m///M6X/OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAABtp1Enj+x6PaD//2a3//9qu///cL///3bD//98xv//gsr//4bO//+Jzv//itD//4nN
//+Dy///fsf//3rF//9dtP//J5Du/wB2p/8AeKv/AHqt/wB4q/8BZpn/br///3C+//92wv//fMb//4PL
//+FzP//iM3//4XM//+Byf//fcb//3jE//9Do///NqP/aQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAHSpGwBmmfoAZZr9O5z4/2i6//9svP//dMD//3nE//+ByP//hs7//43Q
//+R1P//ktP//4/R//+Iz///g8r//33H//9muP//K5X4/wB3qP8Aeq3/AH2w/wB7rv8AYZT/bb3//3PB
//97xv//gcn//4nN//+O0P//jtP//43Q//+Izf//gMn//3zG//9MqP//NaP/hwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGykYgBom/8AaZv/IoLG/2y9//9wv///dcL//3vF
//+Cy///ic7//5HS//+X1///mNj//5PV//+Lz///hMv//3/I//9ou///H4Xc/wBzpP8Ae67/AH2w/wCB
tP8AYZP/W67t/3bD//98xv//hMv//43R//+U1f//l9f//5PV//+Mz///g8r//37I//9Qq///M6H/kwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGykkgBtoP8AcKP/CWyj/wRq
nf8NcKX/d8P//3zG//+Cy///ic7//5HS//+X1///mdj//5PV//+Lz///hMv//3/I//9tvf//Bm2r/wBw
ov8AfrH/AH+y/wCCtf8AbJ//NZDK/3nF//9+x///hMv//4zQ//+V1v//mdn//5TU//+L0f//g8v//3/I
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
uokAhb3TAInA7wCMw+IAkMe5AJDG0ACJvfUAhLf9AIG0/QB+sPYAgbfFAIC6YABbVgMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAHimDABtpEYAa6BxAGqhfABro3sAbaNkAGqgQABmtwsAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuqAUAkcQVAIG9FwB5zQcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///////8AAP///////wAA////////
AAD/+Af///8AAP8AAH///wAA+AAAD///AADgAAAGD/8AAMAAAAAAPwAAwAAAAAAPAADAAAAAAAcAAMAA
AAAAAwAAwAAAAAADAADgAAAAAAMAAOAAAAAAAwAA4AAAAAAHAADwAAAAAAcAAPgAAAAABwAA+AAAAAAP
AAD8AAAAAA8AAP4AAAAAHwAA/4AAAAA/AAD/4AHAAH8AAP/gAeAA/wAA/8ABwAD/AAD/gACAAH8AAP+A
AAAAPwAA/4AAAAA/AAD/gAAAAD8AAP4AAAAAHwAA/gAAAAAfAAD8AAAAAB8AAPwAAAAAHwAA/AAAAAAf
AAD8AAAAAB8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAB8AAP4AAEAAPwAA/gAAQAA/AAD/AADgAH8AAP+A
AfgB/wAA/8AD/w//AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA
</value>
</data>
</root>

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CrewPasCSVTool
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("CrewPasCSVTool")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CrewPasCSVTool")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("70557623-5070-420b-9113-7c531b549437")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.34209
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace CrewPasCSVTool.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CrewPasCSVTool.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,36 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.34209
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace CrewPasCSVTool.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Initial Catalog=nsw;Data Source=192.168.2.5\\SQLEXPRESS;Uid=dfuser;pwd=dfpasswd;Pe" +
"rsist Security Info=False;Connection Reset=false")]
public string ConnectionString {
get {
return ((string)(this["ConnectionString"]));
}
}
}
}

View File

@ -0,0 +1,9 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="CrewPasCSVTool.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="ConnectionString" Type="System.String" Scope="Application">
<Value Profile="(Default)">Initial Catalog=nsw;Data Source=192.168.2.5\SQLEXPRESS;Uid=dfuser;pwd=dfpasswd;Persist Security Info=False;Connection Reset=false</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@ -159,9 +159,6 @@ namespace SendNSWMessageService
_log.ErrorFormat("SENDING message {0}: {1}", message.Id.ToString(), ex.Message);
}
}
}
DBManager.Instance.Disconnect();

View File

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="bsmd.ReportGenerator.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="bsmd.ReportGenerator.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<userSettings>
<applicationSettings>
<bsmd.ReportGenerator.Properties.Settings>
<setting name="ConnectionString" serializeAs="String">
<value>replace me!</value>
@ -46,5 +46,5 @@
<value />
</setting>
</bsmd.ReportGenerator.Properties.Settings>
</userSettings>
</applicationSettings>
</configuration>

View File

@ -27,6 +27,9 @@ namespace bsmd.ReportGenerator
SmtpClient smtpClient = new SmtpClient();
NetworkCredential basicCredential = new NetworkCredential(Properties.Settings.Default.SMTPUser,
Properties.Settings.Default.SMTPPassword);
foreach (string recipient in Properties.Settings.Default.Recipient)
{
MailMessage message = new MailMessage();
MailAddress fromAddress = new MailAddress(Properties.Settings.Default.Sender);
@ -41,7 +44,6 @@ namespace bsmd.ReportGenerator
message.Subject = string.Format("NSW Message report for {0}", core.IMO);
message.IsBodyHtml = false;
message.Body = "see attachment";
foreach (string recipient in Properties.Settings.Default.Recipient)
message.To.Add(recipient);
if (filename != null)
@ -61,7 +63,7 @@ namespace bsmd.ReportGenerator
try
{
smtpClient.Send(message);
log.Info("Email sending successful.");
log.InfoFormat("Email sending to {0} successful.", recipient);
}
catch (SmtpException smtpException)
{
@ -72,9 +74,12 @@ namespace bsmd.ReportGenerator
log.ErrorFormat("other error while sending e-mail:{0}", ex.Message);
}
smtpClient.Dispose();
message.Dispose();
}
smtpClient.Dispose();
// http://stackoverflow.com/questions/7276375/what-are-best-practices-for-using-smtpclient-sendasync-and-dispose-under-net-4
// asynchron schicken und wenn's erledigt ist gleich disposen (wichtig!)
/*

View File

@ -23,91 +23,70 @@ namespace bsmd.ReportGenerator.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("replace me!")]
public string ConnectionString {
get {
return ((string)(this["ConnectionString"]));
}
set {
this["ConnectionString"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string OutputDirectory {
get {
return ((string)(this["OutputDirectory"]));
}
set {
this["OutputDirectory"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("300")]
public int SleepSeconds {
get {
return ((int)(this["SleepSeconds"]));
}
set {
this["SleepSeconds"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("BSMD ReportGenerator")]
public string ReportAuthor {
get {
return ((string)(this["ReportAuthor"]));
}
set {
this["ReportAuthor"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string SMTPServer {
get {
return ((string)(this["SMTPServer"]));
}
set {
this["SMTPServer"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string SMTPUser {
get {
return ((string)(this["SMTPUser"]));
}
set {
this["SMTPUser"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string SMTPPassword {
get {
return ((string)(this["SMTPPassword"]));
}
set {
this["SMTPPassword"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<ArrayOfString xmlns:xsi=\"http://www.w3." +
"org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n <s" +
@ -116,33 +95,24 @@ namespace bsmd.ReportGenerator.Properties {
get {
return ((global::System.Collections.Specialized.StringCollection)(this["Recipient"]));
}
set {
this["Recipient"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("donotreply@bsmd.de")]
public string Sender {
get {
return ((string)(this["Sender"]));
}
set {
this["Sender"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string LogoPath {
get {
return ((string)(this["LogoPath"]));
}
set {
this["LogoPath"] = value;
}
}
}
}

View File

@ -2,37 +2,37 @@
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="bsmd.ReportGenerator.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="ConnectionString" Type="System.String" Scope="User">
<Setting Name="ConnectionString" Type="System.String" Scope="Application">
<Value Profile="(Default)">replace me!</Value>
</Setting>
<Setting Name="OutputDirectory" Type="System.String" Scope="User">
<Setting Name="OutputDirectory" Type="System.String" Scope="Application">
<Value Profile="(Default)" />
</Setting>
<Setting Name="SleepSeconds" Type="System.Int32" Scope="User">
<Setting Name="SleepSeconds" Type="System.Int32" Scope="Application">
<Value Profile="(Default)">300</Value>
</Setting>
<Setting Name="ReportAuthor" Type="System.String" Scope="User">
<Setting Name="ReportAuthor" Type="System.String" Scope="Application">
<Value Profile="(Default)">BSMD ReportGenerator</Value>
</Setting>
<Setting Name="SMTPServer" Type="System.String" Scope="User">
<Setting Name="SMTPServer" Type="System.String" Scope="Application">
<Value Profile="(Default)" />
</Setting>
<Setting Name="SMTPUser" Type="System.String" Scope="User">
<Setting Name="SMTPUser" Type="System.String" Scope="Application">
<Value Profile="(Default)" />
</Setting>
<Setting Name="SMTPPassword" Type="System.String" Scope="User">
<Setting Name="SMTPPassword" Type="System.String" Scope="Application">
<Value Profile="(Default)" />
</Setting>
<Setting Name="Recipient" Type="System.Collections.Specialized.StringCollection" Scope="User">
<Setting Name="Recipient" Type="System.Collections.Specialized.StringCollection" Scope="Application">
<Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
&lt;string&gt;nsw@textbausteine.net&lt;/string&gt;
&lt;/ArrayOfString&gt;</Value>
</Setting>
<Setting Name="Sender" Type="System.String" Scope="User">
<Setting Name="Sender" Type="System.String" Scope="Application">
<Value Profile="(Default)">donotreply@bsmd.de</Value>
</Setting>
<Setting Name="LogoPath" Type="System.String" Scope="User">
<Setting Name="LogoPath" Type="System.String" Scope="Application">
<Value Profile="(Default)" />
</Setting>
</Settings>

View File

@ -754,6 +754,14 @@ namespace bsmd.dakosy
}
break;
case Message.NotificationClass.HAZA:
case Message.NotificationClass.HAZD:
{
bsmd.database.HAZ was = dbEntity as bsmd.database.HAZ;
_log.InfoFormat("HAZ(A/D) cannot be sent via eDeclaration, skipping message {0}.", was.MessageHeader.Id);
}
break;
}
break;

View File

@ -200,13 +200,13 @@ namespace bsmd.database
switch(queryResult)
{
case 1:
_log.InfoFormat("Message {0} saved", entity.Id); break;
_log.DebugFormat("Message {0} saved", entity.Id); break;
case 0:
_log.WarnFormat("Message {0} save affected no rows", entity.Id); break;
_log.DebugFormat("Message {0} save affected no rows", entity.Id); break;
case -1:
_log.WarnFormat("Message {0} save: error occurred", entity.Id); break;
_log.DebugFormat("Message {0} save: error occurred", entity.Id); break;
default:
_log.WarnFormat("Message {0} save affected {1} rows", entity.Id, queryResult); break;
_log.DebugFormat("Message {0} save affected {1} rows", entity.Id, queryResult); break;
}
}
@ -216,7 +216,7 @@ namespace bsmd.database
{
SqlCommand cCmd = new SqlCommand();
core.Customer.PrepareSave(cCmd);
_log.InfoFormat("Saved Customer to Core: {0}", this.PerformNonQuery(cCmd));
_log.DebugFormat("Saved Customer to Core: {0}", this.PerformNonQuery(cCmd));
core.CustomerId = core.Customer.Id;
}
@ -224,7 +224,7 @@ namespace bsmd.database
core.PrepareSave(cmd);
int queryResult = this.PerformNonQuery(cmd);
if (queryResult == 1)
_log.InfoFormat("MessageCore {0} saved", core.Id);
_log.DebugFormat("MessageCore {0} saved", core.Id);
else
_log.WarnFormat("MessageCore {0} save affected {1} rows", core.Id, queryResult);
}
@ -265,7 +265,7 @@ namespace bsmd.database
}
else
{
_log.ErrorFormat("cannot create a message class for notification type {0}", message.MessageNotificationClass);
_log.DebugFormat("cannot create a message class for notification type {0}", message.MessageNotificationClass);
}
}
}
@ -354,6 +354,18 @@ namespace bsmd.database
{
haz.IMDGPositions.Add(imdgPosition);
imdgPosition.HAZ = haz;
// load SubsidiaryRisk sub-table
SqlCommand srCmd = new SqlCommand();
SubsidiaryRisks subsidiaryRisks = new SubsidiaryRisks();
subsidiaryRisks.PrepareLoadCommand(srCmd, Message.LoadFilter.IMDG_ID, imdgPosition.Id);
SqlDataReader srReader = this.PerformCommand(srCmd);
List<DatabaseEntity> sRisks = subsidiaryRisks.LoadList(srReader);
foreach (SubsidiaryRisks subsidiaryRisk in sRisks)
{
imdgPosition.SubsidiaryRiskList.Add(subsidiaryRisk);
subsidiaryRisk.IMDGPosition = imdgPosition;
}
}
cmd = new SqlCommand();

View File

@ -9,6 +9,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
@ -60,5 +61,11 @@ namespace bsmd.database
return source.IndexOf(toCheck, comp) >= 0;
}
public static DateTime? TryParse(string text)
{
DateTime date;
return DateTime.TryParse(text, DateTimeFormatInfo.InvariantInfo,DateTimeStyles.AssumeUniversal, out date) ? date : (DateTime?)null;
}
}
}

View File

@ -16,6 +16,9 @@ namespace bsmd.database
{
public class IMDGPosition : DatabaseEntity, ISublistElement
{
private List<SubsidiaryRisks> subsidiaryRisksList = new List<SubsidiaryRisks>();
public IMDGPosition()
{
this.tablename = "[dbo].[IMDGPosition]";
@ -85,6 +88,8 @@ namespace bsmd.database
[ShowReport]
public string Remarks { get; set; }
public List<SubsidiaryRisks> SubsidiaryRiskList { get { return this.subsidiaryRisksList; } }
public string Identifier { get; set; }
#endregion
@ -130,6 +135,8 @@ namespace bsmd.database
if (this.IsNew)
{
this.CreateId();
scmd.Parameters.AddWithValue("@ID", this.Id);
scmd.CommandText = string.Format("INSERT INTO {0} (HAZId, UNNumber, " +
"PackingGroup, ProperShippingName, IMOClass, CompatibilityGroup, TechnicalName, NetExplosiveMass_KGM," +
"Flashpoint_CEL, Class7NuclideName, Class7MaxActivity_BQL, Class7Category, Class7TransportIndex, " +
@ -228,5 +235,20 @@ namespace bsmd.database
#endregion
#region IMessageParagraph implementation
public override List<IMessageParagraph> ChildParagraphs
{
get
{
List<IMessageParagraph> result = new List<IMessageParagraph>();
foreach (IMessageParagraph imp in this.SubsidiaryRiskList)
result.Add(imp);
return result;
}
}
#endregion
}
}

View File

@ -56,7 +56,8 @@ namespace bsmd.database
BY_ID,
BY_CORE,
NOA_NODID,
HAZ_ID
HAZ_ID,
IMDG_ID
}
/// <summary>

View File

@ -82,6 +82,8 @@ namespace bsmd.database
#endregion
#region DatabaseEntity implementation
public override void PrepareSave(IDbCommand cmd)
{
SqlCommand scmd = cmd as SqlCommand;
@ -164,7 +166,7 @@ namespace bsmd.database
}
case Message.LoadFilter.BSMDSTATUS:
{
query += "WHERE BSMDStatus = @STATUS";
query += "WHERE BSMDStatus = @STATUS ORDER BY Created DESC";
((SqlCommand)cmd).Parameters.AddWithValue("@STATUS", criteria[0]);
break;
}
@ -210,5 +212,16 @@ namespace bsmd.database
return result;
}
#endregion
#region display override
public override string ToString()
{
return string.Format("{0} - {1}", this.IMO, this.ETA);
}
#endregion
}
}

View File

@ -46,6 +46,7 @@
<Reference Include="System.Core" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Security" />
<Reference Include="System.Web.Services" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
@ -98,7 +99,9 @@
<Compile Include="SERV.cs" />
<Compile Include="ShipToShipActivitiesDuringLastTenPortFacilitiesCalled.cs" />
<Compile Include="ShowReportAttribute.cs" />
<Compile Include="SOAPLoggerExtension.cs" />
<Compile Include="STAT.cs" />
<Compile Include="SubsidiaryRisks.cs" />
<Compile Include="TIEFA.cs" />
<Compile Include="TIEFD.cs" />
<Compile Include="TOWA.cs" />

View File

@ -12,19 +12,17 @@ namespace bsmd.dbh.ResponseService
[ServiceContract]
public interface IResponseService
{
/*
[OperationContract]
string GetData(int value);
*/
/// <summary>
/// Da die Schnittstelle nur mit einem .xsd definiert war ist die Signatur der Methode fraglich
/// Sicher ist Void, weniger sicher der Namen und der Name des Parameters. Dessen Type allerdings schon.
/// </summary>
[OperationContract]
[OperationContract(Action = "http://tempuri.org/IResponseService/NSWResponse")]
[XmlSerializerFormatAttribute()]
void NSWResponse(bsmd.dbh.response.Root root);
void root(string Version, string MessageId, string VisitId, string TransitId, DateTime Timestamp,
string SenderReference, bsmd.dbh.response.RootType Type,
List<bsmd.dbh.response.RootMessage> Messages);
}
}

View File

@ -1,4 +1,13 @@
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using log4net;
using bsmd.database;
namespace bsmd.dbh.ResponseService
{
@ -8,10 +17,53 @@ namespace bsmd.dbh.ResponseService
{
private ILog _log = LogManager.GetLogger("dbh ResponseService");
public void NSWResponse(bsmd.dbh.response.Root root)
public void root(string Version, string MessageId, string VisitId, string TransitId, DateTime Timestamp,
string SenderReference, bsmd.dbh.response.RootType Type,
List<bsmd.dbh.response.RootMessage> Messages)
{
if (Version != null)
_log.InfoFormat("Version: {0}", Version);
if (MessageId != null)
_log.InfoFormat("MessageId: {0}", MessageId);
if (!VisitId.IsNullOrEmpty())
_log.InfoFormat("Visit-Id: {0}", VisitId);
if (!TransitId.IsNullOrEmpty())
_log.InfoFormat("Transit-Id: {0}", TransitId);
if (Timestamp != null)
_log.InfoFormat("Timestamp: {0}", Timestamp);
if (SenderReference != null)
_log.InfoFormat("Sender-Reference: {0}", SenderReference);
_log.InfoFormat("Type: {0}", Type);
if (Messages != null)
{
foreach (bsmd.dbh.response.RootMessage rootMessage in Messages)
{
_log.InfoFormat("Message type {0}: {1}", rootMessage.Type, rootMessage.Text);
}
}
/*
if (!(root is bsmd.dbh.response.Root))
{
_log.Info(root);
}
else
{
_log.Info("response received!");
Response.ProcessResponse(root, Properties.Settings.Default.DBConnectionString);
if (root != null)
{
_log.Info("processing..");
Response.ProcessResponse((bsmd.dbh.response.Root) root, Properties.Settings.Default.DBConnectionString);
}
else
{
_log.Fatal("root element null (probable deserialization problem");
}
}
*/
}
}
}

View File

@ -12,6 +12,12 @@
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
<webServices>
<!-- zum debuggen -->
<soapExtensionTypes>
<add type="bsmd.database.SoapLoggerExtension, bsmd.database" priority="1" group="0" />
</soapExtensionTypes>
</webServices>
</system.web>
<system.serviceModel>
<behaviors>

File diff suppressed because it is too large Load Diff

View File

@ -15,6 +15,7 @@ namespace bsmd.dbh.response
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Runtime.Serialization;
public partial class Root
@ -201,7 +202,7 @@ namespace bsmd.dbh.response
}
}
[System.Xml.Serialization.XmlArrayItemAttribute("Message", IsNullable = false)]
[System.Xml.Serialization.XmlArrayItemAttribute("Message", IsNullable = false, Namespace="")]
public List<RootMessage> Messages
{
get
@ -1575,6 +1576,9 @@ namespace bsmd.dbh.response
HAZD,
}
[XmlType(TypeName = "Message")]
public partial class RootMessage
{

View File

@ -44,7 +44,7 @@ namespace bsmd.dbh
// map message to dbh NSWRequest object
Dbh_Osis_Answ_Ws client = new Dbh_Osis_Answ_Ws();
RootReportingParty rp = new RootReportingParty();
bsmd.dbh.DBHWebReference.ReportingParty rp = new bsmd.dbh.DBHWebReference.ReportingParty();
rp.RPCity = message.ReportingParty.City;
rp.RPCountry = message.ReportingParty.Country;
rp.RPEMail = message.ReportingParty.EMail;
@ -57,10 +57,10 @@ namespace bsmd.dbh
rp.RPStreetAndNumber = message.ReportingParty.StreetAndNumber;
rp.RPTypeSpecified = message.ReportingParty.ReportingPartyType.HasValue;
if (rp.RPTypeSpecified)
rp.RPType = (RootReportingPartyRPType)message.ReportingParty.ReportingPartyType.Value;
rp.RPType = (ReportingPartyRPType) message.ReportingParty.ReportingPartyType.Value;
DateTime timestamp = DateTime.Now;
string version = "2.0";
string version = "1.0";
object item = null;
string senderReference = message.Id.Value.ToString("N");
@ -864,12 +864,447 @@ namespace bsmd.dbh
break;
#endregion
#region HAZA
//Felderreihenfolge wegen einfacher Test/Impl. entspricht genau dem XLS Sheet
case Message.NotificationClass.HAZA:
{
RootHAZA rootHAZA = new RootHAZA();
HAZ haz = message.Elements[0] as HAZ;
rootHAZA.Items = new object[4];
if(haz.DPGManifestOnBoardOnArrival.HasValue)
rootHAZA.Items[0] = haz.DPGManifestOnBoardOnArrival.Value ? RootHAZADPGManifestOnBoardOnArrival.Y : RootHAZADPGManifestOnBoardOnArrival.N;
#region HAZ positions
RootHAZADPGOnArrival dpgOnArrival = new RootHAZADPGOnArrival();
#region IMDG
if (haz.IMDGPositions.Count > 0)
{
dpgOnArrival.DPGItemIMDG = new RootHAZADPGOnArrivalDPGItemIMDG[haz.IMDGPositions.Count];
for (int i = 0; i < haz.IMDGPositions.Count; i++)
{
IMDGPosition imdgPos = haz.IMDGPositions[i];
RootHAZADPGOnArrivalDPGItemIMDG rootIMDG = new RootHAZADPGOnArrivalDPGItemIMDG();
rootIMDG.UNNumber = imdgPos.UNNumber;
if (imdgPos.PackingGroup.HasValue)
rootIMDG.PackingGroup = (RootHAZADPGOnArrivalDPGItemIMDGPackingGroup)imdgPos.PackingGroup.Value;
rootIMDG.ProperShippingName = imdgPos.ProperShippingName;
rootIMDG.IMOClass = imdgPos.IMOClass;
rootIMDG.CompatibilityGroup = imdgPos.CompatibilityGroup;
rootIMDG.TechnicalName = imdgPos.TechnicalName;
rootIMDG.NetExplosiveMass_KGMSpecified = imdgPos.NetExplosiveMass_KGM.HasValue;
if(imdgPos.NetExplosiveMass_KGM.HasValue)
rootIMDG.NetExplosiveMass_KGM = (float)imdgPos.NetExplosiveMass_KGM.Value;
rootIMDG.Flashpoint_CEL = imdgPos.Flashpoint_CEL;
rootIMDG.Class7NuclideName = imdgPos.Class7NuclideName;
rootIMDG.Class7MaxActivity_BQLSpecified = imdgPos.Class7MaxActivity_BQL.HasValue;
if (imdgPos.Class7MaxActivity_BQL.HasValue)
rootIMDG.Class7MaxActivity_BQL = (float)imdgPos.Class7MaxActivity_BQL.Value;
rootIMDG.Class7CategorySpecified = imdgPos.Class7Category.HasValue;
if (imdgPos.Class7Category.HasValue)
rootIMDG.Class7Category = imdgPos.Class7Category.Value;
rootIMDG.Class7TransportIndexSpecified = imdgPos.Class7TransportIndex.HasValue;
if (imdgPos.Class7TransportIndex.HasValue)
rootIMDG.Class7TransportIndex = (float) imdgPos.Class7TransportIndex.Value;
rootIMDG.Class7CSISpecified = imdgPos.Class7CSI.HasValue;
if (imdgPos.Class7CSI.HasValue)
rootIMDG.Class7CSI = imdgPos.Class7CSI.Value;
rootIMDG.ControlTemperature_CELSpecified = imdgPos.ControlTemperature_CEL.HasValue;
if (imdgPos.ControlTemperature_CEL.HasValue)
rootIMDG.ControlTemperature_CEL = (float)imdgPos.ControlTemperature_CEL.Value;
rootIMDG.EmergencyTemperature_CELSpecified = imdgPos.EmergencyTemperature_CEL.HasValue;
if (imdgPos.EmergencyTemperature_CEL.HasValue)
rootIMDG.EmergencyTemperature_CEL = (float)imdgPos.EmergencyTemperature_CEL.Value;
if (imdgPos.SubsidiaryRiskList.Count > 0)
{
rootIMDG.SubsidiaryRisks = new string[imdgPos.SubsidiaryRiskList.Count];
for (int sCount = 0; sCount < imdgPos.SubsidiaryRiskList.Count; sCount++)
rootIMDG.SubsidiaryRisks[sCount] = imdgPos.SubsidiaryRiskList[sCount].SubsidiaryRisk;
}
if(imdgPos.MarinePollutant.HasValue)
rootIMDG.MarinePollutant = imdgPos.MarinePollutant.Value ? RootHAZADPGOnArrivalDPGItemIMDGMarinePollutant.Y : RootHAZADPGOnArrivalDPGItemIMDGMarinePollutant.N;
if (imdgPos.NumberOfPackages.HasValue)
rootIMDG.NumberOfPackages = imdgPos.NumberOfPackages.Value;
rootIMDG.PackageType = imdgPos.PackageType;
if(imdgPos.LimitedQuantities.HasValue)
rootIMDG.LimitedQuantities = imdgPos.LimitedQuantities.Value ? RootHAZADPGOnArrivalDPGItemIMDGLimitedQuantities.Y : RootHAZADPGOnArrivalDPGItemIMDGLimitedQuantities.N;
if (imdgPos.ExceptedQuantities.HasValue)
rootIMDG.ExceptedQuantities = imdgPos.ExceptedQuantities.Value ? RootHAZADPGOnArrivalDPGItemIMDGExceptedQuantities.Y : RootHAZADPGOnArrivalDPGItemIMDGExceptedQuantities.N;
rootIMDG.NetQuantity_KGMSpecified = imdgPos.NetQuantity_KGM.HasValue;
if (imdgPos.NetQuantity_KGM.HasValue)
rootIMDG.NetQuantity_KGM = (float)imdgPos.NetQuantity_KGM.Value;
rootIMDG.GrossQuantity_KGMSpecified = imdgPos.GrossQuantity_KGM.HasValue;
if (imdgPos.GrossQuantity_KGM.HasValue)
rootIMDG.GrossQuantity_KGM = (float)imdgPos.GrossQuantity_KGM.Value;
rootIMDG.Volume_MTQSpecified = imdgPos.Volume_MTQ.HasValue;
if (imdgPos.Volume_MTQ.HasValue)
rootIMDG.Volume_MTQ = (float)imdgPos.Volume_MTQ.Value;
rootIMDG.GeneralCargoIBCSpecified = imdgPos.GeneralCargoIBC.HasValue;
if (imdgPos.GeneralCargoIBC.HasValue)
rootIMDG.GeneralCargoIBC = imdgPos.GeneralCargoIBC.Value ? RootHAZADPGOnArrivalDPGItemIMDGGeneralCargoIBC.Y : RootHAZADPGOnArrivalDPGItemIMDGGeneralCargoIBC.N;
rootIMDG.ContainerNumber = imdgPos.ContainerNumber;
rootIMDG.VehicleLicenseNumber = imdgPos.VehicleLicenseNumber;
rootIMDG.StowagePosition = imdgPos.StowagePosition;
rootIMDG.PortOfLoading = imdgPos.PortOfLoading;
rootIMDG.PortOfDischarge = imdgPos.PortOfDischarge;
rootIMDG.Remarks = imdgPos.Remarks;
dpgOnArrival.DPGItemIMDG[i] = rootIMDG;
}
}
#endregion
#region IBC
if (haz.IBCPositions.Count > 0)
{
dpgOnArrival.DPGItemIBC = new RootHAZADPGOnArrivalDPGItemIBC[haz.IBCPositions.Count];
for(int i=0;i<haz.IBCPositions.Count;i++)
{
RootHAZADPGOnArrivalDPGItemIBC rootIBC = new RootHAZADPGOnArrivalDPGItemIBC();
IBCPosition ibcPos = haz.IBCPositions[i];
rootIBC.ProductName = ibcPos.ProductName;
if(ibcPos.PollutionCategory.HasValue)
rootIBC.PollutionCategory = (RootHAZADPGOnArrivalDPGItemIBCPollutionCategory)ibcPos.PollutionCategory.Value;
rootIBC.HazardsSpecified = ibcPos.Hazards.HasValue;
if (ibcPos.Hazards.HasValue)
rootIBC.Hazards = (RootHAZADPGOnArrivalDPGItemIBCHazards)ibcPos.Hazards.Value;
if (ibcPos.FlashpointInformation.HasValue)
rootIBC.FlashpointInformation = (RootHAZADPGOnArrivalDPGItemIBCFlashpointInformation)ibcPos.FlashpointInformation.Value;
rootIBC.Flashpoint_CEL = ibcPos.Flashpoint_CEL;
if (ibcPos.Quantity_KGM.HasValue)
rootIBC.Quantity_KGM = (float)ibcPos.Quantity_KGM.Value;
rootIBC.StowagePosition = ibcPos.StowagePosition;
rootIBC.PortOfLoading = ibcPos.PortOfLoading;
rootIBC.PortOfDischarge = ibcPos.PortOfDischarge;
rootIBC.SpecRef15_19Specified = ibcPos.SpecRef15_19.HasValue;
if (ibcPos.SpecRef15_19.HasValue)
rootIBC.SpecRef15_19 = ibcPos.SpecRef15_19.Value ? RootHAZADPGOnArrivalDPGItemIBCSpecRef15_19.Y : RootHAZADPGOnArrivalDPGItemIBCSpecRef15_19.N;
rootIBC.Remarks = ibcPos.Remarks;
dpgOnArrival.DPGItemIBC[i] = rootIBC;
}
}
#endregion
#region IGC
if (haz.IGCPositions.Count > 0)
{
dpgOnArrival.DPGItemIGC = new RootHAZADPGOnArrivalDPGItemIGC[haz.IGCPositions.Count];
for (int i = 0; i < haz.IGCPositions.Count; i++)
{
RootHAZADPGOnArrivalDPGItemIGC rootIGC = new RootHAZADPGOnArrivalDPGItemIGC();
IGCPosition igcPos = haz.IGCPositions[i];
rootIGC.UNNumber = igcPos.UNNumber;
rootIGC.IMOClass = igcPos.IMOClass;
rootIGC.ProductName = igcPos.ProductName;
if (igcPos.Quantity_KGM.HasValue)
rootIGC.Quantity_KGM = (float)igcPos.Quantity_KGM.Value;
rootIGC.StowagePosition = igcPos.StowagePosition;
rootIGC.PortOfLoading = igcPos.PortOfLoading;
rootIGC.PortOfDischarge = igcPos.PortOfDischarge;
rootIGC.Remarks = igcPos.Remarks;
dpgOnArrival.DPGItemIGC[i] = rootIGC;
}
}
#endregion
#region IMSBC
if (haz.IMSBCPositions.Count > 0)
{
dpgOnArrival.DPGItemIMSBC = new RootHAZADPGOnArrivalDPGItemIMSBC[haz.IMSBCPositions.Count];
for (int i = 0; i < haz.IMSBCPositions.Count; i++)
{
RootHAZADPGOnArrivalDPGItemIMSBC rootIMSBC = new RootHAZADPGOnArrivalDPGItemIMSBC();
IMSBCPosition imsbcPos = haz.IMSBCPositions[i];
rootIMSBC.BulkCargoShippingName = imsbcPos.BulkCargoShippingName;
if (imsbcPos.MHB.HasValue)
rootIMSBC.MHB = imsbcPos.MHB.Value ? RootHAZADPGOnArrivalDPGItemIMSBCMHB.Y : RootHAZADPGOnArrivalDPGItemIMSBCMHB.N;
rootIMSBC.UNNumber = imsbcPos.UNNumber;
rootIMSBC.IMOClass = imsbcPos.IMOClass;
if (imsbcPos.Quantity_KGM.HasValue)
rootIMSBC.Quantity_KGM = (float)imsbcPos.Quantity_KGM.Value;
rootIMSBC.StowagePosition = imsbcPos.StowagePosition;
rootIMSBC.PortOfLoading = imsbcPos.PortOfLoading;
rootIMSBC.PortOfDischarge = imsbcPos.PortOfDischarge;
rootIMSBC.Remarks = imsbcPos.Remarks;
dpgOnArrival.DPGItemIMSBC[i] = rootIMSBC;
}
}
#endregion
#region MARPOL_ANNEX_I
if (haz.MARPOLPositions.Count > 0)
{
dpgOnArrival.DPGItemMARPOLAnnexI = new RootHAZADPGOnArrivalDPGItemMARPOLAnnexI[haz.MARPOLPositions.Count];
for (int i = 0; i < haz.MARPOLPositions.Count; i++)
{
RootHAZADPGOnArrivalDPGItemMARPOLAnnexI rootMarpol = new RootHAZADPGOnArrivalDPGItemMARPOLAnnexI();
MARPOL_Annex_I_Position marpolPos = haz.MARPOLPositions[i];
rootMarpol.Name = marpolPos.Name;
if (marpolPos.FlashpointInformation.HasValue)
rootMarpol.FlashpointInformation = (RootHAZADPGOnArrivalDPGItemMARPOLAnnexIFlashpointInformation)marpolPos.FlashpointInformation.Value;
rootMarpol.Flashpoint_CEL = marpolPos.Flashpoint_CEL;
if (marpolPos.Quantity_KGM.HasValue)
rootMarpol.Quantity_KGM = (float)marpolPos.Quantity_KGM.Value;
rootMarpol.StowagePosition = marpolPos.StowagePosition;
rootMarpol.PortOfLoading = marpolPos.PortOfLoading;
rootMarpol.PortOfDischarge = marpolPos.PortOfDischarge;
rootMarpol.Remarks = marpolPos.Remarks;
dpgOnArrival.DPGItemMARPOLAnnexI[i] = rootMarpol;
}
}
#endregion
rootHAZA.Items[1] = dpgOnArrival;
#endregion
if (haz.INFShipClass.HasValue)
{
RootHAZAINFShipClass infShipClass = (RootHAZAINFShipClass) haz.INFShipClass.Value;
rootHAZA.Items[2] = infShipClass;
}
if (haz.NoDPGOnBoardOnArrival ?? false)
rootHAZA.Items[3] = RootHAZANoDPGOnBoardOnArrival.Y;
item = rootHAZA;
}
break;
#endregion
#region HAZD
//Felderreihenfolge wegen einfacher Test/Impl. entspricht genau dem XLS Sheet
case Message.NotificationClass.HAZD:
{
RootHAZD rootHAZD = new RootHAZD();
HAZ haz = message.Elements[0] as HAZ;
rootHAZD.Items = new object[4];
if (haz.DPGManifestOnBoardOnArrival.HasValue)
rootHAZD.Items[0] = haz.DPGManifestOnBoardOnArrival.Value ? RootHAZDDPGManifestOnBoardOnDeparture.Y : RootHAZDDPGManifestOnBoardOnDeparture.N;
#region HAZ positions
RootHAZDDPGOnDeparture dpgOnDeparture = new RootHAZDDPGOnDeparture();
#region IMDG
if (haz.IMDGPositions.Count > 0)
{
dpgOnDeparture.DPGItemIMDG = new RootHAZDDPGOnDepartureDPGItemIMDG[haz.IMDGPositions.Count];
for (int i = 0; i < haz.IMDGPositions.Count; i++)
{
IMDGPosition imdgPos = haz.IMDGPositions[i];
RootHAZDDPGOnDepartureDPGItemIMDG rootIMDG = new RootHAZDDPGOnDepartureDPGItemIMDG();
rootIMDG.UNNumber = imdgPos.UNNumber;
if (imdgPos.PackingGroup.HasValue)
rootIMDG.PackingGroup = (RootHAZDDPGOnDepartureDPGItemIMDGPackingGroup)imdgPos.PackingGroup.Value;
rootIMDG.ProperShippingName = imdgPos.ProperShippingName;
rootIMDG.IMOClass = imdgPos.IMOClass;
rootIMDG.CompatibilityGroup = imdgPos.CompatibilityGroup;
rootIMDG.TechnicalName = imdgPos.TechnicalName;
rootIMDG.NetExplosiveMass_KGMSpecified = imdgPos.NetExplosiveMass_KGM.HasValue;
if (imdgPos.NetExplosiveMass_KGM.HasValue)
rootIMDG.NetExplosiveMass_KGM = (float)imdgPos.NetExplosiveMass_KGM.Value;
rootIMDG.Flashpoint_CEL = imdgPos.Flashpoint_CEL;
rootIMDG.Class7NuclideName = imdgPos.Class7NuclideName;
rootIMDG.Class7MaxActivity_BQLSpecified = imdgPos.Class7MaxActivity_BQL.HasValue;
if (imdgPos.Class7MaxActivity_BQL.HasValue)
rootIMDG.Class7MaxActivity_BQL = (float)imdgPos.Class7MaxActivity_BQL.Value;
rootIMDG.Class7CategorySpecified = imdgPos.Class7Category.HasValue;
if (imdgPos.Class7Category.HasValue)
rootIMDG.Class7Category = imdgPos.Class7Category.Value;
rootIMDG.Class7TransportIndexSpecified = imdgPos.Class7TransportIndex.HasValue;
if (imdgPos.Class7TransportIndex.HasValue)
rootIMDG.Class7TransportIndex = (float)imdgPos.Class7TransportIndex.Value;
rootIMDG.Class7CSISpecified = imdgPos.Class7CSI.HasValue;
if (imdgPos.Class7CSI.HasValue)
rootIMDG.Class7CSI = imdgPos.Class7CSI.Value;
rootIMDG.ControlTemperature_CELSpecified = imdgPos.ControlTemperature_CEL.HasValue;
if (imdgPos.ControlTemperature_CEL.HasValue)
rootIMDG.ControlTemperature_CEL = (float)imdgPos.ControlTemperature_CEL.Value;
rootIMDG.EmergencyTemperature_CELSpecified = imdgPos.EmergencyTemperature_CEL.HasValue;
if (imdgPos.EmergencyTemperature_CEL.HasValue)
rootIMDG.EmergencyTemperature_CEL = (float)imdgPos.EmergencyTemperature_CEL.Value;
if (imdgPos.SubsidiaryRiskList.Count > 0)
{
rootIMDG.SubsidiaryRisks = new string[imdgPos.SubsidiaryRiskList.Count];
for (int sCount = 0; sCount < imdgPos.SubsidiaryRiskList.Count; sCount++)
rootIMDG.SubsidiaryRisks[sCount] = imdgPos.SubsidiaryRiskList[sCount].SubsidiaryRisk;
}
if (imdgPos.MarinePollutant.HasValue)
rootIMDG.MarinePollutant = imdgPos.MarinePollutant.Value ? RootHAZDDPGOnDepartureDPGItemIMDGMarinePollutant.Y : RootHAZDDPGOnDepartureDPGItemIMDGMarinePollutant.N;
if (imdgPos.NumberOfPackages.HasValue)
rootIMDG.NumberOfPackages = imdgPos.NumberOfPackages.Value;
rootIMDG.PackageType = imdgPos.PackageType;
if (imdgPos.LimitedQuantities.HasValue)
rootIMDG.LimitedQuantities = imdgPos.LimitedQuantities.Value ? RootHAZDDPGOnDepartureDPGItemIMDGLimitedQuantities.Y : RootHAZDDPGOnDepartureDPGItemIMDGLimitedQuantities.N;
if (imdgPos.ExceptedQuantities.HasValue)
rootIMDG.ExceptedQuantities = imdgPos.ExceptedQuantities.Value ? RootHAZDDPGOnDepartureDPGItemIMDGExceptedQuantities.Y : RootHAZDDPGOnDepartureDPGItemIMDGExceptedQuantities.N;
rootIMDG.NetQuantity_KGMSpecified = imdgPos.NetQuantity_KGM.HasValue;
if (imdgPos.NetQuantity_KGM.HasValue)
rootIMDG.NetQuantity_KGM = (float)imdgPos.NetQuantity_KGM.Value;
rootIMDG.GrossQuantity_KGMSpecified = imdgPos.GrossQuantity_KGM.HasValue;
if (imdgPos.GrossQuantity_KGM.HasValue)
rootIMDG.GrossQuantity_KGM = (float)imdgPos.GrossQuantity_KGM.Value;
rootIMDG.Volume_MTQSpecified = imdgPos.Volume_MTQ.HasValue;
if (imdgPos.Volume_MTQ.HasValue)
rootIMDG.Volume_MTQ = (float)imdgPos.Volume_MTQ.Value;
rootIMDG.GeneralCargoIBCSpecified = imdgPos.GeneralCargoIBC.HasValue;
if (imdgPos.GeneralCargoIBC.HasValue)
rootIMDG.GeneralCargoIBC = imdgPos.GeneralCargoIBC.Value ? RootHAZDDPGOnDepartureDPGItemIMDGGeneralCargoIBC.Y : RootHAZDDPGOnDepartureDPGItemIMDGGeneralCargoIBC.N;
rootIMDG.ContainerNumber = imdgPos.ContainerNumber;
rootIMDG.VehicleLicenseNumber = imdgPos.VehicleLicenseNumber;
rootIMDG.StowagePosition = imdgPos.StowagePosition;
rootIMDG.PortOfLoading = imdgPos.PortOfLoading;
rootIMDG.PortOfDischarge = imdgPos.PortOfDischarge;
rootIMDG.Remarks = imdgPos.Remarks;
dpgOnDeparture.DPGItemIMDG[i] = rootIMDG;
}
}
#endregion
#region IBC
if (haz.IBCPositions.Count > 0)
{
dpgOnDeparture.DPGItemIBC = new RootHAZDDPGOnDepartureDPGItemIBC[haz.IBCPositions.Count];
for (int i = 0; i < haz.IBCPositions.Count; i++)
{
RootHAZDDPGOnDepartureDPGItemIBC rootIBC = new RootHAZDDPGOnDepartureDPGItemIBC();
IBCPosition ibcPos = haz.IBCPositions[i];
rootIBC.ProductName = ibcPos.ProductName;
if (ibcPos.PollutionCategory.HasValue)
rootIBC.PollutionCategory = (RootHAZDDPGOnDepartureDPGItemIBCPollutionCategory)ibcPos.PollutionCategory.Value;
rootIBC.HazardsSpecified = ibcPos.Hazards.HasValue;
if (ibcPos.Hazards.HasValue)
rootIBC.Hazards = (RootHAZDDPGOnDepartureDPGItemIBCHazards)ibcPos.Hazards.Value;
if (ibcPos.FlashpointInformation.HasValue)
rootIBC.FlashpointInformation = (RootHAZDDPGOnDepartureDPGItemIBCFlashpointInformation)ibcPos.FlashpointInformation.Value;
rootIBC.Flashpoint_CEL = ibcPos.Flashpoint_CEL;
if (ibcPos.Quantity_KGM.HasValue)
rootIBC.Quantity_KGM = (float)ibcPos.Quantity_KGM.Value;
rootIBC.StowagePosition = ibcPos.StowagePosition;
rootIBC.PortOfLoading = ibcPos.PortOfLoading;
rootIBC.PortOfDischarge = ibcPos.PortOfDischarge;
rootIBC.SpecRef15_19Specified = ibcPos.SpecRef15_19.HasValue;
if (ibcPos.SpecRef15_19.HasValue)
rootIBC.SpecRef15_19 = ibcPos.SpecRef15_19.Value ? RootHAZDDPGOnDepartureDPGItemIBCSpecRef15_19.Y : RootHAZDDPGOnDepartureDPGItemIBCSpecRef15_19.N;
rootIBC.Remarks = ibcPos.Remarks;
dpgOnDeparture.DPGItemIBC[i] = rootIBC;
}
}
#endregion
#region IGC
if (haz.IGCPositions.Count > 0)
{
dpgOnDeparture.DPGItemIGC = new RootHAZDDPGOnDepartureDPGItemIGC[haz.IGCPositions.Count];
for (int i = 0; i < haz.IGCPositions.Count; i++)
{
RootHAZDDPGOnDepartureDPGItemIGC rootIGC = new RootHAZDDPGOnDepartureDPGItemIGC();
IGCPosition igcPos = haz.IGCPositions[i];
rootIGC.UNNumber = igcPos.UNNumber;
rootIGC.IMOClass = igcPos.IMOClass;
rootIGC.ProductName = igcPos.ProductName;
if (igcPos.Quantity_KGM.HasValue)
rootIGC.Quantity_KGM = (float)igcPos.Quantity_KGM.Value;
rootIGC.StowagePosition = igcPos.StowagePosition;
rootIGC.PortOfLoading = igcPos.PortOfLoading;
rootIGC.PortOfDischarge = igcPos.PortOfDischarge;
rootIGC.Remarks = igcPos.Remarks;
dpgOnDeparture.DPGItemIGC[i] = rootIGC;
}
}
#endregion
#region IMSBC
if (haz.IMSBCPositions.Count > 0)
{
dpgOnDeparture.DPGItemIMSBC = new RootHAZDDPGOnDepartureDPGItemIMSBC[haz.IMSBCPositions.Count];
for (int i = 0; i < haz.IMSBCPositions.Count; i++)
{
RootHAZDDPGOnDepartureDPGItemIMSBC rootIMSBC = new RootHAZDDPGOnDepartureDPGItemIMSBC();
IMSBCPosition imsbcPos = haz.IMSBCPositions[i];
rootIMSBC.BulkCargoShippingName = imsbcPos.BulkCargoShippingName;
if (imsbcPos.MHB.HasValue)
rootIMSBC.MHB = imsbcPos.MHB.Value ? RootHAZDDPGOnDepartureDPGItemIMSBCMHB.Y : RootHAZDDPGOnDepartureDPGItemIMSBCMHB.N;
rootIMSBC.UNNumber = imsbcPos.UNNumber;
rootIMSBC.IMOClass = imsbcPos.IMOClass;
if (imsbcPos.Quantity_KGM.HasValue)
rootIMSBC.Quantity_KGM = (float)imsbcPos.Quantity_KGM.Value;
rootIMSBC.StowagePosition = imsbcPos.StowagePosition;
rootIMSBC.PortOfLoading = imsbcPos.PortOfLoading;
rootIMSBC.PortOfDischarge = imsbcPos.PortOfDischarge;
rootIMSBC.Remarks = imsbcPos.Remarks;
dpgOnDeparture.DPGItemIMSBC[i] = rootIMSBC;
}
}
#endregion
#region MARPOL_ANNEX_I
if (haz.MARPOLPositions.Count > 0)
{
dpgOnDeparture.DPGItemMARPOLAnnexI = new RootHAZDDPGOnDepartureDPGItemMARPOLAnnexI[haz.MARPOLPositions.Count];
for (int i = 0; i < haz.MARPOLPositions.Count; i++)
{
RootHAZDDPGOnDepartureDPGItemMARPOLAnnexI rootMarpol = new RootHAZDDPGOnDepartureDPGItemMARPOLAnnexI();
MARPOL_Annex_I_Position marpolPos = haz.MARPOLPositions[i];
rootMarpol.Name = marpolPos.Name;
if (marpolPos.FlashpointInformation.HasValue)
rootMarpol.FlashpointInformation = (RootHAZDDPGOnDepartureDPGItemMARPOLAnnexIFlashpointInformation)marpolPos.FlashpointInformation.Value;
rootMarpol.Flashpoint_CEL = marpolPos.Flashpoint_CEL;
if (marpolPos.Quantity_KGM.HasValue)
rootMarpol.Quantity_KGM = (float)marpolPos.Quantity_KGM.Value;
rootMarpol.StowagePosition = marpolPos.StowagePosition;
rootMarpol.PortOfLoading = marpolPos.PortOfLoading;
rootMarpol.PortOfDischarge = marpolPos.PortOfDischarge;
rootMarpol.Remarks = marpolPos.Remarks;
dpgOnDeparture.DPGItemMARPOLAnnexI[i] = rootMarpol;
}
}
#endregion
rootHAZD.Items[1] = dpgOnDeparture;
#endregion
if (haz.INFShipClass.HasValue)
{
RootHAZDINFShipClass infShipClass = (RootHAZDINFShipClass)haz.INFShipClass.Value;
rootHAZD.Items[2] = infShipClass;
}
if (haz.NoDPGOnBoardOnArrival ?? false)
rootHAZD.Items[3] = RootHAZDNoDPGOnBoardOnDeparture.Y;
item = rootHAZD;
}
break;
#endregion
#region catch all
default:
{
_log.ErrorFormat("DBH send message: message type {0} not implemented", message.MessageNotificationClass);
return false;
}
#endregion
}
// send object

View File

@ -42,6 +42,9 @@
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceModel.Web" />
<Reference Include="System.Web.Services" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />

View File

@ -6,3 +6,11 @@ Damit man einen Web-Service erhält, der nicht die private Felder sondern die Pr
generierten Klasse verwendet, muss man
[OperationContract] und [XmlSerializerFormatAttribute()]
auf der Interface-Methode verwenden.
Neu:
Der Namespace darf nicht im endgültigen SOAP Call enthalten sein. Dazu habe ich in den
generierten Service-Klassen den Namespace auf "" gesetzt.wsdl.exe war nicht notwendig!
so:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.openuri.org/submit", RequestNamespace="", ResponseElementName="submitResponse", ResponseNamespace="", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]

View File

@ -121,14 +121,25 @@ namespace bsmd.herberg.FormService
formBody.apiIdentifier.clientGuid = Properties.Settings.Default.ClientGuid.ToString();
formBody.formGuid = dataSet.formGuid;
bool successfulGet = true;
GetFormDataResponseData formResponse = null;
GetFormDataResponseData formResponse = client.GetFormData(formBody);
if (formResponse.success)
try
{
formResponse = client.GetFormData(formBody);
}
catch (Exception ex)
{
_log.ErrorFormat("Exception reading formBody: {0}", ex.ToString());
successfulGet = false;
}
if (successfulGet && formResponse.success)
{
// abgefragtes Formular in die DB speichern
MessageCore aMessageCore = DBManager.Instance.GetHerbergFormMessage(new Guid(formBody.formGuid));
if (aMessageCore == null)
{
_log.InfoFormat("Creating new MessageCore for IMO {0}", formResponse.imoNumber);
// neuen Anlaufeintrag (=MessageCore) erstellen
aMessageCore = new MessageCore();
aMessageCore.HerbergFormGuid = new Guid(formBody.formGuid);
@ -142,10 +153,13 @@ namespace bsmd.herberg.FormService
}
DBManager.Instance.Save(aMessageCore);
}
else
{
// TODO: Status von Core prüfen (wurde schon von BSMD verändert?)
_log.InfoFormat("Updating form data for IMO {0}", formResponse.imoNumber);
}
// Änderungen im Formular übertragen und speichern
Util.UpdateFormCore(aMessageCore, formResponse);
}
else
{
@ -155,7 +169,9 @@ namespace bsmd.herberg.FormService
}
else
{
_log.Info("no data sets found on the server in this interval");
_log.InfoFormat("nothing: {0} - {1}",
body.timeFrameRequestFilter.startDate,
body.timeFrameRequestFilter.endDate);
}
}
else

View File

@ -36,16 +36,17 @@ namespace bsmd.herberg.FormService
bool isDeparture = false;
for (int i = 0; i < formResponse.formDatasets.Length; i++)
//for (int i = 0; i < formResponse.formDatasets.Length; i++)
if(formResponse.formDatasets.Length > 0) // wir verarbeiten nur das "neueste" form dataset
{
int i = formResponse.formDatasets.Length - 1;
Dictionary<string, Dictionary<string, string>> groupedVals = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, Dictionary<int, Dictionary<string, string>>> groupedRowVals = new Dictionary<string, Dictionary<int, Dictionary<string, string>>>();
WebReference.FormDataset fds = formResponse.formDatasets[i];
_log.InfoFormat("proc. dataset with Rev.Date:{0}", fds.revisionDate);
if (fds.startPeriodSpecified)
Trace.WriteLine(fds.startPeriod);
Trace.WriteLine(string.Format("Dataset {0}", i));
foreach (WebReference.FormData formData in fds.formData)
{
string[] nElems = formData.name.Split('.');
@ -57,7 +58,7 @@ namespace bsmd.herberg.FormService
switch (nElems[0])
{
case "REGISTRATION_TYPE":
_log.WarnFormat("REGISTRATION_TYPE: {0}", formData.value);
_log.InfoFormat("REGISTRATION_TYPE: {0}", formData.value);
break;
case "REPORT_TYPE":
aMessageCore.HerbergReportType = formData.value;
@ -164,7 +165,7 @@ namespace bsmd.herberg.FormService
}
else
{
_log.InfoFormat("found message type {0}", messageType);
_log.DebugFormat("found message type {0}", messageType);
theMessage = messages[messageType.ToUpper()];
}
@ -186,7 +187,7 @@ namespace bsmd.herberg.FormService
{
try
{
if (vDict.ContainsKey("ATAPortOfCall")) ata.ATAPortOfCall = DateTime.Parse(vDict["ATAPortOfCall"]);
if (vDict.ContainsKey("ATAPortOfCall")) ata.ATAPortOfCall = Extensions.TryParse(vDict["ATAPortOfCall"]);
}
catch (Exception ex)
{
@ -213,7 +214,7 @@ namespace bsmd.herberg.FormService
{
try
{
if (vDict.ContainsKey("ATDPortOfCall")) atd.ATDPortOfCall = DateTime.Parse(vDict["ATDPortOfCall"]);
if (vDict.ContainsKey("ATDPortOfCall")) atd.ATDPortOfCall = Extensions.TryParse(vDict["ATDPortOfCall"]);
}
catch (Exception ex)
{
@ -268,14 +269,14 @@ namespace bsmd.herberg.FormService
try
{
// if (vDict.ContainsKey("CallPurposeCode")) noa_nod.CallPurposeCode = Int32.Parse(vDict["CallPurposeCode"]);
if (vDict.ContainsKey("ETAToNextPort")) noa_nod.ETAToNextPort = DateTime.Parse(vDict["ETAToNextPort"]);
if (vDict.ContainsKey("ETDFromLastPort")) noa_nod.ETDFromLastPort = DateTime.Parse(vDict["ETDFromLastPort"]);
if (vDict.ContainsKey("ETAToPortOfCall")) noa_nod.ETAToPortOfCall = DateTime.Parse(vDict["ETAToPortOfCall"]);
if (vDict.ContainsKey("ETDFromPortOfCall")) noa_nod.ETDFromPortOfCall = DateTime.Parse(vDict["ETDFromPortOfCall"]);
if (vDict.ContainsKey("ETAToNextPort")) noa_nod.ETAToNextPort = Extensions.TryParse(vDict["ETAToNextPort"]);
if (vDict.ContainsKey("ETDFromLastPort")) noa_nod.ETDFromLastPort = Extensions.TryParse(vDict["ETDFromLastPort"]);
if (vDict.ContainsKey("ETAToPortOfCall")) noa_nod.ETAToPortOfCall = Extensions.TryParse(vDict["ETAToPortOfCall"]);
if (vDict.ContainsKey("ETDFromPortOfCall")) noa_nod.ETDFromPortOfCall = Extensions.TryParse(vDict["ETDFromPortOfCall"]);
// if (vDict.ContainsKey("CallPurposeDescription")) noa_nod.CallPurposeDescription = vDict["CallPurposeDescription"];
// if(vDict.ContainsKey("CountryOfNextPort")) noa_nod. nicht relevant
if (vDict.ContainsKey("ETAToKielCanal")) noa_nod.ETAToKielCanal = DateTime.Parse(vDict["ETAToKielCanal"]);
if (vDict.ContainsKey("ETDFromKielCanal")) noa_nod.ETDFromKielCanal = DateTime.Parse(vDict["ETDFromKielCanal"]);
if (vDict.ContainsKey("ETAToKielCanal")) noa_nod.ETAToKielCanal = Extensions.TryParse(vDict["ETAToKielCanal"]);
if (vDict.ContainsKey("ETDFromKielCanal")) noa_nod.ETDFromKielCanal = Extensions.TryParse(vDict["ETDFromKielCanal"]);
if (vDict.ContainsKey("CountryCodeOfLastPort") && vDict.ContainsKey("LastPortCode"))
noa_nod.LastPort = vDict["CountryCodeOfLastPort"] + vDict["LastPortCode"];
if (vDict.ContainsKey("CountryCodeOfNextPort") && vDict.ContainsKey("NextPortCode"))
@ -344,6 +345,9 @@ namespace bsmd.herberg.FormService
if (vDict.ContainsKey("ISMCompanyPostalCode")) stat.ISMCompanyPostalCode = vDict["ISMCompanyPostalCode"];
if (vDict.ContainsKey("ISMCompanyCity")) stat.ISMCompanyCity = vDict["ISMCompanyCity"];
if (vDict.ContainsKey("ISMCompanyCountry")) stat.ISMCompanyCountry = vDict["ISMCompanyCountry"];
if (stat.Flag.IsNullOrEmpty() && vDict.ContainsKey("CountryCodeOfRegistry"))
stat.Flag = vDict["CountryCodeOfRegistry"];
}
catch (Exception ex)
{
@ -382,17 +386,17 @@ namespace bsmd.herberg.FormService
if (vDict.ContainsKey("SanitaryMeasuresApplied")) mdh.SanitaryMeasuresApplied = vDict["SanitaryMeasuresApplied"].Equals("Y");
if (vDict.ContainsKey("SanitaryMeasuresType")) mdh.SanitaryMeasuresType = vDict["SanitaryMeasuresType"];
if (vDict.ContainsKey("SanitaryMeasuresLocation")) mdh.SanitaryMeasuresLocation = vDict["SanitaryMeasuresLocation"];
if (vDict.ContainsKey("SanitaryMeasuresDate")) mdh.SanitaryMeasuresDate = DateTime.Parse(vDict["SanitaryMeasuresDate"]);
if (vDict.ContainsKey("SanitaryMeasuresDate")) mdh.SanitaryMeasuresDate = Extensions.TryParse(vDict["SanitaryMeasuresDate"]);
if (vDict.ContainsKey("StowawaysDetected")) mdh.StowawaysDetected = vDict["StowawaysDetected"].Equals("Y");
if (vDict.ContainsKey("StowawaysJoiningLocation")) mdh.StowawaysJoiningLocation = vDict["StowawaysJoiningLocation"];
if (vDict.ContainsKey("SickAnimalOrPetOnBoard")) mdh.SickAnimalOrPetOnBoard = vDict["SickAnimalOrPetOnBoard"].Equals("Y");
if (vDict.ContainsKey("ValidSanitaryControlExemptionOrCertificateOnBoard")) mdh.ValidSanitaryControlExemptionOrCertificateOnBoard = vDict["ValidSanitaryControlExemptionOrCertificateOnBoard"].Equals("Y");
if (vDict.ContainsKey("SanitaryControlCertPlaceOfIssue")) mdh.PlaceOfIssue = vDict["SanitaryControlCertPlaceOfIssue"];
if (vDict.ContainsKey("SanitaryControlCertDateOfIssue")) mdh.DateOfIssue = DateTime.Parse(vDict["SanitaryControlCertDateOfIssue"]);
if (vDict.ContainsKey("SanitaryControlCertDateOfIssue")) mdh.DateOfIssue = Extensions.TryParse(vDict["SanitaryControlCertDateOfIssue"]);
if (vDict.ContainsKey("SanitaryControlReinspectionRequired")) mdh.SanitaryControlReinspectionRequired = vDict["SanitaryControlReinspectionRequired"].Equals("Y");
if (vDict.ContainsKey("InfectedAreaVisited")) mdh.InfectedAreaVisited = vDict["InfectedAreaVisited"].Equals("Y");
if (vDict.ContainsKey("InfectedAreaPort")) mdh.InfectedAreaPort = vDict["InfectedAreaPort"];
if (vDict.ContainsKey("InfectedAreaDate")) mdh.InfectedAreaDate = DateTime.Parse(vDict["InfectedAreaDate"]);
if (vDict.ContainsKey("InfectedAreaDate")) mdh.InfectedAreaDate = Extensions.TryParse(vDict["InfectedAreaDate"]);
// sublisten
foreach (int key in nDict.Keys)
@ -407,7 +411,7 @@ namespace bsmd.herberg.FormService
poc30.MDH = mdh;
}
if (pDict.ContainsKey("PortOfCallLast30DaysDateOfDeparture")) poc30.PortOfCallLast30DaysDateOfDeparture = DateTime.Parse(pDict["PortOfCallLast30DaysDateOfDeparture"]);
if (pDict.ContainsKey("PortOfCallLast30DaysDateOfDeparture")) poc30.PortOfCallLast30DaysDateOfDeparture = Extensions.TryParse(pDict["PortOfCallLast30DaysDateOfDeparture"]);
if (pDict.ContainsKey("PortOfCallLast30DaysCrewMembersJoined")) poc30.PortOfCallLast30DaysCrewMembersJoined = pDict["PortOfCallLast30DaysCrewMembersJoined"].Equals("Y");
if (pDict.ContainsKey("PortOfCallLast30DaysPortCode") && pDict.ContainsKey("PortOfCallLast30DaysCountryCode"))
poc30.PortOfCallLast30DaysLocode = pDict["PortOfCallLast30DaysCountryCode"] + pDict["PortOfCallLast30DaysPortCode"];
@ -536,7 +540,7 @@ namespace bsmd.herberg.FormService
}
if (ppDict.ContainsKey("PortOfItineraryName")) poi.PortOfItineraryName = ppDict["PortOfItineraryName"];
if (ppDict.ContainsKey("PortOfItineraryETA")) poi.PortOfItineraryETA = DateTime.Parse(ppDict["PortOfItineraryETA"]);
if (ppDict.ContainsKey("PortOfItineraryETA")) poi.PortOfItineraryETA = Extensions.TryParse(ppDict["PortOfItineraryETA"]);
saveMessages.Add(poi);
}
@ -633,7 +637,7 @@ namespace bsmd.herberg.FormService
if (pDict.ContainsKey("CrewMemberLastName")) crew.CrewMemberLastName = pDict["CrewMemberLastName"];
if (pDict.ContainsKey("CrewMemberFirstName")) crew.CrewMemberFirstName = pDict["CrewMemberFirstName"];
if (pDict.ContainsKey("CrewMemberPlaceOfBirth")) crew.CrewMemberPlaceOfBirth = pDict["CrewMemberPlaceOfBirth"];
if (pDict.ContainsKey("CrewMemberDateOfBirth")) crew.CrewMemberDateOfBirth = DateTime.Parse(pDict["CrewMemberDateOfBirth"]);
if (pDict.ContainsKey("CrewMemberDateOfBirth")) crew.CrewMemberDateOfBirth = Extensions.TryParse(pDict["CrewMemberDateOfBirth"]);
if (pDict.ContainsKey("CrewMemberGender")) crew.CrewMemberGender = (byte)Enum.Parse(typeof(Enums.PassengerGender), pDict["CrewMemberGender"], true);
if (pDict.ContainsKey("CrewMemberNationalityCode")) crew.CrewMemberNationality = pDict["CrewMemberNationalityCode"];
if (pDict.ContainsKey("CrewMemberIdentityDocumentType")) crew.CrewMemberIdentityDocumentType = (byte)Enum.Parse(typeof(Enums.PassengerIdentityDocumentType), pDict["CrewMemberIdentityDocumentType"], true);
@ -738,7 +742,7 @@ namespace bsmd.herberg.FormService
if (vDict.ContainsKey("VolumeOfCargo_TNE")) pre72h.VolumeOfCargo = Double.Parse(vDict["VolumeOfCargo_TNE"], NumberFormatInfo.InvariantInfo);
if (vDict.ContainsKey("PlannedOperations")) pre72h.PlannedOperations = vDict["PlannedOperations"];
if (vDict.ContainsKey("PlannedWorks")) pre72h.PlannedWorks = vDict["PlannedWorks"];
if (vDict.ContainsKey("DateOfLastExpandedInspection")) pre72h.DateOfLastExpandedInspection = DateTime.Parse(vDict["DateOfLastExpandedInspection"], DateTimeFormatInfo.InvariantInfo);
if (vDict.ContainsKey("DateOfLastExpandedInspection")) pre72h.DateOfLastExpandedInspection = Extensions.TryParse(vDict["DateOfLastExpandedInspection"]);
if (vDict.ContainsKey("PlannedPeriodOfStay_HUR")) pre72h.PlannedPeriodOfStay_HUR = Double.Parse(vDict["PlannedPeriodOfStay_HUR"], NumberFormatInfo.InvariantInfo);
}
catch (Exception ex)
@ -796,10 +800,10 @@ namespace bsmd.herberg.FormService
if (pDict.ContainsKey("PassengerLastName")) pas.PassengerLastName = pDict["PassengerLastName"];
if (pDict.ContainsKey("PassengerFirstName")) pas.PassengerFirstName = pDict["PassengerFirstName"];
if (pDict.ContainsKey("PassengerPlaceOfBirth")) pas.PassengerPlaceOfBirth = pDict["PassengerPlaceOfBirth"];
if (pDict.ContainsKey("PassengerDateOfBirth")) pas.PassengerDateOfBirth = DateTime.Parse(pDict["PassengerDateOfBirth"]);
if (pDict.ContainsKey("PassengerDateOfBirth")) pas.PassengerDateOfBirth = Extensions.TryParse(pDict["PassengerDateOfBirth"]);
if (pDict.ContainsKey("PassengerGender")) pas.PassengerGender = (byte)Enum.Parse(typeof(Enums.PassengerGender), pDict["PassengerGender"], true);
if (pDict.ContainsKey("PassengerNationalityCode")) pas.PassengerNationality = pDict["PassengerNationalityCode"];
if (pDict.ContainsKey("PassengerIdentityDocumentType")) pas.PassengerIdentityDocumentType = (byte)Enum.Parse(typeof(Enums.PassengerIdentityDocumentType), pDict["PassengerIdentityDocumentType"]);
if (pDict.ContainsKey("PassengerIdentityDocumentType")) pas.PassengerIdentityDocumentType = (byte)Enum.Parse(typeof(Enums.PassengerIdentityDocumentType), pDict["PassengerIdentityDocumentType"], true);
if (pDict.ContainsKey("PassengerIdentityDocumentId")) pas.PassengerIdentityDocumentId = pDict["PassengerIdentityDocumentId"];
if (pDict.ContainsKey("PassengerVisaNumber")) pas.PassengerVisaNumber = pDict["PassengerVisaNumber"];
if (pDict.ContainsKey("PassengerPortCodeOfEmbarkation") && pDict.ContainsKey("PassengerCountryCodeOfEmbarkation"))
@ -836,7 +840,7 @@ namespace bsmd.herberg.FormService
try
{
if (vDict.ContainsKey("WasteDisposalValidExemption")) was.WasteDisposalValidExemption = vDict["WasteDisposalValidExemption"].Equals("Y");
if (vDict.ContainsKey("LastWasteDisposalDate")) was.LastWasteDisposalDate = DateTime.Parse(vDict["LastWasteDisposalDate"]);
if (vDict.ContainsKey("LastWasteDisposalDate")) was.LastWasteDisposalDate = Extensions.TryParse(vDict["LastWasteDisposalDate"]);
if (vDict.ContainsKey("LastWasteDisposalPortCode") && vDict.ContainsKey("LastWasteDisposalCountryCode"))
was.LastWasteDisposalPort = vDict["LastWasteDisposalCountryCode"] + vDict["LastWasteDisposalPortCode"];
@ -918,15 +922,15 @@ namespace bsmd.herberg.FormService
if (vDict.ContainsKey("CSOEMail")) sec.CSOEMail = vDict["CSOEMail"];
if (vDict.ContainsKey("ValidISSCOnBoard")) sec.ValidISSCOnBoard = vDict["ValidISSCOnBoard"].Equals("Y");
if (vDict.ContainsKey("ReasonsForNoValidISSC")) sec.ReasonsForNoValidISSC = vDict["ReasonsForNoValidISSC"];
if (vDict.ContainsKey("ISSCType")) sec.ISSCType = (byte)Enum.Parse(typeof(Enums.ISSCType), vDict["ISSCType"]);
if (vDict.ContainsKey("ISSCIssuerType")) sec.ISSCIssuerType = (byte)Enum.Parse(typeof(Enums.ISSCIssuerType), vDict["ISSCIssuerType"]);
if (vDict.ContainsKey("ISSCType")) sec.ISSCType = (byte)Enum.Parse(typeof(Enums.ISSCType), vDict["ISSCType"], true);
if (vDict.ContainsKey("ISSCIssuerType")) sec.ISSCIssuerType = (byte)Enum.Parse(typeof(Enums.ISSCIssuerType), vDict["ISSCIssuerType"], true);
if (vDict.ContainsKey("ISSCIssuerName")) sec.ISSCIssuerName = vDict["ISSCIssuerName"];
if (vDict.ContainsKey("ISSCDateOfExpiration")) sec.ISSCDateOfExpiration = DateTime.Parse(vDict["ISSCDateOfExpiration"]);
if (vDict.ContainsKey("ISSCDateOfExpiration")) sec.ISSCDateOfExpiration = Extensions.TryParse(vDict["ISSCDateOfExpiration"]);
if (vDict.ContainsKey("ApprovedSecurityPlanOnBoard")) sec.ApprovedSecurityPlanOnBoard = vDict["ApprovedSecurityPlanOnBoard"].Equals("Y");
if (vDict.ContainsKey("CurrentShipSecurityLevel")) sec.CurrentShipSecurityLevel = Byte.Parse(vDict["CurrentShipSecurityLevel"]);
if (vDict.ContainsKey("CurrentShipSecurityLevel ")) sec.CurrentShipSecurityLevel = Byte.Parse(vDict["CurrentShipSecurityLevel "]);
if (vDict.ContainsKey("PortFacilityOfArrival")) sec.PortFacilityOfArrival = vDict["PortFacilityOfArrival"];
if (vDict.ContainsKey("GeneralDescriptionOfCargo")) sec.GeneralDescriptionOfCargo = (byte)Enum.Parse(typeof(Enums.GeneralDescriptionOfCargo), vDict["GeneralDescriptionOfCargo"]);
if (vDict.ContainsKey("GeneralDescriptionOfCargo")) sec.GeneralDescriptionOfCargo = (byte)Enum.Parse(typeof(Enums.GeneralDescriptionOfCargo), vDict["GeneralDescriptionOfCargo"], true);
// process sublists
@ -961,11 +965,16 @@ namespace bsmd.herberg.FormService
poc.PortFacilityPortLoCode = sDict["PortFacilityPortCountryCode"] + sDict["PortFacilityPortLoCode"];
changedPfC = true;
}
if (sDict.ContainsKey("PortFacilityDateOfArrival")) { poc.PortFacilityDateOfArrival = DateTime.Parse(sDict["PortFacilityDateOfArrival"]); changedPfC = true; }
if (sDict.ContainsKey("PortFacilityDateOfDeparture")) { poc.PortFacilityDateOfDeparture = DateTime.Parse(sDict["PortFacilityDateOfDeparture"]); changedPfC = true; }
if (sDict.ContainsKey("PortFacilityDateOfArrival")) { poc.PortFacilityDateOfArrival = Extensions.TryParse(sDict["PortFacilityDateOfArrival"]); changedPfC = true; }
if (sDict.ContainsKey("PortFacilityDateOfDeparture")) { poc.PortFacilityDateOfDeparture = Extensions.TryParse(sDict["PortFacilityDateOfDeparture"]); changedPfC = true; }
if (sDict.ContainsKey("PortFacilityShipSecurityLevel")) { poc.PortFacilityShipSecurityLevel = Byte.Parse(sDict["PortFacilityShipSecurityLevel"]); changedPfC = true; }
if (sDict.ContainsKey("PortFacilitySecurityMattersToReport")) { poc.PortFacilitySecurityMattersToReport = sDict["PortFacilitySecurityMattersToReport"]; changedPfC = true; }
if (sDict.ContainsKey("PortFacilityGISISCode")) { poc.PortFacilityGISISCode = sDict["PortFacilityGISISCode"]; changedPfC = true; }
if (sDict.ContainsKey("PortFacilityGISISCode"))
{
poc.PortFacilityGISISCode = sDict["PortFacilityGISISCode"]; changedPfC = true;
if (poc.PortFacilityGISISCode.Length > 4)
poc.PortFacilityGISISCode = poc.PortFacilityGISISCode.Substring(0, 4);
}
if (sDict.ContainsKey("ShipToShipActivityLocationName")) { sts.ShipToShipActivityLocationName = sDict["ShipToShipActivityLocationName"]; changedStS = true; }
if (sDict.ContainsKey("ShipToShipActivityLocationLoCode") && sDict.ContainsKey("ShipToShipActivityCountryCode"))
@ -975,8 +984,8 @@ namespace bsmd.herberg.FormService
}
if (sDict.ContainsKey("ShipToShipActivityLocationCoordinatesLatitude")) { sts.ShipToShipActivityLocationCoordinatesLatitude = Int32.Parse(sDict["ShipToShipActivityLocationCoordinatesLatitude"]); changedStS = true; }
if (sDict.ContainsKey("ShipToShipActivityLocationCoordinatesLongitude")) { sts.ShipToShipActivityLocationCoordinatesLongitude = Int32.Parse(sDict["ShipToShipActivityLocationCoordinatesLongitude"]); changedStS = true; }
if (sDict.ContainsKey("ShipToShipActivityDateFrom")) { sts.ShipToShipActivityDateFrom = DateTime.Parse(sDict["ShipToShipActivityDateFrom"]); changedStS = true; }
if (sDict.ContainsKey("ShipToShipActivityDateTo")) { sts.ShipToShipActivityDateTo = DateTime.Parse(sDict["ShipToShipActivityDateTo"]); changedStS = true; }
if (sDict.ContainsKey("ShipToShipActivityDateFrom")) { sts.ShipToShipActivityDateFrom = Extensions.TryParse(sDict["ShipToShipActivityDateFrom"]); changedStS = true; }
if (sDict.ContainsKey("ShipToShipActivityDateTo")) { sts.ShipToShipActivityDateTo = Extensions.TryParse(sDict["ShipToShipActivityDateTo"]); changedStS = true; }
if (sDict.ContainsKey("ShipToShipActivityType")) { sts.ShipToShipActivityType = sDict["ShipToShipActivityType"]; changedStS = true; }
if (sDict.ContainsKey("ShipToShipActivitySecurityMattersToReport")) { sts.ShipToShipActivitySecurityMattersToReport = sDict["ShipToShipActivitySecurityMattersToReport"]; changedStS = true; }
@ -1000,8 +1009,8 @@ namespace bsmd.herberg.FormService
if (vDict.ContainsKey("PortNameOfCall")) aMessageCore.Portname = vDict["PortNameOfCall"];
if (vDict.ContainsKey("PortOfCall")) aMessageCore.PoC = "DE" + vDict["PortOfCall"];
if (vDict.ContainsKey("TransitKielCanal")) aMessageCore.IsTransit = vDict["TransitKielCanal"].Equals("Y");
if (vDict.ContainsKey("ETAPortOfCall")) aMessageCore.ETA = DateTime.Parse(vDict["ETAPortOfCall"]);
if (vDict.ContainsKey("ETAKielCanal")) aMessageCore.ETAKielCanal = DateTime.Parse(vDict["ETAKielCanal"]);
if (vDict.ContainsKey("ETAPortOfCall")) aMessageCore.ETA = Extensions.TryParse(vDict["ETAPortOfCall"]);
if (vDict.ContainsKey("ETAKielCanal")) aMessageCore.ETAKielCanal = Extensions.TryParse(vDict["ETAKielCanal"]);
}
break;
#endregion
@ -1010,7 +1019,7 @@ namespace bsmd.herberg.FormService
case "Transit":
{
theMessage.MessageNotificationClass = Message.NotificationClass.TRANSIT;
if (vDict.ContainsKey("ETAKielCanal")) aMessageCore.ETAKielCanal = DateTime.Parse(vDict["ETAKielCanal"]);
if (vDict.ContainsKey("ETAKielCanal")) aMessageCore.ETAKielCanal = Extensions.TryParse(vDict["ETAKielCanal"]);
}
break;
#endregion
@ -1158,7 +1167,7 @@ namespace bsmd.herberg.FormService
{
HAZ newHaz = new HAZ();
newHaz.MessageHeader = theMessage;
theMessage.MessageNotificationClass = Message.NotificationClass.HAZA;
theMessage.MessageNotificationClass = isDeparture ? Message.NotificationClass.HAZD : Message.NotificationClass.HAZA;
theMessage.Elements.Add(newHaz);
}
HAZ haz = theMessage.Elements[0] as HAZ;
@ -1169,7 +1178,7 @@ namespace bsmd.herberg.FormService
{
if (vDict.ContainsKey("NoDPGOnBoard")) haz.NoDPGOnBoardOnArrival = vDict["NoDPGOnBoard"].Equals("Y");
if (vDict.ContainsKey("DPGManifestOnBoard")) haz.DPGManifestOnBoardOnArrival = vDict["DPGManifestOnBoard"].Equals("Y");
if (vDict.ContainsKey("INFShipClass")) haz.INFShipClass = (byte)Enum.Parse(typeof(Enums.INFShipClass), vDict["INFShipClass"]);
if (vDict.ContainsKey("INFShipClass")) haz.INFShipClass = (byte)Enum.Parse(typeof(Enums.INFShipClass), vDict["INFShipClass"], true);
if (vDict.ContainsKey("DPGClassificationIMDG")) haz.DPGClassificationIMDG = vDict["DPGClassificationIMDG"].Equals("1");
if (vDict.ContainsKey("DPGClassificationIGC")) haz.DPGClassificationIMDG = vDict["DPGClassificationIGC"].Equals("1");
if (vDict.ContainsKey("DPGClassificationIBC")) haz.DPGClassificationIMDG = vDict["DPGClassificationIBC"].Equals("1");
@ -1192,8 +1201,10 @@ namespace bsmd.herberg.FormService
imdgPosition.HAZ = haz;
}
saveMessages.Add(imdgPosition);
if (aDict.ContainsKey("UNNumber")) imdgPosition.UNNumber = aDict["UNNumber"];
if (aDict.ContainsKey("PackingGroup")) imdgPosition.PackingGroup = (byte)Enum.Parse(typeof(Enums.PackingGroup), aDict["PackingGroup"]);
if (aDict.ContainsKey("PackingGroup")) imdgPosition.PackingGroup = (byte)Enum.Parse(typeof(Enums.PackingGroup), aDict["PackingGroup"], true);
if (aDict.ContainsKey("ProperShippingName")) imdgPosition.ProperShippingName = aDict["ProperShippingName"];
if (aDict.ContainsKey("IMOClass")) imdgPosition.IMOClass = aDict["IMOClass"];
if (aDict.ContainsKey("CompatibilityGroup")) imdgPosition.CompatibilityGroup = aDict["CompatibilityGroup"];
@ -1207,7 +1218,18 @@ namespace bsmd.herberg.FormService
if (aDict.ContainsKey("Class7CSI")) imdgPosition.Class7CSI = Int32.Parse(aDict["Class7CSI"]);
if (aDict.ContainsKey("ControlTemperature_CEL")) imdgPosition.ControlTemperature_CEL = Double.Parse(aDict["ControlTemperature_CEL"], NumberFormatInfo.InvariantInfo);
if (aDict.ContainsKey("EmergencyTemperature_CEL")) imdgPosition.EmergencyTemperature_CEL = Double.Parse(aDict["EmergencyTemperature_CEL"], NumberFormatInfo.InvariantInfo);
// TODO if (aDict.ContainsKey("SubsidiaryRisk")) imdgPosition.su
if (aDict.ContainsKey("SubsidiaryRisk"))
{
if (imdgPosition.SubsidiaryRiskList.Count == 0)
{
SubsidiaryRisks newSRisk = new SubsidiaryRisks();
newSRisk.IMDGPosition = imdgPosition;
imdgPosition.SubsidiaryRiskList.Add(newSRisk);
}
SubsidiaryRisks sRisks = imdgPosition.SubsidiaryRiskList[0];
sRisks.SubsidiaryRisk = aDict["SubsidiaryRisk"];
saveMessages.Add(sRisks);
}
if (aDict.ContainsKey("MarinePollutant")) imdgPosition.MarinePollutant = aDict["MarinePollutant"].Equals("Y");
if (aDict.ContainsKey("NumberOfPackages")) imdgPosition.NumberOfPackages = Int32.Parse(aDict["NumberOfPackages"]);
if (aDict.ContainsKey("PackageType")) imdgPosition.PackageType = aDict["PackageType"];
@ -1231,7 +1253,6 @@ namespace bsmd.herberg.FormService
aDict["Identifier"], key);
}
saveMessages.Add(imdgPosition);
}
}
@ -1251,7 +1272,7 @@ namespace bsmd.herberg.FormService
}
if (aDict.ContainsKey("ProductName")) ibcPosition.ProductName = aDict["ProductName"];
if (aDict.ContainsKey("PollutionCategory")) ibcPosition.PollutionCategory = (byte)Enum.Parse(typeof(Enums.PollutionCategory), aDict["PollutionCategory"]);
if (aDict.ContainsKey("PollutionCategory")) ibcPosition.PollutionCategory = (byte)Enum.Parse(typeof(Enums.PollutionCategory), aDict["PollutionCategory"], true);
if (aDict.ContainsKey("Hazards")) ibcPosition.Hazards = Enums.ParseHazardType(aDict["Hazards"]);
if (aDict.ContainsKey("FlashpointInformation")) ibcPosition.FlashpointInformation = Enums.ParseFlashpointInformation(aDict["FlashpointInformation"]);
if (aDict.ContainsKey("Quantity_KGM")) ibcPosition.Quantity_KGM = Double.Parse(aDict["Quantity_KGM"], NumberFormatInfo.InvariantInfo);
@ -1406,8 +1427,8 @@ namespace bsmd.herberg.FormService
}
}
if (aMessageCore.BSMDStatus == Message.BSMDStatus.UNDEFINED)
aMessageCore.BSMDStatus = Message.BSMDStatus.CREATE_RECEIVE_RECEIPT;
if (aMessageCore.BSMDStatusInternal == MessageCore.BSMDStatus.UNDEFINED)
aMessageCore.BSMDStatusInternal = MessageCore.BSMDStatus.CREATE_RECEIVE_RECEIPT;
DBManager.Instance.Save(aMessageCore); // warum?
}
@ -1420,7 +1441,7 @@ namespace bsmd.herberg.FormService
{
List<Message> messages = DBManager.Instance.GetMessagesForCore(aMessageCore);
Dictionary<string, Message> result = new Dictionary<string, Message>();
_log.InfoFormat("Core has {0} messages", messages.Count);
_log.DebugFormat("Core has {0} messages", messages.Count);
foreach (Message message in messages)
{
if (!result.ContainsKey(message.MessageNotificationClass.ToString()))

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -193,140 +193,10 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ReportingParty">
<xs:element name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="RPType">
<xs:annotation>
<xs:documentation>Type of reporter</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="MASTER" />
<xs:enumeration value="SHIPOWNER" />
<xs:enumeration value="CHARTERER" />
<xs:enumeration value="AGENT" />
<xs:enumeration value="PORT_AUTHORITY" />
<xs:enumeration value="CARRIER" />
<xs:enumeration value="OTHERS" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RPName">
<xs:annotation>
<xs:documentation>Company name</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPStreetAndNumber">
<xs:annotation>
<xs:documentation>Street/street number</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPPostalCode">
<xs:annotation>
<xs:documentation>ZIP/Postal code</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="24" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPCity">
<xs:annotation>
<xs:documentation>City</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPCountry">
<xs:annotation>
<xs:documentation>Country</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RPLastName">
<xs:annotation>
<xs:documentation>Last name of contact</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPFirstName">
<xs:annotation>
<xs:documentation>First name of contact</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RPPhone">
<xs:annotation>
<xs:documentation>Phone number</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPFax">
<xs:annotation>
<xs:documentation>Fax number</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RPEMail">
<xs:annotation>
<xs:documentation>E-Mail adress</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:choice>
<xs:element name="ReportingClassesToReset">
@ -350,6 +220,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:choice>
<xs:annotation>
<xs:documentation>Part needed for a Visit</xs:documentation>
@ -451,6 +326,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ATAPortOfCall" type="xs:dateTime">
<xs:annotation>
<xs:documentation>Actual Time of Arrival (ATA) at first port facility in port of call (YYYY-MM-DDThh:mm:ssTZD)</xs:documentation>
@ -465,6 +345,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ATDPortOfCall" type="xs:dateTime">
<xs:annotation>
<xs:documentation>Actual Time of Departure (ATD) from last port facility in port of call (YYYY-MM-DDThh:mm:ssTZD)(</xs:documentation>
@ -478,6 +363,12 @@
<xs:documentation>Sea security (reporting class)</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:choice>
<xs:sequence>
<xs:annotation>
@ -840,6 +731,7 @@
</xs:element>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="POBA">
@ -848,6 +740,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="TotalPersonsOnBoardUponArrival">
<xs:annotation>
<xs:documentation>Number of persons on board upon arrival</xs:documentation>
@ -898,6 +795,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="TotalPersonsOnBoardUponDeparture">
<xs:annotation>
<xs:documentation>Number of persons on board upon departure</xs:documentation>
@ -948,6 +850,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="NameOfMaster">
<xs:annotation>
<xs:documentation>Name of master</xs:documentation>
@ -968,6 +875,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DraughtUponArrival_DMT">
<xs:annotation>
<xs:documentation>Draught on arrival in decimetre (DMT)</xs:documentation>
@ -987,6 +899,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="DraughtUponDeparture_DMT">
<xs:annotation>
<xs:documentation>Draught on departure in decimetre (DMT)</xs:documentation>
@ -1006,6 +923,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element maxOccurs="unbounded" name="BunkerFuelArrival">
<xs:annotation>
<xs:documentation>Bunker fuel on arrival</xs:documentation>
@ -1045,6 +967,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element maxOccurs="unbounded" name="BunkerFuelDeparture">
<xs:annotation>
<xs:documentation>Bunker fuel on departure</xs:documentation>
@ -1084,6 +1011,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ShipName">
<xs:annotation>
<xs:documentation>Ship name</xs:documentation>
@ -1277,6 +1209,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element maxOccurs="unbounded" name="Cargo">
<xs:annotation>
<xs:documentation>Per type of cargo that is moved in Port of call.</xs:documentation>
@ -1336,6 +1273,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ShippingArea">
<xs:annotation>
<xs:documentation>Shipping area (North sea/baltic sea, europe, overseas)</xs:documentation>
@ -1406,6 +1348,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element maxOccurs="unbounded" name="Service">
<xs:annotation>
<xs:documentation>Service type</xs:documentation>
@ -1457,6 +1404,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Tanker">
<xs:annotation>
<xs:documentation>Is it a tanker (y/n)</xs:documentation>
@ -1567,6 +1519,12 @@
<xs:documentation>Declaration of health (reporting class)</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:choice>
<xs:sequence>
<xs:annotation>
@ -1911,6 +1869,7 @@
</xs:element>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="WAS">
@ -1918,6 +1877,12 @@
<xs:documentation>Waste (reporting class)</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:choice>
<xs:element name="WasteDisposalValidExemption">
<xs:annotation>
@ -2080,6 +2045,7 @@
</xs:element>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="CREW">
@ -2088,6 +2054,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element maxOccurs="unbounded" name="CrewMember">
<xs:annotation>
<xs:documentation>Crew member</xs:documentation>
@ -2215,6 +2186,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element maxOccurs="unbounded" name="Passenger">
<xs:annotation>
<xs:documentation>Information to each person</xs:documentation>
@ -2364,6 +2340,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="StowawayOnBoard">
<xs:annotation>
<xs:documentation>Stowaways on board (y/n)</xs:documentation>
@ -2409,6 +2390,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element maxOccurs="unbounded" name="TowageOnArrival">
<xs:annotation>
<xs:documentation>Towage on arrival</xs:documentation>
@ -2608,6 +2594,11 @@
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element maxOccurs="unbounded" name="TowageOnDeparture">
<xs:complexType>
<xs:sequence>
@ -2783,6 +2774,12 @@
<xs:documentation>Dangerous goods on arrival (reporting class)</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:choice>
<xs:element name="NoDPGOnBoardOnArrival">
<xs:annotation>
@ -3166,7 +3163,7 @@
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -3312,7 +3309,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -3420,7 +3417,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -3539,7 +3536,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -3648,7 +3645,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -3667,6 +3664,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:element>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="0" name="HAZD">
@ -3674,6 +3672,12 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
<xs:documentation>Dangerous goods on departure (reporting class)</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="ReportingParty" type="ReportingParty">
<xs:annotation>
<xs:documentation>Reporter data</xs:documentation>
</xs:annotation>
</xs:element>
<xs:choice>
<xs:element name="NoDPGOnBoardOnDeparture">
<xs:annotation>
@ -4057,7 +4061,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -4203,7 +4207,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -4311,7 +4315,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -4430,7 +4434,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -4539,7 +4543,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Identifier">
<xs:element minOccurs="0" name="Identifier">
<xs:annotation>
<xs:documentation>Unique identifier. Will be addressed in possible Violations in this dg item.</xs:documentation>
</xs:annotation>
@ -4558,6 +4562,7 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:element>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
@ -4605,4 +4610,134 @@ IMO RESOLUTION MEPC.119(52)</xs:documentation>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ReportingParty">
<xs:sequence>
<xs:element minOccurs="0" name="RPType">
<xs:annotation>
<xs:documentation>Type of reporter</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="MASTER" />
<xs:enumeration value="SHIPOWNER" />
<xs:enumeration value="CHARTERER" />
<xs:enumeration value="AGENT" />
<xs:enumeration value="PORT_AUTHORITY" />
<xs:enumeration value="CARRIER" />
<xs:enumeration value="OTHERS" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RPName">
<xs:annotation>
<xs:documentation>Company name</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPStreetAndNumber">
<xs:annotation>
<xs:documentation>Street/street number</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPPostalCode">
<xs:annotation>
<xs:documentation>ZIP/Postal code</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="24" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPCity">
<xs:annotation>
<xs:documentation>City</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPCountry">
<xs:annotation>
<xs:documentation>Country</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RPLastName">
<xs:annotation>
<xs:documentation>Last name of contact</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPFirstName">
<xs:annotation>
<xs:documentation>First name of contact</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RPPhone">
<xs:annotation>
<xs:documentation>Phone number</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element minOccurs="0" name="RPFax">
<xs:annotation>
<xs:documentation>Fax number</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="RPEMail">
<xs:annotation>
<xs:documentation>E-Mail adress</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="99" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>

View File

@ -0,0 +1,10 @@
--
-- NSWRequest
--
2015-06-01
HAZA/HAZD - all <Identifier> become optional (minOccurs?0)
2015-05-27
- Blanks removed from element name HAZA.DPGOnArrival.DPGItemIMSBC.BulkCargoShippingName
and HAZD.DPGOnDeparture.DPGItemIMSBC.BulkCargoShippingName