diff --git a/ayanova/devdocs/todo.txt b/ayanova/devdocs/todo.txt index 1da80204..c41fd029 100644 --- a/ayanova/devdocs/todo.txt +++ b/ayanova/devdocs/todo.txt @@ -1264,6 +1264,41 @@ MID CENTURY MODERN TUNES - https://www.allmusic.com/album/ultra-lounge-vol-14-bo BUILD CHANGES OF NOTE +build 110 + +- test data seeder various changes + generate fewer items for speed + changes to allow testing inventory properly and part requests etc + +- workorder cleanup and layout changes + now showing table for each item even if single row so that all viz and other calculated fields are always available to view + data transfer efficiency changes to cut down on amount of data sent both ways over the network + strip out Viz fields on submit to server from client + strip out IsDirty fields on send from server to client + +- Service loaner form added cost fields to bring in line with other billable items on workorder + +- Workorder inventory implemented + including part requests trigger and system in workorder and backend + +- workorder based notifications implemented + WorkorderCompletedStatusOverdue + CustomerServiceImminent (customer user feature) + WorkorderStatusChange + WorkorderStatusAge + OutsideServiceOverdue + OutsideServiceReceived + ScheduledOnWorkorder + ScheduledOnWorkorderImminent + WorkorderCompletedStatusOverdue + +- Removed all visible references to Service Bank feature from all forms and front and back end + +- Docs + added section on changes from v7 help doc for work orders + + + build 105 - direct report url now works again properly. Used by notification to send links to reports and possible future other links to provide an url that opens in the AyaNova client directly to viewing a report, so that the url [clienturl]/viewreport?oid=1&rid=1 for example will open report id 1 with object id 1 - Can now hide columns that are filtered or sorted without error in data tables; Data Table column selector button will change to larger and accented when this is the case and the column selector form will highlight these hidden columns that affect the view with raised elevation, accent color and filter/sort icon (both show, there is no distinction which type of way it's affecting) diff --git a/ayanova/src/api/open-object-handler.js b/ayanova/src/api/open-object-handler.js index 1e51bae8..54febf94 100644 --- a/ayanova/src/api/open-object-handler.js +++ b/ayanova/src/api/open-object-handler.js @@ -19,311 +19,387 @@ export default { } if (tid.type && tid.id != null) { + let isCustomerTypeUser = + window.$gz.store.state.userType == 3 || + window.$gz.store.state.userType == 4; //if these come from route parameters they may well be strings tid.type = Number.parseInt(tid.type, 10); tid.id = Number.parseInt(tid.id, 10); - switch (tid.type) { - case ayatype.WorkOrder: - vm.$router.push({ - name: "workorder-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.Memo: - vm.$router.push({ - name: "memo-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.Customer: - vm.$router.push({ - name: "customer-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.CustomerNote: - vm.$router.push({ - name: "customer-note-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.HeadOffice: - vm.$router.push({ - name: "head-office-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.Vendor: - vm.$router.push({ - name: "vendor-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.Widget: - vm.$router.push({ - name: "widget-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.User: - //Is it an "Inside" user (staff or subcontractor) - //or an "outside" user (customer or headoffice) - //if key doesn't provide this then need to directly find out first before determining which form to redirect to - if (tid.id != 0) { - //lookup which one to open from server + if (isCustomerTypeUser) { + switch (tid.type) { + case ayatype.WorkOrder: + vm.$router.push({ + name: "customer-workorder-edit", + params: { recordid: tid.id } + }); + break; + + case ayatype.NotifySubscription: + vm.$router.push({ + name: "home-notify-subscription", + params: { recordid: tid.id } + }); + break; + case ayatype.CustomerServiceRequest: + vm.$router.push({ + name: "customer-csr-edit", + params: { recordid: tid.id } + }); + break; + default: + window.$gz.eventBus.$emit( + "notify-warning", + `Customer user: open-object-handler unable to open link - [type:${tid.type}, id:${tid.id}]` + ); + } + } else { + switch (tid.type) { + case ayatype.WorkOrderItem: + case ayatype.WorkOrderItemExpense: + case ayatype.WorkOrderItemLabor: + case ayatype.WorkOrderItemLoan: + case ayatype.WorkOrderItemOutsideService: + case ayatype.WorkOrderItemPart: + case ayatype.WorkOrderItemPartRequest: + case ayatype.WorkOrderItemScheduledUser: + case ayatype.WorkOrderItemTask: + case ayatype.WorkOrderItemTravel: + case ayatype.WorkOrderItemUnit: (async () => { try { - //shortcut for superuser, always id 1 - if (tid.inside == undefined && tid.id == 1) { - tid.inside = true; - } - if (tid.inside == undefined) { - let res = await window.$gz.api.get( - "user/inside-type/" + tid.id + let res = await window.$gz.api.get( + `search/ancestor/${tid.type}/${tid.id}` + ); + + if (res.error) { + throw new Error( + window.$gz.errorHandler.errorToString(res, vm) ); - if (res.error) { - //throw new Error(res.error); - throw new Error( - window.$gz.errorHandler.errorToString(res, vm) - ); - } - if (res.data) { - tid.inside = res.data; - } } - if (tid.inside == true) { - vm.$router.push({ - name: "adm-user", - params: { recordid: tid.id } - }); - } else { - vm.$router.push({ - name: "cust-user", - params: { recordid: tid.id } + if (res.data.id && res.data.id != 0) { + this.handleOpenObjectClick(vm, { + type: ayatype.WorkOrder, + id: res.data.id, + gotype: tid.type, + goid: tid.id }); + return; } } catch (e) { - throw new Error(window.$gz.errorHandler.errorToString(e, vm)); //throw new Error(e); + throw new Error(window.$gz.errorHandler.errorToString(e, vm)); } })(); - } - break; - case ayatype.NotifySubscription: - vm.$router.push({ - name: "home-notify-subscription", - params: { recordid: tid.id } - }); - break; - case ayatype.FileAttachment: - //lookup the actual type - //then call this method again to do the actual open - (async () => { - try { - let res = await window.$gz.api.get("attachment/parent/" + tid.id); - - if (res.error) { - throw new Error(window.$gz.errorHandler.errorToString(res, vm)); - // throw new Error(res.error); - } - if (res.data.id && res.data.id != 0) { - this.handleOpenObjectClick(vm, res.data); - return; - } - } catch (e) { - //throw new Error(e); - throw new Error(window.$gz.errorHandler.errorToString(e, vm)); + break; + case ayatype.WorkOrder: + vm.$router.push({ + name: "workorder-edit", + params: { recordid: tid.id, gotype: tid.gotype, goid: tid.goid } + }); + break; + case ayatype.Memo: + vm.$router.push({ + name: "memo-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.Customer: + vm.$router.push({ + name: "customer-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.CustomerNote: + vm.$router.push({ + name: "customer-note-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.HeadOffice: + vm.$router.push({ + name: "head-office-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.Vendor: + vm.$router.push({ + name: "vendor-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.Widget: + vm.$router.push({ + name: "widget-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.User: + //Is it an "Inside" user (staff or subcontractor) + //or an "outside" user (customer or headoffice) + //if key doesn't provide this then need to directly find out first before determining which form to redirect to + if (tid.id != 0) { + //lookup which one to open from server + (async () => { + try { + //shortcut for superuser, always id 1 + if (tid.inside == undefined && tid.id == 1) { + tid.inside = true; + } + if (tid.inside == undefined) { + let res = await window.$gz.api.get( + "user/inside-type/" + tid.id + ); + if (res.error) { + //throw new Error(res.error); + throw new Error( + window.$gz.errorHandler.errorToString(res, vm) + ); + } + if (res.data) { + tid.inside = res.data; + } + } + if (tid.inside == true) { + vm.$router.push({ + name: "adm-user", + params: { recordid: tid.id } + }); + } else { + vm.$router.push({ + name: "cust-user", + params: { recordid: tid.id } + }); + } + } catch (e) { + throw new Error(window.$gz.errorHandler.errorToString(e, vm)); + //throw new Error(e); + } + })(); } - })(); + break; + case ayatype.NotifySubscription: + vm.$router.push({ + name: "home-notify-subscription", + params: { recordid: tid.id } + }); + break; + case ayatype.FileAttachment: + //lookup the actual type + //then call this method again to do the actual open - //error here? or do nothing, doing nothing for now, should only apply if it's an orphan record and that is kind of obvious - //or error "Can't open nothing" - break; - //TODO: Items that are able to be opened from the adm-history form - //need to decide to support them and if not then need to modify the message below - //to be localized and simply say "Can't open this object type" or something along those lines - //TODO: FORMCUSTOMIZATION - //TODO: LIST VIEW - case ayatype.Translation: - vm.$router.push({ - name: "adm-translation", - params: { recordid: tid.id } - }); - break; - case ayatype.Report: - vm.$router.push({ - name: "ay-report-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.Backup: - vm.$router.push({ - name: "ops-backup" - }); - break; + (async () => { + try { + let res = await window.$gz.api.get( + "attachment/parent/" + tid.id + ); - case ayatype.FormCustom: - //all we have is the id, but need the formkey to open it - (async () => { - try { - let res = await window.$gz.api.get( - "form-custom/form-key/" + tid.id - ); - - if (res.error) { - //throw new Error(res.error); - throw new Error(window.$gz.errorHandler.errorToString(res, vm)); + if (res.error) { + throw new Error( + window.$gz.errorHandler.errorToString(res, vm) + ); + // throw new Error(res.error); + } + if (res.data.id && res.data.id != 0) { + this.handleOpenObjectClick(vm, res.data); + return; + } + } catch (e) { + //throw new Error(e); + throw new Error(window.$gz.errorHandler.errorToString(e, vm)); } - if (res && res.data) { - vm.$router.push({ - name: "ay-customize", - params: { formCustomTemplateKey: res.data } - }); - return; + })(); + + //error here? or do nothing, doing nothing for now, should only apply if it's an orphan record and that is kind of obvious + //or error "Can't open nothing" + break; + //TODO: Items that are able to be opened from the adm-history form + //need to decide to support them and if not then need to modify the message below + //to be localized and simply say "Can't open this object type" or something along those lines + //TODO: FORMCUSTOMIZATION + //TODO: LIST VIEW + case ayatype.Translation: + vm.$router.push({ + name: "adm-translation", + params: { recordid: tid.id } + }); + break; + case ayatype.Report: + vm.$router.push({ + name: "ay-report-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.Backup: + vm.$router.push({ + name: "ops-backup" + }); + break; + + case ayatype.FormCustom: + //all we have is the id, but need the formkey to open it + (async () => { + try { + let res = await window.$gz.api.get( + "form-custom/form-key/" + tid.id + ); + + if (res.error) { + //throw new Error(res.error); + throw new Error( + window.$gz.errorHandler.errorToString(res, vm) + ); + } + if (res && res.data) { + vm.$router.push({ + name: "ay-customize", + params: { formCustomTemplateKey: res.data } + }); + return; + } + } catch (e) { + //throw new Error(e); + throw new Error(window.$gz.errorHandler.errorToString(e, vm)); } - } catch (e) { - //throw new Error(e); - throw new Error(window.$gz.errorHandler.errorToString(e, vm)); - } - })(); - break; - case ayatype.Project: - vm.$router.push({ - name: "project-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.Reminder: - vm.$router.push({ - name: "reminder-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.Review: - vm.$router.push({ - name: "review-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.ServiceRate: - vm.$router.push({ - name: "service-rate-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.TravelRate: - vm.$router.push({ - name: "travel-rate-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.TaxCode: - vm.$router.push({ - name: "tax-code-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.UnitModel: - vm.$router.push({ - name: "unit-model-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.Unit: - vm.$router.push({ - name: "unit-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.LoanUnit: - vm.$router.push({ - name: "loan-unit-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.CustomerServiceRequest: - vm.$router.push({ - name: "csr-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.Part: - vm.$router.push({ - name: "inv-part", - params: { recordid: tid.id } - }); - break; - case ayatype.PartInventory: - //this one's a little different, there is no way to edit a partinventory transaction - //so it opens to the history of the one clicked so user can see who was responsible - vm.$router.push({ - name: "ay-history", - params: { ayatype: ayatype.PartInventory, recordid: tid.id } - }); - break; - case ayatype.PartWarehouse: - vm.$router.push({ - name: "inv-part-warehouse", - params: { recordid: tid.id } - }); - break; - case ayatype.PartAssembly: - vm.$router.push({ - name: "part-assembly-edit", - params: { recordid: tid.id } - }); - break; - // case ayatype.ServiceBank: - // vm.$router.push({ - // name: "service-bank-edit", - // params: { recordid: tid.id } - // }); - // break; - case ayatype.PurchaseOrder: - vm.$router.push({ - name: "inv-purchase-order", - params: { recordid: tid.id } - }); - break; - case ayatype.Contract: - vm.$router.push({ - name: "contract-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.WorkOrderStatus: - vm.$router.push({ - name: "svc-work-order-status-edit", - params: { recordid: tid.id } - }); - break; + })(); + break; + case ayatype.Project: + vm.$router.push({ + name: "project-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.Reminder: + vm.$router.push({ + name: "reminder-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.Review: + vm.$router.push({ + name: "review-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.ServiceRate: + vm.$router.push({ + name: "service-rate-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.TravelRate: + vm.$router.push({ + name: "travel-rate-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.TaxCode: + vm.$router.push({ + name: "tax-code-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.UnitModel: + vm.$router.push({ + name: "unit-model-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.Unit: + vm.$router.push({ + name: "unit-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.LoanUnit: + vm.$router.push({ + name: "loan-unit-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.CustomerServiceRequest: + vm.$router.push({ + name: "csr-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.Part: + vm.$router.push({ + name: "inv-part", + params: { recordid: tid.id } + }); + break; + case ayatype.PartInventory: + //this one's a little different, there is no way to edit a partinventory transaction + //so it opens to the history of the one clicked so user can see who was responsible + vm.$router.push({ + name: "ay-history", + params: { ayatype: ayatype.PartInventory, recordid: tid.id } + }); + break; + case ayatype.PartWarehouse: + vm.$router.push({ + name: "inv-part-warehouse", + params: { recordid: tid.id } + }); + break; + case ayatype.PartAssembly: + vm.$router.push({ + name: "part-assembly-edit", + params: { recordid: tid.id } + }); + break; + // case ayatype.ServiceBank: + // vm.$router.push({ + // name: "service-bank-edit", + // params: { recordid: tid.id } + // }); + // break; + case ayatype.PurchaseOrder: + vm.$router.push({ + name: "inv-purchase-order", + params: { recordid: tid.id } + }); + break; + case ayatype.Contract: + vm.$router.push({ + name: "contract-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.WorkOrderStatus: + vm.$router.push({ + name: "svc-work-order-status-edit", + params: { recordid: tid.id } + }); + break; - case ayatype.WorkOrderItemStatus: - vm.$router.push({ - name: "svc-work-order-item-status-edit", - params: { recordid: tid.id } - }); - break; + case ayatype.WorkOrderItemStatus: + vm.$router.push({ + name: "svc-work-order-item-status-edit", + params: { recordid: tid.id } + }); + break; - case ayatype.WorkOrderItemPriority: - vm.$router.push({ - name: "svc-work-order-item-priorities-edit", - params: { recordid: tid.id } - }); - break; - case ayatype.TaskGroup: - vm.$router.push({ - name: "svc-task-group", - params: { recordid: tid.id } - }); - break; + case ayatype.WorkOrderItemPriority: + vm.$router.push({ + name: "svc-work-order-item-priorities-edit", + params: { recordid: tid.id } + }); + break; + case ayatype.TaskGroup: + vm.$router.push({ + name: "svc-task-group", + params: { recordid: tid.id } + }); + break; - default: - window.$gz.eventBus.$emit( - "notify-warning", - `open-object-handler: unknown [type:${tid.type}, id:${tid.id}]` - ); + default: + window.$gz.eventBus.$emit( + "notify-warning", + `open-object-handler: unknown [type:${tid.type}, id:${tid.id}]` + ); + } } } },