Compare commits

...

21 Commits

Author SHA1 Message Date
Allan Carr
168d4246af IO-2785 AIO IO Header Rescue Link
Signed-off-by: Allan Carr <allan.carr@thinkimex.com>
2024-05-22 11:43:19 -07:00
Patrick Fic
ee613db0cb Merged in test-AIO (pull request #1443)
Resolve instance conflict for promanager.
2024-05-13 15:26:07 +00:00
Patrick Fic
55b892a74e Resolve instance conflict for promanager. 2024-05-13 08:25:45 -07:00
Patrick Fic
16754d9657 Merged in test-AIO (pull request #1442)
Test AIO
2024-05-10 22:36:17 +00:00
Patrick Fic
33db67122c Fix RBAC spread. 2024-05-10 15:35:26 -07:00
Patrick Fic
b9b88b0e23 Merged in release/AIO/2024-05-10 (pull request #1441)
Release/AIO/2024 05 10
2024-05-10 16:11:42 +00:00
Patrick Fic
992ad71910 Merge branch 'release/AIO/2024-05-10' into test-AIO 2024-05-10 08:33:31 -07:00
Patrick Fic
51d1f926c2 Improve spread for feature wrapped RBAC items. 2024-05-10 08:29:52 -07:00
Patrick Fic
c70447f337 Merge branch 'release/AIO/2024-05-10' into test-AIO 2024-05-10 08:08:32 -07:00
Patrick Fic
dc367e1a30 Add PAE Part Tax type for USA. 2024-05-10 08:08:15 -07:00
Patrick Fic
ee7997ffbc Merge branch 'release/AIO/2024-05-10' into test-AIO 2024-05-08 15:16:55 -07:00
Patrick Fic
2dbb5adbbb Merge branch 'feature/AIO/promanager' into release/AIO/2024-05-10 2024-05-08 15:16:47 -07:00
Patrick Fic
d6e3c54b68 Merge branch 'release/AIO/2024-04-26' into test-AIO 2024-05-03 14:38:38 -07:00
Patrick Fic
52809cc849 Merge branch 'release/AIO/2024-04-26' into test-AIO 2024-04-29 12:10:03 -07:00
Patrick Fic
e78b114544 Merge branch 'release/AIO/2024-04-26' into test-AIO 2024-04-26 08:18:25 -07:00
Patrick Fic
bcdd32f92f Merge branch 'hotfix/AIO/2024-04-24' into test-AIO 2024-04-24 10:52:18 -07:00
Patrick Fic
8e623c71a9 Merge branch 'hotfix/AIO/2024-04-24' into test-AIO 2024-04-24 10:17:40 -07:00
Patrick Fic
5f2a5e1025 Merge branch 'release/AIO/2024-04-26' into test-AIO 2024-04-22 14:03:50 -07:00
Patrick Fic
f2af78f056 Merge branch 'release/AIO/2024-04-26' into test-AIO 2024-04-22 13:15:11 -07:00
Patrick Fic
71f3dbbeb4 Merge branch 'release/AIO/2024-04-26' into test-AIO 2024-04-22 12:39:53 -07:00
Patrick Fic
c9b63be29f Hardcore generic template for ProManager. 2024-04-22 08:43:41 -07:00
5 changed files with 368 additions and 358 deletions

View File

@@ -32,6 +32,7 @@ import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { BsKanban } from "react-icons/bs"; import { BsKanban } from "react-icons/bs";
import { FaCalendarAlt, FaCarCrash, FaCreditCard, FaFileInvoiceDollar, FaTasks } from "react-icons/fa"; import { FaCalendarAlt, FaCarCrash, FaCreditCard, FaFileInvoiceDollar, FaTasks } from "react-icons/fa";
import { FiLogOut } from "react-icons/fi";
import { GiPayMoney, GiPlayerTime, GiSettingsKnobs } from "react-icons/gi"; import { GiPayMoney, GiPlayerTime, GiSettingsKnobs } from "react-icons/gi";
import { IoBusinessOutline } from "react-icons/io5"; import { IoBusinessOutline } from "react-icons/io5";
import { RiSurveyLine } from "react-icons/ri"; import { RiSurveyLine } from "react-icons/ri";
@@ -42,7 +43,6 @@ import { selectRecentItems, selectSelectedHeader } from "../../redux/application
import { setModalContext } from "../../redux/modals/modals.actions"; import { setModalContext } from "../../redux/modals/modals.actions";
import { signOutStart } from "../../redux/user/user.actions"; import { signOutStart } from "../../redux/user/user.actions";
import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors"; import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors";
import { FiLogOut } from "react-icons/fi";
import { checkBeta, handleBeta, setBeta } from "../../utils/betaHandler"; import { checkBeta, handleBeta, setBeta } from "../../utils/betaHandler";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
@@ -604,14 +604,22 @@ function Header({
); );
} }
}, },
// { ...(InstanceRenderManager({
// key: 'rescue', imex: true,
// icon: <Icon component={CarFilled}/>, rome: false,
// label: t("menus.header.rescueme"), promanager: false
// onClick: () => { })
// window.open("https://imexrescue.com/", "_blank"); ? [
// } {
// }, key: "rescue",
icon: <Icon component={CarFilled} />,
label: t("menus.header.rescueme"),
onClick: () => {
window.open("https://imexrescue.com/", "_blank");
}
}
]
: []),
...(InstanceRenderManager({ ...(InstanceRenderManager({
imex: true, imex: true,

View File

@@ -18,8 +18,6 @@ import ChatOpenButton from "../chat-open-button/chat-open-button.component";
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
import { setJoyRideSteps } from "../../redux/application/application.actions"; import { setJoyRideSteps } from "../../redux/application/application.actions";
import { OwnerNameDisplayFunction } from "./../owner-name-display/owner-name-display.component"; import { OwnerNameDisplayFunction } from "./../owner-name-display/owner-name-display.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
}); });

View File

@@ -30,227 +30,219 @@ export function ShopInfoRbacComponent({ form, bodyshop }) {
return ( return (
<RbacWrapper action="shop:rbac"> <RbacWrapper action="shop:rbac">
<LayoutFormRow> <LayoutFormRow>
{HasFeatureAccess({ featureName: "export", bodyshop }) && ( {...HasFeatureAccess({ featureName: "export", bodyshop }) ? [
<> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.accounting.exportlog")}
label={t("bodyshop.fields.rbac.accounting.exportlog")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "accounting:exportlog"]}
name={["md_rbac", "accounting:exportlog"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.accounting.payables")}
label={t("bodyshop.fields.rbac.accounting.payables")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "accounting:payables"]}
name={["md_rbac", "accounting:payables"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.accounting.payments")}
label={t("bodyshop.fields.rbac.accounting.payments")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "accounting:payments"]}
name={["md_rbac", "accounting:payments"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.accounting.receivables")}
label={t("bodyshop.fields.rbac.accounting.receivables")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "accounting:receivables"]}
name={["md_rbac", "accounting:receivables"]} >
> <InputNumber />
<InputNumber /> </Form.Item>
</Form.Item> ]:[]}
</> {...HasFeatureAccess({ featureName: "bills", bodyshop }) ? [
)} <Form.Item
{HasFeatureAccess({ featureName: "bills", bodyshop }) && ( label={t("bodyshop.fields.rbac.bills.delete")}
<> rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.delete")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:delete"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:delete"]} </Form.Item>,
> <Form.Item
<InputNumber /> label={t("bodyshop.fields.rbac.bills.enter")}
</Form.Item> rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.enter")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:enter"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:enter"]} </Form.Item>,
> <Form.Item
<InputNumber /> label={t("bodyshop.fields.rbac.bills.list")}
</Form.Item> rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.list")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:list"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:list"]} </Form.Item>,
> <Form.Item
<InputNumber /> label={t("bodyshop.fields.rbac.bills.reexport")}
</Form.Item> rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.reexport")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:reexport"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:reexport"]} </Form.Item>,
> <Form.Item
<InputNumber /> label={t("bodyshop.fields.rbac.bills.view")}
</Form.Item> rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.bills.view")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "bills:view"]}
} >
]} <InputNumber />
name={["md_rbac", "bills:view"]} </Form.Item>
> ]:[]}
<InputNumber />
</Form.Item>
</>
)}
{HasFeatureAccess({ featureName: "courtesycars", bodyshop }) && ( {...HasFeatureAccess({ featureName: "courtesycars", bodyshop }) ? [
<> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.contracts.create")}
label={t("bodyshop.fields.rbac.contracts.create")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "contracts:create"]}
name={["md_rbac", "contracts:create"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.contracts.detail")}
label={t("bodyshop.fields.rbac.contracts.detail")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "contracts:detail"]}
name={["md_rbac", "contracts:detail"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.contracts.list")}
label={t("bodyshop.fields.rbac.contracts.list")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "contracts:list"]}
name={["md_rbac", "contracts:list"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.courtesycar.create")}
label={t("bodyshop.fields.rbac.courtesycar.create")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "courtesycar:create"]}
name={["md_rbac", "courtesycar:create"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.courtesycar.detail")}
label={t("bodyshop.fields.rbac.courtesycar.detail")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "courtesycar:detail"]}
name={["md_rbac", "courtesycar:detail"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.courtesycar.list")}
label={t("bodyshop.fields.rbac.courtesycar.list")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "courtesycar:list"]}
name={["md_rbac", "courtesycar:list"]} >
> <InputNumber />
<InputNumber /> </Form.Item>
</Form.Item> ]:[]}
</> {...HasFeatureAccess({ featureName: "csi", bodyshop }) ? [
)} <Form.Item
{HasFeatureAccess({ featureName: "csi", bodyshop }) && ( label={t("bodyshop.fields.rbac.csi.export")}
<> rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.csi.export")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "csi:export"]}
} >
]} <InputNumber />
name={["md_rbac", "csi:export"]} </Form.Item>,
> <Form.Item
<InputNumber /> label={t("bodyshop.fields.rbac.csi.page")}
</Form.Item> rules={[
<Form.Item {
label={t("bodyshop.fields.rbac.csi.page")} required: true
rules={[ //message: t("general.validation.required"),
{ }
required: true ]}
//message: t("general.validation.required"), name={["md_rbac", "csi:page"]}
} >
]} <InputNumber />
name={["md_rbac", "csi:page"]} </Form.Item>
> ]:[]}
<InputNumber />
</Form.Item>
</>
)}
<Form.Item <Form.Item
label={t("bodyshop.fields.rbac.employees.page")} label={t("bodyshop.fields.rbac.employees.page")}
rules={[ rules={[
@@ -569,130 +561,128 @@ export function ShopInfoRbacComponent({ form, bodyshop }) {
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
)} )}
{HasFeatureAccess({ featureName: "timetickets", bodyshop }) && ( {...HasFeatureAccess({ featureName: "timetickets", bodyshop }) ? [
<> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.shiftclock.view")}
label={t("bodyshop.fields.rbac.shiftclock.view")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "shiftclock:view"]}
name={["md_rbac", "shiftclock:view"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.shop.config")}
label={t("bodyshop.fields.rbac.shop.config")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "shop:config"]}
name={["md_rbac", "shop:config"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.edit")}
label={t("bodyshop.fields.rbac.timetickets.edit")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:edit"]}
name={["md_rbac", "timetickets:edit"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.shiftedit")}
label={t("bodyshop.fields.rbac.timetickets.shiftedit")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:shiftedit"]}
name={["md_rbac", "timetickets:shiftedit"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.editcommitted")}
label={t("bodyshop.fields.rbac.timetickets.editcommitted")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:editcommitted"]}
name={["md_rbac", "timetickets:editcommitted"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.ttapprovals.view")}
label={t("bodyshop.fields.rbac.ttapprovals.view")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "ttapprovals:view"]}
name={["md_rbac", "ttapprovals:view"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.ttapprovals.approve")}
label={t("bodyshop.fields.rbac.ttapprovals.approve")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "ttapprovals:approve"]}
name={["md_rbac", "ttapprovals:approve"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.enter")}
label={t("bodyshop.fields.rbac.timetickets.enter")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:enter"]}
name={["md_rbac", "timetickets:enter"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.list")}
label={t("bodyshop.fields.rbac.timetickets.list")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:list"]}
name={["md_rbac", "timetickets:list"]} >
> <InputNumber />
<InputNumber /> </Form.Item>,
</Form.Item> <Form.Item
<Form.Item label={t("bodyshop.fields.rbac.timetickets.shiftedit")}
label={t("bodyshop.fields.rbac.timetickets.shiftedit")} rules={[
rules={[ {
{ required: true
required: true //message: t("general.validation.required"),
//message: t("general.validation.required"), }
} ]}
]} name={["md_rbac", "timetickets:shiftedit"]}
name={["md_rbac", "timetickets:shiftedit"]} >
> <InputNumber />
<InputNumber /> </Form.Item>
</Form.Item> ]:[]}
</>
)}
<Form.Item <Form.Item
label={t("bodyshop.fields.rbac.shop.vendors")} label={t("bodyshop.fields.rbac.shop.vendors")}
rules={[ rules={[

View File

@@ -312,7 +312,14 @@ export function* SetAuthLevelFromShopDetails({ payload }) {
const user = yield select((state) => state.user.currentUser); const user = yield select((state) => state.user.currentUser);
if (payload.features.singleDeviceOnly) { if (payload.features.singleDeviceOnly) {
if (!(user.email.includes("@imex.") || user.email.includes("@rome.") || user.email.includes("@promanager."))) if (
!(
user.email.includes("@imex.") ||
user.email.includes("@rome.") ||
user.email.includes("@rometech.") ||
user.email.includes("@promanager.")
)
)
yield put(setInstanceId(user.uid)); yield put(setInstanceId(user.uid));
} }
@@ -324,11 +331,17 @@ export function* SetAuthLevelFromShopDetails({ payload }) {
rome: () => { rome: () => {
if ( if (
payload.imexshopid.toLowerCase().startsWith("pm_") && payload.imexshopid.toLowerCase().startsWith("pm_") &&
!(user.email.includes("@imex.") || user.email.includes("@rome.") || user.email.includes("@promanager.")) !(
user.email.includes("@imex.") ||
user.email.includes("@rome.") ||
user.email.includes("@rometech.") ||
user.email.includes("@promanager.")
)
) { ) {
throw new Error("You are not authorized to use this application."); throw new Error("You are not authorized to use this application.");
} }
} },
promanager: () => {}
}); });
} catch (error) { } catch (error) {
yield put(setInstanceConflict()); yield put(setInstanceConflict());

View File

@@ -718,6 +718,7 @@ function CalculateTaxesTotals(job, otherTotals) {
const taxableAmounts = { const taxableAmounts = {
PAA: Dinero(), PAA: Dinero(),
PAE: Dinero(),
PAN: Dinero(), PAN: Dinero(),
PAL: Dinero(), PAL: Dinero(),
PAR: Dinero(), PAR: Dinero(),