diff --git a/Modules.Interfaces/ZUGFeRDInterface.vb b/Modules.Interfaces/ZUGFeRDInterface.vb index d324fa15..fbdd34aa 100644 --- a/Modules.Interfaces/ZUGFeRDInterface.vb +++ b/Modules.Interfaces/ZUGFeRDInterface.vb @@ -18,6 +18,7 @@ Public Class ZUGFeRDInterface NoValidFile NoZugferd NoValidZugferd + MissingProperties End Enum Public ReadOnly Property FileGroup As FileGroups @@ -130,7 +131,7 @@ Public Class ZUGFeRDInterface Dim oFoundResult As PDFAttachments.AttachmentResult = Nothing For Each oResult In oResults - If oResult.FileName = PDFAttachments.ZUGFERD_XML_FILENAME Then + If oResult.FileName.ToUpper() = PDFAttachments.ZUGFERD_XML_FILENAME.ToUpper() Then oFound = True oFoundResult = oResult End If diff --git a/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationController.cs b/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationController.cs index 91ff5730..90565c26 100644 --- a/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationController.cs +++ b/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationController.cs @@ -8,6 +8,8 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using DigitalData.Modules.Interfaces; using DigitalData.Modules.Logging; +using static DigitalData.Modules.Interfaces.Exceptions; +using static DigitalData.Modules.Interfaces.ZUGFeRDInterface; namespace ZUGFeRDRESTService.Controllers { @@ -39,6 +41,20 @@ namespace ZUGFeRDRESTService.Controllers message = String.Empty; errors = new List(); } + + public ValidationResponse(string Status, string Message) + { + status = Status; + message = Message; + errors = new List(); + } + + public ValidationResponse(string Status, string Message, List Errors) + { + status = Status; + message = Message; + errors = Errors; + } } public ValidationController(ILogging logging, IDatabase database) @@ -61,50 +77,78 @@ namespace ZUGFeRDRESTService.Controllers } /// - /// POST: api/Validation + /// POST: /api/Validation /// /// This parameter's name needs to correspond to the html form's file-input name [HttpPost] public async Task Post(IFormFile file, string user_id) { - string oFilePath; - string oFileName; + _logger.Debug("Start processing request to ValidationController"); - oFilePath = Path.Combine(Path.GetTempPath(), file.FileName); - oFileName = file.FileName; + string oFilePath = Path.Combine(Path.GetTempPath(), file.FileName); + + _logger.Debug("Saving file to temp-path [{0}]", oFilePath); using FileStream oStream = new FileStream(oFilePath, FileMode.Create); await file.CopyToAsync(oStream); + // TODO: Delete temp file / Do we even need the temp file? + + _logger.Debug("File successfully saved!"); + CrossIndustryDocumentType oDocument; + PropertyValues.CheckPropertyValuesResult oResult = new PropertyValues.CheckPropertyValuesResult(); try { + _logger.Debug("Extracting ZUGFeRD Data from file [{0}]", oFilePath); + oDocument = _zugferd.ExtractZUGFeRDFileWithGDPicture(oFilePath); - } - catch (Exception ex) - { - _logger.Error(ex); - return new ValidationResponse() - { - status = RESPONSE_ERROR, - message = "The uploaded file is not a valid ZUGFeRD Invoice!" - }; - } - try - { - PropertyValues.CheckPropertyValuesResult oResult = _props.CheckPropertyValues(oDocument, _propertyMap, "MESSAGEID"); + _logger.Debug("Checking ZUGFeRD Data against the database"); - if (oResult.MissingProperties.Count > 0) - { - return new ValidationResponse() - { - status = RESPONSE_ERROR, - message = "The uploaded file is a valid ZUGFeRD Invoice but missing some properties!", - errors = oResult.MissingProperties - }; + oResult = _props.CheckPropertyValues(oDocument, _propertyMap, "MESSAGEID"); + + _logger.Debug("Result of checking against the database: {0} valid properties, {1} missing properties", oResult.ValidProperties, oResult.MissingProperties); + + if (oResult.MissingProperties.Count > 0) { + throw new ZUGFeRDExecption(ZUGFeRDInterface.ErrorType.MissingProperties, + "Die hochgeladene Datei ist eine gültige ZUGFeRD-Rechnung, allerdings fehlen benötigte Daten."); } + + return new ValidationResponse() + { + status = RESPONSE_OK, + message = "Die hochgeladene Datei ist eine gültige-ZUGFeRD Rechnung" + }; + } + catch (ZUGFeRDExecption ex) + { + _logger.Error(ex); + + // Determine which message should be sent in the response + string oMessage = ex.ErrorType switch + { + ErrorType.NoValidFile => "Die hochgeladene Datei ist keine gültige Datei.", + ErrorType.NoZugferd => "Die hochgeladene Datei ist keine ZUGFeRD-Rechnung.", + ErrorType.NoValidZugferd => "Die hochgeladene Datei ist keine gültige ZUGFeRD-Rechnung.", + ErrorType.MissingProperties => "Die hochgeladene Datei ist eine gültige ZUGFeRD-Rechnung, jedoch fehlen einige Metadaten", + _ => "Die hochgeladene Datei kann nicht validiert werden.", + }; + + // Determine if any errors should be sent in the response + List oErrors = ex.ErrorType switch + { + // Errors contains the list of missing fields + ErrorType.MissingProperties => oResult.MissingProperties, + _ => new List() + }; + + return new ValidationResponse() + { + status = RESPONSE_ERROR, + message = oMessage + }; } catch (Exception ex) { @@ -112,15 +156,9 @@ namespace ZUGFeRDRESTService.Controllers return new ValidationResponse() { status = RESPONSE_ERROR, - message = "The uploaded file is not a valid ZUGFeRD Invoice!" + message = "Die hochgeladene Datei kann nicht validiert werden!" }; - } - - return new ValidationResponse() - { - status = RESPONSE_OK, - message = "The uploaded files is a valid ZUGFeRD Invoice!" - }; + } } } }