This commit is contained in:
2021-05-26 17:36:52 +00:00
parent 449f76600e
commit 62fd360b7a
2 changed files with 195 additions and 67 deletions

View File

@@ -288,6 +288,37 @@
" "
></gz-currency> ></gz-currency>
</v-col> </v-col>
<v-col v-if="form().showMe(this, 'WorkOrderItemPartSerials')" cols="12">
<v-textarea
v-model="
value.items[activeWoItemIndex].parts[activeItemIndex].serials
"
:readonly="formState.readOnly"
:disabled="isDeleted"
:label="$ay.t('PurchaseOrderItemSerialNumbers')"
:error-messages="
form().serverErrors(
this,
`Items[${activeWoItemIndex}].parts[
${activeItemIndex}
].serials`
)
"
:ref="
`Items[${activeWoItemIndex}].parts[
${activeItemIndex}
].serials`
"
data-cy="partSerials"
@input="
fieldValueChanged(`Items[${activeWoItemIndex}].parts[
${activeItemIndex}
].serials`)
"
auto-grow
></v-textarea>
</v-col>
</template> </template>
</v-row> </v-row>
</div> </div>
@@ -296,51 +327,7 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* XXXeslint-disable */ /* 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 { export default {
created() { created() {
this.setDefaultView(); this.setDefaultView();
@@ -538,9 +525,9 @@ export default {
}); });
} }
if (this.form().showMe(this, "WorkOrderItemPartPartSerialID")) { if (this.form().showMe(this, "WorkOrderItemPartSerials")) {
headers.push({ headers.push({
text: this.$ay.t("WorkOrderItemPartPartSerialID"), text: this.$ay.t("PurchaseOrderItemSerialNumbers"),
align: "left", align: "left",
value: "serials" value: "serials"
}); });

View File

@@ -780,7 +780,8 @@ async function saveItems(vm) {
vm.obj.items[i].id = res.data.id; vm.obj.items[i].id = res.data.id;
vm.obj.items[i].workorderId = res.data.workorderId; vm.obj.items[i].workorderId = res.data.workorderId;
//walk all unsaved children and set the workorder id so they can save //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) z => (z.workorderItemId = vm.obj.items[i].id)
); );
@@ -792,6 +793,14 @@ async function saveItems(vm) {
z => (z.workorderItemId = vm.obj.items[i].id) 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( vm.obj.items[i].labors.forEach(
z => (z.workorderItemId = vm.obj.items[i].id) z => (z.workorderItemId = vm.obj.items[i].id)
); );
@@ -800,7 +809,16 @@ async function saveItems(vm) {
z => (z.workorderItemId = vm.obj.items[i].id) 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 { } else {
@@ -809,7 +827,7 @@ async function saveItems(vm) {
//------ //------
//save grandchildren //save grandchildren
if (!vm.saveResult.fatal) { if (!vm.saveResult.fatal) {
await saveExpenses(vm, i); await saveUnits(vm, i);
} }
if (!vm.saveResult.fatal) { if (!vm.saveResult.fatal) {
await saveScheduledUsers(vm, i); await saveScheduledUsers(vm, i);
@@ -817,14 +835,27 @@ async function saveItems(vm) {
if (!vm.saveResult.fatal) { if (!vm.saveResult.fatal) {
await saveTasks(vm, i); await saveTasks(vm, i);
} }
if (!vm.saveResult.fatal) {
await saveParts(vm, i);
}
if (!vm.saveResult.fatal) {
await savePartRequests(vm, i);
}
if (!vm.saveResult.fatal) { if (!vm.saveResult.fatal) {
await saveLabors(vm, i); await saveLabors(vm, i);
} }
if (!vm.saveResult.fatal) { if (!vm.saveResult.fatal) {
await saveTravels(vm, i); 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 // EXPENSES
// //
async function deleteExpenses(vm, woItemIndex) { async function deleteUnits(vm, woItemIndex) {
//walk the array backwards as items may be spliced out //walk the array backwards as items may be spliced out
for (var i = vm.obj.items[woItemIndex].expenses.length - 1; i >= 0; i--) { for (var i = vm.obj.items[woItemIndex].units.length - 1; i >= 0; i--) {
const d = vm.obj.items[woItemIndex].expenses[i]; const d = vm.obj.items[woItemIndex].units[i];
if (!d.deleted) { if (!d.deleted) {
continue; continue;
} }
let res = await window.$gz.api.remove( let res = await window.$gz.api.remove(`${API_BASE_URL}items/units/${d.id}`);
`${API_BASE_URL}items/expenses/${d.id}`
);
if (res.error) { if (res.error) {
handleSaveError(vm, { handleSaveError(vm, {
error: res.error, error: res.error,
itemUid: vm.obj.items[woItemIndex].uid, itemUid: vm.obj.items[woItemIndex].uid,
childKey: "expenses", childKey: "units",
childUid: d.uid childUid: d.uid
}); });
} else { } 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; return;
} }
async function saveExpenses(vm, woItemIndex) { async function saveUnits(vm, woItemIndex) {
//DELETE FLAGGED ITEMS FIRST //DELETE FLAGGED ITEMS FIRST
await deleteExpenses(vm, woItemIndex); await deleteUnits(vm, woItemIndex);
if (vm.saveResult.fatal) { if (vm.saveResult.fatal) {
return; return;
} }
for (let i = 0; i < vm.obj.items[woItemIndex].expenses.length; i++) { for (let i = 0; i < vm.obj.items[woItemIndex].units.length; i++) {
let o = vm.obj.items[woItemIndex].expenses[i]; let o = vm.obj.items[woItemIndex].units[i];
if (o.isDirty) { if (o.isDirty) {
const isPost = o.id == 0; 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) { if (res.error) {
handleSaveError(vm, { handleSaveError(vm, {
error: res.error, error: res.error,
itemUid: vm.obj.items[woItemIndex].uid, itemUid: vm.obj.items[woItemIndex].uid,
childKey: "expenses", childKey: "units",
childUid: o.uid childUid: o.uid
}); });
} else { } else {
//Server will update fields on put or post for most workorder graph objecs so need to update entire object here //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) { async function saveTasks(vm, woItemIndex) {
//DELETE FLAGGED ITEMS FIRST //DELETE FLAGGED ITEMS FIRST
@@ -1006,6 +1035,61 @@ async function deleteTasks(vm, woItemIndex) {
return; 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 // LABOR
// //
@@ -1121,6 +1205,63 @@ async function deleteTravels(vm, woItemIndex) {
return; 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 //todo: other grandchildren
//######################################### UTILITY METHODS ########################################### //######################################### UTILITY METHODS ###########################################