diff --git a/server/AyaNova/Controllers/QuoteController.cs b/server/AyaNova/Controllers/QuoteController.cs index 8aa59a1a..71e20ab9 100644 --- a/server/AyaNova/Controllers/QuoteController.cs +++ b/server/AyaNova/Controllers/QuoteController.cs @@ -266,7 +266,7 @@ namespace AyaNova.Api.Controllers - #endregion workorderstate + #endregion quotestate @@ -376,7 +376,7 @@ namespace AyaNova.Api.Controllers return NoContent(); } - #endregion workorderitem + #endregion quoteitem /* @@ -524,10 +524,10 @@ namespace AyaNova.Api.Controllers /// /// Get QuoteItemLabor object /// - /// + /// /// A single QuoteItemLabor - [HttpGet("items/labors/{workOrderItemLaborId}")] - public async Task GetQuoteItemLabor([FromRoute] long workOrderItemLaborId) + [HttpGet("items/labors/{QuoteItemLaborId}")] + public async Task GetQuoteItemLabor([FromRoute] long QuoteItemLaborId) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); @@ -536,7 +536,7 @@ namespace AyaNova.Api.Controllers return StatusCode(403, new ApiNotAuthorizedResponse()); if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - var o = await biz.LaborGetAsync(workOrderItemLaborId); + var o = await biz.LaborGetAsync(QuoteItemLaborId); if (o == null) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); return Ok(ApiOkResponse.Response(o)); @@ -574,10 +574,10 @@ namespace AyaNova.Api.Controllers /// /// Delete QuoteItemLabor /// - /// + /// /// NoContent - [HttpDelete("items/labors/{workOrderItemLaborId}")] - public async Task DeleteQuoteItemLabor([FromRoute] long workOrderItemLaborId) + [HttpDelete("items/labors/{QuoteItemLaborId}")] + public async Task DeleteQuoteItemLabor([FromRoute] long QuoteItemLaborId) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); @@ -586,7 +586,7 @@ namespace AyaNova.Api.Controllers QuoteBiz biz = QuoteBiz.GetBiz(ct, HttpContext); if (!Authorized.HasDeleteRole(HttpContext.Items, AyaType.QuoteItemLabor)) return StatusCode(403, new ApiNotAuthorizedResponse()); - if (!await biz.LaborDeleteAsync(workOrderItemLaborId)) + if (!await biz.LaborDeleteAsync(QuoteItemLaborId)) return BadRequest(new ApiErrorResponse(biz.Errors)); return NoContent(); } diff --git a/server/AyaNova/biz/QuoteBiz.cs b/server/AyaNova/biz/QuoteBiz.cs index b1bb6438..cf5ec31f 100644 --- a/server/AyaNova/biz/QuoteBiz.cs +++ b/server/AyaNova/biz/QuoteBiz.cs @@ -3696,7 +3696,6 @@ namespace AyaNova.Biz //newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.QuoteItemPart.AddAsync(newObject); await ct.SaveChangesAsync(); - await PartInventoryAdjustmentAsync(AyaEvent.Created, newObject, null, transaction); if (HasErrors) { await transaction.RollbackAsync(); @@ -3755,7 +3754,6 @@ namespace AyaNova.Biz try { await ct.SaveChangesAsync(); - await PartInventoryAdjustmentAsync(AyaEvent.Modified, putObject, dbObject, transaction); if (HasErrors) { await transaction.RollbackAsync(); @@ -3795,8 +3793,7 @@ namespace AyaNova.Biz return false; await PartBizActionsAsync(AyaEvent.Deleted, null, dbObject, transaction); ct.QuoteItemPart.Remove(dbObject); - await ct.SaveChangesAsync(); - await PartInventoryAdjustmentAsync(AyaEvent.Deleted, null, dbObject, transaction); + await ct.SaveChangesAsync(); if (HasErrors) { await transaction.RollbackAsync(); @@ -4009,152 +4006,7 @@ namespace AyaNova.Biz } } - //////////////////////////////////////////////////////////////////////////////////////////////// - //BIZ ACTIONS - // - // - private async Task PartInventoryAdjustmentAsync(AyaEvent ayaEvent, QuoteItemPart newObj, QuoteItemPart oldObj, IDbContextTransaction transaction) - { - - - if (AyaNova.Util.ServerGlobalBizSettings.Cache.UseInventory) - { - PartInventoryBiz pib = new PartInventoryBiz(ct, UserId, UserTranslationId, CurrentUserRoles); - - //DELETED, HANDLE INVENTORY / RETURN SERIALS - if (ayaEvent == AyaEvent.Deleted && oldObj.Quantity != 0) - { - dtInternalPartInventory pi = - new dtInternalPartInventory - { - PartId = oldObj.PartId, - PartWarehouseId = oldObj.PartWarehouseId, - Quantity = oldObj.Quantity, - SourceType = null,//null because the po no longer exists so this is technically a manual adjustment - SourceId = null,//'' - Description = await Translate("QuoteItemPart") + $" {oldObj.Serials} " + await Translate("EventDeleted") - }; - if (await pib.CreateAsync(pi) == null) - { - AddError(ApiErrorCode.API_SERVER_ERROR, "generalerror", $"Error updating inventory ({pi.Description}):{pib.GetErrorsAsString()}"); - return; - } - else - { //return serial numbers to part - if (!string.IsNullOrWhiteSpace(oldObj.Serials)) - await PartBiz.AppendSerialsAsync(oldObj.PartId, oldObj.Serials, ct, UserId); - } - } - - - //CREATED, HANDLE INVENTORY / CONSUME SERIALS - if (ayaEvent == AyaEvent.Created && newObj.Quantity != 0)//allow zero quantity parts on quote as placeholder, serials will not be consumed - { - dtInternalPartInventory pi = - new dtInternalPartInventory - { - PartId = newObj.PartId, - PartWarehouseId = newObj.PartWarehouseId, - Quantity = newObj.Quantity * -1, - SourceType = AyaType.QuoteItemPart, - SourceId = newObj.Id, - Description = await Translate("QuoteItemPart") + $" {newObj.Serials} " + await Translate("EventCreated") - }; - if (await pib.CreateAsync(pi) == null) - { - if (pib.HasErrors) - { - foreach (var e in pib.Errors) - { - if (e.Code == ApiErrorCode.INSUFFICIENT_INVENTORY) - AddError(e.Code, "Quantity", e.Message); - else - AddError(e.Code, e.Target, e.Message); - } - } - //AddError(ApiErrorCode.API_SERVER_ERROR, "generalerror", $"Error updating inventory ({pi.Description}):{pib.GetErrorsAsString()}"); - return; - } - else - { //Consume serial numbers from part - if (!string.IsNullOrWhiteSpace(newObj.Serials)) - await PartBiz.RemoveSerialsAsync(newObj.PartId, newObj.Serials, ct, UserId); - } - } - - - //UPDATED, HANDLE INVENTORY / UPDATE SERIALS AS REQUIRED - if (ayaEvent == AyaEvent.Modified) - { - //INVENTORY - if (newObj.PartId != oldObj.PartId || newObj.Quantity != oldObj.Quantity) - { - //OUT with the old - if (oldObj.Quantity != 0)//zero quantity doesn't affect inventory or serials - { - dtInternalPartInventory piOld = new dtInternalPartInventory - { - PartId = oldObj.PartId, - PartWarehouseId = oldObj.PartWarehouseId, - Quantity = oldObj.Quantity, - SourceType = null,//null because the po no longer exists so this is technically a manual adjustment - SourceId = null,//'' - Description = await Translate("QuoteItemPart") + $" {oldObj.Serials} " + await Translate("EventDeleted") - }; - if (await pib.CreateAsync(piOld) == null) - { - AddError(ApiErrorCode.API_SERVER_ERROR, "generalerror", $"Error updating inventory ({piOld.Description}):{pib.GetErrorsAsString()}"); - return; - } - else - { //return serial numbers to part - if (!string.IsNullOrWhiteSpace(oldObj.Serials)) - await PartBiz.AppendSerialsAsync(oldObj.PartId, oldObj.Serials, ct, UserId); - } - } - - - //IN with the new - if (newObj.Quantity != 0) - {//NOTE: zero quantity is considered to be a placeholder and no serials will be consumed, nor inventory affected - dtInternalPartInventory piNew = new dtInternalPartInventory - { - PartId = newObj.PartId, - PartWarehouseId = newObj.PartWarehouseId, - Quantity = newObj.Quantity * -1, - SourceType = AyaType.QuoteItemPart, - SourceId = newObj.Id, - Description = await Translate("QuoteItemPart") + $" {newObj.Serials} " + await Translate("EventCreated") - }; - - if (await pib.CreateAsync(piNew) == null) - { - AddError(ApiErrorCode.API_SERVER_ERROR, "generalerror", $"Error updating inventory ({piNew.Description}):{pib.GetErrorsAsString()}"); - return; - } - else - { //Consume serial numbers from part - if (!string.IsNullOrWhiteSpace(newObj.Serials)) - await PartBiz.RemoveSerialsAsync(newObj.PartId, newObj.Serials, ct, UserId); - } - } - } - //SERIALS - else if (newObj.Serials != oldObj.Serials) - { - //NOTE: zero quantity is considered to be a placeholder and no serials will be consumed (hence not returned either) - - //return serial numbers to part - if (oldObj.Quantity != 0 && !string.IsNullOrWhiteSpace(oldObj.Serials)) - await PartBiz.AppendSerialsAsync(oldObj.PartId, oldObj.Serials, ct, UserId); - - //Consume serial numbers from part - if (newObj.Quantity != 0 && !string.IsNullOrWhiteSpace(newObj.Serials)) - await PartBiz.RemoveSerialsAsync(newObj.PartId, newObj.Serials, ct, UserId); - } - } - } - } + //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index de3837cd..82a0cb25 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -3318,7 +3318,7 @@ namespace AyaNova.Util o.InternalReferenceNumber = "irf-" + Fake.Finance.Account(4); //o.ServiceDate = woDate; - int woItemCount = Fake.Random.Int(1, 4); + int woItemCount = Fake.Random.Int(1, 2); for (int y = 0; y < woItemCount; y++) { var woItem = new QuoteItem()