diff --git a/.gitignore b/.gitignore index f32a2bf..69bbf6e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ artifacts/ **/bin/ **/obj/ **/.vs/ +**/*.lscache diff --git a/HOWTO_01_Payment_csharp/Program.cs b/HOWTO_01_Payment_csharp/Program.cs index 89e610f..36c8ae6 100644 --- a/HOWTO_01_Payment_csharp/Program.cs +++ b/HOWTO_01_Payment_csharp/Program.cs @@ -20,6 +20,11 @@ static async Task Main(string[] args) { Logger.LogInfo("fiskaltrust POS System API initialized successfully."); + Console.WriteLine("Please enter cbTerminalID to use (press ENTER for default 'term1'):"); + string cbTerminalIDInput = Console.ReadLine() ?? string.Empty; + string cbTerminalID = string.IsNullOrWhiteSpace(cbTerminalIDInput) ? "term1" : cbTerminalIDInput.Trim(); + Logger.LogInfo($"Using cbTerminalID: {cbTerminalID}"); + ///////////////////////////////////////////////////////////////////////////////////////////////// // execute a simple payment Console.WriteLine("\n--- Simple Payment Example ---\n"); @@ -60,7 +65,7 @@ static async Task Main(string[] args) // execute the payment // - with with defined amount // - allow the target device to select the payment protocol (= use_auto; see payment config in target device / InStore App) - // - the terminal ID is not defined here (null) so the request will be processed by all available terminals for the cashbox + // - the terminal ID is defined here ("term1") so the request will be processed by the specified terminal (if the terminal is configured also with a terminal ID) // IMPORTANT: In a real setup you might want to define a specific terminal ID here to target a specific payment terminal device; especially when multiple payment terminals are registered for the same cashbox! // - we provide the operation ID to be able to retry in case of failure var payItemRequest = new PayItemRequest @@ -68,7 +73,7 @@ static async Task Main(string[] args) Description = "Card", Amount = amount, }; - ExecutedResult payResult = await ftPosAPI.Pay.PaymentAsync(payItemRequest, fiskaltrust.Payment.DTO.PaymentProtocol.use_auto, null, operationId); + ExecutedResult payResult = await ftPosAPI.Pay.PaymentAsync(payItemRequest, fiskaltrust.Payment.DTO.PaymentProtocol.use_auto, cbTerminalID, operationId); ///////////////////////////////////////////////////////////////////////////////////////////////// // Check Result diff --git a/HOWTO_08_pay_sign_issue_csharp/Program.cs b/HOWTO_08_pay_sign_issue_csharp/Program.cs index 086d697..5df51a7 100644 --- a/HOWTO_08_pay_sign_issue_csharp/Program.cs +++ b/HOWTO_08_pay_sign_issue_csharp/Program.cs @@ -23,6 +23,11 @@ static async Task Main(string[] args) { Logger.LogInfo("fiskaltrust POS System API initialized successfully."); + Console.WriteLine("Please enter cbTerminalID to use (press ENTER for default 'term1'):"); + string cbTerminalIDInput = Console.ReadLine() ?? string.Empty; + string cbTerminalID = string.IsNullOrWhiteSpace(cbTerminalIDInput) ? "term1" : cbTerminalIDInput.Trim(); + Logger.LogInfo($"Using cbTerminalID: {cbTerminalID}"); + /////////////////////////////////////////////////////////////////////////////////////////////////////// /// Create the "dummy" charge items List chargeItems = new List() @@ -63,7 +68,7 @@ static async Task Main(string[] args) (PayResponse? pResp, string errorMsg) = await payRunner.Execute(async () => { - return await ftPosAPI.Pay.PaymentAsync(payRequest, PaymentProtocol.use_auto, null, payRunner.OperationID); + return await ftPosAPI.Pay.PaymentAsync(payRequest, PaymentProtocol.use_auto, cbTerminalID, payRunner.OperationID); }); if (pResp == null) @@ -89,6 +94,7 @@ static async Task Main(string[] args) .SetCountry("AT") // Austria .SetReceiptCase(ReceiptCase.PointOfSaleReceipt0x0001); ReceiptRequest receiptRequest = new ReceiptRequest(receiptReference, receiptCaseBuilder, chargeItems, pResp.ftPayItems); + receiptRequest.cbTerminalID = cbTerminalID; receiptRequest.ftReceiptCaseData = new FtReceiptCaseData { cbReceiptLines = new string[] @@ -154,7 +160,7 @@ static async Task Main(string[] args) if (isDelivered) { Logger.LogInfo("Receipt has been delivered successfully."); - Logger.LogDebug($"Delivery details - {deliveryDateils.state}: {deliveryDateils.message}"); + Logger.LogDebug($"Delivery details - {deliveryDateils?.Message}"); } else { diff --git a/libPosSystemAPI/DTO/IssueDeliveredResponse.cs b/libPosSystemAPI/DTO/IssueDeliveredResponse.cs index fdaab4e..44c6da0 100644 --- a/libPosSystemAPI/DTO/IssueDeliveredResponse.cs +++ b/libPosSystemAPI/DTO/IssueDeliveredResponse.cs @@ -1,11 +1,24 @@ -namespace fiskaltrust.DevKit.POSSystemAPI.lib.DTO +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace fiskaltrust.DevKit.POSSystemAPI.lib.DTO { /// /// Provides some details about how the delivery was executed for debug purpose. /// public class IssueDeliveredResponse { - public string state { get; set; } = string.Empty; - public string message { get; set; } = string.Empty; - } + /// + /// A message describing how the delivery was executed. + /// + /// ""Receipt was printed at 01/30/2026 00:03:57. DeliveryMethod: customeraccepted" + [JsonPropertyName("message")] + public string Message { get; set; } = string.Empty; + + /// + /// Additional arbitrary properties that will be serialized as top-level JSON fields + /// alongside the known properties. + /// + [JsonExtensionData] + public Dictionary? AdditionalProperties { get; set; } } } diff --git a/libPosSystemAPI/DTO/PaymentRequest.cs b/libPosSystemAPI/DTO/PaymentRequest.cs index 29d90da..3e6aece 100644 --- a/libPosSystemAPI/DTO/PaymentRequest.cs +++ b/libPosSystemAPI/DTO/PaymentRequest.cs @@ -19,11 +19,14 @@ public class PaymentRequest : IJsonContentConverter [JsonIgnore(Condition = JsonIgnoreCondition.Never)] // required so even if it has default value it must be included public required PayItemRequest cbPayItem { get; set; } - public string? cbTerminalId { get; set; } + /// + /// Allows to identify a specific target device/terminal or group that should process the request. + /// + public string? cbTerminalID { get; set; } public JsonContent ToJsonContent() { - if (string.IsNullOrEmpty(cbTerminalId)) cbTerminalId = null; + if (string.IsNullOrEmpty(cbTerminalID)) cbTerminalID = null; return JsonContent.Create(this, options: JsonConfiguration.DefaultOptions); } } diff --git a/libPosSystemAPI/DTO/ReceiptRequest.cs b/libPosSystemAPI/DTO/ReceiptRequest.cs index a6c96f8..2f33d74 100644 --- a/libPosSystemAPI/DTO/ReceiptRequest.cs +++ b/libPosSystemAPI/DTO/ReceiptRequest.cs @@ -85,17 +85,14 @@ public JsonContent ToJsonContent() return JsonContent.Create(this, options: JsonConfiguration.DefaultOptions); } - /* - [JsonProperty("cbTerminalID", DefaultValueHandling = DefaultValueHandling.Ignore)] + /// + /// Allows to identify a specific target device/terminal or group that should process the request. + /// [JsonPropertyName("cbTerminalID")] [System.Text.Json.Serialization.JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public string? cbTerminalID { get; set; } - - - - - + /* [JsonProperty("ftCashBoxID", DefaultValueHandling = DefaultValueHandling.Ignore)] [JsonPropertyName("ftCashBoxID")] [System.Text.Json.Serialization.JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] diff --git a/libPosSystemAPI/DTO/RefundCancelRequest.cs b/libPosSystemAPI/DTO/RefundCancelRequest.cs index 2cb5147..df2ef06 100644 --- a/libPosSystemAPI/DTO/RefundCancelRequest.cs +++ b/libPosSystemAPI/DTO/RefundCancelRequest.cs @@ -17,11 +17,14 @@ internal class RefundCancelRequest : IJsonContentConverter [JsonIgnore(Condition = JsonIgnoreCondition.Never)] // required so even if it has default value it must be included public required PayItem cbPayItem { get; set; } - public string? cbTerminalId { get; set; } + /// + /// Allows to identify a specific target device/terminal or group that should process the request. + /// + public string? cbTerminalID { get; set; } public JsonContent ToJsonContent() { - if (string.IsNullOrEmpty(cbTerminalId)) cbTerminalId = null; + if (string.IsNullOrEmpty(cbTerminalID)) cbTerminalID = null; return JsonContent.Create(this, options: JsonConfiguration.DefaultOptions); } } diff --git a/libPosSystemAPI/PosAPIClient/PosAPIPay.cs b/libPosSystemAPI/PosAPIClient/PosAPIPay.cs index b2bf589..2e92d1e 100644 --- a/libPosSystemAPI/PosAPIClient/PosAPIPay.cs +++ b/libPosSystemAPI/PosAPIClient/PosAPIPay.cs @@ -23,7 +23,7 @@ public class PosAPIPay /// See https://docs.fiskaltrust.cloud/apis/pos-system-api about the meaning of the operation / operationID /// /// - public async Task> PaymentAsync(PayItemRequest cbPayItem, PaymentProtocol protocol = PaymentProtocol.use_auto, string? terminalID = null, Guid? operationId = null) + public async Task> PaymentAsync(PayItemRequest cbPayItem, PaymentProtocol protocol = PaymentProtocol.use_auto, string? terminalID = "term1", Guid? operationId = null) { // https://docs.fiskaltrust.cloud/apis/pos-system-api#tag/SynchronAPI/paths/~1pay/post @@ -32,7 +32,7 @@ public async Task> PaymentAsync(PayItemRequest cbPay Action = PayAction.payment, Protocol = protocol, cbPayItem = cbPayItem, - cbTerminalId = terminalID, + cbTerminalID = terminalID, }; var rBuilder = new APIRequestBuilder() .SetMethod(HttpMethod.Post) diff --git a/libPosSystemAPI/ftPosAPIRunner.cs b/libPosSystemAPI/ftPosAPIRunner.cs index 0837962..67a6f07 100644 --- a/libPosSystemAPI/ftPosAPIRunner.cs +++ b/libPosSystemAPI/ftPosAPIRunner.cs @@ -50,7 +50,7 @@ internal override APIRequestBuilder Build() Action = PayAction.payment, Protocol = this._protocol, cbPayItem = this._payItem, - cbTerminalId = this._terminalID, + cbTerminalID = this._terminalID, }; var rBuilder = new APIRequestBuilder() .SetMethod(HttpMethod.Post)