Compare commits
1 Commits
bugfix/IO-
...
bugfix/IO-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1566084d9c |
@@ -90,7 +90,6 @@ export function BillEnterModalLinesComponent({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Only fill actual_cost when the user forward-tabs out of Retail (actual_price)
|
|
||||||
const autofillActualCost = (index) => {
|
const autofillActualCost = (index) => {
|
||||||
Promise.resolve().then(() => {
|
Promise.resolve().then(() => {
|
||||||
const retailRaw = form.getFieldValue(["billlines", index, "actual_price"]);
|
const retailRaw = form.getFieldValue(["billlines", index, "actual_price"]);
|
||||||
@@ -165,9 +164,10 @@ export function BillEnterModalLinesComponent({
|
|||||||
}}
|
}}
|
||||||
allowRemoved={form.getFieldValue("is_credit_memo") || false}
|
allowRemoved={form.getFieldValue("is_credit_memo") || false}
|
||||||
onSelect={(value, opt) => {
|
onSelect={(value, opt) => {
|
||||||
// IMPORTANT:
|
const d = normalizeDiscount(discount);
|
||||||
// Do NOT autofill actual_cost here. It should only fill when the user forward-tabs
|
const retail = Number(opt.cost);
|
||||||
// from Retail (actual_price) -> Actual Cost (actual_cost).
|
const computedActual = Number.isFinite(retail) ? round2(retail * (1 - d)) : null;
|
||||||
|
|
||||||
setFieldsValue({
|
setFieldsValue({
|
||||||
billlines: (getFieldValue("billlines") || []).map((item, idx) => {
|
billlines: (getFieldValue("billlines") || []).map((item, idx) => {
|
||||||
if (idx !== index) return item;
|
if (idx !== index) return item;
|
||||||
@@ -178,7 +178,7 @@ export function BillEnterModalLinesComponent({
|
|||||||
quantity: opt.part_qty || 1,
|
quantity: opt.part_qty || 1,
|
||||||
actual_price: opt.cost,
|
actual_price: opt.cost,
|
||||||
original_actual_price: opt.cost,
|
original_actual_price: opt.cost,
|
||||||
// actual_cost intentionally untouched here
|
actual_cost: isBlank(item.actual_cost) ? computedActual : item.actual_cost,
|
||||||
cost_center: opt.part_type
|
cost_center: opt.part_type
|
||||||
? bodyshopHasDmsKey(bodyshop)
|
? bodyshopHasDmsKey(bodyshop)
|
||||||
? opt.part_type !== "PAE"
|
? opt.part_type !== "PAE"
|
||||||
@@ -251,9 +251,9 @@ export function BillEnterModalLinesComponent({
|
|||||||
<CurrencyInput
|
<CurrencyInput
|
||||||
min={0}
|
min={0}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
// NOTE: Autofill should only happen on forward Tab out of Retail
|
onBlur={() => autofillActualCost(index)}
|
||||||
onKeyDown={(e) => {
|
onKeyDown={(e) => {
|
||||||
if (e.key === "Tab" && !e.shiftKey) autofillActualCost(index);
|
if (e.key === "Tab") autofillActualCost(index);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
@@ -329,7 +329,7 @@ export function BillEnterModalLinesComponent({
|
|||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
controls={false}
|
controls={false}
|
||||||
style={{ width: "100%", height: CONTROL_HEIGHT }}
|
style={{ width: "100%", height: CONTROL_HEIGHT }}
|
||||||
// NOTE: No auto-fill on focus/blur; only triggered from Retail on Tab
|
onFocus={() => autofillActualCost(index)}
|
||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -81,16 +81,17 @@ export function JobsDetailHeader({ job, bodyshop, disabled, insertAuditTrail, is
|
|||||||
const employeeData = bodyshop.associations.find((a) => a.useremail === job.admin_clerk)?.user?.employee ?? null;
|
const employeeData = bodyshop.associations.find((a) => a.useremail === job.admin_clerk)?.user?.employee ?? null;
|
||||||
|
|
||||||
// Handle checkbox changes
|
// Handle checkbox changes
|
||||||
const handleCheckboxChange = async (field, checked) => {
|
const handleCheckboxChange = async (field, e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
const checked = e.target.checked;
|
||||||
const value = checked ? dayjs().toISOString() : null;
|
const value = checked ? dayjs().toISOString() : null;
|
||||||
try {
|
try {
|
||||||
const ret = await updateJob({
|
const ret = await updateJob({
|
||||||
variables: {
|
variables: {
|
||||||
jobId: job.id,
|
jobId: job.id,
|
||||||
job: { [field]: value }
|
job: { [field]: value }
|
||||||
},
|
}
|
||||||
refetchQueries: ["GET_JOB_BY_PK"],
|
|
||||||
awaitRefetchQueries: true
|
|
||||||
});
|
});
|
||||||
insertAuditTrail({
|
insertAuditTrail({
|
||||||
jobid: job.id,
|
jobid: job.id,
|
||||||
@@ -182,7 +183,7 @@ export function JobsDetailHeader({ job, bodyshop, disabled, insertAuditTrail, is
|
|||||||
<Space>
|
<Space>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
checked={!!job.estimate_sent_approval}
|
checked={!!job.estimate_sent_approval}
|
||||||
onChange={(e) => handleCheckboxChange("estimate_sent_approval", e.target.checked)}
|
onChange={(e) => handleCheckboxChange("estimate_sent_approval", e)}
|
||||||
disabled={disabled || isPartsEntry}
|
disabled={disabled || isPartsEntry}
|
||||||
>
|
>
|
||||||
{job.estimate_sent_approval && (
|
{job.estimate_sent_approval && (
|
||||||
@@ -197,7 +198,7 @@ export function JobsDetailHeader({ job, bodyshop, disabled, insertAuditTrail, is
|
|||||||
<Space>
|
<Space>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
checked={!!job.estimate_approved}
|
checked={!!job.estimate_approved}
|
||||||
onChange={(e) => handleCheckboxChange("estimate_approved", e.target.checked)}
|
onChange={(e) => handleCheckboxChange("estimate_approved", e)}
|
||||||
disabled={disabled || isPartsEntry}
|
disabled={disabled || isPartsEntry}
|
||||||
>
|
>
|
||||||
{job.estimate_approved && (
|
{job.estimate_approved && (
|
||||||
|
|||||||
@@ -33,8 +33,7 @@ export function TaskListContainer({
|
|||||||
currentUser,
|
currentUser,
|
||||||
onlyMine,
|
onlyMine,
|
||||||
parentJobId,
|
parentJobId,
|
||||||
showRo = true,
|
showRo = true
|
||||||
disableJobRefetch = false
|
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const notification = useNotification();
|
const notification = useNotification();
|
||||||
@@ -91,10 +90,6 @@ export function TaskListContainer({
|
|||||||
refetchQueries: [Object.keys(query)[0]]
|
refetchQueries: [Object.keys(query)[0]]
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!disableJobRefetch) {
|
|
||||||
toggledTaskObject.refetchQueries.push("GET_JOB_BY_PK");
|
|
||||||
}
|
|
||||||
|
|
||||||
const toggledTask = await toggleTaskCompleted(toggledTaskObject);
|
const toggledTask = await toggleTaskCompleted(toggledTaskObject);
|
||||||
|
|
||||||
if (!toggledTask.errors) {
|
if (!toggledTask.errors) {
|
||||||
@@ -144,10 +139,6 @@ export function TaskListContainer({
|
|||||||
refetchQueries: [Object.keys(query)[0]]
|
refetchQueries: [Object.keys(query)[0]]
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!disableJobRefetch) {
|
|
||||||
toggledTaskObject.refetchQueries.push("GET_JOB_BY_PK");
|
|
||||||
}
|
|
||||||
|
|
||||||
const toggledTask = await toggleTaskDeleted(toggledTaskObject);
|
const toggledTask = await toggleTaskDeleted(toggledTaskObject);
|
||||||
|
|
||||||
if (!toggledTask.errors) {
|
if (!toggledTask.errors) {
|
||||||
|
|||||||
@@ -23,17 +23,10 @@ export function TasksPageComponent({ bodyshop, currentUser, type }) {
|
|||||||
relationshipType={"assigned_to"}
|
relationshipType={"assigned_to"}
|
||||||
query={{ QUERY_MY_TASKS_PAGINATED }}
|
query={{ QUERY_MY_TASKS_PAGINATED }}
|
||||||
titleTranslation={"tasks.titles.my_tasks"}
|
titleTranslation={"tasks.titles.my_tasks"}
|
||||||
disableJobRefetch={true}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case taskPageTypes.ALL_TASKS:
|
case taskPageTypes.ALL_TASKS:
|
||||||
return (
|
return <TaskListContainer query={{ QUERY_ALL_TASKS_PAGINATED }} titleTranslation={"tasks.titles.all_tasks"} />;
|
||||||
<TaskListContainer
|
|
||||||
query={{ QUERY_ALL_TASKS_PAGINATED }}
|
|
||||||
titleTranslation={"tasks.titles.all_tasks"}
|
|
||||||
disableJobRefetch={true}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
default:
|
default:
|
||||||
return <></>;
|
return <></>;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user