Merged in feature/2021-07-16 (pull request #136)
feature/2021-07-16 Approved-by: Patrick Fic
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
<babeledit_project be_version="2.7.1" version="1.2">
|
<babeledit_project version="1.2" be_version="2.7.1">
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
BabelEdit project file
|
BabelEdit project file
|
||||||
@@ -16516,6 +16516,48 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>markpstexempt</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>markpstexemptconfirm</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>postbills</name>
|
<name>postbills</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ function BillEnterModalContainer({
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
refetchQueries: ["QUERY_PARTS_BILLS_BY_JOBID"],
|
||||||
});
|
});
|
||||||
console.log("adjustmentsToInsert", adjustmentsToInsert);
|
console.log("adjustmentsToInsert", adjustmentsToInsert);
|
||||||
const adjKeys = Object.keys(adjustmentsToInsert);
|
const adjKeys = Object.keys(adjustmentsToInsert);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Button, Card, Space, Table } from "antd";
|
import { Button, Card, Space, Table } from "antd";
|
||||||
|
import { EditFilled } from "@ant-design/icons";
|
||||||
import Dinero from "dinero.js";
|
import Dinero from "dinero.js";
|
||||||
import React, { useMemo, useState } from "react";
|
import React, { useMemo, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
@@ -115,16 +116,29 @@ export function JobPayments({
|
|||||||
dataIndex: "actions",
|
dataIndex: "actions",
|
||||||
key: "actions",
|
key: "actions",
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<PrintWrapperComponent
|
<Space wrap>
|
||||||
templateObject={{
|
<Button
|
||||||
name: TemplateList("payment").payment_receipt.key,
|
disabled={record.exportedat}
|
||||||
variables: { id: record.id },
|
onClick={() => {
|
||||||
}}
|
setPaymentContext({
|
||||||
messageObject={{
|
actions: { refetch: refetch },
|
||||||
to: job.ownr_ea,
|
context: record,
|
||||||
}}
|
});
|
||||||
id={job.id}
|
}}
|
||||||
/>
|
>
|
||||||
|
<EditFilled />
|
||||||
|
</Button>
|
||||||
|
<PrintWrapperComponent
|
||||||
|
templateObject={{
|
||||||
|
name: TemplateList("payment").payment_receipt.key,
|
||||||
|
variables: { id: record.id },
|
||||||
|
}}
|
||||||
|
messageObject={{
|
||||||
|
to: job.ownr_ea,
|
||||||
|
}}
|
||||||
|
id={job.id}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ import FormItemPhone, {
|
|||||||
PhoneItemFormatterValidation,
|
PhoneItemFormatterValidation,
|
||||||
} from "../form-items-formatted/phone-form-item.component";
|
} from "../form-items-formatted/phone-form-item.component";
|
||||||
import JobsDetailRatesChangeButton from "../jobs-detail-rates-change-button/jobs-detail-rates-change-button.component";
|
import JobsDetailRatesChangeButton from "../jobs-detail-rates-change-button/jobs-detail-rates-change-button.component";
|
||||||
import { JobsDetailRatesParts } from "../jobs-detail-rates/jobs-detail-rates.parts.component";
|
import JobsDetailRatesParts from "../jobs-detail-rates/jobs-detail-rates.parts.component";
|
||||||
|
import JobsMarkPstExempt from "../jobs-mark-pst-exempt/jobs-mark-pst-exempt.component";
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
@@ -187,7 +188,7 @@ export function JobsCreateJobsInfo({ bodyshop, form, selected }) {
|
|||||||
header={t("menus.jobsdetail.financials")}
|
header={t("menus.jobsdetail.financials")}
|
||||||
>
|
>
|
||||||
<JobsDetailRatesChangeButton form={form} />
|
<JobsDetailRatesChangeButton form={form} />
|
||||||
|
<JobsMarkPstExempt form={form} />
|
||||||
<LayoutFormRow>
|
<LayoutFormRow>
|
||||||
<Form.Item label={t("jobs.fields.ded_amt")} name="ded_amt">
|
<Form.Item label={t("jobs.fields.ded_amt")} name="ded_amt">
|
||||||
<CurrencyInput />
|
<CurrencyInput />
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
import { Form, Input, InputNumber, Select, Space, Switch, Tooltip } from "antd";
|
import {
|
||||||
|
Divider,
|
||||||
|
Form,
|
||||||
|
Input,
|
||||||
|
InputNumber,
|
||||||
|
Select,
|
||||||
|
Space,
|
||||||
|
Switch,
|
||||||
|
Tooltip,
|
||||||
|
} from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
@@ -7,6 +16,7 @@ import { selectJobReadOnly } from "../../redux/application/application.selectors
|
|||||||
import CABCpvrtCalculator from "../ca-bc-pvrt-calculator/ca-bc-pvrt-calculator.component";
|
import CABCpvrtCalculator from "../ca-bc-pvrt-calculator/ca-bc-pvrt-calculator.component";
|
||||||
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
|
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
|
||||||
import JobsDetailRatesChangeButton from "../jobs-detail-rates-change-button/jobs-detail-rates-change-button.component";
|
import JobsDetailRatesChangeButton from "../jobs-detail-rates-change-button/jobs-detail-rates-change-button.component";
|
||||||
|
import JobsMarkPstExempt from "../jobs-mark-pst-exempt/jobs-mark-pst-exempt.component";
|
||||||
import FormRow from "../layout-form-row/layout-form-row.component";
|
import FormRow from "../layout-form-row/layout-form-row.component";
|
||||||
import JobsDetailRatesParts from "./jobs-detail-rates.parts.component";
|
import JobsDetailRatesParts from "./jobs-detail-rates.parts.component";
|
||||||
|
|
||||||
@@ -103,8 +113,19 @@ export function JobsDetailRates({ jobRO, form, job }) {
|
|||||||
<Switch disabled={jobRO} />
|
<Switch disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</FormRow>
|
</FormRow>
|
||||||
<JobsDetailRatesChangeButton form={form} disabled={jobRO} />
|
<Divider
|
||||||
<FormRow header={t("jobs.forms.laborrates")}>
|
orientation="left"
|
||||||
|
type="horizontal"
|
||||||
|
style={{ marginTop: ".8rem", float: "right" }}
|
||||||
|
>
|
||||||
|
{t("jobs.forms.laborrates")}
|
||||||
|
</Divider>
|
||||||
|
<Space>
|
||||||
|
<div></div>
|
||||||
|
<JobsDetailRatesChangeButton form={form} disabled={jobRO} />
|
||||||
|
<JobsMarkPstExempt form={form} />
|
||||||
|
</Space>
|
||||||
|
<FormRow noDivider>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.labor_rate_desc")}
|
label={t("jobs.fields.labor_rate_desc")}
|
||||||
name="labor_rate_desc"
|
name="labor_rate_desc"
|
||||||
@@ -180,7 +201,6 @@ export function JobsDetailRates({ jobRO, form, job }) {
|
|||||||
<CurrencyInput disabled={jobRO} />
|
<CurrencyInput disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</FormRow>
|
</FormRow>
|
||||||
|
|
||||||
<JobsDetailRatesParts form={form} />
|
<JobsDetailRatesParts form={form} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -19,7 +19,11 @@ export function JobsDetailRatesParts({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Collapse defaultActiveKey={expanded && "rates"}>
|
<Collapse defaultActiveKey={expanded && "rates"}>
|
||||||
<Collapse.Panel header={t("jobs.labels.parts_tax_rates")} key="rates">
|
<Collapse.Panel
|
||||||
|
forceRender
|
||||||
|
header={t("jobs.labels.parts_tax_rates")}
|
||||||
|
key="rates"
|
||||||
|
>
|
||||||
<LayoutFormRow header={t("joblines.fields.part_types.PAA")}>
|
<LayoutFormRow header={t("joblines.fields.part_types.PAA")}>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.parts_tax_rates.prt_discp")}
|
label={t("jobs.fields.parts_tax_rates.prt_discp")}
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
import { Popconfirm, Button } from "antd";
|
||||||
|
import React from "react";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
||||||
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import _ from "lodash";
|
||||||
|
const mapStateToProps = createStructuredSelector({
|
||||||
|
bodyshop: selectBodyshop,
|
||||||
|
jobRO: selectJobReadOnly,
|
||||||
|
});
|
||||||
|
|
||||||
|
export function JobsMarkPstExempt({ jobRO, form }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const handleConfirm = () => {
|
||||||
|
const newPartRates = _.cloneDeep(form.getFieldValue("parts_tax_rates"));
|
||||||
|
|
||||||
|
Object.keys(newPartRates).forEach((key) => {
|
||||||
|
newPartRates[key] = {
|
||||||
|
...newPartRates[key],
|
||||||
|
prt_tax_in: false,
|
||||||
|
prt_tax_rt: 0,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
form.setFieldsValue({
|
||||||
|
state_tax_rate: 0,
|
||||||
|
tax_lbr_rt: 0,
|
||||||
|
tax_levies_rt: 0,
|
||||||
|
tax_sub_rt: 0,
|
||||||
|
tax_shop_mat_rt: 0,
|
||||||
|
tax_paint_mat_rt: 0,
|
||||||
|
tax_str_rt: 0,
|
||||||
|
tax_tow_rt: 0,
|
||||||
|
parts_tax_rates: newPartRates,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Popconfirm
|
||||||
|
onConfirm={handleConfirm}
|
||||||
|
disabled={jobRO}
|
||||||
|
okText={t("general.labels.yes")}
|
||||||
|
cancelText={t("general.labels.no")}
|
||||||
|
title={t("jobs.actions.markpstexemptconfirm")}
|
||||||
|
>
|
||||||
|
<Button type="link" disabled={jobRO}>
|
||||||
|
{t("jobs.actions.markpstexempt")}
|
||||||
|
</Button>
|
||||||
|
</Popconfirm>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
export default connect(mapStateToProps, null)(JobsMarkPstExempt);
|
||||||
@@ -90,7 +90,11 @@ export function PartsOrderListTableComponent({
|
|||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
<Button
|
<Button
|
||||||
disabled={jobRO || record.return}
|
disabled={
|
||||||
|
jobRO ||
|
||||||
|
record.return ||
|
||||||
|
record.vendor.id === bodyshop.inhousevendorid
|
||||||
|
}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
logImEXEvent("parts_order_receive_bill");
|
logImEXEvent("parts_order_receive_bill");
|
||||||
setPartsReceiveContext({
|
setPartsReceiveContext({
|
||||||
@@ -139,7 +143,10 @@ export function PartsOrderListTableComponent({
|
|||||||
</Button>
|
</Button>
|
||||||
</Popconfirm>
|
</Popconfirm>
|
||||||
<Button
|
<Button
|
||||||
disabled={jobRO ? !record.return : jobRO}
|
disabled={
|
||||||
|
(jobRO ? !record.return : jobRO) ||
|
||||||
|
record.vendor.id === bodyshop.inhousevendorid
|
||||||
|
}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
logImEXEvent("parts_order_receive_bill");
|
logImEXEvent("parts_order_receive_bill");
|
||||||
|
|
||||||
@@ -157,7 +164,7 @@ export function PartsOrderListTableComponent({
|
|||||||
quantity: pol.quantity,
|
quantity: pol.quantity,
|
||||||
|
|
||||||
actual_price: pol.act_price,
|
actual_price: pol.act_price,
|
||||||
cost_center: pol.jobline.part_type
|
cost_center: pol.jobline?.part_type
|
||||||
? responsibilityCenters.defaults.costs[
|
? responsibilityCenters.defaults.costs[
|
||||||
pol.jobline.part_type
|
pol.jobline.part_type
|
||||||
] || null
|
] || null
|
||||||
|
|||||||
@@ -101,7 +101,9 @@ export function PartsOrderModalContainer({
|
|||||||
|
|
||||||
const jobLinesResult = await updateJobLines({
|
const jobLinesResult = await updateJobLines({
|
||||||
variables: {
|
variables: {
|
||||||
ids: values.parts_order_lines.data.map((item) => item.job_line_id),
|
ids: values.parts_order_lines.data
|
||||||
|
.filter((item) => item.job_line_id)
|
||||||
|
.map((item) => item.job_line_id),
|
||||||
status: isReturn
|
status: isReturn
|
||||||
? bodyshop.md_order_statuses.default_returned || "Returned*"
|
? bodyshop.md_order_statuses.default_returned || "Returned*"
|
||||||
: bodyshop.md_order_statuses.default_ordered || "Ordered*",
|
: bodyshop.md_order_statuses.default_ordered || "Ordered*",
|
||||||
|
|||||||
@@ -559,6 +559,7 @@ export const GET_JOB_BY_PK = gql`
|
|||||||
}
|
}
|
||||||
payments {
|
payments {
|
||||||
id
|
id
|
||||||
|
jobid
|
||||||
amount
|
amount
|
||||||
payer
|
payer
|
||||||
created_at
|
created_at
|
||||||
@@ -566,6 +567,8 @@ export const GET_JOB_BY_PK = gql`
|
|||||||
transactionid
|
transactionid
|
||||||
memo
|
memo
|
||||||
date
|
date
|
||||||
|
type
|
||||||
|
exportedat
|
||||||
}
|
}
|
||||||
cccontracts {
|
cccontracts {
|
||||||
id
|
id
|
||||||
|
|||||||
@@ -1034,6 +1034,8 @@
|
|||||||
"intake": "Intake",
|
"intake": "Intake",
|
||||||
"manualnew": "Create New Job Manually",
|
"manualnew": "Create New Job Manually",
|
||||||
"mark": "Mark",
|
"mark": "Mark",
|
||||||
|
"markpstexempt": "Mark Job PST Exempt",
|
||||||
|
"markpstexemptconfirm": "Are you sure you want to do this? To undo this, you must manually update all PST rates.",
|
||||||
"postbills": "Post Bills",
|
"postbills": "Post Bills",
|
||||||
"printCenter": "Print Center",
|
"printCenter": "Print Center",
|
||||||
"recalculate": "Recalculate",
|
"recalculate": "Recalculate",
|
||||||
|
|||||||
@@ -1034,6 +1034,8 @@
|
|||||||
"intake": "",
|
"intake": "",
|
||||||
"manualnew": "",
|
"manualnew": "",
|
||||||
"mark": "",
|
"mark": "",
|
||||||
|
"markpstexempt": "",
|
||||||
|
"markpstexemptconfirm": "",
|
||||||
"postbills": "Contabilizar facturas",
|
"postbills": "Contabilizar facturas",
|
||||||
"printCenter": "Centro de impresión",
|
"printCenter": "Centro de impresión",
|
||||||
"recalculate": "",
|
"recalculate": "",
|
||||||
|
|||||||
@@ -1034,6 +1034,8 @@
|
|||||||
"intake": "",
|
"intake": "",
|
||||||
"manualnew": "",
|
"manualnew": "",
|
||||||
"mark": "",
|
"mark": "",
|
||||||
|
"markpstexempt": "",
|
||||||
|
"markpstexemptconfirm": "",
|
||||||
"postbills": "Poster des factures",
|
"postbills": "Poster des factures",
|
||||||
"printCenter": "Centre d'impression",
|
"printCenter": "Centre d'impression",
|
||||||
"recalculate": "",
|
"recalculate": "",
|
||||||
|
|||||||
Reference in New Issue
Block a user