diff --git a/queue/src/fiskaltrust.Middleware.Localization.QueueIT/v2/ProtocolCommandProcessorIT.cs b/queue/src/fiskaltrust.Middleware.Localization.QueueIT/v2/ProtocolCommandProcessorIT.cs index ee469ddbc..27b32b1a7 100644 --- a/queue/src/fiskaltrust.Middleware.Localization.QueueIT/v2/ProtocolCommandProcessorIT.cs +++ b/queue/src/fiskaltrust.Middleware.Localization.QueueIT/v2/ProtocolCommandProcessorIT.cs @@ -58,7 +58,8 @@ public async Task ProcessReceiptAsync(ProcessCommandRequ public async Task ProtocolUnspecified0x3000Async(ProcessCommandRequest request) { - if ((request.ReceiptRequest.ftReceiptCase & 0x0000_0002_0000_0000) != 0) + if ((request.ReceiptRequest.ftReceiptCase & 0x0000_0002_0000_0000) != 0 + || (request.ReceiptRequest.ftReceiptCase & 0x0000_0000_0400_0000) != 0) { var (queue, queueIT, receiptRequest, receiptResponse, queueItem) = request; try diff --git a/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/ReceiptCaseHelper.cs b/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/ReceiptCaseHelper.cs index cd45fab99..6f72f5c1e 100644 --- a/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/ReceiptCaseHelper.cs +++ b/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/ReceiptCaseHelper.cs @@ -19,6 +19,8 @@ public static class ReceiptCaseHelper public static bool IsReprint(this ReceiptRequest request) => (request.ftReceiptCase & 0x0000_0000_0000_FFFF) == (long) ITReceiptCases.Reprint0x3010; + public static bool IsRebootPrinter(this ReceiptRequest receiptRequest) => (receiptRequest.ftReceiptCase & 0x0000_0000_0400_0000) > 0x0000; + public static bool IsZeroReceipt(this ReceiptRequest request) => (request.ftReceiptCase & 0x0000_0000_0000_FFFF) == (long) ITReceiptCases.ZeroReceipt0x2000; public static bool IsOutOfOperationReceipt(this ReceiptRequest request) => (request.ftReceiptCase & 0x0000_0000_0000_FFFF) == (long) ITReceiptCases.OutOfOperationReceipt0x4002; diff --git a/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/SignatureFactory.cs b/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/SignatureFactory.cs index 8144f04bc..00c498964 100644 --- a/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/SignatureFactory.cs +++ b/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/SignatureFactory.cs @@ -65,6 +65,17 @@ public static SignaturItem[] CreateVoucherSignatures(NonFiscalRequest nonFiscalR return signs.ToArray(); } + public static SignaturItem[] CreateRebootPrinterCommandSignatures() => new SignaturItem[] + { + new SignaturItem + { + Caption = "reboot-printer-command", + Data = "Printer web server reboot initiated.", + ftSignatureFormat = (long) SignaturItem.Formats.Text, + ftSignatureType = ITConstants.BASE_STATE | (long) SignatureTypesIT.RTCommand + } + }; + public static List CreateDocumentoCommercialeSignatures(POSReceiptSignatureData data) { var signatureItems = new List() diff --git a/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/SignatureTypesIT.cs b/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/SignatureTypesIT.cs index 26d252ac9..cd2f749ba 100644 --- a/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/SignatureTypesIT.cs +++ b/scu-it/src/fiskaltrust.Middleware.SCU.IT.Abstraction/SignatureTypesIT.cs @@ -16,5 +16,6 @@ public enum SignatureTypesIT RTReferenceZNumber = 0x20, RTReferenceDocumentNumber = 0x21, - RTReferenceDocumentMoment = 0x22 + RTReferenceDocumentMoment = 0x22, + RTCommand = 0x23 } \ No newline at end of file diff --git a/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/EpsonRTPrinterSCU.cs b/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/EpsonRTPrinterSCU.cs index 92dd95629..0240dc1ab 100644 --- a/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/EpsonRTPrinterSCU.cs +++ b/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/EpsonRTPrinterSCU.cs @@ -113,6 +113,11 @@ public override async Task ProcessReceiptAsync(ProcessRequest r return await ProcessPerformReprint(request); } + if (request.ReceiptRequest.IsRebootPrinter()) + { + return await ProcessRebootPrinterCommand(request); + } + if (receiptCase == (long) ITReceiptCases.ProtocolUnspecified0x3000 && ((request.ReceiptRequest.ftReceiptCase & 0x0000_0002_0000_0000) != 0)) { return await ProcessUnspecifiedProtocolReceipt(request); @@ -620,6 +625,35 @@ private async Task ProcessVoidReceipt(ProcessRequest request) } } + private async Task ProcessRebootPrinterCommand(ProcessRequest request) + { + try + { + await ResetPrinter(); + var rebootCommand = new PrinterCommand() { DirectIO = DirectIO.GetRestartPrinterCommand() }; + var xml = SoapSerializer.Serialize(rebootCommand); + + var response = await _httpClient.SendCommandAsync(xml, noStatus: true); + using var responseContent = await response.Content.ReadAsStreamAsync(); + var result = SoapSerializer.DeserializeToSoapEnvelope(responseContent); + if (result?.Success == false) + { + var error = GetErrorInfo(result.Code, result.Status, null); + request.ReceiptResponse.SetReceiptResponseErrored(error.Info); + return new ProcessResponse { ReceiptResponse = request.ReceiptResponse }; + } + + request.ReceiptResponse.ftSignatures = SignatureFactory.CreateRebootPrinterCommandSignatures(); + return new ProcessResponse { ReceiptResponse = request.ReceiptResponse }; + } + catch (Exception e) + { + var errorInfo = Helpers.ExceptionInfo(e); + request.ReceiptResponse.SetReceiptResponseErrored(errorInfo.SSCDErrorInfo?.Info ?? ""); + return new ProcessResponse { ReceiptResponse = request.ReceiptResponse }; + } + } + private async Task GetSerialNumberAsync(string rtType) { var serialQuery = new PrinterCommand() { DirectIO = DirectIO.GetSerialNrCommand() }; diff --git a/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/IEpsonFpMateClient.cs b/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/IEpsonFpMateClient.cs index 19fc38e81..103ec01ee 100644 --- a/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/IEpsonFpMateClient.cs +++ b/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/IEpsonFpMateClient.cs @@ -6,4 +6,5 @@ namespace fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter; public interface IEpsonFpMateClient { Task SendCommandAsync(string payload); + Task SendCommandAsync(string payload, bool noStatus); } diff --git a/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/LocalEpsonFpMateClient.cs b/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/LocalEpsonFpMateClient.cs index d02916e23..4f964eeaf 100644 --- a/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/LocalEpsonFpMateClient.cs +++ b/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/LocalEpsonFpMateClient.cs @@ -33,4 +33,15 @@ public async Task SendCommandAsync(string content) } return response; } + + public async Task SendCommandAsync(string content, bool noStatus) + { + var url = noStatus ? _commandUrl + "&directio_no_status=1" : _commandUrl; + var response = await _httpClient.PostAsync(url, new StringContent(content, Encoding.UTF8, "application/xml")); + if (!response.IsSuccessStatusCode) + { + throw new HttpRequestException($"An error occured while sending a request to the Epson device (StatusCode: {response.StatusCode}, Content: {await response.Content.ReadAsStringAsync()})"); + } + return response; + } } \ No newline at end of file diff --git a/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/Models/PrinterCommand.cs b/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/Models/PrinterCommand.cs index bd85374f2..ee80f137e 100644 --- a/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/Models/PrinterCommand.cs +++ b/scu-it/src/fiskaltrust.Middleware.SCU.IT.EpsonRTPrinter/Models/PrinterCommand.cs @@ -10,6 +10,7 @@ public class PrinterCommand [XmlElement(ElementName = "directIO")] public DirectIO? DirectIO { get; set; } + } [XmlType("resetPrinter")] @@ -29,6 +30,7 @@ public class DirectIO public string? Data { get; set; } public static DirectIO GetSerialNrCommand() => new() { Command = "3217", Data = "00" }; + public static DirectIO GetRestartPrinterCommand() => new() { Command = "4034", Data = "0198" }; } [XmlType("response")] @@ -56,4 +58,5 @@ public class CommandResponse [XmlElement(ElementName = "responseData")] public string? ResponseData { get; set; } } + }