From 62fd360b7a29899c4c59c4778bbbed32bc7855fd Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Wed, 26 May 2021 17:36:52 +0000 Subject: [PATCH] --- .../src/components/work-order-item-parts.vue | 79 ++++---- ayanova/src/views/svc-workorder.vue | 183 ++++++++++++++++-- 2 files changed, 195 insertions(+), 67 deletions(-) diff --git a/ayanova/src/components/work-order-item-parts.vue b/ayanova/src/components/work-order-item-parts.vue index d33c22f8..68b43e81 100644 --- a/ayanova/src/components/work-order-item-parts.vue +++ b/ayanova/src/components/work-order-item-parts.vue @@ -288,6 +288,37 @@ " > + + + + @@ -296,51 +327,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// /* XXXeslint-disable */ //////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -l.Add(new FormField { TKey = "WorkOrderItemPartDescription", FieldKey = "WorkOrderItemPartDescription", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "WorkOrderItemPartPartSerialID", FieldKey = "WorkOrderItemPartPartSerialID", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "WorkOrderItemPartPartWarehouseID", FieldKey = "WorkOrderItemPartPartWarehouseID", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "WorkOrderItemPartQuantity", FieldKey = "WorkOrderItemPartQuantity", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "WorkOrderItemPartTaxPartSaleID", FieldKey = "WorkOrderItemPartTaxPartSaleID", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "PartUPC", FieldKey = "PartUPC", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "Cost", FieldKey = "PartCost", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "ListPrice", FieldKey = "PartListPrice", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "Price", FieldKey = "PartPriceViz", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "PriceOverride", FieldKey = "PartPriceOverride", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "UnitOfMeasure", FieldKey = "PartUnitOfMeasureViz", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "NetPrice", FieldKey = "PartNetViz", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "TaxAAmt", FieldKey = "PartTaxAViz", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "TaxBAmt", FieldKey = "PartTaxBViz", TKeySection = "WorkOrderItemParts" }); -l.Add(new FormField { TKey = "LineTotal", FieldKey = "PartLineTotalViz", TKeySection = "WorkOrderItemParts" }); -{ - "0": { - "id": 33, - "concurrency": 8112668, - "description": null, - "serials": null, - "partId": 16, - "partViz": null, - upcViz:"adjkfadjkfak" - "partWarehouseId": 1, - "partWarehouseViz": "Default", - "quantity": 1, - "taxPartSaleId": null, - "taxPartSaleViz": null, - "cost": 13.166710885319247, - "listPrice": 15.800053062383098, - "priceOverride": null, - "unitOfMeasureViz": "each", - "priceViz": 15.800053062383098, - "netViz": 15.800053062383098, - "taxAViz": 0, - "taxBViz": 0, - "lineTotalViz": 15.800053062383098, - "isDirty": false, - "workOrderItemId": 17 - } -} -*/ export default { created() { this.setDefaultView(); @@ -538,9 +525,9 @@ export default { }); } - if (this.form().showMe(this, "WorkOrderItemPartPartSerialID")) { + if (this.form().showMe(this, "WorkOrderItemPartSerials")) { headers.push({ - text: this.$ay.t("WorkOrderItemPartPartSerialID"), + text: this.$ay.t("PurchaseOrderItemSerialNumbers"), align: "left", value: "serials" }); diff --git a/ayanova/src/views/svc-workorder.vue b/ayanova/src/views/svc-workorder.vue index f1d9f859..32df0c53 100644 --- a/ayanova/src/views/svc-workorder.vue +++ b/ayanova/src/views/svc-workorder.vue @@ -780,7 +780,8 @@ async function saveItems(vm) { vm.obj.items[i].id = res.data.id; vm.obj.items[i].workorderId = res.data.workorderId; //walk all unsaved children and set the workorder id so they can save - vm.obj.items[i].expenses.forEach( + + vm.obj.items[i].units.forEach( z => (z.workorderItemId = vm.obj.items[i].id) ); @@ -792,6 +793,14 @@ async function saveItems(vm) { z => (z.workorderItemId = vm.obj.items[i].id) ); + vm.obj.items[i].parts.forEach( + z => (z.workorderItemId = vm.obj.items[i].id) + ); + + vm.obj.items[i].partRequests.forEach( + z => (z.workorderItemId = vm.obj.items[i].id) + ); + vm.obj.items[i].labors.forEach( z => (z.workorderItemId = vm.obj.items[i].id) ); @@ -800,7 +809,16 @@ async function saveItems(vm) { z => (z.workorderItemId = vm.obj.items[i].id) ); - //todo: other grandchildren + vm.obj.items[i].expenses.forEach( + z => (z.workorderItemId = vm.obj.items[i].id) + ); + + vm.obj.items[i].loans.forEach( + z => (z.workorderItemId = vm.obj.items[i].id) + ); + vm.obj.items[i].outsideServices.forEach( + z => (z.workorderItemId = vm.obj.items[i].id) + ); } } } else { @@ -809,7 +827,7 @@ async function saveItems(vm) { //------ //save grandchildren if (!vm.saveResult.fatal) { - await saveExpenses(vm, i); + await saveUnits(vm, i); } if (!vm.saveResult.fatal) { await saveScheduledUsers(vm, i); @@ -817,14 +835,27 @@ async function saveItems(vm) { if (!vm.saveResult.fatal) { await saveTasks(vm, i); } + if (!vm.saveResult.fatal) { + await saveParts(vm, i); + } + if (!vm.saveResult.fatal) { + await savePartRequests(vm, i); + } if (!vm.saveResult.fatal) { await saveLabors(vm, i); } if (!vm.saveResult.fatal) { await saveTravels(vm, i); } - //todo: other grandchildren - //------ + if (!vm.saveResult.fatal) { + await saveExpenses(vm, i); + } + if (!vm.saveResult.fatal) { + await saveLoans(vm, i); + } + if (!vm.saveResult.fatal) { + await saveOutsideServices(vm, i); + } } } //#################################################################################### @@ -833,25 +864,23 @@ async function saveItems(vm) { ///////////////////////////// // EXPENSES // -async function deleteExpenses(vm, woItemIndex) { +async function deleteUnits(vm, woItemIndex) { //walk the array backwards as items may be spliced out - for (var i = vm.obj.items[woItemIndex].expenses.length - 1; i >= 0; i--) { - const d = vm.obj.items[woItemIndex].expenses[i]; + for (var i = vm.obj.items[woItemIndex].units.length - 1; i >= 0; i--) { + const d = vm.obj.items[woItemIndex].units[i]; if (!d.deleted) { continue; } - let res = await window.$gz.api.remove( - `${API_BASE_URL}items/expenses/${d.id}` - ); + let res = await window.$gz.api.remove(`${API_BASE_URL}items/units/${d.id}`); if (res.error) { handleSaveError(vm, { error: res.error, itemUid: vm.obj.items[woItemIndex].uid, - childKey: "expenses", + childKey: "units", childUid: d.uid }); } else { - vm.obj.items[woItemIndex].expenses.splice(i, 1); + vm.obj.items[woItemIndex].units.splice(i, 1); } } @@ -859,28 +888,28 @@ async function deleteExpenses(vm, woItemIndex) { return; } -async function saveExpenses(vm, woItemIndex) { +async function saveUnits(vm, woItemIndex) { //DELETE FLAGGED ITEMS FIRST - await deleteExpenses(vm, woItemIndex); + await deleteUnits(vm, woItemIndex); if (vm.saveResult.fatal) { return; } - for (let i = 0; i < vm.obj.items[woItemIndex].expenses.length; i++) { - let o = vm.obj.items[woItemIndex].expenses[i]; + for (let i = 0; i < vm.obj.items[woItemIndex].units.length; i++) { + let o = vm.obj.items[woItemIndex].units[i]; if (o.isDirty) { const isPost = o.id == 0; - let res = await window.$gz.api.upsert(`${API_BASE_URL}items/expenses`, o); + let res = await window.$gz.api.upsert(`${API_BASE_URL}items/units`, o); if (res.error) { handleSaveError(vm, { error: res.error, itemUid: vm.obj.items[woItemIndex].uid, - childKey: "expenses", + childKey: "units", childUid: o.uid }); } else { //Server will update fields on put or post for most workorder graph objecs so need to update entire object here - vm.obj.items[woItemIndex].expenses.splice(i, 1, res.data); //vue needs the splice rather than just setting the value in order to trigger reactivity or else the UI won't update + vm.obj.items[woItemIndex].units.splice(i, 1, res.data); //vue needs the splice rather than just setting the value in order to trigger reactivity or else the UI won't update } } } @@ -952,7 +981,7 @@ async function deleteScheduledUsers(vm, woItemIndex) { } ///////////////////////////// -// SCHEDULED USERS +// TASKS // async function saveTasks(vm, woItemIndex) { //DELETE FLAGGED ITEMS FIRST @@ -1006,6 +1035,61 @@ async function deleteTasks(vm, woItemIndex) { return; } +///////////////////////////// +// PARTS +// +async function deleteParts(vm, woItemIndex) { + //walk the array backwards as items may be spliced out + for (var i = vm.obj.items[woItemIndex].parts.length - 1; i >= 0; i--) { + const d = vm.obj.items[woItemIndex].parts[i]; + if (!d.deleted) { + continue; + } + let res = await window.$gz.api.remove(`${API_BASE_URL}items/parts/${d.id}`); + if (res.error) { + handleSaveError(vm, { + error: res.error, + itemUid: vm.obj.items[woItemIndex].uid, + childKey: "parts", + childUid: d.uid + }); + } else { + vm.obj.items[woItemIndex].parts.splice(i, 1); + } + } + + //---- + return; +} + +async function saveParts(vm, woItemIndex) { + //DELETE FLAGGED ITEMS FIRST + await deleteParts(vm, woItemIndex); + if (vm.saveResult.fatal) { + return; + } + + for (let i = 0; i < vm.obj.items[woItemIndex].parts.length; i++) { + let o = vm.obj.items[woItemIndex].parts[i]; + if (o.isDirty) { + const isPost = o.id == 0; + let res = await window.$gz.api.upsert(`${API_BASE_URL}items/parts`, o); + if (res.error) { + handleSaveError(vm, { + error: res.error, + itemUid: vm.obj.items[woItemIndex].uid, + childKey: "parts", + childUid: o.uid + }); + } else { + //Server will update fields on put or post for most workorder graph objecs so need to update entire object here + vm.obj.items[woItemIndex].parts.splice(i, 1, res.data); //vue needs the splice rather than just setting the value in order to trigger reactivity or else the UI won't update + } + } + } + return; //made it +} + ///////////////////////////// // LABOR // @@ -1121,6 +1205,63 @@ async function deleteTravels(vm, woItemIndex) { return; } +///////////////////////////// +// EXPENSES +// +async function deleteExpenses(vm, woItemIndex) { + //walk the array backwards as items may be spliced out + for (var i = vm.obj.items[woItemIndex].expenses.length - 1; i >= 0; i--) { + const d = vm.obj.items[woItemIndex].expenses[i]; + if (!d.deleted) { + continue; + } + let res = await window.$gz.api.remove( + `${API_BASE_URL}items/expenses/${d.id}` + ); + if (res.error) { + handleSaveError(vm, { + error: res.error, + itemUid: vm.obj.items[woItemIndex].uid, + childKey: "expenses", + childUid: d.uid + }); + } else { + vm.obj.items[woItemIndex].expenses.splice(i, 1); + } + } + + //---- + return; +} + +async function saveExpenses(vm, woItemIndex) { + //DELETE FLAGGED ITEMS FIRST + await deleteExpenses(vm, woItemIndex); + if (vm.saveResult.fatal) { + return; + } + + for (let i = 0; i < vm.obj.items[woItemIndex].expenses.length; i++) { + let o = vm.obj.items[woItemIndex].expenses[i]; + if (o.isDirty) { + const isPost = o.id == 0; + let res = await window.$gz.api.upsert(`${API_BASE_URL}items/expenses`, o); + if (res.error) { + handleSaveError(vm, { + error: res.error, + itemUid: vm.obj.items[woItemIndex].uid, + childKey: "expenses", + childUid: o.uid + }); + } else { + //Server will update fields on put or post for most workorder graph objecs so need to update entire object here + vm.obj.items[woItemIndex].expenses.splice(i, 1, res.data); //vue needs the splice rather than just setting the value in order to trigger reactivity or else the UI won't update + } + } + } + return; //made it +} + //todo: other grandchildren //######################################### UTILITY METHODS ###########################################