Compare commits
11 Commits
731a7eff9c
...
1eaf176664
| Author | SHA1 | Date | |
|---|---|---|---|
| 1eaf176664 | |||
| beb1a63d2f | |||
| b51fdfd72a | |||
| ac0d6eea9d | |||
| 504748ad36 | |||
| 0274d59260 | |||
| d68c72a966 | |||
| 995b19041f | |||
| 95e97f04fe | |||
| f1d7543240 | |||
| 5bd3199d1a |
@ -56,7 +56,7 @@
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Validation Error Template for a DataGrid Row -->
|
||||
@ -80,7 +80,7 @@
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
|
||||
|
||||
|
||||
<Style TargetType="{x:Type ToolTip}" >
|
||||
|
||||
113
ENI2/Controls/EasyPeasyControl.xaml
Normal file
113
ENI2/Controls/EasyPeasyControl.xaml
Normal file
@ -0,0 +1,113 @@
|
||||
<UserControl x:Class="ENI2.Controls.EasyPeasyControl"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:ENI2.Controls"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="650" d:DesignWidth="1024" Loaded="UserControl_Loaded" Unloaded="UserControl_Unloaded">
|
||||
|
||||
|
||||
<DockPanel>
|
||||
<!-- Header with logo -->
|
||||
<Border DockPanel.Dock="Top" Padding="10" Background="#FFFDF6">
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" >
|
||||
<!-- Embed SVG via Image (optional): place your SVG as a DrawingImage in resources, or replace with PNG -->
|
||||
<TextBlock Text="🍋 easy-peasy" FontSize="20" FontWeight="Bold" Margin="0,0,16,0"/>
|
||||
<TextBlock Text="Edit • Paste • Export XML" VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||
<StackPanel Margin="12" Orientation="Vertical" >
|
||||
<!-- Top-level fields -->
|
||||
<UniformGrid Columns="4" Rows="3" Margin="0,0,0,12" Height="84">
|
||||
<TextBlock Text="Art der Identification (Vertreter)" Margin="0,0,4,0" VerticalAlignment="Center" TextAlignment="Right"/>
|
||||
<TextBox Text="{Binding DelegateIdentificationType, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
<TextBlock Text="Art der Identifikation (Kunde)" VerticalAlignment="Center" Margin="0,0,4,0" TextAlignment="Right" />
|
||||
<TextBox Text="{Binding TraderIdentificationType, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
|
||||
<TextBlock Text="LRN" TextAlignment="Right" Margin="0,0,4,0" VerticalAlignment="Center"/>
|
||||
<TextBox Text="{Binding LRN, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
<TextBlock Text="Identifikationsnummer (Kunde)" Margin="0,0,4,0" VerticalAlignment="Center" TextAlignment="Right" />
|
||||
<TextBox Text="{Binding TraderIdentificationNumber, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
|
||||
<TextBlock Text="Land" TextAlignment="Right" Margin="0,0,4,0" VerticalAlignment="Center"/>
|
||||
<TextBox Text="{Binding Country, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
<TextBlock Text="Identifikationsnummer (Vertreter)" Margin="0,0,4,0" VerticalAlignment="Center" TextAlignment="Right"/>
|
||||
<TextBox Text="{Binding DelegateIdentificationNumber, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
</UniformGrid>
|
||||
|
||||
<!-- ProofInformation -->
|
||||
<GroupBox Header="Kennung des Antrags auf Nachweis TZ2L(F)">
|
||||
<StackPanel Margin="8">
|
||||
<UniformGrid Columns="4" Rows="4" Margin="0,0,0,12" >
|
||||
<TextBlock Text="Zuständige Zollstelle" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.CompetentCustomsOffice, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
<TextBlock Text="Art der Anmeldung" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.DeclarationType, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
|
||||
<TextBlock TextWrapping="Wrap" Text="Datum Anmeldung
|
||||
(yyyy-MM-ddTHH:mm:ss)" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.DeclarationDate, StringFormat={}{0:yyyy-MM-ddTHH:mm:ss}, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center" />
|
||||
<TextBlock Text="Gesamtrohmasse (kg)" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.TotalGrossMassKg, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
|
||||
<TextBlock TextWrapping="Wrap" Text="Antrag auf Gültigkeitsdauer des Nachweises (in Tagen)" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.RequestedValidityOfTheProof.NumberOfDays, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
<TextBlock Text="Art des Antrags" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.RequestType, UpdateSourceTrigger=PropertyChanged}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
</UniformGrid>
|
||||
|
||||
<GroupBox Header="Warenort">
|
||||
<UniformGrid Columns="6" Margin="8" Height="28">
|
||||
<TextBlock Text="Art des Ortes" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.LocationOfGoods.TypeOfLocation}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
<TextBlock Text="Art der Ortsbestimmung" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.LocationOfGoods.QualifierOfIdentification}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
<TextBlock Text="UNLocode" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,4,0"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.LocationOfGoods.UNLocode}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
|
||||
<CheckBox Content="In Containern beförderte Waren" Margin="8"
|
||||
IsChecked="{Binding ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.ContainerIndication}"/>
|
||||
|
||||
<!-- Goods Items grid (paste target) -->
|
||||
<TextBlock Text="Warenpositionen (Paste tab/CSV with columns: HS, Item#, Description, Gross, Net, Pkgs, Type, Marks)" Margin="4,12,0,4"/>
|
||||
<DataGrid ItemsSource="{Binding ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.GoodsItemsForT2LT2LF}"
|
||||
AutoGenerateColumns="False" CanUserAddRows="True"
|
||||
PreviewKeyDown="DataGrid_PreviewKeyDown" >
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="HS Code" Binding="{Binding Commodity.HarmonizedSystemSubHeadingCode}"/>
|
||||
<DataGridTextColumn Header="Item #" Binding="{Binding GoodsItemNumber}"/>
|
||||
<DataGridTextColumn Header="Description" Binding="{Binding DescriptionOfGoods}" Width="2*"/>
|
||||
<DataGridTextColumn Header="Gross" Binding="{Binding GoodsMeasure.GrossMass}"/>
|
||||
<DataGridTextColumn Header="Net" Binding="{Binding GoodsMeasure.NetMass}"/>
|
||||
<DataGridTextColumn Header="Pkgs" Binding="{Binding Packaging.NumberOfPackages}"/>
|
||||
<DataGridTextColumn Header="Type" Binding="{Binding Packaging.TypeOfPackages}"/>
|
||||
<DataGridTextColumn Header="Marks" Binding="{Binding Packaging.ShippingMarks}" Width="*"/>
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
|
||||
<GroupBox Header="Dokumente" Margin="0,12,0,0">
|
||||
<UniformGrid Columns="4" Margin="8" Height="28">
|
||||
<TextBlock Text="Art des Dokuments" Margin="0,0,4,0" VerticalAlignment="Center" TextAlignment="Right"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.TransportDocuments.Type}" Margin="2" VerticalContentAlignment="Center"/>
|
||||
<TextBlock Text="Referenznummer" Margin="0,0,4,0" VerticalAlignment="Center" TextAlignment="Right"/>
|
||||
<TextBox Text="{Binding ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.TransportDocuments.ReferenceNumber}" Margin="2" VerticalContentAlignment="Center" />
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
|
||||
<!-- Actions -->
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,16,0,0">
|
||||
<Button x:Name="buttonImport" Content="Import" Width="100" Margin="0,0,8,0" Click="buttonImport_Click" />
|
||||
<Button x:Name="buttonClear" Content="Clear" Width="100" Margin="0,0,8,0" Click="buttonClear_Click"/>
|
||||
<Button x:Name="buttonExport" Content="Export" Width="120" Click="buttonExport_Click"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</DockPanel>
|
||||
</UserControl>
|
||||
336
ENI2/Controls/EasyPeasyControl.xaml.cs
Normal file
336
ENI2/Controls/EasyPeasyControl.xaml.cs
Normal file
@ -0,0 +1,336 @@
|
||||
// Copyright (c) 2017- schick Informatik
|
||||
// Description: Display dialog for customs XML data upload app
|
||||
//
|
||||
|
||||
using bsmd.database.EasyPeasy;
|
||||
using ENI2.Util;
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace ENI2.Controls
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for EasyPeasyControl.xaml
|
||||
/// </summary>
|
||||
public partial class EasyPeasyControl : UserControl
|
||||
{
|
||||
|
||||
private ProofRequest _vm;
|
||||
|
||||
public EasyPeasyControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void SaveState()
|
||||
{
|
||||
try
|
||||
{
|
||||
EasyPeasyState.Save(_vm);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
#region button event handler
|
||||
|
||||
private void buttonClear_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
this._vm = EasyPeasyState.CreateDefault();
|
||||
if (_vm.ProofInformationT2LT2LF?.GoodsShipmentForT2LT2LF?.GoodsItemsForT2LT2LF == null)
|
||||
_vm.ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.GoodsItemsForT2LT2LF = new ObservableCollection<GoodsItemForT2LT2LF>();
|
||||
|
||||
this.DataContext = this._vm;
|
||||
}
|
||||
|
||||
private void buttonExport_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var dlg = new SaveFileDialog
|
||||
{
|
||||
FileName = "proofRequest.xml",
|
||||
Filter = "XML file|*.xml",
|
||||
OverwritePrompt = true
|
||||
};
|
||||
if (dlg.ShowDialog() == true)
|
||||
{
|
||||
try
|
||||
{
|
||||
var ser = new XmlSerializer(typeof(ProofRequest));
|
||||
|
||||
// Namespaces (if needed)
|
||||
// var ns = new XmlSerializerNamespaces();
|
||||
// ns.Add("xsd", "http://www.w3.org/2001/XMLSchema");
|
||||
// ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
|
||||
|
||||
var settings = new XmlWriterSettings
|
||||
{
|
||||
Indent = true,
|
||||
OmitXmlDeclaration = true
|
||||
};
|
||||
|
||||
using (var fs = File.Create(dlg.FileName))
|
||||
using (var xw = XmlWriter.Create(fs, settings))
|
||||
{
|
||||
ser.Serialize(xw, _vm); //, ns);
|
||||
}
|
||||
|
||||
MessageBox.Show("Exported successfully.", "easy-peasy", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show("Export failed:\n" + ex.Message, "easy-peasy", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void buttonImport_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
OpenFileDialog ofd = new OpenFileDialog();
|
||||
ofd.Filter = "XML file|*.xml";
|
||||
ofd.RestoreDirectory = true;
|
||||
ofd.Multiselect = false;
|
||||
|
||||
if (ofd.ShowDialog() == true)
|
||||
{
|
||||
using (var fs = File.OpenRead(ofd.FileName))
|
||||
{
|
||||
var ser = new XmlSerializer(typeof(ProofRequest));
|
||||
_vm = (ProofRequest)ser.Deserialize(fs);
|
||||
// after loading/creating _vm
|
||||
if (_vm.ProofInformationT2LT2LF?.GoodsShipmentForT2LT2LF?.GoodsItemsForT2LT2LF == null)
|
||||
_vm.ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.GoodsItemsForT2LT2LF = new ObservableCollection<GoodsItemForT2LT2LF>();
|
||||
|
||||
|
||||
this.DataContext = _vm;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region loaded/unloaded event handler
|
||||
|
||||
private void UserControl_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
_vm = EasyPeasyState.LoadOrCreate();
|
||||
if (_vm.ProofInformationT2LT2LF == null)
|
||||
_vm.ProofInformationT2LT2LF = new ProofInformationT2LT2LF();
|
||||
if (_vm.ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF == null)
|
||||
_vm.ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF = new GoodsShipmentForT2LT2LF
|
||||
{
|
||||
LocationOfGoods = new LocationOfGoods(),
|
||||
TransportDocuments = new TransportDocuments()
|
||||
};
|
||||
this.DataContext = _vm;
|
||||
}
|
||||
|
||||
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
EasyPeasyState.Save(_vm);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region cut & paste logic
|
||||
|
||||
private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.Key == Key.V && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
|
||||
{
|
||||
if (Clipboard.ContainsText())
|
||||
{
|
||||
var text = Clipboard.GetText();
|
||||
|
||||
if(!TryPaste_EspHsPkgsGross(text))
|
||||
PasteGoodsItems(text);
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void PasteGoodsItems(string text)
|
||||
{
|
||||
if (_vm?.ProofInformationT2LT2LF?.GoodsShipmentForT2LT2LF == null) return;
|
||||
|
||||
var lines = text.Replace("\r\n", "\n").Replace('\r', '\n')
|
||||
.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
// Split by tab first; if only one column, try CSV
|
||||
var cells = line.Split('\t');
|
||||
if (cells.Length == 1) cells = SplitCsv(line);
|
||||
|
||||
// Expected order: HS, Item#, Description, Gross, Net, Pkgs, Type, Marks
|
||||
var item = new GoodsItemForT2LT2LF();
|
||||
|
||||
if (cells.Length > 0) item.Commodity.HarmonizedSystemSubHeadingCode = cells[0].Trim();
|
||||
if (cells.Length > 1 && int.TryParse(cells[1], out var n)) item.GoodsItemNumber = n;
|
||||
if (cells.Length > 2) item.DescriptionOfGoods = cells[2].Trim();
|
||||
if (cells.Length > 3 && decimal.TryParse(cells[3], out var gross)) item.GoodsMeasure.GrossMass = gross;
|
||||
if (cells.Length > 4 && decimal.TryParse(cells[4], out var net)) item.GoodsMeasure.NetMass = net;
|
||||
if (cells.Length > 5 && int.TryParse(cells[5], out var pkgs)) item.Packaging.NumberOfPackages = pkgs;
|
||||
if (cells.Length > 6) item.Packaging.TypeOfPackages = cells[6].Trim();
|
||||
if (cells.Length > 7) item.Packaging.ShippingMarks = cells[7].Trim();
|
||||
|
||||
_vm.ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.GoodsItemsForT2LT2LF.Add(item);
|
||||
}
|
||||
}
|
||||
|
||||
// Very small CSV splitter (handles quotes)
|
||||
private static string[] SplitCsv(string line)
|
||||
{
|
||||
var res = new System.Collections.Generic.List<string>();
|
||||
var sb = new StringBuilder();
|
||||
bool inQuotes = false;
|
||||
for (int i = 0; i < line.Length; i++)
|
||||
{
|
||||
char c = line[i];
|
||||
if (c == '\"')
|
||||
{
|
||||
if (inQuotes && i + 1 < line.Length && line[i + 1] == '\"')
|
||||
{ sb.Append('\"'); i++; }
|
||||
else { inQuotes = !inQuotes; }
|
||||
}
|
||||
else if (c == ',' && !inQuotes)
|
||||
{ res.Add(sb.ToString()); sb.Clear(); }
|
||||
else { sb.Append(c); }
|
||||
}
|
||||
res.Add(sb.ToString());
|
||||
return res.ToArray();
|
||||
}
|
||||
|
||||
private bool TryPaste_EspHsPkgsGross(string text)
|
||||
{
|
||||
if (_vm?.ProofInformationT2LT2LF?.GoodsShipmentForT2LT2LF == null) return false;
|
||||
|
||||
// Normalize and split lines
|
||||
var lines = text.Replace("\r\n", "\n").Replace('\r', '\n')
|
||||
.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (lines.Length == 0) return false;
|
||||
|
||||
// Determine next item number
|
||||
var list = _vm.ProofInformationT2LT2LF.GoodsShipmentForT2LT2LF.GoodsItemsForT2LT2LF;
|
||||
int nextItemNo = list.Any() ? list.Max(x => x.GoodsItemNumber) + 1 : 1;
|
||||
|
||||
bool anyAdded = false;
|
||||
bool countrySeen = false;
|
||||
|
||||
foreach (var raw in lines)
|
||||
{
|
||||
var line = raw; // do not Trim() entirely; keep leading tab as empty first cell
|
||||
var cells = line.Split('\t'); // keeps empty entries
|
||||
|
||||
// Expected:
|
||||
// - 4 cells: [ESP or ""], [HS], [Pkgs], [Gross]
|
||||
// - 3 cells: [HS], [Pkgs], [Gross]
|
||||
string hs = null, pkgs = null, gross = null;
|
||||
|
||||
if (cells.Length >= 4)
|
||||
{
|
||||
string c0 = cells[0]?.Trim();
|
||||
// Optionally capture the first token like "ESP" (country tag),
|
||||
// only once and only if alphabetic (won't throw if numeric)
|
||||
if (!countrySeen && !string.IsNullOrWhiteSpace(c0) && c0.All(ch => char.IsLetter(ch)))
|
||||
{
|
||||
// If you decide later this should set a field, uncomment:
|
||||
// if (string.IsNullOrWhiteSpace(_vm.Country)) _vm.Country = c0;
|
||||
countrySeen = true;
|
||||
}
|
||||
|
||||
hs = (cells.Length > 1 ? cells[1] : null);
|
||||
pkgs = (cells.Length > 2 ? cells[2] : null);
|
||||
gross = (cells.Length > 3 ? cells[3] : null);
|
||||
}
|
||||
else if (cells.Length == 3)
|
||||
{
|
||||
hs = cells[0];
|
||||
pkgs = cells[1];
|
||||
gross = cells[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not enough data for this format; skip the row
|
||||
continue;
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(hs)) continue;
|
||||
|
||||
var item = new GoodsItemForT2LT2LF
|
||||
{
|
||||
GoodsItemNumber = nextItemNo++,
|
||||
DescriptionOfGoods = "" // per spec
|
||||
};
|
||||
item.Commodity.HarmonizedSystemSubHeadingCode = hs.Trim();
|
||||
|
||||
if (TryParseIntFlexible(pkgs, out var pk))
|
||||
item.Packaging.NumberOfPackages = pk;
|
||||
|
||||
if (TryParseDecimalFlexible(gross, out var g))
|
||||
{
|
||||
item.GoodsMeasure.GrossMass = g;
|
||||
var net = g - 1m;
|
||||
if (net < 0m) net = 0m;
|
||||
item.GoodsMeasure.NetMass = net;
|
||||
}
|
||||
|
||||
list.Add(item);
|
||||
anyAdded = true;
|
||||
}
|
||||
|
||||
return anyAdded;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region static utils
|
||||
|
||||
// this will go somewhere else later
|
||||
|
||||
// Try parse decimal with current culture, invariant, and comma/dot flip
|
||||
private static bool TryParseDecimalFlexible(string s, out decimal value)
|
||||
{
|
||||
s = (s ?? "").Trim();
|
||||
// 1) current culture
|
||||
if (decimal.TryParse(s, NumberStyles.Number, CultureInfo.CurrentCulture, out value)) return true;
|
||||
// 2) invariant
|
||||
if (decimal.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out value)) return true;
|
||||
// 3) flip comma/dot and retry (helps when clipboard mixes locales)
|
||||
string flipped = s.Contains(",") ? s.Replace(",", ".") : s.Replace(".", ",");
|
||||
if (decimal.TryParse(flipped, NumberStyles.Number, CultureInfo.CurrentCulture, out value)) return true;
|
||||
if (decimal.TryParse(flipped, NumberStyles.Number, CultureInfo.InvariantCulture, out value)) return true;
|
||||
value = 0m;
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool TryParseIntFlexible(string s, out int value)
|
||||
{
|
||||
s = (s ?? "").Trim();
|
||||
// Extract leading integer if something like "12 pcs"
|
||||
var digits = new string(s.TakeWhile(ch => char.IsDigit(ch) || ch == '-' || ch == '+').ToArray());
|
||||
if (string.IsNullOrEmpty(digits)) digits = s;
|
||||
return int.TryParse(digits, NumberStyles.Integer, CultureInfo.CurrentCulture, out value)
|
||||
|| int.TryParse(digits, NumberStyles.Integer, CultureInfo.InvariantCulture, out value);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -390,9 +390,12 @@ namespace ENI2.DetailViewControls
|
||||
this.textBox_AgentPostalCode.GetBindingExpression(TextBox.TextProperty).UpdateSource();
|
||||
this.textBox_AgentStreetAndNumber.Text = this._currentTemplate.AgentStreetAndNumber;
|
||||
this.textBox_AgentStreetAndNumber.GetBindingExpression(TextBox.TextProperty).UpdateSource();
|
||||
this.textBox_WasteDisposalServiceProvider.Text = this._currentTemplate.WasteDisposalServiceProviderName;
|
||||
this.textBox_WasteDisposalServiceProvider.GetBindingExpression(TextBox.TextProperty).UpdateSource();
|
||||
this.SublistElementChanged(Message.NotificationClass.WAS);
|
||||
if (this._currentTemplate.WasteDisposalServiceProviderName != this.textBox_WasteDisposalServiceProvider.Text)
|
||||
{
|
||||
this.textBox_WasteDisposalServiceProvider.Text = this._currentTemplate.WasteDisposalServiceProviderName;
|
||||
this.textBox_WasteDisposalServiceProvider.GetBindingExpression(TextBox.TextProperty).UpdateSource();
|
||||
this.SublistElementChanged(Message.NotificationClass.WAS);
|
||||
}
|
||||
|
||||
this.buttonUndoTemplate.IsEnabled = true;
|
||||
this.buttonSetTemplate.IsEnabled = false;
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
</col:ArrayList>
|
||||
</UserControl.Resources>
|
||||
<GroupBox Name="portNotificationGroupBox" Header="{x:Static p:Resources.textPortNotification}">
|
||||
<ScrollViewer PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
|
||||
<ScrollViewer>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="50" />
|
||||
|
||||
@ -36,8 +36,8 @@
|
||||
<MinimumRequiredVersion>5.4.0.0</MinimumRequiredVersion>
|
||||
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
|
||||
<WebPage>publish.html</WebPage>
|
||||
<ApplicationRevision>8</ApplicationRevision>
|
||||
<ApplicationVersion>7.2.10.8</ApplicationVersion>
|
||||
<ApplicationRevision>1</ApplicationRevision>
|
||||
<ApplicationVersion>7.2.12.1</ApplicationVersion>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<CreateDesktopShortcut>true</CreateDesktopShortcut>
|
||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||
@ -297,6 +297,9 @@
|
||||
<Compile Include="Controls\ConditionGroupControl.xaml.cs">
|
||||
<DependentUpon>ConditionGroupControl.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Controls\EasyPeasyControl.xaml.cs">
|
||||
<DependentUpon>EasyPeasyControl.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Controls\EditWindowBase.cs" />
|
||||
<Compile Include="Controls\ENIDataGrid.cs" />
|
||||
<Compile Include="Controls\IHighlightControlContainer.cs" />
|
||||
@ -558,6 +561,7 @@
|
||||
<Compile Include="Util\ByteConverter.cs" />
|
||||
<Compile Include="Util\CutoffConverter.cs" />
|
||||
<Compile Include="Util\DatabaseEntityWatchdog.cs" />
|
||||
<Compile Include="Util\EasyPeasyState.cs" />
|
||||
<Compile Include="Util\EnumHelper.cs" />
|
||||
<Compile Include="Util\EnumToBooleanConverter.cs" />
|
||||
<Compile Include="Util\EnumToCollectionConverter.cs" />
|
||||
@ -587,6 +591,10 @@
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Controls\EasyPeasyControl.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Controls\LocodeControl.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
|
||||
@ -1007,15 +1007,18 @@ namespace ENI2.Excel
|
||||
STAT stat = statMessage.Elements[0] as STAT;
|
||||
ScanMessage(stat, reader);
|
||||
|
||||
foreach (Message preMessage in messages)
|
||||
if (!messageCore.IsTransit) // let's not do this for transit messages
|
||||
{
|
||||
if (preMessage.MessageNotificationClass == Message.NotificationClass.PRE72H)
|
||||
foreach (Message preMessage in messages)
|
||||
{
|
||||
if (preMessage.Elements.Count > 0)
|
||||
if (preMessage.MessageNotificationClass == Message.NotificationClass.PRE72H)
|
||||
{
|
||||
PRE72H pre72h = preMessage.Elements[0] as PRE72H;
|
||||
pre72h.Tanker = stat.IsTanker;
|
||||
ExcelReader.SaveMessage(preMessage);
|
||||
if (preMessage.Elements.Count > 0)
|
||||
{
|
||||
PRE72H pre72h = preMessage.Elements[0] as PRE72H;
|
||||
pre72h.Tanker = stat.IsTanker;
|
||||
ExcelReader.SaveMessage(preMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1467,7 +1470,7 @@ namespace ENI2.Excel
|
||||
bool? PortOfCallLast30DaysCrewMembersJoinedFlag = reader.ReadCellAsBool(sheetTitle, string.Format("H{0}", 82 + i));
|
||||
|
||||
string crewNameString = reader.ReadCellAsText(sheetTitle, string.Format("I{0}", 82 + i));
|
||||
poc30d.PortOfCallLast30DaysCrewMembersJoined = !crewNameString.IsNullOrEmpty();
|
||||
poc30d.PortOfCallLast30DaysCrewMembersJoined = !crewNameString.IsNullOrEmpty() && (crewNameString.Length > 1);
|
||||
|
||||
// if crew members joined is set explicitly to true and the name is empty, still set the field to true
|
||||
if (!(poc30d.PortOfCallLast30DaysCrewMembersJoined ?? false) && (PortOfCallLast30DaysCrewMembersJoinedFlag ?? false))
|
||||
@ -1688,7 +1691,7 @@ namespace ENI2.Excel
|
||||
l10fc.PortFacilityDateOfArrival = reader.ReadCellAsDateTime(sheetTitle, string.Format("G{0}", 54 + i));
|
||||
l10fc.PortFacilityDateOfDeparture = reader.ReadCellAsDateTime(sheetTitle, string.Format("H{0}", 54 + i));
|
||||
|
||||
string sLevel = reader.ReadCellAsText(sheetTitle, string.Format("I{0}", 54 + i), 1);
|
||||
string sLevel = reader.ReadCellAsText(sheetTitle, string.Format("I{0}", 54 + i));
|
||||
if (!sLevel.IsNullOrEmpty())
|
||||
{
|
||||
if (sLevel.Contains('1')) l10fc.PortFacilityShipSecurityLevel = 1;
|
||||
|
||||
@ -95,6 +95,7 @@
|
||||
<MenuItem x:Name="menuItemUserAdministration" Header="{x:Static p:Resources.textUserAdministration}" Click="radioButton_Click" Visibility="Hidden"/>
|
||||
<MenuItem x:Name="menuItemMaersk" Header="{x:Static p:Resources.textPOLists}" Click="radioButton_Click" Visibility="Hidden" />
|
||||
<MenuItem x:Name="menuItemValueMappings" Header="{x:Static p:Resources.textExcelValueMappings}" Click="radioButton_Click" Visibility="Hidden" />
|
||||
<MenuItem x:Name="menuItemEasyPeasy" Header="{x:Static p:Resources.textEasyPeasy}" Click="radioButton_Click" Visibility="Hidden" />
|
||||
<MenuItem x:Name="labelStatusId" />
|
||||
<MenuItem Header="Help" HorizontalAlignment="Right">
|
||||
<MenuItem Header="Change Password" Click="buttonChangePassword_Click">
|
||||
|
||||
@ -39,6 +39,7 @@ namespace ENI2
|
||||
private ServerStatusControl statusControl;
|
||||
private readonly SucheControl sucheControl;
|
||||
private CompareExcelDialog compareExcelDialog;
|
||||
private EasyPeasyControl easyPeasyControl;
|
||||
|
||||
private bool dbConnected;
|
||||
private readonly ScaleTransform _transform = new ScaleTransform(1.0, 1.0);
|
||||
@ -324,6 +325,14 @@ namespace ENI2
|
||||
}
|
||||
this.rootContainer.Children.Add(this.vmControl);
|
||||
}
|
||||
else if(sender == this.menuItemEasyPeasy)
|
||||
{
|
||||
if(this.easyPeasyControl == null)
|
||||
{
|
||||
this.easyPeasyControl = new EasyPeasyControl();
|
||||
}
|
||||
this.rootContainer.Children.Add(this.easyPeasyControl);
|
||||
}
|
||||
}
|
||||
|
||||
private void buttonCompareSheets_Click(object sender, RoutedEventArgs ev)
|
||||
@ -377,6 +386,8 @@ namespace ENI2
|
||||
Properties.Settings.Default.MainWindowPlacement = this.GetPlacement();
|
||||
Properties.Settings.Default.Save();
|
||||
Microsoft.Win32.SystemEvents.SessionEnded -= SystemEvents_SessionEnded;
|
||||
if (easyPeasyControl != null)
|
||||
easyPeasyControl.SaveState();
|
||||
}
|
||||
|
||||
private void Window_SourceInitialized(object sender, EventArgs e)
|
||||
@ -690,6 +701,7 @@ namespace ENI2
|
||||
ReportingParty.CurrentReportingParty = this.userEntity;
|
||||
this.menuItemMaersk.Visibility = Visibility.Visible;
|
||||
this.menuItemValueMappings.Visibility = Visibility.Visible;
|
||||
this.menuItemEasyPeasy.Visibility = Visibility.Visible;
|
||||
if (this.userEntity.IsAdmin)
|
||||
{
|
||||
this.menuItemUserAdministration.Visibility = Visibility.Visible;
|
||||
@ -753,5 +765,6 @@ namespace ENI2
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
9
ENI2/Properties/Resources.Designer.cs
generated
9
ENI2/Properties/Resources.Designer.cs
generated
@ -2871,6 +2871,15 @@ namespace ENI2.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Easy Peasy 🍋.
|
||||
/// </summary>
|
||||
public static string textEasyPeasy {
|
||||
get {
|
||||
return ResourceManager.GetString("textEasyPeasy", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to _Edit.
|
||||
/// </summary>
|
||||
|
||||
@ -2265,4 +2265,7 @@ New entry: {1}
|
||||
|
||||
Proceed?</value>
|
||||
</data>
|
||||
<data name="textEasyPeasy" xml:space="preserve">
|
||||
<value>Easy Peasy 🍋</value>
|
||||
</data>
|
||||
</root>
|
||||
@ -369,9 +369,12 @@ namespace ENI2.SheetDisplayControls
|
||||
this.textBox_AgentPostalCode.GetBindingExpression(TextBox.TextProperty).UpdateSource();
|
||||
this.textBox_AgentStreetAndNumber.Text = this._currentTemplate.AgentStreetAndNumber;
|
||||
this.textBox_AgentStreetAndNumber.GetBindingExpression(TextBox.TextProperty).UpdateSource();
|
||||
this.textBox_WasteDisposalServiceProvider.Text = this._currentTemplate.WasteDisposalServiceProviderName;
|
||||
this.textBox_WasteDisposalServiceProvider.GetBindingExpression(TextBox.TextProperty).UpdateSource();
|
||||
this.SublistElementChanged(Message.NotificationClass.WAS);
|
||||
if (this._currentTemplate.WasteDisposalServiceProviderName != this.textBox_WasteDisposalServiceProvider.Text)
|
||||
{
|
||||
this.textBox_WasteDisposalServiceProvider.Text = this._currentTemplate.WasteDisposalServiceProviderName;
|
||||
this.textBox_WasteDisposalServiceProvider.GetBindingExpression(TextBox.TextProperty).UpdateSource();
|
||||
this.SublistElementChanged(Message.NotificationClass.WAS);
|
||||
}
|
||||
|
||||
this.buttonUndoTemplate.IsEnabled = true;
|
||||
this.buttonSetTemplate.IsEnabled = false;
|
||||
|
||||
63
ENI2/Util/EasyPeasyState.cs
Normal file
63
ENI2/Util/EasyPeasyState.cs
Normal file
@ -0,0 +1,63 @@
|
||||
// Copyright (c) 2017- schick Informatik
|
||||
// Description: Helper class for customs data serialization
|
||||
//
|
||||
|
||||
using bsmd.database.EasyPeasy;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace ENI2.Util
|
||||
{
|
||||
public static class EasyPeasyState
|
||||
{
|
||||
private static readonly string Root = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||
"EasyPeasy");
|
||||
private static readonly string StatePath = Path.Combine(Root, "state.xml");
|
||||
|
||||
public static ProofRequest LoadOrCreate()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (File.Exists(StatePath))
|
||||
{
|
||||
using (var fs = File.OpenRead(StatePath))
|
||||
{
|
||||
var ser = new XmlSerializer(typeof(ProofRequest));
|
||||
return (ProofRequest)ser.Deserialize(fs);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { /* swallow & create new */ }
|
||||
|
||||
return CreateDefault();
|
||||
}
|
||||
|
||||
public static void Save(ProofRequest data)
|
||||
{
|
||||
Directory.CreateDirectory(Root);
|
||||
using (var fs = File.Create(StatePath))
|
||||
{
|
||||
var ser = new XmlSerializer(typeof(ProofRequest));
|
||||
ser.Serialize(fs, data);
|
||||
}
|
||||
}
|
||||
|
||||
public static ProofRequest CreateDefault()
|
||||
{
|
||||
return new ProofRequest
|
||||
{
|
||||
ProofInformationT2LT2LF = new ProofInformationT2LT2LF
|
||||
{
|
||||
RequestedValidityOfTheProof = new RequestedValidityOfTheProof(),
|
||||
GoodsShipmentForT2LT2LF = new GoodsShipmentForT2LT2LF
|
||||
{
|
||||
LocationOfGoods = new LocationOfGoods(),
|
||||
TransportDocuments = new TransportDocuments()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
92
bsmd.database/EasyPeasy.cs
Normal file
92
bsmd.database/EasyPeasy.cs
Normal file
@ -0,0 +1,92 @@
|
||||
// Copyright (c) 2024-present schick Informatik
|
||||
// Description: Collection of classes for the customs XML upload app
|
||||
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace bsmd.database.EasyPeasy
|
||||
{
|
||||
// Root: <proofRequest>
|
||||
[XmlRoot("proofRequest")]
|
||||
public class ProofRequest
|
||||
{
|
||||
public string DelegateIdentificationType { get; set; }
|
||||
public string TraderIdentificationType { get; set; }
|
||||
public string LRN { get; set; }
|
||||
public string TraderIdentificationNumber { get; set; }
|
||||
public string Country { get; set; }
|
||||
|
||||
public ProofInformationT2LT2LF ProofInformationT2LT2LF { get; set; }
|
||||
|
||||
public string DelegateIdentificationNumber { get; set; }
|
||||
}
|
||||
|
||||
public class ProofInformationT2LT2LF
|
||||
{
|
||||
public string CompetentCustomsOffice { get; set; }
|
||||
public string DeclarationType { get; set; }
|
||||
public DateTime DeclarationDate { get; set; }
|
||||
public decimal TotalGrossMassKg { get; set; }
|
||||
public RequestedValidityOfTheProof RequestedValidityOfTheProof { get; set; }
|
||||
public GoodsShipmentForT2LT2LF GoodsShipmentForT2LT2LF { get; set; }
|
||||
public string RequestType { get; set; }
|
||||
}
|
||||
|
||||
public class RequestedValidityOfTheProof
|
||||
{
|
||||
public int NumberOfDays { get; set; }
|
||||
}
|
||||
|
||||
public class GoodsShipmentForT2LT2LF
|
||||
{
|
||||
public bool ContainerIndication { get; set; }
|
||||
public LocationOfGoods LocationOfGoods { get; set; }
|
||||
|
||||
[XmlElement("GoodsItemsForT2LT2LF")]
|
||||
public ObservableCollection<GoodsItemForT2LT2LF> GoodsItemsForT2LT2LF { get; set; } = new ObservableCollection<GoodsItemForT2LT2LF>();
|
||||
|
||||
public TransportDocuments TransportDocuments { get; set; }
|
||||
}
|
||||
|
||||
public class LocationOfGoods
|
||||
{
|
||||
public string TypeOfLocation { get; set; }
|
||||
public string QualifierOfIdentification { get; set; }
|
||||
public string UNLocode { get; set; }
|
||||
}
|
||||
|
||||
public class GoodsItemForT2LT2LF
|
||||
{
|
||||
public Commodity Commodity { get; set; } = new Commodity();
|
||||
public int GoodsItemNumber { get; set; }
|
||||
public string DescriptionOfGoods { get; set; }
|
||||
public GoodsMeasure GoodsMeasure { get; set; } = new GoodsMeasure();
|
||||
public Packaging Packaging { get; set; } = new Packaging();
|
||||
}
|
||||
|
||||
public class Commodity
|
||||
{
|
||||
public string HarmonizedSystemSubHeadingCode { get; set; }
|
||||
}
|
||||
|
||||
public class GoodsMeasure
|
||||
{
|
||||
public decimal GrossMass { get; set; }
|
||||
public decimal NetMass { get; set; }
|
||||
}
|
||||
|
||||
public class Packaging
|
||||
{
|
||||
public string ShippingMarks { get; set; }
|
||||
public int NumberOfPackages { get; set; }
|
||||
public string TypeOfPackages { get; set; }
|
||||
}
|
||||
|
||||
public class TransportDocuments
|
||||
{
|
||||
public string Type { get; set; }
|
||||
public string ReferenceNumber { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
@ -2,6 +2,6 @@
|
||||
|
||||
[assembly: AssemblyCompany("schick Informatik")]
|
||||
[assembly: AssemblyProduct("BSMD NSW interface")]
|
||||
[assembly: AssemblyInformationalVersion("7.2.10")]
|
||||
[assembly: AssemblyInformationalVersion("7.2.12")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2014-2025 schick Informatik")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
@ -1,4 +1,4 @@
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyVersion("7.2.10.*")]
|
||||
[assembly: AssemblyVersion("7.2.12.*")]
|
||||
|
||||
|
||||
@ -98,7 +98,7 @@ namespace bsmd.database
|
||||
public int CompareTo(object obj)
|
||||
{
|
||||
if (obj is WasteDisposalServiceProvider_Template template)
|
||||
this.Remark?.CompareTo(template.Remark ?? "");
|
||||
return this.Remark?.CompareTo(template.Remark ?? "") ?? 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -119,6 +119,7 @@
|
||||
<Compile Include="Customer.cs" />
|
||||
<Compile Include="DatabaseEntityAsync.cs" />
|
||||
<Compile Include="DBManagerAsync.cs" />
|
||||
<Compile Include="EasyPeasy.cs" />
|
||||
<Compile Include="Extensions.cs" />
|
||||
<Compile Include="HAZ.cs" />
|
||||
<Compile Include="HAZPosTemplate.cs" />
|
||||
|
||||
Loading…
Reference in New Issue
Block a user