From de361171a25033cb0fc63a73207c494e8624d0d6 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Wed, 28 Jul 2021 14:56:14 +0000 Subject: [PATCH] --- server/AyaNova/Controllers/PMController.cs | 1323 ++++++++++++++++++-- 1 file changed, 1192 insertions(+), 131 deletions(-) diff --git a/server/AyaNova/Controllers/PMController.cs b/server/AyaNova/Controllers/PMController.cs index 8ffd8cc0..9eda41a9 100644 --- a/server/AyaNova/Controllers/PMController.cs +++ b/server/AyaNova/Controllers/PMController.cs @@ -3,12 +3,12 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Authorization; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using AyaNova.Models; using AyaNova.Api.ControllerHelpers; using AyaNova.Biz; - +using Microsoft.EntityFrameworkCore; +using System.Linq; namespace AyaNova.Api.Controllers { @@ -38,186 +38,1247 @@ namespace AyaNova.Api.Controllers serverState = apiServerState; } + + /* + ██████╗ ███╗ ███╗ + ██╔══██╗████╗ ████║ + ██████╔╝██╔████╔██║ + ██╔═══╝ ██║╚██╔╝██║ + ██║ ██║ ╚═╝ ██║ + ╚═╝ ╚═╝ ╚═╝ + */ + + #region PM top level routes + /// + /// Create PM + /// + /// PM - top level only, no descendants + /// From route path + /// PM + [HttpPost] + public async Task PostPM([FromBody] PM newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + + if (newObject.Items.Count > 0) + return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, "generalerror", "Work order POST route accepts header only; POST Work order descendants separately")); + + PM o = await biz.PMCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPM), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + // /// + // /// Duplicate PM + // /// (Wiki and Attachments are not duplicated) + // /// + // /// Source object id + // /// From route path + // /// PM + // [HttpPost("duplicate/{id}")] + // public async Task DuplicatePM([FromRoute] long id, ApiVersion apiVersion) + // { + // if (!serverState.IsOpen) + // return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + // PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + // if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) + // return StatusCode(403, new ApiNotAuthorizedResponse()); + // if (!ModelState.IsValid) + // return BadRequest(new ApiErrorResponse(ModelState)); + // PM o = await biz.PMDuplicateAsync(id); + // if (o == null) + // return BadRequest(new ApiErrorResponse(biz.Errors)); + // else + // return CreatedAtAction(nameof(PMController.GetPM), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + // } + /// - /// Get full PM object + /// Get PM /// /// - /// A single PM + /// PM [HttpGet("{id}")] public async Task GetPM([FromRoute] long id) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - - //Instantiate the business object handler PMBiz biz = PMBiz.GetBiz(ct, HttpContext); - - //NOTE: This is the first check and often the only check but in some cases with some objects this will also need to check biz object rules if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType)) return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.PMGetAsync(id, true); + if (o == null) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update PM + /// + /// + /// PM - top level only, no Items or other descendants + /// Updated work order header + [HttpPut] + public async Task PutPM([FromBody] PM updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - var o = await biz.GetAsync(id); + if (updatedObject.Items.Count > 0) + { + return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, "generalerror", "Work order PUT route accepts header only; PUT Work order descendants separately")); + } + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.PMPutAsync(updatedObject); + 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(o)); + } + + /// + /// Delete PM + /// + /// + /// NoContent + [HttpDelete("{id}")] + public async Task DeletePM([FromRoute] long id) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PM) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.PMDeleteAsync(id)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + + + /// + /// Get PM id from work order serial number + /// + /// + /// PM + [HttpGet("id-from-number/{number}")] + public async Task GetPMIdFromNumber([FromRoute] long number) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PM)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await ct.PM.AsNoTracking() + .Where(z => z.Serial == number) + .Select(z => z.Id) + .SingleOrDefaultAsync(); + if (o == 0) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + + #endregion PMTopLevel routes + + + + + + + + + /* + ██╗████████╗███████╗███╗ ███╗███████╗ + ██║╚══██╔══╝██╔════╝████╗ ████║██╔════╝ + ██║ ██║ █████╗ ██╔████╔██║███████╗ + ██║ ██║ ██╔══╝ ██║╚██╔╝██║╚════██║ + ██║ ██║ ███████╗██║ ╚═╝ ██║███████║ + ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚══════╝ + */ + + #region PMItem + /// + /// Create PMItem + /// + /// PMItem - no descendants + /// + /// PMItem object + [HttpPost("items")] + public async Task PostPMItem([FromBody] PMItem newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItem) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItem o = await biz.ItemCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItem), new { PMItemId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItem object + /// + /// + /// A single PMItem + [HttpGet("items/{PMItemId}")] + public async Task GetPMItem([FromRoute] long PMItemId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItem) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.ItemGetAsync(PMItemId); if (o == null) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); - - // NOTE: HERE would be the second check of biz rules before returning the object - // in cases where there is also a business rule to affect retrieval on top of basic rights - return Ok(ApiOkResponse.Response(o)); } /// - /// Update PM - /// - /// - /// - /// - [HttpPut("{id}")] - public async Task PutPM([FromRoute] long id, [FromBody] PM inObj) + /// Update PMItem + /// + /// + /// PMItem - top level only, no descendants + /// New concurrency token + [HttpPut("items/")] + public async Task PutPMItem([FromBody] PMItem updatedObject) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - - //Instantiate the business object handler PMBiz biz = PMBiz.GetBiz(ct, HttpContext); - - var o = await biz.GetAsync(id, false); - if (o == null) - return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); - - if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType)) + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItem) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - - try + var o = await biz.ItemPutAsync(updatedObject); + if (o == null) { - if (!await biz.PutAsync(o, inObj)) - return BadRequest(new ApiErrorResponse(biz.Errors)); - } - catch (DbUpdateConcurrencyException) - { - if (!await biz.ExistsAsync(id)) - return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) + return StatusCode(409, new ApiErrorResponse(biz.Errors)); else - return StatusCode(409, new ApiErrorResponse(ApiErrorCode.CONCURRENCY_CONFLICT)); + return BadRequest(new ApiErrorResponse(biz.Errors)); } return Ok(ApiOkResponse.Response(new { Concurrency = o.Concurrency })); } - - - - /// - /// Create PM + /// Delete PMItem /// - /// - /// - /// force a workorder number, leave null to autogenerate the next one in sequence (mostly used for import) - /// From route path - /// A created workorder ready to fill out - [HttpPost("Create")] - public async Task PostPM([FromQuery] long? pmTemplateId, long? customerId, uint? serial, ApiVersion apiVersion) + /// + /// NoContent + [HttpDelete("items/{PMItemId}")] + public async Task DeletePMItem([FromRoute] long PMItemId) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - - //Instantiate the business object handler - PMBiz biz = PMBiz.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 - PM o = await biz.CreateAsync(pmTemplateId,customerId, serial); - if (o == null) - return BadRequest(new ApiErrorResponse(biz.Errors)); - else - return CreatedAtAction(nameof(PMController.GetPM), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); - - - } - - // /// - // /// Duplicate PM - // /// - // /// Create a duplicate of this items id - // /// From route path - // /// - // [HttpPost("duplicate/{id}")] - // public async Task DuplicatePM([FromRoute] long id, ApiVersion apiVersion) - // { - // if (!serverState.IsOpen) - // return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - - // //Instantiate the business object handler - // PMBiz biz = PMBiz.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)); - - // var oSrc = await biz.GetAsync(id, false); - // if (oSrc == null) - // return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); - - // //Create and validate - // PM o = await biz.DuplicateAsync(oSrc); - // if (o == null) - // return BadRequest(new ApiErrorResponse(biz.Errors)); - // else - // return CreatedAtAction(nameof(PMController.GetPM), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); - - // } - - - - /// - /// Delete PM - /// - /// - /// Ok - [HttpDelete("{id}")] - public async Task DeletePM([FromRoute] long id) - { - if (!serverState.IsOpen) - return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - - if (!ModelState.IsValid) - return BadRequest(new ApiErrorResponse(ModelState)); - - //Instantiate the business object handler PMBiz biz = PMBiz.GetBiz(ct, HttpContext); - - var o = await biz.GetAsync(id, false); - if (o == null) - return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); - - if (!Authorized.HasDeleteRole(HttpContext.Items, biz.BizType)) + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItem) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - - if (!await biz.DeleteAsync(o)) + if (!await biz.ItemDeleteAsync(PMItemId)) return BadRequest(new ApiErrorResponse(biz.Errors)); - return NoContent(); } + #endregion pmitem + + + /* + ███████╗██╗ ██╗██████╗ ███████╗███╗ ██╗███████╗███████╗███████╗ + ██╔════╝╚██╗██╔╝██╔══██╗██╔════╝████╗ ██║██╔════╝██╔════╝██╔════╝ + █████╗ ╚███╔╝ ██████╔╝█████╗ ██╔██╗ ██║███████╗█████╗ ███████╗ + ██╔══╝ ██╔██╗ ██╔═══╝ ██╔══╝ ██║╚██╗██║╚════██║██╔══╝ ╚════██║ + ███████╗██╔╝ ██╗██║ ███████╗██║ ╚████║███████║███████╗███████║ + ╚══════╝╚═╝ ╚═╝╚═╝ ╚══════╝╚═╝ ╚═══╝╚══════╝╚══════╝╚══════╝ + */ + + #region PMItemExpense + + /// + /// Create PMItemExpense + /// + /// PMItemExpense level only no descendants + /// + /// PMItemExpense object (no descendants) + [HttpPost("items/expenses")] + public async Task PostPMItemExpense([FromBody] PMItemExpense newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItemExpense) || biz.UserIsSubContractorFull || biz.UserIsSubContractorRestricted) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItemExpense o = await biz.ExpenseCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItemExpense), new { PMItemExpenseId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItemExpense object + /// + /// + /// A single PMItemExpense + [HttpGet("items/expenses/{PMItemExpenseId}")] + public async Task GetPMItemExpense([FromRoute] long PMItemExpenseId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItemExpense) || biz.UserIsSubContractorFull || biz.UserIsSubContractorRestricted) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.ExpenseGetAsync(PMItemExpenseId); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update PMItemExpense + /// + /// + /// PMItemExpense - top level only, no descendants + /// Updated Expense item + [HttpPut("items/expenses")] + public async Task PutPMItemExpense([FromBody] PMItemExpense updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItemExpense) || biz.UserIsSubContractorFull || biz.UserIsSubContractorRestricted) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.ExpensePutAsync(updatedObject); + 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(o)); + } + + /// + /// Delete PMItemExpense + /// + /// + /// NoContent + [HttpDelete("items/expenses/{PMItemExpenseId}")] + public async Task DeletePMItemExpense([FromRoute] long PMItemExpenseId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItemExpense) || biz.UserIsSubContractorFull || biz.UserIsSubContractorRestricted) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.ExpenseDeleteAsync(PMItemExpenseId)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + #endregion PMItemExpense + + + /* + ██╗ █████╗ ██████╗ ██████╗ ██████╗ + ██║ ██╔══██╗██╔══██╗██╔═══██╗██╔══██╗ + ██║ ███████║██████╔╝██║ ██║██████╔╝ + ██║ ██╔══██║██╔══██╗██║ ██║██╔══██╗ + ███████╗██║ ██║██████╔╝╚██████╔╝██║ ██║ + ╚══════╝╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚═╝ ╚═╝ + + */ + + #region PMItemLabor + + /// + /// Create PMItemLabor + /// + /// PMItemLabor level only no descendants + /// + /// PMItemLabor object (no descendants) + [HttpPost("items/labors")] + public async Task PostPMItemLabor([FromBody] PMItemLabor newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItemLabor)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItemLabor o = await biz.LaborCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItemLabor), new { PMItemLaborId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItemLabor object + /// + /// + /// A single PMItemLabor + [HttpGet("items/labors/{PMItemLaborId}")] + public async Task GetPMItemLabor([FromRoute] long PMItemLaborId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItemLabor)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.LaborGetAsync(PMItemLaborId); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + + /// + /// Update PMItemLabor + /// + /// + /// PMItemLabor - top level only, no descendants + /// Updated object + [HttpPut("items/labors")] + public async Task PutPMItemLabor([FromBody] PMItemLabor updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItemLabor)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.LaborPutAsync(updatedObject); + 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(o)); + } + + + /// + /// Delete PMItemLabor + /// + /// + /// NoContent + [HttpDelete("items/labors/{PMItemLaborId}")] + public async Task DeletePMItemLabor([FromRoute] long PMItemLaborId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItemLabor)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.LaborDeleteAsync(PMItemLaborId)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + + #endregion PMItemLabor + + + /* + ██╗ ██████╗ █████╗ ███╗ ██╗ + ██║ ██╔═══██╗██╔══██╗████╗ ██║ + ██║ ██║ ██║███████║██╔██╗ ██║ + ██║ ██║ ██║██╔══██║██║╚██╗██║ + ███████╗╚██████╔╝██║ ██║██║ ╚████║ + ╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ + */ + + #region PMItemLoan + + /// + /// Create PMItemLoan + /// + /// PMItemLoan level only no descendants + /// + /// PMItemLoan object (no descendants) + [HttpPost("items/loans")] + public async Task PostPMItemLoan([FromBody] PMItemLoan newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItemLoan) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItemLoan o = await biz.LoanCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItemLoan), new { PMItemLoanId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItemLoan object + /// + /// + /// A single PMItemLoan + [HttpGet("items/loans/{PMItemLoanId}")] + public async Task GetPMItemLoan([FromRoute] long PMItemLoanId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItemLoan) || biz.UserIsSubContractorRestricted) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.LoanGetAsync(PMItemLoanId); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update PMItemLoan + /// + /// + /// PMItemLoan - top level only, no descendants + /// New concurrency token + [HttpPut("items/loans")] + public async Task PutPMItemLoan([FromBody] PMItemLoan updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItemLoan) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.LoanPutAsync(updatedObject); + 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(o)); + } + + /// + /// Delete PMItemLoan + /// + /// + /// NoContent + [HttpDelete("items/loans/{PMItemLoanId}")] + public async Task DeletePMItemLoan([FromRoute] long PMItemLoanId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItemLoan) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.LoanDeleteAsync(PMItemLoanId)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + #endregion PMItemLoan + + + /* + + ██████╗ ██╗ ██╗████████╗███████╗██╗██████╗ ███████╗ ███████╗███████╗██████╗ ██╗ ██╗██╗ ██████╗███████╗ + ██╔═══██╗██║ ██║╚══██╔══╝██╔════╝██║██╔══██╗██╔════╝ ██╔════╝██╔════╝██╔══██╗██║ ██║██║██╔════╝██╔════╝ + ██║ ██║██║ ██║ ██║ ███████╗██║██║ ██║█████╗ ███████╗█████╗ ██████╔╝██║ ██║██║██║ █████╗ + ██║ ██║██║ ██║ ██║ ╚════██║██║██║ ██║██╔══╝ ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║██║ ██╔══╝ + ╚██████╔╝╚██████╔╝ ██║ ███████║██║██████╔╝███████╗ ███████║███████╗██║ ██║ ╚████╔╝ ██║╚██████╗███████╗ + ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝╚═════╝ ╚══════╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═════╝╚══════╝ + + */ + + + #region PMItemOutsideService + + /// + /// Create PMItemOutsideService + /// + /// PMItemOutsideService level only no descendants + /// + /// PMItemOutsideService object (no descendants) + [HttpPost("items/outside-services")] + public async Task PostPMItemOutsideService([FromBody] PMItemOutsideService newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItemOutsideService) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItemOutsideService o = await biz.OutsideServiceCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItemOutsideService), new { PMItemOutsideServiceId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItemOutsideService object + /// + /// + /// A single PMItemOutsideService + [HttpGet("items/outside-services/{PMItemOutsideServiceId}")] + public async Task GetPMItemOutsideService([FromRoute] long PMItemOutsideServiceId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItemOutsideService) || biz.UserIsSubContractorFull || biz.UserIsSubContractorRestricted) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.OutsideServiceGetAsync(PMItemOutsideServiceId); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update PMItemOutsideService + /// + /// + /// PMItemOutsideService - top level only, no descendants + /// New concurrency token + [HttpPut("items/outside-services")] + public async Task PutPMItemOutsideService([FromBody] PMItemOutsideService updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItemOutsideService) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.OutsideServicePutAsync(updatedObject); + 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(o)); + } + + /// + /// Delete PMItemOutsideService + /// + /// + /// NoContent + [HttpDelete("items/outside-services/{PMItemOutsideServiceId}")] + public async Task DeletePMItemOutsideService([FromRoute] long PMItemOutsideServiceId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItemOutsideService) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.OutsideServiceDeleteAsync(PMItemOutsideServiceId)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + #endregion PMItemOutsideService + + + + /* + ██████╗ █████╗ ██████╗ ████████╗███████╗ + ██╔══██╗██╔══██╗██╔══██╗╚══██╔══╝██╔════╝ + ██████╔╝███████║██████╔╝ ██║ ███████╗ + ██╔═══╝ ██╔══██║██╔══██╗ ██║ ╚════██║ + ██║ ██║ ██║██║ ██║ ██║ ███████║ + ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚══════╝ + */ + + #region PMItemPart + + /// + /// Create PMItemPart + /// + /// PMItemPart level only no descendants + /// + /// PMItemPart object (no descendants) + [HttpPost("items/parts")] + public async Task PostPMItemPart([FromBody] PMItemPart newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItemPart) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItemPart o = await biz.CreatePartAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItemPart), new { PMItemPartId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItemPart object + /// + /// + /// A single PMItemPart + [HttpGet("items/parts/{PMItemPartId}")] + public async Task GetPMItemPart([FromRoute] long PMItemPartId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItemPart) || biz.UserIsSubContractorRestricted) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.PartGetAsync(PMItemPartId); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update PMItemPart + /// + /// + /// PMItemPart - top level only, no descendants + /// New concurrency token + [HttpPut("items/parts")] + public async Task PutPMItemPart([FromBody] PMItemPart updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItemPart) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.PartPutAsync(updatedObject); + 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(o)); + } + + /// + /// Delete PMItemPart + /// + /// + /// NoContent + [HttpDelete("items/parts/{PMItemPartId}")] + public async Task DeletePMItemPart([FromRoute] long PMItemPartId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItemPart) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.PartDeleteAsync(PMItemPartId)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + #endregion PMItemPart + + + + /* + ███████╗ ██████╗██╗ ██╗███████╗██████╗ ██╗ ██╗██╗ ███████╗██████╗ ██╗ ██╗███████╗███████╗██████╗ ███████╗ + ██╔════╝██╔════╝██║ ██║██╔════╝██╔══██╗██║ ██║██║ ██╔════╝██╔══██╗ ██║ ██║██╔════╝██╔════╝██╔══██╗██╔════╝ + ███████╗██║ ███████║█████╗ ██║ ██║██║ ██║██║ █████╗ ██║ ██║█████╗██║ ██║███████╗█████╗ ██████╔╝███████╗ + ╚════██║██║ ██╔══██║██╔══╝ ██║ ██║██║ ██║██║ ██╔══╝ ██║ ██║╚════╝██║ ██║╚════██║██╔══╝ ██╔══██╗╚════██║ + ███████║╚██████╗██║ ██║███████╗██████╔╝╚██████╔╝███████╗███████╗██████╔╝ ╚██████╔╝███████║███████╗██║ ██║███████║ + ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═════╝ ╚═════╝ ╚══════╝╚══════╝╚═════╝ ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚══════╝ + */ + + #region PMItemScheduledUser + + /// + /// Create PMItemScheduledUser + /// + /// PMItemScheduledUser level only no descendants + /// + /// PMItemScheduledUser object (no descendants) + [HttpPost("items/scheduled-users")] + public async Task PostPMItemScheduledUser([FromBody] PMItemScheduledUser newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItemScheduledUser) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItemScheduledUser o = await biz.ScheduledUserCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItemScheduledUser), new { PMItemScheduledUserId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItemScheduledUser object + /// + /// + /// A single PMItemScheduledUser + [HttpGet("items/scheduled-users/{PMItemScheduledUserId}")] + public async Task GetPMItemScheduledUser([FromRoute] long PMItemScheduledUserId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItemScheduledUser)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.ScheduledUserGetAsync(PMItemScheduledUserId); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update PMItemScheduledUser + /// + /// + /// PMItemScheduledUser - top level only, no descendants + /// New concurrency token + [HttpPut("items/scheduled-users")] + public async Task PutPMItemScheduledUser([FromBody] PMItemScheduledUser updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItemScheduledUser) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.ScheduledUserPutAsync(updatedObject); + 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(o)); + } + + /// + /// Delete PMItemScheduledUser + /// + /// + /// NoContent + [HttpDelete("items/scheduled-users/{PMItemScheduledUserId}")] + public async Task DeletePMItemScheduledUser([FromRoute] long PMItemScheduledUserId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItemScheduledUser) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.ScheduledUserDeleteAsync(PMItemScheduledUserId)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + #endregion PMItemScheduledUser + + + /* + ████████╗ █████╗ ███████╗██╗ ██╗ + ╚══██╔══╝██╔══██╗██╔════╝██║ ██╔╝ + ██║ ███████║███████╗█████╔╝ + ██║ ██╔══██║╚════██║██╔═██╗ + ██║ ██║ ██║███████║██║ ██╗ + ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ + */ + + #region PMItemtask + + /// + /// Create PMItemTask + /// + /// PMItemTask level only no descendants + /// + /// PMItemTask object (no descendants) + [HttpPost("items/tasks")] + public async Task PostPMItemTask([FromBody] PMItemTask newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItemTask) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItemTask o = await biz.TaskCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItemTask), new { PMItemTaskId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItemTask object + /// + /// + /// A single PMItemTask + [HttpGet("items/tasks/{PMItemTaskId}")] + public async Task GetPMItemTask([FromRoute] long PMItemTaskId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItemTask)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.TaskGetAsync(PMItemTaskId); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update PMItemTask + /// + /// + /// PMItemTask - top level only, no descendants + /// New concurrency token + [HttpPut("items/tasks")] + public async Task PutPMItemTask([FromBody] PMItemTask updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItemTask)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.TaskPutAsync(updatedObject); + 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(o)); + } + + /// + /// Delete PMItemTask + /// + /// + /// NoContent + [HttpDelete("items/tasks/{PMItemTaskId}")] + public async Task DeletePMItemTask([FromRoute] long PMItemTaskId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItemTask) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.TaskDeleteAsync(PMItemTaskId)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + #endregion PMItemTask + + + /* + ████████╗██████╗ █████╗ ██╗ ██╗███████╗██╗ + ╚══██╔══╝██╔══██╗██╔══██╗██║ ██║██╔════╝██║ + ██║ ██████╔╝███████║██║ ██║█████╗ ██║ + ██║ ██╔══██╗██╔══██║╚██╗ ██╔╝██╔══╝ ██║ + ██║ ██║ ██║██║ ██║ ╚████╔╝ ███████╗███████╗ + ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚══════╝ + */ + + #region PMItemTravel + + /// + /// Create PMItemTravel + /// + /// PMItemTravel level only no descendants + /// + /// PMItemTravel object (no descendants) + [HttpPost("items/travels")] + public async Task PostPMItemTravel([FromBody] PMItemTravel newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItemTravel)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItemTravel o = await biz.TravelCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItemTravel), new { PMItemTravelId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItemTravel object + /// + /// + /// A single PMItemTravel + [HttpGet("items/travels/{PMItemTravelId}")] + public async Task GetPMItemTravel([FromRoute] long PMItemTravelId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItemTravel)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.TravelGetAsync(PMItemTravelId); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update PMItemTravel + /// + /// + /// PMItemTravel - top level only, no descendants + /// New concurrency token + [HttpPut("items/travels")] + public async Task PutPMItemTravel([FromBody] PMItemTravel updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItemTravel)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.TravelPutAsync(updatedObject); + 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(o)); + } + + /// + /// Delete PMItemTravel + /// + /// + /// NoContent + [HttpDelete("items/travels/{PMItemTravelId}")] + public async Task DeletePMItemTravel([FromRoute] long PMItemTravelId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItemTravel)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.TravelDeleteAsync(PMItemTravelId)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + #endregion PMItemTravel + + + /* + ██╗ ██╗███╗ ██╗██╗████████╗ + ██║ ██║████╗ ██║██║╚══██╔══╝ + ██║ ██║██╔██╗ ██║██║ ██║ + ██║ ██║██║╚██╗██║██║ ██║ + ╚██████╔╝██║ ╚████║██║ ██║ + ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝ + */ + + #region PMItemUnit + + /// + /// Create PMItemUnit + /// + /// PMItemUnit level only no descendants + /// + /// PMItemUnit object (no descendants) + [HttpPost("items/units")] + public async Task PostPMItemUnit([FromBody] PMItemUnit newObject, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.PMItemUnit) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMItemUnit o = await biz.UnitCreateAsync(newObject); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(PMController.GetPMItemUnit), new { PMItemUnitId = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + + /// + /// Get PMItemUnit object + /// + /// + /// A single PMItemUnit + [HttpGet("items/units/{PMItemUnitId}")] + public async Task GetPMItemUnit([FromRoute] long PMItemUnitId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.PMItemUnit) || biz.UserIsSubContractorRestricted) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.UnitGetAsync(PMItemUnitId); + if (o == null) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); + } + + /// + /// Update PMItemUnit + /// + /// + /// PMItemUnit - top level only, no descendants + /// New concurrency token + [HttpPut("items/units")] + public async Task PutPMItemUnit([FromBody] PMItemUnit updatedObject) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.PMItemUnit) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + var o = await biz.UnitPutAsync(updatedObject); + 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(o)); + } + + /// + /// Delete PMItemUnit + /// + /// + /// NoContent + [HttpDelete("items/units/{PMItemUnitId}")] + public async Task DeletePMItemUnit([FromRoute] long PMItemUnitId) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + PMBiz biz = PMBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.PMItemUnit) || biz.UserIsRestrictedType) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!await biz.UnitDeleteAsync(PMItemUnitId)) + return BadRequest(new ApiErrorResponse(biz.Errors)); + return NoContent(); + } + + #endregion PMItemUnit