diff --git a/WEBSERVICES/ZUGFeRDRESTService/Config.cs b/WEBSERVICES/ZUGFeRDRESTService/Config.cs index 599cc0d6..f9734783 100644 --- a/WEBSERVICES/ZUGFeRDRESTService/Config.cs +++ b/WEBSERVICES/ZUGFeRDRESTService/Config.cs @@ -1,15 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace ZUGFeRDRESTService +namespace ZUGFeRDRESTService { public class Config { public string Name { get; set; } public string LogPath { get; set; } - public string MSSQLConnectionString { get; set; } + + public FirebirdConfig Firebird { get; set; } } + + public class FirebirdConfig + { + public string Datasource { get; set; } + public string Database { get; set; } + public string Username { get; set; } + public string Password { get; set; } + } + } diff --git a/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationController.cs b/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationController.cs index 3c7e7446..8ebd726a 100644 --- a/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationController.cs +++ b/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationController.cs @@ -1,24 +1,24 @@ using System; using System.IO; using System.Linq; -using System.Threading.Tasks; using System.Collections.Generic; using Microsoft.AspNetCore.Http; 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; +using static DigitalData.Modules.Interfaces.PropertyValues; +using System.Data.SqlClient; +using DigitalData.Modules.Database; namespace ZUGFeRDRESTService.Controllers -{ +{ [Route("api/[controller]")] [ApiController] public class ValidationController : ControllerBase { - public static string RESPONSE_OK = "OK"; - public static string RESPONSE_ERROR = "ERROR"; + public const string RESPONSE_OK = "OK"; + public const string RESPONSE_ERROR = "ERROR"; private readonly ZUGFeRDInterface _zugferd; private readonly IDatabase _database; @@ -29,34 +29,6 @@ namespace ZUGFeRDRESTService.Controllers private readonly PropertyValues _props; private readonly Dictionary _propertyMap; - public class ValidationResponse - { - public string status; - public string message; - public List errors; - - public ValidationResponse() - { - status = RESPONSE_OK; - 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) { _logConfig = logging.LogConfig; @@ -81,15 +53,15 @@ namespace ZUGFeRDRESTService.Controllers /// /// 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) + public ValidationResponse Post(IFormFile file, string user_id) { - _logger.Debug("Start processing request to ValidationController"); + _logger.Debug("Start processing request to ValidationController"); object oDocument; PropertyValues.CheckPropertyValuesResult oResult = new PropertyValues.CheckPropertyValuesResult(); try - { + { using Stream oStream = file.OpenReadStream(); { _logger.Debug("Extracting ZUGFeRD Data from file [{0}]", file.FileName); @@ -101,19 +73,19 @@ namespace ZUGFeRDRESTService.Controllers oResult = _props.CheckPropertyValues(oDocument, _propertyMap, "MESSAGEID"); var oRequiredProperties = _propertyMap. - Where(prop => {return prop.Value.IsRequired == true;}). + Where(prop => { return prop.Value.IsRequired == true; }). Select(prop => { return prop.Value.Description; }) .ToList(); _logger.Debug("Found [{0}] required properties", oRequiredProperties.Count); - _logger.Debug(String.Join(",", oRequiredProperties.ToArray())); + _logger.Debug(string.Join(",", oRequiredProperties.ToArray())); _logger.Debug("Result of checking against the database: {0} valid properties, {1} missing properties", oResult.ValidProperties.Count, oResult.MissingProperties.Count); if (oResult.MissingProperties.Count > 0) { - throw new ZUGFeRDExecption(ZUGFeRDInterface.ErrorType.MissingProperties, + throw new ZUGFeRDExecption(ErrorType.MissingProperties, "Die hochgeladene Datei ist eine gültige ZUGFeRD-Rechnung, allerdings fehlen benötigte Daten."); } @@ -129,7 +101,7 @@ namespace ZUGFeRDRESTService.Controllers }; } catch (ZUGFeRDExecption ex) - { + { _logger.Error(ex); // Determine which message should be sent in the response @@ -172,7 +144,64 @@ namespace ZUGFeRDRESTService.Controllers status = RESPONSE_ERROR, message = oMessage }; - } + } } + + private Tuple ValidateBuyerOrderReference(Dictionary pPropertyMap, List pProperties) + { + + foreach (var oItem in pProperties) + { + var oResult = InsertPropertyMap(oItem); + + if (oResult == false) + { + _logger.Warn("Error while inserting the Property [{0}] into the Database!", oItem.Description); + } + } + + // TODO: Execute the Procedure. + // _database.MSSQL.ExecuteNonQuery(""); + + // TODO: Return a Status value which will be returned to the caller. + return new Tuple(true, ""); + } + + public bool InsertPropertyMap(ValidProperty pProperty) + { + try + { + var oCreator = "ZUGFeRD REST Service"; + var oDomain = "test.wisag.de"; + var oMessageId = $"{Guid.NewGuid()}@{oDomain}"; + + var oSql = $"INSERT INTO {pProperty.TableName} " + + "(REFERENCE_GUID, ITEM_DESCRIPTION, ITEM_VALUE, CREATEDWHO, SPEC_NAME, GROUP_COUNTER, IS_REQUIRED) VALUES " + + "(@REFERENCE_GUID, @ITEM_DESCRIPTION, @ITEM_VALUE, @CREATEDWHO, @SPEC_NAME, @GROUP_COUNTER, @IS_REQUIRED)"; + + var oParams = new SqlParameter[] + { + new SqlParameter("@REFERENCE_GUID", oMessageId), + new SqlParameter("@ITEM_DESCRIPTION", pProperty.Description), + new SqlParameter("@ITEM_VALUE", pProperty.Value), + new SqlParameter("@CREATEDWHO", oCreator), + new SqlParameter("@GROUP_COUNTER", pProperty.GroupCounter), + new SqlParameter("@SPEC_NAME", pProperty.TableColumn), + new SqlParameter("@IS_REQUIRED", pProperty.ISRequired) + }; + + var oCommand = new SqlCommand(oSql); + oCommand.Parameters.AddRange(oParams); + + + return _database.MSSQL.ExecuteNonQuery(oCommand); + } + catch (Exception ex) + { + _logger.Error(ex); + return false; + } + } + } } diff --git a/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationResponse.cs b/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationResponse.cs new file mode 100644 index 00000000..5acbe493 --- /dev/null +++ b/WEBSERVICES/ZUGFeRDRESTService/Controllers/ValidationResponse.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace ZUGFeRDRESTService.Controllers +{ + + public class ValidationResponse + { + public string status; + public string message; + public List errors; + + public ValidationResponse() + { + status = ValidationController.RESPONSE_OK; + 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; + } + } +} diff --git a/WEBSERVICES/ZUGFeRDRESTService/Database.cs b/WEBSERVICES/ZUGFeRDRESTService/Database.cs index 4278058b..b566a324 100644 --- a/WEBSERVICES/ZUGFeRDRESTService/Database.cs +++ b/WEBSERVICES/ZUGFeRDRESTService/Database.cs @@ -1,18 +1,21 @@ using System; using System.Collections.Generic; using System.Data; +using System.Data.SqlClient; using System.Linq; using System.Threading.Tasks; using DigitalData.Modules.Database; using DigitalData.Modules.Interfaces; +using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; namespace ZUGFeRDRESTService { public class Database: IDatabase { private string _gdPictureKey = null; - private Dictionary _propertyMap = null; + private Dictionary _propertyMap = null; private const string QUERY_GET_GDPICTURE_KEY = "SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE'"; private const string QUERY_GET_PROPERTY_MAP = "SELECT * FROM TBEDM_XML_ITEMS WHERE SPECIFICATION = '{0}' AND ACTIVE = True ORDER BY XML_PATH"; @@ -20,15 +23,28 @@ namespace ZUGFeRDRESTService public MSSQLServer MSSQL { get; set; } public Firebird Firebird { get; set; } - public Database(ILogging Logging, IConfiguration Config) + public Database(ILogging Logging, IConfiguration Config, IOptions Options) { var LogConfig = Logging.LogConfig; var Logger = Logging.LogConfig.GetLogger(); - var AppConfig = Config.GetSection("Config"); - var FBConfig = AppConfig.GetSection("Firebird"); + var FirebirdConfig = Options.Value.Firebird; - MSSQL = new MSSQLServer(LogConfig, AppConfig["MSSQLConnectionString"]); - Firebird = new Firebird(LogConfig, FBConfig["Datasource"], FBConfig["Database"], FBConfig["Username"], FBConfig["Password"]); + // var AppConfig = Config.GetSection("Config"); + // var FBConfig = AppConfig.GetSection("Firebird"); + + + Logger.Debug("Establishing MSSQL Database connection.."); + MSSQL = new MSSQLServer(LogConfig, Options.Value.MSSQLConnectionString); + + Logger.Debug("Establishing Firebird Database connection.."); + Firebird = new Firebird(LogConfig, + FirebirdConfig.Datasource, + FirebirdConfig.Database, + FirebirdConfig.Username, + FirebirdConfig.Password); + + // MSSQL = new MSSQLServer(LogConfig, AppConfig["MSSQLConnectionString"]); + // Firebird = new Firebird(LogConfig, FBConfig["Datasource"], FBConfig["Database"], FBConfig["Username"], FBConfig["Password"]); Logger.Debug("MSSQL Connection: [{0}]", MSSQL.CurrentConnectionString); Logger.Debug("Firebird Connection: [{0}]", Firebird.ConnectionString);