diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index b94370a28..46aa75c86 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -2370,6 +2370,27 @@ + + onlycmforinvoiced + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + retailtotal false diff --git a/client/src/components/bill-form/bill-form.component.jsx b/client/src/components/bill-form/bill-form.component.jsx index e8d8e4387..f74046c61 100644 --- a/client/src/components/bill-form/bill-form.component.jsx +++ b/client/src/components/bill-form/bill-form.component.jsx @@ -41,6 +41,7 @@ export function BillFormComponent({ loadLines, billEdit, disableInvNumber, + job, }) { const { t } = useTranslation(); const client = useApolloClient(); @@ -89,7 +90,7 @@ export function BillFormComponent({ { if (form.getFieldValue("jobid") !== null) { loadLines({ variables: { id: form.getFieldValue("jobid") } }); @@ -187,6 +188,23 @@ export function BillFormComponent({ label={t("bills.fields.is_credit_memo")} name="is_credit_memo" valuePropName="checked" + dependencies={["jobid"]} + rules={[ + ({ getFieldValue }) => ({ + validator(rule, value) { + if ( + (job.status === bodyshop.md_ro_statuses.default_invoiced || + job.status === bodyshop.md_ro_statuses.default_exported || + job.status === bodyshop.md_ro_statuses.default_void) && + (value === false || !value) + ) { + return Promise.reject(t("bills.labels.onlycmforinvoiced")); + } + + return Promise.resolve(); + }, + }), + ]} > diff --git a/client/src/components/bill-form/bill-form.container.jsx b/client/src/components/bill-form/bill-form.container.jsx index f5775eac2..308b4bdb4 100644 --- a/client/src/components/bill-form/bill-form.container.jsx +++ b/client/src/components/bill-form/bill-form.container.jsx @@ -34,6 +34,7 @@ export function BillFormContainer({ } loadLines={loadLines} lineData={lineData ? lineData.joblines : []} + job={lineData ? lineData.jobs_by_pk : null} responsibilityCenters={bodyshop.md_responsibility_centers || null} disableInvNumber={disableInvNumber} /> diff --git a/client/src/graphql/jobs-lines.queries.js b/client/src/graphql/jobs-lines.queries.js index 7f5aadfb2..1b1304653 100644 --- a/client/src/graphql/jobs-lines.queries.js +++ b/client/src/graphql/jobs-lines.queries.js @@ -186,6 +186,10 @@ export const GET_JOB_LINES_TO_ENTER_BILL = gql` lbr_amt op_code_desc } + jobs_by_pk(id: $id) { + id + status + } } `; // oem_partno: { diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 3a1b1b070..62c264f66 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -156,6 +156,7 @@ "markforreexport": "Mark for Re-export", "new": "New Bill", "noneselected": "No bill selected.", + "onlycmforinvoiced": "Only credit memos can be entered for any job that has been invoiced.", "retailtotal": "Bills Retail Total", "state_tax": "Provincial/State Tax", "subtotal": "Subtotal", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index ef40ff1c5..f3ca17de3 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -156,6 +156,7 @@ "markforreexport": "", "new": "", "noneselected": "", + "onlycmforinvoiced": "", "retailtotal": "", "state_tax": "", "subtotal": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 2c2395e5a..1e96195c4 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -156,6 +156,7 @@ "markforreexport": "", "new": "", "noneselected": "", + "onlycmforinvoiced": "", "retailtotal": "", "state_tax": "", "subtotal": "", diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index a3e086306..567c484e7 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -765,7 +765,7 @@ export const TemplateList = (type, context) => { disabled: false, rangeFilter: { object: i18n.t("reportcenter.labels.objects.jobs"), - field: i18n.t("jobs.fields.date_invoiced"), + field: i18n.t("jobs.fields.date_open"), }, }, job_costing_ro_date_summary: {