diff --git a/Archive/ApiControllers/AttachmentsController.cs b/Archive/ApiControllers/AttachmentsController.cs index 9a23955..1d4a7d4 100644 --- a/Archive/ApiControllers/AttachmentsController.cs +++ b/Archive/ApiControllers/AttachmentsController.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; using System; using System.IO; @@ -8,13 +8,13 @@ using System.IO; namespace OI.Metrology.Archive.ApiControllers; public class AttachmentsController : Controller { - private readonly IMetrologyRepo _Repo; private readonly IAttachmentsService _AttachmentsService; + private readonly IMetrologyRepository _MetrologyRepository; - public AttachmentsController(IMetrologyRepo repo, IAttachmentsService attachmentsService) + public AttachmentsController(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService) { - _Repo = repo; _AttachmentsService = attachmentsService; + _MetrologyRepository = metrologyRepository; } // this endpoint was created in hope that it would make retrieving attachments to display in OpenInsight easier @@ -27,7 +27,7 @@ public class AttachmentsController : Controller string title, string filename) { - ToolType tt = _Repo.GetToolTypeByName(toolTypeName); + ToolType tt = _MetrologyRepository.GetToolTypeByName(toolTypeName); bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase); diff --git a/Archive/ApiControllers/AwaitingDispoController.cs b/Archive/ApiControllers/AwaitingDispoController.cs index 73ca5a3..981a1ea 100644 --- a/Archive/ApiControllers/AwaitingDispoController.cs +++ b/Archive/ApiControllers/AwaitingDispoController.cs @@ -1,17 +1,17 @@ using Microsoft.AspNetCore.Mvc; -namespace OI.Metrology.Archive.ApiContollers; +namespace OI.Metrology.Archive.ApiControllers; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using System.Text.Json; // this controller is for the Awaiting Dispo functionality public class AwaitingDispoController : Controller { - private readonly IMetrologyRepo _Repo; + private readonly IMetrologyRepository _MetrologyRepository; - public AwaitingDispoController(IMetrologyRepo repo) => _Repo = repo; + public AwaitingDispoController(IMetrologyRepository metrologyRepository) => _MetrologyRepository = metrologyRepository; // returns the data to show in the Awaiting Dispo grid // marked no-cache, just-in-case since igniteUI automatically adds a query string parameter to prevent caching @@ -21,7 +21,7 @@ public class AwaitingDispoController : Controller { var r = new { - Results = _Repo.GetAwaitingDispo() + Results = _MetrologyRepository.GetAwaitingDispo() }; return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); } @@ -30,7 +30,7 @@ public class AwaitingDispoController : Controller [HttpPost("/api/awaitingdispo/markasreviewed")] public IActionResult MarkAsReviewed([FromQuery] long headerid, [FromQuery] int tooltypeid) { - _ = _Repo.UpdateReviewDate(tooltypeid, headerid, false); + _ = _MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, false); return Ok(); } @@ -38,7 +38,7 @@ public class AwaitingDispoController : Controller [HttpPost("/api/awaitingdispo/markasawaiting")] public IActionResult MarkAsAwaiting([FromQuery] long headerid, [FromQuery] int tooltypeid) { - if (_Repo.UpdateReviewDate(tooltypeid, headerid, true) <= 1) + if (_MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, true) <= 1) return Ok(); else return StatusCode(444); diff --git a/Archive/ApiControllers/InboundController.cs b/Archive/ApiControllers/InboundController.cs index a89ff44..51d947a 100644 --- a/Archive/ApiControllers/InboundController.cs +++ b/Archive/ApiControllers/InboundController.cs @@ -4,30 +4,30 @@ using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using OI.Metrology.Archive.Models; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; using System; using System.Collections.Generic; using System.Linq; -namespace OI.Metrology.Archive.ApiContollers; +namespace OI.Metrology.Archive.ApiControllers; [ApiController] public class InboundController : ControllerBase { private readonly ILogger _Logger; - private readonly IMetrologyRepo _Repo; private readonly AppSettings _AppSettings; private readonly IAttachmentsService _AttachmentService; private readonly IInboundDataService _InboundDataService; + private readonly IMetrologyRepository _MetrologyRepository; - public InboundController(AppSettings appSettings, ILogger logger, IMetrologyRepo repo, IInboundDataService inboundDataService, IAttachmentsService attachmentService) + public InboundController(AppSettings appSettings, ILogger logger, IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, IAttachmentsService attachmentService) { - _Repo = repo; _Logger = logger; _AppSettings = appSettings; _AttachmentService = attachmentService; _InboundDataService = inboundDataService; + _MetrologyRepository = metrologyRepository; } // this class represents the API response back to the client @@ -61,9 +61,9 @@ public class InboundController : ControllerBase return Unauthorized(r); } - ToolType toolType = _Repo.GetToolTypeByName(tooltype); + ToolType toolType = _MetrologyRepository.GetToolTypeByName(tooltype); - if (toolType == null) + if (toolType is null) { r.Errors.Add("Invalid tool type: " + tooltype); return BadRequest(r); @@ -71,9 +71,9 @@ public class InboundController : ControllerBase // get metadata - List metaData = _Repo.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList(); + List metaData = _MetrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList(); - if (metaData == null) + if (metaData is null) { r.Errors.Add("Invalid metadata for tool type: " + tooltype); return BadRequest(r); @@ -81,7 +81,7 @@ public class InboundController : ControllerBase // validate fields - if (jsonbody != null) + if (jsonbody is not null) _InboundDataService.ValidateJSONFields(jsonbody, 0, metaData, r.Errors, r.Warnings); else r.Errors.Add("Invalid json"); @@ -118,12 +118,12 @@ public class InboundController : ControllerBase return Unauthorized("Remote IP is not on allowed list"); } - ToolType toolType = _Repo.GetToolTypeByName(tooltype); + ToolType toolType = _MetrologyRepository.GetToolTypeByName(tooltype); - if (toolType == null) + if (toolType is null) return BadRequest($"Invalid tool type: {tooltype}"); - if (Request.Form == null) + if (Request.Form is null) return BadRequest($"Invalid form"); if (Request.Form.Files.Count != 1) diff --git a/Archive/ApiControllers/ReactorsController.cs b/Archive/ApiControllers/ReactorsController.cs index 7707cfb..9309292 100644 --- a/Archive/ApiControllers/ReactorsController.cs +++ b/Archive/ApiControllers/ReactorsController.cs @@ -1,22 +1,22 @@ using Microsoft.AspNetCore.Mvc; using System.Linq; -namespace OI.Metrology.Archive.ApiContollers; +namespace OI.Metrology.Archive.ApiControllers; using OI.Metrology.Archive.Models; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using System.Text.Json; public class ReactorsController : Controller { - private readonly IMetrologyRepo _Repo; private readonly AppSettings _AppSettings; + private readonly IMetrologyRepository _MetrologyRepository; - public ReactorsController(AppSettings appSettings, IMetrologyRepo repo) + public ReactorsController(AppSettings appSettings, IMetrologyRepository metrologyRepository) { - _Repo = repo; _AppSettings = appSettings; + _MetrologyRepository = metrologyRepository; } private static int[] EvenReactors() diff --git a/Archive/ApiControllers/ToolTypesController.cs b/Archive/ApiControllers/ToolTypesController.cs index fc3491f..33bfc36 100644 --- a/Archive/ApiControllers/ToolTypesController.cs +++ b/Archive/ApiControllers/ToolTypesController.cs @@ -4,11 +4,11 @@ using System; using System.IO; using System.Linq; -namespace OI.Metrology.Archive.ApiContollers; +namespace OI.Metrology.Archive.ApiControllers; using OI.Metrology.Archive.Models; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; using System.Collections.Generic; using System.Text.Json; @@ -21,15 +21,15 @@ public class ToolTypesController : Controller // it is named after the /api/tooltypes prefix // the URL pattern is RESTful and the tool type is the root of every request - private readonly IMetrologyRepo _Repo; private readonly AppSettings _AppSettings; private readonly IAttachmentsService _AttachmentsService; + private readonly IMetrologyRepository _MetrologyRepository; - public ToolTypesController(AppSettings appSettings, IMetrologyRepo repo, IAttachmentsService attachmentsService) + public ToolTypesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService) { - _Repo = repo; _AppSettings = appSettings; _AttachmentsService = attachmentsService; + _MetrologyRepository = metrologyRepository; } // Get a list of tooltypes, returns just Name and ID @@ -38,7 +38,7 @@ public class ToolTypesController : Controller { var r = new { - Results = _Repo.GetToolTypes().Select(tt => new { tt.ToolTypeName, tt.ID }) + Results = _MetrologyRepository.GetToolTypes().Select(tt => new { tt.ToolTypeName, tt.ID }) }; return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); } @@ -48,8 +48,8 @@ public class ToolTypesController : Controller [HttpGet("/api/tooltypes/{id}")] public IActionResult GetToolTypeMetadata(int id, string sortby = "") { - ToolType tt = _Repo.GetToolTypeByID(id); - IEnumerable md = _Repo.GetToolTypeMetadataByToolTypeID(id); + ToolType tt = _MetrologyRepository.GetToolTypeByID(id); + IEnumerable md = _MetrologyRepository.GetToolTypeMetadataByToolTypeID(id); if (string.Equals(sortby, "grid", StringComparison.OrdinalIgnoreCase)) md = md.OrderBy(f => f.GridDisplayOrder).ToList(); @@ -80,7 +80,7 @@ public class ToolTypesController : Controller { long totalRecs; - System.Data.DataTable dt = _Repo.GetHeaders(id, datebegin, dateend, page, pagesize, headerid, out totalRecs); + System.Data.DataTable dt = _MetrologyRepository.GetHeaders(id, datebegin, dateend, page, pagesize, headerid, out totalRecs); var r = new { @@ -101,7 +101,7 @@ public class ToolTypesController : Controller { long totalRecs; - IEnumerable dt = _Repo.GetHeaderTitles(id, page, pagesize, out totalRecs); + IEnumerable dt = _MetrologyRepository.GetHeaderTitles(id, page, pagesize, out totalRecs); var r = new { @@ -121,7 +121,7 @@ public class ToolTypesController : Controller { var r = new { - Results = _Repo.GetHeaderFields(id, headerid).Select(x => new { Column = x.Key, x.Value }).ToList() + Results = _MetrologyRepository.GetHeaderFields(id, headerid).Select(x => new { Column = x.Key, x.Value }).ToList() }; string json = JsonConvert.SerializeObject(r); @@ -137,7 +137,7 @@ public class ToolTypesController : Controller var r = new { - Results = _Repo.GetDataSharePoint(id, title) + Results = _MetrologyRepository.GetDataSharePoint(id, title) }; string json = JsonConvert.SerializeObject(r); @@ -152,7 +152,7 @@ public class ToolTypesController : Controller var r = new { - Results = _Repo.GetData(id, headerid) + Results = _MetrologyRepository.GetData(id, headerid) }; string json = JsonConvert.SerializeObject(r); @@ -168,7 +168,7 @@ public class ToolTypesController : Controller string filename) { - ToolType tt = _Repo.GetToolTypeByID(toolTypeId); + ToolType tt = _MetrologyRepository.GetToolTypeByID(toolTypeId); bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase); @@ -191,7 +191,7 @@ public class ToolTypesController : Controller public IActionResult OIExport(int toolTypeId, long headerid) { // Call the export stored procedure - System.Data.DataSet ds = _Repo.GetOIExportData(toolTypeId, headerid); + System.Data.DataSet ds = _MetrologyRepository.GetOIExportData(toolTypeId, headerid); try { @@ -213,7 +213,7 @@ public class ToolTypesController : Controller foreach (object o in ds.Tables[1].Rows[0].ItemArray) { - if ((o != null) && (!Convert.IsDBNull(o))) + if ((o is not null) && (!Convert.IsDBNull(o))) _ = sb.Append(Convert.ToString(o)); _ = sb.Append('\t'); } @@ -223,7 +223,7 @@ public class ToolTypesController : Controller { foreach (object o in dr.ItemArray) { - if ((o != null) && (!Convert.IsDBNull(o))) + if ((o is not null) && (!Convert.IsDBNull(o))) _ = sb.Append(Convert.ToString(o)); _ = sb.Append('\t'); } diff --git a/Archive/Controllers/ErrorHandlerController.cs b/Archive/Controllers/ErrorHandlerController.cs index 8c3ba6c..ea1ed91 100644 --- a/Archive/Controllers/ErrorHandlerController.cs +++ b/Archive/Controllers/ErrorHandlerController.cs @@ -15,7 +15,7 @@ public class ErrorHandlerController : Controller public IActionResult Index() { IExceptionHandlerFeature error = HttpContext.Features.Get(); - if (error == null) + if (error is null) { return Redirect("~/"); } @@ -24,7 +24,7 @@ public class ErrorHandlerController : Controller _Logger.LogError("Unhandled exception: " + error.Error.ToString()); dynamic r = new { - Message = error.Error == null ? "Error" : error.Error.Message + Message = error.Error is null ? "Error" : error.Error.Message }; return StatusCode(StatusCodes.Status500InternalServerError, r); } diff --git a/Archive/Controllers/ExportController.cs b/Archive/Controllers/ExportController.cs index ad59eca..5e19293 100644 --- a/Archive/Controllers/ExportController.cs +++ b/Archive/Controllers/ExportController.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; using OI.Metrology.Archive.Models; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.ViewModels; using System; using System.Collections.Generic; @@ -17,14 +17,14 @@ public class ExportController : Controller { private readonly ILogger _Logger; private readonly bool _IsTestDatabase; - private readonly IMetrologyRepo _Repo; private readonly AppSettings _AppSettings; + private readonly IMetrologyRepository _MetrologyRepository; - public ExportController(AppSettings appSettings, ILogger logger, IMetrologyRepo repo) + public ExportController(AppSettings appSettings, ILogger logger, IMetrologyRepository metrologyRepository) { - _Repo = repo; _Logger = logger; _AppSettings = appSettings; + _MetrologyRepository = metrologyRepository; _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); } @@ -60,7 +60,7 @@ public class ExportController : Controller { if (model.StartTime > model.EndTime) ModelState.AddModelError("EndTime", "End time must be after start time"); - IEnumerable toolTypes = _Repo.GetToolTypes(); + IEnumerable toolTypes = _MetrologyRepository.GetToolTypes(); toolType = toolTypes.Where(tt => tt.ID.ToString() == model.ToolType).SingleOrDefault(); if (toolType is null) ModelState.AddModelError("ToolType", "Invalid selection"); @@ -94,7 +94,7 @@ public class ExportController : Controller string fileName = string.Format("Export_{0}_{1:yyyyMMddHHmm}_to_{2:yyyyMMddHHmm}.csv", toolTypeName, startTime, endTime); StringBuilder sb = new(); - System.Data.DataTable dt = _Repo.ExportData(spName, startTime, endTime); + System.Data.DataTable dt = _MetrologyRepository.ExportData(spName, startTime, endTime); _ = sb.AppendLine(GetColumnHeaders(dt)); diff --git a/Archive/Controllers/PagesController.cs b/Archive/Controllers/PagesController.cs index 980be34..a8fe79c 100644 --- a/Archive/Controllers/PagesController.cs +++ b/Archive/Controllers/PagesController.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using OI.Metrology.Archive.Models; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Repositories; using OI.Metrology.Shared.ViewModels; using System; @@ -13,12 +14,12 @@ public class PagesController : Controller { private readonly bool _IsTestDatabase; private readonly IRdsMaxRepo _RdsMaxRepo; - private readonly IMetrologyRepo _MetrologyRepo; + private readonly IMetrologyRepository _MetrologyRepo; - public PagesController(AppSettings appSettings, IMetrologyRepo metrologyRepo, IRdsMaxRepo rdsMaxRepo) + public PagesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IRdsMaxRepo rdsMaxRepo) { _RdsMaxRepo = rdsMaxRepo; - _MetrologyRepo = metrologyRepo; + _MetrologyRepo = metrologyRepository; _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); } diff --git a/Archive/Models/AppSettings.cs b/Archive/Models/AppSettings.cs index a5a06b6..2f45100 100644 --- a/Archive/Models/AppSettings.cs +++ b/Archive/Models/AppSettings.cs @@ -1,61 +1,24 @@ using System.Text.Json; -using System.Text.Json.Serialization; namespace OI.Metrology.Archive.Models; -public class AppSettings +public record AppSettings(string ApiLoggingContentTypes, + string ApiLoggingPathPrefixes, + string ApiLogPath, + string AttachmentPath, + string BuildNumber, + string Company, + string ConnectionString, + string GitCommitSeven, + string InboundApiAllowedIPList, + string MonAResource, + string MonASite, + string Oi2SqlConnectionString, + string OIExportPath, + string URLs, + string WorkingDirectoryName) { - public string ApiLoggingContentTypes { init; get; } - public string ApiLoggingPathPrefixes { init; get; } - public string ApiLogPath { init; get; } - public string AttachmentPath { init; get; } - public string BuildNumber { init; get; } - public string Company { init; get; } - public string ConnectionString { init; get; } - public string GitCommitSeven { init; get; } - public string InboundApiAllowedIPList { init; get; } - public string MonAResource { init; get; } - public string MonASite { init; get; } - public string OIExportPath { init; get; } - public string Oi2SqlConnectionString { init; get; } - public string URLs { init; get; } - public string WorkingDirectoryName { init; get; } - - [JsonConstructor] - public AppSettings(string apiLoggingContentTypes, - string apiLoggingPathPrefixes, - string apiLogPath, - string attachmentPath, - string buildNumber, - string company, - string connectionString, - string gitCommitSeven, - string inboundApiAllowedIPList, - string monAResource, - string monASite, - string oi2SqlConnectionString, - string oiExportPath, - string urls, - string workingDirectoryName) - { - ApiLoggingContentTypes = apiLoggingContentTypes; - ApiLoggingPathPrefixes = apiLoggingPathPrefixes; - ApiLogPath = apiLogPath; - AttachmentPath = attachmentPath; - BuildNumber = buildNumber; - Company = company; - ConnectionString = connectionString; - GitCommitSeven = gitCommitSeven; - InboundApiAllowedIPList = inboundApiAllowedIPList; - MonAResource = monAResource; - MonASite = monASite; - Oi2SqlConnectionString = oi2SqlConnectionString; - OIExportPath = oiExportPath; - URLs = urls; - WorkingDirectoryName = workingDirectoryName; - } - public override string ToString() { string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); diff --git a/Archive/Models/Binder/AppSettings.cs b/Archive/Models/Binder/AppSettings.cs index e7ea7d8..aa6a0ca 100644 --- a/Archive/Models/Binder/AppSettings.cs +++ b/Archive/Models/Binder/AppSettings.cs @@ -37,6 +37,8 @@ public class AppSettings private static Models.AppSettings Get(AppSettings appSettings) { Models.AppSettings result; + if (appSettings is null) + throw new NullReferenceException(nameof(appSettings)); if (appSettings.ApiLoggingContentTypes is null) throw new NullReferenceException(nameof(ApiLoggingContentTypes)); if (appSettings.ApiLoggingPathPrefixes is null) diff --git a/Archive/Archive.csproj b/Archive/OI.Metrology.Archive.csproj similarity index 88% rename from Archive/Archive.csproj rename to Archive/OI.Metrology.Archive.csproj index 38ac565..8c95b26 100644 --- a/Archive/Archive.csproj +++ b/Archive/OI.Metrology.Archive.csproj @@ -12,7 +12,7 @@ disable Exe win-x64 - net6.0 + net7.0 @@ -29,22 +29,22 @@ - - - - - - - + + + + + + + - + - + diff --git a/Archive/Program.cs b/Archive/Program.cs index 5e5135d..0475682 100644 --- a/Archive/Program.cs +++ b/Archive/Program.cs @@ -9,6 +9,7 @@ using OI.Metrology.Archive.Models; using OI.Metrology.Archive.Repositories; using OI.Metrology.Archive.Services; using OI.Metrology.Shared.Models; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Repositories; using OI.Metrology.Shared.Services; using Serilog; @@ -65,13 +66,13 @@ public class Program { _ = webApplicationBuilder.Services.Configure(options => options.SuppressModelStateInvalidFilter = true); _ = webApplicationBuilder.Services.AddControllersWithViews(); - _ = new MetrologyRepo(new SQLDbConnectionFactory(_AppSettings), null); + _ = new MetrologyRepository(new SQLDbConnectionFactory(_AppSettings), null); _ = webApplicationBuilder.Services.AddDistributedMemoryCache(); _ = webApplicationBuilder.Services.AddMemoryCache(); _ = webApplicationBuilder.Services.AddSingleton(_ => _AppSettings); _ = webApplicationBuilder.Services.AddScoped(); _ = webApplicationBuilder.Services.AddScoped(); - _ = webApplicationBuilder.Services.AddScoped(); + _ = webApplicationBuilder.Services.AddScoped(); _ = webApplicationBuilder.Services.AddScoped(); _ = webApplicationBuilder.Services.AddSingleton(); _ = webApplicationBuilder.Services.AddSwaggerGen(); @@ -87,8 +88,10 @@ public class Program _ = webApplicationBuilder.Services.AddSingleton(); _ = webApplicationBuilder.Logging.AddEventLog(settings => { +#pragma warning disable CA1416 if (string.IsNullOrEmpty(settings.SourceName)) settings.SourceName = webApplicationBuilder.Environment.ApplicationName; +#pragma warning restore }); } WebApplication webApplication = webApplicationBuilder.Build(); diff --git a/Archive/Repositories/MetrologyRepo.cs b/Archive/Repositories/MetrologyRepo.cs index 6b52937..9eb5a8c 100644 --- a/Archive/Repositories/MetrologyRepo.cs +++ b/Archive/Repositories/MetrologyRepo.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json.Linq; using OI.Metrology.Shared.DataModels; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Repositories; using System; using System.Collections.Generic; @@ -12,12 +13,12 @@ using System.Transactions; namespace OI.Metrology.Archive.Repositories; -public class MetrologyRepo : IMetrologyRepo +public class MetrologyRepository : IMetrologyRepository { private readonly IDbConnectionFactory _DBConnectionFactory; private readonly IMemoryCache _Cache; - public MetrologyRepo(IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache) + public MetrologyRepository(IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache) { _DBConnectionFactory = dbConnectionFactory; _Cache = memoryCache; @@ -136,10 +137,10 @@ public class MetrologyRepo : IMetrologyRepo // build field map foreach (ToolTypeMetadata f in fields) { - if ((f.ApiName != null) && f.ApiName.Contains('\\')) + if ((f.ApiName is not null) && f.ApiName.Contains('\\')) { string n = f.ApiName.Split('\\')[0].Trim().ToUpper(); - if (containerField == null) + if (containerField is null) containerField = n; else if (!string.Equals(containerField, n)) throw new Exception("Only one container field is allowed"); @@ -153,7 +154,7 @@ public class MetrologyRepo : IMetrologyRepo } } - if (containerField == null) + if (containerField is null) { // No container field, just insert a single row @@ -164,7 +165,7 @@ public class MetrologyRepo : IMetrologyRepo // Find the container field in the json JProperty contJP = jsonrow.Children().Where(c => string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); - if ((contJP != null) && (contJP.Value is JArray array)) + if ((contJP is not null) && (contJP.Value is JArray array)) { JArray contRows = array; @@ -233,7 +234,7 @@ public class MetrologyRepo : IMetrologyRepo } } - if ((containerrow != null) && (containerFieldmap != null)) + if ((containerrow is not null) && (containerFieldmap is not null)) { foreach (JProperty jp in containerrow.Children()) @@ -264,7 +265,7 @@ public class MetrologyRepo : IMetrologyRepo cmd.CommandText = columns.TrimEnd(',') + parms.TrimEnd(',') + ";SELECT SCOPE_IDENTITY();"; object o = cmd.ExecuteScalar(); - if ((o == null) || Convert.IsDBNull(o)) + if ((o is null) || Convert.IsDBNull(o)) throw new Exception("Unexpected query result"); return Convert.ToInt64(o); } @@ -304,7 +305,7 @@ public class MetrologyRepo : IMetrologyRepo { if (!firstField) _ = sb.Append(','); - if (f.GridAttributes != null && f.GridAttributes.Contains("isNull")) + if (f.GridAttributes is not null && f.GridAttributes.Contains("isNull")) { _ = sb.AppendFormat("{0}", "ISNULL(" + f.ColumnName + ", '')[" + f.ColumnName + "]"); } @@ -322,11 +323,11 @@ public class MetrologyRepo : IMetrologyRepo public DataTable GetHeaders(int toolTypeId, DateTime? startTime, DateTime? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); IEnumerable md = GetToolTypeMetadataByToolTypeID(toolTypeId); - if (md == null) + if (md is null) throw new Exception("Invalid tool type metadata"); DataTable dt = new(); @@ -418,11 +419,11 @@ public class MetrologyRepo : IMetrologyRepo public DataTable GetData(int toolTypeId, long headerid) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); IEnumerable md = GetToolTypeMetadataByToolTypeID(toolTypeId); - if (md == null) + if (md is null) throw new Exception("Invalid tool type metadata"); DataTable dt = new(); @@ -529,11 +530,11 @@ public class MetrologyRepo : IMetrologyRepo public DataTable GetDataSharePoint(int toolTypeId, string headerid) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); IEnumerable md = GetToolTypeMetadataByToolTypeID(toolTypeId); - if (md == null) + if (md is null) throw new Exception("Invalid tool type metadata"); DataTable dt = new(); @@ -624,7 +625,7 @@ public class MetrologyRepo : IMetrologyRepo public Guid GetHeaderAttachmentID(int toolTypeId, long headerId) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -637,7 +638,7 @@ public class MetrologyRepo : IMetrologyRepo public Guid GetDataAttachmentID(int toolTypeId, long headerId, string title) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -656,7 +657,7 @@ public class MetrologyRepo : IMetrologyRepo public DataSet GetOIExportData(int toolTypeId, long headerid) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); if (string.IsNullOrWhiteSpace(tt.OIExportSPName)) @@ -685,7 +686,7 @@ public class MetrologyRepo : IMetrologyRepo public IEnumerable GetHeaderTitles(int toolTypeId, int? pageNo, int? pageSize, out long totalRecords) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); DbConnection conn = GetDbConnection(); @@ -717,11 +718,11 @@ public class MetrologyRepo : IMetrologyRepo public IEnumerable> GetHeaderFields(int toolTypeId, long headerid) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); IEnumerable md = GetToolTypeMetadataByToolTypeID(toolTypeId); - if (md == null) + if (md is null) throw new Exception("Invalid tool type metadata"); List> r = new(); @@ -749,10 +750,10 @@ public class MetrologyRepo : IMetrologyRepo foreach (ToolTypeMetadata m in md.Where(m => m.Header == true && m.TableDisplayOrder > 0).OrderBy(m => m.TableDisplayOrder)) { string v = ""; - if (dr != null) + if (dr is not null) { object o = dr[m.ColumnName]; - if (o != null && !Convert.IsDBNull(o)) + if (o is not null && !Convert.IsDBNull(o)) v = Convert.ToString(o); } KeyValuePair kvp = new(m.DisplayTitle, v); @@ -771,7 +772,7 @@ public class MetrologyRepo : IMetrologyRepo public int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -792,7 +793,7 @@ public class MetrologyRepo : IMetrologyRepo public Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -804,7 +805,7 @@ public class MetrologyRepo : IMetrologyRepo public Guid GetDataAttachmentIDByTitle(int toolTypeId, string title) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -813,8 +814,8 @@ public class MetrologyRepo : IMetrologyRepo return conn.ExecuteScalar(sql, param: new { Title = title }); } - string IMetrologyRepo.GetHeaderInsertDate(int toolTypeId, long headerId) => throw new NotImplementedException(); - void IMetrologyRepo.SetHeaderDirName(string tableName, long headerId, string dateDir) => throw new NotImplementedException(); - string IMetrologyRepo.GetDataInsertDate(int toolTypeId, long headerId, string title) => throw new NotImplementedException(); - void IMetrologyRepo.SetDataDirName(string tableName, long headerId, string title, string dateDir) => throw new NotImplementedException(); + string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId) => throw new NotImplementedException(); + void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir) => throw new NotImplementedException(); + string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title) => throw new NotImplementedException(); + void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir) => throw new NotImplementedException(); } \ No newline at end of file diff --git a/Archive/Services/AttachmentsService.cs b/Archive/Services/AttachmentsService.cs index 8412c45..f4113fe 100644 --- a/Archive/Services/AttachmentsService.cs +++ b/Archive/Services/AttachmentsService.cs @@ -6,27 +6,27 @@ namespace OI.Metrology.Archive.Services; using OI.Metrology.Archive.Models; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; using System.Data.SqlClient; public class AttachmentsService : IAttachmentsService { - private readonly IMetrologyRepo _Repo; private readonly AppSettings _AppSettings; + private readonly IMetrologyRepository _MetrologyRepository; - public AttachmentsService(AppSettings appSettings, IMetrologyRepo repo) + public AttachmentsService(AppSettings appSettings, IMetrologyRepository metrologyRepository) { - _Repo = repo; _AppSettings = appSettings; + _MetrologyRepository = metrologyRepository; } protected Stream GetAttachmentStream(string tableName, Guid attachmentId, string filename) { if (attachmentId.Equals(Guid.Empty)) throw new Exception("No attachments found"); - DateTime insertDate = Convert.ToDateTime(_Repo.GetAttachmentInsertDateByGUID(tableName, attachmentId)); + DateTime insertDate = Convert.ToDateTime(_MetrologyRepository.GetAttachmentInsertDateByGUID(tableName, attachmentId)); int year = insertDate.Year; DateTime d = insertDate; CultureInfo cul = CultureInfo.CurrentCulture; @@ -63,7 +63,7 @@ public class AttachmentsService : IAttachmentsService public Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename) { - if (toolType == null) + if (toolType is null) throw new Exception("Invalid tool type"); string queryString = "SELECT * FROM " + toolType.DataTableName + " WHERE AttachmentId = @attachmentId"; @@ -103,19 +103,19 @@ public class AttachmentsService : IAttachmentsService if (header) { tableName = toolType.HeaderTableName; - attachmentId = _Repo.GetHeaderAttachmentIDByTitle(toolType.ID, title); + attachmentId = _MetrologyRepository.GetHeaderAttachmentIDByTitle(toolType.ID, title); } else { tableName = toolType.DataTableName; - attachmentId = _Repo.GetDataAttachmentIDByTitle(toolType.ID, title); + attachmentId = _MetrologyRepository.GetDataAttachmentIDByTitle(toolType.ID, title); } return GetAttachmentStream(tableName, attachmentId, filename); } public Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename) { - if (toolType == null) + if (toolType is null) throw new Exception("Invalid tool type"); string tableName; if (header) @@ -126,7 +126,7 @@ public class AttachmentsService : IAttachmentsService } public Stream GetAttachmentStreamByAttachmentIdArchive(ToolType toolType, bool header, Guid attachmentId, string filename) { - if (toolType == null) + if (toolType is null) throw new Exception("Invalid tool type"); string tableName; if (header) @@ -139,21 +139,21 @@ public class AttachmentsService : IAttachmentsService private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, Microsoft.AspNetCore.Http.IFormFile uploadedFile) { - if (toolType == null) + if (toolType is null) throw new Exception("Invalid tool type"); - using System.Transactions.TransactionScope trans = _Repo.StartTransaction(); + using System.Transactions.TransactionScope trans = _MetrologyRepository.StartTransaction(); Guid attachmentId = Guid.Empty; string tableName = ""; if (string.IsNullOrWhiteSpace(dataUniqueId)) { - attachmentId = _Repo.GetHeaderAttachmentID(toolType.ID, headerId); + attachmentId = _MetrologyRepository.GetHeaderAttachmentID(toolType.ID, headerId); tableName = toolType.HeaderTableName; } else { - attachmentId = _Repo.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); + attachmentId = _MetrologyRepository.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); tableName = toolType.DataTableName; } if (Equals(attachmentId, Guid.Empty)) diff --git a/Archive/Services/InboundDataService.cs b/Archive/Services/InboundDataService.cs index ef03278..576fd3f 100644 --- a/Archive/Services/InboundDataService.cs +++ b/Archive/Services/InboundDataService.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json.Linq; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; using System; using System.Collections.Generic; @@ -10,9 +10,9 @@ namespace OI.Metrology.Archive.Services; public class InboundDataService : IInboundDataService { - private readonly IMetrologyRepo _Repo; + private readonly IMetrologyRepository _MetrologyRepository; - public InboundDataService(IMetrologyRepo repo) => _Repo = repo; + public InboundDataService(IMetrologyRepository metrologyRepository) => _MetrologyRepository = metrologyRepository; public long DoSQLInsert(JToken jsonbody, ToolType toolType, List metaData) { @@ -37,11 +37,11 @@ public class InboundDataService : IInboundDataService long headerId = 0; - using (System.Transactions.TransactionScope transScope = _Repo.StartTransaction()) + using (System.Transactions.TransactionScope transScope = _MetrologyRepository.StartTransaction()) { try { - _Repo.PurgeExistingData(toolType.ID, uniqueId); + _MetrologyRepository.PurgeExistingData(toolType.ID, uniqueId); } catch (Exception ex) { @@ -50,7 +50,7 @@ public class InboundDataService : IInboundDataService try { - headerId = _Repo.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName); + headerId = _MetrologyRepository.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName); } catch (Exception ex) { @@ -60,11 +60,11 @@ public class InboundDataService : IInboundDataService int detailrow = 1; try { - if (detailsArray != null) + if (detailsArray is not null) { foreach (JToken detail in detailsArray) { - _ = _Repo.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName); + _ = _MetrologyRepository.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName); detailrow += 1; } } @@ -133,7 +133,7 @@ public class InboundDataService : IInboundDataService if (jp.First is JArray array) detailsArray = array; - else if ((jp.First is JValue value) && (value.Value == null)) + else if ((jp.First is JValue value) && (value.Value is null)) detailsArray = null; else errors.Add("Invalid details field"); @@ -169,7 +169,7 @@ public class InboundDataService : IInboundDataService } // if a Details container if found, process it by recursion - if (detailsArray != null) + if (detailsArray is not null) { int i = 1; foreach (JToken detail in detailsArray) @@ -189,7 +189,7 @@ public class InboundDataService : IInboundDataService { // get the json data for this container field, ex: Points JProperty contJP = jsonbody.Children().Where(jp => string.Equals(jp.Name, containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); - if ((contJP != null) && (contJP.Value is JArray array)) + if ((contJP is not null) && (contJP.Value is JArray array)) { JArray contJPArray = array; diff --git a/OI-Metrology.sln b/OI-Metrology.sln index a37fb8b..a33c1c1 100644 --- a/OI-Metrology.sln +++ b/OI-Metrology.sln @@ -3,13 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archive", "Archive\Archive.csproj", "{D02BA20E-0ACE-4D1C-9132-90773AF3CF5A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archive", "Archive\OI.Metrology.Archive.csproj", "{D02BA20E-0ACE-4D1C-9132-90773AF3CF5A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\Shared.csproj", "{A807EAE3-7DCB-4E5E-BE54-0D7410D18B3E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\OI.Metrology.Shared.csproj", "{A807EAE3-7DCB-4E5E-BE54-0D7410D18B3E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Viewer", "Viewer\Viewer.csproj", "{25C86DF8-EC1A-4D4B-AD4E-6561174824B9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Viewer", "Viewer\OI.Metrology.Viewer.csproj", "{25C86DF8-EC1A-4D4B-AD4E-6561174824B9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{B67FB8C4-402E-4D53-90A6-90F6FDB9D082}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\OI.Metrology.Tests.csproj", "{B67FB8C4-402E-4D53-90A6-90F6FDB9D082}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Shared/Infineon/Monitoring/MonA/ExtWebClient.cs b/Shared/Infineon/Monitoring/MonA/ExtWebClient.cs index 37bfafb..6862871 100644 --- a/Shared/Infineon/Monitoring/MonA/ExtWebClient.cs +++ b/Shared/Infineon/Monitoring/MonA/ExtWebClient.cs @@ -10,7 +10,7 @@ public class ExtWebClient : WebClient protected override WebRequest GetWebRequest(Uri address) { WebRequest webRequest = base.GetWebRequest(address); - if (webRequest != null) + if (webRequest is not null) webRequest.PreAuthenticate = PreAuthenticate; return webRequest; } diff --git a/Shared/Models/AdditionalData.cs b/Shared/Models/AdditionalData.cs new file mode 100644 index 0000000..a082454 --- /dev/null +++ b/Shared/Models/AdditionalData.cs @@ -0,0 +1,7 @@ +using System.Text.Json.Serialization; + +namespace OI.Metrology.Shared.Models; + +public record AdditionalData( + [property: JsonPropertyName("ServiceId")] string ServiceId + ); \ No newline at end of file diff --git a/Shared/Models/AllowedActions.cs b/Shared/Models/AllowedActions.cs new file mode 100644 index 0000000..9b698e5 --- /dev/null +++ b/Shared/Models/AllowedActions.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace OI.Metrology.Shared.Models; + +public record AllowedActions( + [property: JsonPropertyName("Incident")] bool Incident, + [property: JsonPropertyName("Accept")] bool Accept, + [property: JsonPropertyName("Reorder")] bool Reorder + ); \ No newline at end of file diff --git a/Shared/Models/Booking.cs b/Shared/Models/Booking.cs new file mode 100644 index 0000000..ea82914 --- /dev/null +++ b/Shared/Models/Booking.cs @@ -0,0 +1,18 @@ +using System.Text.Json.Serialization; + +namespace OI.Metrology.Shared.Models; + +public record Booking( + [property: JsonPropertyName("Catalog")] Catalog Catalog, + [property: JsonPropertyName("Name")] string Name, + [property: JsonPropertyName("Description")] string Description, + [property: JsonPropertyName("PaymentMethod")] int PaymentMethod, + [property: JsonPropertyName("Service")] Service Service, + [property: JsonPropertyName("Order")] Order Order, + [property: JsonPropertyName("ApprovalStatus")] int ApprovalStatus, + [property: JsonPropertyName("AllowedActions")] AllowedActions AllowedActions, + [property: JsonPropertyName("ObjectId")] string ObjectId, + [property: JsonPropertyName("Id")] string Id, + [property: JsonPropertyName("Quantity")] int Quantity, + [property: JsonPropertyName("AdditionalData")] AdditionalData AdditionalData + ); \ No newline at end of file diff --git a/Shared/Models/Catalog.cs b/Shared/Models/Catalog.cs new file mode 100644 index 0000000..f9f34dc --- /dev/null +++ b/Shared/Models/Catalog.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace OI.Metrology.Shared.Models; + +public record Catalog( + [property: JsonPropertyName("Id")] string Id, + [property: JsonPropertyName("Name")] string Name, + [property: JsonPropertyName("CurrencyCode")] string CurrencyCode + ); \ No newline at end of file diff --git a/Shared/Models/DataResponse.cs b/Shared/Models/DataResponse.cs new file mode 100644 index 0000000..b191de6 --- /dev/null +++ b/Shared/Models/DataResponse.cs @@ -0,0 +1,19 @@ +namespace OI.Metrology.Shared.Models; + +public class DataResponse +{ + + public bool Success { get; set; } + public long HeaderID { get; set; } + public List Errors { get; set; } + public List Warnings { get; set; } + + public DataResponse() + { + HeaderID = -1; + Success = false; + Errors = new List(); + Warnings = new List(); + } + +} \ No newline at end of file diff --git a/Shared/Models/Order.cs b/Shared/Models/Order.cs new file mode 100644 index 0000000..1fcccdc --- /dev/null +++ b/Shared/Models/Order.cs @@ -0,0 +1,26 @@ +using System.Text.Json.Serialization; + +namespace OI.Metrology.Shared.Models; + +public record Order( + [property: JsonPropertyName("Bookings")] IReadOnlyList Bookings, + [property: JsonPropertyName("AllowedActions")] AllowedActions AllowedActions, + [property: JsonPropertyName("Id")] string Id, + [property: JsonPropertyName("ObjectId")] string ObjectId, + [property: JsonPropertyName("Name")] string Name, + [property: JsonPropertyName("Type")] string Type, + [property: JsonPropertyName("TypeId")] int TypeId, + [property: JsonPropertyName("State")] string State, + [property: JsonPropertyName("StateId")] int StateId, + [property: JsonPropertyName("StateIcon")] string StateIcon, + [property: JsonPropertyName("StateColor")] string StateColor, + [property: JsonPropertyName("ItemNumber")] string ItemNumber, + [property: JsonPropertyName("CreatedDate")] DateTime CreatedDate, + [property: JsonPropertyName("DecidedDate")] DateTime DecidedDate, + [property: JsonPropertyName("CostCenterId")] string CostCenterId, + [property: JsonPropertyName("CostCenterName")] string CostCenterName, + [property: JsonPropertyName("Recipient")] string Recipient, + [property: JsonPropertyName("RecipientId")] string RecipientId, + [property: JsonPropertyName("Requestor")] string Requestor, + [property: JsonPropertyName("RequestorId")] string RequestorId + ); \ No newline at end of file diff --git a/Shared/Models/Price.cs b/Shared/Models/Price.cs new file mode 100644 index 0000000..8a64714 --- /dev/null +++ b/Shared/Models/Price.cs @@ -0,0 +1,7 @@ +using System.Text.Json.Serialization; + +namespace OI.Metrology.Shared.Models; + +public record Price( + [property: JsonPropertyName("CC")] string CC + ); \ No newline at end of file diff --git a/Shared/Models/Service.cs b/Shared/Models/Service.cs new file mode 100644 index 0000000..ca3d5b1 --- /dev/null +++ b/Shared/Models/Service.cs @@ -0,0 +1,20 @@ +using System.Text.Json.Serialization; + +namespace OI.Metrology.Shared.Models; + +public record Service( + [property: JsonPropertyName("Id")] string Id, + [property: JsonPropertyName("Quantity")] int Quantity, + [property: JsonPropertyName("PaymentMethod")] int PaymentMethod, + [property: JsonPropertyName("Price")] Price Price, + [property: JsonPropertyName("ObjectId")] string ObjectId, + [property: JsonPropertyName("ConfigurationItemType")] int ConfigurationItemType, + [property: JsonPropertyName("ConfigurationItemTypeName")] string ConfigurationItemTypeName, + [property: JsonPropertyName("ServiceType")] int ServiceType, + [property: JsonPropertyName("CustomFormEntityId")] string CustomFormEntityId, + [property: JsonPropertyName("CustomFormEntityName")] string CustomFormEntityName, + [property: JsonPropertyName("CreateMultipleBookings")] bool CreateMultipleBookings, + [property: JsonPropertyName("AllowIdenticalInstances")] bool AllowIdenticalInstances, + [property: JsonPropertyName("Catalog")] Catalog Catalog, + [property: JsonPropertyName("UninstallationMode")] int? UninstallationMode + ); \ No newline at end of file diff --git a/Shared/Models/ServiceShop.cs b/Shared/Models/ServiceShop.cs new file mode 100644 index 0000000..de3f2f9 --- /dev/null +++ b/Shared/Models/ServiceShop.cs @@ -0,0 +1,8 @@ +using System.Text.Json.Serialization; + +namespace OI.Metrology.Shared.Models; + +public record ServiceShop( + [property: JsonPropertyName("Orders")] IReadOnlyList Orders, + [property: JsonPropertyName("Total")] int Total + ); \ No newline at end of file diff --git a/Shared/Models/Stateless/IAppSettingsController.cs b/Shared/Models/Stateless/IAppSettingsController.cs new file mode 100644 index 0000000..23f888b --- /dev/null +++ b/Shared/Models/Stateless/IAppSettingsController.cs @@ -0,0 +1,15 @@ +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IAppSettingsController +{ + + enum Action : int + { + App = 0, + DevOps = 1 + } + + static string GetRouteName() => nameof(IAppSettingsController)[1..^10]; + T GetAppSettings(); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IAppSettingsRepository.cs b/Shared/Models/Stateless/IAppSettingsRepository.cs new file mode 100644 index 0000000..d802509 --- /dev/null +++ b/Shared/Models/Stateless/IAppSettingsRepository.cs @@ -0,0 +1,9 @@ +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IAppSettingsRepository +{ + + List GetAppSettings(); + string GetBuildNumberAndGitCommitSeven(); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IClientSettingsController.cs b/Shared/Models/Stateless/IClientSettingsController.cs new file mode 100644 index 0000000..3f8c98c --- /dev/null +++ b/Shared/Models/Stateless/IClientSettingsController.cs @@ -0,0 +1,16 @@ +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IClientSettingsController +{ + + enum Action : int + { + Client = 0, + IP = 1 + } + + static string GetRouteName() => nameof(IClientSettingsController)[1..^10]; + T GetClientSettings(); + T GetIpAddress(); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IClientSettingsRepository.cs b/Shared/Models/Stateless/IClientSettingsRepository.cs new file mode 100644 index 0000000..dc89e17 --- /dev/null +++ b/Shared/Models/Stateless/IClientSettingsRepository.cs @@ -0,0 +1,11 @@ +using System.Net; + +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IClientSettingsRepository +{ + + List GetClientSettings(IPAddress? remoteIpAddress); + string GetIpAddress(IPAddress? remoteIpAddress); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IInboundController.cs b/Shared/Models/Stateless/IInboundController.cs new file mode 100644 index 0000000..6e05df3 --- /dev/null +++ b/Shared/Models/Stateless/IInboundController.cs @@ -0,0 +1,17 @@ +using Newtonsoft.Json.Linq; + +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IInboundController +{ + + enum Action : int + { + Index = 0 + } + + static string GetRouteName() => nameof(IInboundController)[1..^10]; + T Data(string tooltype, JToken jsonbody); + T AttachFile(string tooltype, long headerid, string datauniqueid = ""); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IInboundRepository.cs b/Shared/Models/Stateless/IInboundRepository.cs new file mode 100644 index 0000000..c92f9d1 --- /dev/null +++ b/Shared/Models/Stateless/IInboundRepository.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json.Linq; +using OI.Metrology.Shared.Services; +using System.Net; + +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IInboundRepository +{ + + bool IsIPAddressAllowed(string inboundApiAllowedIPList, IPAddress? remoteIP); + DataResponse Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string tooltype, JToken jsonbody); + string? AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService _AttachmentsService, string tooltype, long headerid, string datauniqueid, string fileName, object uploadedFile); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IMethodName.cs b/Shared/Models/Stateless/IMethodName.cs new file mode 100644 index 0000000..91dca49 --- /dev/null +++ b/Shared/Models/Stateless/IMethodName.cs @@ -0,0 +1,10 @@ +using System.Runtime.CompilerServices; + +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IMethodName +{ + + static string? GetActualAsyncMethodName([CallerMemberName] string? name = null) => name; + +} \ No newline at end of file diff --git a/Shared/Repositories/IMetrologyRepo.cs b/Shared/Models/Stateless/IMetrologyRepository.cs similarity index 93% rename from Shared/Repositories/IMetrologyRepo.cs rename to Shared/Models/Stateless/IMetrologyRepository.cs index 70542f3..c1be061 100644 --- a/Shared/Repositories/IMetrologyRepo.cs +++ b/Shared/Models/Stateless/IMetrologyRepository.cs @@ -1,13 +1,13 @@ using Newtonsoft.Json.Linq; +using OI.Metrology.Shared.DataModels; using System.Data; using System.Transactions; -namespace OI.Metrology.Shared.Repositories; +namespace OI.Metrology.Shared.Models.Stateless; -using DataModels; - -public interface IMetrologyRepo +public interface IMetrologyRepository { + bool IsTestDatabase(); IEnumerable GetToolTypes(); @@ -47,4 +47,5 @@ public interface IMetrologyRepo IEnumerable GetAwaitingDispo(); int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate); + } \ No newline at end of file diff --git a/Shared/Models/Stateless/IServiceShopOrder.cs b/Shared/Models/Stateless/IServiceShopOrder.cs new file mode 100644 index 0000000..524baf9 --- /dev/null +++ b/Shared/Models/Stateless/IServiceShopOrder.cs @@ -0,0 +1,11 @@ +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IServiceShopOrder +{ + + ViewModels.ServiceShopOrder[] TestStatic_GetServiceShopOrders(ServiceShop? serviceShop) => + GetServiceShopOrders(serviceShop); + static ViewModels.ServiceShopOrder[] GetServiceShopOrders(ServiceShop? serviceShop) => + ServiceShopOrder.GetServiceShopOrders(serviceShop); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IServiceShopOrderController.cs b/Shared/Models/Stateless/IServiceShopOrderController.cs new file mode 100644 index 0000000..b757085 --- /dev/null +++ b/Shared/Models/Stateless/IServiceShopOrderController.cs @@ -0,0 +1,15 @@ +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IServiceShopOrderController +{ + + enum Action : int + { + All = 0 + } + + static string GetRouteName() => nameof(IServiceShopOrderController)[1..^10]; + Task GetAllServiceShopOrders(); + Task GetServiceShopOrders(string id); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IServiceShopOrderRepository.cs b/Shared/Models/Stateless/IServiceShopOrderRepository.cs new file mode 100644 index 0000000..c690eb6 --- /dev/null +++ b/Shared/Models/Stateless/IServiceShopOrderRepository.cs @@ -0,0 +1,9 @@ +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IServiceShopOrderRepository +{ + + Task GetAllServiceShopOrders(); + Task GetServiceShopOrders(string id); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IToolTypesController.cs b/Shared/Models/Stateless/IToolTypesController.cs new file mode 100644 index 0000000..5455280 --- /dev/null +++ b/Shared/Models/Stateless/IToolTypesController.cs @@ -0,0 +1,21 @@ +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IToolTypesController +{ + + enum Action : int + { + Index = 0 + } + + static string GetRouteName() => nameof(IToolTypesController)[1..^10]; + T Index(); + T GetToolTypeMetadata(int id, string sortby = ""); + T GetHeaders(int id, DateTime? datebegin, DateTime? dateend, int? page, int? pagesize, long? headerid); + T GetHeaderTitles(int id, int? page, int? pagesize); + T GetHeaderFields(int id, long headerid); + T GetData(int id, long headerid); + T GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename); + T OIExport(int toolTypeId, long headerid); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/IToolTypesRepository.cs b/Shared/Models/Stateless/IToolTypesRepository.cs new file mode 100644 index 0000000..b471d62 --- /dev/null +++ b/Shared/Models/Stateless/IToolTypesRepository.cs @@ -0,0 +1,17 @@ +using OI.Metrology.Shared.Services; + +namespace OI.Metrology.Shared.Models.Stateless; + +public interface IToolTypesRepository +{ + + object Index(IMetrologyRepository metrologyRepository); + object GetToolTypeMetadata(IMetrologyRepository metrologyRepository, int id, string sortby = ""); + string GetHeaders(IMetrologyRepository metrologyRepository, int id, DateTime? datebegin, DateTime? dateend, int? page, int? pagesize, long? headerid); + string GetHeaderTitles(IMetrologyRepository metrologyRepository, int id, int? page, int? pagesize); + string GetHeaderFields(IMetrologyRepository metrologyRepository, int id, long headerid); + string GetData(IMetrologyRepository metrologyRepository, int id, long headerid); + (string?, string?, Stream?) GetAttachment(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, string tabletype, string attachmentId, string filename); + Exception? OIExport(IMetrologyRepository metrologyRepository, string oiExportPath, int toolTypeId, long headerid); + +} \ No newline at end of file diff --git a/Shared/Models/Stateless/ServiceShopOrder.cs b/Shared/Models/Stateless/ServiceShopOrder.cs new file mode 100644 index 0000000..416048a --- /dev/null +++ b/Shared/Models/Stateless/ServiceShopOrder.cs @@ -0,0 +1,16 @@ +namespace OI.Metrology.Shared.Models.Stateless; + +internal abstract class ServiceShopOrder +{ + + internal static ViewModels.ServiceShopOrder[] GetServiceShopOrders(ServiceShop? serviceShop) + { + ViewModels.ServiceShopOrder[] results; + if (serviceShop is null || !serviceShop.Orders.Any()) + results = Array.Empty(); + else + results = serviceShop.Orders.Select(l => new ViewModels.ServiceShopOrder(l)).ToArray(); + return results; + } + +} \ No newline at end of file diff --git a/Shared/Models/TencorRunHeaders.cs b/Shared/Models/TencorRunHeaders.cs deleted file mode 100644 index 219068d..0000000 --- a/Shared/Models/TencorRunHeaders.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace OI.Metrology.Shared.Models; - -public class TencorRunHeaders -{ -} \ No newline at end of file diff --git a/Shared/Shared.csproj b/Shared/OI.Metrology.Shared.csproj similarity index 93% rename from Shared/Shared.csproj rename to Shared/OI.Metrology.Shared.csproj index fb6cdae..f5928c5 100644 --- a/Shared/Shared.csproj +++ b/Shared/OI.Metrology.Shared.csproj @@ -4,7 +4,7 @@ 10.0 enable win-x64 - net6.0 + net7.0 OI.Metrology.Shared @@ -30,7 +30,7 @@ Linux - - + + \ No newline at end of file diff --git a/Shared/ViewModels/ServiceShopOrder.cs b/Shared/ViewModels/ServiceShopOrder.cs new file mode 100644 index 0000000..54736eb --- /dev/null +++ b/Shared/ViewModels/ServiceShopOrder.cs @@ -0,0 +1,37 @@ +using System.Text.Json; + +namespace OI.Metrology.Shared.ViewModels; + +// [JsonConstructor] +public record ServiceShopOrder(string Id, + string Name, + string[] BookingNames, + string Type, + string State, + string ItemNumber, + DateTime CreatedDate, + DateTime DecidedDate, + string Recipient, + string Requestor) +{ + + internal ServiceShopOrder(Models.Order order) : + this(order.Id, + order.Name, + order.Bookings is null || !order.Bookings.Any() ? Array.Empty() : order.Bookings.Select(l => l.Name).ToArray(), + order.Type, + order.State, + order.ItemNumber, + order.CreatedDate, + order.DecidedDate, + order.Recipient, + order.Requestor) + { } + + public override string ToString() + { + string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + return result; + } + +} \ No newline at end of file diff --git a/Tests/Models/Binder/AppSettings.cs b/Tests/Models/Binder/AppSettings.cs index 5c137f7..e95514c 100644 --- a/Tests/Models/Binder/AppSettings.cs +++ b/Tests/Models/Binder/AppSettings.cs @@ -58,7 +58,9 @@ public class AppSettings public static Models.AppSettings Get(IConfigurationRoot configurationRoot) { Models.AppSettings result; - AppSettings appSettings = configurationRoot.Get(); + AppSettings? appSettings = configurationRoot.Get(); + if (appSettings is null) + throw new NullReferenceException(nameof(appSettings)); result = Get(appSettings); return result; } diff --git a/Tests/Tests.csproj b/Tests/OI.Metrology.Tests.csproj similarity index 84% rename from Tests/Tests.csproj rename to Tests/OI.Metrology.Tests.csproj index 11ef256..09c4880 100644 --- a/Tests/Tests.csproj +++ b/Tests/OI.Metrology.Tests.csproj @@ -5,7 +5,7 @@ 10.0 enable win-x64 - net6.0 + net7.0 trx @@ -27,29 +27,29 @@ Linux - - - - - - - - - + + + + + + + + + - - + + - + Always - + Always diff --git a/Tests/UnitAwaitingDispoController.cs b/Tests/UnitAwaitingDispoController.cs new file mode 100644 index 0000000..0b2635f --- /dev/null +++ b/Tests/UnitAwaitingDispoController.cs @@ -0,0 +1,99 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; +using OI.Metrology.Shared.DataModels; +using OI.Metrology.Shared.Models.Stateless; +using Serilog; +using System.Net.Http.Json; + +namespace OI.Metrology.Tests; + +[TestClass] +public class UnitAwaitingDispoController +{ + +#pragma warning disable CS8618 + + private static ILogger _Logger; + private static string _ControllerName; + private static TestContext _TestContext; + private static WebApplicationFactory _WebApplicationFactory; + +#pragma warning restore + + [ClassInitialize] + public static void ClassInitAsync(TestContext testContext) + { + _TestContext = testContext; + _Logger = Log.ForContext(); + _WebApplicationFactory = new WebApplicationFactory(); + _ControllerName = nameof(Viewer.ApiControllers.ToolTypesController)[..^10]; + } + + [TestMethod] + public void TestControllerName() + { + _Logger.Information("Starting Web Application"); + Assert.AreEqual(IToolTypesController.GetRouteName(), _ControllerName); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void Index() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + IEnumerable awaitingDispos = metrologyRepository.GetAwaitingDispo(); + Assert.IsTrue(awaitingDispos is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task IndexApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.PostAsync($"api/{_ControllerName}", null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void MarkAsReviewed() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + _ = metrologyRepository.UpdateReviewDate(toolTypeId: 0, headerId: 0, clearDate: false); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task MarkAsReviewedApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.GetFromJsonAsync($"api/{_ControllerName}/markasreviewed"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void MarkAsAwaiting() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + int dateCleared = metrologyRepository.UpdateReviewDate(toolTypeId: 0, headerId: 0, clearDate: true); + Assert.IsTrue(dateCleared <= 1); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task MarkAsAwaitingApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.PostAsync($"api/{_ControllerName}/markasawaiting", null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + +} \ No newline at end of file diff --git a/Tests/UnitInboundController.cs b/Tests/UnitInboundController.cs new file mode 100644 index 0000000..f91f0a6 --- /dev/null +++ b/Tests/UnitInboundController.cs @@ -0,0 +1,55 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using OI.Metrology.Shared.Models.Stateless; +using Serilog; + +namespace OI.Metrology.Tests; + +[TestClass] +public class UnitInboundController +{ + +#pragma warning disable CS8618 + + private static ILogger _Logger; + private static string _ControllerName; + private static TestContext _TestContext; + private static WebApplicationFactory _WebApplicationFactory; + +#pragma warning restore + + [ClassInitialize] + public static void ClassInitAsync(TestContext testContext) + { + _TestContext = testContext; + _Logger = Log.ForContext(); + _WebApplicationFactory = new WebApplicationFactory(); + _ControllerName = nameof(Viewer.ApiControllers.ToolTypesController)[..^10]; + } + + [TestMethod] + public void TestControllerName() + { + _Logger.Information("Starting Web Application"); + Assert.AreEqual(IToolTypesController.GetRouteName(), _ControllerName); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task DataApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.PostAsync($"api/{_ControllerName}/a", null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task AttachFileApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.PostAsync($"api/{_ControllerName}/a/attachment", null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + +} \ No newline at end of file diff --git a/Tests/UnitTestAppSettingsController.cs b/Tests/UnitTestAppSettingsController.cs new file mode 100644 index 0000000..f830775 --- /dev/null +++ b/Tests/UnitTestAppSettingsController.cs @@ -0,0 +1,102 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; +using OI.Metrology.Shared.Models.Stateless; +using Serilog; +using System.Net; + +namespace OI.Metrology.Tests; + +[TestClass] +public class UnitTestAppSettingsController +{ + +#pragma warning disable CS8618 + + private static ILogger _Logger; + private static string _ControllerName; + private static TestContext _TestContext; + private static WebApplicationFactory _WebApplicationFactory; + +#pragma warning restore + + [ClassInitialize] + public static void ClassInitAsync(TestContext testContext) + { + _TestContext = testContext; + _Logger = Log.ForContext(); + _WebApplicationFactory = new WebApplicationFactory(); + _ControllerName = nameof(Viewer.ApiControllers.AppSettingsController)[..^10]; + } + + [TestMethod] + public void TestControllerName() + { + _Logger.Information("Starting Web Application"); + Assert.AreEqual(IAppSettingsController.GetRouteName(), _ControllerName); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void AppSettings() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + Viewer.Models.AppSettings appSettings = serviceProvider.GetRequiredService(); + Assert.IsNotNull(appSettings); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetAppSettings() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IAppSettingsRepository appSettingsRepository = serviceProvider.GetRequiredService(); + List collection = appSettingsRepository.GetAppSettings(); + Assert.IsTrue(collection is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetAppSettingsApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + string actionName = nameof(IAppSettingsController.Action.App); + HttpResponseMessage httpResponseMessage = await httpClient.GetAsync($"api/{_ControllerName}/{actionName}"); + Assert.AreEqual(HttpStatusCode.OK, httpResponseMessage.StatusCode); + Assert.AreEqual("application/json; charset=utf-8", httpResponseMessage.Content.Headers.ContentType?.ToString()); + string result = await httpResponseMessage.Content.ReadAsStringAsync(); + httpClient.Dispose(); + Assert.IsNotNull(result); + Assert.IsTrue(result != "[]"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetBuildNumberAndGitCommitSeven() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IAppSettingsRepository appSettingsRepository = serviceProvider.GetRequiredService(); + string result = appSettingsRepository.GetBuildNumberAndGitCommitSeven(); + Assert.IsTrue(result is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetBuildNumberAndGitCommitSevenApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + string actionName = nameof(IAppSettingsController.Action.DevOps); + HttpResponseMessage httpResponseMessage = await httpClient.GetAsync($"api/{_ControllerName}/{actionName}"); + Assert.AreEqual(HttpStatusCode.OK, httpResponseMessage.StatusCode); + Assert.AreEqual("text/plain; charset=utf-8", httpResponseMessage.Content.Headers.ContentType?.ToString()); + string result = await httpResponseMessage.Content.ReadAsStringAsync(); + httpClient.Dispose(); + Assert.IsNotNull(result); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + +} \ No newline at end of file diff --git a/Tests/UnitTestArchive.cs b/Tests/UnitTestArchive.cs index ebbdabe..9acd65c 100644 --- a/Tests/UnitTestArchive.cs +++ b/Tests/UnitTestArchive.cs @@ -1,87 +1,87 @@ -using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using OI.Metrology.Archive.Repositories; -using OI.Metrology.Shared.Models; -using OI.Metrology.Shared.Repositories; -using OI.Metrology.Tests.Models; -using Serilog; -using System.Reflection; -using System.Text.Json; +// using Microsoft.Extensions.Caching.Memory; +// using Microsoft.Extensions.Configuration; +// using Microsoft.Extensions.DependencyInjection; +// using OI.Metrology.Archive.Repositories; +// using OI.Metrology.Shared.Models; +// using OI.Metrology.Shared.Repositories; +// using OI.Metrology.Tests.Models; +// using Serilog; +// using System.Reflection; +// using System.Text.Json; -namespace OI.Metrology.Tests; +// namespace OI.Metrology.Tests; -[TestClass] -public class UnitTestArchive -{ +// [TestClass] +// public class UnitTestArchive +// { - private readonly ILogger _Logger; - private readonly AppSettings _AppSettings; - private readonly string _WorkingDirectory; - private readonly IMemoryCache? _MemoryCache; - private readonly IConfigurationRoot _ConfigurationRoot; +// private readonly ILogger _Logger; +// private readonly AppSettings _AppSettings; +// private readonly string _WorkingDirectory; +// private readonly IMemoryCache? _MemoryCache; +// private readonly IConfigurationRoot _ConfigurationRoot; - public UnitTestArchive() - { - ILogger logger; - AppSettings appSettings; - string workingDirectory; - IConfigurationRoot configurationRoot; - LoggerConfiguration loggerConfiguration = new(); - Assembly assembly = Assembly.GetExecutingAssembly(); - IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() - .AddEnvironmentVariables() - .AddJsonFile("appsettings.Development.json"); - configurationRoot = configurationBuilder.Build(); - appSettings = Models.Binder.AppSettings.Get(configurationRoot); - workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName().Name, appSettings.WorkingDirectoryName); - Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); - _ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot); - Log.Logger = loggerConfiguration.CreateLogger(); - logger = Log.ForContext(); - logger.Information("Complete"); - ServiceCollection services = new(); - ServiceProvider serviceProvider = services.BuildServiceProvider(); - _ = services.AddMemoryCache(); - _MemoryCache = serviceProvider.GetService(); - _Logger = logger; - _AppSettings = appSettings; - _WorkingDirectory = workingDirectory; - _ConfigurationRoot = configurationRoot; - } +// public UnitTestArchive() +// { +// ILogger logger; +// AppSettings appSettings; +// string workingDirectory; +// IConfigurationRoot configurationRoot; +// LoggerConfiguration loggerConfiguration = new(); +// Assembly assembly = Assembly.GetExecutingAssembly(); +// IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() +// .AddEnvironmentVariables() +// .AddJsonFile("appsettings.Development.json"); +// configurationRoot = configurationBuilder.Build(); +// appSettings = Models.Binder.AppSettings.Get(configurationRoot); +// workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName().Name, appSettings.WorkingDirectoryName); +// Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); +// _ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot); +// Log.Logger = loggerConfiguration.CreateLogger(); +// logger = Log.ForContext(); +// logger.Information("Complete"); +// ServiceCollection services = new(); +// ServiceProvider serviceProvider = services.BuildServiceProvider(); +// _ = services.AddMemoryCache(); +// _MemoryCache = serviceProvider.GetService(); +// _Logger = logger; +// _AppSettings = appSettings; +// _WorkingDirectory = workingDirectory; +// _ConfigurationRoot = configurationRoot; +// } - [TestMethod] - public void TestMethodNull() - { - Assert.IsFalse(_Logger is null); - Assert.IsFalse(_AppSettings is null); - Assert.IsFalse(_WorkingDirectory is null); - Assert.IsFalse(_ConfigurationRoot is null); - } +// [TestMethod] +// public void TestMethodNull() +// { +// Assert.IsFalse(_Logger is null); +// Assert.IsFalse(_AppSettings is null); +// Assert.IsFalse(_WorkingDirectory is null); +// Assert.IsFalse(_ConfigurationRoot is null); +// } - [TestMethod] - public void TestMethodArchive() - { - Assert.IsFalse(_Logger is null); - Assert.IsFalse(_AppSettings is null); - Assert.IsFalse(_WorkingDirectory is null); - Assert.IsFalse(_ConfigurationRoot is null); - } +// [TestMethod] +// public void TestMethodArchive() +// { +// Assert.IsFalse(_Logger is null); +// Assert.IsFalse(_AppSettings is null); +// Assert.IsFalse(_WorkingDirectory is null); +// Assert.IsFalse(_ConfigurationRoot is null); +// } - [TestMethod] - public void TestMethodArchiveJson() - { - string json; - string jsonFile = Path.Combine(AppContext.BaseDirectory, "RdsMaxRepo.json"); - Assert.IsTrue(File.Exists(jsonFile)); - json = JsonSerializer.Serialize(_AppSettings); - IRdsMaxRepo rdsMaxRepo = new RdsMaxRepo(json, _MemoryCache); - json = File.ReadAllText(jsonFile); - Shared.DataModels.RDS.Max[]? collection = JsonSerializer.Deserialize(json); - if (collection is null) - throw new NullReferenceException(nameof(collection)); - List data = rdsMaxRepo.Convert(collection); - Assert.IsTrue(data.Any()); - } +// [TestMethod] +// public void TestMethodArchiveJson() +// { +// string json; +// string jsonFile = Path.Combine(AppContext.BaseDirectory, "RdsMaxRepo.json"); +// Assert.IsTrue(File.Exists(jsonFile)); +// json = JsonSerializer.Serialize(_AppSettings); +// IRdsMaxRepo rdsMaxRepo = new RdsMaxRepo(json, _MemoryCache); +// json = File.ReadAllText(jsonFile); +// Shared.DataModels.RDS.Max[]? collection = JsonSerializer.Deserialize(json); +// if (collection is null) +// throw new NullReferenceException(nameof(collection)); +// List data = rdsMaxRepo.Convert(collection); +// Assert.IsTrue(data.Any()); +// } -} \ No newline at end of file +// } \ No newline at end of file diff --git a/Tests/UnitTestClientSettingsController.cs b/Tests/UnitTestClientSettingsController.cs new file mode 100644 index 0000000..2e62bda --- /dev/null +++ b/Tests/UnitTestClientSettingsController.cs @@ -0,0 +1,92 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; +using OI.Metrology.Shared.Models.Stateless; +using Serilog; +using System.Net; + +namespace OI.Metrology.Tests; + +[TestClass] +public class UnitTestClientSettingsController +{ + +#pragma warning disable CS8618 + + private static ILogger _Logger; + private static string _ControllerName; + private static TestContext _TestContext; + private static WebApplicationFactory _WebApplicationFactory; + +#pragma warning restore + + [ClassInitialize] + public static void ClassInitAsync(TestContext testContext) + { + _TestContext = testContext; + _Logger = Log.ForContext(); + _WebApplicationFactory = new WebApplicationFactory(); + _ControllerName = nameof(Viewer.ApiControllers.ClientSettingsController)[..^10]; + } + + [TestMethod] + public void TestControllerName() + { + _Logger.Information("Starting Web Application"); + Assert.AreEqual(IClientSettingsController.GetRouteName(), _ControllerName); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetClientSettings() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IClientSettingsRepository clientSettingsRepository = serviceProvider.GetRequiredService(); + List clientSettings = clientSettingsRepository.GetClientSettings(null); + Assert.IsTrue(clientSettings is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetClientSettingsApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + string actionName = nameof(IClientSettingsController.Action.Client); + HttpResponseMessage httpResponseMessage = await httpClient.GetAsync($"api/{_ControllerName}/{actionName}"); + Assert.AreEqual(HttpStatusCode.OK, httpResponseMessage.StatusCode); + Assert.AreEqual("application/json; charset=utf-8", httpResponseMessage.Content.Headers.ContentType?.ToString()); + string result = await httpResponseMessage.Content.ReadAsStringAsync(); + httpClient.Dispose(); + Assert.IsNotNull(result); + Assert.IsTrue(result != "[]"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetIpAddress() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IClientSettingsRepository clientSettingsRepository = serviceProvider.GetRequiredService(); + string? ipAddress = clientSettingsRepository.GetIpAddress(null); + Assert.IsTrue(ipAddress is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetIpAddressApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + string actionName = nameof(IClientSettingsController.Action.IP); + HttpResponseMessage httpResponseMessage = await httpClient.GetAsync($"api/{_ControllerName}/{actionName}"); + Assert.AreEqual(HttpStatusCode.OK, httpResponseMessage.StatusCode); + Assert.AreEqual("text/plain; charset=utf-8", httpResponseMessage.Content.Headers.ContentType?.ToString()); + string result = await httpResponseMessage.Content.ReadAsStringAsync(); + httpClient.Dispose(); + Assert.IsNotNull(result); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + +} \ No newline at end of file diff --git a/Tests/UnitTestExample.cs b/Tests/UnitTestExample.cs deleted file mode 100644 index 97ea732..0000000 --- a/Tests/UnitTestExample.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Microsoft.Extensions.Configuration; -using OI.Metrology.Shared.Models; -using OI.Metrology.Tests.Models; -using Serilog; -using System.Reflection; - -namespace OI.Metrology.Tests; - -[TestClass] -public class UnitTestExample -{ - - private readonly ILogger _Logger; - private readonly AppSettings _AppSettings; - private readonly string _WorkingDirectory; - private readonly IConfigurationRoot _ConfigurationRoot; - - public UnitTestExample() - { - ILogger logger; - AppSettings appSettings; - string workingDirectory; - IConfigurationRoot configurationRoot; - LoggerConfiguration loggerConfiguration = new(); - Assembly assembly = Assembly.GetExecutingAssembly(); - IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() - .AddEnvironmentVariables() - .AddJsonFile("appsettings.Development.json"); - configurationRoot = configurationBuilder.Build(); - appSettings = Models.Binder.AppSettings.Get(configurationRoot); - workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName().Name, appSettings.WorkingDirectoryName); - Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); - _ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot); - Log.Logger = loggerConfiguration.CreateLogger(); - logger = Log.ForContext(); - logger.Information("Complete"); - _Logger = logger; - _AppSettings = appSettings; - _WorkingDirectory = workingDirectory; - _ConfigurationRoot = configurationRoot; - } - - [TestMethod] - public void TestMethodNull() - { - Assert.IsFalse(_Logger is null); - Assert.IsFalse(_AppSettings is null); - Assert.IsFalse(_WorkingDirectory is null); - Assert.IsFalse(_ConfigurationRoot is null); - } - -} \ No newline at end of file diff --git a/Tests/UnitTestReactorController.cs b/Tests/UnitTestReactorController.cs index 614bf9c..4a6c3a5 100644 --- a/Tests/UnitTestReactorController.cs +++ b/Tests/UnitTestReactorController.cs @@ -1,109 +1,109 @@ -using Microsoft.AspNetCore.Mvc.Testing; -using Microsoft.Extensions.DependencyInjection; -using Serilog; -using System.Net; +// using Microsoft.AspNetCore.Mvc.Testing; +// using Microsoft.Extensions.DependencyInjection; +// using Serilog; +// using System.Net; -namespace OI.Metrology.Tests; +// namespace OI.Metrology.Tests; -[TestClass] -public class UnitTestReactorController -{ +// [TestClass] +// public class UnitTestReactorController +// { - private static TestContext? _TestContext; - private static WebApplicationFactory? _WebApplicationFactory; +// private static TestContext? _TestContext; +// private static WebApplicationFactory? _WebApplicationFactory; - [ClassInitialize] - public static void ClassInitAsync(TestContext testContext) - { - _TestContext = testContext; - _WebApplicationFactory = new WebApplicationFactory(); - } +// [ClassInitialize] +// public static void ClassInitAsync(TestContext testContext) +// { +// _TestContext = testContext; +// _WebApplicationFactory = new WebApplicationFactory(); +// } - [TestMethod] - public async Task GetReactors_ShouldReturnAllReactorsAsync() - { - HttpResponseMessage httpResponseMessage; - if (_WebApplicationFactory is null) - throw new NullReferenceException(nameof(_WebApplicationFactory)); - HttpClient httpClient = _WebApplicationFactory.CreateClient(); - ILogger log = Log.ForContext(); - log.Information("Starting Web Application"); - IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; - Archive.Models.AppSettings appSettings = serviceProvider.GetRequiredService(); - httpResponseMessage = await httpClient.GetAsync($"api/{nameof(Archive.ApiContollers.ReactorsController)[..^10]}/true"); - Assert.AreEqual(HttpStatusCode.OK, httpResponseMessage.StatusCode); - Assert.AreEqual("application/json; charset=utf-8", httpResponseMessage.Content.Headers.ContentType?.ToString()); - httpResponseMessage = await httpClient.GetAsync($"api/{nameof(Archive.ApiContollers.ReactorsController)[..^10]}/false"); - Assert.AreEqual(HttpStatusCode.OK, httpResponseMessage.StatusCode); - // string result = await httpResponseMessage.Content.ReadAsStringAsync(); - // Assert.AreEqual("\"Sample Name 1\"", result); - httpClient.Dispose(); - log.Information($"{_TestContext?.TestName} completed"); - } +// [TestMethod] +// public async Task GetReactors_ShouldReturnAllReactorsAsync() +// { +// HttpResponseMessage httpResponseMessage; +// if (_WebApplicationFactory is null) +// throw new NullReferenceException(nameof(_WebApplicationFactory)); +// HttpClient httpClient = _WebApplicationFactory.CreateClient(); +// ILogger log = Log.ForContext(); +// log.Information("Starting Web Application"); +// IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; +// Archive.Models.AppSettings appSettings = serviceProvider.GetRequiredService(); +// httpResponseMessage = await httpClient.GetAsync($"api/{nameof(Archive.ApiControllers.ReactorsController)[..^10]}/true"); +// Assert.AreEqual(HttpStatusCode.OK, httpResponseMessage.StatusCode); +// Assert.AreEqual("application/json; charset=utf-8", httpResponseMessage.Content.Headers.ContentType?.ToString()); +// httpResponseMessage = await httpClient.GetAsync($"api/{nameof(Archive.ApiControllers.ReactorsController)[..^10]}/false"); +// Assert.AreEqual(HttpStatusCode.OK, httpResponseMessage.StatusCode); +// // string result = await httpResponseMessage.Content.ReadAsStringAsync(); +// // Assert.AreEqual("\"Sample Name 1\"", result); +// httpClient.Dispose(); +// log.Information($"{_TestContext?.TestName} completed"); +// } - // [TestMethod] - // public void GetAllProducts_ShouldReturnAllProducts() - // { - // var testProducts = GetTestProducts(); - // var controller = new OI.Metrology.Archive.ApiContollers.ReactorsController(testProducts); +// // [TestMethod] +// // public void GetAllProducts_ShouldReturnAllProducts() +// // { +// // var testProducts = GetTestProducts(); +// // var controller = new OI.Metrology.Archive.ApiControllers.ReactorsController(testProducts); - // var result = controller.GetAllProducts() as List; - // Assert.AreEqual(testProducts.Count, result.Count); - // } +// // var result = controller.GetAllProducts() as List; +// // Assert.AreEqual(testProducts.Count, result.Count); +// // } - // [TestMethod] - // public async Task GetAllProductsAsync_ShouldReturnAllProducts() - // { - // var testProducts = GetTestProducts(); - // var controller = new OI.Metrology.Archive.ApiContollers.ReactorsController(testProducts); +// // [TestMethod] +// // public async Task GetAllProductsAsync_ShouldReturnAllProducts() +// // { +// // var testProducts = GetTestProducts(); +// // var controller = new OI.Metrology.Archive.ApiControllers.ReactorsController(testProducts); - // var result = await controller.GetAllProductsAsync() as List; - // Assert.AreEqual(testProducts.Count, result.Count); - // } +// // var result = await controller.GetAllProductsAsync() as List; +// // Assert.AreEqual(testProducts.Count, result.Count); +// // } - // [TestMethod] - // public void GetProduct_ShouldReturnCorrectProduct() - // { - // var testProducts = GetTestProducts(); - // var controller = new OI.Metrology.Archive.ApiContollers.ReactorsController(testProducts); +// // [TestMethod] +// // public void GetProduct_ShouldReturnCorrectProduct() +// // { +// // var testProducts = GetTestProducts(); +// // var controller = new OI.Metrology.Archive.ApiControllers.ReactorsController(testProducts); - // var result = controller.GetProduct(4) as OkNegotiatedContentResult; - // Assert.IsNotNull(result); - // Assert.AreEqual(testProducts[3].Name, result.Content.Name); - // } +// // var result = controller.GetProduct(4) as OkNegotiatedContentResult; +// // Assert.IsNotNull(result); +// // Assert.AreEqual(testProducts[3].Name, result.Content.Name); +// // } - // [TestMethod] - // public async Task GetProductAsync_ShouldReturnCorrectProduct() - // { - // var testProducts = GetTestProducts(); - // var controller = new OI.Metrology.Archive.ApiContollers.ReactorsController(testProducts); +// // [TestMethod] +// // public async Task GetProductAsync_ShouldReturnCorrectProduct() +// // { +// // var testProducts = GetTestProducts(); +// // var controller = new OI.Metrology.Archive.ApiControllers.ReactorsController(testProducts); - // var result = await controller.GetProductAsync(4) as OkNegotiatedContentResult; - // Assert.IsNotNull(result); - // Assert.AreEqual(testProducts[3].Name, result.Content.Name); - // } +// // var result = await controller.GetProductAsync(4) as OkNegotiatedContentResult; +// // Assert.IsNotNull(result); +// // Assert.AreEqual(testProducts[3].Name, result.Content.Name); +// // } - // [TestMethod] - // public void GetProduct_ShouldNotFindProduct() - // { - // var controller = new OI.Metrology.Archive.ApiContollers.ReactorsController(GetTestProducts()); +// // [TestMethod] +// // public void GetProduct_ShouldNotFindProduct() +// // { +// // var controller = new OI.Metrology.Archive.ApiControllers.ReactorsController(GetTestProducts()); - // var result = controller.GetProduct(999); - // Assert.IsInstanceOfType(result, typeof(NotFoundResult)); - // } +// // var result = controller.GetProduct(999); +// // Assert.IsInstanceOfType(result, typeof(NotFoundResult)); +// // } - // private List GetTestProducts() - // { - // var testProducts = new List(); - // testProducts.Add(new Product { Id = 1, Name = "Demo1", Price = 1 }); - // testProducts.Add(new Product { Id = 2, Name = "Demo2", Price = 3.75M }); - // testProducts.Add(new Product { Id = 3, Name = "Demo3", Price = 16.99M }); - // testProducts.Add(new Product { Id = 4, Name = "Demo4", Price = 11.00M }); +// // private List GetTestProducts() +// // { +// // var testProducts = new List(); +// // testProducts.Add(new Product { Id = 1, Name = "Demo1", Price = 1 }); +// // testProducts.Add(new Product { Id = 2, Name = "Demo2", Price = 3.75M }); +// // testProducts.Add(new Product { Id = 3, Name = "Demo3", Price = 16.99M }); +// // testProducts.Add(new Product { Id = 4, Name = "Demo4", Price = 11.00M }); - // return testProducts; - // } +// // return testProducts; +// // } - [ClassCleanup] - public static void ClassCleanup() => _WebApplicationFactory?.Dispose(); +// [ClassCleanup] +// public static void ClassCleanup() => _WebApplicationFactory?.Dispose(); -} \ No newline at end of file +// } \ No newline at end of file diff --git a/Tests/UnitTestServiceShopOrderController.cs b/Tests/UnitTestServiceShopOrderController.cs new file mode 100644 index 0000000..6cf2278 --- /dev/null +++ b/Tests/UnitTestServiceShopOrderController.cs @@ -0,0 +1,77 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; +using OI.Metrology.Shared.Models.Stateless; +using OI.Metrology.Shared.ViewModels; +using Serilog; +using System.Net.Http.Json; + +namespace OI.Metrology.Tests; + +[TestClass] +public class UnitTestServiceShopOrderController +{ + +#pragma warning disable CS8618 + + private static ILogger _Logger; + private static string _ControllerName; + private static TestContext _TestContext; + private static WebApplicationFactory _WebApplicationFactory; + +#pragma warning restore + + [ClassInitialize] + public static void ClassInitAsync(TestContext testContext) + { + _TestContext = testContext; + _Logger = Log.ForContext(); + _WebApplicationFactory = new WebApplicationFactory(); + _ControllerName = nameof(Viewer.ApiControllers.ServiceShopOrderController)[..^10]; + } + + [TestMethod] + public void TestControllerName() + { + _Logger.Information("Starting Web Application"); + Assert.AreEqual(IServiceShopOrderController.GetRouteName(), _ControllerName); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetServiceShopOrders() + { + if (_Logger is null) + throw new NullReferenceException(nameof(_Logger)); + ServiceShopOrder[] serviceShopOrders = IServiceShopOrder.GetServiceShopOrders(null); + Assert.IsNotNull(serviceShopOrders); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetAllServiceShopOrders() + { + _Logger.Information("Starting Web Application"); + ServiceShopOrder[] serviceShopOrders; + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IServiceShopOrderRepository serviceShopOrderRepository = serviceProvider.GetRequiredService(); + serviceShopOrders = await serviceShopOrderRepository.GetAllServiceShopOrders(); + Assert.IsTrue(serviceShopOrders is not null); + serviceShopOrders = await serviceShopOrderRepository.GetServiceShopOrders("23188d3d-9b75-ed11-ab8b-0050568f2fc3"); + Assert.IsTrue(serviceShopOrders is not null && serviceShopOrders.Any()); + Assert.IsNotNull(serviceShopOrders[0].ToString()); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetAllServiceShopOrdersApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + string actionName = nameof(IServiceShopOrderController.Action.All); + ServiceShopOrder[]? serviceShopOrders = await httpClient.GetFromJsonAsync($"api/{_ControllerName}/{actionName}"); + Assert.IsNotNull(serviceShopOrders); + Assert.IsTrue(serviceShopOrders.Any()); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + +} \ No newline at end of file diff --git a/Tests/UnitTestToolTypesController.cs b/Tests/UnitTestToolTypesController.cs new file mode 100644 index 0000000..a691672 --- /dev/null +++ b/Tests/UnitTestToolTypesController.cs @@ -0,0 +1,210 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; +using OI.Metrology.Shared.Models.Stateless; +using OI.Metrology.Shared.Services; +using Serilog; +using System.Net.Http.Json; + +namespace OI.Metrology.Tests; + +[TestClass] +public class UnitTestToolTypesController +{ + +#pragma warning disable CS8618 + + private static ILogger _Logger; + private static string _ControllerName; + private static TestContext _TestContext; + private static WebApplicationFactory _WebApplicationFactory; + +#pragma warning restore + + [ClassInitialize] + public static void ClassInitAsync(TestContext testContext) + { + _TestContext = testContext; + _Logger = Log.ForContext(); + _WebApplicationFactory = new WebApplicationFactory(); + _ControllerName = nameof(Viewer.ApiControllers.ToolTypesController)[..^10]; + } + + [TestMethod] + public void TestControllerName() + { + _Logger.Information("Starting Web Application"); + Assert.AreEqual(IToolTypesController.GetRouteName(), _ControllerName); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void Index() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + IToolTypesRepository toolTypesRepository = serviceProvider.GetRequiredService(); + object @object = toolTypesRepository.Index(metrologyRepository); + Assert.IsTrue(@object is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task IndexApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.GetFromJsonAsync($"api/{_ControllerName}"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetToolTypeMetadata() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + IToolTypesRepository toolTypesRepository = serviceProvider.GetRequiredService(); + object @object = toolTypesRepository.GetToolTypeMetadata(metrologyRepository, id: 0, sortby: string.Empty); + Assert.IsTrue(@object is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetToolTypeMetadataApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.GetFromJsonAsync($"api/{_ControllerName}/0"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetHeaders() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + IToolTypesRepository toolTypesRepository = serviceProvider.GetRequiredService(); + string json = toolTypesRepository.GetHeaders(metrologyRepository, id: 0, datebegin: null, dateend: null, page: null, pagesize: null, headerid: null); + Assert.IsTrue(json is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetHeadersApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.GetFromJsonAsync($"api/{_ControllerName}/0/headers"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetHeaderTitles() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + IToolTypesRepository toolTypesRepository = serviceProvider.GetRequiredService(); + string json = toolTypesRepository.GetHeaderTitles(metrologyRepository, id: 0, page: null, pagesize: null); + Assert.IsTrue(json is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetHeaderTitlesApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.GetFromJsonAsync($"api/{_ControllerName}/0/headertitles"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetHeaderFields() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + IToolTypesRepository toolTypesRepository = serviceProvider.GetRequiredService(); + string json = toolTypesRepository.GetHeaderFields(metrologyRepository, id: 0, headerid: 0); + Assert.IsTrue(json is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetHeaderFieldsApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.GetFromJsonAsync($"api/{_ControllerName}/0/headers/0/fields"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetData() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + IToolTypesRepository toolTypesRepository = serviceProvider.GetRequiredService(); + string json = toolTypesRepository.GetData(metrologyRepository, id: 0, headerid: 0); + Assert.IsTrue(json is not null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetDataApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.GetFromJsonAsync($"api/{_ControllerName}/0/headers/data"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void GetAttachment() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IAttachmentsService attachmentsService = serviceProvider.GetRequiredService(); + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + IToolTypesRepository toolTypesRepository = serviceProvider.GetRequiredService(); + (string? message, string? _, Stream? _) = toolTypesRepository.GetAttachment(metrologyRepository, attachmentsService, toolTypeId: 0, string.Empty, string.Empty, string.Empty); + Assert.IsTrue(message is null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task GetAttachmentApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.GetFromJsonAsync($"api/{_ControllerName}/0/0/files/0/a.txt"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public void OIExport() + { + _Logger.Information("Starting Web Application"); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + IMetrologyRepository metrologyRepository = serviceProvider.GetRequiredService(); + IToolTypesRepository toolTypesRepository = serviceProvider.GetRequiredService(); + Viewer.Models.AppSettings appSettings = serviceProvider.GetRequiredService(); + Exception? exception = toolTypesRepository.OIExport(metrologyRepository, appSettings.OIExportPath, toolTypeId: 0, headerid: 0); + Assert.IsTrue(exception is null); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + + [TestMethod] + public async Task OIExportApi() + { + HttpClient httpClient = _WebApplicationFactory.CreateClient(); + _Logger.Information("Starting Web Application"); + _ = await httpClient.GetFromJsonAsync($"api/{_ControllerName}/0/headers/0/oiexport"); + _Logger.Information($"{_TestContext?.TestName} completed"); + } + +} \ No newline at end of file diff --git a/Viewer/ApiControllers/AppSettingsController.cs b/Viewer/ApiControllers/AppSettingsController.cs new file mode 100644 index 0000000..8a580af --- /dev/null +++ b/Viewer/ApiControllers/AppSettingsController.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Mvc; +using OI.Metrology.Shared.Models.Stateless; + +namespace OI.Metrology.Viewer.ApiControllers; + +[ApiController] +[Route("api/[controller]")] +public class AppSettingsController : ControllerBase, IAppSettingsController +{ + + private readonly IAppSettingsRepository _AppSettingsRepository; + + public AppSettingsController(IAppSettingsRepository AppSettingsRepository) => _AppSettingsRepository = AppSettingsRepository; + + [HttpGet(nameof(IAppSettingsController.Action.App))] + public ActionResult GetAppSettings() + { + List results = _AppSettingsRepository.GetAppSettings(); + return Ok(results); + } + + [HttpGet(nameof(IAppSettingsController.Action.DevOps))] + public ActionResult GetBuildNumberAndGitCommitSeven() + { + string result = _AppSettingsRepository.GetBuildNumberAndGitCommitSeven(); + return Ok(result); + } + +} \ No newline at end of file diff --git a/Viewer/ApiControllers/AttachmentsController.cs b/Viewer/ApiControllers/AttachmentsController.cs index aae1a81..ef68fca 100644 --- a/Viewer/ApiControllers/AttachmentsController.cs +++ b/Viewer/ApiControllers/AttachmentsController.cs @@ -1,50 +1,39 @@ using Microsoft.AspNetCore.Mvc; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; -using System; -using System.IO; namespace OI.Metrology.Viewer.ApiControllers; + public class AttachmentsController : Controller { - private readonly IMetrologyRepo _Repo; - private readonly IAttachmentsService _AttachmentsService; - public AttachmentsController(IMetrologyRepo repo, IAttachmentsService attachmentsService) + private readonly IAttachmentsService _AttachmentsService; + private readonly IMetrologyRepository _MetrologyRepository; + + public AttachmentsController(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService) { - _Repo = repo; _AttachmentsService = attachmentsService; + _MetrologyRepository = metrologyRepository; } // this endpoint was created in hope that it would make retrieving attachments to display in OpenInsight easier // url would be like /api/attachments/mercuryprobe/header/HgProbe_66-232268-4329_20180620052640032/data.pdf [HttpGet("/api/attachments/{toolTypeName}/{tabletype}/{title}/{filename}")] - public IActionResult GetAttachment( - string toolTypeName, - string tabletype, - string title, - string filename) + public IActionResult GetAttachment(string toolTypeName, string tabletype, string title, string filename) { - ToolType tt = _Repo.GetToolTypeByName(toolTypeName); - + ToolType tt = _MetrologyRepository.GetToolTypeByName(toolTypeName); bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase); - try { string contenttype = "application/pdf"; if (filename.ToLower().TrimEnd().EndsWith(".txt")) contenttype = "text/plain"; - Stream fs = _AttachmentsService.GetAttachmentStreamByTitle(tt, header, title, filename); return File(fs, contenttype); } - catch (Exception ex) - { - return Content(ex.Message); - } - + catch (Exception ex) { return Content(ex.Message); } } } \ No newline at end of file diff --git a/Viewer/ApiControllers/AwaitingDispoController.cs b/Viewer/ApiControllers/AwaitingDispoController.cs index eb2e5ba..35fa1f6 100644 --- a/Viewer/ApiControllers/AwaitingDispoController.cs +++ b/Viewer/ApiControllers/AwaitingDispoController.cs @@ -1,37 +1,31 @@ using Microsoft.AspNetCore.Mvc; -namespace OI.Metrology.Viewer.ApiContollers; +namespace OI.Metrology.Viewer.ApiControllers; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using System.Text.Json; // this controller is for the Awaiting Dispo functionality +[Route("api/[controller]")] public class AwaitingDispoController : Controller { - private readonly IMetrologyRepo _Repo; - - public AwaitingDispoController(IMetrologyRepo repo) => _Repo = repo; + private readonly IMetrologyRepository _MetrologyRepository; + public AwaitingDispoController(IMetrologyRepository metrologyRepository) => + _MetrologyRepository = metrologyRepository; // returns the data to show in the Awaiting Dispo grid // marked no-cache, just-in-case since igniteUI automatically adds a query string parameter to prevent caching - [HttpGet("/api/awaitingdispo")] + [HttpGet] [ResponseCache(NoStore = true)] - public IActionResult Index() - { - - var r = new - { - Results = _Repo.GetAwaitingDispo() - }; - return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); - } + public IActionResult Index() => + Json(_MetrologyRepository.GetAwaitingDispo(), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); // this endpoint is used to set the ReviewDate column, causing the header to no longer show in Awaiting Dispo [HttpPost("/api/awaitingdispo/markasreviewed")] public IActionResult MarkAsReviewed([FromQuery] long headerid, [FromQuery] int tooltypeid) { - _ = _Repo.UpdateReviewDate(tooltypeid, headerid, false); + _ = _MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, false); return Ok(); } @@ -39,7 +33,7 @@ public class AwaitingDispoController : Controller [HttpPost("/api/awaitingdispo/markasawaiting")] public IActionResult MarkAsAwaiting([FromQuery] long headerid, [FromQuery] int tooltypeid) { - if (_Repo.UpdateReviewDate(tooltypeid, headerid, true) <= 1) + if (_MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, true) <= 1) return Ok(); else return StatusCode(444); diff --git a/Viewer/ApiControllers/ClientSettingsController.cs b/Viewer/ApiControllers/ClientSettingsController.cs new file mode 100644 index 0000000..bc55abb --- /dev/null +++ b/Viewer/ApiControllers/ClientSettingsController.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Mvc; +using OI.Metrology.Shared.Models.Stateless; + +namespace OI.Metrology.Viewer.ApiControllers; + +[ApiController] +[Route("api/[controller]")] +public class ClientSettingsController : ControllerBase, IClientSettingsController +{ + + private readonly IClientSettingsRepository _ClientSettingsRepository; + + public ClientSettingsController(IClientSettingsRepository clientSettingsRepository) => _ClientSettingsRepository = clientSettingsRepository; + + [HttpGet(nameof(IClientSettingsController.Action.Client))] + public ActionResult GetClientSettings() + { + List results = _ClientSettingsRepository.GetClientSettings(Request.HttpContext.Connection?.RemoteIpAddress); + return Ok(results); + } + + [HttpGet(nameof(IClientSettingsController.Action.IP))] + public ActionResult GetIpAddress() + { + string result = _ClientSettingsRepository.GetIpAddress(Request.HttpContext.Connection?.RemoteIpAddress); + return Ok(result); + } + +} \ No newline at end of file diff --git a/Viewer/ApiControllers/InboundController.cs b/Viewer/ApiControllers/InboundController.cs index 9bd3ca6..c7c3b25 100644 --- a/Viewer/ApiControllers/InboundController.cs +++ b/Viewer/ApiControllers/InboundController.cs @@ -1,168 +1,78 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; +using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; -using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; using OI.Metrology.Viewer.Models; -using System; -using System.Collections.Generic; -using System.Linq; +using System.Net; -namespace OI.Metrology.Viewer.ApiContollers; +namespace OI.Metrology.Viewer.ApiControllers; [ApiController] -public class InboundController : ControllerBase +[Route("api/[controller]")] +public partial class InboundController : ControllerBase, IInboundController { private readonly ILogger _Logger; - private readonly IMetrologyRepo _Repo; private readonly AppSettings _AppSettings; - private readonly IAttachmentsService _AttachmentService; + private readonly IInboundRepository _InboundRepository; + private readonly IAttachmentsService _AttachmentsService; private readonly IInboundDataService _InboundDataService; + private readonly IMetrologyRepository _MetrologyRepository; - public InboundController(AppSettings appSettings, ILogger logger, IMetrologyRepo repo, IInboundDataService inboundDataService, IAttachmentsService attachmentService) + public InboundController(AppSettings appSettings, ILogger logger, IMetrologyRepository metrologyRepository, IInboundRepository inboundRepository, IInboundDataService inboundDataService, IAttachmentsService attachmentsService) { - _Repo = repo; _Logger = logger; _AppSettings = appSettings; - _AttachmentService = attachmentService; + _InboundRepository = inboundRepository; + _AttachmentsService = attachmentsService; _InboundDataService = inboundDataService; + _MetrologyRepository = metrologyRepository; } - // this class represents the API response back to the client - public class DataResponse - { - public bool Success { get; set; } - public long HeaderID { get; set; } - public List Errors { get; set; } - public List Warnings { get; set; } - } - - // this is the main endpoint, it accepts a JSON message that contains both the header and data records together - // tooltype is the ToolTypeName column from the ToolType table - // JToken is how you can accept a JSON message without deserialization. - // Using "string" doesn't work because ASP.NET Core will expect a json encoded string, not give you the actual string. - [HttpPost("/api/inbound/{tooltype}")] + [HttpPost] + [Route("{tooltype}")] public IActionResult Data(string tooltype, [FromBody] JToken jsonbody) { - DataResponse r = new() + IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; + if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) { - Success = false, - HeaderID = -1, - Errors = new List(), - Warnings = new List() - }; - - if (!IsIPAddressAllowed()) - { - _Logger.LogInformation($"Rejected remote IP: {HttpContext.Connection.RemoteIpAddress}"); - r.Errors.Add("Remote IP is not on allowed list"); - return Unauthorized(r); - } - - ToolType toolType = _Repo.GetToolTypeByName(tooltype); - - if (toolType == null) - { - r.Errors.Add("Invalid tool type: " + tooltype); - return BadRequest(r); - } - - // get metadata - - List metaData = _Repo.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList(); - - if (metaData == null) - { - r.Errors.Add("Invalid metadata for tool type: " + tooltype); - return BadRequest(r); - } - - // validate fields - - if (jsonbody != null) - _InboundDataService.ValidateJSONFields(jsonbody, 0, metaData, r.Errors, r.Warnings); - else - r.Errors.Add("Invalid json"); - - if (r.Errors.Count == 0) - { - try - { - r.HeaderID = _InboundDataService.DoSQLInsert(jsonbody, toolType, metaData); - r.Success = r.HeaderID > 0; - } - catch (Exception ex) - { - r.Errors.Add(ex.Message); - } - return Ok(r); - } - else - { - return BadRequest(r); - } - - } - - // this is the endpoint for attaching a field. It is not JSON, it is form-data/multipart like an HTML form because that's the normal way. - // header ID is the ID value from the Header table - // datauniqueid is the Title value from the Data/Detail table - [HttpPost("/api/inbound/{tooltype}/attachment")] - public IActionResult AttachFile(string tooltype, [FromQuery] long headerid, [FromQuery] string datauniqueid = "") - { - if (!IsIPAddressAllowed()) - { - _Logger.LogInformation($"Rejected remote IP: {HttpContext.Connection.RemoteIpAddress}"); + _Logger.LogInformation($"Rejected remote IP: {remoteIP}"); return Unauthorized("Remote IP is not on allowed list"); } - - ToolType toolType = _Repo.GetToolTypeByName(tooltype); - - if (toolType == null) - return BadRequest($"Invalid tool type: {tooltype}"); - - if (Request.Form == null) - return BadRequest($"Invalid form"); - - if (Request.Form.Files.Count != 1) - return BadRequest($"Invalid file count"); - - string filename = System.IO.Path.GetFileName(Request.Form.Files[0].FileName); - - if (string.IsNullOrWhiteSpace(filename)) - return BadRequest("Empty filename"); - - if (filename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) >= 0) - return BadRequest("Invalid filename"); - - _AttachmentService.SaveAttachment(toolType, headerid, datauniqueid, filename, Request.Form.Files[0]); - - return Ok(); + else + { + DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, jsonbody); + if (!dataResponse.Errors.Any()) + return Ok(dataResponse); + else + return BadRequest(dataResponse); + } } - protected bool IsIPAddressAllowed() + [HttpPost] + [Route("{tooltype}/attachment")] + public IActionResult AttachFile(string tooltype, [FromQuery] long headerid, [FromQuery] string datauniqueid = "") { - if (string.IsNullOrWhiteSpace(_AppSettings.InboundApiAllowedIPList)) - return true; - - System.Net.IPAddress remoteIP = HttpContext.Connection.RemoteIpAddress; - byte[] remoteIPBytes = remoteIP.GetAddressBytes(); - - string[] allowedIPs = _AppSettings.InboundApiAllowedIPList.Split(';'); - foreach (string ip in allowedIPs) + IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; + if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) { - System.Net.IPAddress parsedIP; - if (System.Net.IPAddress.TryParse(ip, out parsedIP)) - { - if (parsedIP.GetAddressBytes().SequenceEqual(remoteIPBytes)) - return true; - } + _Logger.LogInformation($"Rejected remote IP: {remoteIP}"); + return Unauthorized("Remote IP is not on allowed list"); + } + else + { + if (Request.Form is null) + return BadRequest($"Invalid form"); + if (Request.Form.Files.Count != 1) + return BadRequest($"Invalid file count"); + IFormFile formFile = Request.Form.Files[0]; + string? message = _InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, headerid, datauniqueid, formFile.FileName, formFile); + if (message is null) + return Ok(); + else + return BadRequest(message); } - - return false; } } \ No newline at end of file diff --git a/Viewer/ApiControllers/ServiceShopOrderController.cs b/Viewer/ApiControllers/ServiceShopOrderController.cs new file mode 100644 index 0000000..ec2e03f --- /dev/null +++ b/Viewer/ApiControllers/ServiceShopOrderController.cs @@ -0,0 +1,46 @@ +using Microsoft.AspNetCore.Mvc; +using OI.Metrology.Shared.Models.Stateless; + +namespace OI.Metrology.Viewer.ApiControllers; + +[ApiController] +[Route("api/[controller]")] +public class ServiceShopOrderController : ControllerBase, IServiceShopOrderController +{ + + private readonly IServiceShopOrderRepository _ServiceShopOrderRepository; + + public ServiceShopOrderController(IServiceShopOrderRepository ServiceShopOrderRepository) => _ServiceShopOrderRepository = ServiceShopOrderRepository; + + [HttpGet(nameof(IServiceShopOrderController.Action.All))] + public async Task GetAllServiceShopOrders() + { + try + { + Shared.ViewModels.ServiceShopOrder[] results = await _ServiceShopOrderRepository.GetAllServiceShopOrders(); + return Ok(results); + } + catch (Exception) + { + return StatusCode(StatusCodes.Status500InternalServerError, + "Error retrieving data from the database"); + } + } + + [HttpGet] + [Route("{id}")] + public async Task GetServiceShopOrders(string id) + { + try + { + Shared.ViewModels.ServiceShopOrder[] results = await _ServiceShopOrderRepository.GetServiceShopOrders(id); + return Ok(results); + } + catch (Exception) + { + return StatusCode(StatusCodes.Status500InternalServerError, + "Error retrieving data from the database"); + } + } + +} \ No newline at end of file diff --git a/Viewer/ApiControllers/ToolTypesController.cs b/Viewer/ApiControllers/ToolTypesController.cs index 6f26e22..cd2a135 100644 --- a/Viewer/ApiControllers/ToolTypesController.cs +++ b/Viewer/ApiControllers/ToolTypesController.cs @@ -1,249 +1,84 @@ using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; -using System; -using System.IO; -using System.Linq; -namespace OI.Metrology.Viewer.ApiContollers; +namespace OI.Metrology.Viewer.ApiControllers; -using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; using OI.Metrology.Viewer.Models; -using System.Collections.Generic; using System.Text.Json; -// using System.Data.Common; - -public class ToolTypesController : Controller +[Route("api/[controller]")] +public class ToolTypesController : Controller, IToolTypesController { // this controller powers the bulk of the UI // it is named after the /api/tooltypes prefix // the URL pattern is RESTful and the tool type is the root of every request - private readonly IMetrologyRepo _Repo; private readonly AppSettings _AppSettings; + private readonly IMetrologyRepository _MetrologyRepo; private readonly IAttachmentsService _AttachmentsService; + private readonly IToolTypesRepository _ToolTypesRepository; - public ToolTypesController(AppSettings appSettings, IMetrologyRepo repo, IAttachmentsService attachmentsService) + public ToolTypesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, IToolTypesRepository toolTypesRepository) { - _Repo = repo; _AppSettings = appSettings; + _MetrologyRepo = metrologyRepository; _AttachmentsService = attachmentsService; + _ToolTypesRepository = toolTypesRepository; } - // Get a list of tooltypes, returns just Name and ID - [HttpGet("/api/tooltypes")] - public IActionResult Index() + [HttpGet] + public IActionResult Index() => + Json(_ToolTypesRepository.Index(_MetrologyRepo), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); + + [HttpGet] + [Route("{id}")] + public IActionResult GetToolTypeMetadata(int id, string sortby = "") => + Json(_ToolTypesRepository.GetToolTypeMetadata(_MetrologyRepo, id, sortby), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); + + [HttpGet] + [Route("{id}/headers")] + public IActionResult GetHeaders(int id, [FromQuery] DateTime? datebegin, [FromQuery] DateTime? dateend, [FromQuery] int? page, [FromQuery] int? pagesize, [FromQuery] long? headerid) => + Content(_ToolTypesRepository.GetHeaders(_MetrologyRepo, id, datebegin, dateend, page, pagesize, headerid)); + + [HttpGet] + [Route("{id}/headertitles")] + public IActionResult GetHeaderTitles(int id, [FromQuery] int? page, [FromQuery] int? pagesize) => + Content(_ToolTypesRepository.GetHeaderTitles(_MetrologyRepo, id, page, pagesize)); + + [HttpGet] + [Route("{id}/headers/{headerid}/fields")] + public IActionResult GetHeaderFields(int id, long headerid) => + Content(_ToolTypesRepository.GetHeaderFields(_MetrologyRepo, id, headerid)); + + [HttpGet] + [Route("{id}/headers/{headerid}/data")] + public IActionResult GetData(int id, long headerid) => + Content(_ToolTypesRepository.GetData(_MetrologyRepo, id, headerid)); + + [HttpGet] + [Route("{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")] + public IActionResult GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename) { - var r = new - { - Results = _Repo.GetToolTypes().Select(tt => new { tt.ToolTypeName, tt.ID }) - }; - return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); + (string? message, string? contenttype, Stream? stream) = _ToolTypesRepository.GetAttachment(_MetrologyRepo, _AttachmentsService, toolTypeId, tabletype, attachmentId, filename); + if (message is not null) + return Content(message); + else if (contenttype is not null && stream is not null) + return File(stream, contenttype); + else + throw new Exception(); } - // Gets the metadata for a tooltype, accepts a parameter which sorts the results - // This is used to setup the grid displays on the UI - [HttpGet("/api/tooltypes/{id}")] - public IActionResult GetToolTypeMetadata(int id, string sortby = "") - { - ToolType tt = _Repo.GetToolTypeByID(id); - IEnumerable md = _Repo.GetToolTypeMetadataByToolTypeID(id); - - if (string.Equals(sortby, "grid", StringComparison.OrdinalIgnoreCase)) - md = md.OrderBy(f => f.GridDisplayOrder).ToList(); - if (string.Equals(sortby, "table", StringComparison.OrdinalIgnoreCase)) - md = md.OrderBy(f => f.GridDisplayOrder).ToList(); - - var r = new - { - Results = new - { - ToolType = tt, - Metadata = md - } - }; - return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); - } - - // Gets headers, request/response format is to allow paging with igniteUI - // The headerid parameter is used for navigating directly to a header, when the button is clicked in Awaiting Dispo - [HttpGet("/api/tooltypes/{id}/headers")] - public IActionResult GetHeaders( - int id, - [FromQuery] DateTime? datebegin, - [FromQuery] DateTime? dateend, - [FromQuery] int? page, - [FromQuery] int? pagesize, - [FromQuery] long? headerid) - { - long totalRecs; - - System.Data.DataTable dt = _Repo.GetHeaders(id, datebegin, dateend, page, pagesize, headerid, out totalRecs); - - var r = new - { - Results = dt, - TotalRows = totalRecs, - }; - string json = JsonConvert.SerializeObject(r); - - return Content(json); - } - - // Gets header titles, used in the Run Headers UI - [HttpGet("/api/tooltypes/{id}/headertitles")] - public IActionResult GetHeaderTitles( - int id, - [FromQuery] int? page, - [FromQuery] int? pagesize) - { - long totalRecs; - - IEnumerable dt = _Repo.GetHeaderTitles(id, page, pagesize, out totalRecs); - - var r = new - { - Results = dt, - TotalRows = totalRecs, - }; - string json = JsonConvert.SerializeObject(r); - - return Content(json); - } - - // Get all of the fields for a header, used with the Run Header UI - [HttpGet("/api/tooltypes/{id}/headers/{headerid}/fields")] - public IActionResult GetHeaderFields( - int id, - long headerid) - { - var r = new - { - Results = _Repo.GetHeaderFields(id, headerid).Select(x => new { Column = x.Key, x.Value }).ToList() - }; - string json = JsonConvert.SerializeObject(r); - - return Content(json); - } - - // Get the data for a header, used with the Run Info UI - [HttpGet("/api/tooltypes/{id}/headers/{headerid}/data")] - public IActionResult GetData( - int id, - long headerid) - { - var r = new - { - Results = _Repo.GetData(id, headerid) - }; - string json = JsonConvert.SerializeObject(r); - - return Content(json); - } - - // Display an attachment, used for Run Info - note it is by tool type ID and attachment GUID, so it is best for internal use - [HttpGet("/api/tooltypes/{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")] - public IActionResult GetAttachment( - int toolTypeId, - string tabletype, - string attachmentId, - string filename) - { - ToolType tt = _Repo.GetToolTypeByID(toolTypeId); - - bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase); - - Guid attachmentIdParsed; - if (!Guid.TryParse(attachmentId, out attachmentIdParsed)) - return Content("Invalid attachment id"); - - try - { - // figure out what content type to use. this is very simple because there are only two types being used - string contenttype = "application/pdf"; - if (filename.ToLower().TrimEnd().EndsWith(".txt")) - contenttype = "text/plain"; - - // Get attachment stream and feed it to the client - Stream fs = _AttachmentsService.GetAttachmentStreamByAttachmentId(tt, header, attachmentIdParsed, filename); - return File(fs, contenttype); - } - catch (Exception ex) - { - return Content(ex.Message); - } - } - - // This endpoint triggers writing of the OI Export file - [HttpPost("/api/tooltypes/{toolTypeId}/headers/{headerid}/oiexport")] + [HttpPost] + [Route("{toolTypeId}/headers/{headerid}/oiexport")] public IActionResult OIExport(int toolTypeId, long headerid) { - // Call the export stored procedure - System.Data.DataSet ds = _Repo.GetOIExportData(toolTypeId, headerid); - - try - { - // The SP must return 3 result tables - if (ds.Tables.Count != 3) - throw new Exception("Error exporting, invalid results"); - - // The first table has just one row, which is the export filename - if (ds.Tables[0].Rows.Count != 1) - throw new Exception("Error exporting, invalid filename"); - - string filename = Convert.ToString(ds.Tables[0].Rows[0][0]); - - // The second table has the header data - if (ds.Tables[1].Rows.Count != 1) - throw new Exception("Error exporting, invalid header data"); - - System.Text.StringBuilder sb = new(); - - foreach (object o in ds.Tables[1].Rows[0].ItemArray) - { - if ((o != null) && (!Convert.IsDBNull(o))) - _ = sb.Append(Convert.ToString(o)); - _ = sb.Append('\t'); - } - - // The third table has the detail data - foreach (System.Data.DataRow dr in ds.Tables[2].Rows) - { - foreach (object o in dr.ItemArray) - { - if ((o != null) && (!Convert.IsDBNull(o))) - _ = sb.Append(Convert.ToString(o)); - _ = sb.Append('\t'); - } - } - _ = sb.AppendLine(); - - // The output file will only have one line, the header columns are output first - // Then each detail rows has it's columns appended - // H1, H2, H3, D1.1, D1.2, D1.3, D2.1, D2.2, D2.3, etc - - // Write the file - System.IO.File.WriteAllText( - Path.Join(_AppSettings.OIExportPath, filename), - sb.ToString()); - - } - catch (Exception ex) - { - string json = JsonConvert.SerializeObject(new - { - ex.Message, - }); - return BadRequest(json); - } - - var r = new - { - Message = "OK", - }; - return Ok(r); + Exception? exception = _ToolTypesRepository.OIExport(_MetrologyRepo, _AppSettings.OIExportPath, toolTypeId, headerid); + if (exception is null) + return Ok(new { Message = "OK" }); + else + return BadRequest(JsonConvert.SerializeObject(new { exception.Message })); } } \ No newline at end of file diff --git a/Viewer/ApiLoggingMiddleware.cs b/Viewer/ApiLoggingMiddleware.cs index 8ee7c9e..7eb1c5b 100644 --- a/Viewer/ApiLoggingMiddleware.cs +++ b/Viewer/ApiLoggingMiddleware.cs @@ -1,11 +1,5 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using OI.Metrology.Viewer.Models; -using System; -using System.IO; -using System.Linq; +using OI.Metrology.Viewer.Models; using System.Text; -using System.Threading.Tasks; namespace OI.Metrology.Viewer; @@ -43,7 +37,8 @@ public class ApiLoggingMiddleware else { // if there are content type filters configured, only log is the request begins with one of them - doLogging = _AppSettings.ApiLoggingContentTypes.Split(';').Any(ct => httpContext.Request.ContentType.StartsWith(ct)); + string? contentType = httpContext.Request.ContentType; + doLogging = contentType is not null && _AppSettings.ApiLoggingContentTypes.Split(';').Any(ct => contentType.StartsWith(ct)); } } } diff --git a/Viewer/Controllers/ErrorHandlerController.cs b/Viewer/Controllers/ErrorHandlerController.cs index aba090f..fd75034 100644 --- a/Viewer/Controllers/ErrorHandlerController.cs +++ b/Viewer/Controllers/ErrorHandlerController.cs @@ -1,7 +1,5 @@ using Microsoft.AspNetCore.Diagnostics; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; namespace OI.Metrology.Viewer.Controllers; @@ -14,8 +12,8 @@ public class ErrorHandlerController : Controller public IActionResult Index() { - IExceptionHandlerFeature error = HttpContext.Features.Get(); - if (error == null) + IExceptionHandlerFeature? error = HttpContext.Features.Get(); + if (error is null) { return Redirect("~/"); } @@ -24,7 +22,7 @@ public class ErrorHandlerController : Controller _Logger.LogError("Unhandled exception: " + error.Error.ToString()); dynamic r = new { - Message = error.Error == null ? "Error" : error.Error.Message + Message = error.Error is null ? "Error" : error.Error.Message }; return StatusCode(StatusCodes.Status500InternalServerError, r); } diff --git a/Viewer/Controllers/ExportController.cs b/Viewer/Controllers/ExportController.cs index d932450..612f3ee 100644 --- a/Viewer/Controllers/ExportController.cs +++ b/Viewer/Controllers/ExportController.cs @@ -1,14 +1,10 @@ using Infineon.Monitoring.MonA; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.Extensions.Logging; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.ViewModels; using OI.Metrology.Viewer.Models; -using System; -using System.Collections.Generic; -using System.Linq; using System.Text; namespace OI.Metrology.Viewer.Controllers; @@ -17,14 +13,14 @@ public class ExportController : Controller { private readonly ILogger _Logger; private readonly bool _IsTestDatabase; - private readonly IMetrologyRepo _Repo; private readonly AppSettings _AppSettings; + private readonly IMetrologyRepository _MetrologyRepository; - public ExportController(AppSettings appSettings, ILogger logger, IMetrologyRepo repo) + public ExportController(AppSettings appSettings, ILogger logger, IMetrologyRepository metrologyRepository) { - _Repo = repo; _Logger = logger; _AppSettings = appSettings; + _MetrologyRepository = metrologyRepository; _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); } @@ -52,14 +48,14 @@ public class ExportController : Controller [Route("/ExportData")] public ActionResult ExportData(Export model) { - ToolType toolType = null; + ToolType? toolType = null; if (string.IsNullOrEmpty(model.ToolType)) ModelState.AddModelError("Exception", "Invalid selection"); else { if (model.StartTime > model.EndTime) ModelState.AddModelError("EndTime", "End time must be after start time"); - IEnumerable toolTypes = _Repo.GetToolTypes(); + IEnumerable toolTypes = _MetrologyRepository.GetToolTypes(); toolType = toolTypes.Where(tt => tt.ID.ToString() == model.ToolType).SingleOrDefault(); if (toolType is null) ModelState.AddModelError("ToolType", "Invalid selection"); @@ -73,7 +69,7 @@ public class ExportController : Controller DateTime startDT = model.StartDate.Date.Add(model.StartTime.TimeOfDay); DateTime endDT = model.EndDate.Date.Add(model.EndTime.TimeOfDay); - return DoCSVExport(toolType.ToolTypeName, toolType.ExportSPName, startDT, endDT); + return DoCSVExport(toolType?.ToolTypeName, toolType?.ExportSPName, startDT, endDT); } catch (Exception ex) { @@ -86,22 +82,17 @@ public class ExportController : Controller return View("Index", model); } - protected ActionResult DoCSVExport(string toolTypeName, string spName, DateTime startTime, DateTime endTime) + protected ActionResult DoCSVExport(string? toolTypeName, string? spName, DateTime startTime, DateTime endTime) { string fileName = string.Format("Export_{0}_{1:yyyyMMddHHmm}_to_{2:yyyyMMddHHmm}.csv", toolTypeName, startTime, endTime); StringBuilder sb = new(); - - System.Data.DataTable dt = _Repo.ExportData(spName, startTime, endTime); - + if (spName is null) + throw new NullReferenceException(nameof(spName)); + System.Data.DataTable dt = _MetrologyRepository.ExportData(spName, startTime, endTime); _ = sb.AppendLine(GetColumnHeaders(dt)); - foreach (System.Data.DataRow dr in dt.Rows) - { _ = sb.AppendLine(GetRowData(dr)); - } - byte[] contents = Encoding.UTF8.GetBytes(sb.ToString()); - return File(contents, "application/octet-stream", fileName); } @@ -112,10 +103,13 @@ public class ExportController : Controller { if (i > 0) _ = r.Append(','); - object v = dr[i]; if (!Convert.IsDBNull(v)) - _ = r.Append(FormatForCSV(Convert.ToString(v))); + { + string? c = Convert.ToString(v); + if (c is not null) + _ = r.Append(FormatForCSV(c)); + } } return r.ToString(); } @@ -135,16 +129,13 @@ public class ExportController : Controller protected static string FormatForCSV(string v) { - StringBuilder r = new(v.Length + 2); - bool doubleQuoted = false; - + StringBuilder r = new(v.Length + 2); if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"')) { _ = r.Append('"'); doubleQuoted = true; } - foreach (char c in v) { _ = c switch @@ -154,10 +145,8 @@ public class ExportController : Controller _ => r.Append(c), }; } - if (doubleQuoted) _ = r.Append('"'); - return r.ToString(); } diff --git a/Viewer/Controllers/PagesController.cs b/Viewer/Controllers/PagesController.cs index 0b7b21c..a5aeea0 100644 --- a/Viewer/Controllers/PagesController.cs +++ b/Viewer/Controllers/PagesController.cs @@ -1,20 +1,19 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.ViewModels; using OI.Metrology.Viewer.Models; -using System; namespace OI.Metrology.Viewer.Controllers; public class PagesController : Controller { - private readonly IMetrologyRepo _Repo; private readonly bool _IsTestDatabase; + private readonly IMetrologyRepository _MetrologyRepository; - public PagesController(AppSettings appSettings, IMetrologyRepo repo) + public PagesController(AppSettings appSettings, IMetrologyRepository metrologyRepository) { - _Repo = repo; + _MetrologyRepository = metrologyRepository; _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); } @@ -48,7 +47,7 @@ public class PagesController : Controller }; if (headerid > 0) { - m.HeaderAttachmentID = _Repo.GetHeaderAttachmentID(tooltypeid, headerid); + m.HeaderAttachmentID = _MetrologyRepository.GetHeaderAttachmentID(tooltypeid, headerid); } return View(m); } diff --git a/Viewer/Data/Mike/service-shop.json b/Viewer/Data/Mike/service-shop.json new file mode 100644 index 0000000..498c6bc --- /dev/null +++ b/Viewer/Data/Mike/service-shop.json @@ -0,0 +1,8035 @@ +{ + "Orders": [ + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Hybrid Infineon Cloud Platform Consulting [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "656fde79-22c1-ec11-a88b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "2bae1bb2-351f-c1ca-def2-08da2345fc63", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1f3a5ab3-23c1-ec11-a88b-0050568f2fc3", + "CustomFormEntityName": "Ud_CF_IFX_HybridIFXCloudPlatfConType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "23188d3d-9b75-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "27188d3d-9b75-ed11-ab8b-0050568f2fc3", + "Id": "2c188d3d-9b75-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "656fde79-22c1-ec11-a88b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Accept": true, + "Reorder": true + }, + "Id": "23188d3d-9b75-ed11-ab8b-0050568f2fc3", + "ObjectId": "1b188d3d-9b75-ed11-ab8b-0050568f2fc3", + "Name": "ORD2491814-Install", + "Type": "Install", + "TypeId": 10, + "State": "Provisioned", + "StateId": 1045, + "StateIcon": "settings", + "StateColor": "0xFF6734BA", + "ItemNumber": "ORD2491814", + "CreatedDate": "2022-12-06T19:21:55.767Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "0d21afd1-ea74-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "1121afd1-ea74-ed11-ab8b-0050568f2fc3", + "Id": "1621afd1-ea74-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + } + ], + "AllowedActions": { + "Accept": true, + "Reorder": true + }, + "Id": "0d21afd1-ea74-ed11-ab8b-0050568f2fc3", + "ObjectId": "0521afd1-ea74-ed11-ab8b-0050568f2fc3", + "Name": "ORD2490311-Install", + "Type": "Install", + "TypeId": 10, + "State": "Provisioned", + "StateId": 1045, + "StateIcon": "settings", + "StateColor": "0xFF6734BA", + "ItemNumber": "ORD2490311", + "CreatedDate": "2022-12-05T22:19:06.703Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "ICP Project - New [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "049aa605-76de-e911-978b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "fa99a605-76de-e911-978b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "cd2051f5-0c72-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "d12051f5-0c72-ed11-ab8b-0050568f2fc3", + "Id": "d62051f5-0c72-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "049aa605-76de-e911-978b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "cd2051f5-0c72-ed11-ab8b-0050568f2fc3", + "ObjectId": "c52051f5-0c72-ed11-ab8b-0050568f2fc3", + "Name": "ORD2487507-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2487507", + "CreatedDate": "2022-12-02T06:45:55.123Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Unix Account Deletion (Urania) pharesl [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "2d769ba1-145c-e011-a482-005056b1201d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17769ba1-145c-e011-a482-005056b1201d", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e81a8625-dc70-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "ec1a8625-dc70-ed11-ab8b-0050568f2fc3", + "Id": "f11a8625-dc70-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "2d769ba1-145c-e011-a482-005056b1201d" + } + } + ], + "AllowedActions": {}, + "Id": "e81a8625-dc70-ed11-ab8b-0050568f2fc3", + "ObjectId": "e01a8625-dc70-ed11-ab8b-0050568f2fc3", + "Name": "ORD2485441-Install", + "Type": "Install", + "TypeId": 10, + "State": "Approved", + "StateId": 1042, + "StateIcon": "supervisor_account", + "StateColor": "0xFF689F38", + "ItemNumber": "ORD2485441", + "CreatedDate": "2022-11-30T18:24:03.653Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Unix Personal Account Deletion (R&D and Business Unix) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "83c65e6d-155c-e011-a482-005056b1201d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "6dc65e6d-155c-e011-a482-005056b1201d", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "5735c925-dc70-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "5b35c925-dc70-ed11-ab8b-0050568f2fc3", + "Id": "6035c925-dc70-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "83c65e6d-155c-e011-a482-005056b1201d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "5735c925-dc70-ed11-ab8b-0050568f2fc3", + "ObjectId": "4f35c925-dc70-ed11-ab8b-0050568f2fc3", + "Name": "ORD2485440-Install", + "Type": "Install", + "TypeId": 10, + "State": "Approved", + "StateId": 1042, + "StateIcon": "supervisor_account", + "StateColor": "0xFF689F38", + "ItemNumber": "ORD2485440", + "CreatedDate": "2022-11-30T18:24:00.41Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Unix Personal Account pharesl [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "2d769ba1-145c-e011-a482-005056b1201d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17769ba1-145c-e011-a482-005056b1201d", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "d5c0bbe7-1070-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 2, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "d9c0bbe7-1070-ed11-ab8b-0050568f2fc3", + "Id": "dec0bbe7-1070-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "2d769ba1-145c-e011-a482-005056b1201d" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Add Location to Unix Personal Account in Mesa (BUX) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "2d769ba1-145c-e011-a482-005056b1201d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17769ba1-145c-e011-a482-005056b1201d", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "d5c0bbe7-1070-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 4, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "e0c0bbe7-1070-ed11-ab8b-0050568f2fc3", + "Id": "e5c0bbe7-1070-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "2d769ba1-145c-e011-a482-005056b1201d" + } + } + ], + "AllowedActions": {}, + "Id": "d5c0bbe7-1070-ed11-ab8b-0050568f2fc3", + "ObjectId": "cdc0bbe7-1070-ed11-ab8b-0050568f2fc3", + "Name": "ORD2483773-Install", + "Type": "Install", + "TypeId": 10, + "State": "Canceled", + "StateId": 1052, + "StateIcon": "remove_circle", + "StateColor": "0xFFFF5722", + "ItemNumber": "ORD2483773", + "CreatedDate": "2022-11-29T18:09:10.93Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Unix Personal Account [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "6fdf4e80-b894-e811-66ba-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "65df4e80-b894-e811-66ba-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "5dc33de3-1070-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 4, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "61c33de3-1070-ed11-ab8b-0050568f2fc3", + "Id": "66c33de3-1070-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "6fdf4e80-b894-e811-66ba-0050568f7353" + } + } + ], + "AllowedActions": {}, + "Id": "5dc33de3-1070-ed11-ab8b-0050568f2fc3", + "ObjectId": "55c33de3-1070-ed11-ab8b-0050568f2fc3", + "Name": "ORD2483772-Install", + "Type": "Install", + "TypeId": 10, + "State": "Canceled", + "StateId": 1052, + "StateIcon": "remove_circle", + "StateColor": "0xFFFF5722", + "ItemNumber": "ORD2483772", + "CreatedDate": "2022-11-29T18:09:04.08Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Add Location to Unix Personal Account in El Segundo [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "2d769ba1-145c-e011-a482-005056b1201d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17769ba1-145c-e011-a482-005056b1201d", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e7b5d4a9-0670-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "ebb5d4a9-0670-ed11-ab8b-0050568f2fc3", + "Id": "f0b5d4a9-0670-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "2d769ba1-145c-e011-a482-005056b1201d" + } + } + ], + "AllowedActions": {}, + "Id": "e7b5d4a9-0670-ed11-ab8b-0050568f2fc3", + "ObjectId": "dfb5d4a9-0670-ed11-ab8b-0050568f2fc3", + "Name": "ORD2483739-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2483739", + "CreatedDate": "2022-11-29T16:55:52.247Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Add Location to Unix Personal Account [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "cae494ac-b994-e811-66ba-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "c0e494ac-b994-e811-66ba-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "4d73eda6-0670-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "8673eda6-0670-ed11-ab8b-0050568f2fc3", + "Id": "9673eda6-0670-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "cae494ac-b994-e811-66ba-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "4d73eda6-0670-ed11-ab8b-0050568f2fc3", + "ObjectId": "4573eda6-0670-ed11-ab8b-0050568f2fc3", + "Name": "ORD2483738-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2483738", + "CreatedDate": "2022-11-29T16:55:47.6Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Special Account - Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "d6b86b22-e776-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "ccb86b22-e776-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "64063dc6-df75-e911-938b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccount_ModificationType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "ff5a8f70-1b6a-ed11-ab8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "035b8f70-1b6a-ed11-ab8b-0050568f2fc3", + "Id": "085b8f70-1b6a-ed11-ab8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "d6b86b22-e776-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "ff5a8f70-1b6a-ed11-ab8b-0050568f2fc3", + "ObjectId": "f75a8f70-1b6a-ed11-ab8b-0050568f2fc3", + "Name": "ORD2475200-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2475200", + "CreatedDate": "2022-11-22T04:09:22.097Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Add Location to Unix Personal Account in Mesa (BUX) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "2d769ba1-145c-e011-a482-005056b1201d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17769ba1-145c-e011-a482-005056b1201d", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "06fe1087-b224-ed11-aa8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "0afe1087-b224-ed11-aa8b-0050568f2fc3", + "Id": "0ffe1087-b224-ed11-aa8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "2d769ba1-145c-e011-a482-005056b1201d" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Unix Personal Account phares [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "2d769ba1-145c-e011-a482-005056b1201d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17769ba1-145c-e011-a482-005056b1201d", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "06fe1087-b224-ed11-aa8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "11fe1087-b224-ed11-aa8b-0050568f2fc3", + "Id": "16fe1087-b224-ed11-aa8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "2d769ba1-145c-e011-a482-005056b1201d" + } + } + ], + "AllowedActions": {}, + "Id": "06fe1087-b224-ed11-aa8b-0050568f2fc3", + "ObjectId": "fefd1087-b224-ed11-aa8b-0050568f2fc3", + "Name": "ORD2377575-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2377575", + "CreatedDate": "2022-08-25T20:14:41.11Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Unix Personal Account [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "6fdf4e80-b894-e811-66ba-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "65df4e80-b894-e811-66ba-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "98d04385-b224-ed11-aa8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "9cd04385-b224-ed11-aa8b-0050568f2fc3", + "Id": "a1d04385-b224-ed11-aa8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "6fdf4e80-b894-e811-66ba-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "98d04385-b224-ed11-aa8b-0050568f2fc3", + "ObjectId": "90d04385-b224-ed11-aa8b-0050568f2fc3", + "Name": "ORD2377574-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2377574", + "CreatedDate": "2022-08-25T20:14:33.35Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "04801f7b-6f1e-ed11-aa8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "08801f7b-6f1e-ed11-aa8b-0050568f2fc3", + "Id": "0d801f7b-6f1e-ed11-aa8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "04801f7b-6f1e-ed11-aa8b-0050568f2fc3", + "ObjectId": "fc7f1f7b-6f1e-ed11-aa8b-0050568f2fc3", + "Name": "ORD2369036-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2369036", + "CreatedDate": "2022-08-17T20:59:29.737Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "EC File Share Access [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ab947991-e806-eb11-9f8b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "cde90390-f2d6-c61e-9e94-08d8690bfe71", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "b5a8fd36-d219-ed11-aa8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "2da9fd36-d219-ed11-aa8b-0050568f2fc3", + "Id": "32a9fd36-d219-ed11-aa8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ab947991-e806-eb11-9f8b-0050568f2fc3" + } + } + ], + "AllowedActions": {}, + "Id": "b5a8fd36-d219-ed11-aa8b-0050568f2fc3", + "ObjectId": "a3a8fd36-d219-ed11-aa8b-0050568f2fc3", + "Name": "ORD2363429-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2363429", + "CreatedDate": "2022-08-12T00:03:41.62Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "EC File Share Access [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "92d52cbc-e606-eb11-9f8b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "b16dfcae-a617-cbb4-50f8-08d86909f7c6", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "5e057130-d219-ed11-aa8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "62057130-d219-ed11-aa8b-0050568f2fc3", + "Id": "67057130-d219-ed11-aa8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "92d52cbc-e606-eb11-9f8b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "5e057130-d219-ed11-aa8b-0050568f2fc3", + "ObjectId": "56057130-d219-ed11-aa8b-0050568f2fc3", + "Name": "ORD2363428-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2363428", + "CreatedDate": "2022-08-12T00:03:36.77Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "File Share Access [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "38fc32a1-1362-e711-039e-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "2efc32a1-1362-e711-039e-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "08befe50-b819-ed11-aa8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 2, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "0cbefe50-b819-ed11-aa8b-0050568f2fc3", + "Id": "11befe50-b819-ed11-aa8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "38fc32a1-1362-e711-039e-0050568f7353" + } + } + ], + "AllowedActions": {}, + "Id": "08befe50-b819-ed11-aa8b-0050568f2fc3", + "ObjectId": "00befe50-b819-ed11-aa8b-0050568f2fc3", + "Name": "ORD2363373-Install", + "Type": "Install", + "TypeId": 10, + "State": "Declined", + "StateId": 1043, + "StateIcon": "highlight_off", + "StateColor": "0xFFC02E1D", + "ItemNumber": "ORD2363373", + "CreatedDate": "2022-08-11T20:58:23.757Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Terminal Server Software Rollout [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "9cde3a09-1806-4e62-8238-9b72d3c12981", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "73939178-8bdb-47c2-91da-496f8608531a", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "32aeb796-edfc-4b96-996c-f6131e82bea7", + "CustomFormEntityName": "Ud_CF_IFX_TerminalServerSoftwareRolloutiAppsPortalType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "570dd46e-e70c-ed11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "5b0dd46e-e70c-ed11-a98b-0050568f2fc3", + "Id": "600dd46e-e70c-ed11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "9cde3a09-1806-4e62-8238-9b72d3c12981" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "570dd46e-e70c-ed11-a98b-0050568f2fc3", + "ObjectId": "4f0dd46e-e70c-ed11-a98b-0050568f2fc3", + "Name": "ORD2344051-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2344051", + "CreatedDate": "2022-07-26T13:32:46.613Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "c6b50145-0109-ed11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "cab50145-0109-ed11-a98b-0050568f2fc3", + "Id": "cfb50145-0109-ed11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "c6b50145-0109-ed11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "d1b50145-0109-ed11-a98b-0050568f2fc3", + "Id": "d6b50145-0109-ed11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "c6b50145-0109-ed11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "d8b50145-0109-ed11-a98b-0050568f2fc3", + "Id": "ddb50145-0109-ed11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "c6b50145-0109-ed11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "dfb50145-0109-ed11-a98b-0050568f2fc3", + "Id": "e4b50145-0109-ed11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "c6b50145-0109-ed11-a98b-0050568f2fc3", + "ObjectId": "beb50145-0109-ed11-a98b-0050568f2fc3", + "Name": "ORD2339561-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2339561", + "CreatedDate": "2022-07-21T14:27:43.987Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e49d8c25-5afd-ec11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "e89d8c25-5afd-ec11-a98b-0050568f2fc3", + "Id": "ed9d8c25-5afd-ec11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "e49d8c25-5afd-ec11-a98b-0050568f2fc3", + "ObjectId": "dc9d8c25-5afd-ec11-a98b-0050568f2fc3", + "Name": "ORD2322650-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2322650", + "CreatedDate": "2022-07-06T18:33:38.41Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "8de5db48-85fc-ec11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "9be5db48-85fc-ec11-a98b-0050568f2fc3", + "Id": "a0e5db48-85fc-ec11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "8de5db48-85fc-ec11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "a2e5db48-85fc-ec11-a98b-0050568f2fc3", + "Id": "a7e5db48-85fc-ec11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "8de5db48-85fc-ec11-a98b-0050568f2fc3", + "ObjectId": "85e5db48-85fc-ec11-a98b-0050568f2fc3", + "Name": "ORD2320980-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2320980", + "CreatedDate": "2022-07-05T17:09:56.557Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "51ed1363-41f6-ec11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "55ed1363-41f6-ec11-a98b-0050568f2fc3", + "Id": "5aed1363-41f6-ec11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Network Integration of Custom Endpoint [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "678eb1f3-e79d-e311-f6bc-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "448eb1f3-e79d-e311-f6bc-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "51ed1363-41f6-ec11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "5ced1363-41f6-ec11-a98b-0050568f2fc3", + "Id": "61ed1363-41f6-ec11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "678eb1f3-e79d-e311-f6bc-0050568f7353" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "51ed1363-41f6-ec11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "63ed1363-41f6-ec11-a98b-0050568f2fc3", + "Id": "68ed1363-41f6-ec11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "51ed1363-41f6-ec11-a98b-0050568f2fc3", + "ObjectId": "49ed1363-41f6-ec11-a98b-0050568f2fc3", + "Name": "ORD2311296-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2311296", + "CreatedDate": "2022-06-27T17:48:48.4Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "FAB Client - Windows 10 [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "1acac122-ef6a-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "10cac122-ef6a-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "3097505e-6c65-e911-938b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_FABClientType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "af167202-2bdd-ec11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "b3167202-2bdd-ec11-a98b-0050568f2fc3", + "Id": "b8167202-2bdd-ec11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "1acac122-ef6a-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "af167202-2bdd-ec11-a98b-0050568f2fc3", + "ObjectId": "a7167202-2bdd-ec11-a98b-0050568f2fc3", + "Name": "ORD2279358-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2279358", + "CreatedDate": "2022-05-26T19:35:40.003Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Special Account - Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "d6b86b22-e776-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "ccb86b22-e776-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "64063dc6-df75-e911-938b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccount_ModificationType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "cc433463-bbcf-ec11-a98b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "d0433463-bbcf-ec11-a98b-0050568f2fc3", + "Id": "d5433463-bbcf-ec11-a98b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "d6b86b22-e776-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "cc433463-bbcf-ec11-a98b-0050568f2fc3", + "ObjectId": "c4433463-bbcf-ec11-a98b-0050568f2fc3", + "Name": "ORD2261245-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2261245", + "CreatedDate": "2022-05-09T17:13:48.483Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Special Account for Clients & Applications [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "55a2cc5f-ff67-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "4ba2cc5f-ff67-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "bcbfe962-1e28-e911-928b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccForClientsAndAppsType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "97e87cd2-8eb6-ec11-a88b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "9de87cd2-8eb6-ec11-a88b-0050568f2fc3", + "Id": "a2e87cd2-8eb6-ec11-a88b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "55a2cc5f-ff67-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "97e87cd2-8eb6-ec11-a88b-0050568f2fc3", + "ObjectId": "8fe87cd2-8eb6-ec11-a88b-0050568f2fc3", + "Name": "ORD2231674-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2231674", + "CreatedDate": "2022-04-07T16:21:56.127Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "Company iOS Smartphone [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "193cc116-bed9-e911-978b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "0f3cc116-bed9-e911-978b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "5654e295-83b9-e911-968b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_iPhone_NA_ObjPickerType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "f667356f-38a6-ec11-a88b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "fa67356f-38a6-ec11-a88b-0050568f2fc3", + "Id": "ff67356f-38a6-ec11-a88b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "193cc116-bed9-e911-978b-0050568f2fc3" + } + } + ], + "AllowedActions": {}, + "Id": "f667356f-38a6-ec11-a88b-0050568f2fc3", + "ObjectId": "ee67356f-38a6-ec11-a88b-0050568f2fc3", + "Name": "ORD2210129-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2210129", + "CreatedDate": "2022-03-17T21:23:07.677Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e5802345-0e99-ec11-a88b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "e9802345-0e99-ec11-a88b-0050568f2fc3", + "Id": "ee802345-0e99-ec11-a88b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e5802345-0e99-ec11-a88b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "f0802345-0e99-ec11-a88b-0050568f2fc3", + "Id": "f5802345-0e99-ec11-a88b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Network Integration of Custom Endpoint [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "678eb1f3-e79d-e311-f6bc-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "448eb1f3-e79d-e311-f6bc-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e5802345-0e99-ec11-a88b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "f7802345-0e99-ec11-a88b-0050568f2fc3", + "Id": "fc802345-0e99-ec11-a88b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "678eb1f3-e79d-e311-f6bc-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "e5802345-0e99-ec11-a88b-0050568f2fc3", + "ObjectId": "dd802345-0e99-ec11-a88b-0050568f2fc3", + "Name": "ORD2191816-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2191816", + "CreatedDate": "2022-03-01T03:18:35.263Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": " Software Installation Permission [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c556e104-3003-e711-5da5-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "bb56e104-3003-e711-5da5-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "81b212d8-3003-e711-5da5-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_GenSoftwareType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "7b28de97-b679-ec11-a68b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "7f28de97-b679-ec11-a68b-0050568f2fc3", + "Id": "8428de97-b679-ec11-a68b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c556e104-3003-e711-5da5-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "7b28de97-b679-ec11-a68b-0050568f2fc3", + "ObjectId": "7328de97-b679-ec11-a68b-0050568f2fc3", + "Name": "ORD2153849-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2153849", + "CreatedDate": "2022-01-20T06:02:54.303Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Notebook/Desktop Refresh [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "23f223d1-4a2b-e811-25a9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "19f223d1-4a2b-e811-25a9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "96e74bb2-4d2b-e811-25a9-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_NotebookDesktopRefreshType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "66911360-2574-ec11-a68b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "6a911360-2574-ec11-a68b-0050568f2fc3", + "Id": "6f911360-2574-ec11-a68b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "23f223d1-4a2b-e811-25a9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "66911360-2574-ec11-a68b-0050568f2fc3", + "ObjectId": "5e911360-2574-ec11-a68b-0050568f2fc3", + "Name": "ORD2146469-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2146469", + "CreatedDate": "2022-01-13T04:00:50.16Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Network Integration of Custom Endpoint [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "678eb1f3-e79d-e311-f6bc-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "448eb1f3-e79d-e311-f6bc-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "70686107-be1f-ec11-a58b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "74686107-be1f-ec11-a58b-0050568f2fc3", + "Id": "79686107-be1f-ec11-a58b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "678eb1f3-e79d-e311-f6bc-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "70686107-be1f-ec11-a58b-0050568f2fc3", + "ObjectId": "68686107-be1f-ec11-a58b-0050568f2fc3", + "Name": "ORD2054518-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2054518", + "CreatedDate": "2021-09-27T18:09:26.67Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "b19f781a-bd1f-ec11-a58b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "b79f781a-bd1f-ec11-a58b-0050568f2fc3", + "Id": "bc9f781a-bd1f-ec11-a58b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "b19f781a-bd1f-ec11-a58b-0050568f2fc3", + "ObjectId": "a99f781a-bd1f-ec11-a58b-0050568f2fc3", + "Name": "ORD2054514-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2054514", + "CreatedDate": "2021-09-27T18:02:41.113Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Network Integration of Custom Endpoint [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "678eb1f3-e79d-e311-f6bc-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "448eb1f3-e79d-e311-f6bc-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "617418af-e604-ec11-a58b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "657418af-e604-ec11-a58b-0050568f2fc3", + "Id": "6a7418af-e604-ec11-a58b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "678eb1f3-e79d-e311-f6bc-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "617418af-e604-ec11-a58b-0050568f2fc3", + "ObjectId": "597418af-e604-ec11-a58b-0050568f2fc3", + "Name": "ORD2024785-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2024785", + "CreatedDate": "2021-08-24T14:22:21.323Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "2db141b1-e504-ec11-a58b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "34b141b1-e504-ec11-a58b-0050568f2fc3", + "Id": "3fb141b1-e504-ec11-a58b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "2db141b1-e504-ec11-a58b-0050568f2fc3", + "ObjectId": "25b141b1-e504-ec11-a58b-0050568f2fc3", + "Name": "ORD2024775-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2024775", + "CreatedDate": "2021-08-24T14:15:17.09Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Carrier Todd (IFEPI NPI SQ)", + "RecipientId": "4d9ecb96-51be-47bb-977e-c6c6ab7b9c52", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "bdf16315-78ff-eb11-a58b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "c1f16315-78ff-eb11-a58b-0050568f2fc3", + "Id": "c6f16315-78ff-eb11-a58b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "bdf16315-78ff-eb11-a58b-0050568f2fc3", + "ObjectId": "b5f16315-78ff-eb11-a58b-0050568f2fc3", + "Name": "ORD2019789-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2019789", + "CreatedDate": "2021-08-17T16:28:09.08Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Network Integration of Custom Endpoint [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "678eb1f3-e79d-e311-f6bc-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "448eb1f3-e79d-e311-f6bc-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "d95ab8d0-77ff-eb11-a58b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "dd5ab8d0-77ff-eb11-a58b-0050568f2fc3", + "Id": "e25ab8d0-77ff-eb11-a58b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "678eb1f3-e79d-e311-f6bc-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "d95ab8d0-77ff-eb11-a58b-0050568f2fc3", + "ObjectId": "d15ab8d0-77ff-eb11-a58b-0050568f2fc3", + "Name": "ORD2019788-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2019788", + "CreatedDate": "2021-08-17T16:26:13.04Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "0b2b876a-76ff-eb11-a58b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "0f2b876a-76ff-eb11-a58b-0050568f2fc3", + "Id": "142b876a-76ff-eb11-a58b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "0b2b876a-76ff-eb11-a58b-0050568f2fc3", + "ObjectId": "032b876a-76ff-eb11-a58b-0050568f2fc3", + "Name": "ORD2019782-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2019782", + "CreatedDate": "2021-08-17T16:16:03.98Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "EC Windows File Share - Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ce38d49b-cd73-e511-688d-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "b838d49b-cd73-e511-688d-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "f855f875-b573-e511-688d-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_CCL_FileShare_ModType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "4e9e4915-79fc-eb11-a58b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "529e4915-79fc-eb11-a58b-0050568f2fc3", + "Id": "579e4915-79fc-eb11-a58b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ce38d49b-cd73-e511-688d-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "4e9e4915-79fc-eb11-a58b-0050568f2fc3", + "ObjectId": "469e4915-79fc-eb11-a58b-0050568f2fc3", + "Name": "ORD2017280-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2017280", + "CreatedDate": "2021-08-13T20:57:38.22Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Access to IDMS-Admin Application [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "a95158b7-f5cc-eb11-a38b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "5ec0f520-71ec-cf90-c1e7-08d92f198c86", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "de736491-facc-eb11-a38b-0050568f2fc3", + "CustomFormEntityName": "Ud_CF_IFX_Access2IDMS_Admin_AppType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "0a5e45ab-e0f3-eb11-a58b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "125e45ab-e0f3-eb11-a58b-0050568f2fc3", + "Id": "175e45ab-e0f3-eb11-a58b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "a95158b7-f5cc-eb11-a38b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "0a5e45ab-e0f3-eb11-a58b-0050568f2fc3", + "ObjectId": "025e45ab-e0f3-eb11-a58b-0050568f2fc3", + "Name": "ORD2007190-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD2007190", + "CreatedDate": "2021-08-02T22:26:27.567Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "480a6c78-4aea-eb11-a38b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "4c0a6c78-4aea-eb11-a38b-0050568f2fc3", + "Id": "510a6c78-4aea-eb11-a38b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "480a6c78-4aea-eb11-a38b-0050568f2fc3", + "ObjectId": "400a6c78-4aea-eb11-a38b-0050568f2fc3", + "Name": "ORD1997545-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1997545", + "CreatedDate": "2021-07-21T17:38:43.797Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Network Integration of Custom Endpoint [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "678eb1f3-e79d-e311-f6bc-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "448eb1f3-e79d-e311-f6bc-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "4e7617ec-49ea-eb11-a38b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "527617ec-49ea-eb11-a38b-0050568f2fc3", + "Id": "577617ec-49ea-eb11-a38b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "678eb1f3-e79d-e311-f6bc-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "4e7617ec-49ea-eb11-a38b-0050568f2fc3", + "ObjectId": "467617ec-49ea-eb11-a38b-0050568f2fc3", + "Name": "ORD1997544-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1997544", + "CreatedDate": "2021-07-21T17:34:45.517Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Network Integration of Custom Endpoint [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "678eb1f3-e79d-e311-f6bc-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "448eb1f3-e79d-e311-f6bc-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e2364a1b-e5e8-eb11-a38b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "e6364a1b-e5e8-eb11-a38b-0050568f2fc3", + "Id": "eb364a1b-e5e8-eb11-a38b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "678eb1f3-e79d-e311-f6bc-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "e2364a1b-e5e8-eb11-a38b-0050568f2fc3", + "ObjectId": "da364a1b-e5e8-eb11-a38b-0050568f2fc3", + "Name": "ORD1995549-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1995549", + "CreatedDate": "2021-07-19T23:00:31.723Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Special Account - Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "d6b86b22-e776-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "ccb86b22-e776-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "64063dc6-df75-e911-938b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccount_ModificationType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "c1ef96f6-ebd2-eb11-a38b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "cfef96f6-ebd2-eb11-a38b-0050568f2fc3", + "Id": "d4ef96f6-ebd2-eb11-a38b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "d6b86b22-e776-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "c1ef96f6-ebd2-eb11-a38b-0050568f2fc3", + "ObjectId": "b9ef96f6-ebd2-eb11-a38b-0050568f2fc3", + "Name": "ORD1971080-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1971080", + "CreatedDate": "2021-06-21T23:54:11.04Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "FAB Client - Windows 10 [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "1acac122-ef6a-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "10cac122-ef6a-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "3097505e-6c65-e911-938b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_FABClientType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "f4d2c4a3-9cc8-eb11-a38b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "02d3c4a3-9cc8-eb11-a38b-0050568f2fc3", + "Id": "07d3c4a3-9cc8-eb11-a38b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "1acac122-ef6a-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "f4d2c4a3-9cc8-eb11-a38b-0050568f2fc3", + "ObjectId": "ecd2c4a3-9cc8-eb11-a38b-0050568f2fc3", + "Name": "ORD1960613-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1960613", + "CreatedDate": "2021-06-08T21:01:06.327Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Special Account - Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "d6b86b22-e776-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "ccb86b22-e776-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "64063dc6-df75-e911-938b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccount_ModificationType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "840fa35b-aeb2-eb11-a38b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "920fa35b-aeb2-eb11-a38b-0050568f2fc3", + "Id": "970fa35b-aeb2-eb11-a38b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "d6b86b22-e776-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "840fa35b-aeb2-eb11-a38b-0050568f2fc3", + "ObjectId": "7c0fa35b-aeb2-eb11-a38b-0050568f2fc3", + "Name": "ORD1940441-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1940441", + "CreatedDate": "2021-05-11T23:12:34.803Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e9d8b8cf-d0a2-eb11-a38b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "f9d8b8cf-d0a2-eb11-a38b-0050568f2fc3", + "Id": "fed8b8cf-d0a2-eb11-a38b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "e9d8b8cf-d0a2-eb11-a38b-0050568f2fc3", + "ObjectId": "e1d8b8cf-d0a2-eb11-a38b-0050568f2fc3", + "Name": "ORD1924069-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1924069", + "CreatedDate": "2021-04-21T18:38:49.7Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": " Software Installation Permission [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c556e104-3003-e711-5da5-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "bb56e104-3003-e711-5da5-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "81b212d8-3003-e711-5da5-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_GenSoftwareType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "9195f81c-3092-eb11-a28b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "9f95f81c-3092-eb11-a28b-0050568f2fc3", + "Id": "a495f81c-3092-eb11-a28b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c556e104-3003-e711-5da5-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "9195f81c-3092-eb11-a28b-0050568f2fc3", + "ObjectId": "8995f81c-3092-eb11-a28b-0050568f2fc3", + "Name": "ORD1907380-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1907380", + "CreatedDate": "2021-03-31T14:48:14.21Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "MailRelay - Internal Registration [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "aad73ca7-eb78-e811-f1b8-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "a0d73ca7-eb78-e811-f1b8-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "3106e15b-ea78-e811-f1b8-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_InternalMailRelayRegType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "a870de41-e090-eb11-a28b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "b670de41-e090-eb11-a28b-0050568f2fc3", + "Id": "bb70de41-e090-eb11-a28b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "aad73ca7-eb78-e811-f1b8-0050568f7353" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": " Software Installation Permission [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c556e104-3003-e711-5da5-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "bb56e104-3003-e711-5da5-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "81b212d8-3003-e711-5da5-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_GenSoftwareType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "a870de41-e090-eb11-a28b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 2, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "c170de41-e090-eb11-a28b-0050568f2fc3", + "Id": "c670de41-e090-eb11-a28b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c556e104-3003-e711-5da5-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "a870de41-e090-eb11-a28b-0050568f2fc3", + "ObjectId": "a070de41-e090-eb11-a28b-0050568f2fc3", + "Name": "ORD1905467-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1905467", + "CreatedDate": "2021-03-29T22:44:02.82Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Functional Mailbox - Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "360e2f29-eeaf-4a59-a6cb-ee58d57e590a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "e3b93c5c-a484-4404-98b1-f0c411f1fefa", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "5d0d9521-c2f6-e311-29b1-0050568f7355", + "CustomFormEntityName": "Ud_CF_IFX_FunctionalMailboxModification2Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "a9917a8c-2681-eb11-a28b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "b7917a8c-2681-eb11-a28b-0050568f2fc3", + "Id": "bc917a8c-2681-eb11-a28b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "360e2f29-eeaf-4a59-a6cb-ee58d57e590a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "a9917a8c-2681-eb11-a28b-0050568f2fc3", + "ObjectId": "a1917a8c-2681-eb11-a28b-0050568f2fc3", + "Name": "ORD1890453-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1890453", + "CreatedDate": "2021-03-09T22:27:01.43Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "ff7a50b0-506d-eb11-a28b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "0d7b50b0-506d-eb11-a28b-0050568f2fc3", + "Id": "127b50b0-506d-eb11-a28b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "ff7a50b0-506d-eb11-a28b-0050568f2fc3", + "ObjectId": "f77a50b0-506d-eb11-a28b-0050568f2fc3", + "Name": "ORD1870543-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1870543", + "CreatedDate": "2021-02-12T16:38:17.58Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "1b1eff04-8961-eb11-a28b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "291eff04-8961-eb11-a28b-0050568f2fc3", + "Id": "2e1eff04-8961-eb11-a28b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "1b1eff04-8961-eb11-a28b-0050568f2fc3", + "ObjectId": "131eff04-8961-eb11-a28b-0050568f2fc3", + "Name": "ORD1858252-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1858252", + "CreatedDate": "2021-01-28T16:51:17.703Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "6345b2a5-333b-eb11-a18b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "7145b2a5-333b-eb11-a18b-0050568f2fc3", + "Id": "7645b2a5-333b-eb11-a18b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "6345b2a5-333b-eb11-a18b-0050568f2fc3", + "ObjectId": "5b45b2a5-333b-eb11-a18b-0050568f2fc3", + "Name": "ORD1827432-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1827432", + "CreatedDate": "2020-12-10T22:04:24.003Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "5793b421-663a-eb11-a18b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "6593b421-663a-eb11-a18b-0050568f2fc3", + "Id": "6a93b421-663a-eb11-a18b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "5793b421-663a-eb11-a18b-0050568f2fc3", + "ObjectId": "4f93b421-663a-eb11-a18b-0050568f2fc3", + "Name": "ORD1826546-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1826546", + "CreatedDate": "2020-12-09T21:33:15.243Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "LAN Port [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "17318ff5-57b0-4123-92e7-370bcf0306b0", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "1fdf77e9-155a-e611-72ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_LAN_PortType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "eafc2cbf-6133-eb11-a18b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "fbfc2cbf-6133-eb11-a18b-0050568f2fc3", + "Id": "00fd2cbf-6133-eb11-a18b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "3c930fd1-08e5-45b3-ae92-994f5e7c4d7d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "eafc2cbf-6133-eb11-a18b-0050568f2fc3", + "ObjectId": "e2fc2cbf-6133-eb11-a18b-0050568f2fc3", + "Name": "ORD1819354-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1819354", + "CreatedDate": "2020-11-30T23:14:08.87Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Network Integration of Custom Endpoint [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "678eb1f3-e79d-e311-f6bc-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "448eb1f3-e79d-e311-f6bc-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "b0201b60-8f2a-eb11-a18b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "be201b60-8f2a-eb11-a18b-0050568f2fc3", + "Id": "c3201b60-8f2a-eb11-a18b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "678eb1f3-e79d-e311-f6bc-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "b0201b60-8f2a-eb11-a18b-0050568f2fc3", + "ObjectId": "a8201b60-8f2a-eb11-a18b-0050568f2fc3", + "Name": "ORD1812452-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1812452", + "CreatedDate": "2020-11-19T17:48:11.447Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "606120c4-cf1a-eb11-a18b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "6e6120c4-cf1a-eb11-a18b-0050568f2fc3", + "Id": "736120c4-cf1a-eb11-a18b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "606120c4-cf1a-eb11-a18b-0050568f2fc3", + "ObjectId": "586120c4-cf1a-eb11-a18b-0050568f2fc3", + "Name": "ORD1797948-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1797948", + "CreatedDate": "2020-10-30T16:48:44.377Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Account Validation - Change Owner for meseaf [Klagenfurt]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "455b722f-cb62-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "50376aff-334f-ca09-8417-08d7c4eed1fb", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "2acf189e-8a5f-ea11-9b8b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_ITValidation_ChangeOwnerType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "6a39e246-189f-ea11-9d8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 2, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "9539e246-189f-ea11-9d8b-0050568f2fc3", + "Id": "9a39e246-189f-ea11-9d8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "455b722f-cb62-ea11-998b-aa59a9db3b67" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Account Validation - Change Owner for ifxeafadmin [Klagenfurt]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "455b722f-cb62-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "50376aff-334f-ca09-8417-08d7c4eed1fb", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "2acf189e-8a5f-ea11-9b8b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_ITValidation_ChangeOwnerType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "6a39e246-189f-ea11-9d8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 2, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "a039e246-189f-ea11-9d8b-0050568f2fc3", + "Id": "a539e246-189f-ea11-9d8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "455b722f-cb62-ea11-998b-aa59a9db3b67" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Account Validation - Change Owner for ifxedaadmin [Klagenfurt]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "455b722f-cb62-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "50376aff-334f-ca09-8417-08d7c4eed1fb", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "2acf189e-8a5f-ea11-9b8b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_ITValidation_ChangeOwnerType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "6a39e246-189f-ea11-9d8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 2, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "ab39e246-189f-ea11-9d8b-0050568f2fc3", + "Id": "b039e246-189f-ea11-9d8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "455b722f-cb62-ea11-998b-aa59a9db3b67" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Account Validation - Change Owner for ECMESCEPEAFSVC [Klagenfurt]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "455b722f-cb62-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "50376aff-334f-ca09-8417-08d7c4eed1fb", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "2acf189e-8a5f-ea11-9b8b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_ITValidation_ChangeOwnerType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "6a39e246-189f-ea11-9d8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 2, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "b639e246-189f-ea11-9d8b-0050568f2fc3", + "Id": "bb39e246-189f-ea11-9d8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "455b722f-cb62-ea11-998b-aa59a9db3b67" + } + }, + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Account Validation - Change Owner for ECMESEAF [Klagenfurt]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "455b722f-cb62-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "50376aff-334f-ca09-8417-08d7c4eed1fb", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "2acf189e-8a5f-ea11-9b8b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_ITValidation_ChangeOwnerType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "6a39e246-189f-ea11-9d8b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 2, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "c139e246-189f-ea11-9d8b-0050568f2fc3", + "Id": "c639e246-189f-ea11-9d8b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "455b722f-cb62-ea11-998b-aa59a9db3b67" + } + } + ], + "AllowedActions": {}, + "Id": "6a39e246-189f-ea11-9d8b-0050568f2fc3", + "ObjectId": "6039e246-189f-ea11-9d8b-0050568f2fc3", + "Name": "ORD1692639-Install", + "Type": "Install", + "TypeId": 10, + "State": "Declined", + "StateId": 1043, + "StateIcon": "highlight_off", + "StateColor": "0xFFC02E1D", + "ItemNumber": "ORD1692639", + "CreatedDate": "2020-05-26T06:15:23.167Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Francois Rivard (IFAM IT FI MES)", + "RequestorId": "324d7aa5-07dd-44f6-9f67-089bac5909f3" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "File Share Modification - Create/Delete Permission Group [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "35403322-f025-e811-25a9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "2b403322-f025-e811-25a9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "f638c336-8c7a-ea11-998b-aa59a9db3b67", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "0439c336-8c7a-ea11-998b-aa59a9db3b67", + "Id": "0939c336-8c7a-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "35403322-f025-e811-25a9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "f638c336-8c7a-ea11-998b-aa59a9db3b67", + "ObjectId": "ee38c336-8c7a-ea11-998b-aa59a9db3b67", + "Name": "ORD1671916-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1671916", + "CreatedDate": "2020-04-09T18:02:09.323Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Documentum (User Permission) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ebc9bd06-851e-4e66-b844-ae610b25ff35", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "ac259ed0-a32e-4735-941a-b42fbc64d5ad", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "ab78a786-afb7-4a99-871f-385d988a598b", + "CustomFormEntityName": "Ud_CF_IFX_DocumentumUserPermissionType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "bd2de2f7-016a-ea11-998b-aa59a9db3b67", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "cb2de2f7-016a-ea11-998b-aa59a9db3b67", + "Id": "d02de2f7-016a-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ebc9bd06-851e-4e66-b844-ae610b25ff35" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "bd2de2f7-016a-ea11-998b-aa59a9db3b67", + "ObjectId": "b52de2f7-016a-ea11-998b-aa59a9db3b67", + "Name": "ORD1661220-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1661220", + "CreatedDate": "2020-03-19T16:52:09.27Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "McIntyre Juanita (IFEPI QM)", + "RequestorId": "c6cf962c-3eb1-44b5-aa44-7166ae2403ff" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "db2390fe-5668-ea11-998b-aa59a9db3b67", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "e92390fe-5668-ea11-998b-aa59a9db3b67", + "Id": "ee2390fe-5668-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "db2390fe-5668-ea11-998b-aa59a9db3b67", + "ObjectId": "d32390fe-5668-ea11-998b-aa59a9db3b67", + "Name": "ORD1659112-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1659112", + "CreatedDate": "2020-03-17T13:55:49.147Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "CCL Windows File Share - Access/Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ce38d49b-cd73-e511-688d-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "b838d49b-cd73-e511-688d-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "f855f875-b573-e511-688d-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_CCL_FileShare_ModType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "ba5b74be-1f3e-ea11-998b-aa59a9db3b67", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "c85b74be-1f3e-ea11-998b-aa59a9db3b67", + "Id": "cd5b74be-1f3e-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ce38d49b-cd73-e511-688d-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "ba5b74be-1f3e-ea11-998b-aa59a9db3b67", + "ObjectId": "b25b74be-1f3e-ea11-998b-aa59a9db3b67", + "Name": "ORD1627366-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1627366", + "CreatedDate": "2020-01-23T20:34:31.33Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "CCL Windows File Share - Access/Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ce38d49b-cd73-e511-688d-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "b838d49b-cd73-e511-688d-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "f855f875-b573-e511-688d-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_CCL_FileShare_ModType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "29cb357a-1f3e-ea11-998b-aa59a9db3b67", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "37cb357a-1f3e-ea11-998b-aa59a9db3b67", + "Id": "3ccb357a-1f3e-ea11-998b-aa59a9db3b67", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ce38d49b-cd73-e511-688d-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "29cb357a-1f3e-ea11-998b-aa59a9db3b67", + "ObjectId": "21cb357a-1f3e-ea11-998b-aa59a9db3b67", + "Name": "ORD1627365-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1627365", + "CreatedDate": "2020-01-23T20:32:31.427Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Becker Chad (IFEPI QM)", + "RecipientId": "2930c6c8-6447-4273-a3d0-32c40b1e946c", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "SPaCe Account (Villach) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "5c113cc6-f420-e311-3eb9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "44113cc6-f420-e311-3eb9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "4fdf30f4-a863-e311-5282-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_SPaCe_Account_Villach_2Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "08ff0d43-931e-ea11-988b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "16ff0d43-931e-ea11-988b-0050568f2fc3", + "Id": "1bff0d43-931e-ea11-988b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "5c113cc6-f420-e311-3eb9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "08ff0d43-931e-ea11-988b-0050568f2fc3", + "ObjectId": "00ff0d43-931e-ea11-988b-0050568f2fc3", + "Name": "ORD1609447-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1609447", + "CreatedDate": "2019-12-14T17:00:52.803Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Hector Gutierrez (IFEPI GaN OP)", + "RecipientId": "971c2276-1132-4762-a4a1-0b367c0f71b5", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "SPaCe Account (Villach) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "5c113cc6-f420-e311-3eb9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "44113cc6-f420-e311-3eb9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "4fdf30f4-a863-e311-5282-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_SPaCe_Account_Villach_2Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "4b26a917-931e-ea11-988b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "5926a917-931e-ea11-988b-0050568f2fc3", + "Id": "5e26a917-931e-ea11-988b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "5c113cc6-f420-e311-3eb9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "4b26a917-931e-ea11-988b-0050568f2fc3", + "ObjectId": "4326a917-931e-ea11-988b-0050568f2fc3", + "Name": "ORD1609446-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1609446", + "CreatedDate": "2019-12-14T16:59:35.527Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Tungare Mihir (IFAM PSS TIE GTD DFR)", + "RecipientId": "be7df190-f48a-4e47-9670-2b90ceb7cf82", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "SPaCe Account (Villach) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "5c113cc6-f420-e311-3eb9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "44113cc6-f420-e311-3eb9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "4fdf30f4-a863-e311-5282-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_SPaCe_Account_Villach_2Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "9d20f9ef-921e-ea11-988b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "ab20f9ef-921e-ea11-988b-0050568f2fc3", + "Id": "b020f9ef-921e-ea11-988b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "5c113cc6-f420-e311-3eb9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "9d20f9ef-921e-ea11-988b-0050568f2fc3", + "ObjectId": "9520f9ef-921e-ea11-988b-0050568f2fc3", + "Name": "ORD1609445-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1609445", + "CreatedDate": "2019-12-14T16:58:23.867Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Kannan Srinivasan (IRHIR R&D GaN)", + "RecipientId": "722995d5-7323-44e2-8386-7f9af522c135", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "SPaCe Account (Villach) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "5c113cc6-f420-e311-3eb9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "44113cc6-f420-e311-3eb9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "4fdf30f4-a863-e311-5282-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_SPaCe_Account_Villach_2Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "38d76b8a-921e-ea11-988b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "4ad76b8a-921e-ea11-988b-0050568f2fc3", + "Id": "4fd76b8a-921e-ea11-988b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "5c113cc6-f420-e311-3eb9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "38d76b8a-921e-ea11-988b-0050568f2fc3", + "ObjectId": "30d76b8a-921e-ea11-988b-0050568f2fc3", + "Name": "ORD1609444-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1609444", + "CreatedDate": "2019-12-14T16:55:42.96Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Brian Gruver (IFEPI GaN OP)", + "RecipientId": "bf4b43af-e762-47f2-af34-d1d040ee11ba", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "SPaCe Account (Villach) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "5c113cc6-f420-e311-3eb9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "44113cc6-f420-e311-3eb9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "4fdf30f4-a863-e311-5282-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_SPaCe_Account_Villach_2Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "537f2962-921e-ea11-988b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "617f2962-921e-ea11-988b-0050568f2fc3", + "Id": "667f2962-921e-ea11-988b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "5c113cc6-f420-e311-3eb9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "537f2962-921e-ea11-988b-0050568f2fc3", + "ObjectId": "4b7f2962-921e-ea11-988b-0050568f2fc3", + "Name": "ORD1609443-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1609443", + "CreatedDate": "2019-12-14T16:54:33.647Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Priscila Spagnol (IFEPI GaN OP)", + "RecipientId": "7969bd64-6c38-405f-8456-5b38cbe935b2", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "SPaCe Account (Villach) [Temecula]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "5c113cc6-f420-e311-3eb9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "44113cc6-f420-e311-3eb9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "4fdf30f4-a863-e311-5282-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_SPaCe_Account_Villach_2Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "5d456958-e11d-ea11-988b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "6b456958-e11d-ea11-988b-0050568f2fc3", + "Id": "70456958-e11d-ea11-988b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "5c113cc6-f420-e311-3eb9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "5d456958-e11d-ea11-988b-0050568f2fc3", + "ObjectId": "55456958-e11d-ea11-988b-0050568f2fc3", + "Name": "ORD1609404-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1609404", + "CreatedDate": "2019-12-13T19:47:13.427Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Smith Brad (IFAM FE IR TEM P UPS)", + "RecipientId": "61827cb6-4a0f-4a43-89c6-32532253b86f", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "SPaCe Account (Villach) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "5c113cc6-f420-e311-3eb9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "44113cc6-f420-e311-3eb9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "4fdf30f4-a863-e311-5282-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_SPaCe_Account_Villach_2Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "afa42128-e11d-ea11-988b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "bda42128-e11d-ea11-988b-0050568f2fc3", + "Id": "c2a42128-e11d-ea11-988b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "5c113cc6-f420-e311-3eb9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "afa42128-e11d-ea11-988b-0050568f2fc3", + "ObjectId": "a7a42128-e11d-ea11-988b-0050568f2fc3", + "Name": "ORD1609403-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1609403", + "CreatedDate": "2019-12-13T19:45:55.557Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Becker Chad (IFEPI QM)", + "RecipientId": "2930c6c8-6447-4273-a3d0-32c40b1e946c", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "92b47764-690c-ea11-988b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "a0b47764-690c-ea11-988b-0050568f2fc3", + "Id": "a5b47764-690c-ea11-988b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "92b47764-690c-ea11-988b-0050568f2fc3", + "ObjectId": "8ab47764-690c-ea11-988b-0050568f2fc3", + "Name": "ORD1596798-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1596798", + "CreatedDate": "2019-11-21T14:15:47.75Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "83c8b4ec-bbfc-e911-988b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "93c8b4ec-bbfc-e911-988b-0050568f2fc3", + "Id": "98c8b4ec-bbfc-e911-988b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "83c8b4ec-bbfc-e911-988b-0050568f2fc3", + "ObjectId": "7bc8b4ec-bbfc-e911-988b-0050568f2fc3", + "Name": "ORD1584798-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1584798", + "CreatedDate": "2019-11-01T15:26:17.39Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "CCL Windows File Share - Access/Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ce38d49b-cd73-e511-688d-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "b838d49b-cd73-e511-688d-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "f855f875-b573-e511-688d-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_CCL_FileShare_ModType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "74273a1b-02f1-e911-978b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "82273a1b-02f1-e911-978b-0050568f2fc3", + "Id": "87273a1b-02f1-e911-978b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ce38d49b-cd73-e511-688d-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "74273a1b-02f1-e911-978b-0050568f2fc3", + "ObjectId": "6c273a1b-02f1-e911-978b-0050568f2fc3", + "Name": "ORD1575853-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1575853", + "CreatedDate": "2019-10-17T17:18:22.427Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "CCL Windows File Share - Access/Modification [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ce38d49b-cd73-e511-688d-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "b838d49b-cd73-e511-688d-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "f855f875-b573-e511-688d-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_CCL_FileShare_ModType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "a679cecf-01f1-e911-978b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "5abbc5d5-01f1-e911-978b-0050568f2fc3", + "Id": "5fbbc5d5-01f1-e911-978b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ce38d49b-cd73-e511-688d-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "a679cecf-01f1-e911-978b-0050568f2fc3", + "ObjectId": "9e79cecf-01f1-e911-978b-0050568f2fc3", + "Name": "ORD1575852-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1575852", + "CreatedDate": "2019-10-17T17:16:20.513Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + }, + "Name": "Active Directory Group - modify [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "990749a0-e665-406d-a3f7-e09b46519dd3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "1c97fe9a-8698-4331-b8ee-8988f344f218", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "862593e9-19e6-e911-978b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "942593e9-19e6-e911-978b-0050568f2fc3", + "Id": "992593e9-19e6-e911-978b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "990749a0-e665-406d-a3f7-e09b46519dd3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "862593e9-19e6-e911-978b-0050568f2fc3", + "ObjectId": "7e2593e9-19e6-e911-978b-0050568f2fc3", + "Name": "ORD1564852-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1564852", + "CreatedDate": "2019-10-03T20:11:06.563Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": " Software Installation Permission [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c556e104-3003-e711-5da5-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "bb56e104-3003-e711-5da5-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "81b212d8-3003-e711-5da5-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_GenSoftwareType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "089eb0d6-aee0-e911-978b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "189eb0d6-aee0-e911-978b-0050568f2fc3", + "Id": "1d9eb0d6-aee0-e911-978b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c556e104-3003-e711-5da5-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "089eb0d6-aee0-e911-978b-0050568f2fc3", + "ObjectId": "009eb0d6-aee0-e911-978b-0050568f2fc3", + "Name": "ORD1559459-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1559459", + "CreatedDate": "2019-09-26T22:41:56.327Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "41d8b6f3-0bdb-e911-978b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "4fd8b6f3-0bdb-e911-978b-0050568f2fc3", + "Id": "54d8b6f3-0bdb-e911-978b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "41d8b6f3-0bdb-e911-978b-0050568f2fc3", + "ObjectId": "39d8b6f3-0bdb-e911-978b-0050568f2fc3", + "Name": "ORD1554599-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1554599", + "CreatedDate": "2019-09-19T18:33:26.35Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "f1cf7485-03db-e911-978b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "ffcf7485-03db-e911-978b-0050568f2fc3", + "Id": "04d07485-03db-e911-978b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "f1cf7485-03db-e911-978b-0050568f2fc3", + "ObjectId": "e9cf7485-03db-e911-978b-0050568f2fc3", + "Name": "ORD1554593-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1554593", + "CreatedDate": "2019-09-19T17:33:00.97Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "c937c7c3-feda-e911-978b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "d737c7c3-feda-e911-978b-0050568f2fc3", + "Id": "dc37c7c3-feda-e911-978b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "c937c7c3-feda-e911-978b-0050568f2fc3", + "ObjectId": "c137c7c3-feda-e911-978b-0050568f2fc3", + "Name": "ORD1554581-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1554581", + "CreatedDate": "2019-09-19T16:59:01.803Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "MailRelay - Internal Registration [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "aad73ca7-eb78-e811-f1b8-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "a0d73ca7-eb78-e811-f1b8-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "3106e15b-ea78-e811-f1b8-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_InternalMailRelayRegType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "fd04875f-73ce-e911-978b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "0b05875f-73ce-e911-978b-0050568f2fc3", + "Id": "1005875f-73ce-e911-978b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "aad73ca7-eb78-e811-f1b8-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "fd04875f-73ce-e911-978b-0050568f2fc3", + "ObjectId": "f504875f-73ce-e911-978b-0050568f2fc3", + "Name": "ORD1541808-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1541808", + "CreatedDate": "2019-09-03T17:50:55.427Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "f6035489-37c8-e911-958b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "04045489-37c8-e911-958b-0050568f2fc3", + "Id": "09045489-37c8-e911-958b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "f6035489-37c8-e911-958b-0050568f2fc3", + "ObjectId": "ee035489-37c8-e911-958b-0050568f2fc3", + "Name": "ORD1536037-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1536037", + "CreatedDate": "2019-08-26T19:27:29.5Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Functional Mailbox - New [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c9c1844f-950e-45a9-b0c3-9d9ab81208f2", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "7548fb5f-10f4-4b17-a6e5-efd2e8c9112b", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "cbba908e-7f76-41d0-876d-5bb35a5e81ea", + "CustomFormEntityName": "Ud_CF_IFX_FunctionalMailboxNewType", + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "733d3551-e9c4-e911-958b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "813d3551-e9c4-e911-958b-0050568f2fc3", + "Id": "863d3551-e9c4-e911-958b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c9c1844f-950e-45a9-b0c3-9d9ab81208f2" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "733d3551-e9c4-e911-958b-0050568f2fc3", + "ObjectId": "6b3d3551-e9c4-e911-958b-0050568f2fc3", + "Name": "ORD1534246-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1534246", + "CreatedDate": "2019-08-22T14:30:08.507Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Functional Mailbox - New [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c9c1844f-950e-45a9-b0c3-9d9ab81208f2", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "7548fb5f-10f4-4b17-a6e5-efd2e8c9112b", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "cbba908e-7f76-41d0-876d-5bb35a5e81ea", + "CustomFormEntityName": "Ud_CF_IFX_FunctionalMailboxNewType", + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "6e22d51b-e9c4-e911-958b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "7c22d51b-e9c4-e911-958b-0050568f2fc3", + "Id": "8122d51b-e9c4-e911-958b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c9c1844f-950e-45a9-b0c3-9d9ab81208f2" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "6e22d51b-e9c4-e911-958b-0050568f2fc3", + "ObjectId": "6622d51b-e9c4-e911-958b-0050568f2fc3", + "Name": "ORD1534244-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1534244", + "CreatedDate": "2019-08-22T14:28:37.577Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Functional Mailbox - New [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c9c1844f-950e-45a9-b0c3-9d9ab81208f2", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "7548fb5f-10f4-4b17-a6e5-efd2e8c9112b", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "cbba908e-7f76-41d0-876d-5bb35a5e81ea", + "CustomFormEntityName": "Ud_CF_IFX_FunctionalMailboxNewType", + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "427d674f-b8be-e911-958b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "507d674f-b8be-e911-958b-0050568f2fc3", + "Id": "557d674f-b8be-e911-958b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c9c1844f-950e-45a9-b0c3-9d9ab81208f2" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "427d674f-b8be-e911-958b-0050568f2fc3", + "ObjectId": "3a7d674f-b8be-e911-958b-0050568f2fc3", + "Name": "ORD1528792-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1528792", + "CreatedDate": "2019-08-14T17:24:10.833Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Functional Mailbox - New [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c9c1844f-950e-45a9-b0c3-9d9ab81208f2", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "7548fb5f-10f4-4b17-a6e5-efd2e8c9112b", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "cbba908e-7f76-41d0-876d-5bb35a5e81ea", + "CustomFormEntityName": "Ud_CF_IFX_FunctionalMailboxNewType", + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "8cdaccf9-b7be-e911-958b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "9cdaccf9-b7be-e911-958b-0050568f2fc3", + "Id": "a1daccf9-b7be-e911-958b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c9c1844f-950e-45a9-b0c3-9d9ab81208f2" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "8cdaccf9-b7be-e911-958b-0050568f2fc3", + "ObjectId": "84daccf9-b7be-e911-958b-0050568f2fc3", + "Name": "ORD1528790-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1528790", + "CreatedDate": "2019-08-14T17:21:42.447Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "File Share - New [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "0829c82c-f0e4-44e3-9fac-75795f279550", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "742b4a3e-c6ad-41c5-b377-a4eed3989129", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "af42b9c3-7c22-e611-b887-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_FileShare1_4_5NewType", + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "12a3d948-b7be-e911-958b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "20a3d948-b7be-e911-958b-0050568f2fc3", + "Id": "25a3d948-b7be-e911-958b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "0829c82c-f0e4-44e3-9fac-75795f279550" + } + } + ], + "AllowedActions": {}, + "Id": "12a3d948-b7be-e911-958b-0050568f2fc3", + "ObjectId": "0aa3d948-b7be-e911-958b-0050568f2fc3", + "Name": "ORD1528789-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1528789", + "CreatedDate": "2019-08-14T17:16:52.2Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "CCL Windows File Share - New [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ee3191f8-d273-e511-688d-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "d83191f8-d273-e511-688d-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "21f914b8-d273-e511-688d-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_CCL_FileShare_NewType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "796e0367-b6be-e911-958b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "876e0367-b6be-e911-958b-0050568f2fc3", + "Id": "8c6e0367-b6be-e911-958b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ee3191f8-d273-e511-688d-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "796e0367-b6be-e911-958b-0050568f2fc3", + "ObjectId": "716e0367-b6be-e911-958b-0050568f2fc3", + "Name": "ORD1528787-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1528787", + "CreatedDate": "2019-08-14T17:10:26.67Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Fixed IP Address [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "e276f137-ed1b-4415-8811-d53e4233a33a", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "29eb418d-3558-4b61-98eb-53679898e921", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "a7d5d01e-88b8-e711-a99e-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Fixed_IP_AddressType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "412e013d-a7b7-e911-958b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "4f2e013d-a7b7-e911-958b-0050568f2fc3", + "Id": "542e013d-a7b7-e911-958b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "e276f137-ed1b-4415-8811-d53e4233a33a" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "412e013d-a7b7-e911-958b-0050568f2fc3", + "ObjectId": "392e013d-a7b7-e911-958b-0050568f2fc3", + "Name": "ORD1522953-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1522953", + "CreatedDate": "2019-08-05T17:34:22.73Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Administration Account for Custom Endpoint (CEP) Environment [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "52af1796-35b6-e811-66ba-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "48af1796-35b6-e811-66ba-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "24056054-37b6-e811-66ba-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_CEP_AdminType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "1056d1f7-5daa-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "1e56d1f7-5daa-e911-938b-0050568f2fc3", + "Id": "2356d1f7-5daa-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "52af1796-35b6-e811-66ba-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "1056d1f7-5daa-e911-938b-0050568f2fc3", + "ObjectId": "0856d1f7-5daa-e911-938b-0050568f2fc3", + "Name": "ORD1512426-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1512426", + "CreatedDate": "2019-07-19T19:47:00.903Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "CCL Windows File Share - New [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ee3191f8-d273-e511-688d-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "d83191f8-d273-e511-688d-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "21f914b8-d273-e511-688d-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_CCL_FileShare_NewType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "eb92652e-fea3-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "f992652e-fea3-e911-938b-0050568f2fc3", + "Id": "fe92652e-fea3-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ee3191f8-d273-e511-688d-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "eb92652e-fea3-e911-938b-0050568f2fc3", + "ObjectId": "e392652e-fea3-e911-938b-0050568f2fc3", + "Name": "ORD1507355-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1507355", + "CreatedDate": "2019-07-11T17:06:13.68Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Special Account for Clients & Applications [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "55a2cc5f-ff67-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "4ba2cc5f-ff67-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "bcbfe962-1e28-e911-928b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccForClientsAndAppsType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "25dc8e63-229c-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "33dc8e63-229c-e911-938b-0050568f2fc3", + "Id": "38dc8e63-229c-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "55a2cc5f-ff67-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "25dc8e63-229c-e911-938b-0050568f2fc3", + "ObjectId": "1ddc8e63-229c-e911-938b-0050568f2fc3", + "Name": "ORD1499496-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1499496", + "CreatedDate": "2019-07-01T17:05:15.61Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Special Account for Clients & Applications [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "55a2cc5f-ff67-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "4ba2cc5f-ff67-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "bcbfe962-1e28-e911-928b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccForClientsAndAppsType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "d6ae0d1f-8292-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "e4ae0d1f-8292-e911-938b-0050568f2fc3", + "Id": "e9ae0d1f-8292-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "55a2cc5f-ff67-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "d6ae0d1f-8292-e911-938b-0050568f2fc3", + "ObjectId": "ceae0d1f-8292-e911-938b-0050568f2fc3", + "Name": "ORD1492221-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1492221", + "CreatedDate": "2019-06-19T11:05:24.197Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Special Account for Clients & Applications [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "55a2cc5f-ff67-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "4ba2cc5f-ff67-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "bcbfe962-1e28-e911-928b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccForClientsAndAppsType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "1b44cc5c-8192-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "2944cc5c-8192-e911-938b-0050568f2fc3", + "Id": "2e44cc5c-8192-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "55a2cc5f-ff67-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "1b44cc5c-8192-e911-938b-0050568f2fc3", + "ObjectId": "1344cc5c-8192-e911-938b-0050568f2fc3", + "Name": "ORD1492214-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1492214", + "CreatedDate": "2019-06-19T11:00:00.29Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Active Directory Group - new [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "a3c9a5f9-0c5c-4f91-84a8-2946326024c5", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "da4c35cb-ce5a-41f0-85e4-5936e2e205bc", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "acf8d5b4-c982-e511-a7b9-0050568f7353", + "CustomFormEntityName": "Ud_InfineonDefaultEmbeddedCustomFormNEWType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "71ee5bb6-5489-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "7fee5bb6-5489-e911-938b-0050568f2fc3", + "Id": "84ee5bb6-5489-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "a3c9a5f9-0c5c-4f91-84a8-2946326024c5" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "71ee5bb6-5489-e911-938b-0050568f2fc3", + "ObjectId": "69ee5bb6-5489-e911-938b-0050568f2fc3", + "Name": "ORD1485405-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1485405", + "CreatedDate": "2019-06-07T18:47:36.613Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Special Account for Clients & Applications [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "55a2cc5f-ff67-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "4ba2cc5f-ff67-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "bcbfe962-1e28-e911-928b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccForClientsAndAppsType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "056a57ee-3e89-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "136a57ee-3e89-e911-938b-0050568f2fc3", + "Id": "186a57ee-3e89-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "55a2cc5f-ff67-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "056a57ee-3e89-e911-938b-0050568f2fc3", + "ObjectId": "fd6957ee-3e89-e911-938b-0050568f2fc3", + "Name": "ORD1485381-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1485381", + "CreatedDate": "2019-06-07T16:11:43.687Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Special Account for Clients & Applications [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "55a2cc5f-ff67-e911-938b-0050568f2fc3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "4ba2cc5f-ff67-e911-938b-0050568f2fc3", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "bcbfe962-1e28-e911-928b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_SpecialAccForClientsAndAppsType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "1a315a2e-387e-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "28315a2e-387e-e911-938b-0050568f2fc3", + "Id": "2d315a2e-387e-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "55a2cc5f-ff67-e911-938b-0050568f2fc3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "1a315a2e-387e-e911-938b-0050568f2fc3", + "ObjectId": "12315a2e-387e-e911-938b-0050568f2fc3", + "Name": "ORD1477029-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1477029", + "CreatedDate": "2019-05-24T15:25:39.64Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "iSpot - Internet access for mobile devices [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "cec51564-93a0-e111-b9b4-005056b1201d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "b8c51564-93a0-e111-b9b4-005056b1201d", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "2379c632-7db6-e411-7c90-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_iSpot_1Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "39197f4c-d86f-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "47197f4c-d86f-e911-938b-0050568f2fc3", + "Id": "4c197f4c-d86f-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "cec51564-93a0-e111-b9b4-005056b1201d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "39197f4c-d86f-e911-938b-0050568f2fc3", + "ObjectId": "31197f4c-d86f-e911-938b-0050568f2fc3", + "Name": "ORD1462927-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1462927", + "CreatedDate": "2019-05-06T08:24:05.037Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Port Replicator [Regensburg]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "10d41f80-c03f-491d-9949-7f19d0fc7140", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "c18e08bd-ae06-4712-a8f6-98e56b6b33e5", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "f9a2a9f2-7d46-4767-85b2-c2aeb784e10b", + "CustomFormEntityName": "Ud_CF_IFX_AccessoryType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "0a553995-536a-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "18553995-536a-e911-938b-0050568f2fc3", + "Id": "1d553995-536a-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "10d41f80-c03f-491d-9949-7f19d0fc7140" + } + }, + { + "Name": "AC Adapter/Power Supply for Notebooks [Regensburg]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "7fb05d12-ef22-40fb-9a2e-19e958a46cc8", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "afe7f726-f45e-41d9-bca6-8b03db40bbbb", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "f9a2a9f2-7d46-4767-85b2-c2aeb784e10b", + "CustomFormEntityName": "Ud_CF_IFX_AccessoryType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "0a553995-536a-e911-938b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "23553995-536a-e911-938b-0050568f2fc3", + "Id": "28553995-536a-e911-938b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "7fb05d12-ef22-40fb-9a2e-19e958a46cc8" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "0a553995-536a-e911-938b-0050568f2fc3", + "ObjectId": "02553995-536a-e911-938b-0050568f2fc3", + "Name": "ORD1458830-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1458830", + "CreatedDate": "2019-04-29T07:51:24.443Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Grimmer Andrea (IFAG CSC FI FE PCS FDC)", + "RequestorId": "e982416b-f02e-447f-945e-c331bd9062ab" + }, + { + "Bookings": [ + { + "Name": "Teamcenter (Account) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "8275a466-8f88-41b0-bb66-16a898adb3b3", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "f951951a-bfab-4035-b6af-99c66d598e59", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "37d0f898-ec63-48f8-8385-6c4f0ac3c6b5", + "CustomFormEntityName": "Ud_CF_IFX_TeamcenterAccountType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "42937a1d-4452-e911-928b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "50937a1d-4452-e911-928b-0050568f2fc3", + "Id": "55937a1d-4452-e911-928b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "8275a466-8f88-41b0-bb66-16a898adb3b3" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "42937a1d-4452-e911-928b-0050568f2fc3", + "ObjectId": "3a937a1d-4452-e911-928b-0050568f2fc3", + "Name": "ORD1438897-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1438897", + "CreatedDate": "2019-03-29T17:00:21.117Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Enterprise Architect - Project and User Management [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "9b5db7b5-b092-e211-6485-005056b1201d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "855db7b5-b092-e211-6485-005056b1201d", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "3ac0ca81-9892-e211-6485-005056b1201d", + "CustomFormEntityName": "Ud_CF_IFX_EnterpriseArchitect_ProjectUser_ManagementType", + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "480724f3-564f-e911-928b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "560724f3-564f-e911-928b-0050568f2fc3", + "Id": "5b0724f3-564f-e911-928b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "9b5db7b5-b092-e211-6485-005056b1201d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "480724f3-564f-e911-928b-0050568f2fc3", + "ObjectId": "400724f3-564f-e911-928b-0050568f2fc3", + "Name": "ORD1435311-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1435311", + "CreatedDate": "2019-03-25T23:37:30.203Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Enterprise Architect - Others [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "2a9c2cb0-fc68-42f2-97eb-6f38b2ee6f9d", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "cdcaa203-c2e4-4bf3-a8e6-b3254f7083d7", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "92bd5880-9592-e211-6485-005056b1201d", + "CustomFormEntityName": "Ud_CF_IFX_EnterpriseArchitect_OthersType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e228221f-754a-e911-928b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "f028221f-754a-e911-928b-0050568f2fc3", + "Id": "f528221f-754a-e911-928b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "2a9c2cb0-fc68-42f2-97eb-6f38b2ee6f9d" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "e228221f-754a-e911-928b-0050568f2fc3", + "ObjectId": "da28221f-754a-e911-928b-0050568f2fc3", + "Name": "ORD1430675-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1430675", + "CreatedDate": "2019-03-19T18:30:55.35Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "Monitor [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "33220ecd-5444-4dcd-a9ea-c048aead0052", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "ebb4992b-eecb-44b6-9c26-18d41d692eed", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "e8d47cb2-b880-4546-a1bb-6325b4d90144", + "CustomFormEntityName": "Ud_CF_IFX_MonitorScannerType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "45354e30-a749-e911-928b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 4, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "55354e30-a749-e911-928b-0050568f2fc3", + "Id": "5a354e30-a749-e911-928b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "33220ecd-5444-4dcd-a9ea-c048aead0052" + } + } + ], + "AllowedActions": {}, + "Id": "45354e30-a749-e911-928b-0050568f2fc3", + "ObjectId": "3d354e30-a749-e911-928b-0050568f2fc3", + "Name": "ORD1429632-Install", + "Type": "Install", + "TypeId": 10, + "State": "Canceled", + "StateId": 1052, + "StateIcon": "remove_circle", + "StateColor": "0xFFFF5722", + "ItemNumber": "ORD1429632", + "CreatedDate": "2019-03-18T17:56:45.213Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": " Software Installation Permission [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c556e104-3003-e711-5da5-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "bb56e104-3003-e711-5da5-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "81b212d8-3003-e711-5da5-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_GenSoftwareType", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "b84f2aec-6d47-e911-928b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "c64f2aec-6d47-e911-928b-0050568f2fc3", + "Id": "cb4f2aec-6d47-e911-928b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c556e104-3003-e711-5da5-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "b84f2aec-6d47-e911-928b-0050568f2fc3", + "ObjectId": "b04f2aec-6d47-e911-928b-0050568f2fc3", + "Name": "ORD1428279-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1428279", + "CreatedDate": "2019-03-15T22:01:47.48Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + }, + { + "Bookings": [ + { + "Name": "Documentum (User Permission) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "ebc9bd06-851e-4e66-b844-ae610b25ff35", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "ac259ed0-a32e-4735-941a-b42fbc64d5ad", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "ab78a786-afb7-4a99-871f-385d988a598b", + "CustomFormEntityName": "Ud_CF_IFX_DocumentumUserPermissionType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "89c5a9e7-4147-e911-928b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "97c5a9e7-4147-e911-928b-0050568f2fc3", + "Id": "9cc5a9e7-4147-e911-928b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "ebc9bd06-851e-4e66-b844-ae610b25ff35" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "89c5a9e7-4147-e911-928b-0050568f2fc3", + "ObjectId": "81c5a9e7-4147-e911-928b-0050568f2fc3", + "Name": "ORD1428228-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1428228", + "CreatedDate": "2019-03-15T16:46:42.26Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "McIntyre Juanita (IFEPI QM)", + "RequestorId": "c6cf962c-3eb1-44b5-aa44-7166ae2403ff" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "Access to IFAM Application: OpenInsight (Mesa) [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "641bd511-fb32-e811-25a9-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "5a1bd511-fb32-e811-25a9-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "ad69acaa-6747-e811-25a9-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_Openinsight_1Type", + "CreateMultipleBookings": true, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "36f039ba-d4a2-4e43-a072-10a25393c171", + "Name": "Global", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "bfa1a3db-9e46-e911-928b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "cda1a3db-9e46-e911-928b-0050568f2fc3", + "Id": "d2a1a3db-9e46-e911-928b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "641bd511-fb32-e811-25a9-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "bfa1a3db-9e46-e911-928b-0050568f2fc3", + "ObjectId": "b7a1a3db-9e46-e911-928b-0050568f2fc3", + "Name": "ORD1427384-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1427384", + "CreatedDate": "2019-03-14T21:19:38.487Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Francois Rivard (IFAM IT FI MES)", + "RequestorId": "324d7aa5-07dd-44f6-9f67-089bac5909f3" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "Access to GaN-MESA US originated [3E001] File Share [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "c7838a58-2742-e511-688d-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "b1838a58-2742-e511-688d-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "40f317e0-6a1e-e611-b887-0050568f7353", + "CustomFormEntityName": "Ud_CF_IFX_FileShare_GaNEPIAccess2Type", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "e608ada1-9e46-e911-928b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 4, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "f408ada1-9e46-e911-928b-0050568f2fc3", + "Id": "f908ada1-9e46-e911-928b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "c7838a58-2742-e511-688d-0050568f7353" + } + } + ], + "AllowedActions": {}, + "Id": "e608ada1-9e46-e911-928b-0050568f2fc3", + "ObjectId": "de08ada1-9e46-e911-928b-0050568f2fc3", + "Name": "ORD1427383-Install", + "Type": "Install", + "TypeId": 10, + "State": "Canceled", + "StateId": 1052, + "StateIcon": "remove_circle", + "StateColor": "0xFFFF5722", + "ItemNumber": "ORD1427383", + "CreatedDate": "2019-03-14T21:18:04.82Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Francois Rivard (IFAM IT FI MES)", + "RequestorId": "324d7aa5-07dd-44f6-9f67-089bac5909f3" + }, + { + "Bookings": [ + { + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + }, + "Name": "Request to Access EC Domain – EC ISC Configuration [Mesa]", + "Description": "", + "PaymentMethod": 2, + "Service": { + "Id": "86eab50f-dea8-e711-a99e-0050568f7353", + "Quantity": 1, + "PaymentMethod": 2, + "Price": { + "CC": "EUR" + }, + "ObjectId": "7ceab50f-dea8-e711-a99e-0050568f7353", + "ConfigurationItemType": 0, + "ConfigurationItemTypeName": "SPSArticleTypeService", + "ServiceType": 4, + "CustomFormEntityId": "64b11ef9-6e23-e911-928b-0050568fcd3c", + "CustomFormEntityName": "Ud_CF_IFX_ECdomain_EC_NewType", + "CreateMultipleBookings": true, + "UninstallationMode": 1, + "AllowIdenticalInstances": true, + "Catalog": { + "Id": "d0bab435-0d8b-4813-b9d7-2b871d565765", + "Name": "Mesa", + "CurrencyCode": "EUR" + } + }, + "Order": { + "Id": "234fcd55-7a46-e911-928b-0050568f2fc3", + "Name": "-", + "TypeId": 10 + }, + "ApprovalStatus": 1, + "AllowedActions": { + "Incident": true + }, + "ObjectId": "314fcd55-7a46-e911-928b-0050568f2fc3", + "Id": "364fcd55-7a46-e911-928b-0050568f2fc3", + "Quantity": 1, + "AdditionalData": { + "ServiceId": "86eab50f-dea8-e711-a99e-0050568f7353" + } + } + ], + "AllowedActions": { + "Reorder": true + }, + "Id": "234fcd55-7a46-e911-928b-0050568f2fc3", + "ObjectId": "1b4fcd55-7a46-e911-928b-0050568f2fc3", + "Name": "ORD1427337-Install", + "Type": "Install", + "TypeId": 10, + "State": "Fulfilled", + "StateId": 1049, + "StateIcon": "done_all", + "StateColor": "0xFFAEAEAE", + "ItemNumber": "ORD1427337", + "CreatedDate": "2019-03-14T16:58:07.337Z", + "DecidedDate": "1970-01-01T00:00:00Z", + "CostCenterId": "816361e3-13e6-4b44-96a9-fb44c63a8e36", + "CostCenterName": "Global", + "Recipient": "Phares Mike (IFAM IT FI MES)", + "RecipientId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85", + "Requestor": "Phares Mike (IFAM IT FI MES)", + "RequestorId": "a85f1011-9b51-4273-96d5-86c2a4d2fe85" + } + ], + "Total": 104 +} \ No newline at end of file diff --git a/Viewer/Models/AppSettings.cs b/Viewer/Models/AppSettings.cs index e5ed6a1..73351cd 100644 --- a/Viewer/Models/AppSettings.cs +++ b/Viewer/Models/AppSettings.cs @@ -1,61 +1,26 @@ using System.Text.Json; -using System.Text.Json.Serialization; namespace OI.Metrology.Viewer.Models; -public class AppSettings +public record AppSettings(string ApiLoggingContentTypes, + string ApiLoggingPathPrefixes, + string ApiLogPath, + string AttachmentPath, + string BuildNumber, + string Company, + string ConnectionString, + string GitCommitSeven, + string InboundApiAllowedIPList, + bool IsDevelopment, + bool IsStaging, + string MonAResource, + string MonASite, + string OI2SqlConnectionString, + string OIExportPath, + string URLs, + string WorkingDirectoryName) { - public string ApiLoggingContentTypes { init; get; } - public string ApiLoggingPathPrefixes { init; get; } - public string ApiLogPath { init; get; } - public string AttachmentPath { init; get; } - public string BuildNumber { init; get; } - public string Company { init; get; } - public string ConnectionString { init; get; } - public string GitCommitSeven { init; get; } - public string InboundApiAllowedIPList { init; get; } - public string MonAResource { init; get; } - public string MonASite { init; get; } - public string Oi2SqlConnectionString { init; get; } - public string OIExportPath { init; get; } - public string URLs { init; get; } - public string WorkingDirectoryName { init; get; } - - [JsonConstructor] - public AppSettings(string apiLoggingContentTypes, - string apiLoggingPathPrefixes, - string apiLogPath, - string attachmentPath, - string buildNumber, - string company, - string connectionString, - string gitCommitSeven, - string inboundApiAllowedIPList, - string monAResource, - string monASite, - string oi2SqlConnectionString, - string oiExportPath, - string urls, - string workingDirectoryName) - { - ApiLoggingContentTypes = apiLoggingContentTypes; - ApiLoggingPathPrefixes = apiLoggingPathPrefixes; - ApiLogPath = apiLogPath; - AttachmentPath = attachmentPath; - BuildNumber = buildNumber; - Company = company; - ConnectionString = connectionString; - GitCommitSeven = gitCommitSeven; - InboundApiAllowedIPList = inboundApiAllowedIPList; - MonAResource = monAResource; - MonASite = monASite; - Oi2SqlConnectionString = oi2SqlConnectionString; - OIExportPath = oiExportPath; - URLs = urls; - WorkingDirectoryName = workingDirectoryName; - } - public override string ToString() { string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); diff --git a/Viewer/Models/Binder/AppSettings.cs b/Viewer/Models/Binder/AppSettings.cs index ac05701..31e5450 100644 --- a/Viewer/Models/Binder/AppSettings.cs +++ b/Viewer/Models/Binder/AppSettings.cs @@ -1,4 +1,3 @@ -using Microsoft.Extensions.Configuration; using System.ComponentModel.DataAnnotations; using System.Text.Json; @@ -18,6 +17,8 @@ public class AppSettings [Display(Name = "Connection String"), Required] public string ConnectionString { get; set; } [Display(Name = "Git Commit Seven"), Required] public string GitCommitSeven { get; set; } [Display(Name = "Inbound Api Allowed IP List"), Required] public string InboundApiAllowedIPList { get; set; } + [Display(Name = "Is Development"), Required] public bool? IsDevelopment { get; set; } + [Display(Name = "Is Staging"), Required] public bool? IsStaging { get; set; } [Display(Name = "MonA Resource"), Required] public string MonAResource { get; set; } [Display(Name = "MonA Site"), Required] public string MonASite { get; set; } [Display(Name = "Oi 2 Sql Connection String"), Required] public string Oi2SqlConnectionString { get; set; } @@ -33,9 +34,45 @@ public class AppSettings return result; } - private static Models.AppSettings Get(AppSettings appSettings) + private static Models.AppSettings Get(AppSettings? appSettings) { Models.AppSettings result; + if (appSettings is null) + throw new NullReferenceException(nameof(appSettings)); + if (appSettings.ApiLoggingContentTypes is null) + throw new NullReferenceException(nameof(ApiLoggingContentTypes)); + if (appSettings.ApiLoggingPathPrefixes is null) + throw new NullReferenceException(nameof(ApiLoggingPathPrefixes)); + if (appSettings.ApiLogPath is null) + throw new NullReferenceException(nameof(ApiLogPath)); + if (appSettings.AttachmentPath is null) + throw new NullReferenceException(nameof(AttachmentPath)); + if (appSettings.BuildNumber is null) + throw new NullReferenceException(nameof(BuildNumber)); + if (appSettings.Company is null) + throw new NullReferenceException(nameof(Company)); + if (appSettings.ConnectionString is null) + throw new NullReferenceException(nameof(ConnectionString)); + if (appSettings.GitCommitSeven is null) + throw new NullReferenceException(nameof(GitCommitSeven)); + if (appSettings.InboundApiAllowedIPList is null) + throw new NullReferenceException(nameof(InboundApiAllowedIPList)); + if (appSettings.IsDevelopment is null) + throw new NullReferenceException(nameof(IsDevelopment)); + if (appSettings.IsStaging is null) + throw new NullReferenceException(nameof(IsStaging)); + if (appSettings.MonAResource is null) + throw new NullReferenceException(nameof(MonAResource)); + if (appSettings.MonASite is null) + throw new NullReferenceException(nameof(MonASite)); + if (appSettings.Oi2SqlConnectionString is null) + throw new NullReferenceException(nameof(Oi2SqlConnectionString)); + if (appSettings.OIExportPath is null) + throw new NullReferenceException(nameof(OIExportPath)); + if (appSettings.URLs is null) + throw new NullReferenceException(nameof(URLs)); + if (appSettings.WorkingDirectoryName is null) + throw new NullReferenceException(nameof(WorkingDirectoryName)); result = new( appSettings.ApiLoggingContentTypes, appSettings.ApiLoggingPathPrefixes, @@ -46,6 +83,8 @@ public class AppSettings appSettings.ConnectionString, appSettings.GitCommitSeven, appSettings.InboundApiAllowedIPList, + appSettings.IsDevelopment.Value, + appSettings.IsStaging.Value, appSettings.MonAResource, appSettings.MonASite, appSettings.Oi2SqlConnectionString, @@ -58,7 +97,7 @@ public class AppSettings public static Models.AppSettings Get(IConfigurationRoot configurationRoot) { Models.AppSettings result; - AppSettings appSettings = configurationRoot.Get(); + AppSettings? appSettings = configurationRoot.Get(); result = Get(appSettings); return result; } diff --git a/Viewer/Viewer.csproj b/Viewer/OI.Metrology.Viewer.csproj similarity index 73% rename from Viewer/Viewer.csproj rename to Viewer/OI.Metrology.Viewer.csproj index 992f5a6..d5cebf6 100644 --- a/Viewer/Viewer.csproj +++ b/Viewer/OI.Metrology.Viewer.csproj @@ -6,13 +6,13 @@ SAK - disable + enable false 10.0 - disable + enable Exe win-x64 - net6.0 + net7.0 @@ -26,22 +26,25 @@ - - - - - - - + + + + + + + + + + - + - + @@ -58,5 +61,8 @@ Always + + Always + \ No newline at end of file diff --git a/Viewer/Program.cs b/Viewer/Program.cs index 2a0c2ac..b9d1eec 100644 --- a/Viewer/Program.cs +++ b/Viewer/Program.cs @@ -1,19 +1,14 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Hosting.WindowsServices; -using Microsoft.Extensions.Logging; using OI.Metrology.Shared.Models; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Repositories; using OI.Metrology.Shared.Services; using OI.Metrology.Viewer.Models; using OI.Metrology.Viewer.Repositories; +using OI.Metrology.Viewer.Repository; using OI.Metrology.Viewer.Services; using Serilog; -using System; -using System.IO; using System.Reflection; namespace OI.Metrology.Viewer; @@ -25,7 +20,7 @@ public class Program { string webRootPath; Assembly assembly = Assembly.GetExecutingAssembly(); - string assemblyName = assembly.GetName()?.Name; + string? assemblyName = assembly.GetName()?.Name; if (string.IsNullOrEmpty(assemblyName)) throw new Exception(); string baseAssemblyName = assemblyName.Split('.')[0]; @@ -63,14 +58,27 @@ public class Program { _ = webApplicationBuilder.Services.Configure(options => options.SuppressModelStateInvalidFilter = true); _ = webApplicationBuilder.Services.AddControllersWithViews(); - _ = new MetrologyRepo(new SQLDbConnectionFactory(appSettings), null); +#pragma warning disable CS8600, CS8602, CS8603, CS8604, CS8625 + _ = new MetrologyRepository(new SQLDbConnectionFactory(appSettings), null); +#pragma warning restore _ = webApplicationBuilder.Services.AddDistributedMemoryCache(); _ = webApplicationBuilder.Services.AddMemoryCache(); - _ = webApplicationBuilder.Services.AddSingleton(_ => appSettings); + + AppSettingsRepository appSettingsRepository = new(appSettings); + ClientSettingsRepository clientSettingsRepository = new(appSettings); + + _ = webApplicationBuilder.Services.AddSingleton(_ => appSettings); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddSingleton(_ => appSettingsRepository); + _ = webApplicationBuilder.Services.AddSingleton(_ => clientSettingsRepository); + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddScoped(); _ = webApplicationBuilder.Services.AddScoped(); - _ = webApplicationBuilder.Services.AddScoped(); - _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Services.AddScoped(); + _ = webApplicationBuilder.Services.AddSwaggerGen(); _ = webApplicationBuilder.Services.AddSession(sessionOptions => { @@ -84,8 +92,10 @@ public class Program _ = webApplicationBuilder.Services.AddSingleton(); _ = webApplicationBuilder.Logging.AddEventLog(settings => { +#pragma warning disable CA1416 if (string.IsNullOrEmpty(settings.SourceName)) settings.SourceName = webApplicationBuilder.Environment.ApplicationName; +#pragma warning restore }); } WebApplication webApplication = webApplicationBuilder.Build(); diff --git a/Viewer/Repositories/AppSettingsRepository.cs b/Viewer/Repositories/AppSettingsRepository.cs new file mode 100644 index 0000000..b4a55df --- /dev/null +++ b/Viewer/Repositories/AppSettingsRepository.cs @@ -0,0 +1,37 @@ +using OI.Metrology.Shared.Models.Stateless; +using OI.Metrology.Viewer.Models; +using System.Text.Json; + +namespace OI.Metrology.Viewer.Repository; + +public class AppSettingsRepository : IAppSettingsRepository +{ + + private readonly AppSettings _AppSettings; + + public AppSettingsRepository(AppSettings appSettings) => _AppSettings = appSettings; + + public List GetAppSettings() + { + List results = new(); + string json = JsonSerializer.Serialize(_AppSettings); + JsonElement jsonElement = JsonSerializer.Deserialize(json); + JsonProperty[] jsonProperties = jsonElement.EnumerateObject().ToArray(); + foreach (JsonProperty jsonProperty in jsonProperties) + results.Add(jsonProperty.Value.ToString()); + if (!_AppSettings.IsDevelopment) + throw new Exception("Shouldn't expose!"); + return results; + } + + List IAppSettingsRepository.GetAppSettings() => GetAppSettings(); + + public string GetBuildNumberAndGitCommitSeven() + { + string result = string.Concat(_AppSettings.BuildNumber, '-', _AppSettings.GitCommitSeven); + return result; + } + + string IAppSettingsRepository.GetBuildNumberAndGitCommitSeven() => GetBuildNumberAndGitCommitSeven(); + +} \ No newline at end of file diff --git a/Viewer/Repositories/ClientSettingsRepository.cs b/Viewer/Repositories/ClientSettingsRepository.cs new file mode 100644 index 0000000..b24a8e4 --- /dev/null +++ b/Viewer/Repositories/ClientSettingsRepository.cs @@ -0,0 +1,36 @@ +using OI.Metrology.Shared.Models.Stateless; +using OI.Metrology.Viewer.Models; +using System.Net; + +namespace OI.Metrology.Viewer.Repository; + +public class ClientSettingsRepository : IClientSettingsRepository +{ + + private readonly AppSettings _AppSettings; + + public ClientSettingsRepository(AppSettings appSettings) => _AppSettings = appSettings; + + public List GetClientSettings(IPAddress? remoteIpAddress) + { + List results = new(); + if (remoteIpAddress is null) + results.Add(nameof(remoteIpAddress)); + else + results.Add(remoteIpAddress.ToString()); + if (!_AppSettings.IsDevelopment) + throw new Exception("Shouldn't expose!"); + return results; + } + + List IClientSettingsRepository.GetClientSettings(IPAddress? remoteIpAddress) => GetClientSettings(remoteIpAddress); + + public string GetIpAddress(IPAddress? remoteIpAddress) + { + string result = remoteIpAddress is null ? string.Empty : remoteIpAddress.ToString(); + return result; + } + + string IClientSettingsRepository.GetIpAddress(IPAddress? remoteIpAddress) => GetIpAddress(remoteIpAddress); + +} \ No newline at end of file diff --git a/Viewer/Repositories/InboundRepository.cs b/Viewer/Repositories/InboundRepository.cs new file mode 100644 index 0000000..6f6c5fa --- /dev/null +++ b/Viewer/Repositories/InboundRepository.cs @@ -0,0 +1,88 @@ +using Newtonsoft.Json.Linq; +using OI.Metrology.Shared.DataModels; +using OI.Metrology.Shared.Models; +using OI.Metrology.Shared.Models.Stateless; +using OI.Metrology.Shared.Services; +using System.Net; + +namespace OI.Metrology.Viewer.Repository; + +public class InboundRepository : IInboundRepository +{ + + private readonly Serilog.ILogger _Log; + + public InboundRepository() => _Log = Serilog.Log.ForContext(); + + bool IInboundRepository.IsIPAddressAllowed(string inboundApiAllowedIPList, IPAddress? remoteIP) + { + if (string.IsNullOrWhiteSpace(inboundApiAllowedIPList)) + return true; + if (remoteIP is null) + return false; + byte[] remoteIPBytes = remoteIP.GetAddressBytes(); + string[] allowedIPs = inboundApiAllowedIPList.Split(';'); + foreach (string ip in allowedIPs) + { + IPAddress? parsedIP; + if (IPAddress.TryParse(ip, out parsedIP)) + { + if (parsedIP.GetAddressBytes().SequenceEqual(remoteIPBytes)) + return true; + } + } + return false; + } + + // this is the main endpoint, it accepts a JSON message that contains both the header and data records together + // tooltype is the ToolTypeName column from the ToolType table + // JToken is how you can accept a JSON message without deserialization. + // Using "string" doesn't work because ASP.NET Core will expect a json encoded string, not give you the actual string. + DataResponse IInboundRepository.Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string tooltype, JToken jsonbody) + { + DataResponse result = new(); + ToolType? toolType = metrologyRepository.GetToolTypeByName(tooltype); + if (toolType is null) + result.Errors.Add("Invalid tool type: " + tooltype); + else + { + List metaData = metrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList(); + if (metaData is null) + result.Errors.Add("Invalid metadata for tool type: " + tooltype); + else if (jsonbody is null) + result.Errors.Add("Invalid json"); + else + inboundDataService.ValidateJSONFields(jsonbody, 0, metaData, result.Errors, result.Warnings); + if (metaData is not null && jsonbody is not null && !result.Errors.Any()) + { + try + { + result.HeaderID = inboundDataService.DoSQLInsert(jsonbody, toolType, metaData); + result.Success = result.HeaderID > 0; + } + catch (Exception ex) { result.Errors.Add(ex.Message); } + } + } + return result; + } + + // this is the endpoint for attaching a field. It is not JSON, it is form-data/multipart like an HTML form because that's the normal way. + // header ID is the ID value from the Header table + // datauniqueid is the Title value from the Data/Detail table + string? IInboundRepository.AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string tooltype, long headerid, string datauniqueid, string fileName, object uploadedFile) + { + string? result = null; + ToolType toolType = metrologyRepository.GetToolTypeByName(tooltype); + if (toolType is null) + result = $"Invalid tool type: {tooltype}"; + string filename = Path.GetFileName(fileName); + if (string.IsNullOrWhiteSpace(filename)) + result = "Empty filename"; + if (filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) + result = "Invalid filename"; + if (result is null && toolType is not null) + attachmentsService.SaveAttachment(toolType, headerid, datauniqueid, filename, uploadedFile); + return result; + } + +} \ No newline at end of file diff --git a/Viewer/Repositories/MetrologyRepo.cs b/Viewer/Repositories/MetrologyRepository.cs similarity index 94% rename from Viewer/Repositories/MetrologyRepo.cs rename to Viewer/Repositories/MetrologyRepository.cs index c6a31bb..47b3880 100644 --- a/Viewer/Repositories/MetrologyRepo.cs +++ b/Viewer/Repositories/MetrologyRepository.cs @@ -2,22 +2,22 @@ using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json.Linq; using OI.Metrology.Shared.DataModels; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Repositories; -using System; -using System.Collections.Generic; using System.Data; using System.Data.Common; -using System.Linq; using System.Transactions; +#pragma warning disable CS8600, CS8602, CS8603, CS8604, CS8625 + namespace OI.Metrology.Viewer.Repositories; -public class MetrologyRepo : IMetrologyRepo +public class MetrologyRepository : IMetrologyRepository { private readonly IMemoryCache _Cache; private readonly IDbConnectionFactory _DBConnectionFactory; - public MetrologyRepo(IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache) + public MetrologyRepository(IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache) { _Cache = memoryCache; _DBConnectionFactory = dbConnectionFactory; @@ -139,10 +139,10 @@ public class MetrologyRepo : IMetrologyRepo // build field map foreach (ToolTypeMetadata f in fields) { - if ((f.ApiName != null) && f.ApiName.Contains('\\')) + if ((f.ApiName is not null) && f.ApiName.Contains('\\')) { string n = f.ApiName.Split('\\')[0].Trim().ToUpper(); - if (containerField == null) + if (containerField is null) containerField = n; else if (!string.Equals(containerField, n)) throw new Exception("Only one container field is allowed"); @@ -156,7 +156,7 @@ public class MetrologyRepo : IMetrologyRepo } } - if (containerField == null) + if (containerField is null) { // No container field, just insert a single row @@ -167,7 +167,7 @@ public class MetrologyRepo : IMetrologyRepo // Find the container field in the json JProperty contJP = jsonrow.Children().Where(c => string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); - if ((contJP != null) && (contJP.Value is JArray array)) + if ((contJP is not null) && (contJP.Value is JArray array)) { JArray contRows = array; @@ -220,11 +220,11 @@ public class MetrologyRepo : IMetrologyRepo { string apifield = jp.Name.Trim().ToUpper(); - if (fieldmap.ContainsKey(apifield)) + if (fieldmap.TryGetValue(apifield, out string value)) { string parmname = string.Format("@p{0}", parmnumber); - columns += string.Format("[{0}],", fieldmap[apifield]); + columns += string.Format("[{0}],", value); parms += parmname; parms += ","; parmnumber += 1; @@ -236,18 +236,18 @@ public class MetrologyRepo : IMetrologyRepo } } - if ((containerrow != null) && (containerFieldmap != null)) + if ((containerrow is not null) && (containerFieldmap is not null)) { foreach (JProperty jp in containerrow.Children()) { string apifield = jp.Name.Trim().ToUpper(); - if (containerFieldmap.ContainsKey(apifield)) + if (containerFieldmap.TryGetValue(apifield, out string value)) { string parmname = string.Format("@p{0}", parmnumber); - columns += string.Format("[{0}],", containerFieldmap[apifield]); + columns += string.Format("[{0}],", value); parms += parmname; parms += ","; parmnumber += 1; @@ -267,7 +267,7 @@ public class MetrologyRepo : IMetrologyRepo cmd.CommandText = columns.TrimEnd(',') + parms.TrimEnd(',') + ";SELECT SCOPE_IDENTITY();"; object o = cmd.ExecuteScalar(); - if ((o == null) || Convert.IsDBNull(o)) + if ((o is null) || Convert.IsDBNull(o)) throw new Exception("Unexpected query result"); return Convert.ToInt64(o); } @@ -307,7 +307,7 @@ public class MetrologyRepo : IMetrologyRepo { if (!firstField) _ = sb.Append(','); - if (f.GridAttributes != null && f.GridAttributes.Contains("isNull")) + if (f.GridAttributes is not null && f.GridAttributes.Contains("isNull")) { _ = sb.AppendFormat("{0}", "ISNULL(" + f.ColumnName + ", '')[" + f.ColumnName + "]"); } @@ -325,11 +325,11 @@ public class MetrologyRepo : IMetrologyRepo public DataTable GetHeaders(int toolTypeId, DateTime? startTime, DateTime? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); IEnumerable md = GetToolTypeMetadataByToolTypeID(toolTypeId); - if (md == null) + if (md is null) throw new Exception("Invalid tool type metadata"); DataTable dt = new(); @@ -418,11 +418,11 @@ public class MetrologyRepo : IMetrologyRepo public DataTable GetData(int toolTypeId, long headerid) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); IEnumerable md = GetToolTypeMetadataByToolTypeID(toolTypeId); - if (md == null) + if (md is null) throw new Exception("Invalid tool type metadata"); DataTable dt = new(); @@ -513,7 +513,7 @@ public class MetrologyRepo : IMetrologyRepo public Guid GetHeaderAttachmentID(int toolTypeId, long headerId) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -525,7 +525,7 @@ public class MetrologyRepo : IMetrologyRepo public string GetHeaderInsertDate(int toolTypeId, long headerId) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -557,7 +557,7 @@ public class MetrologyRepo : IMetrologyRepo public Guid GetDataAttachmentID(int toolTypeId, long headerId, string title) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -570,7 +570,7 @@ public class MetrologyRepo : IMetrologyRepo public string GetDataInsertDate(int toolTypeId, long headerId, string title) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -603,7 +603,7 @@ public class MetrologyRepo : IMetrologyRepo public DataSet GetOIExportData(int toolTypeId, long headerid) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); if (string.IsNullOrWhiteSpace(tt.OIExportSPName)) @@ -632,7 +632,7 @@ public class MetrologyRepo : IMetrologyRepo public IEnumerable GetHeaderTitles(int toolTypeId, int? pageNo, int? pageSize, out long totalRecords) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -661,11 +661,11 @@ public class MetrologyRepo : IMetrologyRepo public IEnumerable> GetHeaderFields(int toolTypeId, long headerid) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); IEnumerable md = GetToolTypeMetadataByToolTypeID(toolTypeId); - if (md == null) + if (md is null) throw new Exception("Invalid tool type metadata"); List> r = new(); @@ -692,10 +692,10 @@ public class MetrologyRepo : IMetrologyRepo foreach (ToolTypeMetadata m in md.Where(m => m.Header == true && m.TableDisplayOrder > 0).OrderBy(m => m.TableDisplayOrder)) { string v = ""; - if (dr != null) + if (dr is not null) { object o = dr[m.ColumnName]; - if (o != null && !Convert.IsDBNull(o)) + if (o is not null && !Convert.IsDBNull(o)) v = Convert.ToString(o); } KeyValuePair kvp = new(m.DisplayTitle, v); @@ -714,7 +714,7 @@ public class MetrologyRepo : IMetrologyRepo public int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -736,7 +736,7 @@ public class MetrologyRepo : IMetrologyRepo public Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -748,7 +748,7 @@ public class MetrologyRepo : IMetrologyRepo public Guid GetDataAttachmentIDByTitle(int toolTypeId, string title) { ToolType tt = GetToolTypeByID(toolTypeId); - if (tt == null) + if (tt is null) throw new Exception("Invalid tool type ID"); using DbConnection conn = GetDbConnection(); @@ -757,5 +757,5 @@ public class MetrologyRepo : IMetrologyRepo return conn.ExecuteScalar(sql, param: new { Title = title }); } - DataTable IMetrologyRepo.GetDataSharePoint(int toolTypeId, string headerId) => throw new NotImplementedException(); + DataTable IMetrologyRepository.GetDataSharePoint(int toolTypeId, string headerId) => throw new NotImplementedException(); } \ No newline at end of file diff --git a/Viewer/Repositories/ServiceShopOrderRepository.cs b/Viewer/Repositories/ServiceShopOrderRepository.cs new file mode 100644 index 0000000..9bd763d --- /dev/null +++ b/Viewer/Repositories/ServiceShopOrderRepository.cs @@ -0,0 +1,56 @@ +using OI.Metrology.Shared.Models.Stateless; +using OI.Metrology.Shared.ViewModels; +using Serilog.Context; +using System.Text.Json; + +namespace OI.Metrology.Viewer.Repository; + +public class ServiceShopOrderRepository : IServiceShopOrderRepository +{ + + private readonly Serilog.ILogger _Log; + + public ServiceShopOrderRepository() => _Log = Serilog.Log.ForContext(); + + private static ServiceShopOrder[] GetServiceShopOrders(Shared.Models.ServiceShop? serviceShop) + { + ServiceShopOrder[] result = IServiceShopOrder.GetServiceShopOrders(serviceShop); + return result; + } + + private static Shared.Models.ServiceShop? GetServiceShopOrders() + { + Shared.Models.ServiceShop? result; + string jsonFile; + string checkDirectory = Path.Combine(AppContext.BaseDirectory, "Data/Mike"); + if (Directory.Exists(checkDirectory)) + jsonFile = Path.Combine(checkDirectory, "service-shop.json"); + else + jsonFile = Path.Combine(AppContext.BaseDirectory, "service-shop.json"); + string json = File.ReadAllText(jsonFile); + result = JsonSerializer.Deserialize(json); + return result; + } + + async Task IServiceShopOrderRepository.GetAllServiceShopOrders() + { + ServiceShopOrder[] results; + string? methodName = IMethodName.GetActualAsyncMethodName(); + using (LogContext.PushProperty("MethodName", methodName)) + { + _Log.Debug("() => ..."); + Shared.Models.ServiceShop? serviceShop = await Task.Run(GetServiceShopOrders); + results = GetServiceShopOrders(serviceShop); + } + return results.ToArray(); + } + + async Task IServiceShopOrderRepository.GetServiceShopOrders(string id) + { + ServiceShopOrder[] results; + Shared.Models.ServiceShop? serviceShop = await Task.Run(GetServiceShopOrders); + results = GetServiceShopOrders(serviceShop).Where(l => l.Id == id).ToArray(); + return results; + } + +} \ No newline at end of file diff --git a/Viewer/Repositories/ToolTypesRepository.cs b/Viewer/Repositories/ToolTypesRepository.cs new file mode 100644 index 0000000..e96f151 --- /dev/null +++ b/Viewer/Repositories/ToolTypesRepository.cs @@ -0,0 +1,177 @@ +using Newtonsoft.Json; +using OI.Metrology.Shared.DataModels; +using OI.Metrology.Shared.Models.Stateless; +using OI.Metrology.Shared.Services; + +namespace OI.Metrology.Viewer.Repository; + +public class ToolTypesRepository : IToolTypesRepository +{ + + private readonly Serilog.ILogger _Log; + + public ToolTypesRepository() => _Log = Serilog.Log.ForContext(); + + // Get a list of tooltypes, returns just Name and ID + object IToolTypesRepository.Index(IMetrologyRepository metrologyRepository) + { + var r = new + { + Results = metrologyRepository.GetToolTypes().Select(tt => new { tt.ToolTypeName, tt.ID }) + }; + return r; + } + + // Gets the metadata for a tooltype, accepts a parameter which sorts the results + // This is used to setup the grid displays on the UI + object IToolTypesRepository.GetToolTypeMetadata(IMetrologyRepository metrologyRepository, int id, string sortby) + { + ToolType tt = metrologyRepository.GetToolTypeByID(id); + IEnumerable md = metrologyRepository.GetToolTypeMetadataByToolTypeID(id); + + if (string.Equals(sortby, "grid", StringComparison.OrdinalIgnoreCase)) + md = md.OrderBy(f => f.GridDisplayOrder).ToList(); + if (string.Equals(sortby, "table", StringComparison.OrdinalIgnoreCase)) + md = md.OrderBy(f => f.GridDisplayOrder).ToList(); + + var r = new + { + Results = new + { + ToolType = tt, + Metadata = md + } + }; + return r; + } + + // Gets headers, request/response format is to allow paging with igniteUI + // The headerid parameter is used for navigating directly to a header, when the button is clicked in Awaiting Dispo + string IToolTypesRepository.GetHeaders(IMetrologyRepository metrologyRepository, int id, DateTime? datebegin, DateTime? dateend, int? page, int? pagesize, long? headerid) + { + string result; + long totalRecs; + System.Data.DataTable dt = metrologyRepository.GetHeaders(id, datebegin, dateend, page, pagesize, headerid, out totalRecs); + var r = new + { + Results = dt, + TotalRows = totalRecs, + }; + result = JsonConvert.SerializeObject(r); + return result; + } + + // Gets header titles, used in the Run Headers UI + string IToolTypesRepository.GetHeaderTitles(IMetrologyRepository metrologyRepository, int id, int? page, int? pagesize) + { + string result; + long totalRecs; + IEnumerable dt = metrologyRepository.GetHeaderTitles(id, page, pagesize, out totalRecs); + var r = new + { + Results = dt, + TotalRows = totalRecs, + }; + result = JsonConvert.SerializeObject(r); + return result; + } + + // Get all of the fields for a header, used with the Run Header UI + string IToolTypesRepository.GetHeaderFields(IMetrologyRepository metrologyRepository, int id, long headerid) + { + string result; + var r = new + { + Results = metrologyRepository.GetHeaderFields(id, headerid).Select(x => new { Column = x.Key, x.Value }).ToList() + }; + result = JsonConvert.SerializeObject(r); + return result; + } + + // Get the data for a header, used with the Run Info UI + string IToolTypesRepository.GetData(IMetrologyRepository metrologyRepository, int id, long headerid) + { + string result; + var r = new + { + Results = metrologyRepository.GetData(id, headerid) + }; + result = JsonConvert.SerializeObject(r); + return result; + } + + // Display an attachment, used for Run Info - note it is by tool type ID and attachment GUID, so it is best for internal use + (string?, string?, Stream?) IToolTypesRepository.GetAttachment(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, string tabletype, string attachmentId, string filename) + { + Stream? stream = null; + string? message = null; + Guid attachmentIdParsed; + string? contenttype = null; + ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId); + bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase); + if (!Guid.TryParse(attachmentId, out attachmentIdParsed)) + message = "Invalid attachment id"; + else + { + try + { + // figure out what content type to use. this is very simple because there are only two types being used + contenttype = "application/pdf"; + if (filename.ToLower().TrimEnd().EndsWith(".txt")) + contenttype = "text/plain"; + // Get attachment stream and feed it to the client + stream = attachmentsService.GetAttachmentStreamByAttachmentId(tt, header, attachmentIdParsed, filename); + } + catch (Exception ex) { message = ex.Message; } + } + return new(message, contenttype, stream); + } + + // This endpoint triggers writing of the OI Export file + Exception? IToolTypesRepository.OIExport(IMetrologyRepository metrologyRepository, string oiExportPath, int toolTypeId, long headerid) + { + Exception? result = null; + // Call the export stored procedure + _Log.Debug($"Exporting to <{oiExportPath}>"); + System.Data.DataSet ds = metrologyRepository.GetOIExportData(toolTypeId, headerid); + try + { + // The SP must return 3 result tables + if (ds.Tables.Count != 3) + throw new Exception("Error exporting, invalid results"); + // The first table has just one row, which is the export filename + if (ds.Tables[0].Rows.Count != 1) + throw new Exception("Error exporting, invalid filename"); + string? filename = Convert.ToString(ds.Tables[0].Rows[0][0]); + // The second table has the header data + if (ds.Tables[1].Rows.Count != 1) + throw new Exception("Error exporting, invalid header data"); + System.Text.StringBuilder sb = new(); + foreach (object? o in ds.Tables[1].Rows[0].ItemArray) + { + if ((o is not null) && (!Convert.IsDBNull(o))) + _ = sb.Append(Convert.ToString(o)); + _ = sb.Append('\t'); + } + // The third table has the detail data + foreach (System.Data.DataRow dr in ds.Tables[2].Rows) + { + foreach (object? o in dr.ItemArray) + { + if ((o is not null) && (!Convert.IsDBNull(o))) + _ = sb.Append(Convert.ToString(o)); + _ = sb.Append('\t'); + } + } + _ = sb.AppendLine(); + // The output file will only have one line, the header columns are output first + // Then each detail rows has it's columns appended + // H1, H2, H3, D1.1, D1.2, D1.3, D2.1, D2.2, D2.3, etc + // Write the file + File.WriteAllText(Path.Join(oiExportPath, filename), sb.ToString()); + } + catch (Exception ex) { result = ex; } + return result; + } + +} \ No newline at end of file diff --git a/Viewer/Services/AttachmentsService.cs b/Viewer/Services/AttachmentsService.cs index cb5f4bc..ac26a51 100644 --- a/Viewer/Services/AttachmentsService.cs +++ b/Viewer/Services/AttachmentsService.cs @@ -1,32 +1,32 @@ -using System; -using System.Globalization; -using System.IO; +using System.Globalization; namespace OI.Metrology.Viewer.Services; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; using OI.Metrology.Viewer.Models; public class AttachmentsService : IAttachmentsService { private readonly AppSettings _AppSettings; + private readonly IMetrologyRepository _MetrologyRepository; - private readonly IMetrologyRepo _Repo; - - public AttachmentsService(AppSettings appSettings, IMetrologyRepo repo) + public AttachmentsService(AppSettings appSettings, IMetrologyRepository metrologyRepository) { _AppSettings = appSettings; - _Repo = repo; + _MetrologyRepository = metrologyRepository; } - protected Stream GetAttachmentStream(string tableName, Guid attachmentId, string filename) + protected Stream GetAttachmentStream(string? tableName, Guid attachmentId, string filename) { if (attachmentId.Equals(Guid.Empty)) throw new Exception("No attachments found"); - DateTime insertDate = Convert.ToDateTime(_Repo.GetAttachmentInsertDateByGUID(tableName, attachmentId)); + if (tableName is null) + throw new NullReferenceException(nameof(tableName)); + + DateTime insertDate = Convert.ToDateTime(_MetrologyRepository.GetAttachmentInsertDateByGUID(tableName, attachmentId)); int year = insertDate.Year; DateTime d = insertDate; CultureInfo cul = CultureInfo.CurrentCulture; @@ -50,28 +50,28 @@ public class AttachmentsService : IAttachmentsService public Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename) { - if (toolType == null) + if (toolType is null) throw new Exception("Invalid tool type"); Guid attachmentId; - string tableName; + string? tableName; if (header) { tableName = toolType.HeaderTableName; - attachmentId = _Repo.GetHeaderAttachmentIDByTitle(toolType.ID, title); + attachmentId = _MetrologyRepository.GetHeaderAttachmentIDByTitle(toolType.ID, title); } else { tableName = toolType.DataTableName; - attachmentId = _Repo.GetDataAttachmentIDByTitle(toolType.ID, title); + attachmentId = _MetrologyRepository.GetDataAttachmentIDByTitle(toolType.ID, title); } return GetAttachmentStream(tableName, attachmentId, filename); } public Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename) { - if (toolType == null) + if (toolType is null) throw new Exception("Invalid tool type"); - string tableName; + string? tableName; if (header) tableName = toolType.HeaderTableName; else @@ -79,27 +79,27 @@ public class AttachmentsService : IAttachmentsService return GetAttachmentStream(tableName, attachmentId, filename); } - private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, Microsoft.AspNetCore.Http.IFormFile uploadedFile) + private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, IFormFile uploadedFile) { - if (toolType == null) + if (toolType is null) throw new Exception("Invalid tool type"); - using System.Transactions.TransactionScope trans = _Repo.StartTransaction(); + using System.Transactions.TransactionScope trans = _MetrologyRepository.StartTransaction(); Guid attachmentId = Guid.Empty; DateTime insertDate = new(); - string tableName = ""; + string? tableName = ""; if (string.IsNullOrWhiteSpace(dataUniqueId)) { - attachmentId = _Repo.GetHeaderAttachmentID(toolType.ID, headerId); - insertDate = Convert.ToDateTime(_Repo.GetHeaderInsertDate(toolType.ID, headerId)); + attachmentId = _MetrologyRepository.GetHeaderAttachmentID(toolType.ID, headerId); + insertDate = Convert.ToDateTime(_MetrologyRepository.GetHeaderInsertDate(toolType.ID, headerId)); tableName = toolType.HeaderTableName; } else { - attachmentId = _Repo.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); - insertDate = Convert.ToDateTime(_Repo.GetDataInsertDate(toolType.ID, headerId, dataUniqueId)); + attachmentId = _MetrologyRepository.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); + insertDate = Convert.ToDateTime(_MetrologyRepository.GetDataInsertDate(toolType.ID, headerId, dataUniqueId)); // Get Date for new directory name tableName = toolType.DataTableName; @@ -131,7 +131,7 @@ public class AttachmentsService : IAttachmentsService public void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, object uploadedFile) { - Microsoft.AspNetCore.Http.IFormFile formFile = (Microsoft.AspNetCore.Http.IFormFile)uploadedFile; + IFormFile formFile = (IFormFile)uploadedFile; SaveAttachment(toolType, headerId, dataUniqueId, filename, formFile); } diff --git a/Viewer/Services/InboundDataService.cs b/Viewer/Services/InboundDataService.cs index 92ede9b..e3fef40 100644 --- a/Viewer/Services/InboundDataService.cs +++ b/Viewer/Services/InboundDataService.cs @@ -1,18 +1,17 @@ using Newtonsoft.Json.Linq; using OI.Metrology.Shared.DataModels; -using OI.Metrology.Shared.Repositories; +using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Services; -using System; -using System.Collections.Generic; -using System.Linq; + +#pragma warning disable CS8600, CS8602, CS8603, CS8604, CS8625 namespace OI.Metrology.Viewer.Services; public class InboundDataService : IInboundDataService { - private readonly IMetrologyRepo _Repo; + private readonly IMetrologyRepository _MetrologyRepository; - public InboundDataService(IMetrologyRepo repo) => _Repo = repo; + public InboundDataService(IMetrologyRepository metrologyRepository) => _MetrologyRepository = metrologyRepository; public long DoSQLInsert(JToken jsonbody, ToolType toolType, List metaData) { @@ -37,11 +36,11 @@ public class InboundDataService : IInboundDataService long headerId = 0; - using (System.Transactions.TransactionScope transScope = _Repo.StartTransaction()) + using (System.Transactions.TransactionScope transScope = _MetrologyRepository.StartTransaction()) { try { - _Repo.PurgeExistingData(toolType.ID, uniqueId); + _MetrologyRepository.PurgeExistingData(toolType.ID, uniqueId); } catch (Exception ex) { @@ -50,7 +49,7 @@ public class InboundDataService : IInboundDataService try { - headerId = _Repo.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName); + headerId = _MetrologyRepository.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName); } catch (Exception ex) { @@ -60,11 +59,11 @@ public class InboundDataService : IInboundDataService int detailrow = 1; try { - if (detailsArray != null) + if (detailsArray is not null) { foreach (JToken detail in detailsArray) { - _ = _Repo.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName); + _ = _MetrologyRepository.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName); detailrow += 1; } } @@ -133,7 +132,7 @@ public class InboundDataService : IInboundDataService if (jp.First is JArray array) detailsArray = array; - else if ((jp.First is JValue value) && (value.Value == null)) + else if ((jp.First is JValue value) && (value.Value is null)) detailsArray = null; else errors.Add("Invalid details field"); @@ -169,7 +168,7 @@ public class InboundDataService : IInboundDataService } // if a Details container if found, process it by recursion - if (detailsArray != null) + if (detailsArray is not null) { int i = 1; foreach (JToken detail in detailsArray) @@ -189,7 +188,7 @@ public class InboundDataService : IInboundDataService { // get the json data for this container field, ex: Points JProperty contJP = jsonbody.Children().Where(jp => string.Equals(jp.Name, containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); - if ((contJP != null) && (contJP.Value is JArray array)) + if ((contJP is not null) && (contJP.Value is JArray array)) { JArray contJPArray = array; diff --git a/Viewer/Repositories/SQLDbConnectionFactory.cs b/Viewer/Services/SQLDbConnectionFactory.cs similarity index 88% rename from Viewer/Repositories/SQLDbConnectionFactory.cs rename to Viewer/Services/SQLDbConnectionFactory.cs index c69ebb3..863e2c6 100644 --- a/Viewer/Repositories/SQLDbConnectionFactory.cs +++ b/Viewer/Services/SQLDbConnectionFactory.cs @@ -1,10 +1,11 @@ using OI.Metrology.Shared.Repositories; using OI.Metrology.Viewer.Models; -using System; using System.Data.Common; using System.Data.SqlClient; -namespace OI.Metrology.Viewer.Repositories; +#pragma warning disable CS8600, CS8602, CS8603, CS8604, CS8625 + +namespace OI.Metrology.Viewer.Services; public class SQLDbConnectionFactory : IDbConnectionFactory { diff --git a/Viewer/Views/Shared/_Layout.cshtml b/Viewer/Views/Shared/_Layout.cshtml index 871f765..7968fcb 100644 --- a/Viewer/Views/Shared/_Layout.cshtml +++ b/Viewer/Views/Shared/_Layout.cshtml @@ -73,7 +73,7 @@
  • Archive
  • diff --git a/Viewer/appsettings.Development.json b/Viewer/appsettings.Development.json index 98784eb..0f6b70c 100644 --- a/Viewer/appsettings.Development.json +++ b/Viewer/appsettings.Development.json @@ -1,26 +1,6 @@ { - "AllowedHosts": "*", - "ApiLoggingContentTypes": "application/json", - "ApiLoggingPathPrefixes": "/api/inbound", - "ApiLogPath": "D:\\Metrology\\MetrologyAPILogs", - "AttachmentPath": "\\\\messv02ecc1.ec.local\\EC_Metrology_Si\\MetrologyAttachments", - "BuildNumber": "1", - "Company": "Infineon Technologies Americas Corp.", - "ConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Integrated Security=True;Initial Catalog=Metrology;", - "GitCommitSeven": "1234567", - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Log4netProvider": "Debug", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "InboundApiAllowedIPList": "", + "IsDevelopment": true, "MonAResource": "OI_Metrology_Viewer_IFX", - "MonASite": "auc", - "Oi2SqlConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;", - "OIExportPath": "\\\\openinsight-db-srv.na.infineon.com\\apps\\Metrology\\Data", "Serilog": { "Using": [ "Serilog.Sinks.Console", @@ -58,6 +38,5 @@ "Application": "Sample" } }, - "URLs": "https://localhost:7130;http://localhost:5126", - "WorkingDirectoryName": "IFXApps" + "URLs": "https://localhost:7130;http://localhost:5126" } \ No newline at end of file diff --git a/Viewer/appsettings.json b/Viewer/appsettings.json index 2baa8b7..2670efd 100644 --- a/Viewer/appsettings.json +++ b/Viewer/appsettings.json @@ -17,6 +17,8 @@ } }, "InboundApiAllowedIPList": "", + "IsDevelopment": false, + "IsStaging": false, "MonAResource": "OI_Metrology_Viewer_EC", "MonASite": "auc", "Oi2SqlConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;", @@ -26,7 +28,7 @@ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], - "MinimumLevel": "Debug", + "MinimumLevel": "Information", "WriteTo": [ { "Name": "Debug",