Skip to content

Commit

Permalink
Added support for posapi
Browse files Browse the repository at this point in the history
  • Loading branch information
StefanKert committed Sep 1, 2023
1 parent 580be66 commit afc1a3c
Show file tree
Hide file tree
Showing 7 changed files with 380 additions and 3 deletions.
82 changes: 82 additions & 0 deletions src/fiskaltrust.AndroidLauncher.Common/PosApiPrint/PosApiHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using fiskaltrust.ifPOS.v1;
using fiskaltrust.AndroidLauncher.Common.PosApiPrint.Helpers;

namespace fiskaltrust.AndroidLauncher.Common.PosApiPrint
{
public class PosApiHelper : IPOS
{
private readonly PosApiProvider _posApiProvider;
private IPOS _targetPOS;

public PosApiHelper(PosApiProvider provider, IPOS targetPos)
{
_posApiProvider = provider;
_targetPOS = targetPos;
}

public async Task<ReceiptResponse> SignAsync(ReceiptRequest request)
{
var response = await _targetPOS.SignAsync(request);
await _posApiProvider.PrintAsync(request, response);
return response;
}

public IAsyncEnumerable<JournalResponse> JournalAsync(JournalRequest request) => _targetPOS.JournalAsync(request);

public Task<EchoResponse> EchoAsync(EchoRequest message) => _targetPOS.EchoAsync(message);

public ifPOS.v0.ReceiptResponse Sign(ifPOS.v0.ReceiptRequest data) => Task.Run(() => SignAsync(data)).Result;

private async Task<ifPOS.v0.ReceiptResponse> SignAsync(ifPOS.v0.ReceiptRequest data) => ReceiptRequestHelper.ConvertToV0(await SignAsync(ReceiptRequestHelper.ConvertToV1(data)));

private delegate ifPOS.v0.ReceiptResponse Sign_Delegate(ifPOS.v0.ReceiptRequest request);
public IAsyncResult BeginSign(ifPOS.v0.ReceiptRequest data, AsyncCallback callback, object state)
{
var d = new Sign_Delegate(Sign);
var r = d.BeginInvoke(data, callback, d);
return r;
}

public ifPOS.v0.ReceiptResponse EndSign(IAsyncResult result)
{
var d = (Sign_Delegate)result.AsyncState;
return d.EndInvoke(result);
}

public Stream Journal(long ftJournalType, long from, long to) => _targetPOS.Journal(ftJournalType, from, to);

private delegate Stream Journal_Delegate(long ftJournalType, long from, long to);
public IAsyncResult BeginJournal(long ftJournalType, long from, long to, AsyncCallback callback, object state)
{
var d = new Journal_Delegate(Journal);
var r = d.BeginInvoke(ftJournalType, from, to, callback, d);
return r;
}

public Stream EndJournal(IAsyncResult result)
{
var d = (Journal_Delegate)result.AsyncState;
return d.EndInvoke(result);
}

public string Echo(string message) => _targetPOS.Echo(message);

private delegate string Echo_Delegate(string message);
public IAsyncResult BeginEcho(string message, AsyncCallback callback, object state)
{
var d = new Echo_Delegate(Echo);
var r = d.BeginInvoke(message, callback, d);
return r;
}

public string EndEcho(IAsyncResult result)
{
var d = (Echo_Delegate)result.AsyncState;
return d.EndInvoke(result);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using fiskaltrust.ifPOS.v1;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace fiskaltrust.AndroidLauncher.Common.PosApiPrint
{
public class PosApiProvider
{
private readonly ILogger<PosApiProvider> _logger;
private readonly HttpClient _httpClient;

public PosApiProvider(Guid cashBoxId, string accessToken, Uri posApiurl, ILogger<PosApiProvider> logger)
{
_logger = logger;
_httpClient = new HttpClient(new HttpClientHandler { }, disposeHandler: true) { BaseAddress = posApiurl };
_httpClient.DefaultRequestHeaders.Add("cashboxid", cashBoxId.ToString());
_httpClient.DefaultRequestHeaders.Add("accesstoken", accessToken);
_logger.LogDebug("Communciation with POS API ({PosApiUrl}) for CashBox {CashBoxId}.", posApiurl, cashBoxId);
}

public async Task PrintAsync(ReceiptRequest receiptRequest, ReceiptResponse receiptResponse)
{
_logger.LogDebug("Try to print receipt with queueitemid {ftqueueitemid}", receiptResponse.ftQueueItemID);
try
{
var printResponse = await _httpClient.PostAsync("v0/print", new StringContent(JsonConvert.SerializeObject(new PrintRequest
{
request = receiptRequest,
response = receiptResponse
}), Encoding.UTF8, "application/json"));

var result = await printResponse.Content.ReadAsStringAsync();
if (!printResponse.IsSuccessStatusCode)
{
throw new Exception(result);
}
_logger.LogDebug("Submitted Receipt for printing with queueitemid {ftqueueitemid}", receiptResponse.ftQueueItemID);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to print receipt with queueitemid {ftqueueitemid}. Reason: {reason}", receiptResponse.ftQueueItemID, ex.Message);
}
}
}
}
11 changes: 11 additions & 0 deletions src/fiskaltrust.AndroidLauncher.Common/PosApiPrint/PrintRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using fiskaltrust.ifPOS.v1;
using System;

namespace fiskaltrust.AndroidLauncher.Common.PosApiPrint.Models
{
public class PrintRequest
{
public ReceiptRequest request { get; set; }
public ReceiptResponse response { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
using System;
using System.Linq;
using fiskaltrust.ifPOS.v1;

namespace fiskaltrust.AndroidLauncher.Common.PosApiPrint.Helpers
{
public static class ReceiptRequestHelper
{
public static ReceiptRequest ConvertToV1(ifPOS.v0.ReceiptRequest data)
{
return new ReceiptRequest
{
cbArea = data.cbArea,
cbCustomer = data.cbCustomer,
cbPreviousReceiptReference = data.cbPreviousReceiptReference,
cbReceiptAmount = data.cbReceiptAmount,
cbReceiptMoment = data.cbReceiptMoment,
cbReceiptReference = data.cbReceiptReference,
cbSettlement = data.cbSettlement,
cbTerminalID = data.cbTerminalID,
cbUser = data.cbUser,
ftCashBoxID = data.ftCashBoxID,
ftPosSystemId = data.ftPosSystemId,
ftQueueID = data.ftQueueID,
ftReceiptCase = data.ftReceiptCase,
ftReceiptCaseData = data.ftReceiptCaseData,
cbChargeItems = data.cbChargeItems?.Select(ConvertToV1).ToArray() ?? Array.Empty<ChargeItem>(),
cbPayItems = data.cbPayItems?.Select(ConvertToV1).ToArray() ?? Array.Empty<PayItem>(),
};
}

public static ChargeItem ConvertToV1(ifPOS.v0.ChargeItem data)
{
return new ChargeItem
{
AccountNumber = data.AccountNumber,
Amount = data.Amount,
CostCenter = data.CostCenter,
Description = data.Description,
ftChargeItemCase = data.ftChargeItemCase,
ftChargeItemCaseData = data.ftChargeItemCaseData,
Moment = data.Moment,
Position = data.Position,
ProductBarcode = data.ProductBarcode,
ProductGroup = data.ProductGroup,
ProductNumber = data.ProductNumber,
Quantity = data.Quantity,
Unit = data.Unit,
UnitPrice = data.UnitPrice,
UnitQuantity = data.UnitQuantity,
VATAmount = data.VATAmount,
VATRate = data.VATRate
};
}

public static PayItem ConvertToV1(ifPOS.v0.PayItem data)
{
return new PayItem
{
AccountNumber = data.AccountNumber,
Amount = data.Amount,
CostCenter = data.CostCenter,
Description = data.Description,
ftPayItemCase = data.ftPayItemCase,
ftPayItemCaseData = data.ftPayItemCaseData,
Moment = data.Moment,
Position = data.Position,
MoneyGroup = data.MoneyGroup,
MoneyNumber = data.MoneyNumber,
Quantity = data.Quantity
};
}

public static ReceiptResponse ConvertToV1(ifPOS.v0.ReceiptResponse data)
{
return new ReceiptResponse
{
ftCashBoxID = data.ftCashBoxID,
cbReceiptReference = data.cbReceiptReference,
cbTerminalID = data.cbTerminalID,
ftCashBoxIdentification = data.ftCashBoxIdentification,
ftChargeLines = data.ftChargeLines,
ftPayLines = data.ftPayLines,
ftQueueID = data.ftQueueID,
ftQueueItemID = data.ftQueueItemID,
ftQueueRow = data.ftQueueRow,
ftReceiptFooter = data.ftReceiptFooter,
ftReceiptHeader = data.ftReceiptHeader,
ftReceiptIdentification = data.ftReceiptIdentification,
ftReceiptMoment = data.ftReceiptMoment,
ftState = data.ftState,
ftStateData = data.ftStateData,
ftChargeItems = data.ftChargeItems?.Select(ConvertToV1).ToArray(),
ftPayItems = data.ftPayItems?.Select(ConvertToV1).ToArray(),
ftSignatures = data.ftSignatures?.Select(ConvertToV1).ToArray(),
};
}

public static ifPOS.v0.ReceiptResponse ConvertToV0(ReceiptResponse data)
{
return new ifPOS.v0.ReceiptResponse
{
ftCashBoxID = data.ftCashBoxID,
cbReceiptReference = data.cbReceiptReference,
cbTerminalID = data.cbTerminalID,
ftCashBoxIdentification = data.ftCashBoxIdentification,
ftChargeLines = data.ftChargeLines,
ftPayLines = data.ftPayLines,
ftQueueID = data.ftQueueID,
ftQueueItemID = data.ftQueueItemID,
ftQueueRow = data.ftQueueRow,
ftReceiptFooter = data.ftReceiptFooter,
ftReceiptHeader = data.ftReceiptHeader,
ftReceiptIdentification = data.ftReceiptIdentification,
ftReceiptMoment = data.ftReceiptMoment,
ftState = data.ftState,
ftStateData = data.ftStateData,
ftChargeItems = data.ftChargeItems?.Select(ConvertToV0).ToArray(),
ftPayItems = data.ftPayItems?.Select(ConvertToV0).ToArray(),
ftSignatures = data.ftSignatures?.Select(ConvertToV0).ToArray(),
};
}

public static ifPOS.v0.SignaturItem ConvertToV0(SignaturItem data)
{
return new ifPOS.v0.SignaturItem
{
Caption = data.Caption,
Data = data.Data,
ftSignatureFormat = data.ftSignatureFormat,
ftSignatureType = data.ftSignatureType
};
}

public static SignaturItem ConvertToV1(ifPOS.v0.SignaturItem data)
{
return new SignaturItem
{
Caption = data.Caption,
Data = data.Data,
ftSignatureFormat = data.ftSignatureFormat,
ftSignatureType = data.ftSignatureType
};
}

public static ifPOS.v0.ChargeItem ConvertToV0(ChargeItem data)
{
return new ifPOS.v0.ChargeItem
{
AccountNumber = data.AccountNumber,
Amount = data.Amount,
CostCenter = data.CostCenter,
Description = data.Description,
ftChargeItemCase = data.ftChargeItemCase,
ftChargeItemCaseData = data.ftChargeItemCaseData,
Moment = data.Moment,
Position = data.Position,
ProductBarcode = data.ProductBarcode,
ProductGroup = data.ProductGroup,
ProductNumber = data.ProductNumber,
Quantity = data.Quantity,
Unit = data.Unit,
UnitPrice = data.UnitPrice,
UnitQuantity = data.UnitQuantity,
VATAmount = data.VATAmount,
VATRate = data.VATRate
};
}

public static ifPOS.v0.PayItem ConvertToV0(PayItem data)
{
return new ifPOS.v0.PayItem
{
AccountNumber = data.AccountNumber,
Amount = data.Amount,
CostCenter = data.CostCenter,
Description = data.Description,
ftPayItemCase = data.ftPayItemCase,
ftPayItemCaseData = data.ftPayItemCaseData,
Moment = data.Moment,
Position = data.Position,
MoneyGroup = data.MoneyGroup,
MoneyNumber = data.MoneyNumber,
Quantity = data.Quantity
};
}

public static string GetRequestVersion(ReceiptRequest data)
{
if (data.GetType() == typeof(ifPOS.v0.ReceiptRequest))
{
//TODO change on version update
return "v0";
}
else
{
var type = data.GetType().ToString();
var start = type.IndexOf(".ifPOS.") + 7;
var end = type.LastIndexOf('.');
if (start >= 7 && end >= 0)
{
return type.Substring(start, end - start);
}
else
{
return $"unknown:{type}";
}
}
}

public static string GetCountry(ReceiptRequest data)
{
return (0xFFFF000000000000 & (ulong)data.ftReceiptCase) switch
{
0x4445000000000000 => "DE",
0x4652000000000000 => "FR",
_ => "AT",
};
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ private async Task InitializeQueueAsync(PackageConfiguration packageConfig)
string url = _urlResolver.GetProtocolSpecificUrl(packageConfig);

var queueProvider = new SQLiteQueueProvider();
var pos = await Task.Run(() => queueProvider.CreatePOS(Environment.GetFolderPath(Environment.SpecialFolder.Personal), packageConfig, _cashboxId, _isSandbox, _logLevel, _scus));
var pos = await Task.Run(() => queueProvider.CreatePOS(Environment.GetFolderPath(Environment.SpecialFolder.Personal), packageConfig, _cashboxId, _accessToken, _isSandbox, _logLevel, _scus));
var host = _hostFactory.CreatePosHost();
_poss.Add(pos);
_hosts.Add(host);
Expand Down
Loading

0 comments on commit afc1a3c

Please sign in to comment.