Merged in feature/2021-07-16 (pull request #136)

feature/2021-07-16

Approved-by: Patrick Fic
This commit is contained in:
Patrick Fic
2021-07-13 19:32:15 +00:00
13 changed files with 177 additions and 22 deletions

View File

@@ -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>

View File

@@ -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);

View File

@@ -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>
), ),
}, },
]; ];

View File

@@ -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 />

View File

@@ -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>
); );

View File

@@ -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")}

View File

@@ -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);

View File

@@ -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

View File

@@ -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*",

View File

@@ -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

View File

@@ -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",

View File

@@ -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": "",

View File

@@ -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": "",