-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
580be66
commit afc1a3c
Showing
7 changed files
with
380 additions
and
3 deletions.
There are no files selected for viewing
82 changes: 82 additions & 0 deletions
82
src/fiskaltrust.AndroidLauncher.Common/PosApiPrint/PosApiHelper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} | ||
} |
49 changes: 49 additions & 0 deletions
49
src/fiskaltrust.AndroidLauncher.Common/PosApiPrint/PosApiProvider.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
11
src/fiskaltrust.AndroidLauncher.Common/PosApiPrint/PrintRequest.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; } | ||
} | ||
} |
221 changes: 221 additions & 0 deletions
221
src/fiskaltrust.AndroidLauncher.Common/PosApiPrint/ReceiptRequestHelper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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", | ||
}; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.