diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 1bf35685a..64e8faa9d 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -4755,6 +4755,27 @@ + + jobline + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + line_desc false diff --git a/client/src/components/invoice-detail-edit/invoice-detail-edit.component.jsx b/client/src/components/invoice-detail-edit/invoice-detail-edit.component.jsx index 73acfd027..2f4d49c73 100644 --- a/client/src/components/invoice-detail-edit/invoice-detail-edit.component.jsx +++ b/client/src/components/invoice-detail-edit/invoice-detail-edit.component.jsx @@ -1,11 +1,11 @@ -import { DatePicker, Form, Input, Switch } from "antd"; +import { DatePicker, Form, Input, Switch, Tag } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -import CurrencyInput from "../form-items-formatted/currency-form-item.component"; -import JobSearchSelect from "../job-search-select/job-search-select.component"; -import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; -import InvoiceEnterModalLinesComponent from "../invoice-enter-modal/invoice-enter-modal.lines.component"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; import DocumentsUploadContainer from "../documents-upload/documents-upload.container"; +import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import InvoiceEnterModalLinesComponent from "../invoice-enter-modal/invoice-enter-modal.lines.component"; +import JobSearchSelect from "../job-search-select/job-search-select.component"; export default function InvoiceDetailEditComponent({ form, @@ -15,6 +15,22 @@ export default function InvoiceDetailEditComponent({ responsibilityCenters, }) { const { t } = useTranslation(); + const [amounts, setAmounts] = useState({ invoiceTotal: 0, enteredAmount: 0 }); + const { getFieldsValue } = form; + + const calculateTotals = () => { + setAmounts({ + invoiceTotal: getFieldsValue().total || 0, + enteredTotal: getFieldsValue("invoicelines").invoicelines + ? getFieldsValue("invoicelines").invoicelines.reduce( + (acc, value) => + acc + (value && value.actual_cost ? value.actual_cost : 0), + 0 + ) + : 0, + }); + }; + return (
@@ -85,18 +101,32 @@ export default function InvoiceDetailEditComponent({
+ {t("invoicelines.labels.entered")} + {amounts.enteredTotal || 0} + {amounts.invoiceTotal - amounts.enteredTotal === 0 ? ( + {t("invoicelines.labels.reconciled")} + ) : ( + + {t("invoicelines.labels.unreconciled")}: + + {amounts.invoiceTotal - amounts.enteredTotal} + + + )} + + {t("invoicelines.labels.entered")} + {amounts.enteredTotal || 0} + + {amounts.invoiceTotal - amounts.enteredTotal === 0 ? ( + {t("invoicelines.labels.reconciled")} + ) : ( + + {t("invoicelines.labels.unreconciled")}: + + {amounts.invoiceTotal - amounts.enteredTotal} + + + )}
); } diff --git a/client/src/components/invoice-enter-modal/invoice-enter-modal.container.jsx b/client/src/components/invoice-enter-modal/invoice-enter-modal.container.jsx index 54ca1008d..79b3fe0a3 100644 --- a/client/src/components/invoice-enter-modal/invoice-enter-modal.container.jsx +++ b/client/src/components/invoice-enter-modal/invoice-enter-modal.container.jsx @@ -61,7 +61,14 @@ function InvoiceEnterModalContainer({ variables: { invoice: [ Object.assign({}, values, { - invoicelines: { data: values.invoicelines }, + invoicelines: { + data: values.invoicelines.map((i) => { + return { + ...i, + joblineid: i.joblineid === "noline" ? null : i.joblineid, + }; + }), + }, }), ], }, diff --git a/client/src/components/invoice-enter-modal/invoice-enter-modal.lines.component.jsx b/client/src/components/invoice-enter-modal/invoice-enter-modal.lines.component.jsx index 808f773a5..7fc1de42c 100644 --- a/client/src/components/invoice-enter-modal/invoice-enter-modal.lines.component.jsx +++ b/client/src/components/invoice-enter-modal/invoice-enter-modal.lines.component.jsx @@ -1,34 +1,20 @@ import { DeleteFilled } from "@ant-design/icons"; -import { Button, Col, Form, Input, Row, Select, Tag } from "antd"; -import React, { useState } from "react"; +import { Button, Form, Input, Select } from "antd"; +import React from "react"; import { useTranslation } from "react-i18next"; -import CurrencyFormatter from "../../utils/CurrencyFormatter"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import InvoiceLineSearchSelect from "../invoice-line-search-select/invoice-line-search-select.component"; export default function InvoiceEnterModalLinesComponent({ lineData, discount, form, responsibilityCenters, + calculateTotals, }) { const { t } = useTranslation(); const { setFieldsValue, getFieldsValue } = form; - - const [amounts, setAmounts] = useState({ invoiceTotal: 0, enteredAmount: 0 }); - - const calculateTotals = () => { - setAmounts({ - invoiceTotal: getFieldsValue().total, - enteredTotal: getFieldsValue("invoicelines").invoicelines - ? getFieldsValue("invoicelines").invoicelines.reduce( - (acc, value) => - acc + (value && value.actual_cost ? value.actual_cost : 0), - 0 - ) - : 0, - }); - }; - + console.log("calculateTotals", calculateTotals); return (
@@ -40,8 +26,9 @@ export default function InvoiceEnterModalLinesComponent({
- + /> - {!!getFieldsValue(["invoicelines"]).invoicelines[index] && - !getFieldsValue(["invoicelines"]).invoicelines[index] - .joblineid ? ( - - - - ) : null} + + + - calculateTotals()} /> + { + calculateTotals(); + }} + /> - { remove(field.name); @@ -220,25 +167,6 @@ export default function InvoiceEnterModalLinesComponent({ ); }} - - - {t("invoicelines.labels.entered")} - {amounts.enteredTotal || 0} - - - - {amounts.invoiceTotal - amounts.enteredTotal === 0 ? ( - {t("invoicelines.labels.reconciled")} - ) : ( - - {t("invoicelines.labels.unreconciled")}: - - {amounts.invoiceTotal - amounts.enteredTotal} - - - )} - -
); } diff --git a/client/src/components/invoice-line-search-select/invoice-line-search-select.component.jsx b/client/src/components/invoice-line-search-select/invoice-line-search-select.component.jsx new file mode 100644 index 000000000..f726115e7 --- /dev/null +++ b/client/src/components/invoice-line-search-select/invoice-line-search-select.component.jsx @@ -0,0 +1,66 @@ +import { Select, Row, Col, Tag } from "antd"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; + +//To be used as a form element only. +const { Option } = Select; +const InvoiceLineSearchSelect = ({ + value, + onChange, + options, + onBlur, + onSelect, +}) => { + const [option, setOption] = useState(value); + const { t } = useTranslation(); + + useEffect(() => { + if (onChange) { + onChange(option); + } + }, [option, onChange]); + + return ( + + ); +}; +export default InvoiceLineSearchSelect; diff --git a/client/src/graphql/invoices.queries.js b/client/src/graphql/invoices.queries.js index 73a643e0f..0c3a4c97c 100644 --- a/client/src/graphql/invoices.queries.js +++ b/client/src/graphql/invoices.queries.js @@ -100,6 +100,7 @@ export const QUERY_INVOICE_BY_PK = gql` actual_price actual_cost cost_center + joblineid } } } diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 42895c7fa..8e3958fb9 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -333,7 +333,8 @@ "actual": "Actual", "actual_cost": "Actual Cost", "cost_center": "Cost Center", - "line_desc": "Line Description", + "jobline": "Job Line", + "line_desc": "Invoice Line Description", "retail": "Retail" }, "labels": { diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index a7e83e405..8ab9f1c6f 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -333,6 +333,7 @@ "actual": "", "actual_cost": "", "cost_center": "", + "jobline": "", "line_desc": "", "retail": "" }, diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 2419d027e..993cf3b86 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -333,6 +333,7 @@ "actual": "", "actual_cost": "", "cost_center": "", + "jobline": "", "line_desc": "", "retail": "" },