diff --git a/.vscode/launch.json b/.vscode/launch.json index 8fd97968..0e2049e9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -53,7 +53,7 @@ "AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles", "AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles", "AYANOVA_FOLDER_TEMPORARY_SERVER_FILES": "c:\\temp\\RavenTestData\\tempfiles", - "AYANOVA_SERVER_TEST_MODE": "true", + "AYANOVA_SERVER_TEST_MODE": "false", "AYANOVA_SERVER_TEST_MODE_SEEDLEVEL": "small", "AYANOVA_SERVER_TEST_MODE_TZ_OFFSET": "-7", "AYANOVA_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_13\\bin\\" diff --git a/server/AyaNova/Controllers/WorkOrderItemStatusController.cs b/server/AyaNova/Controllers/WorkOrderItemStatusController.cs new file mode 100644 index 00000000..61e1b96d --- /dev/null +++ b/server/AyaNova/Controllers/WorkOrderItemStatusController.cs @@ -0,0 +1,184 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Logging; +using AyaNova.Models; +using AyaNova.Api.ControllerHelpers; +using AyaNova.Biz; +using Microsoft.EntityFrameworkCore; +using System.Linq; +using EnumsNET; + +namespace AyaNova.Api.Controllers +{ + [ApiController] + [ApiVersion("8.0")] + [Route("api/v{version:apiVersion}/work-order-item-status")] + [Produces("application/json")] + [Authorize] + public class WorkOrderItemStatusController : ControllerBase + { + private readonly AyContext ct; + private readonly ILogger log; + private readonly ApiServerState serverState; + + /// + /// ctor + /// + /// + /// + /// + public WorkOrderItemStatusController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState) + { + ct = dbcontext; + log = logger; + serverState = apiServerState; + } + + /// + /// Create WorkOrderItemStatus + /// + /// + /// From route path + /// + [HttpPost] + public async Task PostWorkOrderItemStatus([FromBody] WorkOrderItemStatus newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + WorkOrderItemStatusBiz biz = WorkOrderItemStatusBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + WorkOrderItemStatus o = await biz.CreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(WorkOrderItemStatusController.GetWorkOrderItemStatus), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + /// + /// Duplicate WorkOrderItemStatus + /// + /// + /// Source object id + /// From route path + /// WorkOrderItemStatus + [HttpPost("duplicate/{id}")] + public async Task DuplicateWorkOrderItemStatus([FromRoute] long id, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + WorkOrderItemStatusBiz biz = WorkOrderItemStatusBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + WorkOrderItemStatus o = await biz.DuplicateAsync(id); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(WorkOrderItemStatusController.GetWorkOrderItemStatus), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + /// + /// Get WorkOrderItemStatus + /// + /// + /// WorkOrderItemStatus + [HttpGet("{id}")] + public async Task GetWorkOrderItemStatus([FromRoute] long id) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + WorkOrderItemStatusBiz biz = WorkOrderItemStatusBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.GetAsync(id); + if (o == null) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update WorkOrderItemStatus + /// + /// + /// + [HttpPut] + public async Task PutWorkOrderItemStatus([FromBody] WorkOrderItemStatus updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + WorkOrderItemStatusBiz biz = WorkOrderItemStatusBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.PutAsync(updatedObject);//In future may need to return entire object, for now just concurrency token + if (o == null) + { + if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) + return StatusCode(409, new ApiErrorResponse(biz.Errors)); + else + return BadRequest(new ApiErrorResponse(biz.Errors)); + } + return Ok(ApiOkResponse.Response(new { Concurrency = o.Concurrency })); ; + } + + /// + /// Delete WorkOrderItemStatus + /// + /// + /// NoContent + [HttpDelete("{id}")] + public async Task DeleteWorkOrderItemStatus([FromRoute] long id) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + WorkOrderItemStatusBiz biz = WorkOrderItemStatusBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.DeleteAsync(id)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + + + // /// + // /// Get Status list + // /// + // /// List in alphabetical order of all work order status items + // [HttpGet("list")] + // public async Task StatusList() + // { + // if (!serverState.IsOpen) + // return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + // if (!Authorized.HasSelectRole(HttpContext.Items, AyaType.WorkOrderItemStatus)) + // return StatusCode(403, new ApiNotAuthorizedResponse()); + // var allStates = await ct.WorkOrderItemStatus.AsNoTracking().OrderBy(z => z.Name).ToListAsync(); + // var currentUserRoles = UserRolesFromContext.Roles(HttpContext.Items); + // var allowedStates = allStates.Where(z => currentUserRoles.HasAnyFlags(z.SelectRoles)).ToList(); + + // // foreach (var item in rpts) + // // { + // // if (CurrentUserRoles.HasAnyFlags(item.roles)) + // // { + // // ret.Add(new NameIdItem() { Name = item.name, Id = item.id }); + // // } + // // } + // return Ok(ApiOkResponse.Response(new { all = allStates, allowed = allowedStates })); + // } + + //------------ + + + }//eoc +}//eons \ No newline at end of file diff --git a/server/AyaNova/DataList/WorkOrderItemStatusDataList.cs b/server/AyaNova/DataList/WorkOrderItemStatusDataList.cs new file mode 100644 index 00000000..f90e918e --- /dev/null +++ b/server/AyaNova/DataList/WorkOrderItemStatusDataList.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using AyaNova.Biz; +namespace AyaNova.DataList +{ + internal class WorkOrderItemStatusDataList : DataListProcessingBase + { + public WorkOrderItemStatusDataList() + { + DefaultListAType = AyaType.WorkOrderItemStatus; + SQLFrom = "from aworkorderstatus"; + var RoleSet = BizRoles.GetRoleSet(DefaultListAType); + AllowedRoles = RoleSet.ReadFullRecord | RoleSet.Change; + DefaultColumns = new List() { "WorkOrderItemStatusName", "WorkOrderItemStatusNotes", "Active" }; + DefaultSortBy = new Dictionary() { { "WorkOrderItemStatusName", "+" } }; + FieldDefinitions = new List(); + + FieldDefinitions.Add(new DataListFieldDefinition + { + TKey = "WorkOrderItemStatusName", + FieldKey = "WorkOrderItemStatusName", + AType = (int)AyaType.WorkOrderItemStatus, + UiFieldDataType = (int)UiFieldDataType.Text, + SqlIdColumnName = "aworkorderstatus.id", + SqlValueColumnName = "aworkorderstatus.name", + SqlColorColumnName = "aworkorderstatus.color", + IsRowId = true + }); + + FieldDefinitions.Add(new DataListFieldDefinition + { + TKey = "WorkOrderItemStatusNotes", + FieldKey = "WorkOrderItemStatusNotes", + UiFieldDataType = (int)UiFieldDataType.Text, + SqlValueColumnName = "aworkorderstatus.notes" + }); + + FieldDefinitions.Add(new DataListFieldDefinition + { + TKey = "Active", + FieldKey = "Active", + UiFieldDataType = (int)UiFieldDataType.Bool, + SqlValueColumnName = "aworkorderstatus.active" + }); + + FieldDefinitions.Add(new DataListFieldDefinition + { + TKey = "WorkOrderItemStatusCompleted", + FieldKey = "WorkOrderItemStatusCompleted", + UiFieldDataType = (int)UiFieldDataType.Bool, + SqlValueColumnName = "aworkorderstatus.completed" + }); + + FieldDefinitions.Add(new DataListFieldDefinition + { + TKey = "WorkOrderItemStatusLocked", + FieldKey = "WorkOrderItemStatusLocked", + UiFieldDataType = (int)UiFieldDataType.Bool, + SqlValueColumnName = "aworkorderstatus.locked" + }); + + + } + }//eoc +}//eons \ No newline at end of file diff --git a/server/AyaNova/biz/AyaType.cs b/server/AyaNova/biz/AyaType.cs index 0d3f1740..3b586a10 100644 --- a/server/AyaNova/biz/AyaType.cs +++ b/server/AyaNova/biz/AyaType.cs @@ -139,7 +139,9 @@ namespace AyaNova.Biz PartInventoryRequest = 70,//for list only not, synthetic object WorkOrderStatus = 71, TaskGroup = 72, - WorkOrderItemOutsideService = 73 + WorkOrderItemOutsideService = 73, + WorkOrderItemPriority=74, + WorkOrderItemStatus=75 diff --git a/server/AyaNova/biz/BizRoles.cs b/server/AyaNova/biz/BizRoles.cs index 6390caa6..509282d1 100644 --- a/server/AyaNova/biz/BizRoles.cs +++ b/server/AyaNova/biz/BizRoles.cs @@ -461,6 +461,28 @@ namespace AyaNova.Biz Select = AuthorizationRoles.All//sub restricted by client and biz rules as status has it's own role settings so just keep it open for everyone to potentially access }); + //////////////////////////////////////////////////////////// + //WorkOrderItemStatus + // + roles.Add(AyaType.WorkOrderItemStatus, new BizRoleSet() + { + Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull | AuthorizationRoles.AccountingFull, + ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | + AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited | AuthorizationRoles.CustomerLimited | AuthorizationRoles.CustomerFull, + Select = AuthorizationRoles.All + }); + + //////////////////////////////////////////////////////////// + //WorkOrderItemPriority + // + roles.Add(AyaType.WorkOrderItemPriority, new BizRoleSet() + { + Change = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.TechFull | AuthorizationRoles.SubContractorFull | AuthorizationRoles.AccountingFull, + ReadFullRecord = AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.SalesFull | + AuthorizationRoles.SalesLimited | AuthorizationRoles.SubContractorLimited | AuthorizationRoles.TechLimited | AuthorizationRoles.CustomerLimited | AuthorizationRoles.CustomerFull, + Select = AuthorizationRoles.All + }); + //////////////////////////////////////////////////////////// //WorkOrder // diff --git a/server/AyaNova/biz/FormFieldReference.cs b/server/AyaNova/biz/FormFieldReference.cs index 7f4d1afc..40f6088f 100644 --- a/server/AyaNova/biz/FormFieldReference.cs +++ b/server/AyaNova/biz/FormFieldReference.cs @@ -842,8 +842,6 @@ namespace AyaNova.Biz l.Add(new FormField { TKey = "WorkOrderInternalReferenceNumber", FieldKey = "WorkOrderInternalReferenceNumber" }); l.Add(new FormField { TKey = "WorkOrderOnsite", FieldKey = "WorkOrderOnsite" }); - - l.Add(new FormField { TKey = "Tags", FieldKey = "Tags" }); l.Add(new FormField { TKey = "Wiki", FieldKey = "Wiki" }); l.Add(new FormField { TKey = "Attachments", FieldKey = "Attachments" }); @@ -877,6 +875,12 @@ namespace AyaNova.Biz l.Add(new FormField { TKey = "Wiki", FieldKey = "WorkOrderItemWiki", TKeySection = "WorkOrderItem" }); l.Add(new FormField { TKey = "Attachments", FieldKey = "WorkOrderItemAttachments", TKeySection = "WorkOrderItem" }); + + l.Add(new FormField { TKey = "WorkOrderItemWorkOrderStatusID", FieldKey = "WorkOrderItemWorkOrderStatusID", TKeySection = "WorkOrderItem" }); + l.Add(new FormField { TKey = "WorkOrderItemPriorityID", FieldKey = "WorkOrderItemPriorityID", TKeySection = "WorkOrderItem" }); + l.Add(new FormField { TKey = "WorkOrderItemRequestDate", FieldKey = "WorkOrderItemRequestDate", TKeySection = "WorkOrderItem" }); + l.Add(new FormField { TKey = "WorkOrderItemWarrantyService", FieldKey = "WorkOrderItemWarrantyService", TKeySection = "WorkOrderItem" }); + l.Add(new FormField { TKey = "WorkOrderItemCustom1", FieldKey = "WorkOrderItemCustom1", IsCustomField = true, TKeySection = "WorkOrderItem" }); l.Add(new FormField { TKey = "WorkOrderItemCustom2", FieldKey = "WorkOrderItemCustom2", IsCustomField = true, TKeySection = "WorkOrderItem" }); l.Add(new FormField { TKey = "WorkOrderItemCustom3", FieldKey = "WorkOrderItemCustom3", IsCustomField = true, TKeySection = "WorkOrderItem" }); diff --git a/server/AyaNova/biz/WorkOrderItemStatusBiz.cs b/server/AyaNova/biz/WorkOrderItemStatusBiz.cs new file mode 100644 index 00000000..2b087d69 --- /dev/null +++ b/server/AyaNova/biz/WorkOrderItemStatusBiz.cs @@ -0,0 +1,250 @@ +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using AyaNova.Util; +using AyaNova.Api.ControllerHelpers; +using AyaNova.Models; + +namespace AyaNova.Biz +{ + internal class WorkOrderItemStatusBiz : BizObject, ISearchAbleObject + { + internal WorkOrderItemStatusBiz(AyContext dbcontext, long currentUserId, long userTranslationId, AuthorizationRoles UserRoles) + { + ct = dbcontext; + UserId = currentUserId; + UserTranslationId = userTranslationId; + CurrentUserRoles = UserRoles; + BizType = AyaType.WorkOrderItemStatus; + } + + internal static WorkOrderItemStatusBiz GetBiz(AyContext ct, Microsoft.AspNetCore.Http.HttpContext httpContext = null) + { + if (httpContext != null) + return new WorkOrderItemStatusBiz(ct, UserIdFromContext.Id(httpContext.Items), UserTranslationIdFromContext.Id(httpContext.Items), UserRolesFromContext.Roles(httpContext.Items)); + else + return new WorkOrderItemStatusBiz(ct, 1, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, AuthorizationRoles.BizAdminFull); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //EXISTS + internal async Task ExistsAsync(long id) + { + return await ct.WorkOrderItemStatus.AnyAsync(z => z.Id == id); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //CREATE + // + internal async Task CreateAsync(WorkOrderItemStatus newObject) + { + await ValidateAsync(newObject, null); + if (HasErrors) + return null; + else + { + await ct.WorkOrderItemStatus.AddAsync(newObject); + await ct.SaveChangesAsync(); + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); + await SearchIndexAsync(newObject, true); + return newObject; + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //DUPLICATE + // + internal async Task DuplicateAsync(long id) + { + var dbObject = await GetAsync(id, false); + if (dbObject == null) + { + AddError(ApiErrorCode.NOT_FOUND, "id"); + return null; + } + WorkOrderItemStatus newObject = new WorkOrderItemStatus(); + CopyObject.Copy(dbObject, newObject); + string newUniqueName = string.Empty; + bool NotUnique = true; + long l = 1; + do + { + newUniqueName = Util.StringUtil.UniqueNameBuilder(dbObject.Name, l++, 255); + NotUnique = await ct.WorkOrderItemStatus.AnyAsync(m => m.Name == newUniqueName); + } while (NotUnique); + newObject.Name = newUniqueName; + newObject.Id = 0; + newObject.Concurrency = 0; + await ct.WorkOrderItemStatus.AddAsync(newObject); + await ct.SaveChangesAsync(); + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); + await SearchIndexAsync(newObject, true); + return newObject; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //GET + // + internal async Task GetAsync(long id, bool logTheGetEvent = true) + { + var ret = await ct.WorkOrderItemStatus.AsNoTracking().SingleOrDefaultAsync(m => m.Id == id); + if (logTheGetEvent && ret != null) + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); + return ret; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //UPDATE + // + internal async Task PutAsync(WorkOrderItemStatus putObject) + { + var dbObject = await GetAsync(putObject.Id, false); + if (dbObject == null) + { + AddError(ApiErrorCode.NOT_FOUND, "id"); + return null; + } + if (dbObject.Concurrency != putObject.Concurrency) + { + AddError(ApiErrorCode.CONCURRENCY_CONFLICT); + return null; + } + + + await ValidateAsync(putObject, dbObject); + if (HasErrors) return null; + ct.Replace(dbObject, putObject); + try + { + await ct.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException) + { + if (!await ExistsAsync(putObject.Id)) + AddError(ApiErrorCode.NOT_FOUND); + else + AddError(ApiErrorCode.CONCURRENCY_CONFLICT); + return null; + } + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); + await SearchIndexAsync(putObject, false); + return putObject; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //DELETE + // + internal async Task DeleteAsync(long id) + { + using (var transaction = await ct.Database.BeginTransactionAsync()) + { + try + { + var dbObject = await GetAsync(id, false); + if (dbObject == null) + { + AddError(ApiErrorCode.NOT_FOUND); + return false; + } + await ValidateCanDeleteAsync(dbObject); + if (HasErrors) + return false; + ct.WorkOrderItemStatus.Remove(dbObject); + await ct.SaveChangesAsync(); + + //Log event + await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); + await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType, ct); + await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); + await transaction.CommitAsync(); + } + catch + { + //Just re-throw for now, let exception handler deal, but in future may want to deal with this more here + throw; + } + return true; + } + } + + + + //////////////////////////////////////////////////////////////////////////////////////////////// + //SEARCH + // + private async Task SearchIndexAsync(WorkOrderItemStatus obj, bool isNew) + { + var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, BizType); + DigestSearchText(obj, SearchParams); + if (isNew) + await Search.ProcessNewObjectKeywordsAsync(SearchParams); + else + await Search.ProcessUpdatedObjectKeywordsAsync(SearchParams); + } + + public async Task GetSearchResultSummary(long id) + { + var obj = await GetAsync(id, false); + var SearchParams = new Search.SearchIndexProcessObjectParameters(); + DigestSearchText(obj, SearchParams); + return SearchParams; + } + + public void DigestSearchText(WorkOrderItemStatus obj, Search.SearchIndexProcessObjectParameters searchParams) + { + if (obj != null) + searchParams.AddText(obj.Notes) + .AddText(obj.Name); + } + + + + //////////////////////////////////////////////////////////////////////////////////////////////// + //VALIDATION + // + + private async Task ValidateAsync(WorkOrderItemStatus proposedObj, WorkOrderItemStatus currentObj) + { + + bool isNew = currentObj == null; + + //Name required + if (string.IsNullOrWhiteSpace(proposedObj.Name)) + AddError(ApiErrorCode.VALIDATION_REQUIRED, "Name"); + + + + //If name is otherwise OK, check that name is unique + if (!PropertyHasErrors("Name")) + { + //Use Any command is efficient way to check existance, it doesn't return the record, just a true or false + if (await ct.WorkOrderItemStatus.AnyAsync(m => m.Name == proposedObj.Name && m.Id != proposedObj.Id)) + { + AddError(ApiErrorCode.VALIDATION_NOT_UNIQUE, "Name"); + } + } + + } + + private async Task ValidateCanDeleteAsync(WorkOrderItemStatus inObj) + { + //MIGRATE_OUTSTANDING - check workorder records once wo is coded here + await Task.CompletedTask; + //Referential integrity + //FOREIGN KEY CHECKS + // if (await ct.PurchaseOrder.AnyAsync(m => m.WorkOrderItemStatusId == inObj.Id)) + // AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PurchaseOrder")); + } + + + + + + + + ///////////////////////////////////////////////////////////////////// + + }//eoc + + +}//eons + diff --git a/server/AyaNova/models/AyContext.cs b/server/AyaNova/models/AyContext.cs index 322c518a..70bd601f 100644 --- a/server/AyaNova/models/AyContext.cs +++ b/server/AyaNova/models/AyContext.cs @@ -89,6 +89,8 @@ namespace AyaNova.Models public virtual DbSet WorkOrderItemUnit { get; set; } public virtual DbSet WorkOrderItemOutsideService { get; set; } public virtual DbSet WorkOrderStatus { get; set; } + public virtual DbSet WorkOrderItemPriority { get; set; } + public virtual DbSet WorkOrderItemStatus { get; set; } //WorkOrderTemplate public virtual DbSet WorkOrderTemplate { get; set; } diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index 9285e654..bc30185a 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -2209,5 +2209,9 @@ "WorkOrderCustom15": "Angepasstes Feld 15", "WorkOrderCustom16": "Angepasstes Feld 16", "WorkOrderItemUnitList": "Einheiten", - "SelectAlternateAddress": "Stellen Sie eine alternative Adresse ein" + "SelectAlternateAddress": "Stellen Sie eine alternative Adresse ein", + "WorkOrderItemStatusList": "Artikelstatusliste", + "WorkOrderItemStatusName": "Name", + "WorkOrderItemStatusNotes": "Anmerkungen", + "WorkOrderItemStatusColor": "Farbe" } \ No newline at end of file diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index 2538c204..51739eb0 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -2209,5 +2209,10 @@ "WorkOrderCustom15": "Custom15", "WorkOrderCustom16": "Custom16", "WorkOrderItemUnitList": "Units", - "SelectAlternateAddress": "Select alternate address" + "SelectAlternateAddress": "Select alternate address", + "WorkOrderItemStatusList": "Work order item status list", + "WorkOrderItemStatusName": "Name", + "WorkOrderItemStatusNotes": "Notes", + "WorkOrderItemStatusColor": "Color" + } \ No newline at end of file diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index 820d3835..4392cb9b 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -2209,5 +2209,9 @@ "WorkOrderCustom15": "Campo personalizado 15", "WorkOrderCustom16": "Campo personalizado 16", "WorkOrderItemUnitList": "Unidades", - "SelectAlternateAddress": "Seleccionar dirección alternativa" + "SelectAlternateAddress": "Seleccionar dirección alternativa", + "WorkOrderItemStatusList": "Lista de estado del artículo", + "WorkOrderItemStatusName": "Nombre", + "WorkOrderItemStatusNotes": "Notas", + "WorkOrderItemStatusColor": "Color" } \ No newline at end of file diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index d40a01d7..d4fd4865 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -2209,5 +2209,9 @@ "WorkOrderCustom15": "Champ personnalisé 15", "WorkOrderCustom16": "Champ personnalisé 16", "WorkOrderItemUnitList": "Unités", - "SelectAlternateAddress": "Sélectionnez une autre adresse" + "SelectAlternateAddress": "Sélectionnez une autre adresse", + "WorkOrderItemStatusList": "Liste des statuts des articles", + "WorkOrderItemStatusName": "Nom", + "WorkOrderItemStatusNotes": "Remarques", + "WorkOrderItemStatusColor": "Couleur" } \ No newline at end of file