From 48f2e9f1b1aa7b730abf84cdea9d9be777be4ced Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 7 May 2020 13:57:35 +0000 Subject: [PATCH] --- .../Controllers/WorkOrderController.cs | 56 ++++++++--- server/AyaNova/biz/WorkOrderBiz.cs | 97 ++++++++++++------- 2 files changed, 106 insertions(+), 47 deletions(-) diff --git a/server/AyaNova/Controllers/WorkOrderController.cs b/server/AyaNova/Controllers/WorkOrderController.cs index 1947a9ff..7ee79be8 100644 --- a/server/AyaNova/Controllers/WorkOrderController.cs +++ b/server/AyaNova/Controllers/WorkOrderController.cs @@ -72,9 +72,9 @@ namespace AyaNova.Api.Controllers } //TODO: GET BY RELATIVE - //get by descendent type and id - - + //get by descendent type and id + + /// @@ -120,18 +120,14 @@ namespace AyaNova.Api.Controllers - //TODO: this should post a workorder instead, no need for Create first like this - /// - /// Post WorkOrder + /// Post Workorder /// - /// - /// - /// force a workorder number, leave null to autogenerate the next one in sequence (mostly used for import) + /// /// Automatically filled from route path, no need to specify in body - /// A created workorder ready to fill out - [HttpPost("Create")] - public async Task PostWorkOrder([FromQuery] long? workorderTemplateId, long? customerId, uint? serial, ApiVersion apiVersion) + /// + [HttpPost] + public async Task PostWorkOrder([FromBody] WorkOrder inObj, ApiVersion apiVersion) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); @@ -147,13 +143,47 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(ModelState)); //Create and validate - WorkOrder o = await biz.CreateAsync(workorderTemplateId,customerId, serial); + WorkOrder o = await biz.CreateAsync(inObj); if (o == null) return BadRequest(new ApiErrorResponse(biz.Errors)); else return CreatedAtAction(nameof(WorkOrderController.GetWorkOrder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + // /// + // /// Post WorkOrder + // /// + // /// + // /// + // /// force a workorder number, leave null to autogenerate the next one in sequence (mostly used for import) + // /// Automatically filled from route path, no need to specify in body + // /// A created workorder ready to fill out + // [HttpPost("Create")] + // public async Task PostWorkOrder([FromQuery] long? workorderTemplateId, long? customerId, uint? serial, ApiVersion apiVersion) + // { + // if (!serverState.IsOpen) + // return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + // //Instantiate the business object handler + // WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); + + // //If a user has change roles + // if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) + // return StatusCode(403, new ApiNotAuthorizedResponse()); + + // if (!ModelState.IsValid) + // return BadRequest(new ApiErrorResponse(ModelState)); + + // //Create and validate + // WorkOrder o = await biz.CreateAsync(workorderTemplateId,customerId, serial); + // if (o == null) + // return BadRequest(new ApiErrorResponse(biz.Errors)); + // else + // return CreatedAtAction(nameof(WorkOrderController.GetWorkOrder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + // } + //TODO: CreateFromTemplate(templateid) //TODO: Createfromquote(quoteid) //todo: createfrompm(pmid) diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index 4124c1e5..d6f52760 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -62,7 +62,7 @@ WARNING: Since version 3.0.0, each Include will cause an additional JOIN to be a //This is simple so nothing more here, but often will be copying to a different output object or some other ops //var ret = await ct.WorkOrder.SingleOrDefaultAsync(m => m.Id == fetchId); - var ret = await ct.WorkOrder.Include(w=>w.WorkorderItems).SingleOrDefaultAsync(m => m.Id == fetchId); + var ret = await ct.WorkOrder.Include(w => w.WorkorderItems).SingleOrDefaultAsync(m => m.Id == fetchId); if (logTheGetEvent && ret != null) { @@ -78,45 +78,74 @@ WARNING: Since version 3.0.0, each Include will cause an additional JOIN to be a //TODO: Modify this to expect a workorder object like most POST routes for other objects //No need for this style of create empty and return - + + //Called from route and also seeder - internal async Task CreateAsync(long? workorderTemplateId, long? customerId, uint? serial) + internal async Task CreateAsync(WorkOrder inObj) { - //Create and save to db a new workorder and return it - //NOTE: Serial can be specified or edited after the fact in a limited way by full role specfic only!! (service manager, bizadminfull, accounting maybe) - - if (serial != null && !Authorized.HasAnyRole(CurrentUserRoles, RolesAllowedToChangeSerial)) - { - AddError(ApiErrorCode.NOT_AUTHORIZED, "Serial"); + await ValidateAsync(inObj, null); + if (HasErrors) return null; + else + { + //do stuff with widget + WorkOrder outObj = inObj; + + //Test get serial id visible id number from generator + outObj.Serial = ServerBootConfig.WORKORDER_SERIAL.GetNext(); + + outObj.Tags = TagUtil.NormalizeTags(outObj.Tags); + outObj.CustomFields = JsonUtil.CompactJson(outObj.CustomFields); + //Save to db + await ct.WorkOrder.AddAsync(outObj); + await ct.SaveChangesAsync(); + //Handle child and associated items: + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, outObj.Id, BizType, AyaEvent.Created), ct); + await SearchIndexAsync(outObj, true); + await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); + + return outObj; } - - - // await ValidateAsync(inObj, null); - // if (HasErrors) - // return null; - // else - // { - //do stuff with WorkOrder - WorkOrder o = new WorkOrder(); - o.Serial = serial ?? ServerBootConfig.WORKORDER_SERIAL.GetNext(); - - //TODO: template - //TODO: CUSTOMER ID - - - //Save to db - await ct.WorkOrder.AddAsync(o); - await ct.SaveChangesAsync(); - //Handle child and associated items: - await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, o.Id, BizType, AyaEvent.Created), ct); - await SearchIndexAsync(o, true); - // await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, o.Tags, null); - - return o; - //} } + // //Called from route and also seeder + // internal async Task CreateAsync(long? workorderTemplateId, long? customerId, uint? serial) + // { + // //Create and save to db a new workorder and return it + // //NOTE: Serial can be specified or edited after the fact in a limited way by full role specfic only!! (service manager, bizadminfull, accounting maybe) + + // if (serial != null && !Authorized.HasAnyRole(CurrentUserRoles, RolesAllowedToChangeSerial)) + // { + // AddError(ApiErrorCode.NOT_AUTHORIZED, "Serial"); + // return null; + // } + + + // // await ValidateAsync(inObj, null); + // // if (HasErrors) + // // return null; + // // else + // // { + // //do stuff with WorkOrder + // WorkOrder o = new WorkOrder(); + // o.Serial = serial ?? ServerBootConfig.WORKORDER_SERIAL.GetNext(); + + // //TODO: template + // //TODO: CUSTOMER ID + + + // //Save to db + // await ct.WorkOrder.AddAsync(o); + // await ct.SaveChangesAsync(); + // //Handle child and associated items: + // await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, o.Id, BizType, AyaEvent.Created), ct); + // await SearchIndexAsync(o, true); + // // await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, o.Tags, null); + + // return o; + // //} + // } +