diff --git a/stripe_backup_code.txt b/_reference/stripe_backup_code.txt
similarity index 100%
rename from stripe_backup_code.txt
rename to _reference/stripe_backup_code.txt
diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel
index 917e01a10..018208459 100644
--- a/bodyshop_translations.babel
+++ b/bodyshop_translations.babel
@@ -26454,6 +26454,27 @@
+
+ ca_bc_etf_table
+ false
+
+
+
+
+
+ en-US
+ false
+
+
+ es-MX
+ false
+
+
+ fr-CA
+ false
+
+
+
customer
false
diff --git a/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table-modal.container.jsx b/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table-modal.container.jsx
new file mode 100644
index 000000000..fb18791bf
--- /dev/null
+++ b/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table-modal.container.jsx
@@ -0,0 +1,103 @@
+import { useLazyQuery } from "@apollo/client";
+import { Button, Form, Modal } from "antd";
+import React, { useEffect } from "react";
+import { useTranslation } from "react-i18next";
+import { connect } from "react-redux";
+import { createStructuredSelector } from "reselect";
+import { logImEXEvent } from "../../firebase/firebase.utils";
+import { FIND_JOBS_BY_CLAIM } from "../../graphql/jobs.queries";
+import { toggleModalVisible } from "../../redux/modals/modals.actions";
+import { selectCaBcEtfTableConvert } from "../../redux/modals/modals.selectors";
+import { selectBodyshop } from "../../redux/user/user.selectors";
+import CaBcEtfTableModalComponent from "./ca-bc-etf-table.modal.component";
+
+const mapStateToProps = createStructuredSelector({
+ bodyshop: selectBodyshop,
+ caBcEtfTableModal: selectCaBcEtfTableConvert,
+});
+
+const mapDispatchToProps = (dispatch) => ({
+ toggleModalVisible: () =>
+ dispatch(toggleModalVisible("ca_bc_eftTableConvert")),
+});
+
+export function ContractsFindModalContainer({
+ caBcEtfTableModal,
+ toggleModalVisible,
+
+ bodyshop,
+}) {
+ const { t } = useTranslation();
+
+ const { visible } = caBcEtfTableModal;
+
+ const [form] = Form.useForm();
+
+ // const [updateJobLines] = useMutation(UPDATE_JOB_LINE);
+ const [callSearch, { loading,// error,
+ data }] = useLazyQuery(
+ FIND_JOBS_BY_CLAIM
+ );
+
+ const handleFinish = async (values) => {
+ logImEXEvent("ca_bc_etf_table_parse");
+
+ const claimNumbers = [];
+ values.table.split("\n").forEach((row, idx, arr) => {
+ if (idx !== 0 && idx !== arr.length - 1) {
+ //Skip first row as it is header. Skip last row as it is totals.
+ const { 1: claim, 2: shortclaim } = row.split("\t");
+ if (!claim || !shortclaim) return;
+ const trimmedShortClaim = shortclaim.trim();
+ const trimmedClaim = claim.trim();
+
+ const beginning = trimmedShortClaim?.slice(0, -1); //Get everything except the last char
+ const last = trimmedShortClaim?.slice(-1); //Get the last digit
+ const alpha = trimmedClaim?.slice(-1);
+
+ const fullClaim = `${beginning}-${last}-${alpha}`;
+ if (fullClaim.length > 5) claimNumbers.push(fullClaim);
+ }
+ });
+
+ console.log(`claimNumbers`, claimNumbers);
+
+ callSearch({ variables: { claimNumbers } });
+ };
+
+ useEffect(() => {
+ if (visible) {
+ form.resetFields();
+ }
+ }, [visible, form]);
+
+ return (
+ toggleModalVisible()}
+ onOk={() => toggleModalVisible()}
+ destroyOnClose
+ forceRender
+ >
+
+
+ );
+}
+
+export default connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(ContractsFindModalContainer);
diff --git a/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table.modal.component.jsx b/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table.modal.component.jsx
new file mode 100644
index 000000000..cdee9403a
--- /dev/null
+++ b/client/src/components/ca-bc-etf-table-modal/ca-bc-etf-table.modal.component.jsx
@@ -0,0 +1,32 @@
+import { Form, Input } from "antd";
+import React from "react";
+import { useTranslation } from "react-i18next";
+import { connect } from "react-redux";
+import { createStructuredSelector } from "reselect";
+import { selectBodyshop } from "../../redux/user/user.selectors";
+
+const mapStateToProps = createStructuredSelector({
+ bodyshop: selectBodyshop,
+});
+
+export default connect(mapStateToProps, null)(PartsReceiveModalComponent);
+
+export function PartsReceiveModalComponent({ bodyshop, form }) {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx b/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx
index e058e6c42..a72ad41d3 100644
--- a/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx
+++ b/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx
@@ -3,31 +3,39 @@ import { Button, Card, Input, Space, Table, Typography } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
+import { connect } from "react-redux";
import { Link, useHistory, useLocation } from "react-router-dom";
+import { createStructuredSelector } from "reselect";
+import { setModalContext } from "../../redux/modals/modals.actions";
+import { selectBodyshop } from "../../redux/user/user.selectors";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter";
import { alphaSort } from "../../utils/sorters";
-
-import { connect } from "react-redux";
-import { createStructuredSelector } from "reselect";
-import { setModalContext } from "../../redux/modals/modals.actions";
-import PrintWrapperComponent from "../print-wrapper/print-wrapper.component";
import { TemplateList } from "../../utils/TemplateConstants";
+import CaBcEtfTableModalContainer from "../ca-bc-etf-table-modal/ca-bc-etf-table-modal.container";
+import PrintWrapperComponent from "../print-wrapper/print-wrapper.component";
const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
+ bodyshop: selectBodyshop,
});
const mapDispatchToProps = (dispatch) => ({
setPaymentContext: (context) =>
dispatch(setModalContext({ context: context, modal: "payment" })),
+ setCaBcEtfTableContext: (context) =>
+ dispatch(
+ setModalContext({ context: context, modal: "ca_bc_eftTableConvert" })
+ ),
});
export function PaymentsListPaginated({
setPaymentContext,
+ setCaBcEtfTableContext,
refetch,
loading,
payments,
total,
+ bodyshop,
}) {
const search = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder } = search;
@@ -193,6 +201,14 @@ export function PaymentsListPaginated({
>
)}
+ {bodyshop.region_config === "CA_BC" && (
+ <>
+
+
+ >
+ )}
diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js
index 6dc3dc82f..72f8f6c00 100644
--- a/client/src/graphql/jobs.queries.js
+++ b/client/src/graphql/jobs.queries.js
@@ -1524,3 +1524,16 @@ export const QUERY_JOB_CHECKLISTS = gql`
}
}
`;
+
+export const FIND_JOBS_BY_CLAIM = gql`
+ query FIND_JOBS_BY_CLAIM($claimNumbers: [String!]!) {
+ jobs(where: { clm_no: { _in: $claimNumbers } }) {
+ id
+ ro_number
+ actual_completion
+ ownr_fn
+ ownr_ln
+ ownr_co_nm
+ }
+ }
+`;
diff --git a/client/src/redux/modals/modals.reducer.js b/client/src/redux/modals/modals.reducer.js
index 9d38a2656..a2fde0c7e 100644
--- a/client/src/redux/modals/modals.reducer.js
+++ b/client/src/redux/modals/modals.reducer.js
@@ -23,6 +23,7 @@ const INITIAL_STATE = {
reportCenter: { ...baseModal },
partsReceive: { ...baseModal },
contractFinder: { ...baseModal },
+ ca_bc_eftTableConvert: { ...baseModal },
};
const modalsReducer = (state = INITIAL_STATE, action) => {
diff --git a/client/src/redux/modals/modals.selectors.js b/client/src/redux/modals/modals.selectors.js
index aa642d991..410aebd3b 100644
--- a/client/src/redux/modals/modals.selectors.js
+++ b/client/src/redux/modals/modals.selectors.js
@@ -70,3 +70,8 @@ export const selectContractFinder = createSelector(
[selectModals],
(modals) => modals.contractFinder
);
+
+export const selectCaBcEtfTableConvert = createSelector(
+ [selectModals],
+ (modals) => modals.ca_bc_eftTableConvert
+);
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json
index 88ce2fc46..6de2ea967 100644
--- a/client/src/translations/en_us/common.json
+++ b/client/src/translations/en_us/common.json
@@ -1583,6 +1583,7 @@
},
"labels": {
"balance": "Balance",
+ "ca_bc_etf_table": "ICBC ETF Table Converter",
"customer": "Customer",
"edit": "Edit Payment",
"electronicpayment": "Use Electronic Payment Processing?",
diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json
index 5d6396e15..47c8d00e0 100644
--- a/client/src/translations/es/common.json
+++ b/client/src/translations/es/common.json
@@ -1583,6 +1583,7 @@
},
"labels": {
"balance": "",
+ "ca_bc_etf_table": "",
"customer": "",
"edit": "",
"electronicpayment": "",
diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json
index 8a391eb43..75fc6ce7c 100644
--- a/client/src/translations/fr/common.json
+++ b/client/src/translations/fr/common.json
@@ -1583,6 +1583,7 @@
},
"labels": {
"balance": "",
+ "ca_bc_etf_table": "",
"customer": "",
"edit": "",
"electronicpayment": "",