diff --git a/client/.env.development.promanager b/client/.env.development.promanager index 70b8b0fdd..15fa08bce 100644 --- a/client/.env.development.promanager +++ b/client/.env.development.promanager @@ -1,7 +1,7 @@ VITE_APP_GRAPHQL_ENDPOINT=https://db.dev.bodyshop.app/v1/graphql VITE_APP_GRAPHQL_ENDPOINT_WS=wss://db.dev.bodyshop.app/v1/graphql VITE_APP_GA_CODE=231099835 -VITE_APP_FIREBASE_CONFIG={ "apiKey": "AIzaSyAuLQR9SV5LsVxjU8wh9hvFLdhcAHU6cxE", "authDomain": "rome-prod-1.firebaseapp.com", "projectId": "rome-prod-1", "storageBucket": "rome-prod-1.appspot.com", "messagingSenderId": "147786367145", "appId": "1:147786367145:web:9d4cba68071c3f29a8a9b8", "measurementId": "G-G8Z9DRHTZS"} +VITE_APP_FIREBASE_CONFIG={"apiKey":"AIzaSyDPLT8GiDHDR1R4nI66Qi0BY1aYviDPioc","authDomain":"imex-dev.firebaseapp.com","databaseURL":"https://imex-dev.firebaseio.com","projectId":"imex-dev","storageBucket":"imex-dev.appspot.com","messagingSenderId":"759548147434","appId":"1:759548147434:web:e8239868a48ceb36700993","measurementId":"G-K5XRBVVB4S"} VITE_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/io-test VITE_APP_CLOUDINARY_ENDPOINT=https://res.cloudinary.com/io-test VITE_APP_CLOUDINARY_API_KEY=957865933348715 diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx index ecbb5a904..441359097 100644 --- a/client/src/App/App.jsx +++ b/client/src/App/App.jsx @@ -1,15 +1,13 @@ import { useSplitClient } from "@splitsoftware/splitio-react"; import { Button, Result } from "antd"; import LogRocket from "logrocket"; -import React, { lazy, Suspense, useEffect, useMemo, useState } from "react"; +import React, { lazy, Suspense, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { Route, Routes } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import DocumentEditorContainer from "../components/document-editor/document-editor.container"; -import ErrorBoundary from "../components/error-boundary/error-boundary.component"; - -// Component Imports +import ErrorBoundary from "../components/error-boundary/error-boundary.component"; // Component Imports import LoadingSpinner from "../components/loading-spinner/loading-spinner.component"; import DisclaimerPage from "../pages/disclaimer/disclaimer.page"; import LandingPage from "../pages/landing/landing.page"; @@ -23,7 +21,7 @@ import "./App.styles.scss"; import handleBeta from "../utils/betaHandler"; import Eula from "../components/eula/eula.component"; import InstanceRenderMgr from "../utils/instanceRenderMgr"; -import { ProductFruits } from "react-product-fruits"; +import ProductFruitsWrapper from "./ProductFruitsWrapper.jsx"; const ResetPassword = lazy(() => import("../pages/reset-password/reset-password.component")); const ManagePage = lazy(() => import("../pages/manage/manage.page.container")); @@ -48,23 +46,6 @@ export function App({ bodyshop, checkUserSession, currentUser, online, setOnline const [listenersAdded, setListenersAdded] = useState(false); const { t } = useTranslation(); - const workspaceCode = useMemo( - () => - InstanceRenderMgr({ - imex: null, - rome: "9BkbEseqNqxw8jUH", - promanager: "aoJoEifvezYI0Z0P" - }), - [] - ); - - const workspaceLogin = useMemo( - () => ({ - email: currentUser.email, - username: currentUser.email - }), - [currentUser.email] - ); useEffect(() => { if (!navigator.onLine) { setOnline(false); @@ -73,6 +54,10 @@ export function App({ bodyshop, checkUserSession, currentUser, online, setOnline checkUserSession(); }, [checkUserSession, setOnline]); + //const b = Grid.useBreakpoint(); + // console.log("Breakpoints:", b); + + // Associate event listeners, memoize to prevent multiple listeners being added useEffect(() => { const offlineListener = () => { setOnline(false); @@ -144,6 +129,7 @@ export function App({ bodyshop, checkUserSession, currentUser, online, setOnline return ; } + // Any route that is not assigned and matched will default to the Landing Page component return ( } > - {currentUser && currentUser.email && ( - - )} + { + return ( + workspaceCode && + currentUser?.authorized === true && + currentUser?.email && ( + + ) + ); +}); + +export default ProductFruitsWrapper; + +ProductFruitsWrapper.propTypes = { + currentUser: PropTypes.shape({ + authorized: PropTypes.bool, + email: PropTypes.string + }).isRequired, + workspaceCode: PropTypes.string.isRequired +}; diff --git a/client/src/components/shop-employees/shop-employees-list.component.jsx b/client/src/components/shop-employees/shop-employees-list.component.jsx index 2add19f34..d6b41bad2 100644 --- a/client/src/components/shop-employees/shop-employees-list.component.jsx +++ b/client/src/components/shop-employees/shop-employees-list.component.jsx @@ -63,7 +63,7 @@ export default function ShopEmployeesListComponent({ loading, employees }) { value: false } ], - onFilter: (value, record) => value === record.flate_rate, + onFilter: (value, record) => value === record.flat_rate, render: (text, record) => record.flat_rate ? t("employees.labels.flat_rate") : t("employees.labels.straight_time") }, diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 85689a62b..fd9f03e5b 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -2946,7 +2946,8 @@ "parts_not_recieved_vendor": "Parts Not Received by Vendor", "parts_received_not_scheduled": "Parts Received for Jobs Not Scheduled", "payments_by_date": "Payments by Date", - "payments_by_date_type": "Payments by Date and Type", + "payments_by_date_payment": "Payments by Date and Payment Type", + "payments_by_date_type": "Payments by Date and Customer Type", "production_by_category": "Production by Category", "production_by_category_one": "Production filtered by Category", "production_by_csr": "Production by CSR", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 2785c962a..cdb5f63e4 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -2929,6 +2929,7 @@ "parts_not_recieved_vendor": "", "parts_received_not_scheduled": "", "payments_by_date": "", + "payments_by_date_payment": "", "payments_by_date_type": "", "production_by_category": "", "production_by_category_one": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 4abb5d683..5b10b29a6 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -2921,6 +2921,7 @@ "parts_not_recieved_vendor": "", "parts_received_not_scheduled": "", "payments_by_date": "", + "payments_by_date_payment": "", "payments_by_date_type": "", "production_by_category": "", "production_by_category_one": "", diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index 8fda63504..2aa482fb6 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -1194,6 +1194,17 @@ export const TemplateList = (type, context) => { }, group: "customers" }, + payments_by_date_payment: { + title: i18n.t("reportcenter.templates.payments_by_date_payment"), + subject: i18n.t("reportcenter.templates.payments_by_date_payment"), + key: "payments_by_date_payment", + disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.payments"), + field: i18n.t("payments.fields.date") + }, + group: "customers" + }, schedule: { title: i18n.t("reportcenter.templates.schedule"), subject: i18n.t("reportcenter.templates.schedule"), diff --git a/server/accounting/qb-receivables-lines.js b/server/accounting/qb-receivables-lines.js index 69818343e..e2437dca1 100644 --- a/server/accounting/qb-receivables-lines.js +++ b/server/accounting/qb-receivables-lines.js @@ -632,7 +632,7 @@ exports.default = function ({ bodyshop, jobs_by_pk, qbo = false, items, taxCodes } } - //QB USA with GST + //QB USA with GST and PST //This was required for the No. 1 Collision Group. if ( bodyshop.accountingconfig && @@ -651,6 +651,17 @@ exports.default = function ({ bodyshop, jobs_by_pk, qbo = false, items, taxCodes Qty: 1 } }); + InvoiceLineAdd.push({ + DetailType: "SalesItemLineDetail", + Amount: Dinero(jobs_by_pk.job_totals.totals.state_tax).toFormat(DineroQbFormat), + SalesItemLineDetail: { + ...(jobs_by_pk.class ? { ClassRef: { value: classes[jobs_by_pk.class] } } : {}), + ItemRef: { + value: items[bodyshop.md_responsibility_centers.taxes.state.accountitem] + }, + Qty: 1 + } + }); } } else { //Handle insurance profile adjustments