Skip to content

Commit

Permalink
Add Ingenico ZVT logic
Browse files Browse the repository at this point in the history
  • Loading branch information
tinohager committed Aug 24, 2023
1 parent e95b191 commit 852acfd
Show file tree
Hide file tree
Showing 9 changed files with 149 additions and 32 deletions.
55 changes: 47 additions & 8 deletions src/Portalum.Zvt.ControlPanel/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
using Microsoft.Extensions.Logging;
using Portalum.Zvt.Models;
using Portalum.Zvt.ControlPanel.Dialogs;
using Portalum.Zvt.ControlPanel.Models;
using Portalum.Zvt.Helpers;
using Portalum.Zvt.Models;
using Portalum.Zvt.Repositories;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Threading;

namespace Portalum.Zvt.ControlPanel
{
Expand Down Expand Up @@ -44,7 +46,16 @@ public MainWindow(DeviceConfiguration deviceConfiguration)

this.TextBoxAmount.Text = $"{this.CreateRandomAmount()}";

_ = Task.Run(async () => await this.ConnectAsync());
CodePagesEncodingProvider.Instance.GetEncoding(437);
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

_ = Task.Run(async () => await this.ConnectAsync()).ContinueWith(task =>
{
if (task.IsFaulted)
{
throw task.Exception;
}
});
}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
Expand Down Expand Up @@ -126,13 +137,38 @@ private async Task<bool> ConnectAsync()
this.ButtonDisconnect.IsEnabled = true;
});

#region Default ZVT

var zvtClientConfig = new ZvtClientConfig
{
Encoding = this._deviceConfiguration.Encoding,
Language = this._deviceConfiguration.Language
};

this._zvtClient = new ZvtClient(this._deviceCommunication, logger: loggerZvtClient, zvtClientConfig);
this._zvtClient = new ZvtClient(
deviceCommunication: this._deviceCommunication,
logger: loggerZvtClient,
clientConfig: zvtClientConfig);

#endregion

#region Ingenico ZVT

//var receiveHandler = new ReceiveHandler(
// logger: loggerZvtClient,
// encoding: EncodingHelper.GetEncoding(this._deviceConfiguration.Encoding),
// errorMessageRepository: new EnglishErrorMessageRepository(),
// intermediateStatusRepository: new IngenicoEnglishIntermediateStatusRepository()
// );

//this._zvtClient = new ZvtClient(
// deviceCommunication: this._deviceCommunication,
// logger: loggerZvtClient,
// receiveHandler: receiveHandler);

#endregion


this._zvtClient.LineReceived += this.LineReceived;
this._zvtClient.ReceiptReceived += this.ReceiptReceived;
this._zvtClient.StatusInformationReceived += this.StatusInformationReceived;
Expand Down Expand Up @@ -162,10 +198,13 @@ private async Task<bool> DisconnectAsync()
disposable.Dispose();
}

this._zvtClient.LineReceived -= this.LineReceived;
this._zvtClient.ReceiptReceived -= this.ReceiptReceived;
this._zvtClient.StatusInformationReceived -= this.StatusInformationReceived;
this._zvtClient.IntermediateStatusInformationReceived -= this.IntermediateStatusInformationReceived;
if (this._zvtClient != null)
{
this._zvtClient.LineReceived -= this.LineReceived;
this._zvtClient.ReceiptReceived -= this.ReceiptReceived;
this._zvtClient.StatusInformationReceived -= this.StatusInformationReceived;
this._zvtClient.IntermediateStatusInformationReceived -= this.IntermediateStatusInformationReceived;
}
this._zvtClient?.Dispose();

this.ButtonDisconnect.Dispatcher.Invoke(() =>
Expand Down
33 changes: 33 additions & 0 deletions src/Portalum.Zvt/Helpers/EncodingHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System.Text;

namespace Portalum.Zvt.Helpers
{
/// <summary>
/// EncodingHelper
/// </summary>
public static class EncodingHelper
{
/// <summary>
/// GetEncoding from ZvtEncoding
/// </summary>
/// <param name="zvtEncoding"></param>
/// <returns></returns>
public static Encoding GetEncoding(ZvtEncoding zvtEncoding)
{
switch (zvtEncoding)
{
case ZvtEncoding.UTF8:
return Encoding.UTF8;
case ZvtEncoding.ISO_8859_1:
return Encoding.GetEncoding("iso-8859-1");
case ZvtEncoding.ISO_8859_2:
return Encoding.GetEncoding("iso-8859-2");
case ZvtEncoding.ISO_8859_15:
return Encoding.GetEncoding("iso-8859-15");
case ZvtEncoding.CodePage437:
default:
return Encoding.GetEncoding(437);
}
}
}
}
2 changes: 1 addition & 1 deletion src/Portalum.Zvt/Portalum.Zvt.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" />
<PackageReference Include="Nager.TcpClient" Version="1.1.1" />
<PackageReference Include="System.IO.Ports" Version="7.0.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ public class EnglishIntermediateStatusRepository : IIntermediateStatusRepository
/// <summary>
/// English IntermediateStatusRepository
/// </summary>
public EnglishIntermediateStatusRepository()
/// <param name="additionalStatusCodes"></param>
public EnglishIntermediateStatusRepository(Dictionary<byte, string> additionalStatusCodes = null)
{
this._statusCodes = new Dictionary<byte, string>
{
Expand Down Expand Up @@ -102,6 +103,14 @@ public EnglishIntermediateStatusRepository()
{ 0xF3, "Offline transaction" },
{ 0xFF, "no appropriate ZVT status code matches the status. See TLV tags 24 and 07" }
};

if (additionalStatusCodes != null)
{
foreach (var additionalStatusCode in additionalStatusCodes)
{
this._statusCodes.Add(additionalStatusCode.Key, additionalStatusCode.Value);
}
}
}

/// <inheritdoc />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ public class GermanIntermediateStatusRepository : IIntermediateStatusRepository
/// <summary>
/// German IntermediateStatusRepository
/// </summary>
public GermanIntermediateStatusRepository()
/// <param name="additionalStatusCodes"></param>
public GermanIntermediateStatusRepository(Dictionary<byte, string> additionalStatusCodes = null)
{
this._statusCodes = new Dictionary<byte, string>
{
Expand Down Expand Up @@ -102,6 +103,14 @@ public GermanIntermediateStatusRepository()
{ 0xF3, "Offline-Transaktion" },
{ 0xFF, "kein geeigneter ZVT-Statuscode zu demdem Status. Siehe TLV-Tags 24 und 07" }
};

if (additionalStatusCodes != null)
{
foreach (var additionalStatusCode in additionalStatusCodes)
{
this._statusCodes.Add(additionalStatusCode.Key, additionalStatusCode.Value);
}
}
}

/// <inheritdoc />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System.Collections.Generic;

namespace Portalum.Zvt.Repositories
{
/// <summary>
/// Ingenico English IntermediateStatusRepository
/// </summary>
public class IngenicoEnglishIntermediateStatusRepository : EnglishIntermediateStatusRepository
{
/// <inheritdoc/>
public IngenicoEnglishIntermediateStatusRepository() : base(new Dictionary<byte, string>
{
{ 0xA0, "Payment processed" },
{ 0xA1, "Payment processed\nPlease remove card!" },
{ 0xA2, "Cancellation successful" },
{ 0xA3, "Cancellation successful\nPlease remove card!" },
{ 0xA4, "Cancellation not possible" },
{ 0xA5, "Cancellation not possible\nPlease remove card!" }
})
{ }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System.Collections.Generic;

namespace Portalum.Zvt.Repositories
{
/// <summary>
/// Ingenico German IntermediateStatusRepository
/// </summary>
public class IngenicoGermanIntermediateStatusRepository : EnglishIntermediateStatusRepository
{
/// <inheritdoc/>
public IngenicoGermanIntermediateStatusRepository() : base(new Dictionary<byte, string>
{
{ 0xA0, "Zahlung erfolgt" },
{ 0xA1, "Zahlung erfolgt\nBitte Karte entnehmen!" },
{ 0xA2, "Storno erfolgt" },
{ 0xA3, "Storno erfolgt\nBitte Karte entnehmen!" },
{ 0xA4, "Storno nicht möglich" },
{ 0xA5, "Storno nicht möglich\nBitte Karte entnehmen!" }
})
{ }
}
}
23 changes: 3 additions & 20 deletions src/Portalum.Zvt/ZvtClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public class ZvtClient : IDisposable

if (receiveHandler == default)
{
this.InitializeReceiveHandler(clientConfig.Language, this.GetEncoding(clientConfig.Encoding));
this.InitializeReceiveHandler(clientConfig.Language, EncodingHelper.GetEncoding(clientConfig.Encoding));
}
else
{
Expand Down Expand Up @@ -161,24 +161,6 @@ private CompletionInfo GetCompletionInfo()
return this.CompletionDecisionRequested?.Invoke();
}

private Encoding GetEncoding(ZvtEncoding zvtEncoding)
{
switch (zvtEncoding)
{
case ZvtEncoding.UTF8:
return Encoding.UTF8;
case ZvtEncoding.ISO_8859_1:
return Encoding.GetEncoding("iso-8859-1");
case ZvtEncoding.ISO_8859_2:
return Encoding.GetEncoding("iso-8859-2");
case ZvtEncoding.ISO_8859_15:
return Encoding.GetEncoding("iso-8859-15");
case ZvtEncoding.CodePage437:
default:
return Encoding.GetEncoding(437);
}
}

private void InitializeReceiveHandler(
Language language,
Encoding encoding)
Expand Down Expand Up @@ -218,7 +200,8 @@ private void UnregisterReceiveHandlerEvents()

private IErrorMessageRepository GetErrorMessageRepository(Language language)
{
//No German translation available
//TODO: No German translation available

return new EnglishErrorMessageRepository();
}

Expand Down
2 changes: 1 addition & 1 deletion src/Portalum.Zvt/ZvtCommunication.cs
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ protected virtual void ProcessData(byte[] data)
}
else if (dataProcessed.Response is StatusInformation statusInformation)
{
this._logger.LogError($"{nameof(ProcessData)} - {statusInformation.ErrorCode}");
this._logger.LogInformation($"{nameof(ProcessData)} - StatusInformation with ErrorCode:{statusInformation.ErrorCode:X2} {statusInformation.ErrorMessage} received");
this._deviceCommunication.SendAsync(this._negativeIssueGoodsData);
}
else if (dataProcessed.Response is Completion completion)
Expand Down

0 comments on commit 852acfd

Please sign in to comment.