diff --git a/server/AyaNova/Controllers/ReminderController.cs b/server/AyaNova/Controllers/ReminderController.cs index 3c30bae2..7b6faa5c 100644 --- a/server/AyaNova/Controllers/ReminderController.cs +++ b/server/AyaNova/Controllers/ReminderController.cs @@ -59,29 +59,6 @@ namespace AyaNova.Api.Controllers return CreatedAtAction(nameof(ReminderController.GetReminder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); } - // /// - // /// Duplicate Reminder - // /// (Wiki and Attachments are not duplicated) - // /// - // /// Source object id - // /// From route path - // /// Reminder - // [HttpPost("duplicate/{id}")] - // public async Task DuplicateReminder([FromRoute] long id, ApiVersion apiVersion) - // { - // if (!serverState.IsOpen) - // return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - // ReminderBiz biz = ReminderBiz.GetBiz(ct, HttpContext); - // if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) - // return StatusCode(403, new ApiNotAuthorizedResponse()); - // if (!ModelState.IsValid) - // return BadRequest(new ApiErrorResponse(ModelState)); - // Reminder o = await biz.DuplicateAsync(id); - // if (o == null) - // return BadRequest(new ApiErrorResponse(biz.Errors)); - // else - // return CreatedAtAction(nameof(ReminderController.GetReminder), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); - // } /// /// Get Reminder @@ -99,7 +76,8 @@ namespace AyaNova.Api.Controllers if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); var o = await biz.GetAsync(id); - if (o == null) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); return Ok(ApiOkResponse.Response(o)); } @@ -118,7 +96,7 @@ namespace AyaNova.Api.Controllers ReminderBiz biz = ReminderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType)) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.PutAsync(updatedObject); + var o = await biz.PutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -151,7 +129,33 @@ namespace AyaNova.Api.Controllers - + /// + /// Get Reminder schedule "more" info + /// + /// + /// Information to display in schedule when selected for more info + [HttpGet("sched-info/{id}")] + public async Task GetScheduledUserScheduleInfoView([FromRoute] long id) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + ReminderBiz biz = ReminderBiz.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 BadRequest(new ApiErrorResponse(biz.Errors)); + return Ok(ApiOkResponse.Response(new + { + o.Color, + o.Name, + o.Notes, + o.StartDate, + o.StopDate + })); + } //------------ diff --git a/server/AyaNova/Controllers/WorkOrderController.cs b/server/AyaNova/Controllers/WorkOrderController.cs index 776dc79e..c579ed1f 100644 --- a/server/AyaNova/Controllers/WorkOrderController.cs +++ b/server/AyaNova/Controllers/WorkOrderController.cs @@ -38,7 +38,7 @@ namespace AyaNova.Api.Controllers serverState = apiServerState; } - + /* ██╗ ██╗ ██████╗ ██████╗ ██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗██████╗ @@ -120,7 +120,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.WorkOrderPutAsync(updatedObject); + var o = await biz.WorkOrderPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -320,7 +320,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItem) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.ItemPutAsync(updatedObject); + var o = await biz.ItemPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -427,7 +427,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemExpense) || biz.UserIsSubContractorFull || biz.UserIsSubContractorRestricted) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.ExpensePutAsync(updatedObject); + var o = await biz.ExpensePutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -535,7 +535,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemLabor)) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.LaborPutAsync(updatedObject); + var o = await biz.LaborPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -643,7 +643,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemLoan) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.LoanPutAsync(updatedObject); + var o = await biz.LoanPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -752,7 +752,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemOutsideService) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.OutsideServicePutAsync(updatedObject); + var o = await biz.OutsideServicePutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -859,7 +859,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemPart) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.PartPutAsync(updatedObject); + var o = await biz.PartPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -965,7 +965,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemPartRequest) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.PartRequestPutAsync(updatedObject); + var o = await biz.PartRequestPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -1071,7 +1071,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemScheduledUser) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.ScheduledUserPutAsync(updatedObject); + var o = await biz.ScheduledUserPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -1104,7 +1104,7 @@ namespace AyaNova.Api.Controllers - /// + /// /// Get WorkOrderItemScheduledUser schedule info /// /// @@ -1200,7 +1200,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemTask)) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.TaskPutAsync(updatedObject); + var o = await biz.TaskPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -1306,7 +1306,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemTravel)) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.TravelPutAsync(updatedObject); + var o = await biz.TravelPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -1412,7 +1412,7 @@ namespace AyaNova.Api.Controllers WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.WorkOrderItemUnit) || biz.UserIsRestrictedType) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.UnitPutAsync(updatedObject); + var o = await biz.UnitPutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) diff --git a/server/AyaNova/biz/ReminderBiz.cs b/server/AyaNova/biz/ReminderBiz.cs index d85e5248..d09bcae6 100644 --- a/server/AyaNova/biz/ReminderBiz.cs +++ b/server/AyaNova/biz/ReminderBiz.cs @@ -67,6 +67,11 @@ namespace AyaNova.Biz internal async Task GetAsync(long id, bool logTheGetEvent = true) { var ret = await ct.Reminder.AsNoTracking().SingleOrDefaultAsync(m => m.Id == id); + if (ret.UserId != UserId) + { + AddError(ApiErrorCode.NOT_AUTHORIZED, "generalerror", "A User may only retrieve their own reminders"); + return null; + } if (logTheGetEvent && ret != null) await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); return ret; @@ -113,7 +118,7 @@ namespace AyaNova.Biz return putObject; } - //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// //UPDATE schedule only // internal async Task PutNewScheduleTimeAsync(ScheduleItemAdjustParams p) @@ -143,7 +148,7 @@ namespace AyaNova.Biz return false; } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, dbObject.AyaType, AyaEvent.Modified), ct); - + await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, dbObject); return true; } @@ -425,7 +430,7 @@ namespace AyaNova.Biz public async Task HandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index 5926736f..036e2820 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -4933,216 +4933,9 @@ namespace AyaNova.Biz // internal async Task ScheduledUserGetScheduleInfoViewAsync(long id, bool logTheGetEvent = true) { - /* - MORE INFO DISPLAY - Summary info to display for woitem when open dialog (MUST check at server if restricted tech and not send / show some if not all of this) - No controls to change the time / date for now - - wosummary - wostatus - woitemsummary - woitemstatus - woitempriority - tech - estimated qty - rate - tags - - */ var w = await WorkOrderGetPartialAsync(AyaType.WorkOrderItemScheduledUser, id, false, true); - if (UserIsRestrictedType && w.Items[0].ScheduledUsers[0].UserId != UserId)//restricted users can only see their own return null; - - /* - { - "data": { - "id": 6, - "concurrency": 14171235, - "serial": 6, - "notes": "Esse aut totam adipisci minima optio rerum sed qui.", - "wiki": null, - "customFields": null, - "tags": [ - "black", - "jade", - "zebra", - "zone0", - "zone6" - ], - "customerId": 11, - "customerViz": "Parker, Ryan and Denesik", - "customerTechNotesViz": null, - "projectId": null, - "projectViz": null, - "internalReferenceNumber": "irf-5922", - "customerReferenceNumber": "crf-8231", - "customerContactName": null, - "fromQuoteId": null, - "fromPMId": null, - "createdDate": "2021-09-16T13:58:46.481767Z", - "serviceDate": "2021-11-11T23:00:00Z", - "completeByDate": "2021-11-16T23:00:00Z", - "durationToCompleted": "00:00:00", - "invoiceNumber": null, - "customerSignature": null, - "customerSignatureName": null, - "customerSignatureCaptured": null, - "techSignature": null, - "techSignatureName": null, - "techSignatureCaptured": null, - "onsite": false, - "contractId": null, - "contractViz": "-", - "lastStatusId": 1, - "postAddress": "014 Roberts Garden", - "postCity": "Chesterborough", - "postRegion": "California", - "postCountry": "Nauru", - "postCode": "66467", - "address": "0844 Zieme Prairie", - "city": "Chesterborough", - "region": "California", - "country": "Nauru", - "latitude": -2.527, - "longitude": 132.4754, - "items": [ - { - "id": 14, - "concurrency": 14171235, - "notes": "itemnotes - 2 ", - "wiki": null, - "customFields": null, - "tags": [], - "workOrderId": 6, - "techNotes": "technotes - 2", - "workOrderItemStatusId": 1, - "workOrderItemStatusNameViz": "Item is completed", - "workOrderItemStatusColorViz": "#c00000", - "workOrderItemPriorityId": 1, - "workOrderItemPriorityNameViz": "Immediately", - "workOrderItemPriorityColorViz": "#c00000", - "requestDate": "2021-11-11T23:02:00Z", - "warrantyService": false, - "sequence": 3, - "fromCSRId": null, - "fromCSRViz": null, - "expenses": [], - "labors": [], - "loans": [], - "parts": [], - "partRequests": [], - "scheduledUsers": [ - { - "id": 33, - "concurrency": 14171866, - "userId": 10, - "userViz": "Eliza Hartmann - Tech", - "estimatedQuantity": 1, - "startDate": "2021-11-09T21:00:00Z", - "stopDate": "2021-11-09T22:00:00Z", - "serviceRateId": null, - "serviceRateViz": null, - "workOrderItemId": 14 - } - ], - "tasks": [], - "travels": [], - "units": [], - "outsideServices": [] - } - ], - "states": [ - { - "id": 26, - "concurrency": 14171235, - "workOrderId": 6, - "workOrderStatusId": 2, - "created": "2021-11-11T23:05:00Z", - "userId": 25, - "userViz": "Carroll Miller", - "nameViz": "Needs to be assigned", - "colorViz": "#80ffff", - "completedViz": false, - "lockedViz": false - }, - { - "id": 27, - "concurrency": 14171235, - "workOrderId": 6, - "workOrderStatusId": 3, - "created": "2021-11-12T00:00:00Z", - "userId": 10, - "userViz": "Eliza Hartmann - Tech", - "nameViz": "Scheduled", - "colorViz": "#00ff00", - "completedViz": false, - "lockedViz": false - }, - { - "id": 28, - "concurrency": 14171235, - "workOrderId": 6, - "workOrderStatusId": 1, - "created": "2021-11-12T00:05:00Z", - "userId": 10, - "userViz": "Eliza Hartmann - Tech", - "nameViz": "Manager approval required", - "colorViz": "#c00000", - "completedViz": false, - "lockedViz": true - }, - { - "id": 29, - "concurrency": 14171235, - "workOrderId": 6, - "workOrderStatusId": 3, - "created": "2021-11-12T01:00:00Z", - "userId": 10, - "userViz": "Eliza Hartmann - Tech", - "nameViz": "Scheduled", - "colorViz": "#00ff00", - "completedViz": false, - "lockedViz": false - }, - { - "id": 30, - "concurrency": 14171235, - "workOrderId": 6, - "workOrderStatusId": 1, - "created": "2021-11-12T01:00:00Z", - "userId": 10, - "userViz": "Eliza Hartmann - Tech", - "nameViz": "Manager approval required", - "colorViz": "#c00000", - "completedViz": false, - "lockedViz": true - } - ], - "isLockedAtServer": false, - "alertViz": null, - "fromQuoteViz": null, - "fromPMViz": null, - "isCompleteRecord": true, - "userIsRestrictedType": false, - "userIsTechRestricted": false, - "userIsSubContractorFull": false, - "userIsSubContractorRestricted": false, - "userCanViewPartCosts": false, - "userCanViewLaborOrTravelRateCosts": false, - "userCanViewLoanerCosts": false - } -} - wosummary - wostatus - woitemsummary - woitemstatus - woitempriority - tech - estimated qty - rate - tags - */ string WoStatusName = string.Empty; string WoStatusColor = string.Empty; bool WoStatusCompleted = false; @@ -5157,7 +4950,6 @@ namespace AyaNova.Biz WoStatusCompleted = st.CompletedViz; WoStatusLocked = st.LockedViz; } - return new { serial = w.Serial, @@ -5182,8 +4974,6 @@ namespace AyaNova.Biz wotags = w.Tags, woitemtags = w.Items[0].Tags }; - - } ////////////////////////////////////////////////////////////////////////////////////////////////